La instrucción SQL SELECT devuelve un conjunto de resultados de filas de una o más tablas . [1] [2]
Una sentencia SELECT recupera cero o más filas de una o más tablas o vistas de la base de datos . En la mayoría de las aplicaciones, es el comando de lenguaje de manipulación de datosSELECT
(DML) más utilizado . Como SQL es un lenguaje de programación declarativo , las consultas especifican un conjunto de resultados, pero no especifican cómo calcularlo. La base de datos traduce la consulta en un " plan de consulta " que puede variar entre ejecuciones, versiones de la base de datos y software de base de datos. Esta funcionalidad se denomina " optimizador de consultas ", ya que es responsable de encontrar el mejor plan de ejecución posible para la consulta, dentro de las restricciones aplicables.SELECT
La instrucción SELECT tiene muchas cláusulas opcionales:
SELECT
list es la lista de columnas o expresiones SQL que devolverá la consulta. Se trata aproximadamente de la operación de proyección del álgebra relacional .AS
Proporciona opcionalmente un alias para cada columna o expresión de la SELECT
lista. Esta es la operación de cambio de nombre del álgebra relacional.FROM
especifica de qué tabla obtener los datos. [3]WHERE
especifica qué filas se recuperarán. Esta es aproximadamente la operación de selección del álgebra relacional.GROUP BY
agrupa filas que comparten una propiedad para que se pueda aplicar una función de agregación a cada grupo.HAVING
selecciona entre los grupos definidos por la cláusula GROUP BY.ORDER BY
especifica cómo ordenar las filas devueltas.SELECT
es la operación más común en SQL, llamada "la consulta". SELECT
recupera datos de una o más tablas o expresiones. SELECT
Las sentencias estándar no tienen efectos persistentes en la base de datos. Algunas implementaciones no estándar de SELECT
pueden tener efectos persistentes, como la SELECT INTO
sintaxis proporcionada en algunas bases de datos. [4]
Las consultas permiten al usuario describir los datos deseados, dejando que el sistema de gestión de bases de datos (DBMS) realice la planificación , la optimización y la ejecución de las operaciones físicas necesarias para producir ese resultado según lo elija.
Una consulta incluye una lista de columnas que se incluirán en el resultado final, normalmente inmediatamente después de la SELECT
palabra clave. *
Se puede utilizar un asterisco (" ") para especificar que la consulta debe devolver todas las columnas de todas las tablas consultadas. SELECT
es la sentencia más compleja de SQL, con palabras clave y cláusulas opcionales que incluyen:
FROM
cláusula que indica las tablas de las que se obtendrán datos. La FROM
cláusula puede incluir subcláusulas opcionales JOIN
para especificar las reglas para unir tablas.WHERE
cláusula incluye un predicado de comparación que restringe las filas que devuelve la consulta. La WHERE
cláusula elimina todas las filas del conjunto de resultados en las que el predicado de comparación no se evalúa como verdadero.GROUP BY
cláusula proyecta filas que tienen valores comunes en un conjunto más pequeño de filas. GROUP BY
A menudo se utiliza junto con funciones de agregación de SQL o para eliminar filas duplicadas de un conjunto de resultados. La WHERE
cláusula se aplica antes de la GROUP BY
cláusula.HAVING
cláusula incluye un predicado que se utiliza para filtrar las filas resultantes de la GROUP BY
cláusula. Dado que actúa sobre los resultados de la GROUP BY
cláusula, se pueden utilizar funciones de agregación en el HAVING
predicado de la cláusula.ORDER BY
cláusula identifica qué columna(s) se deben utilizar para ordenar los datos resultantes y en qué dirección hacerlo (ascendente o descendente). Sin una ORDER BY
cláusula, el orden de las filas devueltas por una consulta SQL no está definido.DISTINCT
palabra clave [5] elimina datos duplicados. [6]El siguiente ejemplo de SELECT
consulta devuelve una lista de libros caros. La consulta recupera todas las filas de la tabla Book en las que la columna price contiene un valor mayor que 100,00. El resultado se ordena en orden ascendente por título . El asterisco (*) en la lista de selección indica que todas las columnas de la tabla Book deben incluirse en el conjunto de resultados.
SELECCIONAR * DE Libro DONDE precio > 100 . 00 ORDENAR POR título ;
El siguiente ejemplo demuestra una consulta de múltiples tablas, agrupación y agregación, devolviendo una lista de libros y la cantidad de autores asociados con cada libro.
SELECCIONAR Libro . título COMO Título , contar ( * ) COMO Autores DE Libro UNIR Libro_autor EN Libro . isbn = Libro_autor . isbn AGRUPAR POR Libro . título ;
El resultado de ejemplo podría parecerse al siguiente:
Título Autores---------------------- -------Ejemplos y guía de SQL 4La alegría de SQL 1Introducción a SQL 2Errores de SQL 1
Bajo la condición previa de que isbn sea el único nombre de columna común de las dos tablas y que una columna llamada título solo exista en la tabla Libro , se podría reescribir la consulta anterior en la siguiente forma:
SELECCIONAR título , contar ( * ) COMO Autores DE Libro NATURAL UNIRSE Libro_autor AGRUPAR POR título ;
Sin embargo, muchos proveedores de [ cuantificación ] no admiten este enfoque o requieren ciertas convenciones de nombres de columnas para que las uniones naturales funcionen de manera efectiva.
SQL incluye operadores y funciones para calcular valores a partir de valores almacenados. SQL permite el uso de expresiones en la lista de selección para proyectar datos, como en el siguiente ejemplo, que devuelve una lista de libros que cuestan más de 100,00 con una columna sales_tax adicional que contiene una cifra de impuesto a las ventas calculada al 6 % del precio .
SELECCIONAR isbn , título , precio , precio * 0,06 COMO impuesto_venta DE Libro DONDE precio > 100,00 ORDENAR POR título ;
Las consultas se pueden anidar de modo que los resultados de una consulta se puedan utilizar en otra consulta a través de un operador relacional o una función de agregación. Una consulta anidada también se conoce como subconsulta . Si bien las uniones y otras operaciones de tabla proporcionan alternativas computacionalmente superiores (es decir, más rápidas) en muchos casos (todo depende de la implementación), el uso de subconsultas introduce una jerarquía en la ejecución que puede ser útil o necesaria. En el siguiente ejemplo, la función de agregación AVG
recibe como entrada el resultado de una subconsulta:
SELECCIONAR isbn , título , precio DE Libro DONDE precio < ( SELECCIONAR AVG ( precio ) DE Libro ) ORDENAR POR título ;
Una subconsulta puede utilizar valores de la consulta externa, en cuyo caso se conoce como subconsulta correlacionada .
Desde 1999, el estándar SQL permite cláusulas WITH, es decir, subconsultas con nombre, a menudo llamadas expresiones de tabla comunes (nombradas y diseñadas según la implementación de IBM DB2 versión 2; Oracle las llama factorización de subconsultas ). Las CTE también pueden ser recursivas haciendo referencia a sí mismas; el mecanismo resultante permite recorridos de árboles o gráficos (cuando se representan como relaciones) y, de manera más general, cálculos de puntos fijos .
Una tabla derivada es una subconsulta en una cláusula FROM. Básicamente, la tabla derivada es una subconsulta de la que se puede seleccionar o unir datos. La funcionalidad de tabla derivada permite al usuario hacer referencia a la subconsulta como una tabla. La tabla derivada también se conoce como vista en línea o selección en lista .
En el siguiente ejemplo, la sentencia SQL implica una unión de la tabla Books inicial con la tabla derivada "Sales". Esta tabla derivada captura la información de ventas de libros asociada mediante el ISBN para unirse a la tabla Books. Como resultado, la tabla derivada proporciona el conjunto de resultados con columnas adicionales (la cantidad de artículos vendidos y la empresa que vendió los libros):
SELECCIONAR b . isbn , b . título , b . precio , ventas . artículos_vendidos , ventas . empresa_nm DE Libro b UNIR ( SELECCIONAR SUMA ( Artículos_vendidos ) Artículos_vendidos , Empresa_Nm , ISBN DE Libro_Ventas AGRUPAR POR Empresa_Nm , ISBN ) ventas EN ventas . isbn = b . isbn
Dada una tabla T, la consulta dará como resultado que se muestren todos los elementos de todas las filas de la tabla.SELECT * FROM T
Con la misma tabla, la consulta dará como resultado que se muestren los elementos de la columna C1 de todas las filas de la tabla. Esto es similar a una proyección en álgebra relacional , excepto que en el caso general, el resultado puede contener filas duplicadas. Esto también se conoce como Partición vertical en algunos términos de bases de datos, que restringe la salida de la consulta para ver solo los campos o columnas especificados.SELECT C1 FROM T
Con la misma tabla, la consulta mostrará todos los elementos de todas las filas donde el valor de la columna C1 sea '1'; en términos de álgebra relacional , se realizará una selección debido a la cláusula WHERE. Esto también se conoce como partición horizontal, que restringe las filas que se muestran en una consulta según las condiciones especificadas.SELECT * FROM T WHERE C1 = 1
Si hay más de una tabla, el conjunto de resultados será cada combinación de filas. Por lo tanto, si dos tablas son T1 y T2, se obtendrán como resultado todas las combinaciones de filas T1 con cada una de las filas T2. Por ejemplo, si T1 tiene 3 filas y T2 tiene 5, se obtendrán 15 filas.SELECT * FROM T1, T2
Aunque no es un estándar, la mayoría de los DBMS permiten utilizar una cláusula select sin una tabla, simulando que se utiliza una tabla imaginaria con una fila. Esto se utiliza principalmente para realizar cálculos en los que no se necesita una tabla.
La cláusula SELECT especifica una lista de propiedades (columnas) por nombre o el carácter comodín (“*”) para significar “todas las propiedades”.
A menudo resulta conveniente indicar un número máximo de filas que se devuelven. Esto se puede utilizar para realizar pruebas o para evitar consumir recursos excesivos si la consulta devuelve más información de la esperada. El enfoque para hacerlo suele variar según el proveedor.
En ISO SQL:2003 , los conjuntos de resultados pueden limitarse mediante el uso de
ISO SQL:2008 introdujo la FETCH FIRST
cláusula.
Según la documentación de PostgreSQL v.9, una función de ventana SQL "realiza un cálculo en un conjunto de filas de la tabla que están relacionadas de alguna manera con la fila actual", de manera similar a las funciones de agregación. [7] El nombre recuerda a las funciones de ventana de procesamiento de señales . Una llamada a una función de ventana siempre contiene una cláusula OVER .
ROW_NUMBER() OVER
se puede utilizar para una tabla simple en las filas devueltas, por ejemplo, para devolver no más de diez filas:
SELECCIONAR * DE ( SELECCIONAR NÚMERO_DE_FILA () SOBRE ( ORDENAR POR clave_de_ordenación ASC ) COMO número_de_fila , columnas DE nombre_de_tabla ) COMO foo DONDE número_de_fila <= 10
ROW_NUMBER puede ser no determinista : si sort_key no es único, cada vez que ejecute la consulta es posible obtener diferentes números de fila asignados a cualquier fila donde sort_key sea el mismo. Cuando sort_key es único, cada fila siempre obtendrá un número de fila único.
La RANK() OVER
función de ventana actúa como ROW_NUMBER, pero puede devolver más o menos de n filas en caso de condiciones de empate, por ejemplo, para devolver las 10 personas más jóvenes:
SELECCIONAR * DE ( SELECCIONAR RANGO () SOBRE ( ORDENAR POR edad ASC ) COMO ranking , person_id , person_name , edad DE persona ) COMO foo DONDE ranking <= 10
El código anterior podría devolver más de diez filas, por ejemplo, si hay dos personas de la misma edad, podría devolver once filas.
Desde ISO SQL:2008, los límites de resultados se pueden especificar como en el siguiente ejemplo utilizando la FETCH FIRST
cláusula.
SELECCIONAR * DE T OBTENGA SOLO LAS PRIMERAS 10 FILAS
Esta cláusula actualmente es compatible con CA DATACOM/DB 11, IBM DB2, SAP SQL Anywhere, PostgreSQL, EffiProz, H2, HSQLDB versión 2.0, Oracle 12c y Mimer SQL .
Microsoft SQL Server 2008 y versiones posteriores admiten FETCH FIRST, pero se considera parte de la ORDER BY
cláusula. Las cláusulas ORDER BY
, OFFSET
, y FETCH FIRST
son necesarias para este uso.
SELECCIONAR * DE T ORDENAR POR una columna DESC DESPLAZAMIENTO 0 FILAS OBTENGA SOLO LAS PRIMERAS 10 FILAS
Algunos DBMS ofrecen una sintaxis no estándar en lugar de la sintaxis estándar de SQL o además de ella. A continuación, se enumeran variantes de la consulta de límite simple para diferentes DBMS:
Paginación por filas [9] es un enfoque utilizado para limitar y mostrar solo una parte de los datos totales de una consulta en la base de datos. En lugar de mostrar cientos o miles de filas al mismo tiempo, se solicita al servidor solo una página (un conjunto limitado de filas, por ejemplo, solo 10 filas) y el usuario comienza a navegar solicitando la página siguiente, y luego la siguiente, y así sucesivamente. Es muy útil, especialmente en sistemas web, donde no hay una conexión dedicada entre el cliente y el servidor, por lo que el cliente no tiene que esperar para leer y mostrar todas las filas del servidor.
{rows}
= Número de filas en una página{page_number}
= Número de la página actual{begin_base_0}
= Número de la fila - 1 donde comienza la página = (page_number-1) * filas{begin_base_0 + 1}
y{begin_base_0 + rows}
Seleccionar * de { tabla } ordenar por { clave_única }
{begin_base_0 + rows}
){begin_base_0 + rows}
filas pero envíalas a mostrar solo cuando el row_number de las filas leídas sea mayor que{begin_base_0}
{rows}
filas a partir de la siguiente fila para mostrar ( {begin_base_0 + 1}
){rows}
las filas con filtro:{rows}
filas, dependiendo del tipo de base de datos{rows}
filas, dependiendo del tipo de base de datos, donde {unique_key}
sea mayor que {last_val}
(el valor de {unique_key}
la última fila de la página actual){rows}
filas donde {unique_key}
sea menor que {first_val}
(el valor de {unique_key}
la primera fila en la página actual) y ordena el resultado en el orden correctoAlgunas bases de datos proporcionan una sintaxis especializada para datos jerárquicos .
Una función de ventana en SQL:2003 es una función agregada aplicada a una partición del conjunto de resultados.
Por ejemplo,
suma ( población ) SOBRE ( PARTICIÓN POR ciudad )
Calcula la suma de las poblaciones de todas las filas que tienen el mismo valor de ciudad que la fila actual.
Las particiones se especifican mediante la cláusula OVER , que modifica el agregado. Sintaxis:
< CLÁUSULA_SUPERIOR > :: = SOBRE ( [ PARTICIÓN POR < expr > , ... ] [ ORDENAR POR < expresión > ] )
La cláusula OVER permite dividir y ordenar el conjunto de resultados. La ordenación se utiliza para funciones relativas al orden, como row_number.
El procesamiento de una sentencia SELECT según ANSI SQL sería el siguiente: [10]
seleccionar g . * de usuarios u unirse internamente a grupos g en g . Userid = u . Userid donde u . LastName = 'Smith' y u . FirstName = 'John'
seleccione u . * de los usuarios u dejó de unirse a grupos g en g . Userid = u . Userid donde u . LastName = 'Smith' y u . FirstName = 'John'
seleccione g . GroupName , count ( g . * ) como NumberOfMembers de usuarios u grupos de unión interna g en g . Userid = u . Userid grupo por GroupName
seleccione g . GroupName , count ( g . * ) como NumberOfMembers de los usuarios u grupos de unión interna g en g . Userid = u . Userid agrupado por GroupName que tiene count ( g . * ) > 5
La implementación de las funciones de ventana por parte de los proveedores de bases de datos relacionales y motores SQL difiere enormemente. La mayoría de las bases de datos admiten al menos alguna variante de las funciones de ventana. Sin embargo, cuando analizamos más de cerca, queda claro que la mayoría de los proveedores solo implementan un subconjunto del estándar. Tomemos como ejemplo la poderosa cláusula RANGE. Solo Oracle, DB2, Spark/Hive y Google Big Query implementan completamente esta función. Más recientemente, los proveedores han agregado nuevas extensiones al estándar, por ejemplo, funciones de agregación de matrices. Estas son particularmente útiles en el contexto de ejecutar SQL contra un sistema de archivos distribuido (Hadoop, Spark, Google BigQuery) donde tenemos garantías de co-localidad de datos más débiles que en una base de datos relacional distribuida (MPP). En lugar de distribuir uniformemente los datos entre todos los nodos, los motores SQL que ejecutan consultas contra un sistema de archivos distribuido pueden lograr garantías de co-localidad de datos anidando datos y evitando así uniones potencialmente costosas que involucran una gran mezcla a través de la red. Las funciones de agregación definidas por el usuario que se pueden usar en funciones de ventana son otra característica extremadamente poderosa.
Método para generar datos en base a la unión de todos
seleccionar 1 a , 1 b unir todo seleccionar 1 , 2 unir todo seleccionar 1 , 3 unir todo seleccionar 2 , 1 unir todo seleccionar 5 , 1
SQL Server 2008 admite la función "constructor de filas", especificada en el estándar SQL:1999
seleccionar * de ( valores ( 1 , 1 ), ( 1 , 2 ), ( 1 , 3 ), ( 2 , 1 ), ( 5 , 1 )) como x ( a , b )
Aunque el argumento UNIQUE es idéntico a DISTINCT, no es un estándar ANSI.
[...] la palabra clave DISTINCT [...] elimina los duplicados del conjunto de resultados.