stringtranslate.com

Seleccionar (SQL)

La instrucción SQL SELECT devuelve un conjunto de registros de resultados , de una o más tablas . [1] [2]

Una instrucción SELECT recupera cero o más filas de una o más tablas de base de datos o vistas de base de datos . En la mayoría de las aplicaciones, es el comando del lenguaje de manipulación de datos (DML) SELECTmá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 la 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 declaració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. Las declaraciones estándar SELECTno 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) lleve a cabo la planificación , la optimización y la realización de las operaciones físicas necesarias para producir el resultado que elija.

Una consulta incluye una lista de columnas para incluir 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 las tablas consultadas. SELECTes la declaración más compleja en 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 Libro en las que la columna de precio contiene un valor superior a 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 Libro deben incluirse en el conjunto de resultados.

SELECCIONAR * DESDE Reservar DONDE precio > 100 . 00 ORDENAR POR título ;          

El siguiente ejemplo demuestra una consulta de varias tablas, agrupaciones y agregaciones, al devolver una lista de libros y la cantidad de autores asociados con cada libro.

 SELECCIONAR Libro . título AS Título , contar ( * ) AS Autores DESDE Libro ÚNETE Libro_autor EN Libro . isbn = Libro_autor . isbn GRUPO POR Libro . título ;                 

El resultado de ejemplo podría parecerse al siguiente:

Título Autores---------------------- -------Ejemplos de SQL y guía 4La alegría de SQL 1Una introducció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 denominada título solo exista en la tabla Libro , se podría reescribir la consulta anterior de la siguiente forma:

SELECCIONE el título , cuente ( * ) COMO Autores DEL Libro UNIRSE NATURAL Libro_autor GRUPO POR título ;            

Sin embargo, muchos proveedores de [ cuantificar ] no admiten este enfoque o requieren ciertas convenciones de nomenclatura de columnas para que las uniones naturales funcionen de manera efectiva.

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 sales_tax que contiene una cifra de impuesto sobre las ventas calculada al 6% del precio .

SELECCIONAR isbn , titulo , precio , precio * 0 . 06 AS sales_tax DESDE Reservar DONDE precio > 100 . 00 ORDENAR POR título ;                 

Subconsultas

Las consultas se pueden anidar para que los resultados de una consulta se puedan utilizar en otra consulta 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 tablas proporcionan alternativas computacionalmente superiores (es decir, más rápidas) en muchos casos, 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 DEL Libro DONDE precio < ( SELECCIONAR PROMEDIO ( precio ) DEL 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 subconsultas con nombre llamadas expresiones de tabla comunes (nombradas y diseñadas después de la implementación de IBM DB2 versión 2; Oracle las llama factorización de subconsultas ). Los CTE también pueden ser recursivos al referirse a sí mismos; 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 el uso de hacer referencia a una subconsulta SQL en una cláusula FROM. Básicamente, la tabla derivada es una subconsulta de la que se puede seleccionar o unirse. 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 de lista .

En el siguiente ejemplo, la instrucción SQL implica una unión de la tabla Libros inicial a la tabla derivada "Ventas". Esta tabla derivada captura información de ventas de libros asociada utilizando el ISBN para unirla a la tabla Libros. 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 . company_nm FROM Libro b ÚNETE ( SELECCIONAR SUMA ( Artículos_Vendidos ) Artículos_Vendidos , Company_Nm , ISBN FROM Book_Sales GROUP BY Company_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, restringiendo la salida de la consulta para ver solo campos o columnas específicos.SELECT C1 FROM T

Con la misma tabla, la consulta dará como resultado que se muestren todos los elementos de todas las filas donde el valor de la columna C1 es '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 y restringe la salida de filas de una consulta de acuerdo con condiciones específicas.SELECT * FROM T WHERE C1 = 1

Con más de una tabla, el conjunto de resultados será cada combinación de filas. Entonces, si dos tablas son T1 y T2, el resultado será cada combinación de filas T1 con cada fila T2. Por ejemplo, si T1 tiene 3 filas y T2 tiene 5 filas, entonces se obtendrán 15 filas.SELECT * FROM T1, T2

Aunque no es estándar, la mayoría de los DBMS permiten usar una cláusula de selección sin una tabla, pretendiendo que se usa una tabla imaginaria con una fila. 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 significar “todas las propiedades”.

Limitar filas de resultados

A menudo es conveniente indicar un número máximo de filas que se devuelven. Esto se puede utilizar para realizar pruebas o para evitar el consumo excesivo de recursos si la consulta devuelve más información de la esperada. El enfoque para hacer esto a menudo varía según el proveedor.

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

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 de alguna manera están relacionadas con la fila actual", de manera similar a las funciones agregadas. [7] El nombre recuerda las funciones de la 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 * DESDE ( SELECCIONAR NÚMERO DE FILA () SOBRE ( ORDENAR POR clave_clasificación ASC ) COMO número_fila , columnas DESDE nombre de tabla ) COMO foo DONDE número_fila <= 10                   

ROW_NUMBER puede no ser determinista : si sort_key no es único, cada vez que ejecuta la consulta es posible obtener diferentes números de fila asignados a cualquier fila en la que sort_key sea el mismo. Cuando sort_key es único, cada fila siempre obtendrá un número de fila único.

Función de ventana RANGO()

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 * DESDE ( SELECCIONAR RANGO () SOBRE ( ORDENAR POR edad ASC ) COMO clasificación , id_persona , nombre_persona , edad DE persona ) COMO foo DONDE clasificación <= 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.

FETCH PRIMERA cláusula

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 BUSCAR SÓLO 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 , y son necesarias para este uso ORDER BY.OFFSETFETCH FIRST

SELECCIONAR * DE T ORDENAR POR una columna DESC DESPLAZAMIENTO 0 FILAS OBTENER SÓLO 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

La paginación de 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, al servidor se le solicita 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. , etcétera. Es 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 para leer y mostrar todas las filas del servidor.

Enfoque de datos en paginación

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

  1. Seleccionar todas las filas de la base de datos
  2. Lea todas las filas pero envíelas para mostrarlas solo cuando el número de fila de las filas leídas esté entre {begin_base_0 + 1}y{begin_base_0 + rows}
Seleccione * de { tabla } ordene por { clave_única }      

Otro método simple (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. Lea las {begin_base_0 + rows}filas pero envíelas para mostrarlas 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}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. Seleccione solo entonces {rows}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 {unique_key}sea mayor que {last_val}(el valor de {unique_key}la última fila de la página actual)
    3. Página anterior: ordene los datos en orden inverso, seleccione solo las primeras {rows}filas, donde {unique_key}es menor que {first_val}(el valor de {unique_key}la primera fila en la página actual) y ordene 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:

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

La cláusula OVER puede dividir y ordenar el conjunto de resultados. El ordenamiento se utiliza para funciones relativas al orden, como número_fila.

Evaluación de consultas ANSI

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

  1. seleccione g . * de usuarios u grupos internos que se unen g en g . ID de usuario = tu . ID de usuario donde estás . Apellido = 'Smith' y u . Nombre = 'Juan'                 
  2. Se evalúa la cláusula FROM, se produce una unión cruzada o producto cartesiano para las dos primeras tablas de 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 con la condición de unión g.Userid = u.Userid se insertan en Vtable2
  4. Si se especifica una combinación externa, los registros que se eliminaron de vTable2 se agregan a VTable 3, por ejemplo, si la consulta anterior fuera:
    seleccione usted . * de los usuarios que dejaste unirte a grupos g en g . ID de usuario = tu . ID de usuario donde estás . Apellido = 'Smith' y u . Nombre = 'Juan'                 
    todos los usuarios que no pertenecían a ningún grupo se volverían a agregar a Vtable3
  5. se evalúa la cláusula WHERE, en este caso solo se agregaría a vTable4 la información del grupo para el usuario John Smith
  6. se evalúa GROUP BY; si la consulta anterior fuera:
    seleccione g . GroupName , cuenta ( g . * ) como NumberOfMembers de los usuarios u grupos internos que se unen g on g . ID de usuario = tu . Grupo de ID de usuario por nombre de grupo                
    vTable5 consistiría en 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 cuales la cláusula HAVING es verdadera y se inserta en vTable6. Por ejemplo:
    seleccione g . GroupName , cuente ( g . * ) como NumberOfMembers de los usuarios que se unen internamente a los grupos g on g . ID de usuario = tu . Grupo de ID de usuario por nombre de grupo con recuento ( 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. Este es un cursor y no una tabla porque ANSI define un cursor como un conjunto ordenado de filas (no relacional).

Soporte de funciones de ventana por parte de proveedores de RDBMS

La implementación de 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 algunas funciones de ventana. Sin embargo, cuando miramos 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. Sólo Oracle, DB2, Spark/Hive y Google Big Query implementan completamente esta característica. Más recientemente, los proveedores han añadido nuevas extensiones al estándar, por ejemplo, funciones de agregación de matrices. Estos son particularmente útiles en el contexto de ejecutar SQL en 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 en un sistema de archivos distribuido pueden lograr garantías de co-localidad de datos anidando datos y evitando así uniones potencialmente costosas que implican una gran mezcla en la red. Las funciones agregadas definidas por el usuario que se pueden utilizar en funciones de ventana son otra característica extremadamente poderosa.

Generando datos en T-SQL

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

seleccione 1 a , 1 b unión todos seleccione 1 , 2 unión todos seleccione 1 , 3 unión todos seleccione 2 , 1 unión todos seleccione 5 , 1                    

SQL Server 2008 admite el "constructor de filas" especificado en el estándar SQL3 ("SQL:1999")

seleccione * 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 lo permiten la mayoría de los principales DBMS.
  4. ^ "Referencia de Transact-SQL". Referencia del lenguaje SQL Server. Libros en línea de SQL Server 2005. Microsoft. 2007-09-15 . Consultado el 17 de junio de 2007 .
  5. ^ Guía del usuario del procedimiento SQL SAS 9.4. Instituto SAS (publicado en 2013). 10 de julio de 2013. pág. 248.ISBN _ 9781612905686. Consultado el 21 de octubre de 2015 . Aunque el argumento ÚNICO es idéntico a DISTINCT, no es un estándar ANSI.
  6. ^ León, Alexis ; León, Mathews (1999). "Eliminación de duplicados: SELECCIONAR usando DISTINCT". SQL: una referencia completa. Nueva Delhi: Tata McGraw-Hill Education (publicado en 2008). pag. 143.ISBN _ 9780074637081. Consultado 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. ^ Software OpenLink. "19.9.10. La opción TOP SELECT". docs.openlinksw.com . Consultado el 1 de octubre de 2019 .
  9. ^ Ing. Óscar Bonilla
  10. ^ Dentro de Microsoft SQL Server 2005: consultas T-SQL por Itzik Ben-Gan, Lubor Kollar y Dejan Sarka

Fuentes

enlaces externos