1. Introducción

  • Del inglés Structured Query Language.

  • Lenguaje más extendido para consultar y manipular Bases de datos relacionales

  • SQL es un lenguaje estándar. No obstante, existen gran cantidad de dialectos

2. Usos

  • Consulta de datos

  • Manipulación de datos (Inserción, modificación, eliminación)

  • Definición de datos (Tablas, Indices, Vistas, …​)

  • Configuración de seguridad (Usuarios, permisos, …​)

  • …​

3. Sintaxis básica

SELECT COLUMNAS SEPARADAS POR COMAS
FROM TABLA
WHERE CONDICION

4. Operaciones de consulta sencillas para el filtrado de filas y columnas

Example 1. Mostrar todos los empleados
USE RRHH;
SELECT *
FROM Empleado;
numero nombre empleo jefe fechaEntrada sueldo complemento numeroDepartamento

7369

Smith

Ordenanza

7902

2000-12-17

800

NULL

20

7499

Allen

Vendedor

7698

2001-02-20

1600

300

30

7521

Ward

Vendedor

7698

2001-02-22

1250

500

30

7566

Jones

Directivo

7839

2001-04-02

2975

NULL

20

7654

Martin

Vendedor

7698

2001-09-28

1250

1400

30

7698

Blake

Directivo

7839

2001-05-01

2850

NULL

30

7782

Clark

Directivo

7839

2001-06-09

2450

NULL

10

7788

Scott

Analista

7566

2002-12-09

3000

NULL

20

7839

King

Director

NULL

2001-11-17

5000

NULL

10

7844

Turner

Vendedor

7698

2001-09-08

1500

0

30

7876

Adams

Ordenanza

7788

2003-01-12

1100

NULL

20

7900

James

Ordenanza

7698

2001-12-03

950

NULL

30

7902

Ford

Analista

7566

2001-12-03

3000

NULL

20

7934

Miller

Ordenanza

7782

2002-01-23

1300

NULL

10

Example 2. Mostrar las filas de todos los empleados con empleo Vendedor.
USE RRHH;
SELECT *
FROM Empleado
WHERE empleo = 'Vendedor';
numero nombre empleo jefe fechaEntrada sueldo complemento numeroDepartamento

7499

Allen

Vendedor

7698

2001-02-20

1600

300

30

7521

Ward

Vendedor

7698

2001-02-22

1250

500

30

7654

Martin

Vendedor

7698

2001-09-28

1250

1400

30

7844

Turner

Vendedor

7698

2001-09-08

1500

0

30

Example 3. Mostrar el nombre, empleo y sueldo de todos los empleados
USE RRHH;
SELECT nombre, empleo, sueldo
FROM Empleado;
nombre empleo sueldo

Smith

Ordenanza

800

Allen

Vendedor

1600

Ward

Vendedor

1250

Jones

Directivo

2975

Martin

Vendedor

1250

Blake

Directivo

2850

Clark

Directivo

2450

Scott

Analista

3000

King

Director

5000

Turner

Vendedor

1500

Adams

Ordenanza

1100

James

Ordenanza

950

Ford

Analista

3000

Miller

Ordenanza

1300

4.1. Consultas con varias condiciones

4.1.1. El operador lógico AND

Example 4. Mostrar las filas de todos los empleados con empleo Vendedor y complemento de al menos 500 EUR.
USE RRHH;
SELECT *
FROM Empleado
WHERE empleo = 'Vendedor' AND complemento >= 500;
numero nombre empleo jefe fechaEntrada sueldo complemento numeroDepartamento

7521

Ward

Vendedor

7698

2001-02-22

1250

500

30

7654

Martin

Vendedor

7698

2001-09-28

1250

1400

30

Example 5. Mostrar el nombre, empleo y sueldo de todos los empleados con empleo Vendedor y complemento de al menos 500 EUR.
USE RRHH;
SELECT nombre, empleo, sueldo
FROM Empleado
WHERE empleo = 'Vendedor' AND complemento >= 500;
nombre empleo sueldo

Ward

Vendedor

1250

Martin

Vendedor

1250

4.1.2. El operador lógico OR

Example 6. Mostrar todas las filas de los empleados que tengan empleo de Vendedor, Directivo u Ordenanza
USE RRHH;
SELECT *
FROM Empleado
WHERE empleo = 'Vendedor' OR empleo = 'Directivo' OR empleo = 'Ordenanza';
numero nombre empleo jefe fechaEntrada sueldo complemento numeroDepartamento

7369

Smith

Ordenanza

7902

2000-12-17

800

NULL

20

7499

Allen

Vendedor

7698

2001-02-20

1600

300

30

7521

Ward

Vendedor

7698

2001-02-22

1250

500

30

7566

Jones

Directivo

7839

2001-04-02

2975

NULL

20

7654

Martin

Vendedor

7698

2001-09-28

1250

1400

30

7698

Blake

Directivo

7839

2001-05-01

2850

NULL

30

7782

Clark

Directivo

7839

2001-06-09

2450

NULL

10

7844

Turner

Vendedor

7698

2001-09-08

1500

0

30

7876

Adams

Ordenanza

7788

2003-01-12

1100

NULL

20

7900

James

Ordenanza

7698

2001-12-03

950

NULL

30

7934

Miller

Ordenanza

7782

2002-01-23

1300

NULL

10

4.2. El operador lógico IN y búsqueda aproximada

Example 7. Uso del operador IN para mostrar todas las filas de los empleados que tengan empleo de Vendedor, Directivo u Ordenanza
USE RRHH;
SELECT *
FROM Empleado
WHERE empleo IN ('Vendedor', 'Directivo', 'Ordenanza');
numero nombre empleo jefe fechaEntrada sueldo complemento numeroDepartamento

7369

Smith

Ordenanza

7902

2000-12-17

800

NULL

20

7499

Allen

Vendedor

7698

2001-02-20

1600

300

30

7521

Ward

Vendedor

7698

2001-02-22

1250

500

30

7566

Jones

Directivo

7839

2001-04-02

2975

NULL

20

7654

Martin

Vendedor

7698

2001-09-28

1250

1400

30

7698

Blake

Directivo

7839

2001-05-01

2850

NULL

30

7782

Clark

Directivo

7839

2001-06-09

2450

NULL

10

7844

Turner

Vendedor

7698

2001-09-08

1500

0

30

7876

Adams

Ordenanza

7788

2003-01-12

1100

NULL

20

7900

James

Ordenanza

7698

2001-12-03

950

NULL

30

7934

Miller

Ordenanza

7782

2002-01-23

1300

NULL

10

Example 8. Mostrar todas las filas de los empleados que no tienen como empleo Vendedor, Directivo u Ordenanza
USE RRHH;
SELECT *
FROM Empleado
WHERE empleo NOT IN ('Vendedor', 'Directivo', 'Ordenanza');
numero nombre empleo jefe fechaEntrada sueldo complemento numeroDepartamento

7788

Scott

Analista

7566

2002-12-09

3000

NULL

20

7839

King

Director

NULL

2001-11-17

5000

NULL

10

7902

Ford

Analista

7566

2001-12-03

3000

NULL

20

Example 9. Mostrar todas las filas de los empleados que tienen algún empleo de dirección.
USE RRHH;
SELECT *
FROM Empleado
WHERE empleo LIKE 'Direct%';
numero nombre empleo jefe fechaEntrada sueldo complemento numeroDepartamento

7566

Jones

Directivo

7839

2001-04-02

2975

NULL

20

7698

Blake

Directivo

7839

2001-05-01

2850

NULL

30

7782

Clark

Directivo

7839

2001-06-09

2450

NULL

10

7839

King

Director

NULL

2001-11-17

5000

NULL

10

4.3. Manejo de nulos

Example 10. Mostrar las filas de todos los empleados que no tienen datos de complemento
USE RRHH;
SELECT *
FROM Empleado
WHERE complemento IS NULL;
numero nombre empleo jefe fechaEntrada sueldo complemento numeroDepartamento

7369

Smith

Ordenanza

7902

2000-12-17

800

NULL

20

7566

Jones

Directivo

7839

2001-04-02

2975

NULL

20

7698

Blake

Directivo

7839

2001-05-01

2850

NULL

30

7782

Clark

Directivo

7839

2001-06-09

2450

NULL

10

7788

Scott

Analista

7566

2002-12-09

3000

NULL

20

7839

King

Director

NULL

2001-11-17

5000

NULL

10

7876

Adams

Ordenanza

7788

2003-01-12

1100

NULL

20

7900

James

Ordenanza

7698

2001-12-03

950

NULL

30

7902

Ford

Analista

7566

2001-12-03

3000

NULL

20

7934

Miller

Ordenanza

7782

2002-01-23

1300

NULL

10

Example 11. Mostrar las filas de todos los empleados que tiene datos de complemento
USE RRHH;
SELECT *
FROM Empleado
WHERE complemento IS NOT NULL;
numero nombre empleo jefe fechaEntrada sueldo complemento numeroDepartamento

7499

Allen

Vendedor

7698

2001-02-20

1600

300

30

7521

Ward

Vendedor

7698

2001-02-22

1250

500

30

7654

Martin

Vendedor

7698

2001-09-28

1250

1400

30

7844

Turner

Vendedor

7698

2001-09-08

1500

0

30

4.4. Consultas de un rango de valores

Example 12. Mostrar las filas de todos los empleados que tienen sueldo mayor o igual que 2000 y menor o igual que 3000
USE RRHH;
SELECT *
FROM Empleado
WHERE sueldo >= 2000 AND sueldo <= 3000;
numero nombre empleo jefe fechaEntrada sueldo complemento numeroDepartamento

7566

Jones

Directivo

7839

2001-04-02

2975

NULL

20

7698

Blake

Directivo

7839

2001-05-01

2850

NULL

30

7782

Clark

Directivo

7839

2001-06-09

2450

NULL

10

7788

Scott

Analista

7566

2002-12-09

3000

NULL

20

7902

Ford

Analista

7566

2001-12-03

3000

NULL

20

Example 13. Mostrar las filas de todos los empleados que tienen el sueldo comprendido entre 2000 y 3000
USE RRHH;
SELECT *
FROM Empleado
WHERE sueldo BETWEEN 2000 AND 3000;
numero nombre empleo jefe fechaEntrada sueldo complemento numeroDepartamento

7566

Jones

Directivo

7839

2001-04-02

2975

NULL

20

7698

Blake

Directivo

7839

2001-05-01

2850

NULL

30

7782

Clark

Directivo

7839

2001-06-09

2450

NULL

10

7788

Scott

Analista

7566

2002-12-09

3000

NULL

20

7902

Ford

Analista

7566

2001-12-03

3000

NULL

20

4.5. Uso de expresiones en SELECT

Example 14. Mostrar nombre y la suma de sueldo y complemento de todos los empleados
USE RRHH;
SELECT nombre, complemento +  sueldo
FROM Empleado
WHERE empleo = 'Vendedor';
nombre complemento + sueldo

Allen

1900

Ward

1750

Martin

2650

Turner

1500

La aparición de un valor NULL en una operación aritmética hace que el resultado sea NULL. Por ejemplo, NULL + valor = NULL

Example 15. Mostrar nombre, sueldo, complemento, sueldo y complemento de todos los empleados
USE RRHH;
SELECT nombre, sueldo, complemento, complemento +  sueldo
FROM Empleado;
nombre sueldo complemento complemento + sueldo

Smith

800

NULL

NULL

Allen

1600

300

1900

Ward

1250

500

1750

Jones

2975

NULL

NULL

Martin

1250

1400

2650

Blake

2850

NULL

NULL

Clark

2450

NULL

NULL

Scott

3000

NULL

NULL

King

5000

NULL

NULL

Turner

1500

0

1500

Adams

1100

NULL

NULL

James

950

NULL

NULL

Ford

3000

NULL

NULL

Miller

1300

NULL

NULL

COALESCE es una función que permite asociar un valor a una columna cuando es NULL. Por ejemplo, COALESCE(complemento, 0) indica que complemento tome el valor 0 cuando tenga un valor de NULL.

Example 16. Mostrar nombre, sueldo, complemento, sueldo y complemento de todos los empleados considerando como 0 los complementos nulos.
USE RRHH;
SELECT nombre, sueldo, complemento, sueldo + COALESCE(complemento, 0)
FROM Empleado;
nombre sueldo complemento sueldo + COALESCE(complemento, 0)

Smith

800

NULL

800

Allen

1600

300

1900

Ward

1250

500

1750

Jones

2975

NULL

2975

Martin

1250

1400

2650

Blake

2850

NULL

2850

Clark

2450

NULL

2450

Scott

3000

NULL

3000

King

5000

NULL

5000

Turner

1500

0

1500

Adams

1100

NULL

1100

James

950

NULL

950

Ford

3000

NULL

3000

Miller

1300

NULL

1300

4.6. Renombrado de columnas

Example 17. Mostrar nombre, sueldo, complemento y sueldo total de todos los empleados considerando como 0 los complementos nulos.
USE RRHH;
SELECT nombre, sueldo, complemento, sueldo + COALESCE(complemento, 0) AS sueldoTotal
FROM Empleado;
nombre sueldo complemento sueldoTotal

Smith

800

NULL

800

Allen

1600

300

1900

Ward

1250

500

1750

Jones

2975

NULL

2975

Martin

1250

1400

2650

Blake

2850

NULL

2850

Clark

2450

NULL

2450

Scott

3000

NULL

3000

King

5000

NULL

5000

Turner

1500

0

1500

Adams

1100

NULL

1100

James

950

NULL

950

Ford

3000

NULL

3000

Miller

1300

NULL

1300

5. Manejo de fechas

Example 18. Mostrar todas las filas de los empleados que se incorporaron a partir del 1 de enero de 2002
USE RRHH;
SELECT *
FROM Empleado
WHERE fechaEntrada >= '2002-01-01';
numero nombre empleo jefe fechaEntrada sueldo complemento numeroDepartamento

7788

Scott

Analista

7566

2002-12-09

3000

NULL

20

7876

Adams

Ordenanza

7788

2003-01-12

1100

NULL

20

7934

Miller

Ordenanza

7782

2002-01-23

1300

NULL

10

5.1. Funciones para el manejo de fechas

La función YEAR() aplicada a una fecha devuelve el año de la fecha en formato numérico.

Example 19. Mostrar todas las filas de los empleados cuya fecha de entrada no sea del año 2000
USE RRHH;
SELECT *
FROM Empleado
WHERE NOT YEAR(fechaEntrada) = 2000;
numero nombre empleo jefe fechaEntrada sueldo complemento numeroDepartamento

7499

Allen

Vendedor

7698

2001-02-20

1600

300

30

7521

Ward

Vendedor

7698

2001-02-22

1250

500

30

7566

Jones

Directivo

7839

2001-04-02

2975

NULL

20

7654

Martin

Vendedor

7698

2001-09-28

1250

1400

30

7698

Blake

Directivo

7839

2001-05-01

2850

NULL

30

7782

Clark

Directivo

7839

2001-06-09

2450

NULL

10

7788

Scott

Analista

7566

2002-12-09

3000

NULL

20

7839

King

Director

NULL

2001-11-17

5000

NULL

10

7844

Turner

Vendedor

7698

2001-09-08

1500

0

30

7876

Adams

Ordenanza

7788

2003-01-12

1100

NULL

20

7900

James

Ordenanza

7698

2001-12-03

950

NULL

30

7902

Ford

Analista

7566

2001-12-03

3000

NULL

20

7934

Miller

Ordenanza

7782

2002-01-23

1300

NULL

10

Example 20. Mostrar todas las filas de los empleados cuya fecha de entrada no sea del año 2000 ni 2001
USE RRHH;
SELECT *
FROM Empleado
WHERE NOT YEAR(fechaEntrada) IN (2000, 2001);
numero nombre empleo jefe fechaEntrada sueldo complemento numeroDepartamento

7788

Scott

Analista

7566

2002-12-09

3000

NULL

20

7876

Adams

Ordenanza

7788

2003-01-12

1100

NULL

20

7934

Miller

Ordenanza

7782

2002-01-23

1300

NULL

10

La función CURDATE() devuelve la fecha actual.

Example 21. Mostrar nombre, empleo, fecha actual, fecha de entrada y diferencia entre fecha actual y fecha de entrada
USE RRHH;
SELECT nombre, empleo, CURDATE(), fechaEntrada, CURDATE() - fechaEntrada
FROM Empleado;

La diferencia aritmética entre CURDATE() y la fecha de entrada devuelve un resultado anómalo. Usar en su lugar la función DATEDIFF().

nombre empleo CURDATE() fechaEntrada CURDATE() - fechaEntrada

Smith

Ordenanza

2017-03-11

2000-12-17

169094

Allen

Vendedor

2017-03-11

2001-02-20

160091

Ward

Vendedor

2017-03-11

2001-02-22

160089

Jones

Directivo

2017-03-11

2001-04-02

159909

Martin

Vendedor

2017-03-11

2001-09-28

159383

Blake

Directivo

2017-03-11

2001-05-01

159810

Clark

Directivo

2017-03-11

2001-06-09

159702

Scott

Analista

2017-03-11

2002-12-09

149102

King

Director

2017-03-11

2001-11-17

159194

Turner

Vendedor

2017-03-11

2001-09-08

159403

Adams

Ordenanza

2017-03-11

2003-01-12

140199

James

Ordenanza

2017-03-11

2001-12-03

159108

Ford

Analista

2017-03-11

2001-12-03

159108

Miller

Ordenanza

2017-03-11

2002-01-23

150188

La función DATEDIFF() devuelve la diferencia en días entre dos fechas.

Example 22. Mostrar nombre, empleo y antigüedad en días de todos los empleados.
USE RRHH;
SELECT nombre, empleo, DATEDIFF(CURDATE(), fechaEntrada) as antiguedad
FROM Empleado;
nombre empleo antiguedad

Smith

Ordenanza

5928

Allen

Vendedor

5863

Ward

Vendedor

5861

Jones

Directivo

5822

Martin

Vendedor

5643

Blake

Directivo

5793

Clark

Directivo

5754

Scott

Analista

5206

King

Director

5593

Turner

Vendedor

5663

Adams

Ordenanza

5172

James

Ordenanza

5577

Ford

Analista

5577

Miller

Ordenanza

5526

La función DATE_FORMAT() permite dar formato a un valor de tipo fecha. El formato se define en una cadena aplicando unos códigos de formato como los de la tabla siguiente.

Table 1. Códigos de formato habituales para DATEDIFF()
Código de formato Descripción

%d

Día del mes con dos dígitos

%e

Día del mes

%a

Nombre abreviado del día de la semana (Sun-Sat)

%W

Nombre del día de la semana (Sunday-Saturday)

%b

Nombre abreviado del mes (Jan-Dec)

%M

Nombre del mes (January-December)

%y

Año con dos dígitos

%Y

Año con cuatro dígitos

Example 23. Mostrar el nombre, empleo y feha de entrada de todos los empleados. La fecha de entrada se presentará con el día con dos dígitos, el mes abreviado y el año con cuatro dígitos.
USE RRHH;
SELECT nombre, empleo, DATE_FORMAT(fechaEntrada, '%d %b %Y') AS fechaEntrada
FROM Empleado;
nombre empleo fechaEntrada

Smith

Ordenanza

17 Dec 2000

Allen

Vendedor

20 Feb 2001

Ward

Vendedor

22 Feb 2001

Jones

Directivo

02 Apr 2001

Martin

Vendedor

28 Sep 2001

Blake

Directivo

01 May 2001

Clark

Directivo

09 Jun 2001

Scott

Analista

09 Dec 2002

King

Director

17 Nov 2001

Turner

Vendedor

08 Sep 2001

Adams

Ordenanza

12 Jan 2003

James

Ordenanza

03 Dec 2001

Ford

Analista

03 Dec 2001

Miller

Ordenanza

23 Jan 2002

5.2. Eliminación de duplicados

DISTINCT elimina los resultados duplicados tras la evaluación de una consulta.

Example 24. Mostrar los diferentes empleos que tienen los empleados almacenados.
USE RRHH;
SELECT DISTINCT (empleo)
FROM Empleado;
empleo

Ordenanza

Vendedor

Directivo

Analista

Director

5.3. Ordenación y limitación de resultados

La cláusula ORDER BY ordena los resultados de una consulta usando como criterios de ordenación la lista de columnas proporcionada.

Example 25. Mostrar todas las filas de empleados ordenadas por sueldo.
USE RRHH;
SELECT *
FROM Empleado
ORDER BY sueldo;
numero nombre empleo jefe fechaEntrada sueldo complemento numeroDepartamento

7369

Smith

Ordenanza

7902

2000-12-17

800

NULL

20

7900

James

Ordenanza

7698

2001-12-03

950

NULL

30

7876

Adams

Ordenanza

7788

2003-01-12

1100

NULL

20

7521

Ward

Vendedor

7698

2001-02-22

1250

500

30

7654

Martin

Vendedor

7698

2001-09-28

1250

1400

30

7934

Miller

Ordenanza

7782

2002-01-23

1300

NULL

10

7844

Turner

Vendedor

7698

2001-09-08

1500

0

30

7499

Allen

Vendedor

7698

2001-02-20

1600

300

30

7782

Clark

Directivo

7839

2001-06-09

2450

NULL

10

7698

Blake

Directivo

7839

2001-05-01

2850

NULL

30

7566

Jones

Directivo

7839

2001-04-02

2975

NULL

20

7902

Ford

Analista

7566

2001-12-03

3000

NULL

20

7788

Scott

Analista

7566

2002-12-09

3000

NULL

20

7839

King

Director

NULL

2001-11-17

5000

NULL

10

Example 26. Mostrar todas las filas de empleados ordenados por empleo y orden decreciente de sueldo.
USE RRHH;
SELECT *
FROM Empleado
ORDER BY empleo, sueldo DESC;
numero nombre empleo jefe fechaEntrada sueldo complemento numeroDepartamento

7788

Scott

Analista

7566

2002-12-09

3000

NULL

20

7902

Ford

Analista

7566

2001-12-03

3000

NULL

20

7566

Jones

Directivo

7839

2001-04-02

2975

NULL

20

7698

Blake

Directivo

7839

2001-05-01

2850

NULL

30

7782

Clark

Directivo

7839

2001-06-09

2450

NULL

10

7839

King

Director

NULL

2001-11-17

5000

NULL

10

7934

Miller

Ordenanza

7782

2002-01-23

1300

NULL

10

7876

Adams

Ordenanza

7788

2003-01-12

1100

NULL

20

7900

James

Ordenanza

7698

2001-12-03

950

NULL

30

7369

Smith

Ordenanza

7902

2000-12-17

800

NULL

20

7499

Allen

Vendedor

7698

2001-02-20

1600

300

30

7844

Turner

Vendedor

7698

2001-09-08

1500

0

30

7654

Martin

Vendedor

7698

2001-09-28

1250

1400

30

7521

Ward

Vendedor

7698

2001-02-22

1250

500

30

La cláusula LIMIT limita el número de filas devueltas al valor especificado.

Example 27. Mostrar las filas de los 3 empleados que tienen mayor sueldo
USE RRHH;
SELECT *
FROM Empleado
ORDER BY sueldo DESC
LIMIT 3;

5.4. Funciones de agregación

La función MAX() aplicada a una columna obtiene el valor máximo de la columna en los registros aplicados.

Example 28. Obtener el sueldo máximo de la tabla de empleados
USE RRHH;
SELECT MAX(sueldo) AS sueldoMaximo
FROM Empleado;
sueldoMaximo

5000

Example 29. Obtener el máximo de la combinación de sueldo y complemento de la tabla de empleados. Considerar como 0 los complementos nulos.
USE RRHH;
SELECT MAX(sueldo + COALESCE(complemento, 0)) AS sueldoTotalMaximo
FROM Empleado
WHERE complemento IS NOT NULL;
sueldoTotalMaximo

2650

La función MIN() aplicada a una columna obtiene el valor mínimo de la columna en los registros aplicados.

Example 30. Obtener la fecha de entrada más antigua
USE RRHH;
SELECT MIN(fechaEntrada) AS primeraEntrada
FROM Empleado;
primeraEntrada

2000-12-17

Example 31. Obtener la fecha de entrada más antigua aplicando el formato a la fecha de día con dos dígitos, mes abreviado y año con cuatro dígitos.
USE RRHH;
SELECT DATE_FORMAT(MIN(fechaEntrada), '%d %b %Y') AS primeraEntrada
FROM Empleado;
primeraEntrada

17 Dec 2000

La función SUM() aplicada a una columna obtiene la sumna de los valores numéricos de la columna en los registros aplicados.

Example 32. Obtener la suma de los sueldos dedicados a empleos de dirección.
USE RRHH;
SELECT SUM(sueldo) AS sueldosDireccion
FROM Empleado
WHERE empleo LIKE 'Direc%';
sueldosDireccion

13275

La función AVG() aplicada a una columna obtiene la media de los valores numéricos de la columna en los registros aplicados.

Example 33. Obtener el sueldo medio del empleo Vendedor.
USE RRHH;
SELECT AVG(sueldo) AS sueldoMedioVendedor
FROM Empleado
WHERE empleo = 'Vendedor';
sueldoMedioVendedor

1400

La función COUNT() aplicada a una columna obtiene la cantidad de valores no nulos en los registros aplicados. La función COUNT(*) devuelve la cantidad de filas del resultado.

Example 34. Obtener la cantidad de empleados que tenemos almacenados.
USE RRHH;
SELECT COUNT(*) as numeroEmpleados
FROM Empleado;
numeroEmpleados

14

Al añadir DISTINCT a la columna a la que se aplica COUNT() se obtiene la cuenta de valores diferentes eliminando los duplicados.

Example 35. Obtener el número de empleos diferentes que tienen los empleados.
USE RRHH;
SELECT COUNT(DISTINCT empleo) as empleosDiferentes
FROM Empleado;
empleosDiferentes

5

COUNT (DISTINCT columna) descarta los valores nulos.

Example 36. Obtener la cantidad de jefes diferentes
USE RRHH;
SELECT COUNT(DISTINCT jefe) as jefesDiferentes
FROM Empleado;
jefesDiferentes

6

6. Agregación de resultados

La cláusula GROUP BY crea grupos para la lista de columnas indicadas. Los grupos creados son la base a los que se les puede aplicar funciones de agregación COUNT(), SUM(), MAX(), MIN() y AVG().

Example 37. Obtener la cantidad de empleados que tiene cada empleo.
USE RRHH;
SELECT empleo, COUNT(*) AS empleados
FROM Empleado
GROUP BY empleo;
empleo empleados

Analista

2

Directivo

3

Director

1

Ordenanza

4

Vendedor

4

Example 38. Obtener la cantidad de empleados que tiene cada empleo para los empleados cuya fecha de entrada sea el año 2001.
USE RRHH;
SELECT empleo, COUNT(*) AS empleados
FROM Empleado
WHERE YEAR(fechaEntrada) = 2001
GROUP BY empleo;
empleo empleados

Analista

1

Directivo

3

Director

1

Ordenanza

1

Vendedor

4

Example 39. Obtener la cantidad de empleados por año de entrada
USE RRHH;
SELECT YEAR(fechaEntrada), COUNT(*) AS empleados
FROM Empleado
GROUP BY YEAR(fechaEntrada);
YEAR(fechaEntrada) empleados

2000

1

2001

10

2002

2

2003

1

La cláusula HAVING actúa como un filtro sobre los valores agregados.

Example 40. Obtener la cantidad de empleados por año de entrada para aquellos años que tengan más de 5 empleados.
USE RRHH;
SELECT YEAR(fechaEntrada), COUNT(*) AS empleados
FROM Empleado
GROUP BY YEAR(fechaEntrada)
HAVING COUNT(*) > 5;
YEAR(fechaEntrada) empleados

2001

10

No confundir la cláusula WHERE con la cláusula HAVING. WHERE actúa como un filtro para filas previo a la agregación. HAVING actúa como un filtro para grupos posterior al proceso de agregación.

Example 41. Obtener la cantidad de empleados por año de entrada considerando sólo aquellos empleados con sueldos comprendidos entre 2000 y 3000.
USE RRHH;
SELECT YEAR(fechaEntrada), COUNT(*) AS empleados
FROM Empleado
WHERE sueldo BETWEEN 2000 AND 3000
GROUP BY YEAR(fechaEntrada)
YEAR(fechaEntrada) empleados

2001

4

2002

1

Example 42. Obtener la cantidad de empleados por año de entrada considerando sólo aquellos empleados con sueldos comprendidos entre 2000 y 3000. mostrar sólo los resultados de aquellos años que tuvieron más de 3 empleados.
USE RRHH;
SELECT YEAR(fechaEntrada), COUNT(*) AS empleados
FROM Empleado
WHERE sueldo BETWEEN 2000 AND 3000
GROUP BY YEAR(fechaEntrada)
HAVING COUNT(*) > 3
YEAR(fechaEntrada) empleados

2001

4

7. Combinación de tablas

7.1. Combinación de tablas con producto cartesiano

La operación de producto cartesiano (o CROSS`JOIN) combina todas las filas de las tablas indicadas

Example 43. Mostrar todas las filas resultantes de combinar los empleados con los departamentos
USE RRHH;
SELECT *
FROM Empleado, Departamento

El resultado combina cada empleado con todos los departamentos existentes, aunque no sea el departamento en que trabaja.

numero nombre empleo jefe fechaEntrada sueldo complemento numeroDepartamento numero nombre ciudad

7369

Smith

Ordenanza

7902

2000-12-17

800

NULL

20

10

Contabilidad

Nueva York

7369

Smith

Ordenanza

7902

2000-12-17

800

NULL

20

20

Investigacion

Dallas

7369

Smith

Ordenanza

7902

2000-12-17

800

NULL

20

30

Ventas

Chicago

7369

Smith

Ordenanza

7902

2000-12-17

800

NULL

20

40

Operaciones

Boston

7499

Allen

Vendedor

7698

2001-02-20

1600

300

30

10

Contabilidad

Nueva York

7499

Allen

Vendedor

7698

2001-02-20

1600

300

30

20

Investigacion

Dallas

7499

Allen

Vendedor

7698

2001-02-20

1600

300

30

30

Ventas

Chicago

7499

Allen

Vendedor

7698

2001-02-20

1600

300

30

40

Operaciones

Boston

7521

Ward

Vendedor

7698

2001-02-22

1250

500

30

10

Contabilidad

Nueva York

7521

Ward

Vendedor

7698

2001-02-22

1250

500

30

20

Investigacion

Dallas

7521

Ward

Vendedor

7698

2001-02-22

1250

500

30

30

Ventas

Chicago

7521

Ward

Vendedor

7698

2001-02-22

1250

500

30

40

Operaciones

Boston

7566

Jones

Directivo

7839

2001-04-02

2975

NULL

20

10

Contabilidad

Nueva York

7566

Jones

Directivo

7839

2001-04-02

2975

NULL

20

20

Investigacion

Dallas

7566

Jones

Directivo

7839

2001-04-02

2975

NULL

20

30

Ventas

Chicago

7566

Jones

Directivo

7839

2001-04-02

2975

NULL

20

40

Operaciones

Boston

7654

Martin

Vendedor

7698

2001-09-28

1250

1400

30

10

Contabilidad

Nueva York

7654

Martin

Vendedor

7698

2001-09-28

1250

1400

30

20

Investigacion

Dallas

7654

Martin

Vendedor

7698

2001-09-28

1250

1400

30

30

Ventas

Chicago

7654

Martin

Vendedor

7698

2001-09-28

1250

1400

30

40

Operaciones

Boston

7698

Blake

Directivo

7839

2001-05-01

2850

NULL

30

10

Contabilidad

Nueva York

7698

Blake

Directivo

7839

2001-05-01

2850

NULL

30

20

Investigacion

Dallas

7698

Blake

Directivo

7839

2001-05-01

2850

NULL

30

30

Ventas

Chicago

7698

Blake

Directivo

7839

2001-05-01

2850

NULL

30

40

Operaciones

Boston

7782

Clark

Directivo

7839

2001-06-09

2450

NULL

10

10

Contabilidad

Nueva York

7782

Clark

Directivo

7839

2001-06-09

2450

NULL

10

20

Investigacion

Dallas

7782

Clark

Directivo

7839

2001-06-09

2450

NULL

10

30

Ventas

Chicago

7782

Clark

Directivo

7839

2001-06-09

2450

NULL

10

40

Operaciones

Boston

7788

Scott

Analista

7566

2002-12-09

3000

NULL

20

10

Contabilidad

Nueva York

7788

Scott

Analista

7566

2002-12-09

3000

NULL

20

20

Investigacion

Dallas

7788

Scott

Analista

7566

2002-12-09

3000

NULL

20

30

Ventas

Chicago

7788

Scott

Analista

7566

2002-12-09

3000

NULL

20

40

Operaciones

Boston

7839

King

Director

NULL

2001-11-17

5000

NULL

10

10

Contabilidad

Nueva York

7839

King

Director

NULL

2001-11-17

5000

NULL

10

20

Investigacion

Dallas

7839

King

Director

NULL

2001-11-17

5000

NULL

10

30

Ventas

Chicago

7839

King

Director

NULL

2001-11-17

5000

NULL

10

40

Operaciones

Boston

7844

Turner

Vendedor

7698

2001-09-08

1500

0

30

10

Contabilidad

Nueva York

7844

Turner

Vendedor

7698

2001-09-08

1500

0

30

20

Investigacion

Dallas

7844

Turner

Vendedor

7698

2001-09-08

1500

0

30

30

Ventas

Chicago

7844

Turner

Vendedor

7698

2001-09-08

1500

0

30

40

Operaciones

Boston

7876

Adams

Ordenanza

7788

2003-01-12

1100

NULL

20

10

Contabilidad

Nueva York

7876

Adams

Ordenanza

7788

2003-01-12

1100

NULL

20

20

Investigacion

Dallas

7876

Adams

Ordenanza

7788

2003-01-12

1100

NULL

20

30

Ventas

Chicago

7876

Adams

Ordenanza

7788

2003-01-12

1100

NULL

20

40

Operaciones

Boston

7900

James

Ordenanza

7698

2001-12-03

950

NULL

30

10

Contabilidad

Nueva York

7900

James

Ordenanza

7698

2001-12-03

950

NULL

30

20

Investigacion

Dallas

7900

James

Ordenanza

7698

2001-12-03

950

NULL

30

30

Ventas

Chicago

7900

James

Ordenanza

7698

2001-12-03

950

NULL

30

40

Operaciones

Boston

7902

Ford

Analista

7566

2001-12-03

3000

NULL

20

10

Contabilidad

Nueva York

7902

Ford

Analista

7566

2001-12-03

3000

NULL

20

20

Investigacion

Dallas

7902

Ford

Analista

7566

2001-12-03

3000

NULL

20

30

Ventas

Chicago

7902

Ford

Analista

7566

2001-12-03

3000

NULL

20

40

Operaciones

Boston

7934

Miller

Ordenanza

7782

2002-01-23

1300

NULL

10

10

Contabilidad

Nueva York

7934

Miller

Ordenanza

7782

2002-01-23

1300

NULL

10

20

Investigacion

Dallas

7934

Miller

Ordenanza

7782

2002-01-23

1300

NULL

10

30

Ventas

Chicago

7934

Miller

Ordenanza

7782

2002-01-23

1300

NULL

10

40

Operaciones

Boston

Example 44. Usar CROSS JOIN para mostrar todas las filas resultantes de combinar los empleados con los departamentos
USE RRHH;
SELECT *
FROM Empleado CROSS JOIN Departamento
numero nombre empleo jefe fechaEntrada sueldo complemento numeroDepartamento numero nombre ciudad

7369

Smith

Ordenanza

7902

2000-12-17

800

NULL

20

10

Contabilidad

Nueva York

7369

Smith

Ordenanza

7902

2000-12-17

800

NULL

20

20

Investigacion

Dallas

7369

Smith

Ordenanza

7902

2000-12-17

800

NULL

20

30

Ventas

Chicago

7369

Smith

Ordenanza

7902

2000-12-17

800

NULL

20

40

Operaciones

Boston

7499

Allen

Vendedor

7698

2001-02-20

1600

300

30

10

Contabilidad

Nueva York

7499

Allen

Vendedor

7698

2001-02-20

1600

300

30

20

Investigacion

Dallas

7499

Allen

Vendedor

7698

2001-02-20

1600

300

30

30

Ventas

Chicago

7499

Allen

Vendedor

7698

2001-02-20

1600

300

30

40

Operaciones

Boston

7521

Ward

Vendedor

7698

2001-02-22

1250

500

30

10

Contabilidad

Nueva York

7521

Ward

Vendedor

7698

2001-02-22

1250

500

30

20

Investigacion

Dallas

7521

Ward

Vendedor

7698

2001-02-22

1250

500

30

30

Ventas

Chicago

7521

Ward

Vendedor

7698

2001-02-22

1250

500

30

40

Operaciones

Boston

7566

Jones

Directivo

7839

2001-04-02

2975

NULL

20

10

Contabilidad

Nueva York

7566

Jones

Directivo

7839

2001-04-02

2975

NULL

20

20

Investigacion

Dallas

7566

Jones

Directivo

7839

2001-04-02

2975

NULL

20

30

Ventas

Chicago

7566

Jones

Directivo

7839

2001-04-02

2975

NULL

20

40

Operaciones

Boston

7654

Martin

Vendedor

7698

2001-09-28

1250

1400

30

10

Contabilidad

Nueva York

7654

Martin

Vendedor

7698

2001-09-28

1250

1400

30

20

Investigacion

Dallas

7654

Martin

Vendedor

7698

2001-09-28

1250

1400

30

30

Ventas

Chicago

7654

Martin

Vendedor

7698

2001-09-28

1250

1400

30

40

Operaciones

Boston

7698

Blake

Directivo

7839

2001-05-01

2850

NULL

30

10

Contabilidad

Nueva York

7698

Blake

Directivo

7839

2001-05-01

2850

NULL

30

20

Investigacion

Dallas

7698

Blake

Directivo

7839

2001-05-01

2850

NULL

30

30

Ventas

Chicago

7698

Blake

Directivo

7839

2001-05-01

2850

NULL

30

40

Operaciones

Boston

7782

Clark

Directivo

7839

2001-06-09

2450

NULL

10

10

Contabilidad

Nueva York

7782

Clark

Directivo

7839

2001-06-09

2450

NULL

10

20

Investigacion

Dallas

7782

Clark

Directivo

7839

2001-06-09

2450

NULL

10

30

Ventas

Chicago

7782

Clark

Directivo

7839

2001-06-09

2450

NULL

10

40

Operaciones

Boston

7788

Scott

Analista

7566

2002-12-09

3000

NULL

20

10

Contabilidad

Nueva York

7788

Scott

Analista

7566

2002-12-09

3000

NULL

20

20

Investigacion

Dallas

7788

Scott

Analista

7566

2002-12-09

3000

NULL

20

30

Ventas

Chicago

7788

Scott

Analista

7566

2002-12-09

3000

NULL

20

40

Operaciones

Boston

7839

King

Director

NULL

2001-11-17

5000

NULL

10

10

Contabilidad

Nueva York

7839

King

Director

NULL

2001-11-17

5000

NULL

10

20

Investigacion

Dallas

7839

King

Director

NULL

2001-11-17

5000

NULL

10

30

Ventas

Chicago

7839

King

Director

NULL

2001-11-17

5000

NULL

10

40

Operaciones

Boston

7844

Turner

Vendedor

7698

2001-09-08

1500

0

30

10

Contabilidad

Nueva York

7844

Turner

Vendedor

7698

2001-09-08

1500

0

30

20

Investigacion

Dallas

7844

Turner

Vendedor

7698

2001-09-08

1500

0

30

30

Ventas

Chicago

7844

Turner

Vendedor

7698

2001-09-08

1500

0

30

40

Operaciones

Boston

7876

Adams

Ordenanza

7788

2003-01-12

1100

NULL

20

10

Contabilidad

Nueva York

7876

Adams

Ordenanza

7788

2003-01-12

1100

NULL

20

20

Investigacion

Dallas

7876

Adams

Ordenanza

7788

2003-01-12

1100

NULL

20

30

Ventas

Chicago

7876

Adams

Ordenanza

7788

2003-01-12

1100

NULL

20

40

Operaciones

Boston

7900

James

Ordenanza

7698

2001-12-03

950

NULL

30

10

Contabilidad

Nueva York

7900

James

Ordenanza

7698

2001-12-03

950

NULL

30

20

Investigacion

Dallas

7900

James

Ordenanza

7698

2001-12-03

950

NULL

30

30

Ventas

Chicago

7900

James

Ordenanza

7698

2001-12-03

950

NULL

30

40

Operaciones

Boston

7902

Ford

Analista

7566

2001-12-03

3000

NULL

20

10

Contabilidad

Nueva York

7902

Ford

Analista

7566

2001-12-03

3000

NULL

20

20

Investigacion

Dallas

7902

Ford

Analista

7566

2001-12-03

3000

NULL

20

30

Ventas

Chicago

7902

Ford

Analista

7566

2001-12-03

3000

NULL

20

40

Operaciones

Boston

7934

Miller

Ordenanza

7782

2002-01-23

1300

NULL

10

10

Contabilidad

Nueva York

7934

Miller

Ordenanza

7782

2002-01-23

1300

NULL

10

20

Investigacion

Dallas

7934

Miller

Ordenanza

7782

2002-01-23

1300

NULL

10

30

Ventas

Chicago

7934

Miller

Ordenanza

7782

2002-01-23

1300

NULL

10

40

Operaciones

Boston

La eliminación de las filas que combinan los empleados con departamentos en los que no trabajan se puede realizar aplicando un filtro que seleccione sólo las filas en que coincidan el número de departamento en el que trabajan los empleados con el número de los departamentos.

Example 45. Mostrar las filas resultantes de combinar los empleados con los departamentos en los que trabaja cada uno de ellos.
USE RRHH;
SELECT *
FROM Empleado,
	Departamento
WHERE Empleado.numeroDepartamento = Departamento.numero
numero nombre empleo jefe fechaEntrada sueldo complemento numeroDepartamento numero nombre ciudad

7782

Clark

Directivo

7839

2001-06-09

2450

NULL

10

10

Contabilidad

Nueva York

7839

King

Director

NULL

2001-11-17

5000

NULL

10

10

Contabilidad

Nueva York

7934

Miller

Ordenanza

7782

2002-01-23

1300

NULL

10

10

Contabilidad

Nueva York

7369

Smith

Ordenanza

7902

2000-12-17

800

NULL

20

20

Investigacion

Dallas

7566

Jones

Directivo

7839

2001-04-02

2975

NULL

20

20

Investigacion

Dallas

7788

Scott

Analista

7566

2002-12-09

3000

NULL

20

20

Investigacion

Dallas

7876

Adams

Ordenanza

7788

2003-01-12

1100

NULL

20

20

Investigacion

Dallas

7902

Ford

Analista

7566

2001-12-03

3000

NULL

20

20

Investigacion

Dallas

7499

Allen

Vendedor

7698

2001-02-20

1600

300

30

30

Ventas

Chicago

7521

Ward

Vendedor

7698

2001-02-22

1250

500

30

30

Ventas

Chicago

7654

Martin

Vendedor

7698

2001-09-28

1250

1400

30

30

Ventas

Chicago

7698

Blake

Directivo

7839

2001-05-01

2850

NULL

30

30

Ventas

Chicago

7844

Turner

Vendedor

7698

2001-09-08

1500

0

30

30

Ventas

Chicago

7900

James

Ordenanza

7698

2001-12-03

950

NULL

30

30

Ventas

Chicago

Example 46. Mostrar las filas resultantes de combinar el departamento de Ventas con sus empleados.
USE RRHH;
SELECT *
FROM Empleado,
	Departamento
WHERE Empleado.numeroDepartamento = Departamento.numero AND
	Departamento.nombre = 'Ventas'
numero nombre empleo jefe fechaEntrada sueldo complemento numeroDepartamento numero nombre ciudad

7499

Allen

Vendedor

7698

2001-02-20

1600

300

30

30

Ventas

Chicago

7521

Ward

Vendedor

7698

2001-02-22

1250

500

30

30

Ventas

Chicago

7654

Martin

Vendedor

7698

2001-09-28

1250

1400

30

30

Ventas

Chicago

7698

Blake

Directivo

7839

2001-05-01

2850

NULL

30

30

Ventas

Chicago

7844

Turner

Vendedor

7698

2001-09-08

1500

0

30

30

Ventas

Chicago

7900

James

Ordenanza

7698

2001-12-03

950

NULL

30

30

Ventas

Chicago

Example 47. Obtener la cantidad de empleados que hay en el departamento de Ventas agrupados por el tipo de empleo.
USE RRHH;
SELECT empleo, COUNT(*) as empleadosDeVentas
FROM Empleado,
	Departamento
WHERE Empleado.numeroDepartamento = Departamento.numero AND
	Departamento.nombre = 'Ventas'
GROUP BY empleo;
empleo empleados

Directivo

1

Ordenanza

1

Vendedor

4

Example 48. Obtener para las ciudades de Dallas y Chicago la cantidad de empleados y su sueldo medio.
USE RRHH;
SELECT ciudad, COUNT(*) as empleados, AVG(sueldo) as sueldoMedio
FROM Empleado,
	Departamento
WHERE Empleado.numeroDepartamento = Departamento.numero AND
	Departamento.ciudad IN ('Dallas', 'Chicago')
GROUP BY ciudad;
ciudad empleados sueldoMedio

Chicago

6

1566.6666666666667

Dallas

5

2175

Example 49. Obtener el sueldo medio por ciudades para aquellos casos que tengan un sueldo medio superior a 2000.
USE RRHH;
SELECT ciudad, AVG(sueldo) as sueldoMedio
FROM Empleado,
	Departamento
WHERE Empleado.numeroDepartamento = Departamento.numero
GROUP BY ciudad
HAVING AVG(sueldo) > 2000;
ciudad sueldoMedio

Dallas

2175

Nueva York

2916.6666666666665

7.2. Combinación de tablas con INNER JOIN

El operador ÌNNER JOIN` combina en una única operación el producto cartesiano y el filtrado de filas con el criterio indicado. La condición de filtrado pasa de la cláusula WHERE a la cláusula FROM sacando de la cláusula WHERE las condiciones de join.

Example 50. Usar el operador INNER JOIN para mostrar todas las columnas de empleado junto al nombre del departamento en que trabajan para aquellos empleados que trabajan en el departamento de Ventas.
USE RRHH;
SELECT Empleado.*, Departamento.nombre
FROM Empleado INNER JOIN
	Departamento ON Empleado.numeroDepartamento = Departamento.numero
WHERE Departamento.nombre = 'Contabilidad';
numero nombre empleo jefe fechaEntrada sueldo complemento numeroDepartamento nombre

7782

Clark

Directivo

7839

2001-06-09

2450

NULL

10

Contabilidad

7839

King

Director

NULL

2001-11-17

5000

NULL

10

Contabilidad

7934

Miller

Ordenanza

7782

2002-01-23

1300

NULL

10

Contabilidad

7.3. Combinación de tablas con LEFT JOIN

El operador LEFT JOIN relaja al operador INNER JOIN mostrando en los resultados todas las filas de la tabla que aparece a la izquierda del LEFT JOIN. Si hay valores con los que combinar mostrará los valores. Si no hay valores, completará el resultado con valores NULL.

Example 51. Obtener la cantidad de empleados que tiene cada departamento.
USE RRHH;
SELECT Departamento.nombre, COUNT(Empleado.numero) AS empleados
FROM Departamento LEFT JOIN
	Empleado ON Departamento.numero = Empleado.numeroDepartamento
GROUP BY Departamento.nombre;
nombre empleados

Contabilidad

3

Investigacion

5

Operaciones

0

Ventas

6

Si se realiza la combinación de tablas con el operador INNER JOIN se perdería el departamento de Operaciones.

Example 52. Obtener la cantidad de empleados que tiene cada departamento usando INNER JOIN
USE RRHH;
SELECT Departamento.nombre, COUNT(Empleado.numero) AS empleados
FROM Departamento INNER JOIN
	Empleado ON Departamento.numero = Empleado.numeroDepartamento
GROUP BY Departamento.nombre;
nombre empleados

Contabilidad

3

Investigacion

5

Ventas

6

8. Uso de alias para tablas

Es posible utilizar un nuevo nombre (o alias) para una tabla involucrada en una consulta. Un caso habitual de uso de los alias es para usar un nombre abreviado para las tablas.

Example 53. Obtener la cantidad de empleados por nombre de departamento
USE RRHH;
SELECT D.nombre, COUNT(E.numero) AS empleados
FROM Departamento D INNER JOIN
	Empleado E ON D.numero = E.numeroDepartamento
GROUP BY D.nombre;
nombre empleados

Contabilidad

3

Investigacion

5

Ventas

6

El uso de alias hace que la tabla a la que se le ha aplicado el alias pase a ser denominada con el nombre del alias. El uso del nombre anterior produciría un error.

9. Subconsultas

Los resultados que devuelve una consulta pueden ser usados para evaluar las condiciones de otras consultas. Esto se consigue anidando consultas. Las consultas internas se denominan subconsultas, que son evaluadas en primer lugar ofreciendo sus valores a las consultas exteriores.

Example 54. Obtener nombre y sueldo de los empleados que tienen un sueldo superior al sueldo del empleado Allen.
USE RRHH;
SELECT nombre, sueldo
FROM Empleado
WHERE sueldo > (
	SELECT sueldo
	FROM Empleado
	WHERE nombre = 'Allen')
ORDER BY sueldo DESC;
nombre sueldo

King

5000

Scott

3000

Ford

3000

Jones

2975

Blake

2850

Clark

2450

Example 55. Obtener nombre y sueldo de los empleados que tienen un sueldo superior al sueldo máximo de los empleados con empleo Vendedor en la ciudad de Chicago.
USE RRHH;
SELECT nombre, sueldo
FROM Empleado
WHERE sueldo > (
	SELECT MAX(sueldo)
	FROM Empleado E INNER JOIN
		Departamento D ON E.numeroDepartamento = D.numero
	WHERE empleo = 'Vendedor' AND
		ciudad = 'Chicago')
ORDER BY sueldo DESC;
nombre sueldo

King

5000

Scott

3000

Ford

3000

Jones

2975

Blake

2850

Clark

2450

9.1. Los operadores ALL y ANY

ALL se evalua como verdadero cuando se cumple para todos los valores afectados. ANY se evalua como verdadero cuando se cumple para alguno de los valores afectados.

Example 56. Obtener nombre y sueldo de los empleados que tienen un sueldo superior al sueldo de todos los empleados con empleo Vendedor en la ciudad de Chicago.
USE RRHH;
SELECT nombre, sueldo
FROM Empleado
WHERE sueldo > ALL (
	SELECT sueldo
	FROM Empleado E INNER JOIN
		Departamento D ON E.numeroDepartamento = D.numero
	WHERE empleo = 'Vendedor' AND
		ciudad = 'Chicago')
ORDER BY sueldo DESC;
nombre sueldo

King

5000

Scott

3000

Ford

3000

Jones

2975

Blake

2850

Clark

2450

Example 57. Obtener nombre y sueldo de los empleados que tienen un sueldo superior al sueldo de alguno de los empleados con empleo Vendedor en la ciudad de Chicago.
USE RRHH;
SELECT nombre, sueldo
FROM Empleado
WHERE sueldo > ANY (
	SELECT sueldo
	FROM Empleado E INNER JOIN
		Departamento D ON E.numeroDepartamento = D.numero
	WHERE empleo = 'Vendedor' AND
		ciudad = 'Chicago')
ORDER BY sueldo DESC;
nombre sueldo

King

5000

Scott

3000

Ford

3000

Jones

2975

Blake

2850

Clark

2450

Allen

1600

Turner

1500

Miller

1300

9.2. Subconsultas en FROM

Un uso más avanzado de las subconsultas consiste en la creación de una consulta en la cláusula FROM. La subconsulta recibirá un nombre provisional que podrá ser utilizado en la consulta externa como si de una tabla existente se tratase.

Example 58. Mostrar para cada número de departamento el nombre, empleo y sueldo del empleado con mayor sueldo.
USE RRHH;
SELECT nombre, empleo, sueldo, E.numeroDepartamento
FROM Empleado E INNER JOIN
	(SELECT numeroDepartamento, MAX(sueldo) as maximo
		FROM EmpleadoDepartamento
		GROUP BY numeroDepartamento) M ON E.numeroDepartamento = M.numeroDepartamento
WHERE sueldo = maximo
nombre empleo sueldo numeroDepartamento

King

Director

5000

10

Scott

Analista

3000

20

Ford

Analista

3000

20

Blake

Directivo

2850

30

10. Inserción, modificación y eliminación de registros

10.1. Uso básico de INSERT (Introducción de todos los valores)

INSERT INTO tabla
VALUES(valor columna 1, ..., valor columna n)
Example 59. Insertar tres empleados en el departamento 40. Uno de ellos es el jefe de los otros dos y no tendrá complemento.
USE RRHH;
INSERT INTO Empleado VALUES(8000, 'Lucas', 'Directivo', 7839, '2017-02-01', 2000, NULL, 40);
INSERT INTO Empleado VALUES(8001, 'Navarro', 'Vendedor', 8000, '2017-03-01', 1500, 200, 40);
INSERT INTO Empleado VALUES(8002, 'Casinello', 'Vendedor', 8000, '2017-03-01', 1300, 100, 40);
Example 60. Mostrar los registros de los empleados del departamento Operaciones para comprobar el resultado de las 3 inserciones.
USE RRHH;
SELECT *
FROM EmpleadoDepartamento
WHERE departamento = 'Operaciones';
numero nombre empleo jefe fechaEntrada sueldo complemento numeroDepartamento departamento ciudad

8000

Lucas

Directivo

7839

2017-02-01

2000

NULL

40

Operaciones

Boston

8001

Navarro

Vendedor

8000

2017-03-01

1500

200

40

Operaciones

Boston

8002

Casinello

Vendedor

8000

2017-03-01

1300

100

40

Operaciones

Boston

10.2. Uso de INSERT para añadir filas incompletas (No se introducen todos los valores)

INSERT INTO tabla(columna1, ..., columna m)
VALUES(valor columna 1, ..., valor columna m)
Example 61. Insertar un empleado en el departamento 40 omitiendo la columna complemento.
USE RRHH;
INSERT INTO Empleado(numero, nombre, empleo, jefe, fechaEntrada, sueldo, numeroDepartamento)
	VALUES(8003, 'Redondo', 'Ordenanza', 8000, '2017-03-01', 1200, 40);
Table 2. Los registros de los empleados del departamento Operaciones tras el resultado de la inserción.
numero nombre empleo jefe fechaEntrada sueldo complemento numeroDepartamento departamento ciudad

8000

Lucas

Directivo

7839

2017-02-01

2000

NULL

40

Operaciones

Boston

8001

Navarro

Vendedor

8000

2017-03-01

1500

200

40

Operaciones

Boston

8002

Casinello

Vendedor

8000

2017-03-01

1300

100

40

Operaciones

Boston

8003

Redondo

Ordenanza

8000

2017-03-01

1200

NULL

40

Operaciones

Boston

10.3. Actualización de registros con UPDATE

UPDATE tabla
SET campo 1 = valor 1, ..., campo n = valor n
WHERE condicion
Example 62. Actualizar a 120 el valor del complemento del empleado con numero 8003
USE RRHH;
UPDATE Empleado
SET complemento = 120
WHERE numero = 8003;
Table 3. Empleados del departamento de Operaciones tras la actualización del complemento del empleado 8003.
numero nombre empleo jefe fechaEntrada sueldo complemento numeroDepartamento departamento ciudad

8000

Lucas

Directivo

7839

2017-02-01

2000

NULL

40

Operaciones

Boston

8001

Navarro

Vendedor

8000

2017-03-01

1500

200

40

Operaciones

Boston

8002

Casinello

Vendedor

8000

2017-03-01

1300

100

40

Operaciones

Boston

8003

Redondo

Ordenanza

8000

2017-03-01

1200

120

40

Operaciones

Boston

10.4. Eliminación de registros con DELETE

DELETE
FROM tabla
WHERE condicion
Example 63. Eliminar el empleado con número 8003
USE RRHH;
DELETE
FROM Empleado
WHERE numero = 8003;
Table 4. Empleados del departamento de Operaciones tras la eliminación del empleado 8003
numero nombre empleo jefe fechaEntrada sueldo complemento numeroDepartamento departamento ciudad

8000

Lucas

Directivo

7839

2017-02-01

2000

NULL

40

Operaciones

Boston

8001

Navarro

Vendedor

8000

2017-03-01

1500

200

40

Operaciones

Boston

8002

Casinello

Vendedor

8000

2017-03-01

1300

100

40

Operaciones

Boston

Example 64. Eliminar todos los emepleados del departamento Operaciones
USE RRHH;
DELETE
FROM Empleado
WHERE numeroDepartamento = 40;
Table 5. Empleados del departamento Operaciones tras la eliminación de todos sus empleados
numero nombre empleo jefe fechaEntrada sueldo complemento numeroDepartamento departamento ciudad

NULL

NULL

NULL

NULL

NULL

NULL

NULL

NULL

Operaciones

Boston

11. Vistas

  • Se definen mediante una expresión SQL que recupera su contenido.

  • Su contenido se obtiene bajo demanda evaluando la expresión SQL que las define

  • Se definen a partir de tablas u otras vistas existentes

  • Se pueden considerar tablas virtuales. No almacenan datos.

CREATE VIEW AS
expresion SELECT

Uso de las vistas

  • Personalización de datos

  • Mecanismo de seguridad. Se da acceso a vistas y no a las tablas base

  • Simplificación de consultas

Example 65. Crear una vista que combine cada departamento con los datos de sus empleados. Si no hay datos de empleados, completar con NULL.
USE RRHH;
CREATE OR REPLACE VIEW EmpleadoDepartamento AS
SELECT E.*, D.nombre AS departamento, D.ciudad
FROM Departamento D LEFT JOIN
	Empleado E ON D.numero = E.numeroDepartamento;
Example 66. Usar la vista anterior para obtener el sueldo máximo para cada departamento.
USE RRHH;
SELECT departamento, MAX(sueldo) as maximo
FROM EmpleadoDepartamento
GROUP BY departamento;
departamento maximo

Contabilidad

5000

Investigacion

3000

Operaciones

NULL

Ventas

2850