[anterior] [home] [siguiente]

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

donde:

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:    SELECTFNAC, DIRECCION
FROMEMPLEADO
WHERENPILA = "Juan" AND APPAT = "Pérez"

Esta consulta involucra solamente la relación EMPLEADO, señalada en la cláusula FROM. La consulta salecciona la tupla de 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:    SELECTNPILA, APPAT, DIRECCION
FROMEMPLEADO, DEPARTAMENTO
WHEREDNOMBRE = "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:    SELECTPNUMERO, DNUM, NPILA, APPAT, DIRECCION, FNAC
FROMPROYECTO, DEPARTAMENTO, EMPLEADO
WHEREDNUM = 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:    SELECTEMPLEADO.NOMBRE, APPAT, DIRECCION
FROMEMPLEADO, DEPARTAMENTO
WHEREDEPARTAMENTO.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:    SELECTE.NPILA, E.APPAT, S.NPILA, S.APPAT
FROMEMPLEADO E, EMPLEADO S
WHEREE.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:    SELECTRUT
FROMEMPLEADO

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:    SELECTRUT, DNOMBRE
FROMEMPLEADO, 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*
FROMEMPLEADO
WHERENDEPTO = 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*
FROMEMPLEADO, DEPARTAMENTO
WHEREDNOMBRE = "Investigación" AND NDEPTO = DNUMERO

Consulta 8

Recuperar el producto cruz de las relaciones EMPLEADO y DEPARTAMENTO.

Q8:    SELECT*
FROMEMPLEADO, 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:    SELECTSUELDO
FROMEMPLEADO

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:    SELECTDISTINCT SUELDO
FROMEMPLEADO

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:    ( SELECTPNUMERO
FROMPROYECTO, DEPARTAMENTO, EMPLEADO
WHEREDNUM = DNUMERO AND RUTGERENTE = RUT AND APPAT = "Pérez" )
UNION
    ( SELECTPNO
FROMTRABAJA_EN, EMPLEADO
WHEREERUT = 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.

[anterior] [home] [siguiente]