¡Practiquemos las consultas SQL con MySQL! (I de IV)

Hola amig@s, ¿qué hay de nuevo? ¡Ya sois más de 100 personas las que me seguís en Twitter! Muchas gracias por seguirme. Os cuento que, a petición de un@ de vosotr@s, en la siguiente serie de posts voy a tratar el tema de las consultas SQL con MySQL: consultas simples, consultas resumen, consultas multitabla (los JOINS), subconsultas, etc.

La idea es disponer de estos posts para que cuando no recordéis exactamente cómo iba una consulta, podáis venir aquí, a la sección MySQL de programarivm.com, y copypastear dicha consulta. Crearemos una BBDD de ejemplo y empezaremos a lanzar diferentes consultas que se irán complicando poco a poco.

Personalmente, hacer este ejercicio me viene muy bien porque últimamente me he acostumbrado a trabajar con las bases de datos en el plano abstracto, comunicándome con la BBDD desde una capa modelo ya programada en mis aplicaciones.

Pero eso es otra historia…

Bueno chic@s, allá va sin más preámbulos la base de datos de ejemplo sobre la que vamos a trabajar nuestros ejercicios MySQL. Are you ready?

– ¡No os oigo bien!, chic@s. Are you readyyyy?

– ¿Sí? ¡Pues allá va!

CREATE DATABASE company;
 
USE company;
 
CREATE TABLE departments (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    number TINYINT UNSIGNED NOT NULL,
    name VARCHAR(32) NOT NULL,
    location VARCHAR(32) NOT NULL,
    PRIMARY KEY(id)
) ENGINE=InnoDB;
 
CREATE TABLE employees (
    id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
    number MEDIUMINT UNSIGNED NOT NULL,
    name VARCHAR(32) NOT NULL,
    job VARCHAR(32) NOT NULL,
    hire_date DATETIME NOT NULL,
    salary SMALLINT UNSIGNED NOT NULL,
    commission SMALLINT UNSIGNED NULL,
    id_employee MEDIUMINT UNSIGNED NULL,
    id_department SMALLINT UNSIGNED NOT NULL,
    PRIMARY KEY(id),
    FOREIGN KEY(id_employee) REFERENCES employees(id),
    FOREIGN KEY(id_department) REFERENCES departments(id)
) ENGINE=InnoDB;
 
INSERT INTO departments(number, name, location)
VALUES
(101, 'Cuentas', 'Madrid'),
(76, 'I+D', 'Sevilla'),
(25, 'Ventas', 'Barcelona'),
(88, 'E-commerce', 'Barcelona');
 
INSERT INTO employees(number, name, job, hire_date, salary, commission, id_employee, id_department)
VALUES
(1, 'Julián', 'Director general', '2004-11-10', 4000, NULL, NULL, 1),
(10, 'Pepa', 'Jefe de cuentas', '2004-11-10', 3500, 300, 1, 1),
(11, 'Juan', 'Director técnico', '2004-11-25', 3600, NULL, 1, 2),
(12, 'Marta', 'Jefa de ventas', '2004-11-19', 2500, 500, 1, 3),
(13, 'Ignacio', 'Director e-commerce', '2004-11-10', 2300, 700, 1, 4),
(88, 'Carlos', 'Administrativo', '2004-12-11', 1200, NULL, 2, 1),
(89, 'Silvia', 'Contable', '2004-12-11', 1300, NULL, 2, 1),
(90, 'María', 'Administrativa', '2004-12-11', 1200, NULL, 2, 1),
(91, 'Pedro', 'Contable', '2004-12-11', 1300, NULL, 2, 1),
(92, 'Teresa', 'Ingeniera', '2004-12-11', 2100, NULL, 3, 2),
(93, 'Isabel', 'Ingeniera Técnica', '2004-12-28', 1800, NULL, 3, 2),
(94, 'Javier', 'Ingeniero Técnico', '2004-12-11', 1800, NULL, 3, 2),
(95, 'Fernando', 'Ingeniero', '2004-12-11', 2100, NULL, 3, 2),
(96, 'Laura', 'Comercial', '2004-12-30', 2100, 500, 4, 3),
(97, 'Montse', 'Comercial', '2004-12-27', 1800, 600, 4, 3),
(100, 'Jorge', 'Comercial', '2004-12-30', 1800, 500, 4, 3),
(102, 'Arturo', 'Comercial', '2004-12-12', 2100, 550, 4, 3),
(105, 'Juan', 'Programador', '2004-12-11', 1800, NULL, 5, 4),
(109, 'Pepe', 'Programador', '2005-01-01', 1700, NULL, 5, 4),
(110, 'Juan', 'SEO', '2005-01-01', 2000, 200, 5, 4),
(112, 'Pepe', 'Analista', '2005-01-01', 1700, NULL, 5, 4);

La información de las tablas queda así:

mysql> SELECT * FROM departments;
+----+--------+------------+-----------+
| id | number | name       | location  |
+----+--------+------------+-----------+
|  1 |    101 | Cuentas    | Madrid    |
|  2 |     76 | I+D        | Sevilla   |
|  3 |     25 | Ventas     | Barcelona |
|  4 |     88 | E-commerce | Barcelona |
+----+--------+------------+-----------+
4 rows in set (0.00 sec)
 
mysql> SELECT * FROM employees;
+----+--------+----------+---------------------+---------------------+--------+------------+-------------+---------------+
| id | number | name     | job                 | hire_date           | salary | commission | id_employee | id_department |
+----+--------+----------+---------------------+---------------------+--------+------------+-------------+---------------+
|  1 |      1 | Julián   | Director general    | 2004-11-10 00:00:00 |   4000 |       NULL |        NULL |             1 |
|  2 |     10 | Pepa     | Jefe de cuentas     | 2004-11-10 00:00:00 |   3500 |        300 |           1 |             1 |
|  3 |     11 | Juan     | Director técnico    | 2004-11-25 00:00:00 |   3600 |       NULL |           1 |             2 |
|  4 |     12 | Marta    | Jefa de ventas      | 2004-11-19 00:00:00 |   2500 |        500 |           1 |             3 |
|  5 |     13 | Ignacio  | Director e-commerce | 2004-11-10 00:00:00 |   2300 |        700 |           1 |             4 |
|  6 |     88 | Carlos   | Administrativo      | 2004-12-11 00:00:00 |   1200 |       NULL |           2 |             1 |
|  7 |     89 | Silvia   | Contable            | 2004-12-11 00:00:00 |   1300 |       NULL |           2 |             1 |
|  8 |     90 | María    | Administrativa      | 2004-12-11 00:00:00 |   1200 |       NULL |           2 |             1 |
|  9 |     91 | Pedro    | Contable            | 2004-12-11 00:00:00 |   1300 |       NULL |           2 |             1 |
| 10 |     92 | Teresa   | Ingeniera           | 2004-12-11 00:00:00 |   2100 |       NULL |           3 |             2 |
| 11 |     93 | Isabel   | Ingeniera Técnica   | 2004-12-28 00:00:00 |   1800 |       NULL |           3 |             2 |
| 12 |     94 | Javier   | Ingeniero Técnico   | 2004-12-11 00:00:00 |   1800 |       NULL |           3 |             2 |
| 13 |     95 | Fernando | Ingeniero           | 2004-12-11 00:00:00 |   2100 |       NULL |           3 |             2 |
| 14 |     96 | Laura    | Comercial           | 2004-12-30 00:00:00 |   2100 |        500 |           4 |             3 |
| 15 |     97 | Montse   | Comercial           | 2004-12-27 00:00:00 |   1800 |        600 |           4 |             3 |
| 16 |    100 | Jorge    | Comercial           | 2004-12-30 00:00:00 |   1800 |        500 |           4 |             3 |
| 17 |    102 | Arturo   | Comercial           | 2004-12-12 00:00:00 |   2100 |        550 |           4 |             3 |
| 18 |    105 | Juan     | Programador         | 2004-12-11 00:00:00 |   1800 |       NULL |           5 |             4 |
| 19 |    109 | Pepe     | Programador         | 2005-01-01 00:00:00 |   1700 |       NULL |           5 |             4 |
| 20 |    110 | Juan     | SEO                 | 2005-01-01 00:00:00 |   2000 |        200 |           5 |             4 |
| 21 |    112 | Pepe     | Analista            | 2005-01-01 00:00:00 |   1700 |       NULL |           5 |             4 |
+----+--------+----------+---------------------+---------------------+--------+------------+-------------+---------------+
21 rows in set (0.00 sec)

Sigue en ¡Practiquemos las consultas SQL con MySQL! (II de IV).