Filtrado mediante subconsultas
La sentencia SELECT se utiliza para consultas en SQL. Todas las declaraciones SELECT utilizadas anteriormente eran consultas simples, es decir, declaraciones únicas que recuperaban datos de una única tabla de base de datos. Sin embargo, SQL también puede crear subconsultas, que son consultas anidadas dentro de otras consultas.
Ejemplo:
Tabla de datos: las tablas de la base de datos utilizadas esta vez son todas tablas relacionales. Los pedidos se almacenan en dos tablas. Cada pedido contiene el número de pedido, el ID del cliente y la fecha del pedido y se almacena como una fila en la tabla Pedidos. Los artículos de cada pedido se almacenan en la tabla OrderItems relacionada. La tabla Pedidos no almacena información del cliente, solo ID de cliente. La información real del cliente se almacena en la tabla Clientes.
Si ahora necesita recuperar todos los clientes que ordenaron RGAN01, ¿cómo debería recuperarlo? Los pasos son los siguientes:
①Recuperar los números de todos los pedidos que contienen el artículo RGAN01.
②Recupere las identificaciones de todos los clientes con los números de pedido enumerados en el paso anterior.
③Recupere la información del cliente de todos los ID de cliente devueltos en el paso anterior.
Cada uno de los pasos anteriores se puede ejecutar de forma independiente como una consulta.
Puede usar los resultados devueltos por una declaración SELECT en la cláusula WHERE de otra declaración SELECT, o puede usar subconsultas para combinar tres consultas en una sola declaración.
①El significado de la primera declaración es muy claro, es decir, para todos los artículos del pedido con prod_id RGAN01, recupere la columna order_num.
Análisis: Con esta afirmación sabemos qué pedido contiene el artículo a recuperar.
② A continuación, consulte los ID de cliente relacionados con los pedidos 20007 y 20008 recuperados de la declaración anterior. La cláusula IN se puede utilizar aquí.
Las dos consultas siguientes se pueden combinar para convertir la primera consulta en una subconsulta.
Análisis: En la instrucción SELECT, las subconsultas siempre se procesan de adentro hacia afuera. Al procesar la declaración SELECT anterior, el DBMS en realidad realiza dos operaciones.
Primero, ejecute la consulta entre paréntesis (), que devuelve dos números de orden: 20007 y 20008.
Los dos valores luego se pasan a la cláusula WHERE de la consulta externa en el formato separado por comas requerido por el operador IN. La consulta externa se convierte en:
Los resultados recuperados por esta declaración son los mismos que los devueltos por la cláusula WHERE anterior codificada.
③Todos los ID de cliente para solicitar el producto RGAN01 se obtienen de la declaración anterior: 100004 y 100005. A continuación, recupere la información del cliente para estos ID de cliente.
También puede convertir la cláusula WHERE en una subconsulta para no tener que codificar estos ID de cliente.
Análisis: DBMS en realidad necesita ejecutar tres declaraciones SELECT para completar la declaración anterior. La subconsulta más interna devuelve el número de secuencia, que se utiliza en la cláusula WHERE de la subconsulta externa. La subconsulta externa devuelve la columna de ID del cliente, que se utiliza en la cláusula WHERE de la consulta más externa. La consulta más externa devuelve los datos finales requeridos.
Se puede ver que el uso de subconsultas en la cláusula WHERE puede escribir declaraciones SQL potentes y flexibles. No hay límite para la cantidad de subconsultas que se pueden anidar, pero en aplicaciones reales, debido a limitaciones de rendimiento, no es recomendable anidar demasiadas subconsultas.
Nota: La instrucción SELECT como subconsulta solo puede consultar una columna y recuperar varias columnas devolverá un error. Además, el uso de subconsultas no siempre es la forma más eficaz de realizar este tipo de recuperación de datos.
Usar subconsultas como campos calculados
Otra forma de utilizar subconsultas es crear campos calculados.
Ejemplo: debe mostrar el número total de pedidos de cada cliente en la tabla Clientes. Los pedidos y las identificaciones de clientes correspondientes se almacenan en la tabla Pedidos.
Para hacer esto, necesita los siguientes pasos:
①Recuperar la lista de clientes de la tabla de clientes.
②Para cada cliente recuperado, cuente el número de pedidos en la tabla Pedidos.
Aquí, podemos usar SELECT COUNT(*) introducido anteriormente para contar las filas de la tabla y filtrar el ID de cliente específico a través de la cláusula WHERE para contar solo los pedidos de este cliente.
Los pedidos del cliente 100001 se cuentan de la siguiente manera:
Para realizar COUNT(*) para cada cliente, debe usarlo como una subconsulta, de la siguiente manera:
Análisis: Esta instrucción SELECT devuelve tres columnas para cada cliente en la tabla Clientes: nombre_cliente, estado_cliente y pedidos. Pedidos es un campo calculado establecido por una subconsulta entre paréntesis. Esta subconsulta se ejecuta una vez por cada cliente recuperado. En este ejemplo, la subconsulta se ejecuta cinco veces porque se recuperan cinco clientes.
La cláusula WHERE en la subconsulta es ligeramente diferente de la cláusula WHERE anterior en que utiliza nombres de columna completos en lugar de solo el nombre de la columna (cust_id). Especifica el nombre de la tabla y los nombres de las columnas (Orders.cust_id y Customers.cust_id). La siguiente cláusula WHERE le dice a SQL que compare el cust_id en la tabla Pedidos con el cust_id actualmente recuperado de la tabla Clientes:
Cuando los nombres de las columnas son confusos, debe separar el nombre de la tabla y el nombre de la columna con un punto. En este ejemplo, hay dos columnas cust_id: una en Clientes y otra en Pedidos. Sin un nombre completo, el DBMS pensará que se debe comparar el propio cust_id en la tabla Pedidos. Porque:
La declaración anterior siempre devuelve el número total de pedidos en la tabla Pedidos, que no es lo que queremos, como se muestra a continuación:
Como se puede ver en lo anterior, Al construir la declaración, si hay varias tablas involucradas y no se distinguen los mismos nombres de columnas, el DBMS arrojará un mensaje de error.
Cuando se trabaja con varias tablas en una instrucción SELECT, es una buena práctica utilizar nombres de columnas completos para evitar ambigüedades.
Finalmente, resuma las características de las subconsultas:
① Las subconsultas deben estar entre paréntesis.
② Solo puede haber una columna en la cláusula SELECT de la subconsulta, a menos que haya varias columnas en la consulta principal para comparar con las columnas seleccionadas por la subconsulta.
③ La subconsulta no puede utilizar ORDER BY, pero la consulta principal sí. En las subconsultas, GROUP BY puede desempeñar el mismo papel que ORDER BY.
④ Las subconsultas que devuelven varias filas de datos solo se pueden utilizar con operadores de valores múltiples, como el operador IN.
⑤La lista de selección no puede contener referencias a valores de tipo BLOB, ARRAY, CLOB o NCLOB.
⑥Las subconsultas no se pueden utilizar directamente en funciones agregadas.
⑦ El operador ENTRE no se puede utilizar para subconsultas, pero sí para subconsultas.
Esta introducción termina aquí. El próximo artículo explicará el uso de uniones y uniones avanzadas.
¡Hasta la próxima!