Sie sind auf Seite 1von 158

El Lenguaje SQL

Unidad 5 - Objetivos
Entender el propsito e importancia del Lenguaje de Consulta Estructurado SQL. Como recuperar datos de una base de datos usando la instruccin SELECT
Uso de condicin WHERE compuesta. Ordenando resultados usando ORDER BY.

Unidad 5 - Objetivos
Uso de funciones agregadas. Agrupando datos usando GROUP BY y HAVING. Uso de Subconsultas(subqueries.) Uniendo Tablas (Join tables together.) Realizando operaciones de conjunto (UNION, INTERSECT, EXCEPT).

Unidad 5 - Objetivos

Como realizar actualizaciones a la Base de datos usando INSERT, UPDATE y DELETE

Pearson Education Limited 1995, 2005

Objetivos de SQL
Idealmente un lenguaje de base de datos debera permitir a un usuario:
Crear la base de datos y las estructuras de relaciones Realizar tareas de administracin de datos bsicas, Realizar consultas simples y complejas Debe realizar estas tareas con mnimo esfuerzo del usuario Su estructura de comandos y sintaxis debe ser fcil de aprender Debe ser portable

Objetivos de SQL
SQL es un lenguaje orientado a transformacin con dos principales componentes:
Un DDL para definir la estructura de la base de datos y controlar el acceso a los datos; Un DML para recuperar y actualizar datos

Hasta 1999 SQL no contena comando para control de flujo, tales como IFTHENELSE, GO TO, o DO WHILE. Estos tenan que ser implementados usando lenguajes de programacin o Job Control Lenguaje, o interactivamente por las decisiones del usuario.

Objetivos de SQL

SQL es un lenguaje relativamente fcil de aprender:


Es un lenguaje no procedural: se especifica que informacin se requiere, mas que, como obtenerla, Es un lenguaje esencialmente de formato libre

Objetivos de SQL

Consiste de palabras en ingles tales como :


1) CREATE TABLE Empleado(
numEmpleado nombre salario VARCHAR(5), VARCHAR(15), DECIMAL(7,2));

2) INSERT INTO Empleado VALUES (SG16, Brown, 8300); 3) SELECT numEmpleado, nombre, salario FROM Empleado WHERE salario > 10000;

Objetivos de SQL

Puede ser usado por un rango de usuarios DBAs, administradores, desarrolladores de aplicaciones, y otros tipos de usuarios finales. Existe un estndar ISO para SQL, hacindolo el lenguaje estndar formal y de hecho para bases de datos relacionales

Historia de SQL

En 1974, D. Chamberlin (IBM San Jose Laboratory) defini un lenguaje llamado Structured English Query Language (SEQUEL). Una versin revisada, SEQUEL/2, fue definida en 1976 pero el nombre fue posteriormente cambiado a SQL por razones legales.

Historia de SQL

Aun pronunciado see-quel, a pesar que la pronunciacin oficial es S-Q-L. IBM posteriormente produjo un Prototipo de DBMS llamado System R, basado en SEQUEL/2. Las races de SQL, estn en SQUARE (Specifying Queries as Relational Expressions), el cual es anterior al proyecto System R.

Historia de SQL
Al final de los 70, apareca ORACLE y fue probablemente el primer RDBMS basado en SQL En 1987, ANSI e ISO publicaron un estndar inicial para SQL. En 1989, ISO public un anexo que defini las caractersticas de mejoras de integridad. En 1992, ocurri la primera revisin principal del estndar ISO, referido como SQL2 o SQL/92. En 1999, SQL:1999 fue liberado con soporte para administracin de datos orientado a objeto. Al final de 2003, fue liberado SQL:2003.

Importancia de SQL
SQL pasa a formar parte de la arquitectura de aplicaciones tales como IBMs Systems Application Architecture. Es una opcin estratgica de muchas organizaciones grandes e influyentes (Ej: X/OPEN). SQL es el estndar federal para el tratamiento de la informacin (FIPS) del cual se requiere la conformidad para todas las ventas de bases de datos al gobierno americano.

Importancia de SQL

El SQL se utiliza en otros estndares e incluso influencia el desarrollo de otros estndares como herramienta definicional. Los ejemplos incluyen:
ISOs Information Resource Directory System (IRDS) Standard Remote Data Access (RDA) Standard.

Escribiendo Comandos SQL


La instruccin SQL consiste de palabras reservadas y palabras definidas por el usuario.
Las palabras reservadas son una parte fija del lenguaje SQL y tiene un significado fijo. Ellas tienen que ser deletreadas exactamente como se requiere Las palabras definidas por el usuario son creadas por el usuario y representan los nombres de varios objetos de la base de datos tales como tablas, columnas, vistas, ndices, entre otros.

Escribiendo Comandos SQL


La mayora de los componentes de una instruccin SQL son insensible maysculas / minsculas, a excepcin de los datos de carcter literales. Son mas legibles con indentacin y alineacin:
Cada clusula debera comenzar en una nueva lnea. El comienzo de una clusula debe alinearse con el comienzo de otras clusulas. Si la clusula tiene varias partes, cada una debe aparecer en una lnea separada e indentada bajo comienzo de la clusula.

Escribiendo Comandos SQL

Uso de la notacin BNF extendida:


Las letras maysculas representan palabras reservadas. Las letras minsculas representan palabras definidas por el usuario. | indica una eleccin entre alternativas. {} Indican un elemento requerido. [] Indican un elemento opcional. Indica repeticin opcional (0 or mas).

Literales

Los literales son constantes usadas en sentencias SQL. Todos los literales no numricos deben estar encerrados en cremilla simple (ej. London).

Todos los literales numricos no deben estar encerrados en cremillas (ej. 650.00).

Instruccin SELECT
SELECT [DISTINCT | ALL] {* | [columnExpression [AS newName]] [,...] } FROM NombreTabla [alias] [, ...] [WHERE condicin] [GROUP BY listaColumna] [HAVING condicin] [ORDER BY listaColumna]

Instruccin SELECT
FROM Especifica la o las tabla(s) a ser usadas WHERE Filtra filas. GROUP BY Forma grupos de filas con el mismo valor de columna. HAVING Filtra grupos sujeto a la misma condicin. SELECT Especifica que columnas van a aparecer en la salida ORDER BY Especifica el orden de la salida.

Instruccin SELECT

El orden de las clusulas no puede ser cambiado.

Solamente SELECT y FROM son mandatario.

Pearson Education Limited 1995, 2005

Ejemplo 5.1 Todas las columnas, Todas las filas


Listar todos los detalles de Empleados.
SELECT numEmpleado, nombre, apellido, cargo, sexo, fechNac, salario, numOficina FROM Empleado;
Podemos usar * Como una abreviacin para todas las columnas: SELECT * FROM Empleado;

Ejemplo 5.1 Todas las columnas, Todas las filas


SELECT numEmpleado, nombre, apellido, cargo, sexo, fechNac, salario, numOficina FROM Empleado

numEmpleado SL21 SG37 SG14 SA9 SG5 SL41

nombre Jhon Peter David Mary Susan Julie

apellido White Denver Ford Lee Sarandon Roberts

cargo Gerente Asistente Supervisor Asistente Gerente Asistente

sexo fechNac M 01-Oct-45 M 10-Nov-60 M 09-Sep-58 F 17-Sep-59 F 21-Mar-60 F 13-Jun-63

salario 300000 120000 180000 90000 240000 90000

numOficina B005 B003 B003 B007 B003 B005

Ejemplo 5.2 Recuperar columnas especificas, todas las filas


Producir una lista de salarios para todos los empleados, mostrando solamente, numEmpleado, nombre, apellido y salario.
SELECT numEmpleado, nombre, apellido, salario FROM Empleado;

Ejemplo 5.2 Recuperar columnas especificas, todas las filas


SELECT numEmpleado, nombre, apellido, salario FROM Empleado;

numEmpleado SL21 SG37 SG14 SA9 SG5 SL41

nombre Jhon Peter David Mary Susan Julie

apellido White Denver Ford Lee Sarandon Roberts

salario 300000 120000 180000 90000 240000 90000

Ejemplo 5.3 Uso de DISTINCT


Listar el numero de propiedad de todas las propiedades que han sido visitadas SELECT numPropiedad
FROM Visita;

Ejemplo 5.3 Uso de DISTINCT


Uso de DISTINCT para eliminar duplicados: SELECT DISTINCT numPropiedad FROM Visita;

Ejemplo 5.3 Uso de DISTINCT


SELECT numPropiedad FROM Visita; SELECT DISTINCT numPropiedad FROM Visita;

Tabla 1-1 Tabla resultado con duplicados

Tabla 1-2 Tabla resultado eliminando duplicados

numPropiedad IA14 IG4 IG4 IA14 IG36

numPropiedad IA14 IG4 IG36

Ejemplo 5.4 Campos calculados


Listar el salario mensual para todos los empleados, mostrando el numero de empleado, nombre, apellido y el detalle del salario
SELECT numEmpleado, nombre, apellido, salario/12 FROM Empleado;
numEmpleado SL21 SG37 SG14 SA9 SG5 SL41 nombre Jhon Peter David Mary Susan Julie apellido White Denver Ford Lee Sarandon Roberts col4 25000 10000 15000 7500 20000 7500

Pearson Education Limited 1995, 2005

Ejemplo 5.4 Campos calculados


Para nombrar columnas, use la clausula AS:
SELECT numEmpleado, salarioMensual FROM Empleado; nombre, apellido, salario/12 AS

numEmpleado SL21 SG37 SG14 SA9 SG5 SL41

nombre Jhon Peter David Mary Susan Julie

apellido White Denver Ford Lee Sarandon Roberts

salarioMensual 25000 10000 15000 7500 20000 7500

Ejemplo 5.5 Comparacin en la Condicin de bsqueda


Listar todos los empleados salario mayor que 10.000. con un

SELECT numEmpleado, nombre, apellido, salario FROM empleado WHERE salario > 100000;

numEmpleado SL21 SG37 SG14 SG5

nombre Jhon Peter David Susan

apellido White Denver Ford Sarandon

salario 300000 120000 180000 240000

Ejemplo 5.6 Comparacin compuesta en la Condicin de bsqueda

Listar las direcciones de todas las oficinas en Castelln o Santiago.


SELECT * FROM Oficina WHERE ciudad = Castelln or ciudad = Santiago;
numOficina calle O5 Enmedio, 8 O7 O1 O4 Moyano, s/n Larga 2003 Trafalgar, 23 area Centro Centro Grao ciudad Castelln Castelln Santiago Castelln telefono fax 964 201 240 964 201 340 964 215 760 964 215 670 627 550 320 627 550 321 964 284 440 964 284 420

Ejemplo 5.7 Condicin Rango de Bsqueda


Listar todo el personal con un sueldo entre 200.000 y 300.000.
SELECT numEmpleado, nombre, apellido, cargo, salario FROM Empleado WHERE salario BETWEEN 200000 AND 300000;
numEmpleado SL21 SG5 nombre Jhon Susan apellido White Sarandon cargo Gerente Gerente salario 300000 240000

La condicin BETWEEN incluye los extremos del rango

Ejemplo 5.7 Condicin Rango de Bsqueda


Tambin una versin negada NOT BETWEEN. BETWEEN no agrega mucho poder expresivo a SQL. Tambin podramos escribir:
SELECT numEmpleado, nombre, apellido, cargo, salario FROM Empleado WHERE salario>=20000 AND salario <= 30000;

til aunque para un rango de valores.

Ejemplo 5.8 pertenencia de conjuntos (IN/NOT IN)


Listar todos los Gerentes y Supervisores
SELECT numEmpleado, nombre, apellido, cargo FROM Empleado WHERE cargo IN (Gerente, Supervisor)

numEmpleado SL21 SG14 SG5

nombre Jhon David Susan

apellido White Ford Sarandon

cargo Gerente Supervisor Gerente

Ejemplo 5.8 pertenencia conjuntos (IN/NOT IN)

de

Tambin hay una versin negada NOT IN. IN no agrega mucho poder expresivo a SQL. Tambin podramos escribir:
SELECT numEmpleado, nombre, apellido, cargo FROM Empleado WHERE cargo = Gerente OR cargo = Supervisor);

IN es ms eficiente cuando el conjunto tiene muchos valores

Ejemplo 5.9 Patrn de caracteres


Encontrar todos los clientes con el string Glasgow en su direccin
SELECT numCliente, nombre, apellido, direccion, telefono FROM Cliente WHERE direccion like %Glasgow%;

numCliente nombre apellido direccion CR74 Mike Ritchie 63 Well St, Glasgow, G42 CR62 Mary Tregear 12 Park PI, Glasgow, G4 0QR

telefono 0141-943-7420 0141-225-7421

Ejemplo 5.9 Patrn de caracteres


SQL tiene dos smbolos especiales para expresar modelos:
El caracter porcentaje % representa cualquier secuencia de cero o ms caracteres El caracter underscore _ representa cualquier carcter unitario.

LIKE %Glasgow% significa una

secuencia de caracteres de cualquier longitud conteniendo el string


Glasgow.

Ejemplo 5.10 Condicin de bsqueda NULL


La Tabla Visita contiene el detalle de todas las visitas a las propiedades.

numCliente numPropiedad Q56 IA14 Q76 Q56 Q62 Q56 IG4 IG4 IA14 IG36

Fecha Comentario 24-11-1999 muy pequeo 20-10-1999 muy lejos 26-11-1999 14-11-1999 no tiene saln 28-10-1999

Ejemplo 5.10 Condicin de bsqueda NULL


Listar el detalle de todas las visitas a la propiedad IG4 en la cual no hay comentarios.
Hay dos visitas a la propiedad IG4, una con comentario y otra sin comentario. tenemos que chequear por nulo explcitamente utilizando la palabra clave IS NULL:

SELECT * FROM Visita WHERE numPropiedad = IG4 AND comentario IS NULL

Ejemplo 5.10 Condicin de bsqueda NULL


numCliente numPropiedad Q56 IG4 Fecha Comentario 26-11-1999

La versin negada (IS NOT NULL) puede verificar por valores no-null.

Ejemplo 5.11 Ordenando por una columna

Listar los sueldos para todo el personal, dispuestos en orden descendente del sueldo.
SELECT numEmpleado, nombre, apellido, salario FROM Empleado ORDER BY salario DESC;

Ejemplo 5.11 Ordenando por una columna


SELECT numEmpleado, nombre, apellido, salario FROM Empleado ORDER BY salario DESC;

numEmpleado SL21 SG5 SG14 SG37 SA9 SL41

nombre Jhon Susan David Peter Mary Julie

apellido White Sarandon Ford Denver Lee Roberts

salario 300000 240000 180000 120000 90000 90000

Ejemplo 5.12 Ordenamiento por mltiples columnas

La tabla Propiedad

numPropiedad PA14 PL94 PG4 PG36 PG21 PG16

calle 16 Holhead 6 Argvill St. 6 Lawrence St 2 Manor Rd 10 Dale Rd 5 Novar Dr

ciudad Aberdeem London Glasgow Glasgow Glasgow Glasgow

codigoPostal AB7 5SU NW2 G11 9QX G114QX G12 G12 9AX

tipo hab renta numPropietario Casa 6 650 C046 Departamento 4 400 C087 Departamento 3 350 C040 Departamento 3 375 C093 Casa 5 600 C087 Departamento 4 450 C093

Ejemplo 5.12 Ordenamiento mltiples columnas

por

Produzca una lista abreviada de propiedades en orden por tipo de propiedad.


SELECT numPropiedad, tipo, hab, renta FROM Propiedad ORDER BY tipo;

Ejemplo 5.12 Ordenamiento por mltiples columnas


SELECT numPropiedad, tipo, hab, renta FROM Propiedad ORDER BY tipo;

Tabla resultado para el ejemplo 5.12, con una clave de ordenamiento


numPropiedad PA14 PG21 PL94 PG4 PG36 PG16 tipo hab renta Casa 6 650 Casa 5 600 Departamento 4 400 Departamento 3 350 Departamento 3 375 Departamento 4 450

Ejemplo 5.12 Ordenamiento por mltiples columnas


Cuatro departamentos en esta lista no hay una clave de ordenamiento menor especificada, el sistema arregla estas filas en cualquier orden. Para ordenar por renta, especifique el orden menor
SELECT numPropiedad, tipo, hab, renta FROM Propiedad ORDER BY tipo, renta DESC;

Ejemplo 5.12 Ordenamiento por mltiples columnas


SELECT numPropiedad, tipo, hab, renta FROM Propiedad ORDER BY tipo, renta DESC;

Tabla resultado para el ejemplo 5.12, con dos claves de ordenamiento


numPropiedad PA14 PG21 PG16 PL94 PG36 PG4 tipo hab renta Casa 6 650 Casa 5 600 Departamento 4 450 Departamento 4 400 Departamento 3 375 Departamento 3 350

Instruccin SELECT - Agregadas


El estndar ISO define cinco funciones agregadas:
Funcin
AVG COUNT SUM MAX MIN

Descripcin
Calcula el promedio de los valores de un campo determinado Devuelve el nmero de registros de la seleccionados Devuelve la suma de todos los valores de un campo determinado Devuelve el valor ms alto de un campo especificado Devuelve el valor ms bajo de un campo especificado

Instruccin SELECT - Agregadas


Cada uno funciona sobre un sola columna de una tabla y devuelve un solo valor. COUNT, MIN, y MAX se aplican a los campos numricos y no numricos, pero SUM y AVG se pueden utilizar en campos numricos solamente. Aparte de COUNT(*), cada funcin elimina los nulos primero y opera solamente en valores no nulos restantes.

Instruccin SELECT - Agregadas


COUNT(*) cuenta todas las filas de una tabla, sin importar si ocurren valores nulos o duplicados.
Puede utilizar DISTINCT antes del nombre de la columna para eliminar los duplicados.

DISTINCT no tiene efecto con MIN/MAX, pero puede tener con SUM/AVG.

Instruccin SELECT - Agregadas


Las funciones agregadas se pueden utilizar solamente en lista SELECT y en la clusula HAVING.
Si la lista SELECT incluye una funcin agregada y no hay una clusula GROUP BY, la lista SELECT no puede referirse a una columna hacia fuera con una funcin agregada. Por ejemplo, lo que sigue es ilegal: SELECT staffNo, COUNT(salary) FROM Staff;

Ejemplo 5.13 Uso de COUNT(*)


Cuntas propiedades cuestan ms de 350 por mes de alquiler?
SELECT COUNT(*) AS myCount FROM Propiedad WHERE renta > 350;

Ejemplo 5.14 Uso de COUNT(DISTINCT)


Tabla Visita
numCliente numPropiedad Q56 IA14 Q76 Q56 Q62 Q56 IG4 IG4 IA14 IG36 Fecha Comentario 24-11-1999 muy pequeo 20-11-1999 muy lejos 26-11-1999 14-11-1999 no tiene saln 28-10-1999

Cuntas diferentes propiedades se visitaron en noviembre de 1999?

Ejemplo 5.14 Uso de COUNT(DISTINCT)


SELECT COUNT(DISTINCT numPropiedad) AS myCount FROM Visita WHERE fecha BETWEEN 1-Nov-1999 AND 31-Nov-1999;

myCount 2

Ejemplo 5.15 Uso de COUNT y SUM


Tabla Empleado
numEmpleado SL21 SG37 SG14 SA9 SG5 SL41 nombre Jhon Peter David Mary Susan Julie apellido White Denver Ford Lee Sarandon Roberts cargo Gerente Asistente Supervisor Asistente Gerente Asistente sexo fechNac M 01-Oct-45 M 10-Nov-60 M 09-Sep-58 F 17-Sep-59 F 21-Mar-60 F 13-Jun-63 salario 300000 120000 180000 90000 240000 90000 numOficina B005 B003 B003 B007 B003 B005

Encuentre la cantidad de gerentes y el total de sus salarios

Ejemplo 5.15 Uso de COUNT y SUM

Encuentre la cantidad de gerentes y el total de sus salarios


SELECT COUNT(numEmpleado) AS myCount, SUM(salario) AS mySum FROM Empleado WHERE cargo = Gerente;

myCount

mySum 2 540000

Pearson Education Limited 1995, 2005

Ejemplo 5.16 Uso de MIN, MAX y AVG Tabla Empleado


numEmpleado SL21 SG37 SG14 SA9 SG5 SL41 nombre Jhon Peter David Mary Susan Julie apellido White Denver Ford Lee Sarandon Roberts cargo Gerente Asistente Supervisor Asistente Gerente Asistente sexo fechNac M 01-Oct-45 M 10-Nov-60 M 09-Sep-58 F 17-Sep-59 F 21-Mar-60 F 13-Jun-63 salario 300000 120000 180000 90000 240000 90000 numOficina B005 B003 B003 B007 B003 B005

Determinar el sueldo mnimo, mximo y el promedio de los empleados.

Ejemplo 5.16 Uso de MIN, MAX y AVG Determinar el sueldo mnimo, mximo y el promedio de los empleados. SELECT MIN(salary) AS myMin, MAX(salary) AS myMax, AVG(salary) AS myAvg FROM Staff;
myMin myMax myProm 90000 300000 170000

Instruccin SELECT - Agregacin


Use la clusula GROUP BY para obtener sub-totales. El SELECT y GROUP BY son fuertemente integrados: cada item en la lista SELECT debe tener un solo valor por grupo, y la clusula SELECT puede contener solamente:
Nombre de columnas Funciones agregadas constantes Expresiones involucrando combinaciones de las anteriores.

Instruccin SELECT - Agregacin


Todos los nombres de las columnas en la lista SELECT deben aparecer en la clusula GROUP BY a menos que el nombre se utilice solamente en una funcin agregada. Si WHERE se utiliza con el GROUP BY, WHERE se aplica primero, despus los grupos se forman de las filas restantes que satisfacen el predicado. La ISO considera dos Null como iguales para los propsitos del GROUP BY.

Ejemplo 5.17 Uso de GROUP BY


Tabla Empleado
numEmpleado SL21 SG37 SG14 SA9 SG5 SL41 nombre Jhon Peter David Mary Susan Julie apellido White Denver Ford Lee Sarandon Roberts cargo Gerente Asistente Supervisor Asistente Gerente Asistente sexo fechNac M 01-Oct-45 M 10-Nov-60 M 09-Sep-58 F 17-Sep-59 F 21-Mar-60 F 13-Jun-63 salario 300000 120000 180000 90000 240000 90000 numOficina B005 B003 B003 B007 B003 B005

Encuentre el nmero de empleados en cada oficina y el total de sus sueldos

Ejemplo 5.17 Uso de GROUP BY


SELECT numOficina, COUNT(numEmpleado) AS myCount, SUM(salario) AS mySum FROM Empleado GROUP BY numOficina ORDER BY numOficina;
numOficina myCount mySum B003 3 540000 B005 2 390000 B007 1 90000

Restringiendo los grupos Clausula HAVING


La clusula HAVING es diseada para ser utilizada con la clusula GROUP BY para restringir los grupos que aparecen en la tabla final. HAVING es similar a WHERE, pero WHERE filtra filas individuales mientras que HAVING filtra grupos.

Los nombres de la columna en la clusula HAVING deben tambin aparecer en la lista GROUP BY o estar contenido dentro de una funcin agregada.

Example 5.18 Use of HAVING


Tabla Empleado
numEmpleado SL21 SG37 SG14 SA9 SG5 SL41 nombre Jhon Peter David Mary Susan Julie apellido White Denver Ford Lee Sarandon Roberts cargo Gerente Asistente Supervisor Asistente Gerente Asistente sexo fechNac M 01-Oct-45 M 10-Nov-60 M 09-Sep-58 F 17-Sep-59 F 21-Mar-60 F 13-Jun-63 salario 300000 120000 180000 90000 240000 90000 numOficina B005 B003 B003 B007 B003 B005

Para cada oficina con ms de 1 empleado, encuentre el nmero de empleados en cada oficina y la suma de sus sueldos.

Ejemplo 5.18 Uso de HAVING


SELECT branchNo,
COUNT(staffNo) AS myCount, SUM(salary) AS mySum FROM Staff

GROUP BY branchNo
HAVING COUNT(staffNo) > 1 ORDER BY branchNo;

numOficina myCount mySum B003 3 540000 B005 2 390000

Subconsultas
Algunas instrucciones SQL pueden tener un SELECT incrustado dentro de l. Un subselect puede ser usado en una clusula WHERE y HAVING de un SELECT externo, donde se llama una subquery o consulta anidada. Los Subselects pueden tambin aparecer en las instrucciones INSERT, UPDATE, y DELETE.

Ejemplo 5.19 Usando una subconsulta con Igualdad


Tabla Oficina
numOficina B005 B007 B003 B004 B002 calle 16 Holhead 6 Argvill St. 163 Main Street 2 Manor Rd 10 Dale Rd ciudad Aberdeem London Glasgow Glasgow Bristol codigoPostal AB7 5SU NW2 G11 9QX G114QX G12

Tabla Empleado
cargo Gerente Asistente Supervisor Asistente Gerente Asistente sexo fechNac M 01-Oct-45 M 10-Nov-60 M 09-Sep-58 F 17-Sep-59 F 21-Mar-60 F 13-Jun-63 salario 300000 120000 180000 90000 240000 90000 numOficina B005 B003 B003 B007 B003 B005

numEmpleado SL21 SG37 SG14 SA9 SG5 SL41

nombre Jhon Peter David Mary Susan Julie

apellido White Denver Ford Lee Sarandon Roberts

Listar los empleados que trabajan en la oficina ubicada en 163 Main Street

Ejemplo 5.19 Usando una subconsulta con Igualdad


Listar los empleados que trabajan en la oficina ubicada en 163 Main Street
SELECT numEmpleado, nombre, apellido, cargo FROM Empleado WHERE numOficina = (SELECT numOficina FROM Oficina WHERE calle = 163 Main St);

Ejemplo 5.19 Usando una subconsulta con Igualdad


El SELECT interno determina el numero de oficina para la oficina que se encuentra en 163 Main St (B003). El SELECT externo recupera el detalle de todos los empleados que trabajan en esa oficina. El SELECT externo entonces se convierte en:
SELECT numEmpleado, nombre, apellido, cargo FROM Empleado WHERE numOficina = B003;

Ejemplo 5.19 Usando una subconsulta con Igualdad


Tabla Oficina
numOficina B005 B007 B003 B004 B002 calle 16 Holhead 6 Argvill St. 163 Main Street 2 Manor Rd 10 Dale Rd ciudad Aberdeem London Glasgow Glasgow Bristol codigoPostal AB7 5SU NW2 G11 9QX G114QX G12
numEmpleado SL21 SG37 SG14 SA9 SG5 SL41 nombre Jhon Peter David Mary Susan Julie

Tabla Empleado
apellido White Denver Ford Lee Sarandon Roberts cargo Gerente Asistente Supervisor Asistente Gerente Asistente sexo fechNac M 01-Oct-45 M 10-Nov-60 M 09-Sep-58 F 17-Sep-59 F 21-Mar-60 F 13-Jun-63 salario 300000 120000 180000 90000 240000 90000 numOficina B005 B003 B003 B007 B003 B005

Listar los empleados que trabajan en la oficina ubicada en 163 Main Street
numEmpleado SG37 SG14 SG5 nombre Peter David Susan apellido Denver Ford Sarandon cargo Asistente Supervisor Gerente

Ejemplo 5.20 subconsulta con una funcin agregada.


Tabla Empleado
numEmpleado SL21 SG37 SG14 SA9 SG5 SL41 nombre Jhon Peter David Mary Susan Julie apellido White Denver Ford Lee Sarandon Roberts cargo Gerente Asistente Supervisor Asistente Gerente Asistente sexo fechNac M 01-Oct-45 M 10-Nov-60 M 09-Sep-58 F 17-Sep-59 F 21-Mar-60 F 13-Jun-63 salario 300000 120000 180000 90000 240000 90000 numOficina B005 B003 B003 B007 B003 B005

Listar a todos los empleados cuyo sueldo sea mayor que el sueldo promedio, e indique por cunto.

Ejemplo 5.20 subconsulta con una funcin agregada.


SELECT numEmpleado, nombre, apellido, cargo,
salario - (SELECT AVG(salario) FROM Empleado) AS Diferencia

FROM Empleado WHERE salario > (SELECT AVG(salario) FROM Empleado);

Ejemplo 5.20 subconsulta con una funcin agregada.


No puede escribir WHERE salario > AVG(salario) En lugar, utilice un subquery para encontrar el sueldo promedio (170000), y despus utilice un SELECT externo para encontrar sos empleados con sueldo mayores que este:
SELECT numEmpleado, nombre, apellido, cargo,
salario - 170000 AS Diferencia

FROM Empleado WHERE salario > 170000);

Ejemplo 5.20 subconsulta con una funcin agregada.


Tabla Empleado
numEmpleado SL21 SG37 SG14 SA9 SG5 SL41 nombre Jhon Peter David Mary Susan Julie apellido White Denver Ford Lee Sarandon Roberts cargo Gerente Asistente Supervisor Asistente Gerente Asistente sexo fechNac M 01-Oct-45 M 10-Nov-60 M 09-Sep-58 F 17-Sep-59 F 21-Mar-60 F 13-Jun-63 salario 300000 120000 180000 90000 240000 90000 numOficina B005 B003 B003 B007 B003 B005

SELECT numEmpleado, nombre, apellido, cargo, salario - (SELECT AVG(salario)


FROM Empleado) AS Diferencia

FROM Empleado WHERE salario > (SELECT AVG(salario) FROM Empleado);

numEmpleado SG14 SG5 SL21

nombre David Susan John

apellido Ford Sarandon White

cargo Diferencia Supervisor 10000 Gerente 70000 Gerente 130000

Reglas de Subconsulta
La clusula ORDER BY no se puede utilizar en una subconsulta (aunque puede ser utilizada en un SELECT exterior).

La lista SELECT de una subconsulta debe consistir en un solo nombre o expresin de columna, a excepcin de las subconsultas que usan EXIST Por defecto, los nombres de la columna refieren a nombre de la tabla adentro de la clusula del subquery. Puede referir a una tabla en el FROM usando un alias.

Subquery Rules

Cuando una subconsulta es uno de los dos operandos en una comparacin, la subconsulta debe aparecer al lado derecho de la comparacin . Un subconsulta no se puede utilizar como operando en una expresin.

Ejemplo 5.21 Subconsultas anidadas: Uso de IN


Tabla Oficina
numOficina B005 B007 B003 B004 B002 calle 16 Holhead 6 Argvill St. 163 Main Street 2 Manor Rd 10 Dale Rd ciudad Aberdeem London Glasgow Glasgow Bristol codigoPostal AB7 5SU NW2 G11 9QX G114QX G12
numEmpleado SL21 SG37 SG14 SA9 SG5 SL41 nombre Jhon Peter David Mary Susan Julie

Tabla Empleado
apellido White Denver Ford Lee Sarandon Roberts cargo Gerente Asistente Supervisor Asistente Gerente Asistente sexo fechNac M 01-Oct-45 M 10-Nov-60 M 09-Sep-58 F 17-Sep-59 F 21-Mar-60 F 13-Jun-63 salario 300000 120000 180000 90000 240000 90000 numOficina B005 B003 B003 B007 B003 B005

Listar las propiedades que son manejadas por los empleados que trabajan en la sucursal de la calle 163 Main Street.
numPropiedad PA14 PL94 PG4 PG36 PG21 PG16 calle 16 Holhead 6 Argvill St. 6 Lawrence St 2 Manor Rd 10 Dale Rd 5 Novar Dr ciudad Aberdeem London Glasgow Glasgow Glasgow Glasgow

Tabla Propiedad
codigoPostal AB7 5SU NW2 G11 9QX G114QX G12 G12 9AX tipo hab renta numPropietario Casa 6 650 C046 Departamento 4 400 C087 Departamento 3 350 C040 Departamento 3 375 C093 Casa 5 600 C087 Departamento 4 450 C093 numEmpleado SL21 SL21 SA9 SA9 SG5 SL21

Ejemplo 5.21 Subconsultas anidadas: Uso de IN


Listar las propiedades que son manejadas por los empleados que trabajan en la sucursal de la calle 163 Main Street.
SELECT numPropiedad, calle, ciudad, codigoPostal, tipo, hab, renta FROM Propiedad WHERE numEmpleado IN

(SELECT numEmpleado FROM Empleado WHERE numOficina = (SELECT numOficina FROM Oficina WHERE calle = 163 Main St));

numPropiedad PG21

calle 10 Dale Rd

ciudad Glasgow

codigoPostal tipo G12 Casa

hab renta 5 600

ANY y ALL
ANY y ALL pueden ser usadas con subconsultas que producen una sola columna de nmeros Si usa ALL, la condicin ser verdadera si es satisfecha por todos los valores producidos en la subconsulta Si usa ANY, la condicin ser verdadera si es satisfecha por uno o ms valores producidos por la subconsulta . Si la subconsulta es vacia, ALL retorna verdadero y ANY retorna falso SOME mude ser usado en lugar de ANY.

Ejemplo 5.22 Uso de ANY / SOME


Tabla Empleado
numEmpleado SL21 SG37 SG14 SA9 SG5 SL41 nombre Jhon Peter David Mary Susan Julie apellido White Denver Ford Lee Sarandon Roberts cargo Gerente Asistente Supervisor Asistente Gerente Asistente sexo fechNac M 01-Oct-45 M 10-Nov-60 M 09-Sep-58 F 17-Sep-59 F 21-Mar-60 F 13-Jun-63 salario 300000 120000 180000 90000 240000 90000 numOficina B005 B003 B003 B007 B003 B005

Listar todos los empleados cuyo salario es mayor que el salario de al menos un empleado de la sucursal B003.

Ejemplo 5.22 Uso de ANY / SOME


Listar todos los empleados cuyo salario es mayor que el salario de al menos un empleado de la sucursal B003.
SELECT numEmpleado, nombre, apellido, cargo, salario FROM Empleado WHERE salario > SOME (SELECT salario
FROM Empleado WHERE numOIficina = B003);

Ejemplo 5.22 Uso de ANY / SOME


La consulta interna produce el conjunto {120000, 180000, 240000} y la consulta externa selecciona aquellos empleados cuyos sueldos son mayores que cualesquiera de los valores en este conjunto.
Tabla resultado del ejemplo 5.22
numEmpleado SL21 SG14 SG5 nombre Jhon David Susan apellido White Ford Sarandon cargo salario Gerente 300000 Supervisor 180000 Gerente 240000

Ejemplo 5.23 Uso de ALL


Tabla Empleado
numEmpleado SL21 SG37 SG14 SA9 SG5 SL41 nombre Jhon Peter David Mary Susan Julie apellido White Denver Ford Lee Sarandon Roberts cargo Gerente Asistente Supervisor Asistente Gerente Asistente sexo fechNac M 01-Oct-45 M 10-Nov-60 M 09-Sep-58 F 17-Sep-59 F 21-Mar-60 F 13-Jun-63 salario 300000 120000 180000 90000 240000 90000 numOficina B005 B003 B003 B007 B003 B005

Listar todos los empleados cuyo salario es mayor que el salario de todos los empleados de la sucursal B003.

Ejemplo 5.23 Uso de ALL


Listar todos los empleados cuyo salario es mayor que el salario de todos los empleados de la sucursal B003.
SELECT numEmpleado, nombre, apellido, cargo, salario FROM Empleado WHERE salario > SOME (SELECT salario FROM Empleado WHERE numOIficina = B003);

Tabla resultado del ejemplo 5.23


numEmpleado SL21 nombre apellido Jhon White cargo Gerente salario 300000

Consultas multi-tablas
Puede utilizar subqueries que proporcione columnas de resultado que vienen de la misma tabla.

Si las columnas de resultado vienen de ms de una tabla debe utilizar un join.


Para realizar el join, incluya ms de una tabla en la clusula FROM. Utilice la coma como separador e incluya tpicamente la clusula WHERE para especificar la(s) columna(s) del join.

Consultas multi-tablas
Tambin es posible utilizar un alias para una tabla nombrada en la clusula FROM. El Alias es separado del nombre de la tabla con un espacio. El alias se puede utilizar para calificar nombres de la columna cuando hay ambigedad.

Ejemplo 5.24 Join simple


Tabla Cliente
numCliente CR76 CR56 CR74 CR62 nombre Jhon Aline Mike Mary apellido Kay Stewart Ritchie Tregear direccion 56 High ST, Londonn SW1 4EH 64 Fern Dr,. Glasgow, G42 OBL 63 Well St, Glasgow, G42 12 Park PI, Glasgow, G4 0QR telefono 0207-774-5632 0141-324-1825 0141-943-7420 0141-225-7421 tipoPref maxRent Departamento 425 Departamento 350 Casa 750 Departamento 600

Tabla Visita
numCliente numPropiedad CR56 PA14 CR76 CR56 CR62 CR56 PG4 PG4 PA14 PG36 Fecha Comentario 24-11-1999 muy pequeo 20-10-1999 muy lejos 26-11-1999 14-11-1999 no tiene saln 28-10-1999

Listar los nombres de todos los clientes que han visitado una propiedad y los comentarios efectuados al visitarla.

Ejemplo 5.24 Join simple


Listar los nombres de todos los clientes que han visitado una propiedad y los comentarios efectuados al visitarla.

SELECT c.numCliente, nombre, apellido, numPropiedad, comentario FROM Cliente c, Visita v WHERE c. numCliente = v. numCliente;

Ejemplo 5.24 Join simple


Solamente las filas de ambas tablas que tengan valores idnticos en las columnas numCliente (c.numCliente = v.numCliente) se incluyen en el resultado.
Tabla resultado ejemplo 5.24
numCliente CR56 CR56 CR56 CR62 CR76 nombre Aline Aline Aline Mary Jhon apellido Stewart Stewart Stewart Tregear Kay numPropiedad PA14 PG4 PG36 PA14 PG4 Comentario muy pequeo

no tiene saln muy lejos

Es equivalente a equi-join en Algebra Relacional.

Construcciones alternativas de JOIN


SQL provee maneras alternativas para especificar JOIN:
FROM Cliente c JOIN Visita v ON c.numCliente = v.numCliente FROM Cliente JOIN Visita USING numCliente FROM Cliente NATURAL JOIN Visita

En cada caso, FROM reemplaza el FROM y WHERE original. Sin embargo, el primero produce una tabla con dos columnas idnticas de numCliente.

Ejemplo 5.25 Ordenando un join


Tabla Empleado
numEmpleado SL21 SG37 SG14 SA9 SG5 SL41 nombre Jhon Peter David Mary Susan Julie apellido White Denver Ford Lee Sarandon Roberts cargo Gerente Asistente Supervisor Asistente Gerente Asistente sexo fechNac M 01-Oct-45 M 10-Nov-60 M 09-Sep-58 F 17-Sep-59 F 21-Mar-60 F 13-Jun-63 salario 300000 120000 180000 90000 240000 90000 numOficina B005 B003 B003 B007 B003 B005

Tabla Propiedad
numPropiedad PA14 PL94 PG4 PG36 PG21 PG16 calle 16 Holhead 6 Argvill St. 6 Lawrence St 2 Manor Rd 10 Dale Rd 5 Novar Dr ciudad Aberdeem London Glasgow Glasgow Glasgow Glasgow codigoPostal AB7 5SU NW2 G11 9QX G114QX G12 G12 9AX tipo hab renta numPropietario Casa 6 650 C046 Departamento 4 400 C087 Departamento 3 350 C040 Departamento 3 375 C093 Casa 5 600 C087 Departamento 4 450 C093 numEmpleado SL21 SL21 SA9 SA9 SG5 SL21

Para cada oficina, listar los nmeros y nombres de los empleados que administran propiedades y las propiedades que ellos administran.

Ejemplo 5.25 Ordenando un join


Para cada oficina, listar los nmeros y nombres de los empleados que administran propiedades y las propiedades que ellos administran.

SELECT e.numOficina, e.numEmpleado, nombre, apellido, numPropiedad FROM Empleado e, Propiedad p WHERE e.numEmpleado = p.numEmpleado ORDER BY e.numOficina, e.numEmpleado, numPropiedad;

Tabla resultado ejercicio 5.25


numOficina B003 B005 B005 B005 B007 B007 numEmpleado SG5 SL21 SL21 SL21 SA9 SA9 nombre Susan Jhon Jhon Jhon Mary Mary apellido Sarandon White White White Lee Lee numPropiedad PG21 PA14 PG16 PL94 PG36 PG4

Ejemplo 5.26 Un join de tres tablas


Tabla Empleado
numEmpleado SL21 SG37 SG14 SA9 SG5 SL41 nombre Jhon Peter David Mary Susan Julie apellido White Denver Ford Lee Sarandon Roberts cargo Gerente Asistente Supervisor Asistente Gerente Asistente sexo fechNac M 01-Oct-45 M 10-Nov-60 M 09-Sep-58 F 17-Sep-59 F 21-Mar-60 F 13-Jun-63 salario 300000 120000 180000 90000 240000 90000 numOficina B005 B003 B003 B007 B003 B005

Tabla Propiedad
numPropiedad PA14 PL94 PG4 PG36 PG21 PG16 calle 16 Holhead 6 Argvill St. 6 Lawrence St 2 Manor Rd 10 Dale Rd 5 Novar Dr ciudad Aberdeem London Glasgow Glasgow Glasgow Glasgow codigoPostal AB7 5SU NW2 G11 9QX G114QX G12 G12 9AX tipo hab renta numPropietario Casa 6 650 C046 Departamento 4 400 C087 Departamento 3 350 C040 Departamento 3 375 C093 Casa 5 600 C087 Departamento 4 450 C093 numEmpleado SL21 SL21 SA9 SA9 SG5 SL21

Tabla Oficina
Para cada oficina, Listar los nmeros y nombres de los empleados que administran propiedades, incluyendo la ciudad en la cual la oficina est ubicada y las propiedades que ellos administran.
numOficina B005 B007 B003 B004 B002 calle 16 Holhead 6 Argvill St. 163 Main Street 2 Manor Rd 10 Dale Rd ciudad Aberdeem London Glasgow Glasgow Bristol codigoPostal AB7 5SU NW2 G11 9QX G114QX G12

Ejemplo 5.26 Un join de tres tablas


Tabla resultado ejercicio 5.25
numOficina B003 B005 B005 B005 B007 B007 numEmpleado SG5 SL21 SL21 SL21 SA9 SA9 nombre Susan Jhon Jhon Jhon Mary Mary apellido Sarandon White White White Lee Lee numPropiedad PG21 PA14 PG16 PL94 PG36 PG4

Tabla Oficina
numOficina B005 B007 B003 B004 B002 calle 16 Holhead 6 Argvill St. 163 Main Street 2 Manor Rd 10 Dale Rd ciudad Aberdeem London Glasgow Glasgow Bristol codigoPostal AB7 5SU NW2 G11 9QX G114QX G12

Para cada oficina, Listar los nmeros y nombres de los empleados que administran propiedades, incluyendo la ciudad en la cual la oficina est ubicada y las propiedades que ellos administran.

Ejemplo 5.26 Un join de tres tablas


Para cada oficina, Listar los nmeros y nombres de los empleados que administran propiedades, incluyendo la ciudad en la cual la oficina est ubicada y las propiedades que ellos administran.
SELECT e.numOficina, e.numEmpleado, nombre, apellido, numPropiedad FROM Empleado e, Propiedad p, Oficina o WHERE e.numEmpleado = p.numEmpleado AND o.numOficina = e.numOficina ORDER BY e.numOficina, e.numEmpleado, numPropiedad;

Ejemplo 5.26 Un join de tres tablas


Tabla resultado ejercicio 5.26
numOficina B003 B005 B005 B005 B007 B007 ciudad Glasgow Aberdeem Aberdeem Aberdeem London London numEmpleado SG5 SL21 SL21 SL21 SA9 SA9 nombre Susan Jhon Jhon Jhon Mary Mary apellido Sarandon White White White Lee Lee numPropiedad PG21 PA14 PG16 PL94 PG36 PG4

Formulacin alternativa para FROM y WHERE:


FROM (Oficina o JOIN Empleado e USING numOficina) AS oe JOIN Propiedad p USING numEmpleado

Ejemplo 5.27 Agrupando por mltiples columnas


Tabla Empleado
numEmpleado SL21 SG37 SG14 SA9 SG5 SL41 nombre Jhon Peter David Mary Susan Julie apellido White Denver Ford Lee Sarandon Roberts cargo Gerente Asistente Supervisor Asistente Gerente Asistente sexo fechNac M 01-Oct-45 M 10-Nov-60 M 09-Sep-58 F 17-Sep-59 F 21-Mar-60 F 13-Jun-63 salario 300000 120000 180000 90000 240000 90000 numOficina B005 B003 B003 B007 B003 B005

Tabla Propiedad
numPropiedad PA14 PL94 PG4 PG36 PG21 PG16 calle 16 Holhead 6 Argvill St. 6 Lawrence St 2 Manor Rd 10 Dale Rd 5 Novar Dr ciudad Aberdeem London Glasgow Glasgow Glasgow Glasgow codigoPostal AB7 5SU NW2 G11 9QX G114QX G12 G12 9AX tipo hab Casa Departamento Departamento Departamento Casa Departamento 6 4 3 3 5 4 renta 650 400 350 375 600 450 numPropietario C046 C087 C040 C093 C087 C093 numEmpleado SL21 SL21 SA9 SA9 SG5 SL41

Encuentre el total de propiedades manejadas por cada empleado.

Ejemplo 5.27 Agrupando por mltiples columnas


Encuentre el total de propiedades manejadas por cada empleado.
SELECT e.numOficina, s.numEmpleado, COUNT(*) AS myCount FROM Empleado e, Propiedad p WHERE e.numEmpleado = p.numEmpleado GROUP BY e.numOficina, e.numEmpleado ORDER BY e.numOficina, e.numEmpleado;

Ejemplo 5.27 Agrupando por mltiples columnas


SELECT e.numOficina, s.numEmpleado, COUNT(*) AS myCount FROM Empleado e, Propiedad p WHERE e.numEmpleado = p.numEmpleado GROUP BY e.numOficina, e.numEmpleado ORDER BY e.numOficina, e.numEmpleado;

Tabla Resultado del ejemplo 5.27


numOficina B003 B005 B005 B007 numEmpleado SG5 SL21 SL41 SA9 myCount 1 2 1 2

Calculando un Join
El procedimiento para generar resultados de un join es:
1. Forme el producto cartesiano de las tablas nombradas en la clusula FROM. 2. Si hay una clusula WHERE, aplique la condicin de bsqueda a cada fila de la tabla del producto, conservando esas filas que satisfagan la condicin

3. Para cada fila restante, determine el valor de cada item en lista SELECT para producir una sola fila en la tabla resultado.

Calculando un Join
4. Si se ha especificado DISTINCT, eliminar cualquier
fila duplicada de la tabla resultado. 5. Si hay una clusula ORDER BY, se requiere ordenar la tabla resultado.

SQL provee una forma especial de SELECT para el producto Cartesiano:


SELECT [DISTINCT | ALL] {* | columnList} FROM Tabla1 CROSS JOIN Tabla2

Outer Joins
Si una fila de una de las tablas a unir no coincide, la fila es omitida de la tabla resultante. El outer join retiene las filas que no satisfacen la condicin. Considere las siguientes tablas:
Tabla Oficina1 Tabla Propiedad1

numOficina B003 B004 B002

ciudad Glasgow Bristol London

numPropiedad PA14 PL94 PG4

ciudad Aberdeem London Glasgow

Outer Joins
El (inner) join de estas dos tablas:

SELECT o.*, p.* FROM Oficina1 o, Propiedad1 p WHERE o.ciudad = p.ciudad;


Tabla resultado del inner join tabla Oficina1 con tabla Propiedad1

numOficina ciudad numPropiedad ciudad B003 Glasgow PG4 Glasgow B002 London PL94 London

Outer Joins
Tabla resultado del inner join tabla Oficina1 con tabla Propiedad1

numOficina ciudad numPropiedad B003 Glasgow PG4 B002 London PL94

ciudad Glasgow London

La tabla resultado tiene dos filas donde son iguales las ciudades.
No hay filas que corresponden a las oficinas en Bristol y Aberdeen. Para incluir filas incomparables en la tabla resultado, utilice un join externo (Outer Join).

Ejemplo 5.28 Left Outer join


Tabla Oficina1 Tabla Propiedad1

numOficina B003 B004 B002

ciudad Glasgow Bristol London

numPropiedad PA14 PL94 PG4

ciudad Aberdeem London Glasgow

Liste las oficinas y las Propiedades que estn en la misma ciudad junto con cualquier oficina incomparable.
SELECT o.*, p.* FROM Oficina1 o LEFT JOIN Propiedad1 p ON o.ciudad = p.ciudad;

Ejemplo 5.28 Left Outer join


Incluye aquellas filas de la primera tabla (left) que no coinciden con las filas de la segunda tabla (derecha) .
Las columnas de la segunda tabla son completadas con valores Nulos .
Tabla resultado del ejemplo 5.28

numOficina B003 B004 B002

ciudad Glasgow Bristol London

numPropiedad PG4 NULL PL94

ciudad Glasgow NULL London

Ejemplo 5.29 Right Outer join


Tabla Oficina1 Tabla Propiedad1

numOficina B003 B004 B002

ciudad Glasgow Bristol London

numPropiedad PA14 PL94 PG4

ciudad Aberdeem London Glasgow

Liste los sucursales y las propiedades en la misma ciudad y cualquier propiedad incomparable (ciudad unmatched). SELECT o.*, p.* FROM Oficina1 b RIGHT JOIN Propiedad1 p ON b.ciudad = p.ciudad;

Example 5.29 Right Outer Join


El Right Outer join incluye aquellas filas de la segunda tabla (derecha) que no coinciden con la las filas de la primera tabla (izquierda). Las columnas de la primera tabla son completadas con valores Nulos.
Tabla resultado del ejemplo 5.29

numOficina NULL B002 B003

ciudad NULL London Glasgow

numPropiedad PA14 PL94 PG4

ciudad Aberdeem London Glasgow

Ejemplo 5.30 Full Outer Join


Listar las oficinas y las propiedades en la misma ciudad y cualquier oficina o propiedad incomparable
SELECT b.*, p.* FROM Branch1 b FULL JOIN PropertyForRent1 p ON b.bCity = p.pCity;

Ejemplo 5.30 Full Outer Join


Incluye no solamente aquellas filas que tienen la misma cuidad, si no tambin aquellas filas de ambas tablas que no coinciden. Las columnas de las tablas que coinciden son completadas con Null.
Tabla resultado del ejemplo 5.30
numOficina NULL B003 B004 B002 ciudad NULL Glasgow Bristol London numPropiedad PA14 PG4 NULL PL94 ciudad Aberdeem Glasgow NULL London

no

EXISTS y NOT EXISTS


EXISTS y NOT EXISTS estn para ser usados solamente con subqueries. Produce un resultado verdadero/falso.

Verdadero si y solo si existe por lo menos una fila en la tabla resultado retornada por la subquery. Falso si la subconsulta retorna una tabla vaca.
NOT EXISTS es el opuesto de EXISTS.

EXISTS y NOT EXISTS


Como (NO) EXISTS verifica solamente por la existencia o la no-existencia de filas en la tabla resultado de la subconsulta, la subquery puede contener cualquier nmero de columnas. Las subconsultas comunes que siguen a (NOT) EXISTS son de la forma:

(SELECT * ...)

Ejemplo 5.31 Consulta usando EXIST


Tabla Empleado
numEmpleado SL21 SG37 SG14 SA9 SG5 SL41 nombre Jhon Peter David Mary Susan Julie apellido White Denver Ford Lee Sarandon Roberts cargo Gerente Asistente Supervisor Asistente Gerente Asistente sexo fechNac M 01-Oct-45 M 10-Nov-60 M 09-Sep-58 F 17-Sep-59 F 21-Mar-60 F 13-Jun-63 salario 300000 120000 180000 90000 240000 90000 numOficina B005 B003 B003 B007 B003 B005

Tabla Oficina
numOficina B005 B007 B003 B004 B002 calle 16 Holhead 6 Argvill St. 163 Main Street 2 Manor Rd 10 Dale Rd ciudad Aberdeem London Glasgow Glasgow Bristol codigoPostal AB7 5SU NW2 G11 9QX G114QX G12

Listar todos los empleados que trabajan en alguna oficina de Londres.

Ejemplo 5.31 Consulta usando EXIST


Listar todos los empleados que trabajan en alguna oficina de Londres.
SELECT numEmpleado, nombre, apellido, cargo FROM Empleado e WHERE EXISTS (SELECT * FROM Oficina o WHERE e.numEmpleado = o.numEmpleado AND ciudad = London);

Ejemplo5.31 Consulta usando EXIST


Tabla Empleado
numEmpleado SL21 SG37 SG14 SA9 SG5 SL41 nombre Jhon Peter David Mary Susan Julie apellido White Denver Ford Lee Sarandon Roberts cargo Gerente Asistente Supervisor Asistente Gerente Asistente sexo fechNac M 01-Oct-45 M 10-Nov-60 M 09-Sep-58 F 17-Sep-59 F 21-Mar-60 F 13-Jun-63 salario 300000 120000 180000 90000 240000 90000 numOficina B005 B003 B003 B007 B003 B005

Tabla Oficina
numOficina B005 B007 B003 B004 B002 calle 16 Holhead 6 Argvill St. 163 Main Street 2 Manor Rd 10 Dale Rd ciudad Aberdeem London Glasgow Glasgow Bristol codigoPostal AB7 5SU NW2 G11 9QX G114QX G12

SELECT numEmpleado, nombre, apellido, cargo FROM Empleado e WHERE EXISTS (SELECT * FROM Oficina o WHERE e.numEmpleado = o.numEmpleado AND ciudad = London);

Tabla resultado Ejemplo 5.31

numEmpleado SA9

nombre apellido Mary Lee

cargo Asistente

Ejemplo 5.31 Consulta usando EXIST


Note que la condicin de bsqueda e.numOficina = o.numOficina es necesaria para considerar el correcto registro de oficina para cada empleado

Si se omite, listara todos los registros de empleado, debido a que la siguiente subconsulta:
SELECT * FROM Oficina WHERE ciudad=London

Seria siempre verdad y la consulta quedara:


SELECT numEmpleado, nombre, apellido, cargo FROM Empleado WHERE true;

Ejemplo 5.31 Consulta usando EXIST


Podria tambin escribir esta consulta a travs de un join:
SELECT numEmpleado, nombre, apellido, cargo FROM Empleado e, Oficina o WHERE e.numOficina = o.numOficina AND city = London;

Union, Intersect, y Difference (Except)


Puede utilizar operaciones de conjuntos normales tales como unin, interseccin, y diferencia para combinar resultados de dos o ms consultas en una sola tabla resultado. La unin de dos tablas, A y B, es una tabla que contiene todas las filas en A o B o ambos.

La interseccin es una tabla que contiene todas las filas comunes a A y a B.


La diferencia es una tabla que contiene todas las filas en A pero no en B. Dos tablas deben ser unin compatible.

Union, Intersect, y Difference (Except)


El formato de la clusula del operador de conjunto en cada caso es:
op [ALL] [CORRESPONDING [BY {columna1 [, ...]}]]

Si CORRESPONDING BY es especificado, entonces la operacin de conjunto es realizada sobre la o las columnas nombradas Si CORRESPONDING es especificado sin el BY, la operacin de conjunto se aplica sobre las columnas comunes en ambas tablas .

Union, Intersect, y Difference (Except)


Si se especifica ALL el resultado puede incluir filas duplicadas.

Algunos dialectos no soportan INTERSECT y EXCEPT; otros usan MINUS en lugar de


EXCEPT

Union, Intersect, y Difference (Except)

Ejemplo 5.32 Uso de UNION


Tabla Propiedad
numPropiedad PA14 PL94 PL95 PG21 calle 16 Holhead 6 Argvill St. 9 Argvill St. 10 Dale Rd ciudad Aberdeem London London Glasgow codigoPostal renta AB7 5SU 650 NW2 400 NW2 800 G12 600

Tabla Oficina
numOficina B005 B007 B003 B004 B002 calle ciudad 16 Holhead Aberdeem 6 Argvill St. London 6 Lawrence StGlasgow 2 Manor Rd Glasgow 10 Dale Rd Bristol codigoPostal AB7 5SU NW2 G11 9QX G114QX G12

Construya un listado de todas las ciudades en donde hay ya sea una oficina o una propiedad.

Ejemplo 5.32 Uso de UNION


Construya un listado de todas las ciudades en donde hay ya sea una oficina o una propiedad.

(SELECT ciudad
FROM Oficina WHERE ciudad IS NOT NULL) UNION (SELECT ciudad FROM Propiedad WHERE ciudad IS NOT NULL);

Ejemplo 5.32 Uso de UNION


O
(SELECT * FROM Oficina WHERE ciudad IS NOT NULL) UNION CORRESPONDING BY ciudad (SELECT * FROM Propiedad WHERE ciudad IS NOT NULL);

Ejemplo 5.32 Uso de UNION


Esta consulta es ejecutada produciendo el resultado de la primera consulta y el resultado de la segunda consulta, para finalmente mezclar el resultado en una sola tabla
Tabla resultado Ejemplo 5.32

ciudad Aberdeem London Glasgow Bristol

Ejemplo 5.33 Uso de INTERSECT


Tabla Propiedad
numPropiedad PA14 PL94 PL95 PG21 calle 16 Holhead 6 Argvill St. 9 Argvill St. 10 Dale Rd ciudad Aberdeem London London Glasgow codigoPostal renta AB7 5SU 650 NW2 400 NW2 800 G12 600

Tabla Oficina
numOficina B005 B007 B003 B004 B002 calle ciudad 16 Holhead Aberdeem 6 Argvill St. London 6 Lawrence StGlasgow 2 Manor Rd Glasgow 10 Dale Rd Bristol codigoPostal AB7 5SU NW2 G11 9QX G114QX G12

Construya un listado de todas las ciudades en que hay una oficina y una propiedad.

Ejemplo 5.33 Uso de INTERSECT


Construya un listado de todas las ciudades en que hay una oficina y una propiedad. (SELECT ciudad FROM Oficina)
INTERSECT (SELECT ciudad FROM Propiedad);

Ejemplo 5.33 Uso de INTERSECT


O
(SELECT * FROM Oficina) INTERSECT CORRESPONDING BY ciudad (SELECT * FROM Propiedad);

Pearson Education Limited 1995, 2005

Ejemplo 5.33 Uso de INTERSECT


Podramos reescribir esta consulta, sin el operador INTERSECT:
SELECT O.city FROM Oficina o Propiedad p WHERE o.ciudad = p.ciudad;

O:

SELECT DISTINCT ciudad FROM Oficina o WHERE EXISTS (SELECT * FROM Propiedad p WHERE p.ciudad = o.ciudad);

Ejemplo 5.34 Uso de EXCEPT


Listar todas las ciudades en donde haya oficinas, pero no propiedades.
(SELECT ciudad FROM Oficina) EXCEPT (SELECT ciudad FROM Propiedad);

O
(SELECT * FROM Oficina) EXCEPT CORRESPONDING BY ciudad (SELECT * FROM Propiedad);

Ejemplo 5.34 Uso de EXCEPT


Podemos reescribir esta consulta sin el operador EXCEPT:
SELECT DISTINCT ciudad FROM Oficina WHERE ciudad NOT IN (SELECT ciudad FROM Propiedad);

O
SELECT DISTINCT ciudad FROM Oficina o WHERE NOT EXISTS (SELECT * FROM Propiedad p WHERE p. ciudad = b. ciudad );

Actualizaciones a la Base de datos


El lenguaje SQL puede ser usado para consultar la base de datos como tambin para modificar los datos.

Tres comandos SQL para modificar el contenido de las tablas en la base de datos:
Insert Agrega nuevas filas de datos a una tabla Delete Elimina filas de datos de una tabla Update Modifica los datos existentes en una tabla.

INSERT
INSERT INTO Nombretabla [ (listaDeColumnas) ]
VALUES (listaDeValores)

listaDeColumnas es opcional; si se omite, SQL asume la lista de todas las columnas en el orden original. todas las columnas omitidas en la lista deben haber sido declaradas NULL cuando la tabla fue creada, a menos que se haya utilizado la opcin DEFAULT cuando se creo la columna.

INSERT
La listaDeValores debe coincidir con listaDeColumnas como sigue: El nmero de tems de cada lista debe ser el mismo Debe haber una correspondencia directa en la posicin de los tems en las dos listas, El tipo de datos de cada item en listaDeValores debe ser compatible con el tipo de datos de la correspondiente columna.

Ejemplo 5.34 INSERT . . . VALUES


Tabla Empleado
numEmpleado SL21 SG37 SG14 SA9 SG5 SL41 nombre Jhon Peter David Mary Susan Julie apellido White Denver Ford Lee Sarandon Roberts cargo Gerente Asistente Supervisor Asistente Gerente Asistente sexo fechNac M 01-Oct-45 M 10-Nov-60 M 09-Sep-58 F 17-Sep-59 F 21-Mar-60 F 13-Jun-63 salario 300000 120000 180000 90000 240000 90000 numOficina B005 B003 B003 B007 B003 B005

Insertar una nueva fila en la tabla Empleado, entregando los datos para todas las columnas:

Ejemplo 5.34 INSERT . . . VALUES


Insertar una nueva fila en la tabla Empleado, entregando los datos para todas las columnas:
Tabla Empleado
numEmpleado SL21 SG37 SG14 SA9 SG5 SL41 nombre Jhon Peter David Mary Susan Julie apellido White Denver Ford Lee Sarandon Roberts cargo Gerente Asistente Supervisor Asistente Gerente Asistente sexo fechNac M 01-Oct-45 M 10-Nov-60 M 09-Sep-58 F 17-Sep-59 F 21-Mar-60 F 13-Jun-63 salario 300000 120000 180000 90000 240000 90000 numOficina B005 B003 B003 B007 B003 B005

INSERT INTO Empleado VALUES (SG16, Alan, Brown, Asistente, M, Date1957-05-25, 83000, B003);

Ejemplo 5.35 INSERT usando valores por defecto


Insertar una nueva fila en la tabla Empleado suministrando datos para todas las columnas obligatorias. numEmpleado, nombre, apellido, cargo, salario y numOficina.

INSERT INTO Empleado (numEmpleado, nombre, apellido, cargo, salario, numOficina) VALUES (SG44, Amme, Jones, Asistente, 8100, B003);
O

INSERT INTO Empleado VALUES (SG44, Anne, Jones, Asistente, NULL, NULL, 8100, B003);

INSERT SELECT
La segunda forma de la instruccin INSERT permite que mltiples filas sean copiadas de una o ms tablas a otra, y tiene el siguiente formato: INSERT INTO NombreTabla [ (listaDeColumnas) ]
SELECT ...

Ejemplo 5.35 INSERT SELECT


Asuma que hay una tabla EmpleadoTotalPropiedad, que contiene los nombres de los empleados y el nmero de propiedades que ellos manejan:
EmpleadoTotalPropiedad (numEmpleado, Nombre, Apellido, totalProp) Poblar la tabla EmpleadoTotalPropiedad usando los detalles de la tabla Empleado y la tabla Propiedad.

Ejemplo 5.35 INSERT SELECT


Tabla Propiedad
numPropiedad PA14 PL94 PG4 PG36 PG21 PG16 calle 16 Holhead 6 Argvill St. 6 Lawrence St 2 Manor Rd 10 Dale Rd 5 Novar Dr ciudad Aberdeem London Glasgow Glasgow Glasgow Glasgow codigoPostal AB7 5SU NW2 G11 9QX G114QX G12 G12 9AX tipo hab renta numPropietario Casa 6 650 C046 Departamento 4 400 C087 Departamento 3 350 C040 Departamento 3 375 C093 Casa 5 600 C087 Departamento 4 450 C093 numEmpleado SL21 SL21 SA9 SA9 SG5 SL21

Tabla Empleado
numEmpleado SL21 SG37 SG14 SA9 SG5 SL41 nombre Jhon Peter David Mary Susan Julie apellido White Denver Ford Lee Sarandon Roberts cargo Gerente Asistente Supervisor Asistente Gerente Asistente sexo fechNac M 01-Oct-45 M 10-Nov-60 M 09-Sep-58 F 17-Sep-59 F 21-Mar-60 F 13-Jun-63 salario 300000 120000 180000 90000 240000 90000 numOficina B005 B003 B003 B007 B003 B005

Poblar la tabla EmpleadoTotalPropiedad usando los EmpleadoTotalPropiedad (numEmpleado, Nombre, Apellido, totalProp)

detalles de la tabla Empleado y la tabla Propiedad.

Ejemplo 5.35 INSERT SELECT


INSERT INTO EmpleadoTotalPropiedad (SELECT e.numEmpleado, Nombre, Apellido, COUNT(*) FROM Empleado e, Propiedad p WHERE e.numEmpleado = p.numEmpleado Group BY e.numempleado , nombre, apellido) UNION (SELECT numEmpleado, nombre, apellido, 0 FROM Empleado e WHERE NOT EXIST (SELECT * FROM Propiedad p WHERE e.numEmpleado = p.numEmpleado));

Ejemplo 5.35 INSERT SELECT


Tabla resultado Ejemplo 5.35
numEmpleado SL21 SG37 SG14 SA9 SG5 SL41 nombre Jhon Peter David Mary Susan Julie apellido totalProp White 3 Denver 0 Ford 0 Lee 2 Sarandon 1 Roberts 0

Si la segunda parte de la UNIN se omite, excluye a los empleados que no manejan actualmente ninguna propiedad.

UPDATE
UPDATE NombreTabla SET columnName1 = dataValue1 [, columnName2 = dataValue2...] [WHERE searchCondition]

NombreTabla puede ser el nombre de una tabla base o una vista actualizable. La clusula SET especifica los nombres de una o ms columnas a ser actualizadas

UPDATE

La clusula WHERE es opcional:


Si se omite, las columnas nombradas sern actualizadas para todas las filas en tabla; Si se especifica, solamente esas filas que satisfacen la searchCondition son actualizadas.

El(los) nuevo(s) dataValue(s) debe(n) ser compatible con el tipo de datos para la columna correspondiente.

Ejemplo 5.38/39 UPDATE todas las filas


Tabla Empleado
numEmpleado SL21 SG37 SG14 SA9 SG5 SL41 nombre Jhon Peter David Mary Susan Julie apellido White Denver Ford Lee Sarandon Roberts cargo Gerente Asistente Supervisor Asistente Gerente Asistente sexo fechNac M 01-Oct-45 M 10-Nov-60 M 09-Sep-58 F 17-Sep-59 F 21-Mar-60 F 13-Jun-63 salario 300000 120000 180000 90000 240000 90000 numOficina B005 B003 B003 B007 B003 B005

D a todos los Empleados un aumento de sueldo del 3%. D a todos los Gerentes un aumento de sueldo del 5%.

Ejemplo 5.38/39 UPDATE todas las filas


Tabla Empleado
numEmpleado SL21 SG37 SG14 SA9 SG5 SL41 nombre Jhon Peter David Mary Susan Julie apellido White Denver Ford Lee Sarandon Roberts cargo Gerente Asistente Supervisor Asistente Gerente Asistente sexo fechNac M 01-Oct-45 M 10-Nov-60 M 09-Sep-58 F 17-Sep-59 F 21-Mar-60 F 13-Jun-63 salario 300000 120000 180000 90000 240000 90000 numOficina B005 B003 B003 B007 B003 B005

D a todos los Empleados un aumento de sueldo del 3%. UPDATE Empleado


SET salario = salario*1.03;

Ejemplo 5.38/39 UPDATE todas las filas


Tabla Empleado
numEmpleado SL21 SG37 SG14 SA9 SG5 SL41 nombre Jhon Peter David Mary Susan Julie apellido White Denver Ford Lee Sarandon Roberts cargo Gerente Asistente Supervisor Asistente Gerente Asistente sexo fechNac M 01-Oct-45 M 10-Nov-60 M 09-Sep-58 F 17-Sep-59 F 21-Mar-60 F 13-Jun-63 salario 300000 120000 180000 90000 240000 90000 numOficina B005 B003 B003 B007 B003 B005

D a todos los Gerentes un aumento de sueldo del 5%. UPDATE Empleado


SET salario = salario*1.05 WHERE cargo = Gerente;

Ejemplo 5.38/39 UPDATE mltiples columnas


Tabla Empleado
numEmpleado SL21 SG37 SG14 SA9 SG5 SL41 nombre Jhon Peter David Mary Susan Julie apellido White Denver Ford Lee Sarandon Roberts cargo Gerente Asistente Supervisor Asistente Gerente Asistente sexo fechNac M 01-Oct-45 M 10-Nov-60 M 09-Sep-58 F 17-Sep-59 F 21-Mar-60 F 13-Jun-63 salario 300000 120000 180000 90000 240000 90000 numOficina B005 B003 B003 B007 B003 B005

Promueva a David Ford (numEmpleado=SG14) a Gerente y cambie su salario a 190.000.

Ejemplo 5.38/39 UPDATE mltiples columnas


Tabla Empleado
numEmpleado SL21 SG37 SG14 SA9 SG5 SL41 nombre Jhon Peter David Mary Susan Julie apellido White Denver Ford Lee Sarandon Roberts cargo Gerente Asistente Supervisor Asistente Gerente Asistente sexo fechNac M 01-Oct-45 M 10-Nov-60 M 09-Sep-58 F 17-Sep-59 F 21-Mar-60 F 13-Jun-63 salario 300000 120000 180000 90000 240000 90000 numOficina B005 B003 B003 B007 B003 B005

Promueva a David Ford (numEmpleado=SG14) a Gerente y cambie su salario a 190.000.

UPDATE Empleado
SET cargo = Gerente, salario = 190000 WHERE numEmpleado = SG14;

DELETE
DELETE FROM NombreTabla [WHERE searchCondition]

NombreTabla puede ser una tabla base o una vista actualizable. searchCondition es opcional; si se omite, todas las filas son eliminadas de la tabla. Este no elimina la tabla. Si se especifica search_condition solamente se eliminan aquellas filar que satisfacen la condicin

Ejemplo 5.41/42 DELETE Filas especificas


Tabla Visita
numCliente CR56 CR76 CR56 CR62 CR56 numPropiedad PA14 PG4 PG4 PA14 PG36 Fecha 24-11-1999 20-10-1999 26-11-1999 14-11-1999 28-10-1999 Comentario muy pequeo muy lejos no tiene saln

Suprima todas las visitas que se relacionen con la propiedad PG4.


Elimine todos los registros de la tabla Visita.

Ejemplo 5.41/42 DELETE Filas especificas


Tabla Visita
numCliente CR56 CR76 CR56 CR62 CR56 numPropiedad PA14 PG4 PG4 PA14 PG36 Fecha 24-11-1999 20-10-1999 26-11-1999 14-11-1999 28-10-1999 Comentario muy pequeo muy lejos no tiene saln

Suprima todas las visitas que se relacionen con la propiedad PG4.


DELETE FROM Visita
WHERE numPropiedad = PG4;

Ejemplo 5.41/42 DELETE Filas especificas


Tabla Visita
numCliente CR56 CR76 CR56 CR62 CR56 numPropiedad PA14 PG4 PG4 PA14 PG36 Fecha 24-11-1999 20-10-1999 26-11-1999 14-11-1999 28-10-1999 Comentario muy pequeo muy lejos no tiene saln

Elimine todos los registros de la tabla Visita.


DELETE FROM Visita;

Unidad I Introduccin a las Bases de datos

Fin de la Unidad

la notacin BNF (forma Backus-Naur)


Las gramticas tienen mtodos alternativos tiles para desplegar las producciones
<oracin> <sujeto> <predicado> <verbo> <adverbio> ::= ::= ::= ::= ::= <sujeto> <predicado> Juan | Julia <verbo> <adverbio> maneja | corre descuidadamente | frecuentemente

X/Open Company
X/Open Company, Ltd. era un consorcio fundado en 1984 para identificar y promover estndares abiertos en el campo de la tecnologa de informacin. X/Open tambin manej la marca registrada de UNIX a partir de 1993 a 1996, cuando X/Open se combin con la fundacin abierta del software Open Software Foundation (OSF) para formar The Open Group

Unidad I Introduccin a las Bases de datos

Fin de la Unidad

Das könnte Ihnen auch gefallen