Usuario:ManuelRomero/SQL
SQL
SQL es un lenguaje de consultas estructuradas o Structured Query Language. Es un lenguaje de 4º generación donde el programador o usuario del lenguaje especifica lo qué quiere, pero no establece el procedimiento a seguir para conseguirlo, no dice cómo ha de hacer el sistema para conseguirlo
Lenguaje no procedural Vs lenguaje procedural)
| |
Dime todos los empleados de más de 45 años o SELECT * FROM empleados WHERE edad>45; Lenguaje procedural (tipo php o java) Abre la tabla empelados Lee desde el primer registro hasta el último (Bucle) Verifica si ese empleado tiene mas de 45 Si es así añádelo a la lista de resultado Muestra la lista de resultado
|
Lenguaje para gestionar bases de datos relacionales cuyas instrucciones o sentencias especifican lo qué se quiere, no cómo se va a realizar |
Lenguajes dentro de SQL
SQL no es, como su nombre indica, solamente un lenguaje de consultas, sino que proporciona todas las instrucciones necesarias para gestionar una base de datos.
SQL incorpora tres tipos de lenguajes: de Definición, de Control, de Manipulación.
Las instrucciones de SQL se conocen como sentencias, y todas se caracterizan por que empiezan por una palabra reservada que identifica a qué lenguaje de los tres que tiene SQL pertenece esa instrucción.
|
Sentencias DDL
CREATE DATABASE usuarios; CREATE TABLE usuario( password VARCHAR(200), nombre varchar2(40) );
DROP TABLE usuario;
ALTER TABLE usuarios ADD direccion VARCHAR(20); |
Instrucción CREATE
- Sintaxis de la instrucción
- Los nombres de las columnas son identificadores
- Tipos de datos para las columnas
- Especificación de Restricciones
- Definición de Restricciones
- Definición de Restricciones
- Restricción unique
- Restrición Foreign Key
- Restricción Ckeck
- Creacción de tabla como resultado de una consulta
DROP TABLE cliente; DROP TABLE facturas; CREATE TABLE cliente( dni varchar2(10) PRIMARY KEY, nombre varchar2(10) DEFAULT 'mi nombre' ); CREATE TABLE factura( num NUMBER PRIMARY KEY, fecha DATE DEFAULT sysdate, cantidad NUMBER DEFAULT 10, cliente varchar2(10), CONSTRAINT cliente_factura FOREIGN KEY (cliente) REFERENCES cliente(dni) ON DELETE SET NULL ); INSERT INTO cliente (dni) VALUES ( 1); INSERT INTO cliente (dni) VALUES ( 2); INSERT INTO cliente (dni) VALUES ( 3); INSERT INTO cliente (dni) VALUES ( 4); INSERT INTO factura(num, cliente) VALUES ( 1, 1); INSERT INTO factura(num, cliente) VALUES ( 2, 1); INSERT INTO factura(num, cliente) VALUES ( 3, 1); INSERT INTO factura(num, cliente) VALUES ( 4, 2); INSERT INTO factura(num, cliente) VALUES ( 5, 3); INSERT INTO factura(num, cliente) VALUES ( 6, 3); INSERT INTO factura(num, cliente) VALUES ( 7, 4); INSERT INTO factura(num, cliente) VALUES ( 8, 4);
|
Alter table
- La sentencia ALTER TABLE se utiliza para añadir, eliminar o modificar las columnas en una tabla existente.
- SQL ALTER TABLE
ALTER TABLE TABLE_NAME ADD column_name datatype
Eliminar una columna de una tabla
ALTER TABLE TABLE_NAME DROP COLUMN column_name </sql> Modificar co cambiar el tipo de datos de una columna de una tabla <SOURCE lang=sql> ALTER TABLE TABLE_NAME MODIFY column_name datatype
(: Ojo no violar restricciones con la modificación de la tabla)
En un departamento hay empleados cada empleado pertenece a un solo departamento Cada departamento es dirigido por un empleado Un empleado puede dirigir varios departamentos
CREATE TABLE EMPLEADO ( dni varchar2(20), direccion varchar2(15), nombre varchar2(20) NOT NULL, telefono NUMBER, departamento NUMBER, CONSTRAINT valor_telefono CHECK(telefono > 600000000), CONSTRAINT clave_ppal_empleados PRIMARY KEY (dni), CONSTRAINT nom_tel_unico_emp UNIQUE(nombre, telefono) ); CREATE TABLE DEPARTAMENTO( numero NUMBER, nombre varchar2(15), ubicacion varchar2(20) NOT NULL, director varchar2(20), CONSTRAINT numero PRIMARY KEY (numero), CONSTRAINT director FOREIGN KEY (director) REFERENCES EMPLEADO(dni) ); ALTER TABLE EMPLEADO ADD CONSTRAINT pertenece FOREIGN KEY (departamento) REFERENCES DEPARTAMENTO(numero);
ALTER TABLE departamento DROP CONSTRAINT director; DROP TABLE empleado; DROP TABLE departamento;
|
}}
Drop table
- Elimina una tabla de forma completa
- Si solo quire elminiar su contenido usa la claúsula trunctate
Sentencias DCL
GRANT ALL ON DATABASE.* TO 'manuel'@'localhost' #Asigna todos los privilegios sobre las tablas #de la base de datos 'database' # al usuario 'manuel'
|
Sentencias DML
INSERT INTO usuarios (nombre, password) VALUES("manuel", "password_no_segura");
DELETE FROM usuarios WHERE nombre="manuel";
UPDATE usuarios SET nombre="alicia" WHERE nombre="manolo"; |
SELECT
- Esta es una claúsula especial a la que le vamos a dedicar bastante tiempo.
- Consiste en hacer consultas de nuestro conjunto de datos y poder recuperarlos.
- La cantidad de consultas que se pueden realizar es muy grande y variado, siempre que se pueda establecer la consulta y la lógica matemática de su resolución, va a haber una sentencia SQL que permita implementarla.
Esta sentencia que empieza por la claúsual SELECT va a terner hasta 5 posibles claúsulas, de las cuales solo son obligatorias las dos primeras
SELECT FROM
Las 5 posibles que estudaremos son
SELECT FROM WHERE GROUP BY HAVING (ORDER BY)
|
- Usando el álgebra relacional y permite recuperar un subconjunto de los datos de la base de datos.
- Esta sentencia devuelve un conjunto de tuplas como resultado de ejecutar la consulta.
- Las operaciones del algebra relacional son
- Proyecciones
- Selecciones
- Producto cartesiano
- Join
Claúsula Select
- Uso de funciones
- Podemos usar funciones sobre todas las filas y obtener el resultado.
- Algunas funciones típicas son
- Funciones de carácter
- Descripción de las funciones
- Ejemplos
- Funciones con valores numércios
- Funciones con fechas
Funciones de agregación o grupo
- Son funciones que se aplican a un conjunto de valores de diferentes filas
- Nos darán como resultado un sólo valor
- Conviene renombrar la columna
From
- Esta es una operación de un producto cartesiano
- El producto cartesiano consiste en juntar todas las tuplas de una relación con cada una de las tuplas de otra
- Genera gran cantidad de información, por ese motivo los gestores de bases de datos intentan hacerlo lo último
- En el from además de una relación o tabla, puede ir cualquier cosa que me devuelva una relación, incluso una consulta
Where
- La claúsura where establece la operación de selección.
- Es decir de todas las filas, indica cuales son las que queremos seleccionar.
- En esta claúsura, utiliza operadores de comparación para establecer el criterio de las filas seleccionadas
Ejercicios
Secretari@ es el tipo ST_CLERK mysql> SELECT * FROM EMPLOYEES WHERE JOB_ID ="ST_CLERK" AND HIRE_DATE>"1997-12-31"; SELECT LAST_NAME, JOB_ID,SALARY, COMMISSION_PCT FROM EMPLOYEES WHERE COMMISSION_PCT IS NOT NULL ORDER BY LAST_NAME DESC; SELECT 'El salario de '||Last_name|| 'va a ser con un incremento del 10% de '|| round(Salary *1.10) || ' dólares' AS "Nuevo Salario" FROM EMPLOYEES WHERE COMMISSION_pCT IS NULL SELECT last_name, trunc(months_between(sysdate, hire_date)/12) AS "años", trunc(MOD(months_between(sysdate, hire_date),12))AS "meses" FROM employees ORDER BY hire_date; SELECT last_name, salary, decode (commission_pct, NULL, 'No' , 'Yes') AS "comisión" FROM employees SELECT department_name, location_id,job_id, salary FROM departments d, employees e WHERE d.department_id = e.department_id AND location_id = '&localizacion'; SELECT COUNT(*) FROM employees WHERE last_name LIKE '%n' SELECT COUNT(*) FROM employees WHERE last_name LIKE '%n'; --or SELECT COUNT(*) FROM employees WHERE SUBSTR(last_name, -1) = 'n'; SELECT d.department_id, d.department_name, d.location_id, COUNT(e.employee_id) FROM employees e RIGHT OUTER JOIN departments d ON e.department_id = d.department_id GROUP BY d.department_id, d.department_name, d.location_id; SELECT DISTINCT job_id FROM employees WHERE department_id IN (10, 20); SELECT e.job_id, COUNT(e.job_id) FREQUENCY FROM employees e JOIN departments d ON e.department_id = d.department_id WHERE d.department_name IN ('Administration', 'Executive') GROUP BY e.job_id ORDER BY FREQUENCY DESC; SELECT last_name, hire_date FROM employees WHERE TO_CHAR(hire_date, 'DD') < 16; SELECT last_name, salary, TRUNC(salary, -3)/1000 FROM employees; SELECT e.last_name, m.last_name manager, m.salary, j.grade_level FROM employees e JOIN employees m ON e.manager_id = m.employee_id JOIN job_grades j ON m.salary BETWEEN j.lowest_sal AND j.highest_sal AND m.salary > 15000; SELECT d.department_id, d.department_name, COUNT(e1.employee_id) employees, NVL(TO_CHAR(AVG(e1.salary), '99999.99'), 'No average') avg_sal, e2.last_name, e2.salary, e2.job_id FROM departments d RIGHT OUTER JOIN employees e1 ON d.department_id = e1.department_id RIGHT OUTER JOIN employees e2 ON d.department_id = e2.department_id GROUP BY d.department_id, d.department_name, e2.last_name, e2.salary, e2.job_id ORDER BY d.department_id, employees; SELECT department_id, MIN(salary) FROM employees GROUP BY department_id HAVING AVG(salary) = (SELECT MAX(AVG(salary)) FROM employees GROUP BY department_id); SELECT * FROM departments WHERE department_id NOT IN(SELECT department_id FROM employees WHERE job_id = 'SA_REP' AND department_id IS NOT NULL);
SELECT d.department_id, d.department_name, COUNT(*) FROM departments d JOIN employees e ON d.department_id = e.department_id GROUP BY d.department_id, d.department_name HAVING COUNT(*) < 3;
SELECT d.department_id, d.department_name, COUNT(*) FROM departments d JOIN employees e ON d.department_id = e.department_id GROUP BY d.department_id, d.department_name HAVING COUNT(*) = (SELECT MAX(COUNT(*)) FROM employees GROUP BY department_id);
SELECT d.department_id, d.department_name, COUNT(*) FROM departments d JOIN employees e ON d.department_id = e.department_id GROUP BY d.department_id, d.department_name HAVING COUNT(*) = (SELECT MIN(COUNT(*)) FROM employees GROUP BY department_id); SELECT e.employee_id, e.last_name, e.department_id, e.salary, AVG(s.salary) FROM employees e JOIN employees s ON e.department_id = s.department_id GROUP BY e.employee_id, e.last_name, e.department_id, e.salary; SELECT last_name, TO_CHAR(hire_date, 'DAY') DAY FROM employees WHERE TO_CHAR(hire_date, 'Day') = (SELECT TO_CHAR(hire_date, 'Day') FROM employees GROUP BY TO_CHAR(hire_date, 'Day') HAVING COUNT(*) = (SELECT MAX(COUNT(*)) FROM employees GROUP BY TO_CHAR(hire_date,'Day'))); SELECT last_name, TO_CHAR(hire_date, 'Month DD') BIRTHDAY FROM employees ORDER BY TO_CHAR(hire_date, 'DDD');
|
Funciones de conversión de tipos
Funciones de agrupación o grupo
- Son funciones que nos va a mostrar un valor por cada conjunto de filas a las que se aplica la función
Actividades de funciones y agregados
SELECT sysdate "Date" FROM dual;
SELECT employee_id, last_name, salary, ROUND(salary * 1.155, 0) "New Salary" FROM employees;
SELECT INITCAP(last_name) "Name", LENGTH(last_name) "Length" FROM employees WHERE last_name LIKE 'J%' OR last_name LIKE 'M%' OR last_name LIKE 'A%' ORDER BY last_name ;
SELECT last_name, round(MONTHS_BETWEEN(SYSDATE,hire_date)) AS "Meses Trabajados" FROM employees
SELECT INITCAP(last_name) "Name", LENGTH(last_name) "Length" FROM employees WHERE last_name LIKE UPPER('&start_letter%' ) ORDER BY last_name;
SELECT last_name, ROUND(MONTHS_BETWEEN( SYSDATE, hire_date)) MONTHS_WORKED FROM employees ORDER BY months_worked;
SELECT last_name, LPAD(salary, 15, '$') SALARY FROM employees;
SELECT rpad(last_name, 8)||' '|| rpad(' ', salary/1000+1, '*') EMPLOYEES_AND_THEIR_SALARIES FROM employees ORDER BY salary DESC;
SELECT last_name, trunc((SYSDATE-hire_date)/7) AS TENURE FROM employees WHERE department_id = 90 ORDER BY TENURE DESC
SELECT last_name, hire_date, TO_CHAR(hire_date, 'DAY') DAY FROM employees ORDER BY TO_CHAR(hire_date - 1, 'd');
SELECT last_name, NVL(TO_CHAR(commission_pct), 'No Commission') COMM FROM employees
SELECT job_id, decode (job_id, 'ST_CLERK', 'E' 'SA_REP', 'D' 'IT_PROG','C' 'ST_MAN','B' 'AD_PRES','A' '0')GRADE FROM employees;
SELECT last_name, hire_date, TO_CHAR(NEXT_DAY(ADD_MONTHS(hire_date, 6),'MONDAY'), 'fmDay, "the" Ddspth "of" Month, YYYY') REVIEW FROM employees;
SELECT ROUND(MAX(salary),0) "Maximum", ROUND(MIN(salary),0)"Minimum", ROUND(SUM(salary),0)"Sum", ROUND(AVG(salary),0)"Average" FROM employees;
SELECT ROUND(MAX(salary),0) "Maximum", ROUND(MIN(salary),0)"Minimum", ROUND(SUM(salary),0)"Sum", ROUND(AVG(salary),0)"Average" FROM employees; GROUP BY job_id;
SELECT job_id, COUNT(*) FROM employees WHERE job_id = '&job_title' GROUP BY job_id;
SELECT COUNT(DISTINCT manager_id) "Number of Managers" FROM employees;
SELECT MAX(salary) - MIN(salary) DIFFERENCE FROM employees;
SELECT manager_id, MIN(salary) FROM employees WHERE manager_id IS NOT NULL GROUP BY manager_id HAVING MIN(salary) > 6000 ORDER BY MIN(salary) DESC;
columna adecuadas. SELECT COUNT(*) total, SUM(DECODE(TO_CHAR(hire_date, 'YYYY'),1995,1,0))"1995", SUM(DECODE(TO_CHAR(hire_date,'YYYY'),1996,1,0))"1996", SUM(DECODE(TO_CHAR(hire_date,'YYYY'),1997,1,0))"1997", SUM(DECODE(TO_CHAR(hire_date, 'YYYY'),1998,1,0))"1998" FROM employees;
SELECT job_id "Job", SUM(DECODE(department_id, 20,salary)) "Dept 20", SUM(DECODE(department_id, 50,salary)) "Dept 50", SUM(DECODE(department_id, 80,salary)) "Dept 80", SUM(DECODE(department_id, 90,salary)) "Dept 90", FROM employees GROUP BY job_id;