Pract3 SQL Server
Pract3 SQL Server
Objetivos
! Presentar ! Ver
la sintaxis del lenguaje SQL (slo del Lenguaje de Manipulacin). algunos ejemplos sencillos para clarificar la semntica del SQL. las bases de datos CICLISMO, MSICA y BIBLIOTECA. de menor a mayor complejidad consultas SQL sobre dichas bases de datos. todo lo anterior usando la herramienta SQL del sistema de gestin de bases de datos ORACLE.
comalista_item_seleccionado: informacin a obtener de la base de datos. FROM comalista_referencia_tabla: especifica de qu tablas se obtiene la informacin buscada. WHERE expresin_condicional: expresa una condicin que deben cumplir las filas de la consulta resultante. GROUP BY comalista_referencia_col: permite formar consultas agrupadas para extraer informacin global sobre los grupos formados. HAVING expresin_condicional: condicin sobre los grupos formados. ORDER BY comalista_referencia_col: ordena por una o varias columnas.
ALL : Permite la aparicin de filas idnticas (valor por defecto). DISTINCT: No permite la aparicin de filas idnticas. La expresin_condicional est formada por un conjunto de predicados combinados con las conectivas lgicas AND, OR y NOT. Los predicados utilizados permiten comparar columnas: predicados de comparacin: =, <>, >, <, >=, <=. predicado LIKE: permite comparar una tira de caracteres con un patrn. predicado BETWEEN: permite comprobar si un escalar est en un rango. predicado IN: permite comprobar si el valor est dentro de un conjunto. predicado IS NULL: permite comprobar si el valor es nulo.
Ciclismo
EQUIPO (nom_eq: d_eq, director: d_dir) Clave Primaria: {nom_eq} CICLISTA (dorsal: d_dor, nombre: d_nom, edad: d_edad, nom_eq: d_eq)) Clave Primaria: {dorsal} CAj: {nom_eq} hace referencia a EQUIPO VNN: {nom_eq} ETAPA (netapa: d_n, km: d_km, salida: d_sal, llegada: d_lleg, dorsal: d_dor) Clave Primaria: {netapa} CAj: {dorsal} hace referencia a CICLISTA PUERTO (nombre:d_nom,altura:d_alt,categora:d_cat, netapa:d_n,dorsal: d_dor) Clave Primaria: {nombre} CAj: {netapa} hace referencia a ETAPA CAj: {dorsal} hace referencia a CICLISTA VNN: {netapa} MAILLOT (cdigo: d_cdigo, tipo: d_tipo, premio: d_pre, color: d_col) Clave Primaria: {cdigo} LLEVAR (dorsal: entero, netapa: d_n, cdigo: d_cdigo) Clave Primaria: {netapa, cdigo} CAj: {netapa} hace referencia a ETAPA CAj: {dorsal} hace referencia a CICLISTA CAj: {cdigo} hace referencia a MAILLOT VNN: {dorsal}
Ciclismo
Equipo nomeq director Ciclista dorsal nombre edad Llevar dorsal netapa codigo Maillot codigo tipo premio color
Etapa
netapa km salida llegada dorsal
nomeq
Puerto nompuerto
altura categoria pendiente netapa dorsal
Esquema de Prcticas.
EJEMPLO: Obtener el nombre y la altura de todos los puertos de 1 categora. 1. En qu tablas se encuentra la informacin? 2. Qu condicin deben cumplir las filas resultantes? 3. Que informacin queremos visualizar? 4. Queremos ordenar el resultado por alguna columna?
EJEMPLO: Obtener el nombre de los ciclistas cuya edad est entre 20 y 30 aos.
SELECT nombre FROM Ciclista WHERE edad BETWEEN 20 AND 30;
(*) El predicado BETWEEN es equivalente a una condicin con comparaciones de la siguiente forma: exp between exp1 and exp2 ! (exp >= exp1) and (exp <= exp2)
EJEMPLO: Obtener el nmero de las etapas donde el nombre de la ciudad de llegada tenga por segunda letra una O o donde el nombre de la ciudad de salida lleve dos o ms As.
SELECT netapa FROM Etapa WHERE llegada LIKE _O% OR salida LIKE %A%A%;
EJEMPLO: Obtener el nombre de los puertos de 1, 2 o 3 categora. SELECT nompuerto FROM Puerto
WHERE categora IN ( 1, 2, 3 ) ;
(*) Tambin el predicado IN es derivado y la expresin equivalente es: exp in (exp1, exp2, , expn) ! (exp=exp1) or (exp=exp2) oror (exp=expn)
EJEMPLO: Obtener todos los datos de aquellos ciclistas de los que se desconoca su edad.
SELECT * FROM Ciclista WHERE edad IS NULL;
Ejemplo de consulta incorrecta (error de sintaxis) SELECT nomeq FROM Equipo WHERE director = null La consulta correcta sera SELECT nomeq FROM Equipo WHERE director IS NULL
MS EJEMPLOS DE COMPARACIONES
Uso de operadores aritmticos: + (suma), - (diferencia), * (producto), / (divisin), etc. EJEMPLO: Obtener de los maillots el tipo y el premio en dlares (supongamos que est en pesetas) ($1 = 150 ptas.) de aquellos maillots cuyo premio supere los 100 dlares. SELECT tipo, premio / 150 FROM Maillot WHERE premio / 150 > 100;
Uso de LIKE
EJEMPLO: Obtener el nombre y la edad de los ciclistas que pertenezcan a equipos cuyo nombre contenga la cadena 100%. SELECT nombre, edad FROM Ciclista WHERE nomeq LIKE %100\%% ESCAPE \ Se ha utilizado \ para indicar que el carcter comodn tiene su valor %
Las funciones agregadas no se pueden anidar. Para las funciones SUM y AVG los argumentos deben ser numricos. DISTINCT indica que los valores redundantes sean eliminados antes de que se realice el clculo correspondiente. La funcin especial COUNT(*), en la que no est permitido incluir DISTINCT ni ALL, da como resultado el cardinal del conjunto de filas de la seleccin. Los clculos se realizan despus de la seleccin y aplicar las condiciones. Los valores nulos son eliminados antes de realizar los clculos (incl. count). Si el nmero de filas de la seleccin es 0, la funcin COUNT devuelve el valor 0 y las otras funciones el valor nulo.
En consultas no agrupadas, la seleccin slo podr incluir referencias a funciones agregadas o literales ya que las funciones van a devolver un nico valor. EJEMPLO INCORRECTO:
SELECT nombre, AVG(edad) FROM Ciclista WHERE nomeq = ONCE;
Ejercicios:
Prctica 3: El lenguaje SQL (1a Parte) Hacer el bloque de consultas sobre una sola relacin de las bases de datos Ciclismo y Msica
EJEMPLO: Obtener pares de nmeros de etapas y nombres de puertos ganados por el mismo ciclista.
T2 n
d1 b2
T1 x T2 n
X X X "! X X
n
c1 c2 c1 c2 c1 c2 d1 b2 d1 b2 d1 b2
a1 a1 a2 a2 a3 a3
b1 b1 b2 b2 b3 b3
Cuando se va a trabajar con una tabla para hacer consulta entre diferentes tuplas de ella, entonces se utilizan las variables de recorrido
[tabla | variable_recorrido].columna
Es una instancia de la tabla. Es virtual
"!
Por tanto, permiten dar un nombre alternativo a la misma tabla dentro de una consulta. La manera de declarar una variable de recorrido es:
10
EJEMPLO: Obtener el nombre de los ciclistas compaeros de equipo de Miguel Indurin que sean ms jvenes que l.
11
Ejercicios: Prctica 3: El lenguaje SQL (1a Parte) Hacer el bloque de consultas sobre varias tablas de las bases de datos Ciclismo y Msica
12
EJEMPLO: Obtener los nombres de los ciclistas pertenecientes al equipo dirigido por lvaro Pino.
Antes, se haban usado igualdades: SELECT C.nombre FROM Ciclista C, Equipo E WHERE C.nomeq = E.nomeq AND E.director = lvaro Pino; Usando subconsultas, sera: SELECT C.nombre FROM Ciclista C C.nomeq = (SELECT E.nomeq FROM Equipo E WHERE E.director = lvaro Pino); WHERE
Esto es posible porque la informacin que se requiere, nombre del ciclista, no est en la tabla de la subconsulta (Equipo) y porque la subconsulta
13
nica fila y el nmero de columnas coincida en nmero y tipo con el otro lado del predicado de comparacin.
Llamaremos constructor_fila a una lista de atributos entre parntesis o una subconsulta. constructor_fila predicado_comparacin constructor_fila En el caso que la subconsulta est vaca, se convierte a una fila con valores nulos en todas las columnas. Para poder comparar dos constructor_fila de ms de una columna, existe una forma definida de realizar esta comparacin para cada uno de los predicados de comparacin (=, <>, >, <, <=, >=). Pero, en general se vern subconsultas de una nica columna, como el ejemplo anterior.
EJEMPLO: Obtener los nombres de los puertos cuya altura es mayor que la media de altura de los puertos de 2 categora.
14
EJEMPLO: Obtener los nombres de los puertos cuya altura es mayor que la media de altura de los puertos de 2 categora. 1. En qu tablas se encuentra la informacin? Puerto
==> FROM Puerto
15
Predicado IN
Comprueba que un valor pertenece a una coleccin dada mediante una subconsulta
constructor_fila [not] IN(expresin_tabla) A la derecha de IN puede aparecer ms de una fila y por eso se denomina expresin_tabla. EJEMPLO: Obtener el n de las etapas ganadas por ciclistas con edad superior a los 30 aos.
SELECT netapa FROM Etapa WHERE dorsal IN (SELECT dorsal FROM Ciclista WHERE edad > 30);
EJEMPLO: Obtener el nmero de las etapas ganadas por ciclistas que pertenezcan a equipos cuyo director tenga un nombre que empiece por A. SELECT netapa FROM Etapa WHERE dorsal IN (SELECT dorsal FROM Ciclista WHERE nomeq IN (SELECT nomeq FROM Equipo WHERE director LIKE A%));
16
EJEMPLO: Obtener el nombre de los puertos y de los ciclistas que los hayan ganado que tengan la mayor pendiente.
SELECT P.nompuerto, C.nombre FROM Puerto P, Ciclista C WHERE P.dorsal = C.dorsal AND P.pendiente >= ALL (SELECT P1.pendiente FROM Puerto P1 )
EJEMPLO: Obtener el nombre de los puertos y de los ciclistas que los hayan ganado, cumpliendo que el puerto no sea el que tenga la menor pendiente.
SELECT P.nompuerto, C.nombre FROM Puerto P, Ciclista C WHERE P.dorsal = C.dorsal AND P.pendiente > ANY (SELECT P1.pendiente FROM Puerto P1 )
(*) Cualquier ANY se puede convertir en un ALL cambiando la condicin a su condicin negada y aadiendo un NOT. NOT ( P.pendiente < ALL (SELECT P1.pendiente FROM Puerto P1 ) )
17
Predicado EXISTS
EXISTS (expresin_tabla) !El predicado EXISTS se evala a cierto si la expresin SELECT devuelve al menos una fila. !En general, IN y EXISTS son intercambiables y se pueden eliminar haciendo consultas a mltiples tablas e igualando por claves ajenas.
EJEMPLO: Obtener el nombre de aquellos ciclistas que han llevado un maillot de un premio menor de 120 euros.
SELECT C.nombre FROM Ciclista C, Llevar L WHERE C.dorsal = L.dorsal AND EXISTS (SELECT * FROM Maillot M WHERE M.premio < 120 AND M.codigo = L.codigo)
O bien:
SELECT C.nombre FROM Ciclista C, Llevar L WHERE C.dorsal = L.dorsal AND L.codigo IN (SELECT M.codigo FROM Maillot M WHERE M.premio < 120 )
18
WHERE NOT EXISTS (SELECT * FROM !) equivale a: WHERE 0 = (SELECT COUNT(*) FROM !)
Ejercicios: Prctica 3: El lenguaje SQL (1a Parte) Hacer el bloque de consultas con subconsultas de las bases de datos Ciclismo y Msica
19
El lenguaje SQL
20
El lenguaje SQL
qu pasa si en el departamento de un profesor PX no hay asignaturas de mas de 6 crditos? FALSO para todo valor de AX
{PX.nombre| Profesor (PX) #
$AX ((Asignatura (AX) # AX.cod_dep= PX.cod_dep # (AX.teora+AX.prac)>6) ' &DX (Docencia (DX) #
DX.cod_pro = PX.cod_pro # DX.cod_asg = AX.cod_asg) ) }
CIERTO
El lenguaje SQL
Si estos profesores no deben salir en la consulta, entonces se debe hacer un control para comprobar que en el departamento del profesor existe alguna asignatura de mas de seis crditos!.
{PX.nombre| Profesor (PX) # &AX (Asignatura (AX) # AX.cod_dep= PX.cod_dep # (AX.teora+AX.prac)>6) # $AX ( (Asignatura (AX) # AX.cod_dep= PX.cod_dep # (AX.teora+AX.prac)>6) ' &DX (Docencia (DX) # DX.cod_pro = PX.cod_pro # DX.cod_asg = AX.cod_asg) ) }
21
El lenguaje SQL.
SELECT PX.nombre FROM Profesor PX WHERE EXISTS (SELECT * FROM Asignatura AX WHERE AX.cod_dep=PX.cod_dep AND (AX.teora+AX.prac)>6)
SQL
AND
NOT EXISTS (SELECT * FROM Asignatura AX WHERE AX.cod_dep= PX.cod_dep AND (AX.teora+AX.prac)>6
AND
NOT EXISTS (SELECT * FROM Docencia DX WHERE DX.cod_pro=PX.cod_pro AND DX.cod_asg=AX.cod_asg) ) )
22
Para poder expresar esta consulta en SQL se convertir en: Obtener el nombre del ciclista tal que no existe una etapa de ms de 200 km. que l no haya ganado SELECT nombre FROM Ciclista C WHERE NOT EXISTS (SELECT * FROM Etapa E WHERE km > 200 AND C.dorsal <> E.dorsal );
Solucin: SELECT C.nombre FROM Ciclista C WHERE NOT EXISTS (SELECT * FROM Etapa E WHERE E.km > 200 AND C.dorsal <> E.dorsal ) AND EXISTS (SELECT * FROM ETAPA E2 WHERE E2.km > 200);
23
Ejercicios: Prctica 3: El lenguaje SQL (1a Parte) Hacer el bloque de consultas con cuantificacin universal de las BDs Ciclismo y Msica
AUTOR(autor_id: tira(4), nombre: tira(35), nacionalidad: tira(20)) Clave Primaria: {autor_id} LIBRO(id_lib: tira(10), titulo: tira(80), ao: entero, num_obras: entero) Clave Primaria: {id_lib} VNN: {titulo} TEMA(tematica: tira(20), descripcion: tira(50)) Clave Primaria: {tematica} OBRA(cod_ob: entero, titulo: tira(80), ao: d_cat, tematica: tira(20)) Clave Primaria: {cod_ob} Clave Ajena: {tematica}' TEMA VNN: {titulo} AMIGO(num: entero, nombre: tira(60), telefono: tira(10)) Clave Primaria: {num} VNN: {nombre} PRESTAMO(num: entero, id_lib:tira(10)) Clave Primaria: {num,id_lib} Clave Ajena: {num} ' AMIGO Clave Ajena: {id_lib} ' LIBRO
Biblioteca
ESTA_EN(cod_ob: entero, id_lib:tira(10)) Clave Primaria: {cod_ob,id_lib} Clave Ajena: {cod_ob} ' OBRA Clave Ajena: {id_lib} ' LIBRO ESCRIBIR(cod_ob: entero, autor_id:tira(4)) Clave Primaria: {cod_ob,autor_id} Clave Ajena: {cod_ob}' OBRA Clave Ajena: {autor_id}' AUTOR
24
Consultas Agrupadas
SELECT [ALL | DISTINCT] A1i, A2j,..., Ank| * FROM R1, R2, ..., Rn [WHERE condicin] [GROUP BY B1, B2,..., Bm] [HAVING condicin]
GROUP BY: define grupos de tuplas en el conjunto de tuplas seleccionadas por la condicin WHERE. Los grupos se definen por la igualdad de valor en los atributos de agrupacin (B1, B2,..., Bm). HAVING: de los grupos definidos se seleccionan aquellos que cumplen la condicin expresada.
EJEMPLO: Obtener el nombre de cada equipo y la edad media de los ciclistas de dicho equipo:
Edad 22 25 32 25 28 30 29 28
25
Las funciones agregadas en las consultas agrupadas funcionan de forma diferente que en las consultas normales, devolviendo un valor por cada grupo formado.
Nomeq Banesto Banesto Banesto ONCE ONCE PDM Kelme Kelme Edad 22 25 28 25 30 32 29 28
26
Consultas Agrupadas
EJEMPLO: Obtener el nmero total de profesores de cada departamento
Profesor
cod_pro JCC RFC JBD MAF CPG JTM IGP DGT MCG nombre Juan C. Casamayor R!denas Robert Fuster i Capilla Jos"V. Benlloch Dualde Mar# a Alpuente Frasnedo Cristina P" rez Guillot Jos"M. Torralba Mart# nez Ignacio Gil Pechu$n Daniel Gil Tom$s Matilde Celma Gim" nez tel! fono 7796 6789 5760 3560 7439 4590 3423 5679 7756 cod_dep DSIC MAT DISCA DSIC IDM OEM OEM DISCA DSIC
Consultas Agrupadas
Obtener el nmero total de profesores de los departamentos que tienen mas de 2 profesores.
cod_pro JCC RFC JBD MAF CPG JTM IGP DGT MCG nombre Juan C. Casamayor R!denas Robert Fuster i Capilla Jos"V. Benlloch Dualde Mar# a Alpuente Frasnedo Cristina P" rez Guillot Jos"M. Torralba Mart# nez Ignacio Gil Pechu$n Daniel Gil Tom$s Matilde Celma Gim" nez tel! fono 7796 6789 5760 3560 7439 4590 3423 5679 7756 cod_dep DSIC MAT DISCA DSIC IDM OEM OEM DISCA DSIC
cod_dep DSIC 3
SELECT cod_dep, COUNT (*) FROM Profesor GROUP BY cod_dep HAVING COUNT (*) > 2
27
EJEMPLO INCORRECTO: SELECT nomeq, nombre, AVG(edad) FROM Ciclista GROUP BY nomeq;
La regla sintctica que aplican los sistemas relacionales para asegurar el buen funcionamiento de las consultas agrupadas es la siguiente: En la seleccin de una consulta agrupada, slo pueden aparecer referencias a columnas por las cuales se agrupa, referencias a funciones agregadas o literales.
GROUP y WHERE
Si se incluye la clusula where, la aplicacin de esta clusula se produce previamente a la agrupacin.
4 1 2 3
SELECT nomeq, AVG(edad) FROM Ciclista WHERE edad > 25 GROUP BY nomeq;
28
Evaluacin:
1) Se seleccionan n tuplas de las relaciones que cumplan la condicin de la clusula WHERE. 2) En el conjunto de tuplas seleccionadas se definen grupos basados en el valor de los atributos de agrupacin. 3) De los grupos definidos se seleccionan los que cumplen la condicin de la clusula HAVING.
29
EJEMPLO: Obtener el nombre de cada equipo y la edad media de sus ciclistas con ms de 25 aos, de aquellos equipos con ms de 3 corredores mayores de 25 aos.
SELECT nomeq, AVG(edad) FROM Ciclista WHERE edad > 25 GROUP BY nomeq HAVING COUNT(dorsal) > 3;
EJEMPLO: Obtener el nombre del ciclista y el nmero de puertos que ha ganado, siendo la media de la pendiente de stos superior a 10. SELECT C.nombre, COUNT(P.nompuerto) FROM Ciclista C, Puerto P WHERE C.dorsal = P.dorsal GROUP BY C.dorsal, C.nombre /* Agrupar siempre por CP */ HAVING AVG (P.pendiente) >10;
30
Ejercicios: Prctica 3: El lenguaje SQL (1a Parte) Hacer el bloque de consultas agrudapas de las BDs Ciclismo y Msica
COMBINACIONES DE TABLAS
Existen otras formas de combinar varias tablas en consultas y todas ellas, junto con las ya vistas, dan lugar a una expresin de tabla. Existen, en definitiva, varias formas de combinar dos tablas en el lenguaje SQL: " ! '! Incluir varias tablas en la clusula from. "! '! Uso de subconsultas en las condiciones de las clusulas where o having. '! Combinaciones conjuntistas de tablas: utilizando operadores de la teora de conjuntos para combinar las tablas. '! Concatenaciones de tablas: utilizando diferentes formas variantes del operador concatenacin del lgebra Relacional.
31
lgebra Relacional
R Donde F R [Ai , Aj ..., Ak] R1 x R2, ... x Rn
SQL
SELECT ... FROM R WHERE F SELECT Ai , Aj ..., Ak FROM R SELECT ... FROM R1, R2, ..., Rn, o SELECT...FROM R1 CROSS JOIN R2, ..., CROSS JOIN Rn SELECT... FROM R1 NATURAL JOIN R2 SELECT * FROM R1 UNION SELECT * FROM R2 SELECT * FROM R1 EXCEPT SELECT * FROM R2 SELECT * FROM R1 INTERSECT SELECT * FROM R2
R1 R2 R1 ( R2 R1 - R2 R1 ) R2
compatibles
32
UNION
expresin_tabla union [ALL] trmino_tabla
Realiza la unin de las filas de las tablas provenientes de las dos expresiones. Se permitirn o no duplicados segn se incluya o no la opcin ALL. EJEMPLO: Obtener el nombre de todo el personal de la vuelta. (SELECT nombre FROM Ciclista) UNION (SELECT director FROM Equipo)
UNION
Ejemplo 2. Obtener el nombre de todo el personal (profesores y directores de departamento).
SELECT director FROM Departamento UNION SELECT nombre FROM Profesor
33
INTERSECT
expresin_tabla intersect trmino_tabla
Realiza la interseccin de las filas de las tablas provenientes de las dos expresiones. EJEMPLO: Obtener los nombres de las personas que son tanto ciclistas como directores de equipo . (SELECT nombre FROM Ciclista) INTERSECT (SELECT director FROM Equipo)
INTERSECT
Ejemplo 2. Obtener los departamentos que tienen adscritas asignaturas y profesores.
SELECT DISTINCT cod_dep FROM Profesor INTERSECT SELECT DISTINCT cod_dep FROM Asignatura
34
EXCEPT
expresin_tabla except trmino_tabla En Oracle es Minus
Realiza la diferencia de las filas de las tablas provenientes de las dos expresiones. EJEMPLO: Obtener los nombres que aparecen en la tabla de ciclistas y no en la de directores. (SELECT nombre FROM Ciclista) MINUS (SELECT director FROM Equipo)
EXCEPT
Ejemplo 2. Obtener los departamentos que no tienen adscritas asignaturas.
SELECT cod_dep FROM Departamento EXCEPT SELECT DISTINCT cod_dep FROM Asignatura
35
Concatenacin de tablas
SELECT [ALL | DISTINCT] A1i,...,A2j,...,Ank| * FROM R concatenacin 1, R2, ..., Rde n tablas [WHERE condicin] [GROUP BY B1, B2,..., Bm] [HAVING condicin]
#!concatenacin interna: INNER JOIN #!concatenacin externa: OUTER JOIN
Concatenacin de tablas
Corresponden a variantes del operador concatenacin del lgebra Relacional. ! Producto cartesiano CROSS JOIN
! Concatenacin interna NATURAL JOIN ! Concatenacin externa LEFT, RIGHT, FULL ! Concatenacin unin UNION JOIN
36
Producto Cartesiano
(CROSS JOIN)
!
SELECT * from referencia_tabla1,
referencia_tabla2
#!La tabla resultado de la operacin CROSS JOIN es el producto cartesiano de las dos tablas operandos.
Concatenacin Interna
referencia_tabla1 [natural] [inner] join referencia_tabla2 [on expresin_condicional | using (comalista_columna) ] tabla1 join tabla2 on expresin_condicional SELECT * FROM tabla1, tabla2 WHERE expresin_condicional
#!Natural Join: se concatenan las tuplas de tabla1 y tabla2 que tienen el mismo valor en todos los atributos del mismo nombre #!Join...ON: combina una fila de cada operando cuando la condicin expresada se evale a cierta. #!Inner Join... USING: combina una fila de cada operando cuando el valor en las columnas comunes es idntico.
37
SELECT cod_pro, nombre, COUNT (cod_asg) FROM Profesor NATURAL JOIN Docencia GROUP BY cod_pro
#!Natural Join: se concatenan las tuplas de Profesor y Docencia que tienen el mismo valor en los atributos del mismo nombre (cod_pro)
Concatenacin JOIN...USING
SELECT [ALL | DISTINCT] A1, A2,..., An| * FROM
tabla1 JOIN tabla2 USING (C1, C2,..., Cn) [WHERE condicin] [GROUP BY B1, B2,..., Bm] [HAVING condicin]
se concatenan las tuplas de tabla1 y tabla2 que tienen el mismo valor en los atributos comunes C1, C2,..., Cn
Es til cuando no interesa que las relaciones se concatenen por todos los atributos del mismo nombre (NATURAL JOIN).
38
Concatenacin JOIN...ON
SELECT [ALL | DISTINCT] A1, A2,..., An| * FROM
tabla1 JOIN tabla2 ON condicin1 [WHERE condicin2] [GROUP BY B1, B2,..., Bm] [HAVING condicin]
Ejemplo: Obtener nombre y director de todos los equipos que tengan ciclistas. Forma ya conocida: SELECT e.nomeq, e.director FROM Equipo E, Ciclista C WHERE E.nomeq=C.nomeq
!
Empleo del JOIN:
SELECT e.nomeq, e.director FROM Equipo E JOIN Ciclista C ON E.nomeq=C.nomeq
39
Concatenacin Externa
referencia_tabla [natural] {left [outer] | right [outer] | full [outer] } JOIN referencia_tabla [on expresin_condicional | using (comalista_columna) ] FULL, se muestran las tuplas no concatenadas de tabla1 y tabla2
union
(tuplas de la tabla1 que no estn en la concatenacin interna con valores nulos en el resto de columnas)
40
Concatenacin Unin
referencia_tabla union join referencia_tabla
Crea una tabla donde el esquema es la unin de los esquemas de las dos tablas, que pueden ser distintos.
EJERCICIO 33: Obtener nombre de todos los equipos indicando cuantos ciclistas tiene cada uno
1 Opcin (errnea) 21 filas SELECT e.nomeq, count(c.dorsal) FROM Equipo E, Ciclista C WHERE E.nomeq=C.nomeq GROUP BY e.nomeq 2 Opcin Correcta 22 filas SELECT E.nomeq, count(c.dorsal) FROM (EQUIPO E left join ciclista c on E.NOMEQ=C.NOMEQ) GROUP BY E.nomeq;
41
EJERCICIO 33: Obtener nombre de todos los equipos indicando cuantos ciclistas tiene cada uno
3 Opcin Correcta 22 filas SELECT e.nomeq, count(c.dorsal) FROM Equipo E, Ciclista C WHERE E.nomeq=C.nomeq (+) GROUP BY e.nomeq
Se pone (+) en la parte de la ICA de la tabla de la que no se quieren mantener las tuplas
42