Seleccionar (SQL)

La versión estable se desprotegió el 11 de abril de 2022 . Hay cambios no verificados en plantillas o .

SELECT (del inglés  select  - “select”) es un operador de consulta ( DML / DQL ) en lenguaje SQL que devuelve un conjunto de datos (selección) de la base de datos .

El operador devuelve cero o más filas. La lista de columnas a devolver se especifica en la parte de la declaración denominada cláusula SELECT. Dado que SQL es un lenguaje declarativo, la consulta SELECT solo define los requisitos para el conjunto de datos devuelto y no es una instrucción precisa sobre cómo calcularlos. El DBMS traduce la consulta SELECT en un plan de ejecución interno ("plan de consulta"), que puede diferir incluso para consultas sintácticamente idénticas de un DBMS específico.

La instrucción SELECT consta de varias cláusulas (secciones):

Estructura del operador

La instrucción SELECT tiene la siguiente estructura:

SELECCIONE [ DISTINTO | DISTINTO | ALL ] select_expression ,... FROM table_references [ WHERE where_definition ] [ GROUP BY { unsigned_integer | nombre_col | fórmula } ] [ TENIENDO donde_definición ] [ ORDENAR POR { unsigned_integer | nombre_col | fórmula } [ ASC | DESC ], ...]

Sugerencias del operador

SELECCIONAR

La SELECTcláusula del operador SELECTestá destinada a definir el conjunto de resultados de columnas que se obtiene después de que la expresión de la tabla en la cláusula se haya evaluado FROMy agrupado en el resultado GROUP BY(si corresponde). La cláusula SELECTimplementa una operación de proyección, es decir, especifica un subconjunto de columnas de tablas de una expresión de tabla, así como una operación de cambio de nombre de columnas y una operación de adición de nuevas columnas computables.

DESDE

La cláusula FROMse usa para evaluar la expresión de la tabla base, que luego es utilizada por el resto de las cláusulas del operador SELECT.

DONDE

La cláusula [[WHERE (SQL)|WHERE]] se utiliza para determinar qué filas deben seleccionarse de la expresión de la tabla en la cláusula FROM.

AGRUPAR POR

[[GROUP BY (SQL)|GROUP BY]] — una cláusula de operador opcional SELECT, para agrupar filas en función de los resultados de funciones agregadas ( MAX, SUM, AVG, …).

SELECTEs necesario que solo las columnas requeridas en el flujo de salida, enumeradas en GROUP BYy/o valores agregados , se especifiquen en la oración . Un error común es incluir una SELECTcolumna en una oración que falta en el GROUP BY.

TENER

HAVING es una sugerencia de operador opcional SELECTpara seleccionar grupos resultantes de GROUP BY.

Cuando se especifica , HAVING <условия>puede especificar condiciones en las columnas especificadas en GROUP BYy en los valores de las funciones agregadas calculadas para cada grupo formado por GROUP BY.

ORDENAR POR

ORDER BY es una cláusula opcional de los operadores SELECTy UNION, lo que significa que los operadores SELECT, UNIONdevuelven un conjunto de filas ordenadas por los valores de una o más columnas. Se puede aplicar tanto a columnas numéricas como a cadenas. En este último caso, la ordenación se realizará alfabéticamente .

El uso de una cláusula ORDER BYes la única forma de ordenar el conjunto de filas resultante. Sin esta cláusula, el DBMS puede devolver las filas en cualquier orden. Si se necesita ordenar, ORDER BYdebe estar presente en SELECT, UNION.

La clasificación se puede hacer en orden ascendente o descendente.

  • La ASCopción (predeterminada) establece el orden de clasificación en orden ascendente, desde los valores más pequeños hasta los más grandes.
  • El parámetro DESCestablece el orden de clasificación en orden descendente, de mayor a menor.

Ejemplos

mesa "T" Solicitud Resultado
C1 C2
una a
2 b
SELECCIONE * DE T
C1 C2
una a
2 b
C1 C2
una a
2 b
SELECCIONE C1 DE T
C1
una
2
C1 C2
una a
2 b
SELECCIONE * DESDE T DONDE C1 = 1
C1 C2
una a
C1 C2
una a
2 b
SELECCIONE * DESDE PEDIR POR C1 DESC _
C1 C2
2 b
una a

Para la consulta de la tabla T

SELECCIONE * DE T

devolverá todas las columnas de todas las filas de la tabla dada. Para la misma tabla, consulta

SELECCIONE C1 DE T

devolverá los valores de la columna C1 de todas las filas de la tabla. En términos de álgebra relacional , podemos decir que se ha hecho una proyección . Para la misma tabla, consulta

SELECCIONE * DESDE T DONDE C1 = 1

devolverá los valores de todas las columnas de todas las filas de la tabla para las que el valor del campo C1 sea igual a 1. En términos de álgebra relacional , podemos decir que se ha realizado una selección . Última petición

SELECCIONE * DESDE PEDIR POR C1 DESC _

devolverá las mismas filas que la primera, sin embargo, el resultado se clasificará en orden inverso (ZA) debido al uso de la palabra clave ORDER BY con el campo C1 como campo de clasificación. Esta consulta no contiene la palabra clave WHERE, por lo que devolverá lo que esté en la tabla. Se pueden especificar varios elementos ORDER BY separados por comas [p. ej. ORDENAR POR C1 ASC, C2 DESC] para una clasificación más precisa.

Selecciona todas las filas donde el campo column_name es igual a uno de los valores enumerados value1, value2,…

SELECCIONE * DESDE nombre_tabla DONDE nombre_columna EN ( valor1 , valor2 , ...)

Devuelve una lista de ID de departamentos cuyas ventas superaron las 1000 el 1 de enero de 2000, junto con los totales de ventas de ese día:

SELECCIONE DeptID , SUM ( SaleAmount ) FROM Ventas DONDE SaleDate = '01-Ene-2000' GRUPO POR DeptID TENIENDO SUM ( SaleAmount ) > 1000

Restricción en cadenas devueltas

De acuerdo con ISO SQL: 2003, el conjunto de datos devuelto se puede limitar con:

  • cursores , o
  • introduciendo funciones de ventana en la sentencia SELECT

ROW_NUMBER() función de ventana

Hay varias funciones de ventana . ROW_NUMBER() OVERse puede utilizar para simplemente limitar el número de filas devueltas. Por ejemplo, para devolver no más de diez filas:

SELECCIONE * DESDE ( SELECCIONE ROW_NUMBER () SOBRE ( ORDENAR POR tecla ASC ) COMO número de fila , columnas DESDE nombre de tabla ) COMO foo DONDE número de fila <= 10

ROW_NUMBER puede ser no determinista: si la clave no es única, cada vez que se ejecuta la consulta, es posible asignar números diferentes a las filas que tienen la misma clave . Cuando la clave es única, cada línea siempre obtendrá un número de línea único.

La función de ventana RANK()

La función RANK() OVERfunciona de manera muy similar a ROW_NUMBER, pero puede devolver más de n filas bajo ciertas condiciones. Por ejemplo, para obtener el top 10 de personas más jóvenes:

SELECCIONE * DESDE ( SELECCIONE RANGO () SOBRE ( ORDEN POR edad ASC ) AS clasificación , person_id , person_name , edad FROM persona ) AS foo WHERE clasificación <= 10

Este código puede devolver más de 10 filas. Por ejemplo, si hay dos personas con la misma edad, devolverá 11 filas.

Sintaxis no estándar

No todos los DBMS admiten las funciones de ventana anteriores. Al mismo tiempo, muchos tienen una sintaxis no estándar para resolver los mismos problemas. A continuación se muestran ejemplos de restricciones de muestreo simples para varios DBMS:

Proveedor/DBMS Sintaxis de restricciones
DB2 (Soporta estándar desde DB2 Versión 6)
SELECCIONE * DESDE [ T ] OBTENER SOLO LAS PRIMERAS 10 FILAS
pájaro de fuego SELECCIONE LOS PRIMEROS 10 * DE [ T ]
Informix SELECCIONE LOS PRIMEROS 10 * DE [ T ]
interbase SELECCIONE * DE [ T ] FILAS 10
microsoft (Admite estándar desde SQL Server 2005)
TambiénSELECCIONE LOS 10 PRINCIPALES [ PORCENTAJE ] * DE T ORDENAR POR col
mysql SELECCIONE * DESDE T LÍMITE 10
SQLite SELECCIONE * DESDE T LÍMITE 10
postgresql (Admite estándar desde PostgreSQL 8.4)
SELECCIONE * DESDE T LÍMITE 10
Oráculo (Admite estándar desde Oracle8i)
TambiénSELECCIONE * DESDE T DONDE ROWNUM <= 10

Literatura

  • Chamberlin, Donald D. Historia temprana de SQL . // IEEE Anales de la Historia de la Computación 34.4 (2012): 78-82. (Inglés)
  • Alex Kriegel, Boris M. Trujnov. Biblia SQL (2ª ed.). Wiley Publishing, 2008.  (Inglés)
  • Gruber M. Comprender SQL. - Moscú, 1993. - 291 p.