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, …)
-
…
4. Operaciones de consulta sencillas para el filtrado de filas y columnas
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 |
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 |
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
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 |
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
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
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 |
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 |
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
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 |
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
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 |
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
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, |
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 |
|
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
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
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 |
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 |
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 |
USE RRHH;
SELECT nombre, empleo, CURDATE(), fechaEntrada, CURDATE() - fechaEntrada
FROM Empleado;
La diferencia aritmética entre |
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 |
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 |
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 |
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
|
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. |
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 |
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. |
USE RRHH;
SELECT *
FROM Empleado
ORDER BY sueldo DESC
LIMIT 3;
5.4. Funciones de agregación
La función |
USE RRHH;
SELECT MAX(sueldo) AS sueldoMaximo
FROM Empleado;
sueldoMaximo |
---|
5000 |
USE RRHH;
SELECT MAX(sueldo + COALESCE(complemento, 0)) AS sueldoTotalMaximo
FROM Empleado
WHERE complemento IS NOT NULL;
sueldoTotalMaximo |
---|
2650 |
La función |
USE RRHH;
SELECT MIN(fechaEntrada) AS primeraEntrada
FROM Empleado;
primeraEntrada |
---|
2000-12-17 |
USE RRHH;
SELECT DATE_FORMAT(MIN(fechaEntrada), '%d %b %Y') AS primeraEntrada
FROM Empleado;
primeraEntrada |
---|
17 Dec 2000 |
La función |
USE RRHH;
SELECT SUM(sueldo) AS sueldosDireccion
FROM Empleado
WHERE empleo LIKE 'Direc%';
sueldosDireccion |
---|
13275 |
La función |
USE RRHH;
SELECT AVG(sueldo) AS sueldoMedioVendedor
FROM Empleado
WHERE empleo = 'Vendedor';
sueldoMedioVendedor |
---|
1400 |
La función |
USE RRHH;
SELECT COUNT(*) as numeroEmpleados
FROM Empleado;
numeroEmpleados |
---|
14 |
Al añadir |
USE RRHH;
SELECT COUNT(DISTINCT empleo) as empleosDiferentes
FROM Empleado;
empleosDiferentes |
---|
5 |
|
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 |
USE RRHH;
SELECT empleo, COUNT(*) AS empleados
FROM Empleado
GROUP BY empleo;
empleo | empleados |
---|---|
Analista |
2 |
Directivo |
3 |
Director |
1 |
Ordenanza |
4 |
Vendedor |
4 |
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 |
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. |
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 |
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 |
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 |
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 |
CROSS JOIN
para mostrar todas las filas resultantes de combinar los empleados con los departamentosUSE 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. |
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 |
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 |
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 |
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 |
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 |
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 |
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 |
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. |
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. |
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 |
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
|
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 |
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 |
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)
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);
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)
USE RRHH;
INSERT INTO Empleado(numero, nombre, empleo, jefe, fechaEntrada, sueldo, numeroDepartamento)
VALUES(8003, 'Redondo', 'Ordenanza', 8000, '2017-03-01', 1200, 40);
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
USE RRHH;
UPDATE Empleado
SET complemento = 120
WHERE numero = 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
USE RRHH;
DELETE
FROM Empleado
WHERE numero = 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 |
USE RRHH;
DELETE
FROM Empleado
WHERE numeroDepartamento = 40;
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
|
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;
USE RRHH;
SELECT departamento, MAX(sueldo) as maximo
FROM EmpleadoDepartamento
GROUP BY departamento;
departamento | maximo |
---|---|
Contabilidad |
5000 |
Investigacion |
3000 |
Operaciones |
NULL |
Ventas |
2850 |