From 5069477a78125c935b47028f9bbe29a59aafe174 Mon Sep 17 00:00:00 2001 From: Javier Pascual Date: Wed, 25 Jan 2023 11:17:19 +0100 Subject: [PATCH] Complete Exercise --- employees.sql | 108 ++++++++++++++++++++++++++++++++ queries.sql | 168 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 276 insertions(+) create mode 100644 employees.sql create mode 100644 queries.sql diff --git a/employees.sql b/employees.sql new file mode 100644 index 0000000..345964d --- /dev/null +++ b/employees.sql @@ -0,0 +1,108 @@ +-- Sample employee database +-- See changelog table for details +-- Copyright (C) 2007,2008, MySQL AB +-- +-- Original data created by Fusheng Wang and Carlo Zaniolo +-- http://www.cs.aau.dk/TimeCenter/software.htm +-- http://www.cs.aau.dk/TimeCenter/Data/employeeTemporalDataSet.zip +-- +-- Current schema by Giuseppe Maxia +-- Data conversion from XML to relational by Patrick Crews +-- +-- This work is licensed under the +-- Creative Commons Attribution-Share Alike 3.0 Unported License. +-- To view a copy of this license, visit +-- http://creativecommons.org/licenses/by-sa/3.0/ or send a letter to +-- Creative Commons, 171 Second Street, Suite 300, San Francisco, +-- California, 94105, USA. +-- +-- DISCLAIMER +-- To the best of our knowledge, this data is fabricated, and +-- it does not correspond to real people. +-- Any similarity to existing people is purely coincidental. +-- + +DROP DATABASE IF EXISTS employees; +CREATE DATABASE IF NOT EXISTS employees; +USE employees; + +SELECT 'CREATING DATABASE STRUCTURE' as 'INFO'; + +DROP TABLE IF EXISTS dept_emp, + dept_manager, + titles, + salaries, + employees, + departments; + +/*!50503 set default_storage_engine = InnoDB */; +/*!50503 select CONCAT('storage engine: ', @@default_storage_engine) as INFO */; + +CREATE TABLE employees ( + emp_no INT NOT NULL, + birth_date DATE NOT NULL, + first_name VARCHAR(14) NOT NULL, + last_name VARCHAR(16) NOT NULL, + gender ENUM ('M','F') NOT NULL, + hire_date DATE NOT NULL, + PRIMARY KEY (emp_no) +); + +CREATE TABLE departments ( + dept_no CHAR(4) NOT NULL, + dept_name VARCHAR(40) NOT NULL, + PRIMARY KEY (dept_no), + UNIQUE KEY (dept_name) +); + +CREATE TABLE dept_manager ( + emp_no INT NOT NULL, + dept_no CHAR(4) NOT NULL, + from_date DATE NOT NULL, + to_date DATE NOT NULL, + FOREIGN KEY (emp_no) REFERENCES employees (emp_no) ON DELETE CASCADE, + FOREIGN KEY (dept_no) REFERENCES departments (dept_no) ON DELETE CASCADE, + PRIMARY KEY (emp_no,dept_no) +); + +CREATE TABLE dept_emp ( + emp_no INT NOT NULL, + dept_no CHAR(4) NOT NULL, + from_date DATE NOT NULL, + to_date DATE NOT NULL, + FOREIGN KEY (emp_no) REFERENCES employees (emp_no) ON DELETE CASCADE, + FOREIGN KEY (dept_no) REFERENCES departments (dept_no) ON DELETE CASCADE, + PRIMARY KEY (emp_no,dept_no) +); + +CREATE TABLE titles ( + emp_no INT NOT NULL, + title VARCHAR(50) NOT NULL, + from_date DATE NOT NULL, + to_date DATE, + FOREIGN KEY (emp_no) REFERENCES employees (emp_no) ON DELETE CASCADE, + PRIMARY KEY (emp_no,title, from_date) +) +; + +CREATE TABLE salaries ( + emp_no INT NOT NULL, + salary INT NOT NULL, + from_date DATE NOT NULL, + to_date DATE NOT NULL, + FOREIGN KEY (emp_no) REFERENCES employees (emp_no) ON DELETE CASCADE, + PRIMARY KEY (emp_no, from_date) +) +; + +CREATE OR REPLACE VIEW dept_emp_latest_date AS + SELECT emp_no, MAX(from_date) AS from_date, MAX(to_date) AS to_date + FROM dept_emp + GROUP BY emp_no; + +# shows only the current department for each employee +CREATE OR REPLACE VIEW current_dept_emp AS + SELECT l.emp_no, dept_no, l.from_date, l.to_date + FROM dept_emp d + INNER JOIN dept_emp_latest_date l + ON d.emp_no=l.emp_no AND d.from_date=l.from_date AND l.to_date = d.to_date; \ No newline at end of file diff --git a/queries.sql b/queries.sql new file mode 100644 index 0000000..0659805 --- /dev/null +++ b/queries.sql @@ -0,0 +1,168 @@ +INSERT INTO employees (emp_no, birth_date, first_name, last_name, gender, hire_date) VALUES ('1', '1980-12-12', 'Jonas', 'Torres', 'M', '2015-04-20'); +INSERT INTO employees (emp_no, birth_date, first_name, last_name, gender, hire_date) VALUES ('2', '1981-12-12', 'Marc', 'Rodriguez', 'M', '2020-02-12'); +INSERT INTO employees (emp_no, birth_date, first_name, last_name, gender, hire_date) VALUES ('3', '1982-12-12', 'Andreu', 'Tunez', 'M', '2010-12-09'); +INSERT INTO employees (emp_no, birth_date, first_name, last_name, gender, hire_date) VALUES ('4', '1983-12-12', 'Monica', 'Llobet', 'F', '2016-06-16'); +INSERT INTO employees (emp_no, birth_date, first_name, last_name, gender, hire_date) VALUES ('5', '1981-12-12', 'Maria', 'Marquez', 'F', '2012-04-12'); +INSERT INTO employees (emp_no, birth_date, first_name, last_name, gender, hire_date) VALUES ('6', '1985-12-12', 'Jesus', 'Garcia', 'M', '2014-02-14'); +INSERT INTO employees (emp_no, birth_date, first_name, last_name, gender, hire_date) VALUES ('7', '1982-12-12', 'Queralt', 'Martinez', 'F', '2018-07-28'); +INSERT INTO employees (emp_no, birth_date, first_name, last_name, gender, hire_date) VALUES ('8', '1983-12-12', 'Sergi', 'Lopez', 'M', '2021-10-24'); +INSERT INTO employees (emp_no, birth_date, first_name, last_name, gender, hire_date) VALUES ('9', '1980-12-12', 'Claudia', 'Sanchez', 'F', '2016-11-14'); +INSERT INTO employees (emp_no, birth_date, first_name, last_name, gender, hire_date) VALUES ('10', '1987-12-12', 'Pilar', 'Perez', 'F', '2015-05-01'); +INSERT INTO employees (emp_no, birth_date, first_name, last_name, gender, hire_date) VALUES ('11', '1986-12-12', 'Antonio', 'Ruiz', 'M', '2011-03-16'); +INSERT INTO employees (emp_no, birth_date, first_name, last_name, gender, hire_date) VALUES ('12', '1989-12-12', 'Daniel', 'Moreno', 'M', '2009-04-12'); +INSERT INTO employees (emp_no, birth_date, first_name, last_name, gender, hire_date) VALUES ('13', '1980-12-12', 'Javier', 'Navarro', 'M', '2022-11-04'); +INSERT INTO employees (emp_no, birth_date, first_name, last_name, gender, hire_date) VALUES ('14', '1981-12-12', 'Javier', 'Alvarez', 'M', '2020-09-10'); +INSERT INTO employees (emp_no, birth_date, first_name, last_name, gender, hire_date) VALUES ('15', '1983-12-12', 'Javier', 'Pascual', 'M', '2021-06-17'); + +-- Con el Insert introduccimos todos los datos de los empleados en nuestra tabla. + +INSERT INTO `salaries` (`emp_no`, `salary`, `from_date`, `to_date`) VALUES ('1', '35000', '2015-04-20', '2023-01-20'), + ('1', '40000', '2023-01-21', '2024-01-21'), + ('2', '30000', '2020-02-12', '2023-01-20'), + ('2', '35000', '2023-01-21', '2024-01-21'), + ('3', '34000', '2010-12-09', '2023-01-20'), + ('3', '39000', '2023-01-21', '2024-01-21'), + ('4', '31000', '2016-06-16', '2023-01-20'), + ('4', '37000', '2023-01-21', '2024-01-21'), + ('5', '35000', '2012-04-12', '2023-01-20'), + ('5', '41000', '2023-01-21', '2024-01-21'), + ('6', '41500', '2014-02-14', '2023-01-20'), + ('7', '40500', '2018-07-28', '2023-01-20'), + ('8', '38000', '2021-10-24', '2023-01-20'), + ('9', '36000', '2016-11-14', '2023-01-20'), + ('10', '45000', '2015-05-01', '2023-01-20'), + ('11', '50000', '2011-03-16', '2023-01-20'), + ('12', '47000', '2009-04-12', '2023-01-20'), + ('13', '44000', '2022-11-04', '2023-01-20'), + ('14', '47000', '2020-09-10', '2023-01-20'), + ('15', '43000', '2021-06-17', '2023-01-20'); + +-- Con este Insert into añadimos a la tabla de salarios los salarios de cada empleados durante las fechas señaladas. + +INSERT INTO `departments` (`dept_no`, `dept_name`) VALUES +('1', 'Administracion'), ('2', 'Jefatura'), ('3', 'Recepción'); + +-- Con este Insert into introducimos los diferentes departamentos. + +INSERT INTO `dept_emp` (`emp_no`, `dept_no`, `from_date`, `to_date`) VALUES + +('1', '1', '2015-04-20', '2023-01-20'), ('1', '2', '2015-04-20', '2023-01-20'); +('2', '1', '2020-02-12', '2023-01-20'), ('2', '2', '2020-02-12', '2023-01-20'), +('3', '1', '2010-12-09', '2023-01-20'), ('3', '2', '2010-12-09', '2023-01-20'), +('4', '1', '2016-06-16', '2023-01-20'), ('4', '2', '2016-06-16', '2023-01-20'), +('5', '1', '2012-04-12', '2023-01-20'), ('5', '2', '2012-04-12', '2023-01-20'), +('6', '1', '2014-02-14', '2023-01-20'), ('6', '2', '2014-02-14', '2023-01-20') +('7', '1', '2018-07-28', '2023-01-20'), ('7', '2', '2018-07-28', '2023-01-20'), +('8', '1', '2021-10-24', '2023-01-20'), ('8', '2', '2021-10-24', '2023-01-20'), +('9', '1', '2016-11-14', '2023-01-20'), ('9', '2', '2016-11-14', '2023-01-20'), +('10', '1', '2015-05-01', '2023-01-20'), ('10', '2', '2015-05-01', '2023-01-20'), +('11', '3', '2011-03-16', '2023-01-20'), +('12', '3', '2009-04-12', '2023-01-20'), +('13', '3', '2022-11-04', '2023-01-20'), +('14', '3', '2020-09-10', '2023-01-20'), +('15', '3', '2021-06-17', '2023-01-20'); + +-- Con este insert into añadimos los diferentes departamentos a cada empleado. + +INSERT INTO `dept_manager` (`emp_no`, `dept_no`, `from_date`, `to_date`) VALUES + +('1', '1', '2022-06-20', '2023-01-20'), +('2', '1', '2022-06-20', '2023-01-20'), +('3', '2', '2022-01-24', '2023-01-20'), +('4', '2', '2022-01-24', '2023-01-20'), +('5', '1', '2022-06-20', '2023-01-20'); + +-- Con este insert into añadimos a los empleados los cargos a los que pertenecen en su departamento. + +INSERT INTO `titles` (`emp_no`, `title`, `from_date`, `to_date`) VALUES + +('1', 'Grado en Ingeniería del Software', '2015-04-20', '2023-01-20'), ('1', 'Master en Assembler Institute of Technology', '2020-06-20', '2023-01-20'), +('2', 'Grado en Ingeniería del Software', '2020-02-12', '2023-01-20'), ('2', 'Master en Assembler Institute of Technology', '2020-06-20', '2023-01-20'), +('3', 'Grado en Ingeniería del Software', '2010-12-09', '2023-01-20'), ('3', 'Master en Assembler Institute of Technology', '2020-06-20', '2023-01-20'), +('4', 'Grado en Ingeniería del Software', '2016-06-16', '2023-01-20'), ('4', 'Master en Assembler Institute of Technology', '2020-06-20', '2023-01-20'), +('5', 'Grado en Ingeniería del Software', '2012-04-12', '2023-01-20'), ('5', 'Master en Assembler Institute of Technology', '2020-06-20', '2023-01-20'), +('6', 'Grado en Ingeniería del Software', '2014-02-14', '2023-01-20'), +('7', 'Grado en Ingeniería del Software', '2018-07-28', '2023-01-20'), +('8', 'Grado en Ingeniería del Software', '2021-10-24', '2023-01-20'), +('9', 'Grado en Ingeniería del Software', '2016-11-14', '2023-01-20'), +('10', 'Grado en Ingeniería del Software', '2015-05-01', '2023-01-20'), +('11', 'Grado en Ingeniería del Software', '2011-03-16', '2023-01-20'), +('12', 'Grado en Ingeniería del Software', '2009-04-12', '2023-01-20'), +('13', 'Grado en Ingeniería del Software', '2022-11-04', '2023-01-20'), +('14', 'Grado en Ingeniería del Software', '2020-09-10', '2023-01-20'), +('15', 'Grado en Ingeniería del Software', '2021-06-17', '2023-01-20'); + +-- Por ultimo hacemos Insert into para determinar la titulacion de cada empleado. + +UPDATE employees SET first_name = 'Marcos', last_name = 'Buenafuente', birth_date = '1980-12-13' WHERE emp_no = 1; + +-- Cambiamos el nomrbre, apellido y fecha de nacimiento del empleado. + +UPDATE departments Set dept_name = 'Limpieza' WHERE dept_no = 1; +UPDATE departments Set dept_name = 'Caja' WHERE dept_no = 2; +UPDATE departments Set dept_name = 'Revisor' WHERE dept_no = 3; + +-- Cambiamos los departamentos de trabajo. + +SELECT salary > 20000, from_date FROM salaries; + +-- Empleados por encima de los 20.000 + +SELECT salary < 10000, from_date FROM salaries; + +-- Empleados pro debajo de los 10.000 + +SELECT salary, from_date FROM salaries WHERE salary >= 14000 AND salary <= 50000; + +-- Empleados entre los 14.000 y los 50.000 + +SELECT emp_no FROM employees; + +-- Seleccion de todos los trabajadores + +SELECT emp_no, dept_no FROM dept_emp WHERE dept_no = 1 AND 2; + +-- Empleados que trabajan en 2 departamentos + +SELECT from_date FROM titles WHERE from_date LIKE '2020%'; + +-- Empleados con titulos a partir de 2020 + +SELECT * FROM employees WHERE first_name NOT LIKE '%[abcdefghijklmnopqrstuvwxyz]%'; + +-- Empleados que contengan una letra mayuscula + +SELECT employees.first_name, employees.last_name, dept_emp.dept_no FROM employees LEFT JOIN dept_emp ON employees.emp_no = dept_emp.emp_no; + +-- Seleccionamos el nombre y apellido de cada trabajador y su respectivo departamento. + +SELECT employees.first_name, employees.last_name, dept_manager.dept_no FROM employees LEFT JOIN dept_manager ON employees.emp_no = dept_manager.emp_no; + +-- Seleccion de nombre y apellido + +SELECT DISTINCT first_name FROM employees; + +-- Seleccion de empleados con nombres que no se repiten + +DELETE FROM salaries WHERE salary <= 20000; + +-- Eliminamos los salarios inferior a 20.000 + +DELETE FROM dept_emp Where MAX(dept_no); + + +CREATE TABLE `sqlbasics`.`institute` (`Inst_name` VARCHAR(50) NOT NULL , `Inst_adress` VARCHAR(50) NOT NULL , `ID_inst` INT(10) NOT NULL AUTO_INCREMENT , PRIMARY KEY (`ID_inst`)) ENGINE = InnoDB; + +CREATE TABLE `sqlbasics`.`teachers` (`ID_teacher` INT(10) NOT NULL AUTO_INCREMENT , `first_name_teacher` VARCHAR(50) NOT NULL , `last_name_teacher` VARCHAR(50) NOT NULL , `class_teacher` VARCHAR(50) NOT NULL , PRIMARY KEY (`last_name_teacher`, `ID_teacher`)) ENGINE = InnoDB; + +CREATE TABLE `sqlbasics`.`student` (`ID_Student` INT(10) NOT NULL AUTO_INCREMENT, `first_name` VARCHAR(50) NULL , `last_name` VARCHAR(50) NOT NULL , `birth_date` DATE NOT NULL , `class_teacher` VARCHAR(50) NOT NULL PRIMARY KEY (`ID_Student`)) ENGINE = InnoDB; + +CREATE TABLE `sqlbasics`.`class` (`ID_Class` INT(10) NOT NULL AUTO_INCREMENT, `course` VARCHAR(50) NULL , `class_number` INT(10) NOT NULL , PRIMARY KEY (`ID_Class`)) ENGINE = InnoDB; + +CREATE TABLE `sqlbasics`.`student_class_relation` (`ID_Student` INT(10) NOT NULL AUTO_INCREMENT, `ID_Class` VARCHAR(50) NOT NULL ,FOREIGN KEY (`ID_Student`, `ID_Class`)) ENGINE = InnoDB; + + +-- En este conjunto de 5 tablas tenemos una relacion entre ellas. +-- La tabla de Institute con la de Teachers seria la relacion ONE-TO-ONE. +-- La tabla de teachers con la de Students seria la relacion ONE-TO-MANY. +-- Las tablas de Student, Class y Student_class_relation seria la relacion del MANY-TO-MANY. \ No newline at end of file