0% encontró este documento útil (0 votos)
126 vistas

SQL Parte 1

Este documento describe consultas SQL básicas en una sola tabla, consultas multi-tablas y consultas anidadas. Explica la sintaxis básica de una consulta SELECT-FROM-WHERE y cómo seleccionar, proyectar y combinar tablas usando JOIN. También cubre operadores como DISTINCT, WHERE, LIKE e IN y cómo ordenar resultados con ORDER BY.
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
126 vistas

SQL Parte 1

Este documento describe consultas SQL básicas en una sola tabla, consultas multi-tablas y consultas anidadas. Explica la sintaxis básica de una consulta SELECT-FROM-WHERE y cómo seleccionar, proyectar y combinar tablas usando JOIN. También cubre operadores como DISTINCT, WHERE, LIKE e IN y cómo ordenar resultados con ORDER BY.
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 85

Consultas SQL

Bases de Datos
Contenido
1. Consultas básicas de una sola tabla
 Consulta Select-From-Where
 Operadores en la clausula Where
2. Consultas Multi-tablas
 Join
 Aliasing
3. Consultas Anidadas
 Tipos de consultas anidadas
 Agrupación y Funciones de Agregación
Consulta SQL

La sintaxis básica de una consulta SQL:


Bloque SELECT-FROM-WHERE

SELECT <attribute list>


FROM <table list>
WHERE <condition on the tables>
Consulta SQL <—> Algebra Relational

producto
SELECT <attribute list>
cartesiano de las
FROM <table list>
relaciones
WHERE <condition on the tables>
condiciones de la forma attr1 op constant/attr2
No elimina duplicados
como el SELECT en el
algebra relacional
⇡<attribute list> <condition> (R1 ⇥ R2 ⇥ · · · ⇥ Rn )
Ejemplo: Product Database

PRODUCT
Name Category Price Manufacter
iPad Tablet $399.00 Apple
Surface Tablet $299.00 Microsoft
Kindle eReader $79.00 Amazon
Macbook Air Laptop $999.99 Apple
Consulta SQL Básica: * SELECTOR
• Selecciona todos los valores de todas las tuplas de
una relación

• Ejemplo:
SELECT * (Product)
FROM Product;
Name Category Price Manufacter
iPad Tablet $399.00 Apple
Surface Tablet $299.00 Microsoft
Kindle eReader $79.00 Amazon
Macbook Air Laptop $999.99 Apple
Selección usando *
Category=‘Tablet’ (Product)
SELECT *
FROM Product
WHERE Category = ‘Tablet’;

Name Category Price Manufacter


iPad Tablet $399.00 Apple
Surface Tablet $299.00 Microsoft
Proyección

SELECT Name, Category ⇡Name,Category (Product)


FROM Product;

Name Category
iPad Tablet
Surface Tablet
Kindle eReader
Macbook Air Laptop
Selección y Proyección
SELECT Name, Category

FROM Product

WHERE Manufactor = ‘Apple’


Name Category
iPad Tablet
Macbook Air Laptop
Detalles de SQL

• Los comandos en SQL son "case insensitive"

 SELECT = select = Select

• Los valores son "case sensitive"

 Apple =/= apple

• Las constantes de cadenas de caracteres van entre


comillas simples

 ‘Apple’ en lugar “Apple”


Ejercicios: Company Database Diagram
Ejercicios: Company Database

• Recuperar la fecha de nacimiento y la dirección del


empleado cuyo nombre es 'John B. Smith'

• Listar el SSN, el apellido y el número de departamento


de todos los empleados

• Listar el número de departamento y el nombre de


todos los departamentos

• Listar los proyectos que están bajo el control del


departamento número 5
DISTINCT: Elimina Duplicados
• SQL produce valores duplicados por defecto

 Una relación (tabla) es un multi-conjunto (bag) de


tuplas vs un conjunto (set) de tuplas

 En favor de la eficiencia de las bases de datos


Elimina valores duplicados
• Sintaxis:
SELECT DISTINCT <attr list>
FROM <table>;
Ejemplo de consulta: DISTINCT
Category
• SELECT Category Tablet
FROM Product; Tablet
eReader
Laptop

Category
• SELECT DISTINCT Category Tablet
FROM Product; eReader
Laptop
Detalles de SQL: Condición WHERE

SELECT <attribute list>



¿Qué puede ir aquí?
FROM <table list>

WHERE <condition on the tables>

• Nombre de atributos de la/s relación/es usadas en


la clausula FROM

• Operadores de comparación: =, <>, <, >, <=, >=

• Operaciones aritméticas: +, -, *, /
Detalles de SQL: Condición WHERE

• Operadores lógicos para combinar condiciones: AND,


OR, NOT

• Operadores sobre cadenas de caracteres (ejemplo,


concatenación)

• Test de pertenencia

• Pattern matching
IN: Test de pertenencia a un conjunto

• Determina si un valor esta contenido en un conjunto

 True si el valor del atributo es un miembro de un


conjunto de valores

 False en caso contrario

• Sintaxis:
SELECT <attr list>
FROM <table>
WHERE attr IN (set of values);
Ejemplo de consultas: IN
• Buscar el nombre y el precio de los productos fabricados
por Amazon o Microsoft:
SELECT name, price
FROM Product
WHERE Manufacter IN (‘Amazon’, ‘Microsoft’);

• Buscar el nombre de los productos fabricados por


Amazon o Microsoft y son tablets:
SELECT name
FROM Product
WHERE (Manufacter, Category) IN ((‘Amazon’, ‘Tablet’),
(‘Microsoft’, ‘Tablet’));
LIKE: Simple String Pattern Matching
• Sintaxis:
Substring comparison
SELECT *
for partial strings
FROM Products
WHERE Name LIKE ‘%Air’;

• Soporta 2 comodines
 Underscore (_) matches exactly one character
(equivalent to ? in the UNIX shell)

 Percent (%) matches 0 or more characters


(equivalent to * in the UNIX shell)
Ejemplo de consultas: LIKE
• Buscar nombres de productos cuyo nombre de
fabricante comience con ‘A’:
SELECT name
FROM Product
WHERE Manufacter LIKE ’A%’;

• Buscar el nombre y el precio de productos que


contengan la palabra Air:
SELECT name, price
FROM Product
WHERE name LIKE ‘%Air%;
SQL: IS NULL

• Determina si un atributo contiene el valor NULL

• Sintaxis:
attr IS NULL

• Ejemplo: Buscar empleados que tienen el valor NULL en


el atributo salario
SELECT *
FROM employee
WHERE salary IS NULL;
SQL: NOT IN y IS NOT NULL

• Determina si un valor no esta contenido en un conjunto


no contiene un valor NULL respectivamente

• La sintaxis es similar a los operadores IN, IS NULL:


attr NOT IN (set of values)
attr IS NOT NULL
SQL: Three-Value Logic
AND TRUE FALSE UNKNOWN
TRUE TRUE FALSE UNKNOWN
FALSE FALSE FALSE FALSE
UNKNOWN UNKNOWN FALSE UNKNOWN

OR TRUE FALSE UNKNOWN


TRUE TRUE TRUE TRUE
FALSE TRUE FALSE UNKNOWN
UNKNOWN TRUE UNKNOWN UNKNOWN

NOT TRUE FALSE UNKNOWN


FALSE TRUE UNKNOWN
SQL: ORDER BY

• Ordena las tuplas en una consulta basada en los


valores de algunos atributos

• El orden por defecto es el orden ascendentes de los


valores (ASC)
• Sintaxis: Ordenamiento por
SELECT <attribute list> múltiple columnas
FROM <table list> separadas por una coma
WHERE <condition on the tables>
ORDER BY <attribute-list> ASC | DESC;
Ejemplo de consulta: ORDER BY
• Ordenar los empleados por el valor de sus salarios en
orden descendente:
SELECT fname, lname, salary
FROM employee
ORDER BY salary DESC;

• Ordenar los empleados por el valor de sus salarios, y


para salarios con el mismo valor, por sus apellidos.
SELECT fname, lname, salary
FROM employee
ORDER BY salary, lname;
SQL: LIMIT
• Limita el resultado a una cantidad especificada de tuplas

 Útil si la tabla tiene muchas tuplas y solo se quiere hacer


un "sanity check" de la consulta

 Puede ser usado con ORDER BY para obtener un valor


máximo o mínimo.

• Sintaxis:
SELECT <attribute list>
FROM <table list>
WHERE <condition on the tables>
LIMIT <number of tuples>;
Ejercicios: Company Database (2)

• ¿Cuáles son los nombres y apellidos de los empleados


que viven en Houston?

• ¿Cuáles son los SSNs de los 5 mejores empleados que


trabajaron más horas en el proyecto número 30? Listar
en orden descendente

• ¿Por que números de departamentos están


controlados los proyectos ProductX, ProductY y
ProductZ??
Consultas Multi-tablas
Resumen: Consulta SQL

SELECT <attribute list>


FROM <table list>
WHERE <condition on the tables>

⇡<attribute list> <condition> (R1 ⇥ R2 ⇥ · · · ⇥ R n )


Ejemplo: Operación Producto Cartesiano

SELECT ssn, lname, dno, dnumber, dname


FROM employee, department;
ssn lname dno dnumber dname
111-12-2345 Kirk 5 5 Research
111-12-2345 Kirk 5 4 Administration
111-12-2345 Kirk 5 1 Headquarters
222-23-2222 McCoy 4 5 Research
222-23-2222 McCoy 4 4 Administration
222-23-2222 McCoy 4 1 Headquarters
… … … … …
134-52-2340 Scott 5 5 Research
134-52-2340 Scott 5 4 Administration
134-52-2340 Scott 5 1 Headquarters
SQL: Operación Join
• Expresión en el Álgebra Relacional
R1 ./condition R2 = condition (R1 ⇥ R2 )

• Producto Cartesiano seguido por una operación selección

• Comando SQL

 La clausula FROM especifica la operación producto


cartesiano

 La clausula WHERE especifica la condición de la


operación selección
Ejemplo de consulta: Join

SELECT ssn, lname, dno, dnumber, dname


FROM employee, department
WHERE dno = dnumber;

ssn lname dno dnumber dname


111-12-2345 Kirk 5 5 Research
222-23-2222 McCoy 4 4 Administration
134-23-2345 Sulu 4 4 Administration
234-13-3840 Chapel 1 1 Headquarters
134-52-2340 Scott 5 5 Research
SQL: Join (2)

• Distintas maneras equivalentes de escribir un join básico

• Método 1: es simplemente utilizar el producto cartesiano


en la clausula FROM junto con la condición en el WHERE
(llamado join implícito)

• Método 2: sintaxis de join explicito


SELECT <attribute list>
FROM <table1> JOIN <table2> ON <join condition>
WHERE <condition on the tables>
Ejemplo de consulta: Join (2)

SELECT ssn, lname, dno, dnumber, dname


FROM employee, department
WHERE dno = dnumber;

SELECT ssn, lname, dno, dnumber, dname


FROM employee JOIN department ON dno=dnumber;
Ejemplo de consulta: Join en el AR

Consulta: Buscar el nombre, el apellido y la dirección de los


empleados que trabajan en el departamento ‘Research’

Expresión en el Álgebra Relacional


RD = Dname=‘Research’ (DEPARTMENT)
RE = RD ./Dnumber = Dno EMPLOYEE
Answer = ⇡fname,lname,address (RE)
Ejemplo de consulta: Join en SQL
Consulta: Buscar el nombre, el apellido y la dirección de los
empleados que trabajan en el departamento ‘Research’

• Expresión SQL 1
SELECT fname, lname, address
FROM employee, department
WHERE dname=‘Research’ AND dno = dnumber;
• Expresión SQL 2 join condition
SELECT fname, lname, address
FROM employee JOIN
department ON dno = dnumber
WHERE dname=‘Research’; selection condition
Ejercicios: Company Database (3)

• Encontrar el nombre de los empleados en el


departamento 'Research' que ganan más de $30,000

• Encontrar el nombre de los empleados que trabajan en el


proyecto 'ProductX'

• Para los proyectos ubicados en ‘Stafford’, buscar el


nombre del proyecto, el nombre del departamento que lo
controla, el apellido del gerente del departamento, su
dirección y fecha de nacimiento
SQL: Ambigüedad

¿Qué sucede si queremos listar los empleados con


el nombre de las personas a cargo y los proyectos
en los que trabaja el empleado?

SELECT essn, name, pno


FROM Dependent, Works_on
WHERE essn = essn;
Nombres de atributos ambiguos: el mismo
nombre para dos o más atributos en
diferentes relaciones
SQL: Calificando nombres de atributos

• Para evitar ambigüedad se puede agregar el nombre de


la relación como prefijo del nombre a cada atributo (de lo
contrario no se puede decir a qué relación corresponde)

• Calificar (prefijar) el nombre del atributo con el nombre de


la relación origen

 Se puede hacer en las clausulas SELECT o WHERE

• Sintaxis SQL: <relation>.<attr>


Ejemplo: Calificando nombres de atributos

Buscar los números de proyectos en los cuales trabajan


empleados que tienen una hija llamada ‘Alice’

SELECT pno
FROM works_on, dependent

WHERE works_on.essn = dependent.essn

AND name = ‘Alice’
AND relationship = ‘Daughter’;
SQL: Otra Ambiguedad

¿Qué sucede si queremos listar el nombre y apellido de


cada empleado y el nombre y apellido de su gerente?

SELECT fname, lname, fname, lname


FROM employee, employee
WHERE superssn = ssn;

Los nombres de atributos ambiguos no serán


resueltos agregando como prefijo el nombre
de su relación
SQL: Aliasing

• Problema: Necesidad de utilizar la misma relación


varias veces en una consulta SELECT y cada nombre
de atributo de esa relación será ambiguo

• Solución: Utilice un alias o un identificador que siga al


nombre de relación en la cláusula FROM de una
consulta SELECT
SQL: Aliasing Syntax

• Sintaxis:
SELECT <alias1>.<attr1>, <alias2>.<attr2>
FROM <relation1> <alias1>, <relation2> <alias 2>
WHERE <alias1>.<A> = <alias2>.A;

• No hay coma entre el alias y el nombre de la relación

• Referirse a la relación usando el alias dado en otras


partes de la consulta
Ejemplo de consulta: Aliasing

Listar el nombre y apellido de cada empleado, y el


nombre y apellido de su gerente

SELECT e.fname, e.lname, m.fname, m.lname


FROM employee e, employee m
WHERE e.superssn = m.ssn;

e y m son llamados alias o variables de


tupla para cada relación empleado
SQL: Operaciones Aritméticas

• Cualquier expresión aritmética (que tenga sentido)


puede ser usado en la clausula SELECT

• Ejemplo: Mostrar el efecto de dar un aumento del


10% a todos los empleados que trabajan en el
proyecto ‘ProductX’
SELECT fname, lname, 1.1*salary
FROM employee, works_on, project
WHERE ssn = essn
AND pno = pnumber
AND pname = ‘ProductX’ ;
Ejercicios: Company Database (4)

• ¿Cuál es el nombre de los departamentos que están


ubicados en Houston?

• Buscar el nombre de los gerentes que están a cargo


de los departamentos ubicados en Houston

• ¿Cuáles son los nombres de los niños cuyos padres


trabajan en el proyecto ProductX?
Consultas Anidadas
Repaso: Consulta SQL básica

Una consulta SQL puede consistir de distintas clausulas,


pero solo las clausulas SELECT y FROM son obligatorias

SELECT <attribute list>


FROM <table list>
[WHERE <condition on the tables (join or selection)>]
[ORDER BY <attribute list>]
[LIMIT <number of tuples>];
Subconsulta

• Subconsulta: Es una sentencia SELECT-FROM-WHERE


entre paréntesis que produce como resultado una
relación de tuplas

• Sintaxis:
(SELECT-command)

• Usos

 Dentro de la clausula WHERE (consulta anidada)

 Dentro de la clausula FROM (relación temporal)


Consulta anidada
• Una consulta anidada es cuando se especifica una
subconsulta dentro de la clausula WHERE de otra
consulta, llamada consulta externa

• Sintaxis:
SELECT …
FROM …
WHERE … (SELECT …
FROM … Consulta anidada
WHERE …)
Tipos de consulta anidada
• Tipos de consulta anidada:

 Pertenencia a un conjunto: IN y NOT IN

 Comparación sobre un conjunto:


compareOp ANY or compareOp ALL

 Chequea por la relación vacía: EXISTS y NOT EXISTS

• En teoría, la anidación puede ser arbitrariamente


profunda, pero en la práctica el número de niveles es
limitado por el motor de bases de datos.
Consulta anidada: IN
Recuperar el nombre y la dirección de todos los empleados que
trabajan para el departamento ‘Research’

• Sol. #1: SELECT fname, lname


FROM employee, department

WHERE dno = dnumber

AND dname = ‘Research’;

• Sol. #2: SELECT fname, lname


FROM EMPLOYEE

WHERE dno IN (SELECT dnumber

FROM department
WHERE dname = ‘Research’);
Consulta anidada: IN (2)

Buscar el nombre y apellido de los empleados que no


tienen personas a cargo

SELECT fname, lname


FROM employee
WHERE ssn NOT IN (SELECT essn
FROM dependent);
Consultas anidadas correlacionada
• Correlacionada: la consulta interna usa uno o mas atributos
de las relaciones especificadas en la consulta externa

• No correlacionada: La consulta interna es una consulta


autónoma que puede ser ejecutada independientemente de
la consulta externa

• Sintaxis:
SELECT …
FROM R1
WHERE attr1 IN (SELECT attr2
FROM R2
WHERE R2.attr3 = R1.attr4);
Ejemplo: Consulta anidada correlacionada

Recuperar el nombre y el apellido de cada empleado


que tiene una persona a cargo con el mismo nombre
que el empleado

SELECT e.fname, e.lname


FROM employee AS e
WHERE e.ssn IN (SELECT essn
FROM dependent
WHERE essn = e.ssn
AND name = e.fname);
Consulta anidada: ALL
• Ejecución de consulta anidada correlacionada
 FOR (cada tupla X en la consulta externa) DO
{ Ejecutar la consulta interna usando el valor
del atributo de la tupla X
}
• Ejemplo:
SELECT fname, lname, salary, dno
FROM employee a
WHERE salary >= ALL (SELECT salary
FROM employee b
WHERE b.dno = a.dno);
Ejecución de consulta anidada correlacionada (2)

FName LName DNo Salary


John Smith 4 50,000
James Bond 4 80,000
Jane Brown 3 60,000
Jennifer Wallace 5 30,000
James Borg 1 55,000
Joyce English 5 25,000
Alicia Wong 4 70,000

• Tupla externa a = John Smith 4 50,000

WHERE 50,000 >= ALL (SELECT salary FROM employee b


where b.dno = 4)
=> FALSE
Ejecución de consulta anidada correlacionada (2)

FName LName DNo Salary


John Smith 4 50,000
James Bond 4 80,000
Jane Brown 3 60,000
Jennifer Wallace 5 30,000
James Borg 1 55,000
Joyce English 5 25,000
Alicia Wong 4 70,000

• Tupla externa a = James Bond 4 80,000

WHERE 80,000 >= ALL (SELECT salary FROM employee b


where b.dno = 4)
=> TRUE (se selecciona la tupla)
Ejecución de consulta anidada correlacionada (2)

FName LName DNo Salary


James Bond 4 80,000
Jane Brown 3 60,000
Jennifer Wallace 5 30,000
James Borg 1 55,000

SELECT fname, lname, salary, dno


FROM employee a
WHERE salary >= ALL (SELECT salary
FROM employee b
WHERE b.dno = a.dno);
Alcance de la consulta anidada correlacionada

Las reglas de alcance definen donde un nombre es visible


 Cada nivel de anidamiento constituye un nuevo
alcance interno

 Los nombres de las relaciones y sus atributos en la


consulta externa son visibles en la consulta interna
pero no lo inverso

 El nombre del atributo especificado dentro de una


consulta interna está asociado con la relación más
cercana
Ejemplo: Alcance de consulta anidada

SELECT <attribute list from R1 and/or R2>


FROM R1, R2
WHERE <conditions from R1 and/or R2> AND
(SELECT <attribute list from R1, R2, R3 and/or R4>
FROM R3, R4
WHERE <conditions from R1, R2, R3, and/or R4>)
• Atributos de R1 y R2 son visibles en la consulta interna

• Atributos de R3 y R4 no son visibles en la consulta


externa
Ejemplo: Alcance de consulta anidada (2)
SELECT <attribute list from R1 and/or R2>

FROM R1, R2

WHERE <conditions from R1 and/or R2> AND

(SELECT x

FROM R3, R4

WHERE <conditions from R1, R2, R3, and/or R4>)

• Si R3 o R4 contiene el nombre de atributo x, entonces x en


la consulta interna se refiere a ese atributo en R3 o R4

• Si R3 y R4 no contienen el nombre de atributo x, entonces


x en la consulta interna se refiere a ese atributo en R1 o R2
Consulta anidada: EXISTS
• Comprueba si el resultado de una consulta anidada
correlacionada es vacía (no contiene tuplas) o no

• Ejemplo: Recuperar los nombres y los apellidos de


los empleados que no tienen personas a cargo

SELECT fname, lname


FROM employee e
WHERE NOT EXISTS (SELECT *
FROM dependent
WHERE essn = e.ssn);
Ejercicios: Company Database (5)
• Buscar el nombre y el apellido de los empleados que
ganan el salario más alto en su departamento

• Buscar el nombre y el apellido de las empleadas que


gana el salario más alto (entre las mujeres) en su depto

• Buscar el nombre y el apellido de los empleados que no


tienen ninguna persona a cargo

• Buscar el nombre y el apellido de los empleados que no


trabajan en ningún proyecto controlado por el
departamento de Research
Consulta SQL: Función de Agregación
• Las funciones COUNT, SUM, MAX, MIN, AVG pueden
ser usada en la clausula SELECT

• Ejemplo: Encontrar la suma, el máximo, el mínimo y


promedio de los salarios de los empleados del
departamento Research
SELECT SUM(salary), MAX(salary),
MIN(salary), AVG(salary)
FROM employee e, department d
WHERE e.dno = d.dnumber
AND dname = ‘Research’;
Consulta SQL: Función de Agregación (2)
• El nombre del atributo seleccionado para la función de
agregación es el mismo al de la llamada a la función.

• SELECT MAX(salary), MIN(salary), AVG(salary)


FROM employee;
max(salary) min(salary) avg(salary)

• Renombrar los atributos seleccionados con la clausula AS


alias dentro de la clausula SELECT
SELECT MAX(salary) AS max, MIN(salary) AS min,
AVG(salary) AS average
FROM employee;
Consulta SQL: Función de Agregación

Recuperar los apellidos y nombres de todos los


empleados que tienen dos o más personas a cargo

SELECT lname, fname


FROM employee e
WHERE ( SELECT COUNT (*)
FROM dependent
WHERE essn = e.ssn ) >= 2;
Consulta SQL: GROUP BY
• Aplica funciones de agregación a subgrupos de tuplas en
una relación
• Corresponden al agrupamiento y las funciones de
agregación en el AR
• Agrupamiento por atributos: atributos usados para
agrupar las tuplas.
• La función de agregación se aplica a cada subgrupo de
forma independiente
• Sintaxis:
SELECT <attribute list>
FROM <table list>
WHERE <condition on the tables>
GROUP BY <grouping attributes>
Ejecución del GROUP BY

Una consulta con la clausula GROUP BY es procesada en


el siguiente orden:
1. Selecciona las tuplas que satisfacen la condición
WHERE

2. Las tuplas seleccionadas desde (1) se agrupan


basadas en su valor en los atributos de agrupación

3. Una o mas funciones se aplican a cada subgrupo


Ejemplo: GROUP BY

Para cada departamento, recuperar el numero de


departamento, el numero de empleados en el
departamento, y su salario promedio

SELECT dno, count(*), avg(salary)


FROM employee
GROUP BY dno;
Consulta SQL: Detalles del GROUP BY

• ¿Qué sucede si no incluimos ciertos atributos de


agrupación en la cláusula SELECT?

• ¿Qué sucede si incluimos un atributo en la cláusula


SELECT que no está en la lista de atributos del
GROUP BY?
Consulta SQL: Detalles del GROUP BY

• ¿Qué sucede si no incluimos ciertos atributos de


agrupación en la cláusula SELECT?
Resp: La consulta aun se ejecuta pero ya no se
tiene idea de lo que significa el resultado

• ¿Qué sucede si incluimos un atributo en la cláusula


SELECT que no está en la lista de atributos del
GROUP BY?
Consulta SQL: Detalles del GROUP BY
• ¿Qué sucede si no incluimos ciertos atributos de
agrupación en la cláusula SELECT?
Resp: La consulta aun se ejecuta pero ya no se tiene
idea de lo que significa el resultado

• ¿Qué sucede si incluimos un atributo en la cláusula


SELECT que no está en la lista de atributos del
GROUP BY?
Resp: En teoría, esto no se debería permitir ya que
no se puede producir un solo valor para atributos
que no se agrupan. Sin embargo, algunas
implementaciones retornan algunas de las tuplas.
Consulta SQL: HAVING

• La clausula HAVING especifica una condición de


selección sobre grupos (en lugar de tuplas individuales)
Filtra los grupos que no satisfacen la condición de grupo

• Sintaxis:
SELECT <attribute list>

FROM <table list>

WHERE <condition on the tables>

GROUP BY <grouping attributes>

HAVING <group condition>
Consulta SQL: Detalles del HAVING

• Si una consulta SQL usa la clausula HAVING, entonces


la clausula GROUP BY debe estar.

• La condición de grupo es una condición sobre un


conjunto de tuplas

• No se puede usar atributos que no se agrupan dentro


de la clausula HAVING

• La forma mas común de condición de grupo es:


SetFunction(<attr>) RelationalOperator <value>
SQL: Orden de ejecución del HAVING
1. Selecciona las tuplas que satisfacen la condición
WHERE

2. Las tuplas seleccionadas desde (1) se agrupan basadas


en su valor en los atributos de agrupación

3. Filtra los grupos de manera que solo queden aquellos


grupos que satisfagan la condición

4. Un conjunto de funciones de agregación en la clausula


SELECT son aplicados a estos grupos
Ejemplo: HAVING

Para cada proyecto en el que trabajan mas de dos


empleados, recuperar el numero de proyecto, nombre
de proyecto, el numero de empleados que trabajan en
ese proyecto

SELECT pnumber, pname, COUNT(*)


FROM project, works_on
WHERE pnumber = pno
GROUP BY pnumber, pname
HAVING COUNT(*) > 2;
Ejemplo: HAVING (2)
Para cada departamento con al menos 2 empleados,
buscar el nombre de departamento y el numero de
empleados en ese departamento que ganan mas de $40K
SELECT dname, COUNT(ssn)

FROM department, employee

WHERE dnumber = dno
AND salary > 40000

GROUP BY dname

HAVING COUNT(ssn) >= 2;
¿Es correcto? ¿Qué devuelve?
Ejemplo: HAVING (2)
• La consulta anterior sólo cuenta el número de
departamentos que tienen al menos 2 empleados
que ganan más de $40K.

• SELECT dname, COUNT(ssn)


FROM employee, department

WHERE dno = dnumber

AND dno IN ( SELECT dno

FROM employee

GROUP BY dno

HAVING COUNT(ssn) >= 2)

AND salary > 40000
GROUP BY dname;
Resumen de las consultas SQL

SELECT [DISTINCT] <attribute list>


FROM <table list>
[WHERE <condition on the tables>]
[GROUP BY <grouping attributes>]
[HAVING <group condition>]
[ORDER BY <attribute list> ASC | DESC]
[LIMIT <number of tuples>]

Tiene todas las cláusulas posibles que un comando


SQL puede incluir
Ejercicios: Company Database (6)

• ¿Cuales son los SSN de los empleados que trabajan en


al menos 2 proyectos?

• ¿Cuál es el nombre del proyecto donde los empleados


han trabajado el mayor número de horas (total)?

• ¿Qué departamento tiene el mayor número de personas


a cargo?

• ¿Qué departamento/s no tienen proyectos?


MySQL Workbench
• Open source, IDE para el sistema de base de datos
MySQL
• Editor SQL
• Provee Modelado de Datos
• Administración de datos + monitoreo del
rendimiento
• Corre en Windows, Linux, Mac OS X
• URL: https://www.mysql.com/products/workbench/
MySQL Workbench DEMO
Consultas SQL: Resumen
• Consulta básica de una sola tabla

• Operadores útiles: *, DISTINCT, IN, LIKE, ORDER


BY, LIMIT, IS NULL

• Consulta multi-tabla

• Join

• Aliasing and qualification

• Consultas anidadas

• Operadores y comandos adicionales

• Operaciones sobre conjuntos, GROUP BY,


HAVING
Referencias

• SQL Queries. http://joyceho.github.io/cs377_s17/


slide/8-9-sql.pdf

• Mysql Reference Manual. https://dev.mysql.com/doc/


refman/5.7/en/

También podría gustarte