Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Bases de Datos
Resumen: Consultas Básicas
1. Relaciones Temporales
2. Clausula WITH
3. Tabla Temporary
4. Operaciones Join
• Sintaxis:
SELECT <attributes>
FROM R1, R2, (SELECT … ) <alias>, …, RN WHERE
<condition>;
SELECT *
FROM (SELECT fname, lname, salary
FROM employee
WHERE sex = ‘M’) r1
WHERE r1.salary > 50000;
Detalles de la Relación Temporal
• Sintaxis:
WITH <alias> AS (SELECT …)[,
<alias2> AS (SELECT …)]
SELECT <query>;
WITH r1 as ( SELECT *
FROM employee
WHERE fname = ‘John’
AND lname = ‘Smith’)
SELECT *
FROM dependent
WHERE essn IN (SELECT ssn from r1);
Detalles de la clausula WITH
• Alternativas:
• Relación TEMPORAL
• Tabla TEMPORARY
• Sintaxis:
r1 JOIN r2 ON <join-condition>;
o
r1 INNER JOIN r2 ON <join-condition>;
Consulta en el AR:
⇡fname,lname ( dname=‘Research’ )(EMPLOYEE ./dno=dnumber D
EPARTMENT)
Consulta SQL:
• Sintaxis:
r1 LEFT | RIGHT| FULL [OUTER] JOIN r2 on <join condition>;
• Sintaxis:
r1 NATURAL JOIN r2;
• Ejemplo:
SELECT *
FROM works_on NATURAL JOIN dependent;
Consulta SQL: CROSS JOIN
• Sintaxis:
r1 CROSS JOIN r2;
• Ejemplo:
SELECT ssn, fname, lname, dno, dnumber, dname
FROM employee CROSS JOIN dependent;
SQL: Join Implicito vs Join Explicito
• ¿Cual es la diferencia?
• SELECT * SELECT *
FROM table1 a INNER vs FROM table1 a, table2 b
JOIN table2 b ON a.id WHERE a.id = b.id;
= b.id;
(SELECT pname
FROM project, works_on, employee
WHERE pnumber = pno
AND essn = ssn AND lname = ‘Smith’)
UNION
(SELECT pname
FROM project, works_on, employee
WHERE pnumber = pno
AND essn = ssn AND lname = ‘Borg’);
Ejemplo: UNION (2)
Listar todos los nombres de proyectos que involucren a un
empleado cuyo apellido es 'Smith', ya sea como trabajador o
como gerente del departamento que controla el proyecto.
(SELECT pname
FROM project, department, employee
WHERE dnum = dnumber AND mgrssn = ssn
AND lname = ‘Smith’)
UNION
(SELECT pname
FROM project, works_on, employee
WHERE pnumber = pno AND essn = ssn
AND lname = ‘Smith’);
SQL: Más allá de la Union
x IN (set1 - set2)
SELECT ssn
FROM employee
WHERE ssn IN ( SELECT ssn
FROM employee, department
WHERE dno = dnumber
AND dname = ‘Research’)
AND ssn NOT IN ( SELECT essn
FROM dependent);
QFT: Superset
SELECT …
FROM …
WHERE NOT EXISTS (SELECT *
FROM <table>
WHERE x IN set2
AND x NOT IN set1);
QFT: Subset
¿Cómo formular que el set1 es un subset (parte de) de
otro conjunto, digamos set2?
SELECT …
FROM …
WHERE NOT EXISTS (SELECT *
FROM <table>
WHERE x IN set1
AND x NOT IN set2);
Subset vs Superset
(SELECT *
(SELECT *
FROM <table> FROM <table>
WHERE x IN set2
WHERE x IN set1
AND x NOT IN set1) AND x NOT IN set2)
set1 superset of set2 set1 subset of set2
QFT: Division
• ¿Cómo calcular la división entre dos relaciones?
• AR:
H1 = ⇡pnumber (PROJECT ./dnum=dnumber dnumber=4 (DEPARTMENT))
H2 = ⇡essn,pno (WORKS ON)
H3 = H2 ÷ H1
Answer = ⇡fname,lname (EMPLOYEE ./ssn = ssn H3)
QFT: Division
SELECT pname
FROM project
WHERE NOT EXISTS
( SELECT ssn
FROM employee
WHERE ssn IN (SELECT essn
empleados que
FROM works_on
trabajan en el
WHERE pno = pnumber) proyecto p
AND ssn NOT IN (SELECT ssn
empleados del FROM employee, department
WHERE dno = dnumber
departamento AND dname = ‘Research’));
Research
QFT: Mayor número de
• ¿Cómo calcular las consultas que piden por el mayor número
de algún atributo?
SELECT dname
FROM department, employee
WHERE dno = dnumber
GROUP BY dname
HAVING COUNT(ssn) = (SELECT MAX(no_emp) FROM
(SELECT COUNT(ssn) AS no_emp
FROM employee GROUP BY dno) ce);
Ejercicios SQL (1)
• Relación Temporal
• Clausula WITH
• Tabla Temporary
• Operaciones JOIN