0% encontró este documento útil (0 votos)
14 vistas121 páginas

Introducción a SQL y Sentencia Select

El documento describe la sentencia SQL SELECT, que permite seleccionar y obtener datos de una o más tablas de una base de datos. La sentencia SELECT contiene cláusulas como FROM, WHERE, GROUP BY, HAVING, SELECT y ORDER BY. El orden de ejecución de las cláusulas es: FROM, WHERE, GROUP BY, HAVING, SELECT y finalmente ORDER BY. La cláusula SELECT especifica las columnas y expresiones a incluir en el resultado, mientras que las demás cláusulas filtran y organizan las filas de datos.

Cargado por

Freu
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
14 vistas121 páginas

Introducción a SQL y Sentencia Select

El documento describe la sentencia SQL SELECT, que permite seleccionar y obtener datos de una o más tablas de una base de datos. La sentencia SELECT contiene cláusulas como FROM, WHERE, GROUP BY, HAVING, SELECT y ORDER BY. El orden de ejecución de las cláusulas es: FROM, WHERE, GROUP BY, HAVING, SELECT y finalmente ORDER BY. La cláusula SELECT especifica las columnas y expresiones a incluir en el resultado, mientras que las demás cláusulas filtran y organizan las filas de datos.

Cargado por

Freu
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

SQLSelect

José R. Paramá
Guión
Introducción
Conexión a Oracle con Dbeaver
Tablas usadas en los ejemplos
Conceptos previos
Sentencia Select
Distinct
Order by
Predicados
Funciones
Group by
Having
Join
Subconsultas
Composición de consultas
Introducción
Parte del SEQUEL (Structured English QUEry Language), desarrollado en laboratorios
de IBM para el SYSTEM R.
Se basa en el álgebra relacional y el cálculo relacional.
Este lenguaje evolucionó al SQL (Structured Query Language).
ANSI decidió estandarizarlo, se le llamó SQL-86 o SQL1. ISO la aceptó en el 87.
Aparecieron luego otros estándares: SQL-92 (SQL2), SQL:1999 (SQL3), SQL:2003,
SQL:2006, SQL:2008, SQL:2011
Introducción
La mayor parte es seguida por los fabricantes, pero hay pequeñas divergencias, por
eso el SQL que sigue cada producto se denomina dialecto.
A pesar de su nombre, no es sólo un lenguaje de consulta y cubre:
DDL o LDD (lenguaje de definición de datos).
DML o LMD (lenguaje de manipulación de datos).
Con SQL se puede realizar cualquier tarea dentro del SGBD(crear usuarios, dar
permisos, control concurrencia, creación de estructuras de almacenamiento y acceso
a los datos, etc.)
Introducción
Otras características:
Es posible incrustar SQL dentro de programas escritos con lenguajes de propósito
general.
Es un lenguaje no procedimental (se especifica lo qué queremos, y no
especificamos el cómo).
No manipula conjuntos de filas (como el modelo relacional teórico), maneja
colecciones de filas (no hay orden, pero puede haber filas repetidas).
Cambia también la terminología: tablas, filas y columnas en lugar de relaciones,
tuplas y atributos.
Conexión a Oracle con Dbeaver
Programa cliente que usaremos para conectarnos remotamente al servidor Oracle de
la facultad y ejecutar sentencias de SQL en un entorno Oracle.
Select *
Las sentencias SQL se pueden escribir en varias filas y acaban en ; From emp;

FAQs: [Link] PASOS CONFIG: [Link]


Tablas usadas en los ejemplos
EMP Un nulo en COMM significa que el empleado no trabaja a
Campo Tipo Descripción
NUMBER(4) NOT Número o código del empleado. comisión (el valor no procede).
EMPNO:
NULL Es la clave primaria de la tabla.
ENAME VARCHAR2(10) Nombre del empleado Un nulo en MGR significa que no tiene jefe (también "no
JOB VARCHAR2(9) Trabajo del empleado procede")
Código del jefe del empleado.
MGR NUMBER(4) Clave foránea que referencia (cíclicamente) la
tabla EMP
DEPT
HIREDATE DATE Fecha de contratación.
Campo Tipo Descripción
SAL NUMBER(7, 2) Salario mensual del empleado NUMBER(2) NOT Número o código del departamento.
DEPTNO
COMM NUMBER(7, 2) Comisión NULL Es la clave primaria de la tabla.
Código del departamento al que el empleado DNAME VARCHAR2(14) Nombre del departamento.
DEPTNO NUMBER(2) está adscrito. Clave foránea que referencia la Localidad (o ciudad) donde el departamento está
LOC VARCHAR2(13)
tabla DEPT ubicado.

PRO
Campo Tipo Descripción EMPPRO
NUMBER(4) NOT Número o código del Proyecto. Campo Tipo Descripción
PRONO
NULL Es la clave primaria de la tabla. Número o código del empleado.
EMPNO NUMBER(4) NOT NULL Es la clave
PNAME VARCHAR2(10) Nombre del proyecto. Clave foránea que referencia la tabla EMP
primaria
LOC VARCHAR2(13) Ciudad donde se realiza el proyecto. Número o código del proyecto. de la tabla
PRONO NUMBER(4) NOT NULL
Número del departamento controlador del Clave foránea que referencia la tabla PRO
DEPTNO NUMBER(2) proyecto. Clave foránea que referencia la HOURS NUMBER(2) Horas que ha trabajado un empleado en un proyecto.
tabla DEPT
Tablas usadas en los ejemplos
Guion
Introducción
Conceptos previos
Nulos
Expresiones
Sentencia Select
Distinct
Order by
Predicados
Funciones
Group by
Having
Join
Subconsultas
Composición de consultas
Conceptos previos
Nulos:
El valor nulo NULL representa la ausencia de información, o bien por
desconocimiento del dato, o bien porque no procede.
Debe diferenciarse de cualquier otro valor, entre ellos del valor 0 si se trata
de un dato numérico, y de la cadena de caracteres vacía, si es un dato de
tipo carácter.
Conceptos previos
Expresiones1:
Una expresión es la formulación de una secuencia de operaciones, o sea, una
combinación de operadores, operandos y paréntesis, que, cuando se ejecuta,
devuelve un único valor escalar como resultado.
Los operandos pueden ser constantes, nombres de columna, funciones,
otras expresiones y otros elementos.
El tipo de dato de cada operando de una expresión debe ser el mismo. Si
un operando es nulo, el resultado también es nulo
Operadores numéricos: + - * /
Operador alfanumérico: || (concatenación de cadenas de texto)
Ejemplos: •

3
’Casa’
No son expresiones:
• 3+2
• SAL < 1500
• ’A’|| ’BC’
• (SAL+COMM) >=10
• ENAME
• SAL*1.5
• 0.5 * COMM
• SAL + COMM
• (Select COMM FROM EMP WHERE EMPNO = 7499)
1Restringimos la definición de expresión a la versión “Core SQL” del estándar.
Conceptos previos
En Oracle, el texto (literal de texto) va entre comillas simples, y es sensible a las
mayúsculas/minúsculas.
‘casa’
‘Casa’
‘Casa bonita’
Los identificadores (de usuario, nombres de columnas,…) van entre comillas dobles.
Se pueden omitir las comillas cuando el identificador no tiene espacios o símbolos de
puntuación.
psanchez
“Pedro Sanchez”
Guion
Introducción
Conceptos previos
Sentencia Select
Distinct
Order by
Predicados
Funciones
Group by
Having
Join
Subconsulta
Composición de consultas
Sentencia Select
La sentencia SELECT permite seleccionar u obtener datos de una o de varias tablas.
Parte de una o de varias tablas de la BD y el resultado es otra tabla, denominada
a veces tabla resultado, pero que no formará parte de la BD.

SELECT [DISTINCT|ALL] {* | <expr1>[, <expr2>] ...}


FROM <tabla1>[[INNER|LEFT|RIGHT|FULL|CROSS] JOIN <tabla2> …]
[WHERE <condicion_where>]
[GROUP BY <columna1>[,<columna2>,...]
[HAVING <condicion_having>]
[ORDER BY <expr_orderby1>[,..]]
Sentencia Select SELECT [DISTINCT|ALL] {* | <expr1>[, <expr2>] ...}
FROM <tabla1>[[INNER|LEFT|RIGHT|FULL|CROSS] JOIN <tabla2> …]
[WHERE <condicion_where>]
[GROUP BY <columna1>[,<columna2>,…]
[HAVING <condicion_having>]
[ORDER BY <expr_orderby1>[,…]]

El orden de ejecución de las cláusulas y la función de cada una es:


1. FROM(obligatoria)
Partiendo de una o más tablas obtiene una única tabla que será procesada por el resto de cláusulas
2. WHERE (optativa)
De las filas que le pasa el FROM, elimina las filas que NO HACEN CIERTA la condición especificada
3. GROUP BY (optativa)
4. HAVING (optativa)
5. SELECT (obligatoria)
Cada fila que le llega, es usada para obtener una fila del resultado.
Se procesan las filas de una en una, cuando se procesa una fila se evalúa sobre las expresiones, cada expresión da lugar a
una columna de la tabla resultado.
Alternativamente un * indica que en el resultado se añadan todas las columnas.
Si hubiese filas repetidas, de forma predeterminada aparecen, pero no lo hacen si se incluye DISTINCT.
6. ORDER BY (optativa)
Permite determinar el criterio de ordenación de las filas de la tabla resultado. Sin ella obtendremos las mismas filas,
pero no hay garantía de en qué orden, que será el que dicte la estrategia seguida por el SGBD para extraer los datos.
Sentencia Select
Select ‘Nombre: ’ || ename, sal*0.20
from emp
where deptno=10;

El resultado de este paso es


La sentencia Select
Select ‘Nombre: ’ || ename, sal*0.20
from emp
where deptno=10;
Falso
Falso
Falso
Falso
Falso
Falso
Cierto: continúa
Falso
Cierto: continúa
Falso
Falso
Falso
Falso
Cierto: continúa

El resultado de este paso es


La sentencia Select
Cada coma separa dos expresiones,
Select ‘Nombre: ’ || ename, sal*0.20 Y cada expresión da lugar a una columna
from emp en el resultado
where deptno=10;

‘Nombre: ’ || ename, sal*0.20


‘Nombre: ’ || CLARK 2450*0.20
‘Nombre: ’ || KING 5000*0.20
‘Nombre: ’ || MILLER 1300*0.20

El resultado de este paso es


La sentencia Select
Se puede cambiar el nombre de una columna.
SELECT <expr1> [AS] nuevo_nombre, ...
select ename as nombre, sal salario, sal+comm as "ingresos mensuales", hiredate "fecha contratación"
from emp;
Guion
Introducción
Conceptos previos
Sentencia Select
Distinct
Order by
Predicados
Funciones
Group by
Having
Join
Subconsultas
Composición de consultas
Distinct
Si se incluye DISTINCT antes de las expresiones en la cláusula select, se eliminarán
FILAS REPETIDAS.
Distinct
Los nulos, para el distinct, son iguales
Guion
Introducción
Conceptos previos
Sentencia Select
Distinct
Order by
Predicados
Funciones
Group by
Having
Join
Subconsultas
Composición de consultas
Order by
ORDER BY <expr_orderby1> [ASC|DESC], <expr_orderby2> [ASC|DESC],…
Ordena las FILAS obtenidas.
Las expresiones de order by pueden ser expresiones que no sean un literal (una
constante).
Tanto la expresión como la columna no tienen que aparecer necesariamente en la
cláusula select.

Correctas
select ename, job
from emp
order by hiredate;

select ename, job


from emp
order by sal+comm;
Order by
Si no se indica nada el ordenamiento por defecto es ascendente (ASC).
select ename, sal select ename, sal
from emp from emp
order by sal; order by sal DESC;
Order by
Se puede usar también el nombre de columna (en lugar de usar la expresión que la
define).
select ename as nombre, sal salario, sal+comm as "ingresos mensuales",
hiredate "fecha contratación"
from emp
order by "ingresos mensuales"
Order by
Si hay varias expresiones de ordenamiento, se ordenan lasfilas primero por la
primera expresión de ordenamiento, para aquellas filas con el mismo valor en la
primera expresión de ordenamiento, se desempata por la segunda expresión de
ordenamiento, y así sucesivamente.
select ename, deptno, sal
from emp
order by deptno, sal;
Se ordena
por la
segunda

Igual valor en la
primera
Order by
Se puede ordenar ascendentemente en unas expresiones, y descendente en otras

select ename, deptno, sal


from emp
order by deptno, sal desc;

Descendente

Ascendente
Order by
Para el order by, por convención, los nulos se consideran mayores que cualquier valor.
select ename, sal, comm
from emp
order by comm;
Guion
Introducción
Conceptos previos
Sentencia Select
Distinct
Order by
Predicados
Funciones
Group by
Having
Join
Subconsultas
Composición de consultas
Predicados elementales
Los predicados permiten especificar una condición.
Se pueden usar en las partes where y having.
<expre1> <op_condición> <expre2>
<op_condición> puede ser: < <= = != <> >= >
El resultado de un predicado dentro de una cláusula where, como hemos visto, se
aplica a una única fila y su resultado puede ser: cierto (true), falso (false) o
desconocido (null).
El motivo del tercer resultado posible es la presencia de nulos.
Cuando <expre1> o <expre2> es un nulo, el resultado es desconocido.
Predicados elementales
Select ‘Nombre: ’ || ename, sal*0.20
from emp
where comm>1000;
Desconocido
Falso
Falso
Desconocido
Cierto: continúa
Desconocido
Desconocido
Desconocido
Desconocido
Falso
Desconocido
Desconocido
Desconocido
Desconocido

Resultado final
Predicados elementales
<expre1> <op_condición> <expre2>
Observa que a los dos lados de la condición puede haber expresiones
select ename, job, sal, comm, sal+comm
from emp
where sal+comm > 2500;

select ename, job, sal, comm, sal+comm


from emp ?????
where 1000 = 1000;

select ename, job, sal, comm, sal+comm


from emp ?????
where null = null;

select ename, job, sal, comm, sal+comm


from emp ?????
where comm= null;
Predicados de nulos
Los predicados de comparación no sirven para determinar los valores nulos.
Como hemos visto, no es válido COMM = NULL porque sería discernir si un valor
(que también puede ser desconocido) es igual a desconocido.
Se requiere un predicado especial, con formato: <expr> IS [NOT] NULL
select ename, sal, comm, sal+comm total select ename, sal, comm, sal+comm total
from emp from emp
where sal+comm is null; where sal+comm is not null;
Predicado Between

Predicado de rango o predicado BETWEEN


Compara si los valores de una expresión están o no entre los valores de otras dos
(incluyendo los extremos).
Formato: <expr1> [NOT] BETWEEN <expr2> AND <expr3>

SELECT *
FROM emp
WHERE sal BETWEEN 1500 AND 3000;
Predicados de pertenencia a conjunto
Predicado de pertenencia a conjunto (IN)
Comprueba si el valor de una expresión coincide con alguno de los valores incluidos en
una lista de expresiones.
Formato: <expr1> [NOT] IN (<expr2>[, <expr3>, …])

SELECT *
FROM emp
WHERE deptno IN (10,30,40);

SELECT ename
FROM emp
WHERE job IN (‘CLERK’, ’SALESMAN’);
<expre1> IN (<expre2>,<expre3>) es lo mismo que <expre1>=<expre2> OR <expre1>=<expre3>
<expre1> NOT IN (<expre2>,<expre3>) es lo mismo que <expre1>!=<expre2> AND <expre1>!=<expre3>
Predicado LIKE
Predicado de correspondencia con un patrón o modelo
Comprueba si el valor de una expresión alfanumérica se corresponde con un modelo. El
modelo puede incluir dos caracteres que actúan como comodines:
_ Indica un único carácter, incluido el blanco.
% Indica una cadena de caracteres de cualquier longitud,
incluida la cadena vacía.
Formato: <expr1> [NOT] LIKE <modelo>

SELECT * SELECT *
FROM emp FROM emp
WHERE ename LIKE ‘%NE%’ WHERE ename LIKE ‘_____’
Predicados compuestos
Son la unión de dos o más predicados mediante los operadores lógicos AND, OR y
NOT.
Al existir una lógica de tres valores, debemos considerar el efecto del valor NULL.
X Y X AND Y X OR Y NOT X
TRUE TRUE TRUE TRUE FALSE
TRUE FALSE FALSE TRUE FALSE
TRUE DESC. DESC. TRUE FALSE
FALSE TRUE FALSE TRUE TRUE
FALSE FALSE FALSE FALSE TRUE
FALSE DESC. FALSE DESC. TRUE
DESC. TRUE DESC. TRUE DESC.
DESC. FALSE FALSE DESC. DESC.
DESC. DESC. DESC. DESC. DESC.
Predicados compuestos
Select *
from emp
where sal+comm>2500; Desconocido
Falso
Falso
Desconocido
Cierto
Desconocido
Desconocido
Desconocido
Desconocido
Falso
Desconocido
Desconocido
Desconocido
Desconocido

Select * Desc.(Desc. OR Falso)


from emp Falso (Falso OR Falso)
Falso
where sal+comm>2500 Cierto: (Desc. OR Cierto)
or sal > 2500; Cierto: (Cierto OR Falso)
Cierto: (Desc. OR Cierto)
Desc (Desc. OR Falso):
Cierto:
Cierto:
Falso (Falso OR Falso)
Desc.(Desc. OR Falso)
Desc
Cierto: (Desc. OR Cierto)
Desc.
Ejercicios
1. Muestra los puestos de trabajo que hay en cada departamento (código de dept y
nombre del puesto de trabajo). No deben aparecer repetidos.
2. Muestra los códigos de empleados que son jefes. En el resultado no debe aparecer
filas con nulos.
3. Muestra las ciudades donde se ejecutan proyectos controlados por el
departamento 30. No deben aparecer repetidos en el resultado.
4. Muestra empleados que no tienen jefe.
5. Muestra empleados que tengan jefe y que ganen (incluyendo salario y comisión)
más de 2500.
6. Muestra los empleados cuyo nombre empieza por ‘S’.
7. Muestra los empleados que ganan (incluyendo salario y comisión) entre 1500 y
2500 euros.
8. Muestra los empleados que son ‘CLERK’, ‘SALESMAN’ o ‘ANALYST’ y ganan
(incluyendo salario y comisión) más de 1250
Ejercicios
3. Select distinct loc
1. Select distinct deptno, job 2. Select mgr
from pro
from emp from emp
where deptno=30
where mgr is not null

4. Select empno, ename


from emp 5. Select empno, ename
from emp 6. Select empno, ename
where mgr is null from emp
where mgr is not null
and (sal>2500 or where ename like ‘S%’
sal+comm>2500)

7. Select empno, ename 8. Select empno, ename, sal, comm, job


from emp from emp
where (sal between 1500 and 2500 where job in (‘ANALYST’,’CLERK’,’SALESMAN’)
and comm is null) and
or (sal+comm > 1250
(sal+comm) between 1500 and 2500) or sal >1250)
Guion
Introducción
Conceptos previos
Sentencia Select
Distinct
Order by
Predicados
Funciones
Escalares
Colectivas
Group by
Having
Join
Subconsultas
Composición de consultas
Funciones Escalares
Son funciones que se aplican dentro de expresiones normales, y por tanto se puede
utilizar en cualquier sitio donde se espere una expresión.
Es decir, sobre expresiones que se aplicanSOBRE UNA FILA y devuelven un valor para
esa fila.
select empno, ename, sqrt(sal)
from emp;
Funciones Escalares
Hay muchas, algunos ejemplos:

Numéricas o aritméticas:
SQRT(<exp_numerica>) Raíz cuadrada. Ej.: SQRT(81)
ABS(<exp_numerica>) Valor absoluto. Ej.: ABS(-11)
POWER(<exp1>,<exp2>) Potencia. Ej.: POWER(9,2) = 81

Alfanuméricas o de cadenas de caracteres:


SUBSTR(<exp1>,<exp2>[,<exp3>]) Subcadena de <exp1> empezando en la posicion <exp2> y
de longitud <exp3>.
Ej.: SUBSTR('Materia',2,4) = 'ater' SUBSTR('Materia',5) = 'ria'
UPPER(<exp_caracter>) Pasa a mayúsculas. Ej.: UPPER('Materia') = 'MATERIA'
LOWER(<exp_caracter>) Pasa a minúsculas. Ej.: LOWER('Materia') = 'materia‘
LENGTH(<exp_carácter>) cuenta nº caracteres

De fecha y tiempo:
CURRENT_DATE Fecha actual del sistema. Ej.: SELECT CURRENT_DATE FROM DUAL
Funciones Escalares
Función útil cuando hay valores nulos en expresiones.
Formato: COALESCE(<expr1>, <expr2>, …)
Funcionamiento:
Evalúa la <expr1>. Si su valor es distinto de NULL, devuelve dicho valor. En caso contrario, evalúa la
<expr2> y devuelve el resultado, y así sucesivamente.
SELECT COALESCE(sal + comm, sal)
FROM emp;

En este ejemplo se evalúa la suma del salario y la comisión de cada empleado. Si el resultado es distinto
de NULL, se devuelve dicho resultado. Si el resultado es NULL (debido a que la comisión del empleado
es NULL), se evalúa el salario de cada empleado y se devuelve ese valor.

COALESCE(<expr1>, <expr2>, …) es una expresión, y por tanto se puede usar en cualquier sitio donde se
espere una expresión, por ej:

SELECT COALESCE(sal + comm, sal)


FROM emp
WHERE COALESCE(comm,0)+sal>2500
Funciones Colectivas
Las funciones colectivas (o de agrupamiento, o de conjuntos), son funciones que se
aplican sobre una COLECCIÓN DE FILAS y devuelve un valor para esa colección de filas.
Una expresión que contiene una función colectiva sigue siendo una expresión, pero ahora
ya no se puede usar en cualquier sitio, existen restricciones.
select sum(sal)
from emp;

En este ejemplo al no haber where llega toda la tabla


a la cláusula select
Funciones Colectivas
select sum(sal)
from emp
where job=‘CLERK’;

Como aquí hay where


lo que llega a la cláusula Ya
select es el resultado del continuación
Primero se la cláusula
where
ejecuta el select
where
Funciones Colectivas
Formato: func(<expre>)
Muchas permiten ALL y DISTINCT: <func>([ALL|DISTINCT]<expr>)
Si aparece DISTINCT se eliminan los valores repetidos del argumento, antes de
calcular la función.
Las más frecuentes:

AVG Media COUNT Contar


MAX Máximo MIN Mínimo
SUM Suma VAR Varianza

El estándar indica que la expresión no puede ser una subconsulta ni una expresión
con una función colectiva (no se puede anidar funciones colectivas).
Aunque algunos SGBD sí permiten un nivel de anidamiento.
Funciones Colectivas
Si se incluye una función de agrupamiento en la cláusula SELECT todas las expresiones
en dicha cláusula deben tener un valor único para el conjunto de las filas.
Esta expresión (una Esta expresión sólo devuelve
columna en el resultado) un valor
devuelve 14 valores
select ename, sum(sal)
from emp;

No se puede construir una tabla resultado con una columna de 14 valores y otra
columna con sólo un valor. La tabla tiene una bolsa de filas, y cada fila tiene que tener
un valor (o un nulo) para cada una de las columnas (2 en este ejemplo).
El propio SGBD da un error:
select ename, sum(sal)
2 from emp;
select ename, sum(sal)
*
ERROR en línea 1:
ORA-00937: la función de grupo no es de grupo único
Funciones Colectivas
Las funciones colectivas eliminan (casi siempre) los nulos antes de realizar su
operación.
select comm, mgr select sum(comm), count(mgr)
from emp; from emp;

Suma de los Cuenta los


distintos de distintos de
nulo nulo

1 nulo y 13 distintos
10
de nulo
nulos
Funciones Colectivas
Se puede incluir un distinct dentro de cada función colectiva (es el único modo de
que pueda aparecer más de un distinct en una cláusula select).
<func>([ALL|DISTINCT]<expr>)

select deptno select sum(distinct deptno), count(distinct deptno)


from emp; from emp;

Cuenta (10,20,30)

Suma (10,20,30)

14 valores y 3
distintos (10,20,30)
Funciones Colectivas
La función count tiene pequeñas diferencias:
count([ALL] <expre>) cuenta cuántos valores distintos de nulo hay en la
columna correspondiente a <expre> en la tabla resultante.
count(DISTINCT <expre>) cuenta cuántos valores distintos de nulo y
distintos entre sí hay en la columna correspondiente a <expre> en la tabla
resultante.
count(*) cuenta cuántas filas hay en la tabla resultante (aún cuando las filas
sean todo nulos.
select * select count(col1), count(distinct col1), count(*)
from tabla; from tabla;

Dos filas todo nulos

5 filas, 3 distintos de
nulo y 2 distintos
(1,2)
Ejercicios
1. Muestra cuántos empleados hay y a cuánto ascienden sus ingresos (sumando los
de todos e incluyendo salario y comisión) que sean SALESMAN o CLERK.
2. Cuántos empleados tienen comisión, cuántos no tienen comisión, a cuánto
asciende el salario medio, y cuánto asciende la comisión media.
3. Empleados con un nombre de más de 5 letras.
4. Cuántos empleados trabajan para los departamentos 20 y 30, y cuántos trabajos
distintos se desempeñan en esos departamentos.
5. Cuántos empleados tienen jefe, cuántos son jefes y cuántos no son jefes.
6. Cuántos son los ingresos (salario más comisión) medios de los empleados
contratados después del 01-08-1981.
Ejercicios
1. Select count(*),sum(sal+coalesce(comm,0)) 2. Select count(comm), count(*)-count(comm),avg(sal), avg(comm)
from emp from emp
where job in (‘SALESMAN’,’CLERK’)

3. Select ename 4. Select count(*), count(distinct job)


from emp from emp
where length(ename)>5 where deptno in (20,30)

5. Select count(mgr), count(distinct mgr), count(empno)-count(distinct mgr)


from emp

6. select avg(coalesce(sal+comm,sal))
from emp
where hiredate >'01-08-1981'
Guion
Introducción
Conceptos previos
Sentencia Select
Distinct
Order by
Predicados
Funciones
Group by
Having
Join
Subconsultas
Composición de consultas
Group by
Hasta ahora, las funciones de agrupamiento actuaban sobre el conjunto de las filas
que le llegan a la cláusula select.
En lugar de aplicar las funciones colectivas sobre todas las filas, éstas se pueden
agrupar, formando más de un grupo de filas, y entonces aplicar las funciones sobre
cada uno de esos grupos.
Esos grupos se crean indicando una o más columnas de agrupamiento, así los grupos
de filas están formados por todas las filas que tienen el mismo valor en las columnas
de agrupamiento.
En el resultado, habrá una fila por cada uno de estos grupos.
SELECT …
FROM …
[WHERE …]
[GROUP BY <columna1>[,<columna2>,...]

Algunos SGBDs (como Oracle) permiten expresiones en el group by.


Group by
SELECT count(*), sum(sal)
FROM emp
GROUP BY job

Por cada grupo de filas con el


mismo job, se genera UNA FILA
en el resultado
Group by
SELECT job, count(*), sum(sal) Es posible poner la columna/s de
FROM emp agrupamiento en la cláusula
GROUP BY job select

Pero cualquiera otra columna NO


puede aparecer en la cláusula
select

Por tanto hay UN


único job grupo, que
Todas las filas del puede aparecer en el
grupo tienen el mismo resultado
job
Group by Es posible poner la columna/s de
agrupamiento en la cláusula
select
SELECT job, deptno, count(*), sum(sal)
FROM emp Pero cualquiera otra columna NO
GROUP BY job puede aparecer en la cláusula
select
No hay un único
deptno para este En una fila sólo puede
grupo haber para cada
atributo un único
valor. Pero tenemos
varios!!!!
Group by Ahora los grupos son formados
por filas con igual valor en job y
deptno
SELECT job, deptno, count(*), sum(sal)
FROM emp
GROUP BY job, deptno
Por lo tanto al incluir
deptno en el group by
cambian los grupos
Group by
SELECT comm, count(*)
FROM emp Los nulos son “iguales” para
GROUP BY comm el group by
Ejercicios
1. Cuántos empleados hay en cada departamento, cuántos tienen comisión, cuántos
no tienen comisión y cuales son los ingresos medios (incluyendo salario y
comisión.
2. Muestra los departamentos que tienen empleados con comisión. No puede haber
valores repetidos.
3. Para cada departamento muestra la comisión media, si no tiene empleados con
comisión, se debe indicar con un 0.
4. Para cada departamento muestra cuántos puestos de trabajo distintos
desempeñan sus trabajadores.
5. Para cada departamento muestra cuántos empleados hay de cada puesto de
trabajo.
6. Muestra cuántos empleados tienen unos ingresos superiores a 2500 € en cada
departamento.
Ejercicios
1. Select deptno, count(*),count(comm), count(*)-count(comm),avg(coalesce(sal+comm,sal))
from emp
group by deptno

2. Select distinct deptno 3. Select deptno, coalesce(avg(comm),0)


from emp from emp
where comm is not null group by deptno

4. Select deptno, count(distinct job) 5. Select deptno, job, count(*)


from emp from emp
group by deptno group by deptno, job

6. select deptno, count(*)


from emp
where coalesce(sal+comm,sal)>2500
group by deptno
Guion
Introducción
Conceptos previos
Sentencia Select
Distinct
Order by
Predicados
Funciones
Group by
Having
Join
Subconsultas
Composición de consultas
Having
De igual forma que la cláusula where permite filtrar filas, la cláusula having permite
filtrar grupos.
La cláusula having permite establecer una condición (predicado) que se evalúa sobre
cada grupo de filas, y aquellos grupos que hacen cierta la condición, pasan a la
cláusula select.
SELECT job, count(*), sum(sal)
FROM emp
GROUP BY job
HAVING min(sal) > 1500

Cierto

Falso

Cierto
Cierto
Falso
Having
En el predicado de un having se puede utilizar todas herramientas usadas en los
predicados where: todos los predicados, subconsultas, etc.
Pero hay que tener cuidado con las expresiones que se incluyan: éstas sólo pueden
contener constantes, funciones (incluyendo las colectivas) aplicadas sobre cualquier
columna, pero, fuera de funciones colectivas, sólo pueden aparecer las columnas de
agrupamiento. SELECT job, count(*), sum(sal)
FROM emp
GROUP BY job
HAVING sal > 1500

El predicado se aplica UNO A UNO a cada UNO de los


grupos de filas.
Por tanto cuando se aplique sobre este grupo, ¿por qué
valor sustituimos el nombre de columna SAL
¿sal?>1500
Having
Pero hay que tener cuidado con las expresiones que se incluyan: éstas sólo pueden
contener contantes, funciones (incluyendo las colectivas) aplicadas sobre cualquier
columna, pero, fuera de funciones colectivas sólo pueden aparecer las columnas de
agrupamiento.
SELECT job, count(*), sum(sal)
FROM emp
GROUP BY job
HAVING min(sal) > 1500

¿3000>1500?
El predicado se aplica UNO A UNO a cada uno de los
¿800>1500? grupos de filas.

¿2450>1500?
¿5000>1500?
¿1250>1500?
Having
Orden de ejecución en la sentencia select:
1. FROM
2. WHERE
3. GROUP BY
4. HAVING
5. SELECT
6. ORDER BY
Having
La condición where se aplica a filas
La condición having se aplica a grupos de filas
SELECT deptno, count(*), sum(sal)
FROM emp
WHERE sal > 1450 Primer paso
GROUP BY deptno
HAVING count(*)>2
Having
La condición where se aplica a filas
La condición having se aplica a grupos de filas
SELECT deptno, count(*), sum(sal)
FROM emp
WHERE sal > 1450 Segundo paso
GROUP BY deptno
HAVING count(*)>2

Falso

Cierto
Having
La condición where se aplica a filas
La condición having se aplica a grupos de filas
SELECT deptno, count(*), sum(sal)
FROM emp
WHERE sal > 1450 Tercer paso
GROUP BY deptno
HAVING count(*)>2
Having
La condición where se aplica a filas
La condición having se aplica a grupos de filas
SELECT deptno, count(*), sum(sal)
FROM emp
WHERE sal > 1450 Cuarto paso
GROUP BY deptno
HAVING count(*)>2

Falso

Cierto

Cierto
Having
La condición where se aplica a filas
La condición having se aplica a grupos de filas
SELECT deptno, count(*), sum(sal)
FROM emp
WHERE sal > 1450 Quinto paso
GROUP BY deptno
HAVING count(*)>2
Ejercicios
1. Para cada departamento muestra cuántos empleados tienen unos ingresos
(sal+comm) superiores a 2500 €.
2. Muestra los departamentos con unos ingresos medios superiores a los 2500 €.
Muestra para cada uno, cuántos empleados tienen.
3. Departamentos con al menos dos ‘MANAGER’
4. Departamentos con al menos dos empleados con comisión. Para cada
departamento muestra cuántos empleados tiene (en total) y cuántos con
comisión.
5. Departamentos con al menos dos empleados con el mismo puesto de trabajo. No
puede aparecer repetidos.
Ejercicios
1. Select deptno, count(*) 2. Select deptno, count(*)
from emp from emp
where coalesce(sal+comm,sal)>2500 group by deptno
group by deptno having avg(coalesce(sal+comm,sal))>2500

3. Select deptno 4. Select deptno, count(*), count(comm)


from emp from emp
where job =‘MANAGER’ group by deptno
group by deptno having count(comm)>=2
having count(*)>=2

5. Select distinct deptno


from emp
group by deptno,job
having count(*)>=2
Guion
Introducción
Conceptos previos
Sentencia Select
Distinct
Order by
Predicados
Funciones
Group by
Having
Join
Subconsultas
Composición de consultas
Más de una tabla en el FROM
Cómo puedo obtener una tabla que para cada empleado me muestre su nombre y el
nombre del departamento para el que trabaja.
En la cláusula select los nombres de columna que aparezcan deben estar en alguna
tabla en el from.
Pero en la tabla emp sólo tenemos el número de departamento.

Necesitamos acceder a la tabla emp y a la tabla dept


Más de una tabla en el FROM
Cuando partimos la información en tablas, dejamos claves foráneas que mantienen los
vínculos entre la información partida.

Mediante esas claves foráneas, podemos enlazar la información partida.


El mecanismo que se usa en SQL se llama JOIN (reunir en español).
JOIN
SELECT …
FROM <tabla1> [INNER|LEFT|RIGHT|FULL] JOIN <tabla2>
ON <condición de join>

El más normal es este: que obtiene, del producto cartesiano, las filas que hacen cierta
la condición de join
SELECT …
FROM <tabla1> [INNER] JOIN <tabla2>
ON <condición de join>

Y lo más normal es que la condición de join sea una igualdad entre una clave foránea
y una clave primaria. Por ej.
SELECT *
FROM emp JOIN dept
ON [Link]=[Link]

Hay 2 columnas deptno, así que


hay que desambiguar
JOIN
Todas columnas
Conceptualmente (no lo hace en realidad), primero crea de las dos tablas
el producto cartesiano

Todas las filas de


emp pegadas a
todas las de
dept

… continúa con más filas...


JOIN SELECT *
FROM emp JOIN dept
ON [Link]=[Link]

EMP DEPT

Sobre el producto cartesiano


se seleccionan las filas Este tipo de filas Estas filas no salen
que hacen cierta la condición son las que porque no hacen
de join hacen cierta la cierta la condición de
condición de join join
JOIN SELECT *
FROM emp JOIN dept
ON [Link]=[Link]

EMP DEPT

Se puede desambiguar usando alias.


SELECT ename, [Link], dname
FROM emp E JOIN dept D
ON [Link]=[Link]

Sólo es necesario desambiguar en los nombres de columna que aparecen en las dos tablas.
JOIN
Recordar los pasos
1. FROM(obligatoria)
Partiendo de una o más tablas obtiene una única tabla que será procesada por el
resto de cláusulas
2. WHERE (optativa)
3. GROUP BY (optativa)
4. HAVING (optativa)
3. SELECT (obligatoria)
4. ORDER BY (optativa)

Así, que todo lo visto hasta ahora funciona igual, porque el FROM es lo primero que se
ejecuta, y devuelve una única tabla.
JOIN
Primer paso
SELECT ename, [Link], dname
FROM emp E JOIN dept D
ON [Link]=[Link]
WHERE coalesce(comm,0)+sal>2500
JOIN
SELECT ename, [Link], dname
FROM emp E JOIN dept D
ON [Link]=[Link]
WHERE coalesce(comm,0)+sal>2500

Segundo paso

Tercer paso
JOIN
Se puede usar más de una copia de una misma tabla.
SELECT [Link] subordinado, [Link], [Link], [Link] jefe
FROM emp s JOIN emp j ON [Link]=[Link]
JOIN
La condición de join puede ser cualquier predicado.
SELECT [Link], [Link], [Link], [Link] SELECT [Link] sub, [Link], [Link] jefe, [Link]
FROM emp a JOIN emp b ON [Link]>[Link] FROM emp s JOIN emp j
ON [Link]=[Link] AND [Link]>[Link]


JOIN
Recalcamos que en el resultado, están las filas (del producto cartesiano) que cumplen
la condición de join.

SELECT *
FROM emp JOIN dept
ON [Link]=[Link]

En el resultado no hay rastro


del departamento 40, porque
no hay ningún empleado que
trabaje para ese departamento
y por tanto nunca se hace
cierta la condición de join
JOIN exterior SELECT …
FROM <tabla1> [LEFT|RIGHT|FULL] JOIN <tabla2>
ON <condición de join>

Podemos forzar a que las filas de una (o de las dos) tabla de entrada que en el INNER
join no aparecen por no hacer cierta la condición de join, salgan rellenando las
columnas del otro lado con nulos.
SELECT *
FROM emp RIGHT JOIN dept Vamos forzar que salgan las filas del lado derecho que no salen en el INNER
ON [Link]=[Link]
Las filas del lado
derecho que
“emparejan”,
salen igual que
en el INNER join

Las filas del lado


derecho que “no
emparejan”, salen
rellenado las
columnas del lado
izquierdo con nulos
Nulos
JOIN exterior
SELECT [Link] subordinado, [Link], [Link], [Link] jefe
FROM emp s LEFT JOIN emp j ON [Link]=[Link]

Encaje “normal”

Forzada por el left join


JOIN exterior
SELECT [Link] subordinado, [Link], [Link], [Link] jefe
FROM emp s FULL JOIN emp j ON [Link]=[Link]

Forzada por el left join

Encaje “normal”

Forzada por el right join


Join de más de dos tablas
SELECT …
FROM <tabla1> [INNER|LEFT|RIGHT|FULL] JOIN <tabla2> ON <condición de join12>
[INNER|LEFT|RIGHT|FULL] JOIN <tabla3> ON <condición de join123>
[INNER|LEFT|RIGHT|FULL] JOIN <tabla4> ON <condición de join1234>

En primer lugar se unen <tabla1> y <tabla2>, con su condición de join.


Esto da lugar a una tabla.
Esa tabla resultante se une a la <tabla3>, con su condición de join, lo que resulta
en otra tabla.
Y así sucesivamente.
Join de más de dos tablas
SELECT …
FROM <tabla1> JOIN <tabla2> JOIN <tabla3> JOIN <tabla4>
ON <condición de join12>
and <condición de join123>
and <condición de join1234>

Esto NO ES CORRECTO!!
Join de más de dos tablas
SELECT ename, pname, hours
FROM emp e JOIN emppro ep ON [Link]=[Link]
JOIN pro p ON [Link]=[Link]
Primer paso

emp emppro
Join de más de dos tablas
SELECT ename, pname, hours
FROM emp e JOIN emppro ep ON [Link]=[Link] Segundo paso
JOIN pro p ON [Link]=[Link]

emp emppro pro


Join de más de dos tablas
SELECT ename, pname, hours
FROM emp e JOIN emppro ep ON [Link]=[Link]
JOIN pro p ON [Link]=[Link]
Ejercicios
1. Para cada proyecto muestra su nombre y el nombre del departamento que los
controla.
2. Para cada empleado muestra su nombre y los códigos de proyectos para los que
trabaja.
3. Para cada empleado muestra su nombre y los códigos de proyectos para los que
trabaja. Si hay empleados que no trabajan en proyectos, éstos deben aparecer con
el código de proyecto a nulo.
4. Para cada empleado muestra el nombre de su jefe, si no tiene jefe, muestra un
nulo en el nombre del jefe.
5. Para cada empleado muestra su nombre, el nombre de su jefe, y el departamento
para el que trabaja su jefe.
6. Devuelve los empleados que tienen un salario más alto que su jefe.
Ejercicios
1. Select pname, dname 2. Select ename, prono
from pro p join dept d on [Link]=[Link] from emp e join emppro ep on [Link]=[Link]

3. Select ename, prono 4. Select [Link], [Link]


from emp e left join emppro ep on [Link]=[Link] from emp e left join emp j on [Link]=[Link]

5. Select [Link], [Link], [Link] 6. Select [Link], [Link], [Link], [Link]


from emp e join emp j on [Link]=[Link] join dept d from emp e join emp j on [Link]=[Link]
on [Link]=[Link] where [Link]>[Link]
Ejercicios
1. Para empleado muestra su nombre y cuántas horas trabajó en proyectos.
2. Para cada departamento, muestra su nombre y cuántos empleados tiene.
3. Para cada jefe, muestra su nombre y cuántos subordinados tiene.
4. Muestra el nombre de proyectos donde se ha trabajado (en total, todos los
empleados) más de 15 horas
5. Muestra los departamentos (nombre) que controlan más de dos proyectos.
6. Muestra los departamentos (nombre) donde hay por lo menos dos empleados con
el mismo puesto de trabajo. No debe aparecer repetidos.
7. Para cada departamento mostrar su nombre y cuántos empleados tiene, si no
tiene ninguno, indicarlo con un 0.
8. Para cada empleado mostrar las horas que trabajó en proyectos, si no trabajó en
ninguno, indicarlo con un 0.
9. Para cada jefe, cuántos subordinados ganan más que él, si no gana ninguno
indicarlo con un cero.
Ejercicios
1. Select ename, sum(hours) 2. Select dname, count(ename)
from emp e join emppro ep on [Link]=[Link] from emp e join dept d on [Link]=[Link]
group by [Link], ename group by [Link], dname

3. Select [Link], count([Link]) 4. Select pname, sum(hours)


from emp e join emp j on [Link]=[Link] from emppro ep join pro p on [Link]=[Link]
group by [Link], [Link] group by [Link], pname
having sum(hours)>15

5. Select dname, count(prono) 6. Select distinct dname


from dept d join pro p on [Link]=[Link] from emp e join dept d on [Link]=[Link]
group by [Link], dname group by [Link], dname, job
having count(*)>2 having count(*)>=2

7. Select dname, count(empno) /*no count(*)*/ 8. Select ename, coalesce(sum(hours),0)


from emp e right join dept d on [Link]=[Link] from emp e left join emppro ep on [Link]=[Link]
group by [Link], dname group by [Link], ename

9. Select [Link], count([Link])


from emp e right join emp j on [Link]=[Link]
and [Link]>[Link]
group by [Link], [Link]
Guion
Introducción
Conceptos previos
Sentencia Select
Distinct
Order by
Predicados
Funciones
Group by
Having
Join
Subconsultas
Composición de consultas
Subconsultas
Hasta ahora, todos los nombres de columnas que aparecen en todas las expresiones
deben ser de las tablas que aparecen en el FROM de la sentencia select.
Si quisiésemos saber los empleados que trabajan en ‘RESEARCH’ (sin join)
tendríamos un problema, porque necesitamos la tabla EMP para obtener los datos de
lo empleados.
SELECT *
FROM emp
WHERE deptno=20

Pero necesitamos saber que el departamento denominado RESEARCH es el que tiene


el número 20.
Para esto necesitamos ejecutar una consulta previa
SELECT deptno
FROM dept
WHERE dname=‘RESEARCH’

Necesitamos un mecanismo que me permita consultar el número de departamento


denominado RESEARCH en la misma consulta, sin que el usuario tenga que hacer una
consulta previa.
Subconsultas
SQL nos permite incluir consultas dentro de otras consultas.
Así en lugar de escribir el 20, podemos incluir una consulta que obtenga dicho valor.
SELECT *
FROM emp
WHERE deptno=(SELECT deptno
FROM dept
WHERE dname=‘RESEARCH’)

Esto se denominan subconsultas.


Una consulta puede contener, a su vez,subconsultas.
La consulta inicial se conoce como consulta principal.
El resultado de la consulta lo utiliza la consulta de nivel superior en un predicado, pero su
resultado no se puede trasladar al resultado de la consulta.
Es decir, en nuestro ejemplo, no podemos poner ninguna expresión en la cláusula SELECT
principal conteniendo nombres de columnas de la tabla DEPT.
Subconsultas
La subconsulta se ejecuta (conceptualmente) antes de comenzar la ejecución de la
principal, y su resultado se usa para evaluar el predicado donde está.
El primer caso que hemos visto es una subconsulta escalar, que es un tipo especial de
expresión, ya que devuelve un único valor escalar.
SELECT *
FROM emp
WHERE deptno=(SELECT deptno
FROM dept
WHERE dname=‘RESEARCH’)

Dicho de otro modo, la subconsulta devuelve una tabla con una fila y una columna. Por
lo tanto es equivalente a escribir una expresión literal (una constante).
Este es el único tipo de subconsulta válida con predicados elementales.
SELECT *
ERROR en línea 3:
FROM emp
ORA-01427: la subconsulta
WHERE deptno = (SELECT deptno
de una sola fila devuelve
FROM dept
más de una fila
WHERE dname IN (‘SALES',‘RESEARCH'))
Subconsultas
La subconsulta puede usar todas las herramientas usadas hasta el momento, por ej:

SELECT *
FROM emp
WHERE sal > (SELECT AVG(sal)
FROM emp
WHERE deptno=10)

Si usamos un predicado IN, la subconsulta puede devolver más de una fila. En tal
caso, la subconsulta, ya no se considera una expresión.
La subconsulta debe devolver una tabla de sólo una columna.
SELECT *
FROM emp
WHERE deptno IN(SELECT deptno
FROM dept
WHERE loc IN ('DALLAS','NEW YORK'))
Subconsultas
Es posible que la subconsulta devuelva más de una fila usando predicados
elementales si los operadores están cuantificados.
Los operadores ANY o SOME y ALL modifican el operador para que se pueda
comparar un valor escalar con una lista de valores (una tabla de una sola columna)
... <expre> operador_comparacion { ALL | SOME | ANY } (subconsulta)
Operadores de comparacion: < <= = != <> >= >
ANY, SOME: La expresión se compara con cada uno de los valores de la subconsulta y
si para alguno es verdadera, el resultado es verdadero.
ALL: La expresión se compara con cada uno de los valores de la subconsulta y si para
todos es verdadera, el resultado es verdadero.
SELECT * SELECT *
FROM emp FROM emp
WHERE sal > ANY(SELECT sal WHERE sal > ALL(SELECT sal
FROM emp FROM emp
WHERE deptno=10) WHERE deptno=10)
Ejercicios
1. Empleados que tienen un salario mayor al salario medio de la empresa
2. Para cada departamento mostrar cuántos empleados tiene que ganen más del
salario medio de la empresa. Muestra el nombre del departamento.
3. Empleados que son jefe. Muestra su nombre.
4. Empleados que no son jefe. Muestra su nombre.
5. Muestra el empleado/s (nombre) con el salario más alto.
6. Muestra el departamento (nombre) con la suma de salarios más alta.
7. Para los departamentos que tienen empleados con comisión, muestra cuántos
empleados tienen comisión, y cuántos no. Muestra nombre del departamento.
Ejercicios
1. Select empno, ename, sal 2. Select dname, count(*)
from emp from emp e join dept d on [Link]=[Link]
where sal > (Select avg(sal) from emp) where sal > (Select avg(sal) from emp)
group by [Link], dname

3. Select ename 4. Select ename


from emp from emp
where empno in (Select mgr from emp) where empno not in (Select mgr from emp
where mgr is not null)

5. Select ename 6. Select dname, sum(sal)


from emp from emp e join dept d on [Link]=[Link]
where sal= (Select max(sal) from emp) group by [Link], dname
having sum(sal) >= ALL (select sum(sal)
from emp
group by deptno)
7. Select dname, count(*)-count(comm) “Sin comisión”, count(comm) “Con comisión”
from emp e join dept d on [Link]=[Link]
where [Link] in (Select deptno
from emp
where comm is not null)
group by [Link], dname
Subconsultas correlacionadas
Las subconsultas vistas hasta ahora, se ejecutaban una única vez antes de ejecutar la
principal, y su resultado lo utilizaba la consulta principal como un literal o lista de
literales.
Es decir, la subconsulta era totalmente independiente de la principal.
Las subconsultas correlacionadas varían con respecto a las normales en:
Tienen al menos una referencia a una de las columnas de las tablas en el FROM de
la consulta principal.
La subconsulta se ejecuta una vez por cada fila de la principal

SELECT *
FROM emppro a Referencia a
WHERE hours = (SELECT MAX(hours) columna de la
FROM emppro consulta principal
WHERE prono=[Link])
Subconsultas correlacionadas
SELECT *
FROM emppro a
Para cada proyecto, ¿cuál es el empleado que
WHERE hours = (SELECT MAX(hours)
más horas trabaja
FROM emppro
WHERE prono=[Link])

SELECT MAX(hours)
FROM emppro
WHERE prono= 1001

Para cada fila proveniente del FROM de la


consulta principal, se ejecuta la subconsulta,
sustituyendo las referencias a columnas de la
consulta principal por el valor de la fila
procesada
Subconsultas correlacionadas
SELECT *
FROM emppro a
WHERE hours = (SELECT MAX(hours)
FROM emppro
Comprobación de la
WHERE prono=[Link])
condición where de la
consulta principal

WHERE 4 = 16
Ejecución de la
SELECT MAX(hours)
subconsulta
FROM emppro
para la fila en
WHERE prono= 1001
color rojo

7934 no es el que más horas trabaja en el proyecto 1001


Subconsultas correlacionadas
SELECT *
FROM emppro a
WHERE hours = (SELECT MAX(hours)
FROM emppro
Comprobación de la
WHERE prono=[Link])
condición where de la
consulta principal

WHERE 16= 16
Ejecución de la
SELECT MAX(hours)
subconsulta
FROM emppro
para la fila en
WHERE prono= 1001
color rojo

7654 es el que más horas trabaja en el proyecto 1001


Subconsultas correlacionadas
SELECT *
FROM emppro a
WHERE hours = (SELECT MAX(hours)
FROM emppro
Comprobación de la
WHERE prono=[Link])
condición where de la
consulta principal

WHERE 15= 15
Ejecución de la
SELECT MAX(hours)
subconsulta
FROM emppro
para la fila en
WHERE prono= 1004
color rojo

7499 es el que más horas trabaja en el proyecto 1004


Subconsultas correlacionadas
SELECT *
FROM emppro a
WHERE hours = (SELECT MAX(hours)
FROM emppro
Comprobación de la
WHERE prono=[Link])
condición where de la
consulta principal

WHERE 10= 15
Ejecución de la
SELECT MAX(hours)
subconsulta
FROM emppro
para la fila en
WHERE prono= 1004
color rojo

7521 no es el que más horas trabaja en el proyecto 1004


Subconsultas correlacionadas
SELECT *
FROM emppro a
WHERE hours = (SELECT MAX(hours)
FROM emppro
Comprobación de la
WHERE prono=[Link])
condición where de la
consulta principal

WHERE 6 = 12
Ejecución de la
SELECT MAX(hours)
subconsulta
FROM emppro
para la fila en
WHERE prono= 1005
color rojo

7844 no es el que más horas trabaja en el proyecto 1005

Y así hasta acabar con todas las filas de la consulta principal


Subconsultas correlacionadas con predicado exists

Predicado de existencia (EXISTS)


Comprueba si la subconsulta devuelve o no filas. Devuelve CIERTO si la subconsulta
devuelve filas y FALSO si no tiene filas.
Formato: [NOT] EXISTS (subconsulta)
La subconsulta puede devolver una tabla con cualquier número de columnas y filas.

SELECT dname
FROM dept d
WHERE EXISTS (select *
from emp
where deptno=[Link])
Ejercicios
1. Muestra el empleado/s con el salario más alto de cada departamento.
2. Muestra el código del empleado/s que más horas trabajan en cada proyecto.
3. Muestra el nombre de empleado/s que más horas trabajan en cada proyecto
4. Muestra el nombre de empleado/s que más horas trabajan en cada proyecto.
Muestra también el nombre del proyecto.
5. Para cada departamento muestra su nombre y cuántos empleados de ese
departamento tienen un salario mayor al salario medio de su departamento.
6. Para cada departamento muestra su nombre y cuántos empleados ganan más que
su jefe.
7. Muestra los nombres de los departamentos sin personal asociado
Ejercicios
1. Select ename, deptno, sal 2. Select prono, empno, hours
from emp e from emppro ep
where sal= (Select max(sal) from emp where hours= (Select max(hours) from emppro
where deptno=[Link]) where prono=[Link])

3. Select prono, ename, hours 4. Select pname, ename, hours


from emppro ep join emp e on [Link]=[Link] from emppro ep join emp e on [Link]=[Link]
where hours= (Select max(hours) from emppro join pro p on [Link]=[Link]
where prono=[Link]) where hours= (Select max(hours) from emppro
where prono=[Link])

5. Select dname, count(*) 6. Select dname, count(*)


from emp e join dept d on [Link]=[Link] from emp e join dept d on [Link]=[Link]
where sal > (Select avg(sal) from emp where sal > (Select sal from emp
where deptno=[Link]) where empno=[Link])
group by [Link], dname group by [Link], dname

7. Select dname, 7. Select dname


from dept From dept d
where deptno Where NOT EXISTS
NOT IN (Select deptno from emp); (Select * from emp where deptno = [Link]);
Guion
Introducción
Conceptos previos
Sentencia Select
Distinct
Order by
Predicados
Funciones
Group by
Having
Join
Subconsultas
Composición de consultas
Composición de consultas
SQL dispone de tres operadores de conjuntos: unión (UNION), intersección (INTERSECT)
y diferencia (EXCEPT).
Permiten realizar esas operaciones con las filas resultantes de dos sentencias select.
Formato: consulta1
{UNION|INTERSECT|EXCEPT} [ALL|DISTINCT]
consulta2
[order by <expre1>,…]
Las dos consultas deben ser “unión compatibles”:
Deben tener igual número de columnas.
Correspondencia de tipos entre las columnas ubicadas en la misma posición
(contando desde la izquierda).
ALL permite filas duplicadas, DISTINCT elimina filas duplicadas. El predeterminado es
DISTINCT.
Sólo puede haber un order by, que se aplicaría sobre el resultado de la operación
conjuntista
Composición de consultas
SELECT ename, sal+comm AS “Ingresos totales”, ‘Incluye comisión’ AS “Comisión?”
FROM emp
WHERE comm is not null
UNION
SELECT ename, sal, ‘No tiene comisión’
FROM emp
WHERE comm is null
ORDER BY “Ingresos totales”

También podría gustarte