Está en la página 1de 15

1.

2 Gestión de empleados
1.2.1 Modelo entidad/relación

1.2.2 Base de datos para MySQL


DROP DATABASE IF EXISTS empleados;
CREATE DATABASE empleados CHARACTER SET utf8mb4;
USE empleados;

CREATE TABLE departamento (


codigo INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100) NOT NULL,
presupuesto DOUBLE UNSIGNED NOT NULL,
gastos DOUBLE UNSIGNED NOT NULL
);

CREATE TABLE empleado (


codigo INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
nif VARCHAR(9) NOT NULL UNIQUE,
nombre VARCHAR(100) NOT NULL,
apellido1 VARCHAR(100) NOT NULL,
apellido2 VARCHAR(100),
codigo_departamento INT UNSIGNED,
FOREIGN KEY (codigo_departamento) REFERENCES departamento(codigo)
);

INSERT INTO departamento VALUES(1, 'Desarrollo', 120000, 6000);


INSERT INTO departamento VALUES(2, 'Sistemas', 150000, 21000);
INSERT INTO departamento VALUES(3, 'Recursos Humanos', 280000, 25000);
INSERT INTO departamento VALUES(4, 'Contabilidad', 110000, 3000);
INSERT INTO departamento VALUES(5, 'I+D', 375000, 380000);
INSERT INTO departamento VALUES(6, 'Proyectos', 0, 0);
INSERT INTO departamento VALUES(7, 'Publicidad', 0, 1000);

INSERT INTO empleado VALUES(1, '32481596F', 'Aarón', 'Rivero',


'Gómez', 1);
INSERT INTO empleado VALUES(2, 'Y5575632D', 'Adela', 'Salas', 'Díaz',
2);
INSERT INTO empleado VALUES(3, 'R6970642B', 'Adolfo', 'Rubio',
'Flores', 3);
INSERT INTO empleado VALUES(4, '77705545E', 'Adrián', 'Suárez', NULL,
4);
INSERT INTO empleado VALUES(5, '17087203C', 'Marcos', 'Loyola',
'Méndez', 5);
INSERT INTO empleado VALUES(6, '38382980M', 'María', 'Santana',
'Moreno', 1);
INSERT INTO empleado VALUES(7, '80576669X', 'Pilar', 'Ruiz', NULL, 2);
INSERT INTO empleado VALUES(8, '71651431Z', 'Pepe', 'Ruiz', 'Santana',
3);
INSERT INTO empleado VALUES(9, '56399183D', 'Juan', 'Gómez', 'López',
2);
INSERT INTO empleado VALUES(10, '46384486H', 'Diego','Flores',
'Salas', 5);
INSERT INTO empleado VALUES(11, '67389283A', 'Marta','Herrera', 'Gil',
1);
INSERT INTO empleado VALUES(12, '41234836R', 'Irene','Salas',
'Flores', NULL);
INSERT INTO empleado VALUES(13, '82635162B', 'Juan Antonio','Sáez',
'Guerrero', NULL);

SELECT apellido1 FROM empleado ORDER BY apellido1 ascendent

--SELECT DISTINCT apellido1 FROM empleado (Solo pilla un campo igual si esta repetido solo
pilla uno)

--SELECT * (todos) FROM empleado WHERE apellido1=’Ruiz’ SELECCIONA DESDE TODOS LOS
LADOS EN EMPLEADO DONDE EL PRIMER APELLIDO ES ‘Ruiz’

--SELECT * FROM empleado WHERE apellido1=’Ruiz’ OR apellido1=‘Gomez’ ELECCIONA DESDE


TODOS LOS LADOS EN EMPLEADO DONDE EL PRIMER APELLIDO ES ‘Ruiz’ O ‘Gomez’

OTRA SENTENCIA PARA NO LIARNOS ‘IN’------------------------------------------------------------

SELECT * (todos) FROM empleado WHERE apellido1 IN (‘Ruiz’, ‘Gomez’)

SELECT * FROM empleado WHERE codigo_departamento=7 SELECCIONA TODOS LOS VALORES


DE LA TABLA EMPLEADO DONDE EL DEPARTAMENTO TENGA EL NUMERO 7

SELECT * FROM empleado WHERE codigo_departamento IN (7,2) SELECCIONA TODOS LOS


VALORES DE LA TABLA EMPLEADO DONDE EL DEPARTAMENTO TENGA EL NUMERO 7 O 2
SELECT * FROM empleado WHERE codigo_departamento=7 OR departamento=2 SELECCIONA
TODOS LOS VALORES DE LA TABLA EMPLEADO DONDE EL DEPARTAMENTO TENGA EL
NUMERO 7 O 2

SELECT * FROM `empleado` WHERE nombre LIKE 'A%'; SELECCIONAR LOS NOMBRES QUE
EMPIEZEN CON UNA A POR ESO SE PONE A%

SI FUESE QUE INCLUYAN UNA A SERIA %A% POR K HAY TEXTO DELANTE Y DETRÁS

SELECT * FROM `empleado` WHERE nombre LIKE '%A'; QUE CONCLUYA CON UNA A

SELECT SUM(presupuesto) FROM departamento; HAZ UNA SUMA DE TODOS LOS


PRESUYPUESTOS DONDE ESTA UBICADO EN DEPARTAMENTO

SELECT COUNT(presupuesto) FROM departamento; ME CUENTA TODOS LOS REGISTROS/FILAS


K TIENE ESA TUPLA. ME DEVUELVE U N N U M E R O

SELECT codigo_departamento, COUNT(*) FROM empleado GROUP BY codigo_departamento;


SELECCIONA LOS CODIGOS DE DEPARTAMENTO DE CADA EMPLEADO Y AGRUPALOS O PONLOS
EN ORDEN. I M P O R T A N T E PONER LA COMA SINO DA ERROR.

INNER JOIN

SELECT* FROM empleado E INNER JOIN departamento D ON


E.codigo_departamento=D.codigo; SELECCIONAR DESDE empleado QUE LO VOY A LLAMAR ‘E’
y un INNER JOIN CON departamento QUE LO VOY A LLAMAR ‘D’ OSEA QUE EN E PILLAMOS EL
codigo_departamento Y DESDE D codigo Y LOS IGUALAMOS

SELECT E.nif, E.nombre, D.nombre, D.presupuesto, D.gastos, FROM empleados E INNER JOIN
departamento D
--Seleccione el nomre y apellido de los empleados que trabajan para departamerntos con un
presupuesto mayor a 115.000€

SELECT nombre, apellido1 FROM empleado

WHERE codigo_departamento IN

(SELECT codigo FROM departamento WHERE presupuesto> 115000);

Codigo_departamento por que es la que tenemos en las dos columnas

--SELECT E.nombre, apellido1 FROM empleado E WHERE codigo_departamento IN (SELECT


codigo FROM departamento WHERE presupuesto >115000)

SUM() suma

AVG() average

SELECT*

FROM departamento

WHERE presupuesto >

SELECT AVG(presupuesto)

FROM departamento

);

--Seleccione los nombres de los departamentos con mas de dos empleados

SELECT D.nombre FROM empleado E INNER JOIN departamento D ON E.codigo_departamento


= D.codigo GROUP BY código_departamento HAVING COUNT(*) >2

SELECT TOP 1 presupuesto FROM departamento WHERE presupuesto IN(


SELECT DISTINT presupuesto FROM departamento

ORDER BY presupuesto ASC LIMIT 2

ORDER BY presupuesto DESC LIMIT 1

SELECT E.nombre, E.apellido1

FROM empleado E

WHERE E.codigo_departamento AND D.presupuesto IN (

SELECT min(presupuesto) FROM departamento WHERE presupuesto > (SELECT


min(presupuesto) FROM departamento)

ASC= ASCENDENTE

DESC= DESCENDENTE

LIMIT= QUE SACE N VALORES DESEADOS, LIMIT 1 (UN VALOR), LIMIT 3 (TRES VALORES)…

TOP= TOP 2 TE MUESTRA LOS DOS PRIMEROS TOP 1 UNO TOP 3 LOS TRES….

*ESTO ESTA MAL HAY K PONERLO BIEN* CON OTRA ALTERNATIVA

SELECT min(presupuesto) FROM departamento WHERE presupuesto > (SELECT


min(presupuesto) FROM departamento)

BIEN PUESTO DE OTRA FORMA

-Reasignar todos los empleados del departamento de contabilidad (código 4) al departamento


de proyectos (código 6)
UPDATE empleado SET departamento = 6 WHERE departamento= 4;

EN EL SET NOS DICE EN QUE DEPARTAMENTO Y EL WHERE DONDE CAMBIAR EL 6

SI NO PONEMOS EL WHERE NOS LO PONDRIA A TODA LA TABLA POR ESO HAY QUE PONER EL
WHERE Y ESPECIFICAR EL 4

--Elimine la tabla todos los empleados que trabajan en el departamento con un presupuesto
mayor o igual a 100000

DELETE FROM empleado

WHERE departamento IN

SELECT código FROM departamento

WHERE presupuesto >=100000

);

DELETE FROM = ME BORRO TODO LO DE LA TABLA PERO NO LA ESTRUCTURA OSEA


MANTENEMOS ESTRUCTURA CON CLAVES Y TODO. Borras contenido

DROP DATABASE= A TOMAR POR CULO TODA LA BBDD

DROP TABLE= A TOMAR POR CULO TODA LA TABLA

SAKILA

Consulta store_id, first_name y last_name de la table customer de la base de datos de sakila

--Actores que tienen de primer nombre ‘Scarlett’

Select*

FROM actor

WHERE UPPER(first_name) LIKE ‘Scarlett’

--Actores que contengan una o en su nombre


SELECT*

FROM actor

WHERE upper(first_name) LIKE ‘%O%’

--Actores que contengan una ‘O’ en su nombre y una ‘A’ en su apellido

SELECT*

FROM actor

WHERE upper(first_name) LIKE ‘%O%’

AND upper(last_name) LIKE ‘%A%’

--Actores donde su tercera letra sea ‘B’

SELECT*

FROM actor

WHERE upper(first_name) LIKE ‘__B%’

PONEMOS DOS GUIONES BAJOS PARA OCUPAR LOS DOS PRIMEROS HUECOS Y ASI DECIMOS
QWUE COMPRUEBE LA TERCERA LETRA QUE SEA B Y DESPUES PONEMOS % POR QUE
OBVIAMENTE HAY MAS TEXTO

--Ciudades del country id 61

SELECT*

FROM city

WHERE country_id = 61

---Ciudades del country Spain

SELECT*

FROM city

WHERE country_id = (SELECT country_id FROM country WHERE upper(country) = ‘SPAIN’)


--NUEVA TABLA->Tienda
Producto->codigo(PRIMARY KEY), nombre, precio,
codigo_fabricante(FOREING KEY)
Fabricante->código(PRIMARY KEY Y FOREING KEY de codigo_fabricante),
nombre

--Enseña los productos que esten en un rango de precio entre 40 y 200€

SELECT* FROM producto

WHERE precio>= 40 AND <= 200;

SELECT nombre, precio FROM product y multiplicamos el precio por 1.2

SELECT nombre, precio * 1.2 AS PrecioComercial FROM product;

AS= SE USA PARA “CREAR UNA NUEVA TUPLA” TEMPORAL PARA MOSTRAR RESULTADOS

--Primero insertamos una nueva tupla CON EL MISMO FABRICANTE QUE OTRO DE LA TABLA
PARA EL PROXIMO EJERCICIO

INSERT INTO `producto`(`codigo`, `nombre`, `precio`, `codigo_fabricante`) VALUES


('7','IMPRESORA','180','2');

--Calcule el precio promedio de el producto con el código de proveedor con valor 2

SELECT AVG(precio) FROM producto WHERE codigo_fabricante= 2;

AVG= AVERAGE (PROMEDIO)


--Calcule la cantidad de productos con un precio mayor o igual a 150€ (hacer un conteo)
[COUNT()]

SELECT COUNT(*) FROM producto WHERE precio>=150;

--O SINO->

SELECT COUNT(*) AS PRODUCTOS ‘150_MAYOR’ FROM product WHERE precio >=150;

NOMBRES DE TABLA EN EL ”AS” SIN ESPACIO MEJOR K PUEDE DAR ERRORES

SE PONE * PARA QIUE ME SELECCIONE ENTRE TODOS

--Seleccione el nombre y precio de todos los productos con un precio mayor o igual a 150€ y
ordene primero por precio(en orden descendente) y luego haz otra consulta donde el nombre
lo ordenes de forma ascendente

SELECT nombre, precio

FROM producto

WHERE precio >=150

ORDER BY precio DESC;

DESC= Descendente

ORDER BY= ORDENA precio POR ORDEN DESCENDENTE(DESC)

--LA SEGUNDA CONSULTA->

SELECT nombre, precio

FROM producto

WHERE precio >=150

ORDER BY nombre ASC;

PONERLO ORDER BY nombre ASC O PONER SOLO ORDER BY nombre ES IRRELEVANTE POR
QUE POR DEFECTO TE LO ORDENA DE FORMA ASCENDENTE

--Seleccione todos los datos de los productos[SELECT(*)], incluidos todos los datos del
fabricante de cada producto
SELECT * FROM producto P, fabricante F

WHERE P.codigo_fabricante = F.codigo;

--Seleccione el nombre del producto, el precio, y el nombre del fabricante de todos los
productos.

SELECT producto.nombre, producto.precio, fabricante.nombre

FROM producto, fabricante

WHERE producto.codigo_fabricante = fabricante.codigo;

O SINO CON INNER JOIN->

SELECT producto.nombre, producto.precio, fabricante.nombre

FROM producto INNER JOIN fabricante

ON producto.codigo_fabricante = fabricante.codigo;

INNER JOIN fabricante ON= HACER EL INNER JOIN EN-> ON producto.codigo_fabricante =


fabricante.codigo; INNER JOIN Y ON SIEMPRE VAN JUNTOS

--Seleccione el precio promedio de los productos de cada fabricante, mostrando solo el código
del fabricante

SELECT AVG(precio), F.nombre

FROM producto P, fabricante F

WHERE P.codigo_fabricante= F.codigo

GROUP BY F.nombre;

SI QUITAMOS EL GROUP BY SOLO TE PILLA EL PRIMERO NO TODOS

--OTRA OPCION->

SELECT AVG(producto.precio), fabricante.nombre

FROM producto INNER JOIN fabricante

ON producto.codigo_fabricante = fabricante.codigo

GROUP BY fabricante.nombre;
CON ESTE SEGUNDO, SACAREMOS EL NOMBRE DE EL FABRICANTE SINO COMO EN EL
PRIMERO, SACA SOLO EL CODIGO

--Seleccione los nombre de los fabricantes cuyos productos tienen un precio promedio mayor
o igual a 200€

SELECT fabricante.nombre

FROM producto INNER JOIN fabricante

ON producto.codigo_fabricante = fabricante.codigo

GROUP BY fabricante.nombre

HAVING AVG(precio) >=200;

EL HAVING ES PARA PONERLE UNA SEGUNDA CONDICION A LO YA ESCRITO

--OTRA OPCION->

SELECT F.nombre

FROM producto P, fabricante F

WHERE P.codigo_fabricante= F.codigo

GROUP BY F.nombre

HAVING AVG(precio) >=200;

--Seleccione el nombre y precio del producto mas barato

SELECT nombre, precio

FROM producto

WHERE precio= (SELECT MIN(precio) FROM producto);

--OTRA OPCION->

SELECT nombre, precio

FROM product

ORDER BY precio ASC

LIMIT 25;
--Selecciona el nombre de cada fabricante junto con el nombre y precio de su producto mas
caro

SELECT producto.nombre, producto.precio, F.nombre

FROM producto, fabricante F

WHERE producto.codigo_fabricante = F.codigo

AND producto.precio=

SELECT MAX(P.precio)

FROM producto P

WHERE P.producto_fabricante = F.codigo

);

AND= Y, ES LITERAL Y. ESTO ES PARA METER LA SUBCONSULTA QUE HAY DESPUES.

AQUÍ COMO VEMOS MEZCLAMOS EL TEMA DE PONER ABREVIATURAS COMO F., P. Y PONER EL
NOMBRE COMPLETO

ASI COMPROVAMOS COMO SE PUEDEN MEZCLAR LAS DOS COSAS Y USARE LA FORMA MAS
FACIL QUE SE ME HAGA.

OTRA OPCION->

SELECT producto.nombre, producto.precio, fabricante.nombre

producto JOIN fabricante ON

producto.codigo¨_fabricante = fabricante.codigo

AND producto.precio=

SELECT MAX(precio)

FROM producto

WHERE producto.codigo_fabricante = fabricante.codigo

);

COMO AQUÍ VEMOS ES IGUAL SI PONEMOS JOIN SOLO O UN INNER JOIN, ES INDIFERENTE
Seleccione el nombre de cada fabricante que tenga un precio promedio superior a 200€ y
contenga al menos 2 productos diferentes.

UPDATE producto SET precio = ‘250’ WHERE codigo = 2;

SELECT P.nombre, AVG(p.precio) as p_precio, COUNT (p.cod) as m conteo

FROM fabricante F, producto P

Where P.cod_fabricante = F.cod

GROUP BY P.nombre

HAVING p_precio >=200 and m_conteo >= 2;

GENERAR CAMPO CALCULADO QUE REALIZE UNAOPERACION ARITMETICA QUE SEA EL


CAMBIO DE EURO A DOLAR

SELECT nombre, precio AS precioEURO,

Precio * 1.15 AS precioDOLAR

FROM producto P

SELECT UPPER(A MAYUSCULAS)

SELECT LOWER(A MINUSCULAS)

Lista el nombre de todos los fabricsantes en una columna, y en otra columna obtenga en
mayúsculas los dos primeros caracteres del nombre del fabricante

SELECT nombre,UPPER(SUBSTR(nombre, 1, 2))

FROM fabricante

Lista los nombres y los precios de todos los productos de la tabla producto, redondeando el
valor del precio

SELECT nombre, ROUND(precio)

FROM producto
TODOS DISTINTOS DE CODIGO FABRICANTE SIN K SE REPITAN

SELECT DISTINCT cod_fabricante

FROM producto

WHERE NOT precio >= 400 WHERE PRECIO NO ES ME LO SACAS

Lisra todos los productos que tengan un precio entre 80€P y 300€]. Sin utilizar el operador
BETWEEN

SELECT*

FROM producto

WHERE precio

BETWEEN 80 AND 300

WHERE cod_fabricante = 1 OR cod_fabricante = 3 OR codigo_fabricante = 5

PASAR PRECIO A CENTIMOS

SELECT nombre, precio * 100 AS céntimos

FROM producto

LISTA LOS NOMBRES DE LOS FABRICANTES CUYO NOMBRE EMPIECE `POR LA LETRA S

SELECT nombre

FROM fabricante
WHERE nombre LIKE ‘s%’

LEFT JOIN->

SI NO EXISTE RELACION ENTRE LAS DOS TABLAS VA A SALIR EN NULL UN


CAMPO

RIGHT JOIN->

También podría gustarte