4. Consultas en SQL

SQL tiene una instrucción principal para recuperar información de una base de datos: el comando SELECT. Esta instrucción tiene muchas opciones. La forma básica de la instrucción SELECT es la siguiente:

SELECT <lista de atributos>
FROM <lista de tablas>
WHERE <condición>

donde:

<lista de atributos> es una lista de nombres de atributos cuyos valores van a ser recuperados por la consulta.

<lista de tablas> es una lista de nombres de relaciones requeridos para procesar la consulta.

<condición> es una expresión de búsqueda condicional (lógica) que identifica las tuplas que van a ser recuperadas por la consulta.

En los siguientes ejemplos usaremos las tablas (junto con la información de éstas) definidas en las secciones anteriores.

Consulta 0

Recuperar la fecha de nacimiento y la dirección del empleado cuyo nombre es "Juan Pérez".

Q0:    

SELECT

FNAC, DIRECCION

 

FROM

EMPLEADO

 

WHERE

NPILA = "Juan" AND APPAT = "Pérez"


Esta consulta involucra solamente la relación EMPLEADO, señalada en la cláusula FROM. La consulta selecciona la fila de la tabla EMPLEADO que satisface la condición de la cláusula WHERE, y selecciona los valores de esta tupla correspondientes a los atributos FNAC y DIRECCION.

Consulta 1

Recuperar el nombre y la dirección de todos los empleados que trabajan en el departamento "Investigación".

Q1:    

SELECT

NPILA, APPAT, DIRECCION

 

FROM

EMPLEADO, DEPARTAMENTO

 

WHERE

DNOMBRE = "Investigación" AND DNUMERO = NDEPTO


En la cláusula WHERE, la condición DNOMBRE = "Investigación" es una condición de selección. La condición DNUMERO = NDEPTO es una condición de asociación, y asocia la llave foránea NDEPTO de la relación EMPLEADO, con el correspondiente número de departamento (DNUMERO) de la relación DEPARTAMENTO. La siguiente consulta tiene dos condiciones de asociación

Consulta 2

Para todos los proyectos localizados en "La Florida", liste el número de proyecto, el número de departamento que lo controla, y el nombre, dirección y fecha de nacimiento del gerente de ese departamento.

Q2:    

SELECT

PNUMERO, DNUM, NPILA, APPAT, DIRECCION, FNAC

 

FROM

PROYECTO, DEPARTAMENTO, EMPLEADO

 

WHERE

DNUM = DNUMERO AND RUTGERENTE = RUT AND PUBICACION = "La Florida"


La condición DNUM = DNUMERO relaciona un proyecto con su correspondiente departamento, mientras que la condición RUTGERENTE = RUT relaciona el departamento que controla el proyecto, con el empleado que administra ese departamento.

En SQL, un mismo nombre puede ser usado por dos (o más) atributos en diferentes relaciones. Cuando esto sucede, y una consulta se refiere a dos o más atributos con el mismo nombre, el nombre de la relación debe ser puesto como prefijo del nombre de cada atributo, para avitar ambigüedad. Por ejemplo, supongamos que los atributos NDEPTO y NPILA de EMPLEADO se llamaran DNUMERO y NOMBRE respectivamente, y el atributo DNOMBRE de DEPARTAMENTO también se llamara NOMBRE. Entonces, para evitar ambigüedad en Q1, deberíamos usar como prefijos de los atributos, los nombres de las relaciones:

Q1A:    

SELECT

EMPLEADO.NOMBRE, APPAT, DIRECCION

 

FROM

EMPLEADO, DEPARTAMENTO

 

WHERE

DEPARTAMENTO.NOMBRE = "Investigación" AND DEPARTAMENTO.DNUMERO = EMPLEADO.DNUMERO


La ambigüedad también aparece en el caso de que la consulta se refiera a la misma relación dos o más veces, como en el siguiente ejemlo.

Consulta 3

Para cada empleado, recuperar el nombre y primer apellido, y el nombre y primer apellido de su supervisor inmediato.

Q3:    

SELECT

E.NPILA, E.APPAT, S.NPILA, S.APPAT

 

FROM

EMPLEADO E, EMPLEADO S

 

WHERE

E.RUTSUPERV = S.RUT


En este caso, se pueden declarar nombres alternativos para la misma relación, llamados alias. El nombre del alias se escribe inmediatamente después del nombre de la relación. También se puede declarar usando la palabra "AS", por ejemplo: EMPLEADO AS E. También es posible renombrar (como alias) todos los atributos de una relación en la cláusula FROM, de esta manera: EMPLEADO AS E(NP, AP1, AP2, RUT, FN, DIR, SE, SU, RUTS, ND). De este modo, se podría comparar (en la consulta anterior) E.RUTS = S.RUT.

Los alias pueden ser usados en cualquier consulta, no sólo cuando hay nombres repetidos. Los alias tienen sentido sólo en la consulta en que son definidos. Un alias no cambia "físicamente" el nombre de ninguna relación ni atributo de la BD.

En una consulta puede omitirse la cláusula WHERE, lo que indica que no hay condiciones sobre las tuplas a seleccionar (TODAS las tuplas son seleccionadas). Por ejemplo:

Consulta 4

Recuperar todos los números de RUT de los empleados.

Q4:    

SELECT

RUT

 

FROM

EMPLEADO


Si más de una relación es especificada en la cláusula FROM, y no existe cláusula WHERE, entonces el producto cruz (todas las posibles combinaciones de tuplas) de estas relaciones es seleccionado. Por ejemplo:

Consulta 5

Recuperar todas las combinaciones de números de RUT de los empleados y nombre de departamentos.

Q5:    

SELECT

RUT, DNOMBRE

 

FROM

EMPLEADO, DEPARTAMENTO


Es importante especificar cada condición de selección y cada condición de asociación en la cláusula WHERE. Si alguna de estas condiciones es omitida, relaciones incorrectas o muy grandes pueden dar como resultado.

Para recuperar todos los valores de los atributos de las tuplas seleccionadas, se puede usar un asterisco (no es necesario poner todos los nombres), el cual significa todos los atributos. Por ejemplo:

Consulta 6

Recuperar los valores de todos los atributos de EMPLEADO que trabajan en el departamento número "5".

Q6:    

SELECT

*

 

FROM

EMPLEADO

 

WHERE

NDEPTO = 5

Consulta 7

Recuperar los valores de todos los atributos de EMPLEADO y los atributos del DEPARTAMENTO en que el empleado trabaja, para cada empleado del departamento de "Investigación".

Q7:    

SELECT

*

 

FROM

EMPLEADO, DEPARTAMENTO

 

WHERE

DNOMBRE = "Investigación" AND NDEPTO = DNUMERO

Consulta 8

Recuperar el producto cruz de las relaciones EMPLEADO y DEPARTAMENTO.

Q8:    

SELECT

*

 

FROM

EMPLEADO, DEPARTAMENTO


En una consulta SQL pueden aparecer tuplas duplicadas. Si no queremos que esto suceda, se puede usar la palabra DISTINCT en la cláusula SELECT, en cuyo caso sólo tuplas distintas aparecen en la relación. Por ejemplo:

Consulta 9

Recuperar el salario de cada empleado.

Q9:    

SELECT

SUELDO

 

FROM

EMPLEADO


En la consulta anterior obtenemos una tabla con la lista de salarios de todos los empleados. Sin embargo, si dos o más empleados ganan lo mismo, el mismo valor aparece varias veces en la tabla. Si queremos que no se repitan los salarios, usamos DISTINCT:

Q9A:    

SELECT

DISTINCT SUELDO

 

FROM

EMPLEADO


En SQL existe una operación UNION que regresa la unión (como en conjuntos) de relaciones, es decir, regresa todas las tuplas que aparecen en alguna de las relaciones. Las tuplas duplicadas son eliminadas del resultado, a menos que se especifique la cláusula ALL después de la operación. Por ejemplo:

Consulta 10

Regresar una lista con todos los números de proyecto que involucran un empleado de apellido "Pérez", ya sea como trabajador o como gerente del departamento que controla ese proyecto.

Q10:    

( SELECT

PNUMERO

 

FROM

PROYECTO, DEPARTAMENTO, EMPLEADO

 

WHERE

DNUM = DNUMERO AND RUTGERENTE = RUT AND APPAT = "Pérez" )

 

UNION

 

    

( SELECT

PNO

 

FROM

TRABAJA_EN, EMPLEADO

 

WHERE

ERUT = RUT AND APPAT = "Pérez" )


El primer SELECT recupera los proyectos que involucran a "Pérez" como gerente del departamento que controla el proyecto, y el segundo SELECT regresa los proyectos que involucran a "Pérez" como trabajador en el proyecto. Note que si varios empleados tienen como primer apellido "Pérez", se recuperan los números de proyecto en que están involucrados todos ellos. Al aplicar la operación UNION a los dos SELECT, se obtiene el resultado deseado.