2.2. SELECT

La recuperación de los datos en el lenguaje SQL se realiza mediante la sentencia SELECT. Esta sentencia permite indicar al SGBD la información que se quiere recuperar. Esta es la sentencia SQL, más habitual. La sentencia SELECT consta de cuatro partes básicas:

SELECT {* | {columna,}+}  FROM {tabla,}+WHERE condición]
  [ORDER BY {expresiónColumna [ASC | DESC],}+];

Selección de columnas

Las columnas a seleccionar se enumeran sin más en la cláusula SELECT. Para seleccionar todas las columnas use el carácter asterisco ' *'.

Cuando se consulta una base de datos, los nombres de las columnas se usan como cabeceras de presentación. Si éste resulta demasiado largo, corto o críptico, puede cambiarse con la misma sentencia SQL de consulta, creando un alias de columna

Cláusula FROM

La cláusula FROM define las tablas de las que se van a seleccionar las columnas.

Se puede añadir al nombre de las tablas el usuario propietario de las mismas de la forma usuario.tabla. De esta manera podemos distinguir entre las tablas de un usuario y otro.

Oracle siempre considera como prefijo el nombre del propietario de las tablas, aunque no se lo indiquemos. De esta forma dos o más usuarios pueden tener tablas que se llamen igual sin que surjan conflictos. Si quisiéramos acceder a las filas de la tabla departamento del usuario epacheco, (ademas de tener privilegios de lectura sobre esa tabla) deberíamos escribir la siguiente sentencia SQL:

También se puede asociar un alias a las tablas para abreviar los nombres de las tablas. Un ejemplo se puede ver en la sentencia SQL siguiente:

SELECT d.nombre 'Nombre Departamento',
       d.ciudad 'Ubicado en'
FROM departamento d

Un campo calculado o campo derivado es una expresión numérica y que deberá ser referenciada mediante un alias mediante el uso de la cláusula AS, en Oracle y MySQL está sentencia es opcional. Por ejemplo calcular el sueldo diario de un empleado.

SELECT nombreEmpleado 'Nombre Empleado',
TO_CHAR(salario/30,'999,999.99') 'Salario Diario'
FROM empleado

Ejemplo: Valores distintos y limitados. El ejemplo podría parecer simple pero es la base de la paginación.

SELECT DISTINCT sueldo
    FROM femexfut ROWNUM <= 20

Retricción y ordenación de datos

La sentencia SELECT recupera todas las columnas o un subconjunto de ellas de una tabla. Esto afecta a todas las filas de la tabla, a menos que especifiquemos una condición en la cláusula WHERE.

Esta condición regresa todas las filas que cumplen dicha condicional. La complejidad del criterio de búsqueda es prácticamente ilimitada, y en él se pueden combinar operadores de diversos tipos con funciones de columnas, componiendo expresiones más o menos complejas.

Condición de búsqueda basada en una comparación compuesta

En este ejemplo, se utiliza el operador lógico OR en la cláusula WHERE para localizar los empleados que son chofer o secretaria. La consulta y la tabla resultados se muestra a continuación.

SELECT nombreEmpleado 'Nombre Empleado', oficio
FROM empleado
WHERE (oficio = 'Chofer') OR (oficio = 'Secretaria')

Condición de búsqueda basada en rango

La condición BETWEEN indica los puntos extremos del rango, por lo cual el resultado incluirá también a todos los empleados cuyo salario está entre 2,500 y 5,000 pesos.

SELECT nombreEmpleado 'Nombre Empleado',
       oficio, TO_CHAR(salario,'999,999') Salario
 FROM empleado WHERE salario BETWEEN 2500 AND 5000;

La condición de pertenencia de un conjunto (IN) comprueba si un valor de los datos se corresponde con uno de los valores especificados en una determinada lista, que en este caso está compuesta por sólo dos opciones 'Chofer' y 'Secretaria'. La consulta y la tabla resultado se muestra a continuación.

SELECT nombreEmpleado 'Nombre Empleado', 
       oficio, TO_CHAR(salario,'999,999') Salario 
FROM Empleado
WHERE oficio IN ('Chofer', 'Secretaria');

La operación más utilizada sobre las cadenas de caracteres es la comparación de patrones, para la que se usa el operador LIKE. Para la descripción de los patrones se utilizan dos caracteres especiales:

Patrones de comparación
Patrón Descripción
% El carácter % coincide con cualquier subcadena de caracteres
_ El carácter _ coincide con cualquier carácter

Ejemplo: Determinar que empleados se apellidan o se llaman 'GOMEZ'

SELECT nombreEmpleado 'Nombre Empleado', oficio,
       TO_CHAR(salario,'999,999') Salario
FROM Empleado
WHERE nombreEmpleado LIKE '%GOMEZ%';

Cláusula ORDER BY

En general, las filas de la tabla resultados de una consulta SQL, no están ordenadas por ningún criterio particular. Sin embargo podemos garantizar que los resultados de la consulta queden ordenados utilizando la cláusula ORDER BY en la instrucción SELECT. La cláusula ORDER BY está compuesta por una lista de identificadores de columna según los cuales hay que ordenar los resultados, separados por comas.

ORDER BY se usa para especificar el criterio de ordenación de la respuesta a la consulta. Por defecto la ordenación es ascendente, aunque se puede especificar un orden descendente (DESC). La ordenación se puede establecer sobre el contenido de columnas o sobre expresiones con columnas.

Ejemplo: Consulta de los empleados ordenada de manera descendente por su salario y en caso de igualdad de salario, ordenado ascendentemente por su nombre.

SELECT nombreEmpleado 'Nombre Empleado', oficio,
       TO_CHAR(salario,'999,999') Salario 
FROM empleado
ORDER BY Salario DESC, nombreEmpleado;

Ejemplo: Se presentan los campeones NBA ordenados por temporada.

SELECT temporada,
  campeon,
  ganador,
  perdedor,
  subcampeon
  FROM campeonesNBA 
  ORDER BY temporada DESC

Cláusula DISTINCT

Cuando se realiza una consulta sobre una tabla en la que se extrae información de varias columnas, puede ocurrir que, si no incluimos la/s columna/s que forman la clave principal, obtengamos filas repetidas en la respuesta.

Si este comportamiento es no satisfactorio podemos utilizar la cláusula DISTINCT para eliminar las filas duplicadas obtenidas como respuesta a una consulta.

Ejemplo: Obtener los campeones NBA

SELECT DISTINCT campeon
FROM campeonesNBA
ORDER BY campeon

Ejemplo: Antiguedad de los empleados en la empresa

SELECT nombreEmpleado,TRUNC(MONTHS_BETWEEN(SYSDATE, ingreso)/12) AS antiguedad
FROM empleadoORDER BY antiguedad DESC, nombreEmpleado;

Expresión CASE

La expresión CASE permite utilizar la lógica IF-THEN-ELSE en sentencias SQL sin tener que invocar procedimientos. Esta expresión se incluye a partir de la versión Oracle9i Server y MySQL 5.

La siguiente es la sintaxis que presenta la expresión CASE:

SELECT campos, 
    CASE expresión WHEN Comparación_1 
      THEN return_expresión_1
    WHEN Comparación_2 THEN return_expresión_2 
    WHEN Comparación_n THEN return_expresión_n 
    ELSE else_expresión]    
  END
FROM tabla

Expresión es opcional. (ie: Comparación_1, Comparación_2, ... Comparación_n) deben ser del mismo tipo y son evaluadas en el orden que se listan y regresara return_expresión de la primera comparación que regresa TRUE, si ninguna expresión es evaluada como TRUE se regresa el valor declarado en el ELSE.

Si la clausula ELSE es omitida y ninguna condición es evaluda TRUE. La sentencia CASE regresa NULL.

Es posible declarar un máximo de 255 comparaciones en la sentencia CASE. Cada clausula WHEN ... THEN es considerada como 2 comparaciones.

Ejemplo: Se requiere saber si un empleado tiene derecho al estimulo por antiguedad de 10 o 6 años.

SELECT nombreEmpleado, 
  CASE
    WHEN TRUNC(MONTHS_BETWEEN(SYSDATE, ingreso)/12) = 10 
         THEN 'Estimulo 10 años'
    WHEN TRUNC(MONTHS_BETWEEN(SYSDATE, ingreso)/12)  =  6 
         THEN 'Estimulo 6 años'
    ELSE ''
  END AS Estimulo
FROM empleado
ORDER BY nombreEmpleado

Condición de búsqueda basada en una comparación compuesta

En este ejemplo, se utiliza el operador lógico OR en la cláusula WHERE para localizar los empleados que son chofer o secretaria. La consulta y la tabla resultados se muestra a continuación.

SELECT nombreEmpleado "Nombre Empleado", oficio
FROM empleado
WHERE (oficio = 'Chofer') OR (oficio = 'Secretaria')

Condición de búsqueda basada en rango

La condición BETWEEN indica los puntos extremos del rango, por lo cual el resultado incluirá tambien a todos los empleados cuyo salario esté entre 2,500 y 5,000 pesos.

SELECT nombreEmpleado "Nombre Empleado",
       oficio, TO_CHAR(salario,'999,999') Salario
FROM empleado WHERE salario BETWEEN 2500 AND 5000;

La condición de pertenencia de un conjunto (IN) comprueba si un valor de los datos se corresponde con uno de los valores especificados en una determinada lista, que en este caso está compuesta por s�lo dos opciones 'Chofer' y 'Secretaria'. La consulta y la tabla resultado se muestra a continuación.

SELECT nombreEmpleado "Nombre Empleado", 
       oficio, TO_CHAR(salario,'999,999') Salario 
FROM Empleado
WHERE oficio IN ('Chofer', 'Secretaria');

La operación más utilizada sobre las cadenas de caracteres es la comparación de patrones, para la que se usa el operador LIKE. Para la descripción de los patrones se utilizan dos caracteres especiales:

Patrones de comparación
Patrón Descripción
% El carácter % coincide con cualquier subcadena de caracteres
_ El carácter _ coincide con cualquier carácter

Considere la consulta: Determinar que empleados se apellidan o se llaman 'ARIAS'

SELECT nombreEmpleado "Nombre Empleado", oficio,
       TO_CHAR(salario,'999,999') Salario
FROM Empleado
WHERE nombreEmpleado LIKE '%ARIAS%';

Cláusula ORDER BY

En general, las filas de la tabla resultados de una consulta SQL, no están ordenadas por ningún criterio particular. Sin embargo podemos garantizar que los resultados de la consulta queden ordenados utilizando la cláusula ORDER BY en la instrucción SELECT. La cláusula ORDER BY está compuesta por una lista de identificadores de columna según los cuales hay que ordenar los resultados, separados por comas.

ORDER BY se usa para especificar el criterio de ordenación de la respuesta a la consulta. Por defecto la ordenación es ascendente, aunque se puede especificar un orden descendente (DESC). La ordenación se puede establecer sobre el contenido de columnas o sobre expresiones con columnas.

Ejemplo: Consulta de los empleados ordenado de manera descendente por su salario y en caso de igualdad de salario, ordenado ascendentemente por su nombre.

SELECT nombreEmpleado "Nombre Empleado", oficio,
       TO_CHAR(salario,'999,999') Salario 
FROM empleado
ORDER BY Salario DESC, nombreEmpleado;

Ejemplo: Se presentan los campeones NBA ordenados por temporada.

SELECT temporada,
  campeon,
  ganador,
  perdedor,
  subcampeon
  FROM campeonesNBA 
  ORDER BY temporada DESC