Академический Документы
Профессиональный Документы
Культура Документы
Lenguaje SQL
1ª Parte: Manipulación de
Bases de Datos
Objetivos
• Presentar
la sintaxis del lenguaje SQL (sólo del Lenguaje
de Manipulación).
• Ver
algunos ejemplos sencillos para clarificar la semántica
del SQL.
• Presentar
las bases de datos CICLISMO, MÚSICA y
BIBLIOTECA.
• Realizar
de menor a mayor complejidad consultas SQL
sobre dichas bases de datos.
• Realizar
todo lo anterior usando la herramienta SQL del
sistema de gestión de bases de datos ORACLE.
1
Lenguaje de Manipulación del SQL
Se presentan las instrucciones que se pueden ejecutar desde un
intérprete de SQL, lo que se denomina SQL interactivo.
SQL es un lenguaje muy expresivo y, en general, permite muchas
formas de expresar las mismas órdenes.
Las cuatro instrucciones que componen el lenguaje de manipulación
de datos son las siguientes:
SELECT: permite la declaración de consultas para la recuperación de
información de una o más tablas de una base de datos.
INSERT: realiza la inserción de una o varias filas sobre una tabla.
DELETE: permite efectuar el borrado de una o varias filas de una
tabla.
UPDATE: realiza una modificación de los valores de una o más
columnas de una o varias filas de una tabla.
2
1.1.1. Condiciones en consultas simples
SELECT [ALL | DISTINCT] comalista_ítem_seleccionado | *
FROM tabla
[WHERE expresión_condicional]
[ORDER BY comalista_referencia_col]
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 (nºetapa: d_nº, km: d_km, salida: d_sal, llegada: d_lleg, dorsal: d_dor)
Clave Primaria: {nºetapa}
CAj: {dorsal} hace referencia a CICLISTA
PUERTO (nombre:d_nom,altura:d_alt,categoría:d_cat, nºetapa:d_nº,dorsal: d_dor)
Clave Primaria: {nombre}
CAj: {nºetapa} hace referencia a ETAPA
CAj: {dorsal} hace referencia a CICLISTA
VNN: {nºetapa}
MAILLOT (código: d_código, tipo: d_tipo, premio: d_pre, color: d_col)
Clave Primaria: {código}
LLEVAR (dorsal: entero, nºetapa: d_nº, código: d_código)
Clave Primaria: {nºetapa, código}
CAj: {nºetapa} hace referencia a ETAPA
CAj: {dorsal} hace referencia a CICLISTA
CAj: {código} hace referencia a MAILLOT
VNN: {dorsal}
3
Ciclismo
Maillot
Equipo
codigo
nomeq
Ciclista tipo
director Llevar
dorsal
dorsal premio
nombre
netapa color
edad
codigo
Etapa nomeq
Puerto
netapa
nompuerto
km
altura
salida
categoria
llegada
pendiente
dorsal
netapa
Esquema de Prácticas. dorsal
4
EJEMPLO: Obtener el nombre y la edad de todos los
ciclistas.
SELECT nombre, edad FROM Ciclista;
5
COMPARACIÓN DE VALORES NULOS
Las comparaciones entre cualquier valor y NULL resultan
en indefinido. Ejemplo:
select *
from T
where atrib1 > atrib2
Si en una fila se diera el caso que atrib1 = 50 y atrib2 fuera
nulo, el resultado de la comparación sería indefinido y por
tanto dicha fila no se incluiría en la selección.
6
MÁS EJEMPLOS DE COMPARACIONES
Uso de operadores aritméticos: + (suma), - (diferencia), *
(producto), / (división), etc.
EJEMPLO: Obtener de los maillots el tipo y el premio en dólares
(supongamos que está en pesetas) ($1 = 150 ptas.) de aquellos maillots
cuyo premio supere los 100 dólares.
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 carácter comodín tiene su valor ‘%’
7
FUNCIONES AGREGADAS EN CONSULTAS NO
AGRUPADAS
EJEMPLO:
SELECT ‘Núm. de ciclistas =’, COUNT(*), ‘Media Edad =’,
AVG(edad)
FROM Ciclista
WHERE nomeq = ‘Banesto’;
En consultas no agrupadas, la selección sólo 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:
Práctica 3: El lenguaje SQL (1a Parte)
Hacer el bloque de consultas sobre una sola relación
de las bases de datos Ciclismo y Música
8
CONSULTAS SIMPLES SOBRE VARIAS TABLAS
Cuando la información que se desea obtener de la base
de datos se encuentra almacenada en más de una tabla
se hace indispensable el declarar una consulta que
manipule estas tablas.
9
Ejemplo: SELECT * FROM T1, T2 WHERE T1.n = T2.n
T1 T2
n n
a1 b1 c1 d1
a2 b2 c2 b2
a3 b3
T1 x T2
n n
X a1 b1 c1 d1
X a1 b1 c2 b2
X a2 b2 c1 d1
√ a2 b2 c2 b2
X a3 b3 c1 d1
X a3 b3 c2 b2
[tabla | variable_recorrido].columna
Es una instancia de la tabla. Es virtual
10
EJEMPLO: Obtener el nombre de los ciclistas compañeros de equipo
de ‘Miguel Induráin’ que sean más jóvenes que él.
1. ¿En qué tablas se encuentra la información?
FROM Ciclista Pero, como se requiere comparar con tuplas de la misma tabla,
entonces se necesita tener varias imágenes de ella
FROM Ciclista C1, Ciclista C2
2. ¿Qué condición deben cumplir las filas resultantes?
WHERE C2.nombre=‘Miguel Induráin’ AND C1.nomeq = C2.nomeq
AND C1.edad < C2.edad;
3. ¿Qué información queremos visualizar?
SELECT DISTINCT C1.nombre
SELECT DISTINCT C1.nombre FROM Ciclista C1, Ciclista C2
==> WHERE C2.nombre=‘Miguel Induráin’ AND C1.nomeq =
C2.nomeq AND C1.edad < C2.edad;
11
Ejercicios:
Práctica 3: El lenguaje SQL (1a Parte)
Hacer el bloque de consultas sobre varias
tablas de las bases de datos Ciclismo y Música
12
EJEMPLO: Obtener los nombres de los ciclistas pertenecientes
al equipo dirigido por ‘Álvaro Pino’.
Antes, se habían usado igualdades:
SELECT C.nombre FROM Ciclista C, Equipo E
WHERE C.nomeq = E.nomeq AND E.director = ‘Álvaro Pino’;
13
PREDICADOS DE COMPARACIÓN (=, <>, >, <, >=, <=)
Cada uno de los dos lados de un predicado de comparación debe ser una única
tupla formada por el mismo número de columnas. Es decir:
(A1, A2, …, An) predicado_comparación (B1, B2, …, Bn)
Las subconsultas pueden ser argumentos, siempre y cuando devuelvan una
única fila y el número de columnas coincida en número y tipo con el
otro lado del predicado de comparación.
Llamaremos constructor_fila a una lista de atributos entre paréntesis o una
subconsulta.
constructor_fila predicado_comparación constructor_fila
En el caso que la subconsulta esté vacía, se convierte a una fila con valores
nulos en todas las columnas.
Para poder comparar dos constructor_fila de más de una columna, existe una
forma definida de realizar esta comparación para cada uno de los predicados de
comparación (=, <>, >, <, <=, >=). Pero, en general se verán subconsultas de
una única columna, como el ejemplo anterior.
14
EJEMPLO: Obtener los nombres de los puertos cuya altura es
mayor que la media de altura de los puertos de 2ª categoría.
15
Predicado IN
Comprueba que un valor pertenece a una colección dada mediante una
subconsulta
constructor_fila [not] IN(expresión_tabla)
A la derecha de IN puede aparecer más de una fila y por eso se
denomina expresión_tabla.
16
Predicados de comparación cuantificados (ALL, ANY)
Permiten comparar un valor con un conjunto de valores.
17
Predicado EXISTS
EXISTS (expresión_tabla)
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
EJEMPLO: Obtener el nombre de los ciclistas que no han ganado
etapas.
Ejercicios:
Práctica 3: El lenguaje SQL (1a Parte)
Hacer el bloque de consultas con subconsultas
de las bases de datos Ciclismo y Música
19
Uso de EXISTS para cuantificación universal (NO HAY EN
SQL)
∀ X F(X) ≡ ∃ X F(X)
Obtener el nombre de los profesores que imparten todas
las asignaturas.
SELECT P.nombre
FROM Profesor P
WHERE NOT EXISTS (SELECT * FROM Asignatura A
WHERE NOT EXISTS (SELECT *
FROM Docencia D
WHERE D.cod_pro=P.cod_pro ∧
D.cod_asg=A.cod_asg))
El lenguaje SQL
Problemas con la cuantificación universal
Obtener el nombre de los profesores que imparten todas las
asignaturas de su departamento de mas de 6 créditos.
20
El lenguaje SQL
¿qué pasa si en el departamento de
un profesor PX no hay asignaturas
de mas de 6 créditos?
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 créditos!.
21
El lenguaje SQL.
SELECT PX.nombre
SQL
FROM Profesor PX
WHERE EXISTS (SELECT *
FROM Asignatura AX
WHERE AX.cod_dep=PX.cod_dep AND (AX.teoría+AX.prac)>6)
AND
NOT EXISTS (SELECT * FROM Asignatura AX
WHERE AX.cod_dep= PX.cod_dep AND (AX.teoría+AX.prac)>6
AND
NOT EXISTS (SELECT * FROM Docencia DX
WHERE DX.cod_pro=PX.cod_pro AND
DX.cod_asg=AX.cod_asg) ) )
∀ X F(X) ≡ ∃ X F(X)
C.nombre| Ciclista(C)∧∀ X
(Etapa(X)∧X.Km>200→C.dorsal=X.dorsal)
es equivalente a:
C.nombre| Ciclista(C)∧
∃X(Etapa(X)∧X.Km>200∧C.dorsal<>X.dorsal)
22
Para poder expresar esta consulta en SQL se convertirá en:
“Obtener el nombre del ciclista tal que no existe una etapa de
más de 200 km. que él no haya ganado”
Solución:
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:
Práctica 3: El lenguaje SQL (1a Parte)
Hacer el bloque de consultas con cuantificación
universal de las BDs Ciclismo y Música
Biblioteca
AUTOR(autor_id: tira(4), nombre: tira(35), nacionalidad: tira(20))
Clave Primaria: {autor_id}
LIBRO(id_lib: tira(10), titulo: tira(80), año: 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), año: d_cat, tematica: tira(20))
Clave Primaria: {cod_ob}
Clave Ajena: {tematica}→ TEMA
VNN: {titulo}
24
Consultas Agrupadas
SELECT [ALL | DISTINCT] A1i, A2j,..., Ank| *
FROM R1, R2, ..., Rn
[WHERE condición]
[GROUP BY B1, B2,..., Bm]
[HAVING condición]
Consultas Complejas
Relación Selección-Agrupamiento
Un grupo se puede entender como un conjunto de filas con el mismo
valor para el conjunto de columnas por las que se agrupa (las incluidas
en la cláusula GROUP BY).
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 Edad
Banesto 22
Banesto 25
Banesto 28
ONCE 25 Un Valor
ONCE 30 por Grupo
PDM 32
Kelme 29
Kelme 28
La solución, es:
Nomeq Edad
Banesto 25
ONCE 27,5
PDM 32
Kelme 28,5
26
Consultas Agrupadas
EJEMPLO: Obtener el número total de profesores de cada departamento
Profesor
cod_pro nombre tel!fono cod_dep
JCC Juan C. Casamayor R!denas 7796 DSIC
RFC Robert Fuster i Capilla 6789 MAT cod_dep
Consultas Agrupadas
Obtener el número total de profesores de los departamentos que tienen
mas de 2 profesores.
cod_pro nombre tel!fono cod_dep
JCC Juan C. Casamayor R!denas 7796 DSIC
RFC Robert Fuster i Capilla 6789 MAT cod_dep
27
EJEMPLO INCORRECTO:
GROUP y WHERE
28
Evaluación:
29
EJEMPLO: Obtener el nombre de cada equipo y la edad
media de sus ciclistas con más de 25 años, de aquellos
equipos con más de 3 corredores mayores de 25 años.
30
Ejercicios:
Práctica 3: El lenguaje SQL (1a Parte)
Hacer el bloque de “consultas agrudapas” de las BDs
Ciclismo y Música
COMBINACIONES DE TABLAS
Existen otras formas de combinar varias tablas en consultas y
todas ellas, junto con las ya vistas, dan lugar a una “expresión de
tabla”.
Existen, en definitiva, varias formas de combinar dos tablas en el
√ lenguaje SQL:
→ Incluir varias tablas en la cláusula from.
√ → Uso de subconsultas en las condiciones de las cláusulas
where o having.
→ Combinaciones conjuntistas de tablas: utilizando
operadores de la teoría de conjuntos para combinar las
tablas.
→ Concatenaciones de tablas: utilizando diferentes formas
variantes del operador concatenación del Álgebra
Relacional.
31
El Lenguaje Estándar SQL
Operador Álgebra SQL
Relacional
Selección R Donde F SELECT ... FROM R WHERE F
Producto R1 x R2, ... x Rn SELECT ... FROM R1, R2, ..., Rn, o
Cartesiano SELECT...FROM R1 CROSS JOIN
R2, ..., CROSS JOIN Rn
Concatenación R1 R2 SELECT... FROM R1 NATURAL JOIN R2
32
UNION
expresión_tabla union [ALL] término_tabla
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
expresión_tabla intersect término_tabla
INTERSECT
34
EXCEPT
expresión_tabla except término_tabla
En Oracle es Minus
Realiza la diferencia de las filas de las tablas
provenientes de las dos expresiones.
EXCEPT
SELECT cod_dep
FROM Departamento
EXCEPT
SELECT DISTINCT cod_dep
FROM Asignatura
35
Concatenación de tablas
Concatenación de tablas
Corresponden a variantes del operador concatenación del
Álgebra Relacional.
36
Producto Cartesiano
(CROSS JOIN)
≡
SELECT * from referencia_tabla1,
referencia_tabla2
Concatenación Interna
37
Ejemplo- Natural Join
SELECT PX.cod_pro, PX.nombre, COUNT(DX.cod_asg)
FROM Profesor PX, Docencia DX
WHERE PX.cod_pro = DX.cod_pro concatenación de
Profesor y Docencia
GROUP BY cod_pro
Concatenación JOIN...USING
SELECT [ALL | DISTINCT] A1, A2,..., An| *
FROM tabla1 JOIN tabla2 USING (C1, C2,..., Cn) (1)
[WHERE condición] (2)
(3)
[GROUP BY B1, B2,..., Bm]
(4)
[HAVING condición]
38
Concatenación JOIN...ON
SELECT [ALL | DISTINCT] A1, A2,..., An| *
FROM tabla1 JOIN tabla2 ON condición1 (1)
[WHERE condición2] (2)
(3)
[GROUP BY B1, B2,..., Bm]
(4)
[HAVING condición]
Es útil cuando:
interesa concatenar tuplas de tabla1 y tabla2 por condiciones
distintas de la igualdad.
los atributos por los que se desea concatenar no tienen el mismo
nombre en ambas relaciones.
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
Concatenación Externa
referencia_tabla [natural]
{left [outer] |
right [outer] |
full [outer] } JOIN referencia_tabla
[on expresión_condicional | using
(comalista_columna) ]
40
Concatenación Unión
41
EJERCICIO 33: Obtener nombre de todos los equipos
indicando cuantos ciclistas tiene cada uno
42