2. Lenguajes de Query relacional
• Uno de los principales beneficios del modelo relacional:
soporta simples y potentes queries de datos.
• Dos sublenguajes:
• DDL – Data Definition Language (Lenguaje de Definición de
Datos)
– Define y modifica el esquema
• DML – Data Manipulation Language (Lenguaje de
Manipulación de Datos)
– Los queries pueden ser escritos intuitivamente
• El DBMS es responsable de hacer una evaluación eficiente.
– La clave: semántica precisa para queries relacionales.
– Permitir al optimizador reordenar o cambiar operaciones, y
asegurarse que el resultado no cambie.
3. El lenguaje de Query SQL
• El lenguaje de query relacional más usado
– El estándar actual es SQL-1999
• No está completamente soportado
• Introduce conceptos de “Objeto-Relacional” (y muchos
más)
– SQL-200x se encuentra en proceso
– SQL-92 es un subset básico
• La mayoría de los sistemas soportan un medio
– Soporte e integración de XML es el próximo
desafío para SQL
5. Operaciones de retrieve (Select)
• La operación de proyección ( ) en el lenguaje
de consulta SQL se realiza simplemente
especificando el subconjunto de atributos en
la cláusula SELECT.
• Formato Básico:
SELECT (nombres de columnas o *)
FROM (nombre(s) de tablas)
6. • Por ejemplo, si tenemos la siguiente tabla PROFESORES:
• La siguiente sentencia SELECT hace una proyección del
nombre y los apellidos.
SELECT nombre, apellidos
FROM PROFESORES
Es importante notar que la siguiente sentencia devolvería dos tuplas repetidas:
SELECT nombre FROM profesores
En SQL SELECT, el default es que los
duplicados no son eliminados!
(El resultado es llamado un “multiset”)
Para asegurar que el resultado no contenga duplicados, hay que utilizar el
modificador DISTINCT:
SELECT DISTINCT nombre FROM profesores
(El resultado es llamado un “set”)
7. • En SQL, la selección ( ) se especifica
mediante la cláusula WHERE.
• Formato Básico Completo:
SELECT (nombres de columnas o *)
FROM (nombre(s) de tablas)
[WHERE (condiciones)];
Para encontrar los estudiantes de 18 años en
la tabla Estudiantes, podemos escribir:
SELECT *
FROM Estudiantes E
WHERE E.edad=18
•Para encontrar solo los nombres y
logins, reemplazar la primera línea:
SELECT E.nombre, E.login
8. • Si tenemos dividida la información de los profesores antiguos y los
nuevos en dos, pero queremos obtener un listado histórico de
todos ellos, podemos utilizar el operador UNION ( ) de SQL.
SELECT * FROM PROFESORES
UNION
SELECT * FROM EX-PROFESORES
• El operador UNION requiere que los atributos de las relaciones
devueltas por las dos SELECT sean del mismo tipo según el orden de
aparición. Si en una de las tablas este orden fuese diferente, habría
que utilizar una proyección que alterase el orden. Los nombres de
atributos de la nueva relación serán los de la primera SELECT.
Como la unión, la intersección ( ) solo puede aplicarse a relaciones con atributos
compatibles.
La siguiente consulta en SQL por tanto debería devolver una relación vacía:
SELECT * FROM PROFESORES
INTERSECT
SELECT * FROM EX-PROFESORES
9. • El producto cruz de dos relaciones en SQL se
obtiene simplemente colocando más de una tabla
en la cláusula FROM.
SELECT * FROM PROFESORES, DEPARTAMENTOS
• El producto cartesiano raramente se utiliza en la
práctica, pero es interesante conocerlo para
diferenciarlo de la operación de combinación
(join).
10. Joins (Queries de múltiples tablas)
• Por ejemplo, si queremos obtener la información de
Estudiantes y Registros combinada, utilizaremos como
combinación la igualdad de la clave foránea en
REGISTROS con la clave primaria en ESTUDIANTES:
SELECT E.nombre, R.cid
FROM Estudiantes E, Registros R
WHERE E.eid=R.eid AND R.nota=‘B'
En SQL, el join se hace incluyendo más de una relación en la cláusula FROM, y la
condición se coloca como cláusula WHERE.
resultado =
11. • La semántica de un Query SQL es definida en términos de la
siguiente estrategia de evaluación conceptual:
1. FROM: computa el producto-cruz de las tablas(ej., Estudiantes
y Registros).
2. WHERE : Revisa condiciones, descarta tuplas que fallan.
(llamado “selección”).
3. SELECT : Borra columnas que no se quieren. (llamado
"proyección”).
4. Si se especifica DISTINCT, elimina filas duplicadas.
• Probablemente la manera menos eficiente de realizar un query!
– Un optimizador encontraría estrategias más eficientes para
devolver el mismo resultado.
Semánticas del Query
12. Paso 1 – Producto Cruz
E.eid E.nombre E.login E.edad E.prom R.eid R.cid R.nota
53666 Jones jones@cs 18 3.4 53831 Carnatic101 C
53666 Jones jones@cs 18 3.4 53832 Reggae203 B
53666 Jones jones@cs 18 3.4 53650 Topology112 A
53666 Jones jones@cs 18 3.4 53666 History105 B
53688 Smith smith@ee 18 3.2 53831 Carnatic101 C
53688 Smith smith@ee 18 3.2 53831 Reggae203 B
53688 Smith smith@ee 18 3.2 53650 Topology112 A
53688 Smith smith@ee 18 3.2 53666 History105 B
SELECT E.nombre, R.cid
FROM Estudiantes E, Registros R
WHERE E.eid=R.eid AND R.nota=‘B'
13. Paso 2. descartar tuplas que fallan
S.sid S.name S.login S.age S.gpa E.sid E.cid E.grade
53666 Jones jones@cs 18 3.4 53831 Carnatic101 C
53666 Jones jones@cs 18 3.4 53832 Reggae203 B
53666 Jones jones@cs 18 3.4 53650 Topology112 A
53666 Jones jones@cs 18 3.4 53666 History105 B
53688 Smith smith@ee 18 3.2 53831 Carnatic101 C
53688 Smith smith@ee 18 3.2 53831 Reggae203 B
53688 Smith smith@ee 18 3.2 53650 Topology112 A
53688 Smith smith@ee 18 3.2 53666 History105 B
SELECT E.nombre, R.cid
FROM Estudiantes E, Registros R
WHERE E.eid=R.eid AND R.nota=‘B'
14. Paso 3. Descartar Columnas no requeridas
S.sid S.name S.login S.age S.gpa E.sid E.cid E.grade
53666 Jones jones@cs 18 3.4 53831 Carnatic101 C
53666 Jones jones@cs 18 3.4 53832 Reggae203 B
53666 Jones jones@cs 18 3.4 53650 Topology112 A
53666 Jones jones@cs 18 3.4 53666 History105 B
53688 Smith smith@ee 18 3.2 53831 Carnatic101 C
53688 Smith smith@ee 18 3.2 53831 Reggae203 B
53688 Smith smith@ee 18 3.2 53650 Topology112 A
53688 Smith smith@ee 18 3.2 53666 History105 B
SELECT S.name, E.cid
FROM Students S, Enrolled E
WHERE S.sid=E.sid AND E.grade=‘B'
15. sid snombre rating edad
22 Dustin 7 45.0
31 Lubber 8 55.5
95 Bob 3 63.5
bid bnombre color
101 Interlake azul
102 Interlake rojo
103 Clipper verde
104 Marine rojo
sid bid dia
22 101 10/10/96
95 103 11/12/96
Reservacion
Marineros
Botes
Utilizaremos estas
instancias de
relación en los
ejemplos.
Seleccionar el nombre
de los marineros
que reservaron el
bote 103
16. Solución: Un Query Join
(sid) snombre rating edad (sid) bid dia
22 dustin 7 45.0 22 101 10/10/96
22 dustin 7 45.0 58 103 11/12/96
31 lubber 8 55.5 22 101 10/10/96
31 lubber 8 55.5 58 103 11/12/96
95 Bob 3 63.5 22 101 10/10/96
95 Bob 3 63.5 95 103 11/12/96
SELECT snombre
FROM Marineros, Reservacion
WHERE Marineros.sid=Reservacion.sid
AND bid=103
17. Algunas notas sobre Variables de Rango
• Se pueden asociar “variables de rango” con las tablas
en la clausula FROM.
– Simplificar la escritura, hace los queries fáciles de
entender
• Necesarios cuando se presenta ambigüedad.
– Por ejmplo, si la misma tabla se usa muchas veces
en FROM (llamado un “join-propio”, “self join”)
SELECT M.snombre
FROM Marineros M, Reservacion R
WHERE M.sid=R.sid AND bid=103
SELECT snombre
FROM Marineros, Reservacion
WHERE Marineros.sid=Reservacion.sid
AND bid=103
Se puede reescribir
utilizando variables
de rango:
18. Más Notas
• Un ejemplo donde las variables de rango son
requeridas(ejemplo de self-join):
• La lista de objetivos puede ser reemplazada por
“*” si no se quiere hacer una proyección:
SELECT x.snombre, x.edad, y.snombre, y.edad
FROM Marineros x, Marineros y
WHERE x.edad > y.edad
SELECT *
FROM Marineros x
WHERE x.edad > 20
19. Encuentre los marineros que han reservado
por lo menos un bote
SELECT M.sid
FROM Marineros M, Reservacion R
WHERE M.sid=R.sid
20. Tipos de Joins
Se necesita especificar el tipo de join a menos que
sea un INNER join
(INNER es default)
SELECT (lista_de_columnas)
FROM nombre_tabla
[INNER | {LEFT |RIGHT | FULL } OUTER] JOIN nombre_tabla
ON lista_clasificaciones
WHERE …
21. Inner Join
Solo las filas que coinciden con las condiciones de búsqueda son
devueltas.
SELECT s.sid, s.nombre, r.bid
FROM Marineros s INNER JOIN Reservacion r
ON s.sid = r.sid
Retorna solo los marineros que han reservado botes.
SQL-92 también permite:
SELECT s.sid, s.nombre, r.bid
FROM Marineros s NATURAL JOIN Reservacion r
“NATURAL” significa equi-join para cada par de atributos con el
mismo nombre
22. SELECT s.sid, s.nombre, r.bid
FROM Marineros s INNER JOIN Reservacion r
ON s.sid = r.sid
s.sid s.snombre r.bid
22 Dustin 101
95 Bob 103
sid snombre rating edad
22 Dustin 7 45.0
31 Lubber 8 55.5
95 Bob 3 63.5
sid bid dia
22 101 10/10/96
95 103 11/12/96
23. Left Outer Join
Left Outer Join retorna todas las filas que
coinciden, más todas las filas que no coinciden de la
tabla en la parte izquierda de la clausula join
(usa nulls en los campos de tuplas que no coinciden)
SELECT s.sid, s.nombre, r.bid
FROM Marineros s LEFT OUTER JOIN Reservacion r
ON s.sid = r.sid
Devuelve todos los marineros e información de que si
han reservado botes
24. SELECT s.sid, s.nombre, r.bid
FROM Marineros s LEFT OUTER JOIN Reservacion r
ON s.sid = r.sid
s.sid s.nombre r.bid
22 Dustin 101
95 Bob 103
31 Lubber
sid snombre rating edad
22 Dustin 7 45.0
31 Lubber 8 55.5
95 Bob 3 63.5
sid bid dia
22 101 10/10/96
95 103 11/12/96
25. Right Outer Join
Right Outer Join retorna todas las filas que
coinciden, más todas las filas que no coinciden de
la tabla en la parte derecha de la clausula join
SELECT r.sid, b.bid, b.bnombre
FROM Reservacion r RIGHT OUTER JOIN Botes b
ON r.bid = b.bid
Devuelve todos los botes e información de cuales
han sido reservados
26. SELECT r.sid, b.bid, b.name
FROM Reserves r RIGHT OUTER JOIN Boats b
ON r.bid = b.bid
r.sid b.bid b.nombre
22 101 Interlake
102 Interlake
95 103 Clipper
104 Marine
sid bid dia
22 101 10/10/96
95 103 11/12/96
bid bnombre color
101 Interlake azul
102 Interlake rojo
103 Clipper verde
104 Marine rojo
27. Full Outer Join
Full Outer Join devuelve (coincidan o no coincidan) filas
de las tablas en ambos lados de la clausula join
SELECT r.sid, b.bid, b.bnombre
FROM Reservacion r FULL OUTER JOIN Botes b
ON r.bid = b.bid
Devuelve todos los botes e información de reservaciones
28. SELECT r.sid, b.bid, b.bnombre
FROM Reservacion r FULL OUTER JOIN Botes b
ON r.bid = b.bid
r.sid b.bid b.nombre
22 101 Interlake
102 Interlake
95 103 Clipper
104 Marine
sid bid dia
22 101 10/10/96
95 103 11/12/96
bid bnombre color
101 Interlake blue
102 Interlake red
103 Clipper green
104 Marine red
30. Is null
• Los valores en una tupla a veces son
desconocidos(ej., un rating o teléfono no se ha
asignado) o inaplicable(ej., no hay nombre de
esposo).
– SQL provee el valor especial null para esas situaciones.
SELECT snombre, edad
FROM Marineros
WHERE rating IS NULL;
31. Expresiones
• Se pueden usar expresiones aritméticas en la clausula SELECT
(además de otras operaciones que se discutirán más adelante)
• Se utiliza AS para proveer nombres de columnas
• También se puede tener expresiones en la clausula WHERE:
SELECT S.edad, S.edad-5 AS edad1, 2*S.edad AS edad2
FROM Marineros S
WHERE S.snombre= ‘Dustin’
SELECT S1.snombre AS nombre1, S2.snombre AS nombre2
FROM Marineros S1, Marineros S2
WHERE 2*S1.rating = S2.rating - 1
32. Operadores String
`_’ significa para cualquier otro caracter y`%’ significa para 0 u
otros caracteres arbitrarios.
SELECT S.edad, S.edad-5 AS edad1, 2*S.edad AS edad2
FROM Marineros S
WHERE S.snombre LIKE ‘B_%b’
•SQL tambien soporta algunas operaciones de string
•“LIKE” es usado para igualdad de strings.