CREATE DATABASE EMPRESA;
USE EMPRESA;
CREATE TABLE DEPT(
deptno INT NOT NULL PRIMARY KEY,
dnane char(10) not null,
loc char(8) not null
);
use empresa;
CREATE TABLE EMP(
eno int not null PRIMARY KEY,
ename char(6) not null,
job char(9) not null,
mgr int null,
hiredate DATE NOT NULL,
sal int not null,
comm int null,
deptno int(11) not null,
foreign key(deptno) references dept(deptno) on update cascade,
index(deptno)
);
AlTER TABLE EMP ADD FOREIGN KEY (mgr) REFERENCES EMP(eno);
use empresa;
CREATE TABLE salgrade(
grade int not null PRIMARY KEY,
losal int not null,
hisal int not null
);
USE EMPRESA;
INSERT INTO DEPT VALUES (10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO DEPT VALUES (20, 'RESEARCH', 'DALLAS');
INSERT INTO DEPT VALUES (30, 'SALES', 'CHICAGO');
INSERT INTO DEPT VALUES (40, 'OPERATIONS', 'BOSTON');
INSERT INTO EMP VALUES (7839,'KING','PRESIDENT',NULL,'1981-11-
17',3000,null,10);
INSERT INTO EMP VALUES (7566,'JONES','MANAGER',7839,'1981-04-
02',2975,500,20);
INSERT INTO EMP VALUES (7902,'FORD','ANALYST',7566,'1982-01-
23',3000,null,20);
INSERT INTO EMP VALUES (7369,'SMITH','CLERK',7902,'1980-12-
17',800,null,20);
INSERT INTO EMP VALUES (7698,'BLAKE','MANAGER',7839,'1981-05-
01',2850,null,30);
INSERT INTO EMP VALUES (7499,'ALLEN','SALESMAN',7698,'1981-02-
20',1600,300,30);
INSERT INTO EMP VALUES (7521,'WARD','SALESMAN',7698,'1981-02-
22',1250,500,30);
INSERT INTO EMP VALUES (7654,'MARTIN','SALESMAN',7698,'1981-10-
08',1250,1400,30);
INSERT INTO EMP VALUES (7782,'CLARK','MANAGER',7839,'1981-06-
09',2450,NULL,10);
INSERT INTO SALGRADE VALUES(1,700,1200);
INSERT INTO SALGRADE VALUES(2,1201,1400);
INSERT INTO SALGRADE VALUES(3,1401,2000);
INSERT INTO SALGRADE VALUES(4,2001,3000);
INSERT INTO SALGRADE VALUES(5,3001,9999);
-- 1. Seleccionar el número de empleado, salario, comisión, nº de
departamento y fecha de la tabla EMP.
SELECT eno, sal, comm, deptno, hiredate
FROM EMP;
-- 2. Seleccionar aquellos empleados que sean 'SALESMAN'
SELECT *
FROM EMP
WHERE JOB = "SALESMAN";
-- otra forma
SELECT *
FROM EMP
WHERE JOB LIKE 'SALES%';
-- 3. Seleccionar aquellos empleados que no trabajen en el
departamento 30
SELECT *
FROM EMP
WHERE deptno <> 30;
-- otra forma
SELECT *
FROM EMP
WHERE deptno != 30;
-- 4. Seleccionar el nombre de aquellos empleados que ganen más
de 2000
SELECT ename
FROM EMP
WHERE sal > 2000;
-- 5. Seleccionar el nombre de aquellos que sean 'CLERK' o trabajen
en el departamento 30
SELECT ename
FROM empresa
WHERE JOB = "CLERK" OR deptno = 30;
-- OTRA FORMA
SELECT ename
FROM EMP
WHERE JOB = 'CLERK' || deptno = 30;
-- 6. Seleccionar aquellos cuyo salario esté entre 2000 y 3000
SELECT *
FROM EMP
WHERE sal BETWEEN 2000 AND 3000;
-- OTRA FORMA
SELECT *
FROM EMP
WHERE sal >= 2000 AND sal <=3000;
-- 7. Seleccionar los empleados que trabajan en el mismo
departamento que 'CLARK'
-- PARA SABER EL DEPARTAMENTO DE CLARK HAY QUE HACER UNA
CONSUKTA PARA SACAR EL
SELECT *
FROM EMP
WHERE deptno = (SELECT deptno FROM emp WHERE ename LIKE
'CLARK');
-- 8. Seleccionar el nombre de los empleados que trabajen en
'CHICAGO'
SELECT ename FROM EMP
WHERE deptno = ( SELECT deptno FROM DEPT WHERE loc =
"CHICAGO");
-- 9. Nombre de todos los empleados, empleo, departamento y
localidad
SELECT ename, job, EMP.deptno, loc
FROM EMP NATURAL JOIN DEPT;
-- OTRA
SELECT ename, job, EMP.deptno, loc
FROM EMP JOIN DEPT USING(deptno);
-- OTRA
SELECT ename, job, EMP.deptno, loc
FROM EMP, DEPT
WHERE EMP.deptno =DEPT.deptno;
-- 10. Seleccionar aquellos empleados que trabajen en el
departamento 10 o en el 20
SELECT ename
FROM EMP
WHERE deptno IN (10,20);
-- 11. Seleccionar los distintos departamentos que existen en la tabla
EMP
SELECT DISTINCT deptno
FROM EMP;
-- 12. Seleccionar el nombre aquellos empleados cuyo nombre
empiece por 'A'
SELECT ename
FROM EMP
WHERE ename LIKE "A%";
INSERT INTO EMP VALUES (7788,'SCOTT','ANALYST',7566,'1982-12-
09',3000,NULL,20);
INSERT INTO EMP VALUES (7844,'TURNER','SALESMAN',7698,'1981-10-
08',1500,0,30);
INSERT INTO EMP VALUES (7876,'ADAMS','CLERK',7788,'1983-12-
01',1100,NULL,20);
INSERT INTO EMP VALUES (7900,'JAMES','CLERK',7698,'1981-12-
03',950,NULL,30);
INSERT INTO EMP VALUES (7934,'MILLER','CLERK',7782,'1982-01-
23',1300,NULL,10);
-- 13. Seleccionar aquellos empleados que ganen más de 1500,
ordenado por empleo
-- ascenden o descendente
SELECT ename
FROM EMP
WHERE sal > 1500
ORDER BY job;
-- 14. Calcular el salario anual a percibir por cada empleado
-- se debera morstrar el nombre y salario anual en la salida de la
consulta
SELECT ename as 'Nombre del empleado', SAL*12 'Salario anual'
FROM EMP;
-- 15. Seleccionar el salario mínimo y máximo de los empleados
agrupados por empleo
SELECT job, MIN(sal), MAX(sal)
FROM EMP
GROUP BY job;
-- 16. Calcular el número de empleados por departamento que tienen
un salario superior a la media
-- como planteamos la subconsulta
-- 1º Conseguir cuánto es la media
SELECT avg(sal)
FROM EMP;
-- 2º Ya puedo compararlo... superior a la media
SELECT *
FROM EMP
WHERE sal > (SELECT avg(sal) FROM EMP);
-- continuo con el ejercicio
SELECT COUNT(*)
FROM EMP
WHERE sal > (SELECT avg(sal) FROM EMP);
-- agrupado por departamento
SELECT deptno, COUNT(*)
FROM EMP
WHERE sal > (SELECT avg(sal) FROM EMP)
GROUP BY deptno;
-- 17. Seleccionar el salario mínimo, máximo y medio de los
empleados agrupados por empleo
SELECT job, min(sal), MAX(sal), AVG(SAL)
FROM EMP
GROUP BY 1;
-- 18. Seleccionar los empleados cuyo salario sea superior al de
'ADAMS'
-- 1º CUANTO GANA ADAM
SELECT sal
FROM EMP
where ename like "ADAMS";
-- 2º YA PODEMOS COMPRARLO
SELECT ename
FROM EMP
WHERE sal > (SELECT sal FROM EMP WHERE ename like 'ADAMS');
-- 19. Mostrar el nombre del empleado y su fecha de alta en la
empresa de los empleados que son 'ANALISTA'
SELECT ename, hiredate
FROM EMP
WHERE job = "ANALYST";
-- 20. Encontrar el NOMBRE DEL EMPL, NOMBRE DEL DEP, TRABAJO y
salARIO de los empleados que trabajen en el mismo departamento
que 'TURNER' y su salario sea mayor que la media del salario del
departamento 10.
-- 1ºSUBCONSULTA
SELECT deptno FROM EMP WHERE ename like " TURNER";
-- 2º SUBCONSULTA media
SELECT AVG (sal) FROM EMP WHERE deptno = 10;
-- LO JUNTAMOS TODO
SELECT ename, dname, job, sal
FROM EMP JOIN DEPT USING (deptno)
WHERE deptno = (SELECT deptno FROM EMP WHERE ename like
'TURNER') AND sal > (SELECT AVG(sal) FROM EMP WHERE deptno =
10);
USE empresa;
-- 21. Insertar en la tabla DEPT la información correspondiente a un
nuevo departamento de consultoría, cuyo número sea 50 y que esté
ubicado en SANTANDER
INSERT INTO DEPT VALUES(50,'CONSULT','SANTANDE');
SELECT * FROM DEPT;
-- 22. Dar de alta a un nuevo empleado de nombre BELTRAN, que
desempeñe el puesto de analista en el departamento de SALES y
cuyo número de empleado sea 8.200. Por el momento se desconoce
su salario y quién será su supervisor
-- El nombre de BELTRAN, no entra por la definción del dato de la
columna
-- No podemos poner NULL al salario... porque es not null... aplicamos
un 0
INSERT INTO EMP (eno, ename, job, mgr, hiredate, sal, comm, deptno)
VALUES (8200,'BELTRA','ANALYST',null,'2024-11-25',0, null, 30);
-- 23. A raíz de la firma del convenio anual de la empresa, se ha
determinado incrementar el salario de todos los empleados en un 6%.
Incorporar este cambio a la base de datos
UPDATE EMP
SET sal = sal*1.06;
SELECT * FROM EMP;
-- 24. Se contrata a SANZ como ANALISTA, con número 1657, para el
departamento 30 y con sueldo 3000
insert INTO EMP (eno, ename, job, mgr, hiredate, sal, comm, deptno)
VALUES (1657,'SANZ','ANALYST',null,'2024-11-25',3000, null, 30);1
-- 25. Se despide a SANZ
DELETE FROM EMP
WHERE ename LIKE "SANZ";
SELECT * FROM EMP;
-- 26. SELECCIONA AQUELLOS EMPLEADOS QUE HAYN ENTRADO
ANTES DEL 1/1/82
SELECT * FROM EMP WHERE HIREDATE < "1982-01-01";
-- 27. MOSTAR LOS VENDORES QUE GANEN MAS DE 1500€
SELECT * FROM EMP WHERE sal > "1500" AND JOB LIKE "SALESMAN";
-- 28. Seleccionar aquellos que se llamen SMITH, ALLEN o SCOTT
SELECT * FROM EMP
WHERE ename IN ('SMITH','ALLEN','SCOTT');
-- 29. Seleccionar aquellos que no se llamen SMITH, ALLEN o SCOTT
SELECT * FROM EMP
WHERE ename NOT IN ('SMITH','ALLEN','SCOTT');
-- 30. SELECIONAR LOS DISTINTOS EMPLEOS QUE HAY EN CADA
DEPARTAMENTO
SELECT DISTINCT(job), deptno
FROM EMP
ORDER BY deptno;
-- 31. SELECIONAR EL AQUIELLOS EMPLEADO SE HAYAN DADO DE
ALTA EN 1981
SELECT ename
FROM EMP
WHERE hiredate BETWEEN "1981-01-01" AND "1981-12-31";
-- 32.SELECCIONAR AQUELLOS EMPLEADOS QUE TIENEN COMISION
SELECT ename FROM EMP
WHERE comM IS NOT NULL;
-- COMISION 0... PARA MI NO ES COMISION
SELECT ename, comm FROM EMP
WHERE comm IS NOT NULL AND comm >0;
-- TAMBIEN VALDRIA
SELECT ename, comm FROM EMP
WHERE comm > 0;
-- 33. CALCULAR EL NUMERO DE EMPREADOS QUE TIENEN COMISION
Y LA MEDIA
SELECT COUNT(comm), AVG(comm)
FROM EMP;
-- 34.seleccionar el numero de empleados que tienen comision y la
media en cada departamento
SELECT COUNT(comm), AVG(comm)
FROM EMP
GROUP BY deptno;
-- 35. SELECCIONAR EL SALARIO MINIMO MAXIMO Y MEDIO DE LOS
EMPLEADOS AGRUPADOS POR EMPLEO PERO SOLO AQUELLOS CUYA
MEDIA SUPERIOR 4000
SELECT MIN(sal), MAX(sal), AVG(sal)
FROM EMP
GROUP BY JOB;
-- VER COMO QUE UNO DE ELLOS ES > 4000, ES COMO UNA
SUBCONSULTA
SELECT MIN(sal), MAX(sal), AVG(sal)
FROM EMP
GROUP BY JOB
HAVING AVG(sal) > 4000;
USE EMPRESA;
-- A PARTIR DE AQUI SON SUBCONSULTAS RECURSIVAS
-- 36. SELECCIONA NOMBRE Y FECHA INGRESO DE EMPLEADO QUE
LLEVA MENOS TIEMPO
SELECT ename
FROM EMP
WHERE hiredate = (SELECT MIN(hiredate) FROM EMP);
-- 37. SELECCIONA EL NOMBRE DE LOS EMPLEADOS QUE GANEN MAS
QUE TODOS LOS "SALESMAN"
SELECT ename
FROM EMP
WHERE SAL > (SELECT MAX(sal) FROM EMP WHERE job LIKE
'SALESMAN');
-- 38 Seleccionar los empleados que ganen más que alguno de los
SALESMAN
SELECT ename
FROM EMP
WHERE SAL > SOME (SELECT MAX(sal) FROM EMP WHERE job LIKE
'SALESMAN');
-- 39SELECCIONAR EL NOMBRE DE CADA EMPLEADO Y EL NUMERO Y
NOMBRE DE SU JEFE
SELECT E1.ename"empleado", E1.mgr "el.mgr(eno)", E2.ename"jefe
e2.ename"
FROM EMP E1, EMP E2
WHERE E2.eno = E1.mgr;
USE EMPRESA;
-- 40 Mostrar el trabajo, el nombre y el salario de los empleados
ordenados por el tipo de trabajo y por salario descendent
SELECT job, ename, sal
FROM EMP
ORDER BY 1, 3 DESC;
-- 41 Mostrar el nombre del empleado y una columna que contenga el
salario multiplicado por la comisión cuya cabecera sea 'BONO'
SELECT ename, sal*comm 'BONO'
FROM EMP;
-- 42 Encontrar el salario medio de aquellos empleados cuyo trabajo
sea el de ANALYST, y cuya cabecera ponga SALARIO MEDIO
SELECT AVG(sal) 'SALARIO MEDIO'
FROM EMP
WHERE job LIKE 'ANALYST';
-- 43 Encontrar el salario más alto, más bajo y la diferencia entre
ambos
SELECT MAX(sal), MIN(sal), MAX(sal)-MIN(sal)
FROM EMP;
-- 45 Número de trabajos distintos que existen en el departamento 30
SELECT DISTINCT(job)
FROM EMP
WHERE deptno=30;
-- 46 MOSTAR EL NOMBRE DEL EMPLEADO, SU TRABAJO, EL NOMBRE Y
EL CODIGO DEL DEPARTAMENTO EN EL QUE TRABAJO
SELECT ename, job, dname, DEPT.deptno
FROM EMP NATURAL JOIN DEPT;
-- 47 Mostrar el nombre, el trabajo y el salario de todos los empleados
que tienen un salario superior al más bajo del departamento 30
SELECT ename, job, sal
FROM EMP WHERE sal > (SELECT MIN(sal) FROM EMP WHERE
deptno=30);
-- 48 Mostrar el nombre de los empleados cuyo jefe es BLAKE
-- primero es la subconsulta... y luego la ya la consulta
SELECT ename
FROM EMP
WHERE mgr = (SELECT eno FROM EMP WHERE ename LIKE 'BLAKE');
-- 50 Encontrar el número de trabajadores diferentes en el
departamento 30 para aquellos empleados cuyo salario pertenezca al
intervalo [1000, 1800]
SELECT COUNT(DISTINCT(eno))
FROM EMP
WHERE deptno = 30 AND sal BETWEEN 1000 AND 1800;
-- 51 Encontrar el número de trabajadores diferentes en el
departamento 30 para aquellos empleados cuyo salario pertenezca al
intervalo (1000, 1800]: el 1000 no está incluido
SELECT COUNT(DISTINCT(eno))
FROM EMP
WHERE deptno = 30 AND sal > 1000 AND SAL <= 1800;
-- 52 Visualice el número de los departamentos (deptno) que tengan
más de 3 empleados asignados
SELECT DISTINCT(deptno)
FROM EMP e1
WHERE 3 < (SELECT COUNT(*) FROM EMP e2 WHERE e1.deptno =
e2.deptno);
-- 53 Nombre de los empleados que trabajan en Dallas
SELECT ename
FROM EMP NATURAL JOIN DEPT
WHERE loc LIKE "DALLAS";
-- 54 ¿Cuántos trabajan en chicago?
SELECT count(*)
FROM EMP NATURAL JOIN DEPT
WHERE loc LIKE 'CHICAGO';
-- 55 Listar el nombre de los empleados que ganen menos que sus
managers
SELECT ename
FROM EMP e1
WHERE sal < (SELECT SAL FROM EMP e2 WHERE e1.mgr = e2.eno);
-- 56 Listar el nombre, trabajo, departamento, localidad y salario de
aquellos empleados que tengan un salario mayor que 2000 y trabajen
de DALLAS o NEW YORK
SELECT ename, job, emp.deptno, loc, sal
FROM EMP NATURAL JOIN DEPT
WHERE sal > 2000 AND loc IN ('DALLAS','NEW YORK');
SELECT ename, job, emp.deptno, loc, sal
FROM EMP NATURAL JOIN DEPT
WHERE sal > 2000 AND (loc LIKE 'DALLAS' OR loc LIKE 'NEW YORK');