SlideShare a Scribd company logo
1 of 32
SQL (Data Retrieve Language)
Lenguaje de Recuperación de Datos
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.
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
Conversión de operaciones de
algebra relacional en SQL
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)
• 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”)
• 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
• 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
• 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).
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 =
• 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
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'
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'
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'
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
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
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:
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
Encuentre los marineros que han reservado
por lo menos un bote
SELECT M.sid
FROM Marineros M, Reservacion R
WHERE M.sid=R.sid
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 …
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
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
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
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
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
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
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
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
Expresiones de restricción
especial
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;
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
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.

More Related Content

What's hot

Consultas sql 2014
Consultas sql 2014Consultas sql 2014
Consultas sql 2014Henry Cambal
 
Combinacion de consultas y consultas multitablas
Combinacion de consultas y consultas multitablasCombinacion de consultas y consultas multitablas
Combinacion de consultas y consultas multitablasclaudia contreras
 
Introducción a Sql
Introducción a SqlIntroducción a Sql
Introducción a Sqlalexmerono
 
Sql Consultas MáS Complejas
Sql Consultas MáS ComplejasSql Consultas MáS Complejas
Sql Consultas MáS Complejasalexmerono
 
Unidad 6 Lenguaje Sql 2
Unidad 6 Lenguaje Sql 2Unidad 6 Lenguaje Sql 2
Unidad 6 Lenguaje Sql 2Sergio Sanchez
 
Unidad 6 Lenguaje Sql 4 (Consultas Dml Avanzado)
Unidad 6 Lenguaje Sql 4 (Consultas Dml Avanzado)Unidad 6 Lenguaje Sql 4 (Consultas Dml Avanzado)
Unidad 6 Lenguaje Sql 4 (Consultas Dml Avanzado)Sergio Sanchez
 
Objeto De Aprendizaje
Objeto De AprendizajeObjeto De Aprendizaje
Objeto De Aprendizajegviera
 
Manual sql
Manual sqlManual sql
Manual sqlHicar
 
Sql y programacion en access 2010
Sql y programacion en access 2010Sql y programacion en access 2010
Sql y programacion en access 2010Juanito Edgar
 
Objeto De Aprendizaje
Objeto De AprendizajeObjeto De Aprendizaje
Objeto De Aprendizajegviera
 
Sentencias Sql
Sentencias SqlSentencias Sql
Sentencias Sqlfer951
 
Clente servidor consultas sql
Clente servidor consultas sqlClente servidor consultas sql
Clente servidor consultas sqlDiego Bladimir
 

What's hot (19)

Sql Sentencias
Sql Sentencias Sql Sentencias
Sql Sentencias
 
Consultas sql 2014
Consultas sql 2014Consultas sql 2014
Consultas sql 2014
 
Combinacion de consultas y consultas multitablas
Combinacion de consultas y consultas multitablasCombinacion de consultas y consultas multitablas
Combinacion de consultas y consultas multitablas
 
Introducción a Sql
Introducción a SqlIntroducción a Sql
Introducción a Sql
 
Sql Consultas MáS Complejas
Sql Consultas MáS ComplejasSql Consultas MáS Complejas
Sql Consultas MáS Complejas
 
Unidad 6 Lenguaje Sql 2
Unidad 6 Lenguaje Sql 2Unidad 6 Lenguaje Sql 2
Unidad 6 Lenguaje Sql 2
 
Unidad 6 Lenguaje Sql 4 (Consultas Dml Avanzado)
Unidad 6 Lenguaje Sql 4 (Consultas Dml Avanzado)Unidad 6 Lenguaje Sql 4 (Consultas Dml Avanzado)
Unidad 6 Lenguaje Sql 4 (Consultas Dml Avanzado)
 
Introduccion al sql query
Introduccion al sql queryIntroduccion al sql query
Introduccion al sql query
 
Objeto De Aprendizaje
Objeto De AprendizajeObjeto De Aprendizaje
Objeto De Aprendizaje
 
Manual sql
Manual sqlManual sql
Manual sql
 
Consultas básicas en sql server
Consultas básicas en sql serverConsultas básicas en sql server
Consultas básicas en sql server
 
Consultas sql
Consultas sqlConsultas sql
Consultas sql
 
Sql y programacion en access 2010
Sql y programacion en access 2010Sql y programacion en access 2010
Sql y programacion en access 2010
 
SQL para IEDA
SQL para IEDASQL para IEDA
SQL para IEDA
 
Sql
SqlSql
Sql
 
Objeto De Aprendizaje
Objeto De AprendizajeObjeto De Aprendizaje
Objeto De Aprendizaje
 
Sentencias Sql
Sentencias SqlSentencias Sql
Sentencias Sql
 
Expo
ExpoExpo
Expo
 
Clente servidor consultas sql
Clente servidor consultas sqlClente servidor consultas sql
Clente servidor consultas sql
 

Similar to Sql1 (20)

Tutorial sql
Tutorial sqlTutorial sql
Tutorial sql
 
Sql Basico
Sql BasicoSql Basico
Sql Basico
 
Sql
SqlSql
Sql
 
Consultas sql
Consultas sqlConsultas sql
Consultas sql
 
05 Sql Profundizacion
05 Sql Profundizacion05 Sql Profundizacion
05 Sql Profundizacion
 
Actividad2 capitulo I contenido
Actividad2 capitulo I  contenidoActividad2 capitulo I  contenido
Actividad2 capitulo I contenido
 
Consultas basicas en sql server
Consultas basicas en sql serverConsultas basicas en sql server
Consultas basicas en sql server
 
Lenguaje transact sql
Lenguaje transact sqlLenguaje transact sql
Lenguaje transact sql
 
SQL-b.pdf
SQL-b.pdfSQL-b.pdf
SQL-b.pdf
 
(2)_sesión_2_construir_base_datos_FINAL(mixta)_v1.2023-1.pdf
(2)_sesión_2_construir_base_datos_FINAL(mixta)_v1.2023-1.pdf(2)_sesión_2_construir_base_datos_FINAL(mixta)_v1.2023-1.pdf
(2)_sesión_2_construir_base_datos_FINAL(mixta)_v1.2023-1.pdf
 
Sql b
Sql bSql b
Sql b
 
Fundamentos sql
Fundamentos sqlFundamentos sql
Fundamentos sql
 
Tarea 8 consultas
Tarea 8 consultasTarea 8 consultas
Tarea 8 consultas
 
Tutorial SQL
Tutorial SQLTutorial SQL
Tutorial SQL
 
Comandos mysql
Comandos mysqlComandos mysql
Comandos mysql
 
Anon manual sql
Anon   manual sqlAnon   manual sql
Anon manual sql
 
Sql1 2
Sql1 2Sql1 2
Sql1 2
 
Sql
SqlSql
Sql
 
Seleccion de datos
Seleccion de datosSeleccion de datos
Seleccion de datos
 
Sql basico parte_i_
Sql basico parte_i_Sql basico parte_i_
Sql basico parte_i_
 

More from vanessaicm (11)

Sql4
Sql4Sql4
Sql4
 
Sql3
Sql3Sql3
Sql3
 
Sql2
Sql2Sql2
Sql2
 
7 ar
7 ar7 ar
7 ar
 
6 n2
6 n26 n2
6 n2
 
5 n
5 n5 n
5 n
 
4 ml
4 ml4 ml
4 ml
 
3 mcr
3 mcr3 mcr
3 mcr
 
2 mc
2 mc2 mc
2 mc
 
8 ar2
8 ar28 ar2
8 ar2
 
1 intro
1 intro1 intro
1 intro
 

Sql1

  • 1. SQL (Data Retrieve Language) Lenguaje de Recuperación de Datos
  • 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
  • 4. Conversión de operaciones de algebra relacional en 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.