SQL: EXISTE, NO EXISTE Y CON

Avatar del autor
Publicado el • Actualizado el • 7 minutos y 15 segundos de lectura
Ver mi bloc de notas

Mis Artículos Guardados

Introducción a los operadores

Los operadores EXISTS , NOT EXISTS y WITH son términos predefinidos en SQL. Se utilizan principalmente junto con las sentencias SQL SELECT, UPDATE o DELETE. Su propósito es probar la existencia de registros en una subconsulta.

Uso de los operadores EXISTS y NOT EXISTS

Los operadores EXISTS y NOT EXISTS se utilizan en una verificación de existencia en una subconsulta. Ambos operadores deben usarse junto con otros comandos SQL y no son independientes por sí mismos. La Figura 1 a continuación se utilizará para explicar cómo se pueden utilizar los operadores EXISTS y NOT EXISTS. La primera tabla almacena la relación proveedor-artículo y se denomina itemSupplier, mientras que la segunda tabla almacena la información maestra del artículo y se denomina artículo.

Figura 1: Relación entre el artículo de proveedor y la tabla maestra de artículo
Diagram01A

Como se mencionó, los operadores EXISTS y NOT EXISTS se usan para probar la existencia de registros en una subconsulta y DEBEN usarse junto con otra declaración SQL. Por ejemplo, suponga que se recibe una solicitud para enumerar los ID de artículo de todos los números de pieza que aún no tienen un proveedor asignado. ¿Cómo se puede lograr esto con el operador EXISTS?

La siguiente declaración puede lograr esto:

SELECCIONE item.itemID FROM item 
DONDE EXISTE (
 SELECT itemID
 FROM itemSupplier
 DONDE itemSupplier.itemID = item.itemID
);

La subconsulta (SELECT itemID FROM itemSupplier WHERE itemSupplier.itemID = item.itemID) enumera los itemID para todos los elementos que existen en la tabla itemSupplier (es decir, itemIDs I000000001, I000000002 e I000000003). El operador EXISTS comprueba para asegurarse de que los itemID seleccionados de la tabla de elementos existen en el conjunto de itemID devueltos por la subconsulta. Posteriormente los resultados que contienen la lista I000000001, I000000002 y I000000003 es el resultado final obtenido.

De manera similar, la siguiente declaración SQL con el operador NOT EXISTS enumerará todos los ID de elemento en la tabla de elementos que no existen en la tabla de proveedores de elementos.

SELECCIONE itemID DEL elemento 
DONDE NO EXISTE
 (
  SELECCIONE itemID DEL itemSupplier DONDE itemSupplier.itemID = item.itemID
 );

Además de la instrucción SELECT, el operador EXISTS también se puede utilizar con las instrucciones UPDATE y DELETE SQL. En la declaración UPDATE a continuación, el campo uom en la tabla de elementos para todos los registros con los ID de elemento existentes en la tabla de proveedores de elementos se concatenará con una ‘s’.

  Competencia No Relacionada con los Precios: Definición, tipos y ejemplos

ACTUALIZAR 
CONJUNTO de ítems uom = concat
 (
  TRIM (uom), 's')
 DONDE EXISTE
  (
   SELECCIONE EL ID DE ítem DISTINTO DE itemSupplier b DONDE itemSupplier.itemID = item.itemID
  )
 );

Finalmente, en la siguiente declaración SQL, se eliminarán todos los registros de la tabla de elementos con el valor de ID de elemento existente en la tabla de proveedores de elementos.

ELIMINAR DEL elemento 
DONDE EXISTE
 (
  SELECCIONE EL ID del elemento DISTINTO DEL proveedor del elemento DONDE el proveedor del elemento.ID del elemento = el ID del elemento
 );

Tenga en cuenta que también hay otras declaraciones SQL que pueden sustituir al operador EXISTS para lograr el mismo objetivo. Los operadores IN y ANY que se muestran a continuación son similares a nuestro ejemplo anterior con el operador EXISTS y devolverán los mismos resultados:

SELECCIONE itemID DEL artículo DONDE itemID IN (SELECCIONE ID de artículo DISTINTO DEL proveedor de artículos);

Y:

SELECCIONE item.itemID FROM item DONDE item.itemID = CUALQUIER (SELECCIONE DISTINCT itemID FROM itemsupplier)

Uso del operador WITH

El operador SQL WITH se usa con CTE (Common Table Expression) y siempre debe usarse junto con otra declaración SQL principal. La cláusula WITH se usa para crear una tabla temporal como una vista SQL. La diferencia es que las vistas de SQL se almacenan permanentemente como parte del esquema de la base de datos, mientras que el CTE solo está disponible cuando se usa junto con su consulta vinculada. Una vez que la consulta complete la ejecución, el CTE se eliminará y ya no se podrá acceder a él.

A continuación se muestra un ejemplo de instrucción WITH SQL:

  Revisión posterior a la implementación del proyecto: Propósito y beneficios

Defina el nombre de la expresión CTE y la lista de columnas.

CON PODetail_CTE (PONumber, Supplier, TotalSales) 
COMO

Defina la consulta CTE.

( 
 Podetail.ponumber SELECT, poheader.supplierID, sum (podetail.qtyordered * itemsupplier.price)
 AS VentasTotales
 DE poheader, podetail, itemsupplier
 DONDE poheader.ponumber = podetail.ponumber Y poheader.supplierID = itemsupplier.supplierID Y podetail.itemID = itemsupplier .itemID GROUP BY b.ponumber, a.supplierID

Defina la consulta externa que hace referencia al nombre de CTE.

SELECCIONE SUM (totalSales) 
DE PODetail_CTE

En la declaración anterior, WITH se utiliza para crear la tabla denominada PODetail_CTE con tres campos denominados ‘PONumber’, ‘Supplier’ y ‘TotalSales’. Los valores para estos campos se obtienen ejecutando la consulta CTE interna que extrae los valores requeridos de las tablas ‘poheader’, ‘podetail’ y ‘itemSupplier’. Una vez que se crea la tabla PODetail_CTE y se completa con datos, la consulta SQL principal externa puede hacer referencia a esta tabla por su nombre y realizar el procesamiento necesario requerido.

La cláusula WITH también se puede utilizar con las sentencias UPDATE o DELETE SQL. Considere el siguiente ejemplo que muestra cómo se usa la cláusula WITH con una instrucción SQL UPDATE:

CON item_CTE (itemID, UOM) 
AS
(
 SELECT itemID, UOM FROM item
 WHERE itemID = 'I000000005'
)
ACTUALIZAR item_CTE SET UOM = 'PCs';

En este ejemplo, se crea la tabla item_CTE y contendrá registros con itemID con el valor de ‘I000000005’. La declaración principal de SQL UPDATE actualiza la tabla base vinculada a la tabla item_CTE (es decir, la tabla de elementos) y establece el valor del campo UOM en ‘PC’. Tenga en cuenta que la declaración ACTUALIZAR aquí en realidad actualiza los elementos de la tabla base al valor ‘PC’. No se requiere una actualización de item_CTE y no tiene sentido, ya que la tabla item_CTE se eliminará una vez que se complete la consulta UPDATE. De manera similar, si se usa la instrucción SQL DELETE, los registros que cumplen los criterios también se eliminarán de la tabla base.

La cláusula WITH también se puede usar en una situación ligeramente diferente cuando se usa junto con las funciones ROLLUP o CUBE . Las cláusulas WITH ROLLUP y WITH CUBE se utilizan para agregar datos. Esencialmente, se utilizan como operaciones agregadas que trabajan en varios niveles de una jerarquía. La Figura 2 a continuación se utilizará para ilustrar cómo funcionan las funciones WITH ROLLUP y WITH CUBE:

  Método de diagrama de precedencia en la gestión de proyectos

Figura 2: Tablas utilizadas para ilustrar CON ROLLUP y WITH CUBE.
Diagram04

A continuación se muestra un ejemplo de la cláusula WITH ROLLUP:

SELECCIONE poheader.ponumber, podetail.itemid, SUM (podetail.qtyOrdered * itemsupplier.price) de poheader, podetail, itemsupplier 
DONDE poheader.ponumber = podetail.ponumber Y podetail.itemID = itemsupplier.itemID AND poheader.supplierIDs = itemsupplier
GROUP POR poheader.ponumber, podetail.itemID
WITH rollup;

El resultado de esta declaración SQL es como se muestra en la Figura 3. Observe cómo la cláusula WITH ROLLUP puede agregar en función del campo ponumber. Hay totales resumidos para cada número (es decir, las cantidades de todos los ID de artículo dentro del mismo número sumadas), así como el total general generado.

Figura 3: Resultado de la ejecución WITH ROLLUP.
Diagram05

De manera similar, la cláusula WITH CUBE se agrega en función de más dimensiones.

SELECCIONE poheader.ponumber, podetail.itemid, SUM (podetail.qtyOrdered * itemsupplier.price) de poheader, podetail, itemsupplier 
DONDE poheader.ponumber = podetail.ponumber Y podetail.itemID = itemsupplier.itemID AND poheader.supplierIDs = itemsupplier
GROUP POR poheader.ponumber, podetail.itemID
WITH cube;

En el ejemplo anterior, agrega las cantidades basadas en los campos ponumber y itemID y genera el total general como la cláusula WITH ROLLUP. Los resultados se describen en la Figura 4 a continuación:

Figura 4: Resultado de la ejecución WITH CUBE.
Diagram06

Resumen de la lección

Los operadores EXISTS , NOT EXISTS y WITH son algunas características predefinidas disponibles en todos los sistemas SQL para permitir que los datos se manipulen de manera efectiva. Los operadores EXISTS y NOT EXISTS se utilizan para comprobar la existencia y actúan como una subconsulta a una declaración SQL principal. La cláusula WITH se utiliza como CTE (Common Table Extension), donde se crea una tabla temporal para simplificar y facilitar el procesamiento posterior.

Continúa con:

  1. Negocios

    Cómo ordenar los resultados de una consulta SQL

    Cláusula ORDER BY en SQL La instrucción SELECT obtiene filas de las tablas sin ningún...

  2. Negocios

    Aplicación práctica para la introducción a SQL: declaraciones DROP

    Descripción general de la lección y conocimientos necesarios Para completar esta lección, debe poder definir...

  3. Negocios

    Tipos de datos SQL: DECIMAL Y NUMÉRICO

    Tipos de datos para números Si ha estado utilizando SQL durante un período de tiempo,...

  4. Negocios

    Cómo limitar los resultados de una consulta SQL SELECT

    La instrucción SELECT SQL Se utiliza una instrucción SQL SELECT para recuperar registros de una...

Selecciona un tema para seguir aprendiendo