Vous êtes sur la page 1sur 144

CAPA DE DATOS Bases de

Datos

CAPA DE DATOS
Sandra Romero
(sandra.romerohh@gmail.com)
Agosto 2015

El Lenguaje
SQL

- Objetivos

Entender el propsito e importancia del


Lenguaje de Consulta Estructurado SQL.
Como recuperar datos de una base de
datos usando la instruccin SELECT
o Uso de condicin WHERE compuesta.
o Ordenando resultados usando ORDER BY.

- Objetivos
o
o
o
o
o

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).

- 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:
o Crear la base de datos y las estructuras de
relaciones
o Realizar tareas de administracin de datos bsicas,
o Realizar consultas simples y complejas
o Debe realizar estas tareas con mnimo esfuerzo del
usuario
o Su estructura de comandos y sintaxis debe ser fcil
de aprender
o Debe ser portable

Objetivos de SQL

SQL es un lenguaje orientado a transformacin


con dos principales componentes:
o Un DDL para definir la estructura de la base de datos y
controlar el acceso a los datos;
o 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:
o Es un lenguaje no procedural: se especifica que informacin se requiere,
mas que, como obtenerla,
o 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.

de SQL see-quel, a pesar que la


Historia
Aun pronunciado
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:
o ISOs Information Resource Directory System (IRDS) Standard
o Remote Data Access (RDA) Standard.

Escribiendo Comandos SQL


La instruccin SQL consiste de palabras
reservadas y palabras definidas por el
usuario.
o Las palabras reservadas son una parte fija del
lenguaje SQL y tiene un significado fijo. Ellas
tienen que ser deletreadas exactamente como
se requiere
o 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:
o Cada clusula debera comenzar en una nueva
lnea.
o El comienzo de una clusula debe alinearse con el
comienzo de otras clusulas.
o 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:

o Las letras maysculas representan palabras


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

Literales
Los literales son constantes usadas en sentencias
SQL.
Todos los literales no numricos deben estar
encerrados en comilla simple (ej. London).
Todos los literales numricos no deben estar
encerrados en comillas (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
WHERE
GROUP BY

Especifica la o las tabla(s) a ser usadas


Filtra filas.
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 de una tabla


Crear una base llamada TPI y cargar el script
llamado: TABLA-PARA-EJERCICIOS-CLASE. sql
Podemos usar * Como una abreviacin para todas las
columnas:
SELECT *
FROM tabla;
Esta consulta aplica solo para ambientes de
desarrollo.

Ejemplo 5.1 Todas las columnas, Todas las

filas
de
una
tabla
SELECT nombre de columnas
FROM nombre de tabla

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 placas para todos los


ingenios, mostrando solamente, placa, Codigo de
ingenio, fecha de registro y comentario siempre y
cuando la fecha de ingreso sea mayor a:
06/09/2012
;

Ejemplo 5.3 Uso de DISTINCT


Listar el numero de placas de todos las ingenios

Sintaxis de distinct
SELECT DISTINCT campo
FROM tabla;

Ejemplo 5.3 Uso de DISTINCT


SELECT campo
FROM tabla;

Tabla 1-1 Tabla


resultado con duplicados

numPropiedad
IA14
IG4
IG4
IA14
IG36

SELECT DISTINCT campo


FROM tabla;

Tabla 1-2 Tabla resultado


eliminando duplicados

numPropiedad
IA14
IG4
IG36

Ejemplo 5.4 Campos calculados

Listar las cantidad de placas mensual para todos


los ingenios, mostrando solamente, placa,
Cdigo de ingenio, fecha de registro y
comentario

Pearson Education Limited 1995, 2005

Ejemplo 5.4 Campos calculados


Para nombrar columnas se puede usar la
clausula AS o no.
SELECT numEmpleado, nombre, apellido, salario/12 AS salarioMensual
FROM Empleado;

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
Ejercicio:
Listar todos las placas del ingenio La Azul
cuyo id sea mayor 57009
Ejemplo
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 todas las placas del ingenio Central


Izalco

Ejemplo 5.7 Condicin Rango de


Bsqueda
Ejercicio
Listar todo las placas cuya fecha de registro este entre
2012-12-01 y 2012-12-15
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


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.


MANEJO DE FECHAS EN MYSQL
Funcion STR_TO_DATE y DATE_FORMAT
Sintanxis:

STR_TO_DATE(a.FechaFinalRealizacion,'%Y-%m-%d')>='2015-05-01

DATE_FORMAT(fechaalta,'%d/%m/%Y')'

Ejemplo 5.8 pertenencia de conjuntos (IN/NOT

IN)

Ejercicios:
Listar todos los Vendedores y Jefes de la
tabla empleados
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

de

conjuntos

(IN/NOT IN)
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

Funciones de fechas
DATEDIFF(expression1,expression2) :
select datediff('2007-2-6 17:33:25','2007-1-1');

-DATE_ADD(fechahora, INTERVAL tipo expresin fechahora) :


select date_add('2007-1-14', interval 15 day);

- SELECT DAYNAME('2007-01-04')
Link donde se puede ver el resto de funciones de MYSQL para tratar fechas:
https://www.hscripts.com/es/tutoriales/mysql/fecha-hora-functiones.php

Ejemplo 5.9 Patrn de caracteres


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

LIKE %Maria% significa una secuencia de

caracteres de cualquier longitud


conteniendo el string Maria.

Ejemplo 5.10 Condicin de bsqueda NULL


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

numCliente
Q56
Q76
Q56

numPropiedad
IA14
IG4
IG4

Fecha
Comentario
24-11-1999 muy pequeo
20-10-1999 muy lejos
26-11-1999

Q62
Q56

IA14
IG36

14-11-1999 no tiene saln


28-10-1999

Ejemplo 5.10 Condicin de bsqueda NULL


Ejercicios:

Listar el detalle de todas los empleados con la


modalidad ENTRENAMIE y el Idempleado sea vaco.

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

Instruccin SELECT - Agregadas


El estndar ISO define cinco funciones agregadas:

Funcin

Descripcin

AVG

Calcula el promedio de los valores de un campo


determinado

COUNT

Devuelve el nmero de registros de la seleccionados

SUM

Devuelve la suma de todos los valores de un campo


determinado

MAX

Devuelve el valor ms alto de un campo especificado

MIN

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(*)


Ejercicios
Cuntos empleados son mayor de 18 aos?

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:
o
o
o
o

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.

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.

Example 5.18 Use of HAVING


Tabla rxlog
Para cada unidad con ms de 2 registros,
encuentre el nmero de unidades en
cada estado
ESTADO

CUANTOS HAY

ARMED

Tabla rxlog
Agrupar
todas
las
unidades
departamento y municipio

por

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


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

Igualdad
codigoPostal
AB7 5SU
NW2
G11 9QX
G114QX
G12

numEmpleado
SL21
SG37
SG14
SA9
SG5
SL41

nombre
Jhon
Peter
David
Mary
Susan
Julie

apellido
White
Denver
Ford
Lee
Sarandon
Roberts

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

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

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

salario
300000
120000
180000
90000
240000
90000

numOficina
B005
B003
B003
B007
B003
B005

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

numEmpleado
SG14
SG5
SL21

cargo
Gerente
Asistente
Supervisor
Asistente
Gerente
Asistente

nombre
David
Susan
John

apellido
Ford
Sarandon
White

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

cargo
Diferencia
Supervisor
10000
Gerente
70000
Gerente
130000

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


FROM Empleado) AS Diferencia

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

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
operando en una expresin.

utilizar

como

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

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

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

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
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

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.

Constucciones 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
Casa
Departamento
numOficina
B005
Departamento
B007
Departamento
B003
Casa
B004
Departamento
B002

hab renta numPropietario numEmpleado


6
650 C046
SL21
4
400 C087
SL21
calle
ciudad
codigoPostal
16 Holhead
Aberdeem
AB7SA9
5SU
3
350 C040
6 Argvill
St.
London
NW2
3
375 C093
SA9
1635Main600
Street
Glasgow
G11SG5
9QX
C087
2 Manor Rd
Glasgow
G114QX
4
450 C093
SL21
10 Dale Rd

Bristol

G12

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.

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

Encuentre el total de propiedades


manejadas por cada empleado.

numEmpleado
SL21
SL21
SA9
SA9
SG5
SL41

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;
numOficina
B003
B005
B005
B007

numEmpleado
SG5
SL21
SL41
SA9

Tabla Resultado del ejemplo 5.27

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

numOficina
B003
B004
B002

ciudad
Glasgow
Bristol
London

Tabla Propiedad1

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

numOficina
B003
B004
B002

ciudad
Glasgow
Bristol
London

Tabla Propiedad1

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

numOficina
B003
B004
B002

ciudad
Glasgow
Bristol
London

Tabla Propiedad1

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 no 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

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

Listar todos los


empleados que
trabajan en alguna
oficina de Londres.

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

Tabla Oficina
salario
300000
120000
180000
90000
240000
90000

numOficina
B005
B003
B003
B007
B003
B005

numOficina
B005
B007
B003
B004
B002

calle
16 Holhead
6 Argvill St.
163 Main Street
2 Manor Rd
10 Dale Rd

SELECT numEmpleado, nombre,


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

Tabla resultado Ejemplo 5.31

ciudad
Aberdeem
London
Glasgow
Glasgow
Bristol

codigoPostal
AB7 5SU
NW2
G11 9QX
G114QX
G12

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:

O:

SELECT O.city
FROM Oficina o Propiedad p
WHERE o.ciudad = p.ciudad;

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

INSERT INTO Empleado


VALUES (SG16, Alan, Brown,
Date1957-05-25, 83000, B003);

salario
300000
120000
180000
90000
240000
90000

numOficina
B005
B003
B003
B007
B003
B005

Asistente,

M,

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);

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 detalles


de la tabla Empleado y la tabla Propiedad.

EmpleadoTotalPropiedad (numEmpleado, Nombre,


Apellido, totalProp)

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:
o Si se omite, las columnas nombradas sern actualizadas para todas las
filas en tabla;
o 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;

Fin

Vous aimerez peut-être aussi