stringtranslate.com

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 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:

Descripción general

SELECTes la operación más común en SQL, llamada "la 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 de SELECTpueden tener efectos persistentes, como la SELECT INTOsintaxis 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 SELECTpalabra clave. *Se puede utilizar un asterisco (" ") para especificar que la consulta debe devolver todas las columnas de todas las tablas consultadas. SELECTes la sentencia más compleja de SQL, con palabras clave y cláusulas opcionales que incluyen:

El siguiente ejemplo de SELECTconsulta 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 a 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 eficaz.

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 ;                 

Subconsultas

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 AVGrecibe 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 las 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 .

Tabla derivada

Una tabla derivada es una subconsulta en una cláusula FROM. Básicamente, la tabla derivada es una subconsulta desde 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                        

Ejemplos

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 todas 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”.

Limitar filas de resultados

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 FIRSTclá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 .

Función de ventana ROW_NUMBER()

ROW_NUMBER() OVERse 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.

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

Cláusula FETCH FIRST

Desde ISO SQL:2008, los límites de resultados se pueden especificar como en el siguiente ejemplo utilizando la FETCH FIRSTclá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 BYcláusula. Las cláusulas ORDER BY, OFFSET, y FETCH FIRSTson necesarias para este uso.

SELECCIONAR * DE T ORDENAR POR una columna DESC DESPLAZAMIENTO 0 FILAS OBTENGA SOLO LAS PRIMERAS 10 FILAS               

Sintaxis no estándar

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 de filas

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.

Datos en el enfoque de paginación

El método más simple (pero muy ineficiente)

  1. Seleccionar todas las filas de la base de datos
  2. Leer todas las filas pero enviar para mostrar solo cuando el row_number 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 simple (un poco más eficiente que leer todas las filas)

  1. Seleccionar 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. Seleccionar sólo {rows}filas a partir de la siguiente fila para mostrar ( {begin_base_0 + 1})
  2. Leer y enviar 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. Seleccionar sólo {rows}las filas con filtro:
    1. Primera página: selecciona solo las primeras {rows}filas, dependiendo del tipo de base de datos
    2. Página siguiente: selecciona solo las primeras {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)
    3. Página anterior: ordena los datos en orden inverso, selecciona solo las primeras {rows}filas donde {unique_key}sea menor que {first_val}(el valor de {unique_key}la primera fila de la página actual) y ordena el resultado en el orden correcto
  2. Leer y enviar 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 .

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.

Evaluación de consultas ANSI

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

  1. seleccionar g . * de usuarios u unirse internamente a grupos g en g . Userid = u . Userid donde u . LastName = 'Smith' y u . FirstName = 'John'                 
  2. Se evalúa la cláusula FROM, se produce una unión cruzada o un producto cartesiano para las dos primeras tablas en la cláusula FROM, lo que da como resultado una tabla virtual como Vtable1
  3. La cláusula ON se evalúa para vtable1; solo los registros que cumplen la condición de unión g.Userid = u.Userid se insertan en Vtable2
  4. Si se especifica una unión externa, los registros que se eliminaron de vTable2 se agregan a VTable 3, por ejemplo, si la consulta anterior fuera:
    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'                 
    Todos los usuarios que no pertenecían a ningún grupo se agregarían nuevamente a Vtable3.
  5. Se evalúa la cláusula WHERE, en este caso solo se agregaría la información del grupo del usuario John Smith a vTable4
  6. Se evalúa GROUP BY; si la consulta anterior fuera:
    seleccione g . GroupName , count ( g . * ) como NumberOfMembers de usuarios u grupos de unión interna g en g . Userid = u . Userid grupo por GroupName                
    vTable5 constaría de miembros devueltos desde vTable4 organizados por 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:
    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                   
  8. La lista SELECT se evalúa y se devuelve como Vtable 7
  9. Se evalúa la cláusula DISTINCT; las filas duplicadas se eliminan 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 de funciones de ventana por parte de proveedores de RDBMS

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

Generando datos en T-SQL

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 )               

Referencias

  1. ^ Microsoft (23 de mayo de 2023). "Convenciones de sintaxis de Transact-SQL".
  2. ^ MySQL. "Sintaxis SQL SELECT".
  3. ^ Omitir la cláusula FROM no es estándar, pero está permitido en la mayoría de los DBMS principales.
  4. ^ "Referencia de Transact-SQL". Referencia del lenguaje de SQL Server. Libros en línea de SQL Server 2005. Microsoft. 15 de septiembre de 2007. Consultado el 17 de junio de 2007 .
  5. ^ 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 de octubre de 2015. Aunque el argumento UNIQUE es idéntico a DISTINCT, no es un estándar ANSI.
  6. ^ Leon, Alexis ; Leon, Mathews (1999). "Eliminación de duplicados: SELECT con DISTINCT". SQL: una referencia completa. Nueva Delhi: Tata McGraw-Hill Education (publicado en 2008). pág. 143. ISBN 9780074637081. Recuperado el 21 de octubre de 2015. [...] la palabra clave DISTINCT [...] elimina los duplicados del conjunto de resultados.
  7. ^ Documentación de PostgreSQL 9.1.24 - Capítulo 3. Funciones avanzadas
  8. ^ OpenLink Software. "9.19.10. La opción TOP SELECT". docs.openlinksw.com . Consultado el 1 de octubre de 2019 .
  9. ^ Ing. Óscar Bonilla, MBA
  10. ^ Dentro de Microsoft SQL Server 2005: consultas T-SQL por Itzik Ben-Gan, Lubor Kollar y Dejan Sarka

Fuentes

Enlaces externos