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;