Ejercicios resultos de entidad-relacion

Anuncio
Ejemplo completo: Empleados.
•
Diagrama entidad relación:
nombreP
apellido1
apellido2
nombreDept
nombre
dni
sueldo
numDept
lugares
pertenecia
empleados
supervisor
1
n
1
departamentos
fecha
supervisado
n
1
1
dirige
controla
n
supervisa
n
trabaja en
n
m
proyectos
hijos
numHoras
nombre
fecha
lugar
numP
nombre
•
Modelo relación
empleados
dni
apellido1
nombre
appellido2
sueldo
numD
dniSupervisor
departamentos
numDept
nombreDept dniJefe fecha
proyectos
numP
nombre
lugar
numDept
trabajaEn
dni
numP
numH
hijos
dni
nombre
fecha
lugaresDpto
numD
lugar
Consultas:
1. Ver todos los datos de la tabla empleados.
2. Seleccionar todos los datos de los empleados del depto 5.
3. Nombre y apellidos de los empleados que trabajan en el depto 5 y que tienen sueldo >100.000€.
4. Nombre y apellidos de los empleados que trabajan en el depto 1, 2 ó 3.
5. Nombre y apellidos empleados que trabajan en el departamento: "investigación”.
6. Nombre de los empleados con al menos dos hijos.
7. Para cada empleado su nombre y el nombre del supervisor.
8. Para cada proyecto número de proyecto, nombre y número de empleados que trabajan en él.
9. Empleados que tienen el mismo sueldo y trabajan en el mismo departamento que algún “garcia”.
10. Número de proyecto en que trabaja “garcia” como jefe de proyecto.
11. Nombre y apellido de los empleados con algún hijo.
12. Nombre y apellido de los empleados sin hijos.
13. Nombre y apellido de jefes de departamento con al menos un hijo.
14. Nombre y apellido de los empleados que trabajan en todos los proyectos controlados por el
departamento 5.
15. Empleados que no tiene supervisor.
16. Nombre y apellido de los empleados con al menos dos hijos.
17. Para cada proyecto: número de proyecto, nombre y número de empleados que trabajan en él.
18. Para cada departamento con más de tres empleados número de departamento y número de empleados
con sueldo mayor a 100.000€.
• Pasar a SQL
SQL:
Lenguaje de definición de datos
Lenguaje de definicion de almacenamiento
Lenguaje de manipulacion de datos
Lenguaje de definicion de vistas
mysql> source filename
mysql> \. filename
empleados.sql
-- LENGUAJE DE DEFINICION DE DATOS:
--- Tipos de datos
-Cadenas de caracteres
-longitud fija char(m) 1..255 rellena con blancos
-long varibale varchar(m)
-TINYBLOB 255
-TEXT 65,535 char string
-BLOB[(M)] 65,535 binary string
-MEDIUMBLOB 16,777,215
-MEDIUMBLOB 16,777,215
-LONGTEXT 4,294,967,295
-LONGTEXT 4,294,967,295
-ENUM('value1','value2',...)
-SET('value1','value2',...)
--Numericos
-enteros
-int o integer, unsigned
-TINYINT[(M)] [UNSIGNED] [ZEROFILL] -127 a 128
-SMALLINT[(M)] [UNSIGNED] [ZEROFILL] -32768 to 32767
-MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL] -8388608 to 8388607
-INT[(M)] [UNSIGNED] [ZEROFILL] -2147483648 to 2147483647
-BIGINT[(M)] [UNSIGNED] [ZEROFILL] -9223372036854775808 to
9223372036854775807
-reales
-float[(m,d)]
-(4,2) 4 espacios a lo sumo 2 son decimales
-EJ
-42.35 bien
-325.54 mal redondea a 325.5
-FLOAT[(M,D)] [UNSIGNED] [ZEROFILL] -3.402823466E+38 to 1.175494351E-38, 0, and 1.175494351E-38 to 3.402823466E+38
-DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL] -1.7976931348623157E+308 to
-2.2250738585072014E-308, 0, and 2.2250738585072014E-308 to 1.7976931348623157E+308
-DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]
-BOOL, BOOLEAN
---DATE '1000-01-01' to '9999-12-31'
-yyyy-mm-dd
-1999-02-03 o 19990203
-DATETIME '1000-01-01 00:00:00' to '9999-12-31 23:59:59'
-'YYYY-MM-DD HH:MM:SS'
-TIME '-838:59:59' to '838:59:59'
-hh:mm:ss
-12:45:30
-NULL pertenece a todos los tipos de datos en fichero \N
--- Modificadores:
-AUTO_INCREMENT
-DEFAULT value
-NOT NULL
-PRIMARY KEY
-UNIQUE
-ON DELETE action1 ON UPDATE action2
-action:
-SET NULL, SET DEFAULT, CASCADE
-CASCADE se eliminan todos las tuplas de empleados que hagan referencia al departamento
-y se continua en cascada.
--- Databases:
-CREATE DATABASE nombre;
-USE nombreDB;
-GRANT ALL PRIVLILEGES ON nombreDB.* TO 'albertoe'@'%' IDENTIFIED BY 'clave';
--- Tablas:
-CREATE TABLE nombre(listaCampos);
--- Creacion de tipos de datos:
-CREATE DOMAIN tipoDNI AS char(8);
--- Modificación de tablas:
-ALTER TABLE empleados ADD peso int1 DEFAULT 0;
-ALTER TABLE empleados ADD (peso int1 DEFAULT 0,años int);
-ALTER TABLE empleados ALTER peso DEFAULT 1;
-ALTER TABLE empleados DROP dniSupervisor;
--- Borrado:
-DROP DATABASE empleadosDB;
-DROP TABLE departamentos RESTRICT; solo si ninguna otra hace referencia
-DROP TABLE departamentos CASCADE; en cascada todas las que hacen referencia
--- Mostrar:
-SHOW DATABASES;
-SHOW TABLES;
-DESCRIBE nombreTabla;
-SHOW COLUMNS FROM nombreTabla;
CREATE DATABASE empleadosDB;
USE empleadosDB;
CREATE TABLE empleados(
dni
char(8),
nombre
varchar(20),
apellido1 varchar(20),
apellido2 varchar(20),
sueldo
float(12,2),
numD
int UNSIGNED,
dniSupervisor char(8),
PRIMARY KEY(dni)
-- ,FOREIGN KEY(dniSupervisor) REFERENCES empleados(dni) ON DELETE CASCADE ON
UPDATE CASCADE
);
CREATE TABLE departamentos(
numDept
int UNSIGNED,
nombreDept varchar(20),
dniJefe
char(8),
fecha
date,
PRIMARY KEY(numDept),
FOREIGN KEY(dniJefe) REFERENCES empleados(dni) ON DELETE CASCADE ON UPDATE
CASCADE
);
CREATE TABLE proyectos(
numP
int UNSIGNED,
nombre
varchar(20),
lugar
varchar(10),
numDept int UNSIGNED,
PRIMARY KEY(numP),
FOREIGN KEY(numDept) REFERENCES departamentos(numDept) ON DELETE CASCADE ON
UPDATE CASCADE
);
CREATE TABLE trabajaEn(
dni
char(8),
numP
int UNSIGNED,
numH
int UNSIGNED,
PRIMARY KEY(dni,numP),
FOREIGN KEY(dni) REFERENCES empleados(dni) ON DELETE CASCADE ON UPDATE
CASCADE,
FOREIGN KEY(numP) REFERENCES proyectos(numP) ON DELETE CASCADE ON UPDATE
CASCADE
);
CREATE TABLE hijos(
dni
char(8),
nombre
varchar(20),
fecha
date,
PRIMARY KEY(dni,nombre),
FOREIGN KEY(dni) REFERENCES empleados(dni) ON DELETE CASCADE ON UPDATE CASCADE
);
CREATE TABLE lugaresDpto(
numD
int UNSIGNED,
lugar
varchar(20),
PRIMARY KEY(numD,lugar),
FOREIGN KEY(numD) REFERENCES departamentos(numDept) ON DELETE CASCADE ON
UPDATE CASCADE
);
loadEmpleados.sql
-- LENGUAJE DE ALMACENAMIENTO
--- Carga de ficheros:
-LOAD DATA LOCAL INFILE ".\\nombreFich" INTO TABLE nombreTabla;
-LOAD DATA LOCAL INFILE ".\\nombreFich" INTO TABLE nombreTabla
-LINES TERMINATED BY '\r\n';
--- Insercion en tablas:
-INSERT INTO
-INSERT INTO pet VALUES
-('Fluffy', 'Harold', 'cat', 'f', '1993-02-04', NULL);
-INSERT INTO pet VALUES
-('Fluffy', 'Harold', 'cat', 'f', '1993-02-04', NULL),
-('Moo, 'Harold', 'cat', 'f', '1993-02-04', NULL);
--- Actualizacion de datos:
-UPDATE test SET
-neme='busbunny'
-WHERE name='patito';
-UPDATE empleados SET
-sueldo=sueldo+100 , categoria=categoria+1
-WHERE categoria=13;
-- Borrado:
-DELETE FROM empleados; --borra el contenido completo de una tabla
-DELETE FROM nombreTabla WHERE consulta;
USE empleadosDB;
LOAD DATA LOCAL INFILE '.\\empleados.dat' INTO TABLE empleados;
LOAD DATA LOCAL INFILE '.\\departamentos.dat' INTO TABLE departamentos;
LOAD DATA LOCAL INFILE '.\\proyectos.dat' INTO TABLE proyectos;
LOAD DATA LOCAL INFILE ".\\hijos.dat" INTO TABLE hijos;
LOAD DATA LOCAL INFILE ".\\trabajaEn.dat" INTO TABLE trabajaEn;
INSERT INTO lugaresDpto VALUES
(1,'madrid'),
(1,'palencia'),
(2,'sevilla'),
(3,'granada'),
(4,'jaen'),
(5,'cordoba'),
(2,'guadalajara'),
(1,'almeria');
ALTER TABLE empleados
ADD CONSTRAINT atributosFK FOREIGN KEY(dniSupervisor)
REFERENCES empleados(dni) ON DELETE CASCADE ON UPDATE CASCADE;
conEmpleados.sql
-- LENGUAJE DE MANIPULACIÓN DE DATOS
---- SELECT what_to_select
-- FROM which_table
-- WHERE conditions_to_satisfy;
--- SELECT * FROM pet WHERE name LIKE 'b%';
--- SELECT [DISTINCT] columnas
-- FROM tablas
-- WHERE condiciones
-- GROUP BY atributos
-- HAVING condicion de seleccion de grupos
-- ORDER BY <columnas [ASC|DESC]>
--- SELECT *
-- FROM nombreTabla
-- INTO OUTFILE "C:\fichero";
--- Condiciones:
-BETWEEN '1981-01-03' AND '1983-02-02'
-[NOT] IN (300,400)
-[NOT] IN ('a','z')
-IS NULL;
-IS NOT NULL;
--- Operaciones:
-NOT !, AND &&,
OR ||
-=, !=, <>, <=, >=, <, >
--- SELECT name, birth, CURDATE(),
-- (YEAR(CURDATE())-YEAR(birth))
-- - (RIGHT(CURDATE(),5)<RIGHT(birth,5))
-- AS age
-- FROM pet;
--- Declaracion de variables:
-SELECT @last := LAST_INSERT_ID();
--- SELECT *
-- FROM tabla1 LEFT JOIN tabla2 ON tabla1.campo1 = tabla2.campo2
-- WHERE condiciones;
--- SELECT *
-- FROM tabla1 AS t1 LEFT JOIN tabla2 AS t2 ON t1.campo1 = t2.campo2
-- WHERE condicones;
--- Funciones:
-Headers() pone cabeceras
-AVG(columna) calcula la media
--- Union, intersección, diferencia:
-UNION, INTERSEC, EXCEPT
USE empleadosDB;
-- Ver todos los datos de la tabla empleados;
SELECT * FROM empleados;
-- Seleccinar todos los datos de los empleados del depto 5
SELECT *
FROM empleados
WHERE numD=5;
-- Nombre y apellidos de los empleados que trabajan en el depto
-- 5 y que tienen sueldo >100.000 euros
SELECT nombre, apellido1, apellido2
FROM empleados
WHERE numD=5 AND sueldo>100000;
-- Nombre y apellidos de los empleados que trabajan en el depto 1, 2 ó 3.
SELECT nombre, apellido1, apellido2
FROM empleados
WHERE numD IN (1,2,3);
-- Nombre y apellidos empleados que trabajan en el departamento: "investigación"
SELECT nombre,apellido1,apellido2
FROM empleados,departamentos
WHERE nombreDept="investigacion" AND numD=numDept;
-- otra forma
SELECT nombre,apellido1
FROM empleados JOIN departamentos ON numDept=numD
WHERE nombreDept="investigacion";
-- Nombre de los empleados con al menos dos hijos
SELECT empleados.nombre
FROM empleados, hijos h1, hijos h2
WHERE empleados.dni=h1.dni AND empleados.dni=h2.dni AND h1.nombre!=h2.nombre;
-- Para cada empleado su nombre y el nombre del supervisor.
SELECT e.nombre, s.nombre
FROM empleados e, empleados s
WHERE e.dniSupervisor=s.dni;
-- Uniones
-- Numero de proyectos en los que tabaja algún "garcia"
-- o algún proyecto de ese departamento trabaje algún "garcia"
(SELECT numP
FROM empleados, trabajaEn
WHERE apellido1="garcia" AND empleados.dni=trabajaEn.dni)
UNION ALL {ALL: para mantener duplicados}
(SELECT numP
FROM empleados, departamentos, proyectos
WHERE apellido1="garcia" AND proyectos.numDept=departamentos.numDept AND dniJefe=dni);
-SELECT DISTINCT numP
FROM proyectos
WHERE numP IN (SELECT numP
FROM empleados, trabajaEn
WHERE apellido1="garcia" AND empleados.dni=trabajaEn.dni)
OR
numP IN (SELECT numP
FROM empleados,departamentos,proyectos
WHERE apellido1="garcia" AND proyectos.numDept=proyectos.numDept AND dniJefe=dni);
-- Empleados que tienen el mismo sueldo y trabajan en el mismo departamento que algun "garcia"
SELECT dni
FROM empleados
WHERE (sueldo,numD) IN
(SELECT sueldo,numD
FROM empleados
WHERE apellido1="garcia");
--es lo mismo
SELECT e1.dni
FROM empleados e1,empleados e2
WHERE E2.apellido1="garcia" AND E1.sueldo=E2.sueldo AND E1.numD=E2.numD;
-- En vez de IN se puede colocar un operador <,<=,>,>=,!=,<>,=, ANY, SOME, ALL,
--empleados con sueldo mayor que algun lopez sueldo>ANY
--empleados con sueldo mayor que todos lopez sueldo>ALL
--Numero de proyecto en que trabaja garcia como jefe de proyecto
SELECT numP
FROM proyectos
WHERE numP IN
(SELECT numDept
FROM departamentos
WHERE dniJefe IN
(SELECT dni
FROM empleados
WHERE apellido1="garcia"));
-- EXITS comprobar si existen tuplas
-- Nombre y apellido de los empleados con algun hijo
SELECT nombre,apellido1
FROM empleados
WHERE EXISTS (SELECT *
FROM hijos
WHERE empleados.dni=hijos.dni);
-- Nombre y apellido de los empleados sin hijos
SELECT nombre,apellido1
FROM empleados
WHERE NOT EXISTS
(SELECT *
FROM hijos
WHERE empleados.dni=hijos.dni);
--otra forma
SELECT nombre,apellido1
FROM empleados
WHERE DNI NOT IN
(SELECT dni
FROM hijos);
--otra forma
SELECT nombre,apellido1
FROM empleados
EXCEPT
(SELECT nombre, apellido1
FROM empleados, hijos
WHERE empleados.dni=hijos.dni);
-- Nombre y apellido de jefes de departamento con al menos un hijo
SELECT nombre, apellido1
FROM empleados
WHERE dni IN
(SELECT dniJefe
FROM departamentos
WHERE dniJefe IN
(SELECT dni
FROM hijos));
-- otra forma
SELECT nombre, apellido1
FROM empleados
WHERE EXISTS
(SELECT *
FROM departamentos
WHERE dniJefe=dni)
AND EXISTS
(SELECT *
FROM hijos
WHERE empleados.dni=dni);
-- Nombre y apellido de los empleados que trabajan en todos los proyectos controlados por el departamento 5
SELECT nombre,apellido1
FROM empleados
WHERE NOT EXISTS
(SELECT *
FROM proyectos p
WHERE p.numDept=5)
AND NOT EXISTS
(SELECT *
FROM trabajaEn, proyectos
WHERE empleados.dni=trabajaEn.dni AND proyectos.numP=trabajaEn.numP);
-- empleados que no tiene supervisor
SELECT *
FROM empleados
WHERE dniSupervisor IS NULL;
-- otra forma
SELECT *
FROM empleados
WHERE dniSupervisor NOT IN
(SELECT dni
FROM empleados);
-- otra forma
SELECT *
FROM empleados e
WHERE NOT EXISTS
(SELECT *
FROM empleados
WHERE e.dniSupervisor=dni);
-- FUNCIONES AGREGADAS
-- COUNT, SUM, MIN, MAX,ANG
-- COUNT cuenta los valores nulos, los demas los ignoran
-- cuando una tabla esta vacia COUNT devuelve 0 los demas NULL
-- Nombre y apellido de los empleados con al menos dos hijos
SELECT nombre, apellido1
FROM empleados
WHERE (SELECT COUNT(*)
FROM hijos
WHERE empleados.dni=dni)>=2;
--AGRUPANDO
SELECT numD,count(*),avg(sueldo)
FROM empleados
GROUP BY numD;
-- Para cada proyecto numero de proyecto, nombre y numero de empleados que trabajan en el
SELECT numP, nombre, count(*)
FROM proyectos NATURAL JOIN trabajaEn
GROUP BY numP,nombre;
-- Para cada departamento con mas de tres empleados num de departamento
-- y numero de empleados con sueldo mayor a 100.000 euros
SELECT numD,count(*)
FROM empleados
WHERE sueldo>100000
GROUP BY numD
HAVING count(*)>3;
--ORDENando por defecto ascendente
SELECT numD,nombre,apellido1
FROM empleados
ORDER BY numD ASC, nombre DESC,apellido1
vistasEmpleados.sql
-- LENGUAJE DE CREACION DE VISTAS:
--- Creacion de vistas:
-CREATE
-VIEW view_name [(column_list)]
-AS select_statement
--- Modificación de vistas:
-ALTER
-VIEW view_name [(column_list)]
-AS select_statement
--- Borrado de vistas:
-DROP
-VIEW view_name
-[RESTRICT | CASCADE]
USE empleadosDB;
-- Creación de una vista:
CREATE
VIEW test
AS SELECT *
FROM empleados;
CREATE
VIEW sueldosAnuales
AS SELECT dni, sueldo*12 AS sueldoAnual
FROM empleados;
Descargar