Vous êtes sur la page 1sur 15

EJERCICIO 2

Base de datos Empleados

Curso Bases de Datos

75

SUBCONSULTAS
Una subconsulta es una sentencia SELECT que aparece
dentro de otra sentencia SELECT que llamaremos consulta
principal.
La subconsulta (consulta interna o consulta anidada) se ejecuta
antes de la consulta principal. Esto no aplica en subconsultas
correlacionadas

El resultado de la subconsulta se usa para ejecutar la consulta


principal

Las subconsultas se pueden ubicar en las clusulas WHERE,


HAVING y FROM
El Operador puede ser de dos tipos:
De fila simple como >, >=, <, <=, =, <>
De mltiples filas como IN, ANY, ALL
Curso Bases de Datos

76

SUBCONSULTAS (1 FILA)
Consulta Principal:

Mostrar los empleados que ganan ms que GIL y el salario.


SELECT apellido, salario FROM emple WHERE salario >
Subconsulta:
Cul es el salario de GIL?
SELECT salario FROM emple WHERE apellido = 'GIL'

Curso Bases de Datos

77

SUBCONSULTAS (1 FILA)
Subconsulta en el WHERE:

Mostrar los empleados que ganan ms que GIL y el salario.


SELECT apellido, salario FROM emple WHERE salario >
SELECT salario FROM emple WHERE apellido = 'GIL'
;

Curso Bases de Datos

78

SUBCONSULTAS (+ 1 FILA)
Consulta Principal:
Mostrar los empleados que ganan ms que todos los VENDEDOR.
SELECT apellido, salario FROM emple WHERE salario > ALL
Subconsulta:
Cules son los salarios de los vendedores?
SELECT salario FROM emple WHERE oficio= VENDEDOR'

Curso Bases de Datos

79

SUBCONSULTAS (+ 1 FILA)
Subconsulta en el WHERE:

Mostrar los empleados que ganan ms todos los VENDEDOR.


SELECT apellido, salario FROM emple WHERE salario >
ALL (SELECT salario FROM emple WHERE
oficio='VENDEDOR');
Mostrar los empleados que ganan ms uno de los VENDEDOR.
SELECT apellido, salario FROM emple WHERE salario >
ANY(SELECT salario FROM emple WHERE
oficio='VENDEDOR');
Curso Bases de Datos

80

SUBCONSULTAS (+ 1 FILA)


Retornan cero, una o ms filas

Los operadores que se usan son:

IN Igual a un miembro de la lista

ANY
Compara el valor con cada valor retornado por la
subconsulta hasta encontrar que se cumpla la condicin

ALLCompara el valor con todos los valores retornados por la


subconsulta

El operador NOT se puede combinar con los anteriores


operadores

Curso Bases de Datos

81

SUBCONSULTAS (+ 1 FILA)
 < ANY significa < (SELECT MAX )
 > ANY significa > (SELECT MIN )
 = ANY significa lo mismo que IN
 < ALL

significa < (SELECT MIN )

 > ALL

significa > (SELECT MAX )

 <> ALL significa lo mismo que NOT IN


Curso Bases de Datos

82

SUBCONSULTAS
RECOMENDACIONES:
 Encerrar las subconsultas entre parntesis.
 Ubicar las subconsultas en el lado derecho de la
condicin de comparacin.
 Las subconsultas no necesitan una clusula ORDER BY a
menos de que se realice una consulta de anlisis TOP-N
(los primeros N).
 Use operadores de fila simple cuando tiene certeza de
que se retorna un solo valor, y use operadores de
mltiples filas cuando la subconsulta retorna ms de una
fila.

SUBCONSULTAS
Subconsultas de fila simple
Consulta Principal:
Subconsulta:

SELECT dept_no FROM emple


WHERE apellido = 'GIL'

Subconsultas de mltiples filas


Consulta Principal:
Subconsulta:

SELECT salario FROM emple WHERE


oficio='VENDEDOR'

Una columna mltiples columnas?

EJERCICIO

Curso Bases de Datos

85

Funciones de agregacin:






SUM(atributo) : Sumatoria del atributo.


MAX(atributo) : Valor mximo del atributo.
MIN(atributo) : Valor mnimo del atributo.
AVG(atributo) : Valor promedio del atributo.
COUNT(atributo | *) : Conteo de tuplas.

 Se puede usar GROUP BY con estas funciones para


consolidar por grupos
 Se puede usar HAVING para establecer condiciones
para los grupos (HAVING es lo que el WHERE es
para las tuplas)

Curso Bases de Datos

86

EJERCICIO

Curso Bases de Datos

87

JOINS
Se realiza el producto cartesiano de las 2 tablas.
Empleados: 14 registros

Departamentos: 4 registros

select * from depart d join emple e;


select * from depart, emple;
Total 56 registros
Curso Bases de Datos

88

JOINS INNER
SELECT * FROM TablaA INNER JOIN TablaB
ON TablaA.campo = TablaB.campo
Un

inner

nicamente

join

el

produce

conjunto

de

registros que estn tanto en la


Tabla A como en la Tabla B.

Curso Bases de Datos

89

Supongamos estas dos relaciones:


Empleado
Cdigo
1
2
3
8
10
12

Nombre
Edad Depto
Jorge Campos
33
1
Enrique Muoz
25
1
Esteban Paz
21
1
Jorge Arias
30
2
Juan Martnez
19
2
Anselmo Rodas
28
6

Curso Bases de Datos

Departamento
Depto
1
2
3
4

Descripcin
Administracin
Produccin
Ventas
Finanzas

90

JOINS
 Mediante la clusula INNER JOIN combinada
con ON
SELECT * FROM empleado
INNER JOIN departamento
ON empleado.depto =
departamento.depto

 Otra forma es utilizando la clusula NATURAL


JOIN
SELECT * FROM empleado
NATURAL JOIN departamento
Curso Bases de Datos

91

JOINS
 Otra forma es comparando los atributos
que realizan el join en la clusula WHERE
SELECT * FROM empleado, departamento
WHERE empleado.depto = departamento.depto

Curso Bases de Datos

92

Renombramiento con AS
 Se puede emplear la clusula AS para generar
alias en las diferentes tablas.
SELECT *
FROM empleado AS e, departamento AS d
WHERE e.depto = d.depto
Nota: El SQL estndar exige siempre el uso de
AS, aunque algunos SGBD como Oracle y
Access lo suprimen
Curso Bases de Datos

93

JOINS FULL OUTER


SELECT * FROM TablaA FULL OUTER JOIN TablaB ON

TablaA.nombre = TablaB.nombre
Full outer join produce el
conjunto de todos los recursos
de la Tabla A y de la Tabla B,

haciendo coincidir los registros


de

ambos

disponibles.

coincidencias,

lados
Si

el

si

no

lado

falte, contendr null.

estn
hay

que
Curso Bases de Datos

94

10

JOINS LEFT OUTER


SELECT * FROM TablaA LEFT OUTER JOIN TablaB ON
TablaA.nombre = TablaB.nombre

Left

outer

reproduce

join

todos los registros de la Tabla

A, con los registros completos


(donde se pueda), de la Tabla
B. Si no hay coincidencias en

el registro, el lado derecho


contendr null

Curso Bases de Datos

95

JOINS LEFT OUTER (SLO A)


SELECT * FROM TableA LEFT OUTER JOIN TableB ON

TableA.name = TableB.name WHERE TablaB.id IS null


Para

obtener

los

pero

no

la

registros

que solo estn en la Tabla A,


en

realizaremos

el

Tabla

mismo

B,

left

outer join, y excluimos los


registros de la derecha que
no queremos, con where.

Curso Bases de Datos

96

11

JOINS FULL OUTER (NO COMUNES)


SELECT * FROM TablaA FULL OUTER JOIN TablaB ON

TableA.nombre = TablaB.nombre WHERE TablaA.id IS


null OR TablaB.id IS null

En este caso, obtendremos los


registros nicos de la Tabla A

y de la Tabla B. Para lograrlo,

ejecutamos el mismo full outer


join, y luego excluimos los
resultados

indeseados

ambos lados con where.

de

Curso Bases de Datos

97

JOINS RIGHT
Lo

mismo

pero

LEFT por RIGHT.

cambiamos

Curso Bases de Datos

98

12

EJERCICIO

Curso Bases de Datos

99

Anidamiento de consultas
 Con IN, y con otros operadores como
EXISTS, se pueden anidar consultas
 Ej: Presentar el ttulo de las pelculas que
nunca se han prestado:
SELECT DISTINCT pel.titulo FROM pelicula AS pel
WHERE pel.titulo NOT IN (
SELECT pel.titulo
FROM pelicula AS pel, prestamo AS pr, copia AS co
WHERE pr.codcopia=co.codcopia AND
co.codpeli=pel.codpeli
)
Curso Bases de Datos

100

13

Otra manera

 Otra manera de realizar la anterior consulta,


que evita la realizacin de uno de los JOIN
es:
SELECT DISTINCT pel.titulo
FROM pelicula AS pel
WHERE pel.codpeli NOT IN (
SELECT co.codpeli
FROM prestamo AS pr, copia AS co
WHERE pr.codcopia=co.codcopia
)
Curso Bases de Datos

101

Ejemplo
Calcular el nmero de veces que se ha prestado la
pelcula ms prestada.
SELECT MAX(cuenta) AS numero_veces
FROM

( SELECT DISTINCT COUNT(*) AS cuenta

FROM pelicula AS pe, prestamo AS pr, copia AS co


WHERE pr.codcopia=co.codcopia
AND
co.codpeli=pe.codpeli
GROUP BY pe.codpeli

Curso Bases de Datos

102

14

Insercin de datos: INSERT


INSERT INTO departamento
VALUES(1,Administracin')

Borrado de datos: DELETE


DELETE
FROM empleado
WHERE codigo = 10;

Curso Bases de Datos

103

15

Vous aimerez peut-être aussi