Articulo de referencia

Seleccionar (SQL)

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 vis...

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 . Dado que SQL es un lenguaje de programación declarativo , las consultas especifican un conjunto de resultados, pero no 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:

Descripción general

SELECTes la operación más común en SQL, llamada "consulta". SELECTRecupera datos de una o más tablas o expresiones. SELECTLas sentencias estándar no tienen efectos persistentes en la base de datos. Algunas implementaciones no estándar SELECTpueden tener efectos persistentes, como la SELECT INTOsintaxis proporcionada en algunas bases de datos. [ 3 ]

Las consultas permiten al usuario describir los datos deseados, dejando que el sistema de gestión de bases de datos (DBMS) se encargue de planificar , optimizar y realizar las operaciones físicas necesarias para producir ese resultado según lo considere oportuno.

Una consulta incluye una lista de columnas que se incluirán en el resultado final, normalmente inmediatamente después de la SELECTpalabra clave. *Se puede usar un asterisco (" ") para especificar que la consulta debe devolver todas las columnas de todas las tablas consultadas. SELECTes la instrucción más compleja en SQL, con palabras clave y cláusulas opcionales que incluyen:

  • La FROMcláusula indica las tablas de las que se recuperarán los datos. Esta FROMcláusula puede incluir JOINsubcláusulas opcionales para especificar las reglas de unión de tablas.
  • La WHEREcláusula incluye un predicado de comparación que restringe las filas devueltas por la consulta. La WHEREcláusula elimina del conjunto de resultados todas las filas cuyo predicado de comparación no se evalúa como verdadero.
  • La GROUP BYcláusula proyecta las filas que tienen valores comunes en un conjunto más pequeño de filas. GROUP BYSe usa a menudo junto con funciones de agregación SQL o para eliminar filas duplicadas de un conjunto de resultados. La WHEREcláusula se aplica antes de la GROUP BYcláusula.
  • La HAVINGcláusula incluye un predicado que se utiliza para filtrar las filas resultantes de la GROUP BYmisma. Dado que actúa sobre los resultados de la GROUP BYcláusula, se pueden utilizar funciones de agregación en el HAVINGpredicado de la cláusula.
  • La ORDER BYcláusula especifica qué columnas usar para ordenar los datos resultantes y en qué dirección ordenarlos (ascendente o descendente). Sin esta ORDER BYcláusula, el orden de las filas devueltas por una consulta SQL es indefinido.
  • La DISTINCTpalabra clave [ 4 ] elimina los datos duplicados. [ 5 ]

El siguiente ejemplo de SELECTconsulta devuelve una lista de libros caros. La consulta recupera todas las filas de la tabla Libros en las que la columna Precio contiene un valor superior a 100,00. El resultado se ordena de forma ascendente por título . El asterisco (*) en la lista de selección indica que se deben incluir todas las columnas de la tabla Libros en el conjunto de resultados.

SELECCIONAR * DE Libro DONDE precio > 100 . 00 ORDENAR POR título ;

El siguiente ejemplo muestra una consulta a varias tablas, agrupando y agregando datos, al devolver una lista de libros y el número de autores asociados a cada libro.

SELECCIONAR Libro.título COMO Título , count ( * ) COMO Autores DE Libro UNIR Libro_autor EN Libro.isbn = Libro_autor.isbn AGRUPAR POR Libro.título ;

El resultado de ejemplo podría ser similar al siguiente:

Título Autores ---------------------- ------- Ejemplos y guía de SQL 4 El placer de SQL 1 Introducción a SQL 2 Errores comunes en 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 title solo exista en la tabla Book , se podría reescribir la consulta anterior de la siguiente forma:

SELECCIONAR título , recuento ( * ) COMO Autores DE Libro NATURAL UNIR Libro_autor AGRUPAR POR título ;

Sin embargo, muchos proveedores no admiten este enfoque o requieren ciertas convenciones de nomenclatura de columnas para que las uniones naturales funcionen eficazmente.

SQL incluye operadores y funciones para calcular valores sobre 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 adicional llamada sales_tax que contiene una cifra de impuesto sobre las ventas calculada al 6% del precio .

SELECCIONAR isbn , título , precio , precio * 0.06 COMO impuesto_ventas DE Libro DONDE precio > 100.00 ORDENAR POR título ;

Subconsultas

Las consultas pueden anidarse de manera que los resultados de una consulta se utilicen en otra mediante 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 ofrecen alternativas computacionalmente superiores (es decir, más rápidas) en muchos casos (dependiendo de la implementación), el uso de subconsultas introduce una jerarquía en la ejecución que puede resultar útil o necesaria. En el siguiente ejemplo, la función de agregación AVGrecibe como entrada el resultado de una subconsulta:

SELECCIONAR isbn , título , precio DE Libro DONDE precio < ( SELECCIONAR PROMEDIO ( precio ) DE Libro ) ORDENAR POR título ;

Una subconsulta puede utilizar valores de la consulta externa, en cuyo caso se la conoce como subconsulta correlacionada .

Desde 1999, el estándar SQL permite las cláusulas WITH, es decir, subconsultas con nombre, a menudo denominadas expresiones de tabla comunes (nombre y diseño inspirados en la implementación de IBM DB2 versión 2; Oracle las denomina factorización de subconsultas ). Las CTE también pueden ser recursivas al referirse a sí mismas; el mecanismo resultante permite recorridos de árboles o grafos (cuando se representan como relaciones) y, en general, cálculos de punto fijo .

Tabla derivada

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 a la que se puede unir. La funcionalidad de tabla derivada permite al usuario hacer referencia a la subconsulta como si fuera una tabla. La tabla derivada también se conoce como vista en línea o selección en una lista FROM .

En el siguiente ejemplo, la instrucción SQL implica una unión de la tabla inicial "Libros" con la tabla derivada "Ventas". Esta tabla derivada captura la información de ventas de libros asociada utilizando el ISBN para unirse a la tabla "Libros". Como resultado, la tabla derivada proporciona al conjunto de resultados columnas adicionales (el número 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 Ventas_Libro AGRUPAR POR Empresa_Nm , ISBN ) ventas EN ventas.isbn = b.isbn

Ejemplos

Dada una tabla T, la consulta mostrará todos los elementos de todas las filas de la tabla.SELECT*FROMT

Con la misma tabla, la consulta mostrará los elementos de la columna C1 de todas las filas. Esto es similar a una proyección en álgebra relacional , con la diferencia de que, en general, el resultado puede contener filas duplicadas. En algunos términos de bases de datos, esto también se conoce como partición vertical, y restringe la salida de la consulta para mostrar solo campos o columnas específicos.SELECTC1FROMT

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 muestra una consulta según condiciones específicas.SELECT*FROMTWHEREC1=1 

Con más de una tabla, el conjunto de resultados incluirá todas las combinaciones posibles de filas. Por ejemplo , si dos tablas son T1 y T2, el resultado incluirá todas las combinaciones posibles de filas de T1 con todas las filas de T2. Si T1 tiene 3 filas y T2 tiene 5, el resultado será de 15 filas.SELECT*FROMT1,T2

Aunque no es lo habitual, la mayoría de los sistemas de gestión de bases de datos (DBMS) permiten usar una cláusula SELECT sin tabla, simulando el uso de una tabla imaginaria con una sola fila. Esto se utiliza principalmente para realizar cálculos donde no se necesita una tabla.

La cláusula SELECT especifica una lista de propiedades (columnas) por nombre, o el carácter comodín (“*”) para referirse a “todas las propiedades”.

Limitar las filas de resultados

A menudo resulta conveniente indicar un número máximo de filas que se devuelven. Esto puede utilizarse para realizar pruebas o para evitar el consumo excesivo de recursos si la consulta devuelve más información de la esperada. La forma de hacerlo suele variar según el proveedor.

En ISO SQL:2003 , los conjuntos de resultados pueden estar limitados mediante el uso

La norma ISO SQL:2008 introdujo la FETCH FIRSTcláusula.

Según la documentación de PostgreSQL v.9, una función de ventana SQL "realiza un cálculo sobre un conjunto de filas de una tabla que están relacionadas de alguna manera con la fila actual", de forma similar a las funciones de agregación. [ 6 ] 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 .

Función de ventana ROW_NUMBER()

ROW_NUMBER() OVERPuede utilizarse para crear una tabla simple con las filas devueltas, por ejemplo, para devolver no más de diez filas:

SELECT * FROM ( SELECT ROW_NUMBER () OVER ( ORDER BY sort_key ASC ) AS row_number , columns FROM tablename ) AS foo WHERE row_number <= 10

ROW_NUMBER puede ser no determinista : si sort_key no es único, cada vez que se ejecuta la consulta es posible que se asignen números de fila diferentes a cualquier fila donde sort_key sea la misma. Cuando sort_key es único, cada fila siempre recibirá un número de fila único.

Función de ventana RANK()

La RANK() OVERfunción de ventana actúa como ROW_NUMBER , pero puede devolver más o menos de n filas en caso de empate, por ejemplo, para devolver las 10 personas más jóvenes:

SELECT * FROM ( SELECT RANK () OVER ( ORDER BY age ASC ) AS ranking , person_id , person_name , age FROM person ) AS foo WHERE 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.

Cláusula FETCH FIRST

Desde ISO SQL:2008, los límites de resultados se pueden especificar como en el siguiente ejemplo usando la FETCH FIRSTcláusula.

SELECCIONAR * DE T OBTENER 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 lo admitenFETCH FIRST , pero se considera parte de la ORDER BYcláusula. Las cláusulas ORDER BY, OFFSET, y son todas necesarias para este uso.FETCH FIRST

SELECCIONAR * DE T ORDENAR POR acolumn DESC DESPLAZAMIENTO 0 FILAS OBTENER SOLO LAS PRIMERAS 10 FILAS

Sintaxis no estándar

Algunos sistemas de gestión de bases de datos (DBMS) ofrecen sintaxis no estándar, ya sea en lugar de la sintaxis estándar SQL o además de ella. A continuación, se enumeran variantes de la consulta simple de límite para diferentes DBMS:

Paginación de filas

La paginación por filas [ 8 ] es un método que permite 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 simultáneamente, se solicita al servidor una sola página (un conjunto limitado de filas, por ejemplo, solo 10), y el usuario comienza a navegar solicitando la página siguiente, y así sucesivamente. Resulta muy útil, especialmente en sistemas web, donde no existe una conexión dedicada entre el cliente y el servidor, por lo que el cliente no tiene que esperar a que se lean y muestren todas las filas del servidor.

Enfoque de paginación de datos

  • {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 = (número_de_página-1) * filas

Método más sencillo (pero muy ineficiente)

  1. Seleccione todas las filas de la base de datos.
  2. Lee todas las filas pero envíalas a mostrar solo cuando el número de fila de las filas leídas esté entre {begin_base_0 + 1}y{begin_base_0 + rows}
Seleccionar * de { tabla } ordenar por { clave_única }

Otro método sencillo (un poco más eficiente que leer todas las filas)

  1. Seleccione todas las filas desde el principio de la tabla hasta la última fila para mostrar ( {begin_base_0 + rows})
  2. Lee las {begin_base_0 + rows}filas pero envíalas a mostrar solo cuando el número de fila de las filas leídas sea mayor que{begin_base_0}

Método con posicionamiento

  1. Seleccione solo {rows}las filas que se mostrarán a partir de la siguiente ( {begin_base_0 + 1})
  2. Lee y envía para mostrar todas las filas leídas de la base de datos.

Método con filtro (es más sofisticado, pero necesario para conjuntos de datos muy grandes).

  1. Seleccione solo {rows}las filas con filtro:
    1. Primera página: seleccione solo las primeras {rows}filas, según el tipo de base de datos.
    2. Página siguiente: seleccione solo las primeras {rows}filas, según el tipo de base de datos, donde el valor {unique_key}sea mayor que {last_val}(el valor de {unique_key}la última fila en la página actual).
    3. Página anterior: ordena los datos en orden inverso, selecciona solo las primeras {rows}filas, donde el valor {unique_key}es menor que {first_val}(el valor de {unique_key}la primera fila en la página actual), y ordena el resultado en el orden correcto.
  2. Lee y envía para mostrar todas las filas leídas de la base de datos.

Consulta jerárquica

Algunas bases de datos proporcionan una sintaxis especializada para datos jerárquicos .

En SQL Server 2003, una función de ventana es una función de agregación que se aplica 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:

< OVER_CLAUSE > :: = SOBRE ( [ PARTICIÓN POR < expr > , ... ] [ ORDENAR POR < expresión > ] ) 

La cláusula OVER permite particionar y ordenar el conjunto de resultados. El ordenamiento se utiliza para funciones relativas al orden, como row_number.

Evaluación de consultas ANSI

El procesamiento de una sentencia SELECT según ANSI SQL sería el siguiente: [ 9 ]

  1. select g . * from users u inner join groups g on g . Userid = u . Userid where u . LastName = 'Smith' and u . FirstName = 'John'
  2. Se evalúa la cláusula FROM, se produce una combinación cartesiana o un producto cartesiano para las dos primeras tablas de la cláusula FROM, lo que da como resultado una tabla virtual llamada Vtable1.
  3. La cláusula ON se evalúa para vtable1; solo se insertan en Vtable2 los registros que cumplen la condición de unión g.Userid = u.Userid.
  4. Si se especifica una unión externa, los registros que se eliminaron de vTable2 se agregan a VTable3, por ejemplo, si la consulta anterior fuera:
    select u . * from users u left join groups g on g . Userid = u . Userid where u . LastName = 'Smith' and u . FirstName = 'John'
    Todos los usuarios que no pertenecían a ningún grupo serían añadidos de nuevo a Vtable3.
  5. Se evalúa la cláusula WHERE; en este caso, solo se agregaría a vTable4 la información del grupo del usuario John Smith.
  6. Se evalúa la cláusula GROUP BY; si la consulta anterior fuera:
    SELECT g.GroupName , COUNT ( g . * ) AS NumberOfMembers FROM users u INNER JOIN groups g ON g.Userid = u.Userid GROUP BY GroupName
    vTable5 estaría compuesto por los miembros devueltos por vTable4 organizados por la agrupación, en este caso GroupName.
  7. La cláusula HAVING se evalúa para los grupos para los que la cláusula HAVING es verdadera y se inserta en vTable6. Por ejemplo:
    SELECT g.GroupName , COUNT ( g . * ) AS NumberOfMembers FROM users u INNER JOIN groups g ON g.Userid = u.Userid GROUP BY GroupName HAVING COUNT ( g . * ) > 5
  8. La lista SELECT se evalúa y se devuelve como Vtable 7.
  9. Se evalúa la cláusula DISTINCT; se eliminan las filas duplicadas y se devuelven como Vtable 8.
  10. Se evalúa la cláusula ORDER BY, ordenando las filas y devolviendo VCursor9. Se trata de un cursor y no de una tabla, ya que ANSI define un cursor como un conjunto ordenado de filas (no relacional).

Compatibilidad con funciones de ventana por parte de los proveedores de RDBMS

La implementación de las funciones de ventana por parte de los proveedores de bases de datos relacionales y motores SQL varía enormemente. La mayoría de las bases de datos admiten al menos alguna variante de funciones de ventana. Sin embargo, al analizarlas con más detalle, queda claro que la mayoría de los proveedores solo implementan un subconjunto del estándar. Tomemos como ejemplo la potente cláusula RANGE. Solo Oracle, DB2, Spark/Hive y Google BigQuery implementan completamente esta función. Más recientemente, los proveedores han añadido nuevas extensiones al estándar, como las funciones de agregación de matrices. Estas son especialmente útiles al ejecutar SQL en un sistema de archivos distribuido (Hadoop, Spark, Google BigQuery), donde las garantías de colocalización de datos son menores 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 en un sistema de archivos distribuido pueden lograr garantías de colocalización de datos anidando los datos y, por lo tanto, evitando uniones potencialmente costosas que impliquen una gran cantidad de transferencias a través de la red. Las funciones de agregación definidas por el usuario que se pueden usar en las funciones de ventana son otra característica extremadamente potente.

Generación de datos en T-SQL

Método para generar datos basados ​​en la unión de todos

seleccionar 1 a , 1 b unión todo seleccionar 1 , 2 unión todo seleccionar 1 , 3 unión todo seleccionar 2 , 1 unión 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 )

Notas

  1. Omitir la cláusula FROM no es lo habitual, pero la mayoría de los principales sistemas de gestión de bases de datos lo permiten.

Referencias

  1. Microsoft (23 de mayo de 2023). "Convenciones de sintaxis de Transact-SQL" .
  2. MySQL. "Sintaxis SQL SELECT" .
  3. "Referencia de Transact-SQL". Referencia del lenguaje SQL Server . Libros en línea de SQL Server 2005. Microsoft. 15 de septiembre de 2007. Consultado el 17 de junio de 2007 .
  4. Guía del usuario de procedimientos SQL de SAS 9.4 . SAS Institute (publicado en 2013). 10 de julio de 2013. pág. 248. ISBN  9781612905686. Consultado el 21/10/2015 . Aunque el argumento UNIQUE es idéntico a DISTINCT, no es un estándar ANSI.
  5. Leon, Alexis ; Leon, Mathews (1999). "Eliminación de duplicados: SELECT usando DISTINCT". SQL: Una referencia completa . Nueva Delhi: Tata McGraw-Hill Education (publicado en 2008). pág. 143. ISBN  9780074637081. Recuperado el 21-10-2015 . [...] la palabra clave DISTINCT [...] elimina los duplicados del conjunto de resultados.
  6. Documentación de PostgreSQL 9.1.24 - Capítulo 3. Funcionalidades avanzadas
  7. OpenLink Software. "9.19.10. La opción TOP SELECT" . docs.openlinksw.com . Consultado el 1 de octubre de 2019 .
  8. Ing. Óscar Bonilla, MBA
  9. Dentro de Microsoft SQL Server 2005: Consultas T-SQL por Itzik Ben-Gan, Lubor Kollar y Dejan Sarka

Fuentes

  • Particionamiento horizontal y vertical, Libros en línea de Microsoft SQL Server 2000.
  • Tablas con ventanas y función de ventana en SQL , Stefan Deßloch
  • Sintaxis SELECT de Oracle
  • Sintaxis SELECT de Firebird
  • Sintaxis SELECT de MySQL
  • Sintaxis SELECT de PostgreSQL
  • Sintaxis SELECT de SQLite