1. UF2 · SQL
ASIX – Gestión de bases de datos
DAM – Bases de datos
1
Departamento de Informática - Carmen Soler
2. UD2.1. DDL
(Data Description Language)
1. Creación de una tabla
1. Integridad de datos
2. Restricciones en CREATE TABLE
2. Supresión de tablas
3. Modificación de tablas
4. Secuencias
2
Departamento de Informática - Carmen Soler
3. 1. Creación de una tabla
A tener en cuenta antes de crear una tabla
El nombre de la tabla
Debe ser un nombre que identifique el contenido
Ha de tener entre 1 y 30 caracteres de longitud y no puede ser una palabra reservada de Oracle
Por ejemplo, llamaremos ALUMNOS a una tabla que contenga datos sobre alumnos
El nombre de cada columna de la tabla
Debe ser autodescriptivo
Por ejemplo, DNI, NOMBRE o APELLIDOS
El tipo de dato y tamaño que tendrá cada columna
Las columnas que serán obligatorias, los valores por defecto, las restricciones, etc.
3
Departamento de Informática - Carmen Soler
4. 1. Creación de una tabla
CREATE TABLE NombreTabla
(
Columna1 Tipo_dato [NOT NULL],
Columna2 Tipo_dato [NOT NULL],
…
)
CREATE TABLE ALUMNOS
(
NUMERO_MATRICULA NUMBER(6) NOT NULL,
NOMBRE VARCHAR(2) NOT NULL,
FECHA_NACIMIENTO DATE,
DIRECCION VARCHAR2(30),
LOCALIDAD VARCHAR2(15)
)
4
Departamento de Informática - Carmen Soler
5. 1.1. Integridad de datos
Una restricción de integridad es una regla que restringe el rango de valores
para una o más columnas de la tabla.
Una columna que no pueda almacenar números negativos
Una cadena de caracteres que sólo pueda contener mayúsculas
La integridad referencial es la que controla los valores de una columna de
una tabla que dependen de otra.
VENTAS y ARTICULOS
Que no haya una venta con productos inexistentes
5
Departamento de Informática - Carmen Soler
6. 1.2. Restricciones en CREATE TABLE
CREATE TABLE permite definir distintos valores de restricciones sobre una
tabla:
Claves primarias
Claves foráneas
Campos obligatorios
Valores de los campos por defecto
Verificación de condiciones
Para definir restricciones usamos CONSTRAINT
6
Departamento de Informática - Carmen Soler
7. 1.2. Restricciones en CREATE TABLE
CREATE TABLE BLOQUES_PISOS (
CALLE VARCHAR2(30),
Definir claves primarias NUMERO NUMBER(3),
PISO NUMBER(2),
Es una columna o conjunto de columnas
PUERTA CHAR(1),
Debe ser un campo único, no nulo y obligatorio CODIGO_POSTAL NUMBER(5),
COMENTARIOS VARCHAR2(60),
Usamos la restricción PRIMARY KEY COD_ZONA NUMBER(2),
DNI VARCHAR2(10),
PRIMARY KEY (
CREATE TABLE ZONAS( CALLE, NUMERO, PISO, PUERTA)
COD_ZONA NUMBER(3), );
NOMBREZONA VARCHAR2(15)
NOT NULL, CREATE TABLE ZONAS(
MASDATOS VARCHAR2(60), COD_ZONA NUMBER(3)
CONSTRAINT PK_ZONAS PRIMARY KEY,
PRIMARY KEY(COD_ZONA) NOMBREZONA VARCHAR2(15)
); NOT NULL,
MASDATOS VARCHAR2(60)
);
7
Departamento de Informática - Carmen Soler
8. 1.2. Restricciones en CREATE TABLE
Definir claves foráneas
Es una o más columnas que están asociadas a una clave primaria de otra o de la misma
tabla
El valor de las columnas definidas como claves foráneas debe ser NULL o igual a un valore
de la tabla referenciada (Integridad referencial)
PERSONAS PROVINCIAS
DNI COD_PROV
NOMBRE NOM_PROV
DIRECCION
COD_PROV
8
Departamento de Informática - Carmen Soler
9. 1.2. Restricciones en CREATE TABLE
Definir claves foráneas CREATE TABLE PERSONAS (
DNI NUMBER(8) PRIMARY KEY,
CREATE TABLE PROVINCIAS (
NOMBRE VARCHAR2(15),
COD_PROV NUMBER(2)
DIRECCION VARCHAR2(25),
PRIMARY KEY,
COD_PROV NUMBER(2)
NOM_PROV VARCHAR2(15)
NOT NULL
);
REFERENCES PROVINCIAS
);
CREATE TABLE PERSONAS ( CREATE TABLE PERSONAS (
DNI NUMBER(8) PRIMARY KEY, DNI NUMBER(8) PRIMARY KEY,
NOMBRE VARCHAR2(15), NOMBRE VARCHAR2(15),
DIRECCION VARCHAR2(25), DIRECCION VARCHAR2(25),
COD_PROV NUMBER(2) NOT NULL, COD_PROV NUMBER(2) NOT NULL,
FOREIGN KEY (COD_PROV) CONSTRAINT FK_PER_PRO
REFERENCES PROVINCIAS FOREIGN KEY (COD_PROV)
); REFERENCES PROVINCIAS
);
9
Departamento de Informática - Carmen Soler
10. 1.2. Restricciones en CREATE TABLE
Definir claves foráneas
Si se quiere que al borrar una provincia, las personas que tengan esa provincia también sean
eliminadas:
CREATE TABLE PERSONAS (
DNI NUMBER(8) PRIMARY KEY,
NOMBRE VARCHAR2(15),
DIRECCION VARCHAR2(25),
COD_PROV NUMBER(2) NOT NULL,
FOREIGN KEY (COD_PROV)
REFERENCES PROVINCIAS
ON DELETE CASCADE
);
Si no se define ONDELETE CASCADE, si la provincia pertenece a alguna persona, no podrá ser
borrada
10
Departamento de Informática - Carmen Soler
11. 1.2. Restricciones en CREATE TABLE
Obligatoriedad
Obliga a que la columna no pueda tener valores nulos.
CREATE TABLE PERSONAS (
DNI NUMBER(8) PRIMARY KEY,
NOMBRE VARCHAR2(15),
DIRECCION VARCHAR2(25),
COD_PROV NUMBER(2) NOT NULL,
FOREIGN KEY (COD_PROV)
REFERENCES PROVINCIAS
);
11
Departamento de Informática - Carmen Soler
12. 1.2. Restricciones en CREATE TABLE
Valores por defecto
Obliga a que la columna no pueda tener valores nulos.
CREATE TABLE EJEMPLO (
DNI VARCHAR2(10) NOT NULL,
NOMBRE VARCHAR2(30) NOT NULL DEFAULT „No definido‟,
EDAD NUMBER(2),
FECHA DATE DEFAULT SYSDATE
);
12
Departamento de Informática - Carmen Soler
13. 1.2. Restricciones en CREATE TABLE
Verificación de condiciones
Limita los valores de los campos a un rango o a unas condiciones:
CREATE TABLE EJEMPLO (
DNI VARCHAR2(10) PRIMARY KEY,
NOMBRE VARCHAR2(30) NOT NULL
CHECK (NOMBRE=UPPER(NOMBRE)),
EDAD NUMBER(2) CHECK (EDAD BETWEEN 5 AND 20),
CURSO NUMBER(2) CHECK (CURSO IN(1,2,3)));
13
Departamento de Informática - Carmen Soler
14. 1.2. Restricciones en CREATE TABLE
Verificación de condiciones
Limita los valores de los campos a un rango o a unas condiciones:
CREATE TABLE EJEMPLO (
DNI VARCHAR2(10) PRIMARY KEY,
NOMBRE VARCHAR2(30) NOT NULL,
EDAD NUMBER(2),
CURSO NUMBER(2),
CONSTRAINT COMP_EDAD
CHECK (EDAD BETWEEN 5 AND 20),
CONSTRAINT NOMBRE_MAY
CHECK (NOMBRE=UPPER(NOMBRE)),
CONSTRAINT COMP_CURSO
CHECK (CURSO IN(1,2,3));
14
Departamento de Informática - Carmen Soler
15. 1.2. Restricciones en CREATE TABLE
La restricción UNIQUE
Evita valores repetidos de la misma columna
CREATE TABLE EJEMPLO (
DNI VARCHAR2(10) PRIMARY KEY,
NOMBRE VARCHAR2(30) UNIQUE,
EDAD NUMBER(2)
);
15
Departamento de Informática - Carmen Soler
16. 1.2. Restricciones en CREATE TABLE
Las restricciones en tablas de sistema
Existen una serie de vistas que contienen información general referente a las restricciones
definidas en las tablas:
USER_CONSTRAINTS
Definiciones de restricciones de tablas propiedad del usuario
ALL_CONSTRAINTS
Definiciones de restricciones de tablas a las que puede acceder el usuario
DBA_CONSTRAINTS
Todas las definiciones de restricciones sobre todas las tablas
16
Departamento de Informática - Carmen Soler
17. 2. Supresión de tablas
Con la orden DROP TABLE
Cada usuario puede borrar sus propias tablas
Sólo el administrador de la base de datos puede borrar las tablas de los
demás.
Ejemplo:
DROP TABLE EMPLEADO;
DROP TABLE PROVINCIAS;
DROP TABLE PROVINCIAS CASCADE CONSTRAINT;
17
Departamento de Informática - Carmen Soler
18. 3. Modificación de tablas
Con la orden ALTER TABLE
Sintaxis general
ALTER TABLE nombretabla
{[ADD (columna [, columna] …)]
[MODIFY (columna [, columna] …)]
[ADD CONSTRAINT restricción]
[DROP CONSTRAINT restricción]};
18
Departamento de Informática - Carmen Soler
19. 3. Modificación de tablas
Ejemplos
ALTER TABLE EJEMPLO ADD (SEXO CHAR(1), EDAD NUMBER(2));
ALTER TABLE EJEMPLO MODIFY (SEXO CHAR(1) NOT NULL, EDAD
NUMBER(4));
ALTER TABLE EMPLEADO ADD CONSTRAINT APELLIDO_UQ
UNIQUE(apellido);
ALTER TABLE EMPLEADO DROP CONSTRAINT APELLIDO_UQ;
19
Departamento de Informática - Carmen Soler
20. 4. Secuencias
Oracle proporciona objetos de secuencia para la generación de números
autonuméricos.
A la hora de generarlo, podemos utilizar todos los parámetros posibles
(primer caso), o bien, simplificar la orden aceptando los valores por defecto
(segundo caso).
20
Departamento de Informática - Carmen Soler
21. 4. Secuencias
Para ir obteniendo los valores de esta secuencia tenemos dos formas:
Que me dé el siguiente valor que corresponde (caso 1)
Que me dé el último valor que se asignó (caso 2)
Para eliminarlas, igual que con todos los objetos de la base de datos.
21
Departamento de Informática - Carmen Soler
22. 4. Secuencias
Las secuencias nos serán útiles en diferentes ocasiones:
Cuando queramos obtener el último valor de primary key que se insertó en la tabla.
Cuando hacemos un insert de un valor nuevo y queremos obtener qué valor es el siguiente
de primary key.
Las secuencias son muy útiles a la hora de programar con PL/SQL.
22
Departamento de Informática - Carmen Soler
23. UD2.2. DML
(Data Manipulation Language)
1. Inserción de datos: INSERT
2. Modificación de datos: UPDATE
3. Borrado de filas: DELETE
4. Restricciones
23
Departamento de Informática - Carmen Soler
24. 1. Inserción de datos: INSERT
INSERT INTO NombreTabla
[
(columna [, columna]…)
]
VALUES
(valor [, valor]);
Las columnas que no estén en la lista recibirán un NULL
Si la columna está definida como NOT NULL y además, la columna no
aparece en la lista, el INSERT fallará.
24
Departamento de Informática - Carmen Soler
25. 1. Inserción de datos: INSERT
CREATE TABLE ALUMNOS
(
NUMERO_MATRICULA NUMBER(6) NOT NULL,
NOMBRE VARCHAR(12) NOT NULL,
FECHA_NACIMIENTO DATE,
DIRECCION VARCHAR2(30),
LOCALIDAD VARCHAR2(15)
)
INSERT INTO ALUMNOS
(NUMERO_MATRICULA, NOMBRE, FECHA_NACIMIENTO)
VALUES
(123456, „Pepito‟, SYSDATE);
25
Departamento de Informática - Carmen Soler
26. 2. Modificación de datos: UPDATE
UPDATE NombreTabla
SET columna1 = valor1, …, columnan = valorn
WHERE
condición;
Con el WHERE seleccionamos las filas que se van a actualizar.
Si no ponemos nada, la actualización afectará a todas las filas de la tabla.
26
Departamento de Informática - Carmen Soler
27. 2. Modificación de datos: UPDATE
CREATE TABLE ALUMNOS
(
NUMERO_MATRICULA NUMBER(6) NOT NULL,
NOMBRE VARCHAR(12) NOT NULL,
FECHA_NACIMIENTO DATE,
DIRECCION VARCHAR2(30),
LOCALIDAD VARCHAR2(15)
)
UPDATE ALUMNOS
SET NOMBRE = „Pepito2‟
WHERE
NUMERO_MATRICULA = „123456‟;
27
Departamento de Informática - Carmen Soler
28. 3. Borrado de filas: DELETE
DELETE FROM NombreTabla WHERE condición;
Con el WHERE seleccionamos las filas que se van a eliminar.
Hay que ir con mucho cuidado porque si no ponemos WHERE, se eliminarán
todas las filas de la tabla.
28
Departamento de Informática - Carmen Soler
29. 3. Borrado de datos: DELETE
CREATE TABLE ALUMNOS
(
NUMERO_MATRICULA NUMBER(6) NOT NULL,
NOMBRE VARCHAR(12) NOT NULL,
FECHA_NACIMIENTO DATE,
DIRECCION VARCHAR2(30),
LOCALIDAD VARCHAR2(15)
)
DELETE FROM ALUMNOS
WHERE
NUMERO_MATRICULA = „123456‟;
29
Departamento de Informática - Carmen Soler
31. 4. Restricciones
Sobre el modelo anterior
Si queremos dejar definidas las claves primarias y foráneas en su creación, ¿en qué orden
deberíamos crear las tablas?
¿Y si definiéramos claves primarias y foráneas después de crear las tablas?
Suponemos que la base de datos está vacía y todas las columnas son NOT NULL. Quiero
insertar algo en la tabla de PERSONAS y no podré, ¿por qué? ¿cómo lo solucionaría?
Si hay datos en todas las tablas y no quiero hacer un borrado en cascada, ¿en qué orden
debo eliminarlos?
31
Departamento de Informática - Carmen Soler
32. UD2.3. Consultas
1. Estructura general de una consulta 8. Valor NULL
2. DESC / DESCRIBE 9. ORDER BY
3. Tipos de datos. Características. 10. Tabla DUAL
4. DISTINCT 11. Funciones simples
5. AS (alias) 1. De VARCHAR
2. De NUMBER
6. WHERE
3. De DATE
1. AND y BETWEEN
2. OR e IN 12. Funciones de grupo
3. NOT 13. Subconsultas
4. LIKE 14. Combinación de tablas
7. Operaciones aritméticas
32
Departamento de Informática - Carmen Soler
33. 1. Estructura general de una consulta
SELECT [ALL | DISTINCT]
[expre_column1, expre_column2, …, expre_column|*]
FROM [nombre_tabla1, nombre_tabla2, …, nombre_tablan]
[WHERE condicion]
[ORDER BY expre_column [DESC|ASC] [,expre_column [DESC|ASC]]]
Ejemplos FROM:
SELECT nom_alum, nota FROM ALUMNOS;
SELECT A.nom_alum, A.nota FROM ALUMNOS A;
33
Departamento de Informática - Carmen Soler
34. 1. Estructura general de una consulta
Selección por columnas (proyección) Selección por filas (selección)
SELECT NOMBRE, DEPT_NO FROM DEPART;
SELECT EMP_NO, APELLIDO, OFICIO, DEPT_NO
FROM EMPLE
WHERE DEPT_NO = 20 ORDER BY APELLIDO;
SELECT * FROM EMPLE WHERE OFICIO=„ANALISTA‟;
SELECT * FROM EMPLE WHERE DEPT_NO=10 AND
OFICIO=„ANALISTA‟ ORDER BY APELLIDO DESC, EMP_NO
DESC;
34
Departamento de Informática - Carmen Soler
35. 2. DESC / DESCRIBE
Sirve para consultar la estructura de una tabla.
DESCRIBE HR.REGIONS
35
Departamento de Informática - Carmen Soler
36. 3. Tipos de datos. Características.
Resumen de los más importantes:
VARCHAR2(n)
Para almacenar texto.
Es una evolución del antiguo CHAR(n)
La ventaja que tiene VARCHAR2 es que, si no ocupa los n caracteres, el resto de espacio no queda
asignado.
NUMBER(n,d)
Valores numéricos con o sin decimales
No es obligatorio indicar las cifras n y d, pero si se hace:
N es el número de dígitos total que tiene el número
D es el número de decimales que tiene (va incluido en N)
36
Departamento de Informática - Carmen Soler
37. 3. Tipos de datos. Características.
Resumen de los más importantes:
DATE
Guarda valores de fecha y hora.
Otros tipos:
Timestamp guarda una fecha expresada en segundos.
BLOB Para almacenar contenido multimedia.
37
Departamento de Informática - Carmen Soler
38. 4. DISTINCT
Ejemplos DISTINCT:
SELECT DEPT_NO FROM EMPLE; (1)
SELECT DISTINCT DEPT_NO FROM EMPLE; (2)
DEPT_NO (1) DEPT_NO (2)
20 10
30 20
30 30
20
10
10
30
20
10
38
Departamento de Informática - Carmen Soler
39. 5. AS (alias)
SELECT FIRST_NAME as “Nombre”, LAST_NAME Apellido,
SALARY “Salario actual”
FROM EMPLOYEES
39
Departamento de Informática - Carmen Soler
40. 6. WHERE
Ejemplos WHERE:
-- La nota está entre 5 y 10 (incluidos)
WHERE (NOTA <= 10) AND (NOTA >= 5)
WHERE NOTA BETWEEN 5 AND 10
-- La nota no está entre 5 y 10, debe ser una nota -
--fuera de estos límites
WHERE NOTA NOT BETWEEN 5 AND 10;
-- La nota es ó 5 ó 10
WHERE (NOTA = 10) OR (NOTA = 5)
WHERE NOTA IN (5, 10)
-- La nota no es ni 5 ni 10
WHERE NOTA NOT IN (5, 10)
40
Departamento de Informática - Carmen Soler
41. 6. WHERE
Más ejemplos de IN
Para comprobar si una columna pertenece o no a un conjunto de valores
SELECT APELLIDO FROM EMPLE WHERE DEPT_NO IN(10,30);
SELECT APELLIDO FROM EMPLE WHERE DEPT_NO NOT IN(10, 30);
Más ejemplos de BETWEEN
SELECT APELLIDO, SALARIO
FROM EMPLE
WHERE SALARIO BETWEEN 1100 and 1200;
SELECT APELLIDO, SALARIO
FROM EMPLE
WHERE NOT BETWEEN 1100 and 1200;
41
Departamento de Informática - Carmen Soler
42. 6. WHERE
Combinación de AND y OR
SELECT APELLIDO, SALARIO, DEPT_NO FROM EMPLE
WHERE SALARIO>1500 AND (DEPT_NO=10 OR DEPT_NO=20);
APELLIDO SALARIO DEPT_NO
JIMENEZ 1800 20
CEREZO 1600 10
GIL 1700 20
REY 2500 10
FERNANDEZ 1900 20
SELECT APELLIDO, SALARIO, DEPT_NO FROM EMPLE
WHERE SALARIO>1500 AND DEPT_NO IN(10,20);
42
Departamento de Informática - Carmen Soler
43. 6. WHERE
Combinación de AND y OR
SELECT APELLIDO, SALARIO, DEPT_NO FROM EMPLE
WHERE SALARIO>1500 AND DEPT_NO=10 OR DEPT_NO=20;
APELLIDO SALARIO DEPT_NO
SANCHEZ 1400 20
JIMENEZ 1800 20
CEREZO 1600 10
GIL 1700 20
REY 2500 10
ALONSO 1350 20
FERNANDEZ 1900 20
43
Departamento de Informática - Carmen Soler
44. 6. WHERE
Hay una forma especial para comparar cadenas de caracteres
Usamos el operador LIKE
Tenemos caracteres especiales:
‘%’ es un comodín, representa una cadena de 0 o más caracteres
‘_’ Marcador de posición. Representa un carácter cualquiera.
Ejemplos
LIKE ‘Director’ Igual a la cadena ‘Director’
LIKE ‘M%’ Que empiece por ‘M’
LIKE ‘%X%’ Que contenga una ‘X’
LIKE ‘__M’ Que tenga 3 caracteres y acabe en ‘M’
LIKE ‘_R%’ Cualquier cadena que la segunda letra sea ‘R’
44
Departamento de Informática - Carmen Soler
45. 7. Operaciones aritméticas
Sirven para formar expresiones con constantes, valores de columnas y
funciones de valores de columnas
SELECT col1*col2, col1-col2
FROM tabla1
WHERE col1+col2=34;
Operadores aritméticos y operación asociada:
+ Suma
- Resta
* Multiplicación
/ División
45
Departamento de Informática - Carmen Soler
46. 7. Operaciones aritméticas
Sirven para formar expresiones con constantes, valores de columnas y
funciones de valores de columnas
NOMBRE_ALUMNO NOTA1 NOTA2 NOTA3
Luís Benito 5 5 5
Manuel Casas 7 6 8
Ana Sánchez 3 5 5
Antonio García 6 4 5
Sacar la nota media de cada alumno
SELECT NOMBRE_ALUMNO, (NOTA1+NOTA2+NOTA3)/3
FROM NOTAS_ALUMNOS;
46
Departamento de Informática - Carmen Soler
47. 7. Operaciones aritméticas
Ejemplo NOMBRE_ALUMNO NOTA1 NOTA2 NOTA3
Luís Benito 5 5 5
Manuel Casas 7 6 8
Ana Sánchez 3 5 5
Antonio García 8 4 5
Obtener aquellos nombres de alumnos que tengan un 7 en NOTA1 y cuya
media sea mayor que 6
SELECT NOMBRE_ALUMNO
FROM NOTAS_ALUMNOS
WHERE NOTA1=7 AND (NOTA1+NOTA2+NOTA3)/3>6;
47
Departamento de Informática - Carmen Soler
48. 8. Valor NULL
Consideramos que una columna es NULL si no tiene ningún valor asignado.
No es null un número que sea cero y, no es null un varchar2 vacío.
Para comprobar si es NULL o no empleamos:
Columna IS NULL
Columna IS NOT NULL
SELECT APELLIDO FROM EMPLE WHERE COMISION IS NULL;
SELECT APELLIDO FROM EMPLE WHERE COMISION IS NOT NULL;
48
Departamento de Informática - Carmen Soler
49. 8. Valor NULL
Al ser un valor especial, se comporta de manera especial en estos casos:
En operaciones aritméticas con un valor null, el resultado es null;
En concatenaciones con un valor null, no tiene efecto. Ni siquiera aparece ‘null’ en el
resultado, es como si no estuviera.
-- El resultado es NULL
SELECT SALARIO*1.25+NULL FROM EMPLE
-- El resultado es el valor del Apellido
SELECT APELLIDO||NULL FROM EMPLE
49
Departamento de Informática - Carmen Soler
50. 9. ORDER BY
Ejemplo:
SELECT *
FROM ALUMNOS
ORDER BY NOM_ALUM, CURSO DESC;
El primer criterio de ordenación es el principal, si hay varios iguales, se ordenarán según el
secundario.
Se ordena por nom_alum ascendente y por curso descendente.
Por defecto es ordenación ascendente. Si se quiere descendente se debe indicar
explícitamente.
50
Departamento de Informática - Carmen Soler
51. 10. Tabla DUAL
La tabla DUAL es una tabla de sistema que sirve para hacer pruebas.
Si yo escribo: SELECT 1*2 FROM REGIONS, porque quiero probar cómo
funciona una operación de *, me saldrá la * 4 veces, una por cada fila de
regions.
Si sólo se quiere hacer pruebas, DUAL es muy útil porque tiene sólo una
columna y una fila creadas:
51
Departamento de Informática - Carmen Soler
52. 11. Funciones simples
Se llaman simples porque se aplican por cada uno de los resultados del
select.
DE VARCHAR2:
SELECT INITCAP(first_name||' '|| last_name) as "Nombre
completo",
LENGTH(first_name||' '|| last_name) as "Longitud",
FROM EMPLOYEES
WHERE (LOWER(last_name) like '%a%' or UPPER(first_name) like
'%E%')
Además de las del ejemplo tenemos:
SUBSTR, INSTR, RPAD, LPAD, TRIM y REPLACE
52
Departamento de Informática - Carmen Soler
53. 11. Funciones simples
DE NUMBER:
ROUND(12.62) Da 13
ROUND(12.37) Da 12
ROUND(12.37,1) Redondea a 1 decimal 12.4
ROUND(12.62,1) Redondea a 1 decimal 12.6
TRUNC(12.62) Elimina los decimales 12
TRUNC(12.37,1) Deja sólo 1 decimal 12.3
53
Departamento de Informática - Carmen Soler
54. 11. Funciones simples
DE DATE:
MONTHS_BETWEEN(fecha2, fecha1)
Da el número de meses que hay entre las dos fechas.
Puede retornar un valor decimal
ADD_MONTHS(fecha, numMeses)
Añade a una fecha el número de meses que se indique.
LAST_DAY(fecha)
Nos da el último día de mes de la fecha indicada
NEXT_DAY(fecha, ‘día semana’)
Si dia semana es Lunes, nos da la fecha del próximo lunes partiendo de la fecha que se indica.
54
Departamento de Informática - Carmen Soler
55. 12. Funciones de grupo
A diferencia de las funciones simples, se aplican sobre un conjunto de filas
de la tabla.
Las que utilizaremos son: COUNT, SUM, AVG, MAX, MIN
-- Cuenta los empleados que hay
-- Retorna un único número.
SELECT COUNT(*) FROM EMPLE
-- Cuenta los salarios que hay
-- si hay un valor null, no lo cuenta
SELECT COUNT(SALARY) FROM EMPLE
-- Cuentas los trabajos diferentes que hay
SELECT COUNT(DISTINCT SALARY) FROM EMPLE
55
Departamento de Informática - Carmen Soler
56. 12. Funciones de grupo
-- Calcula la media de sueldo de los empleados
-- de un departamento concreto
SELECT AVG(salary) FROM EMPLE WHERE DEP_ID=30
-- Salario más alto de la empresa
-- podemos utilizar 2 funciones de grupo
-- en la misma consulta
SELECT MAX(SALARY), MIN(SALARY) FROM EMPLE
¿Es lo mismo?
56
Departamento de Informática - Carmen Soler
57. 12. Funciones de grupo
Visualizar el número de empleados que hay en cada departamento.
Tenemos que agrupar las filas de la tabla EMPLE por departamento (GROUP BY DEPT_NO) y
contarlas (COUNT(*))
SELECT DEPT_NO, COUNT(*)
FROM EMPLE
GROUP BY DEPT_NO;
COUNT es una función de grupo y da información sobre un grupo de filas, no sobre filas
individuales de cada tabla.
GROUP BY obliga a COUNT a contar las filas que se han agrupado por cada departamento.
57
Departamento de Informática - Carmen Soler
58. 12. Funciones de grupo
Ejemplo de HAVING:
Visualizar los departamentos con más de 4 empleados.
SELECT DEPT_NO, COUNT(*)
FROM EMPLE
GROUP BY DEPT_NO HAVING COUNT(*)>4
HAVING es similar al WHERE, pero trabaja con grupos de filas. Puede preguntar por el
resultado de funciones de grupo, como es este caso.
Además, podemos ordenar la salida:
SELECT DEPT_NO, COUNT(*)
FROM EMPLE GROUP BY DEPT_NO HAVING COUNT(*)>4
ORDER BY COUNT(*) DESC;
58
Departamento de Informática - Carmen Soler
59. 12. Funciones de grupo
En tiempo de ejecución de la query, las cláusulas siguen este orden:
WHERE Para seleccionar las filas
GROUP BY Agrupa estas filas
HAVING Filtra los grupos
ORDER BY Clasifica la salida. Ordena los grupos.
59
Departamento de Informática - Carmen Soler
60. 13. Subconsultas
Seguimos haciendo consultas de una sola tabla, pero ahora vamos a
combinar varias consultas en una sola.
Esta es una consulta con subconsultas en la que podemos saber, a día de
hoy, cuántos empleados y departamentos tenemos:
SELECT SYSDATE HOY,
(SELECT COUNT(*) FROM DEPARTMENTS) NUM_DEPT,
(SELECT COUNT(*) FROM EMPLOYEES) EMP_COUNT FROM DUAL;
60
Departamento de Informática - Carmen Soler
61. 13. Subconsultas
A veces para realizar consultas, necesitamos los datos devueltos por otras
consultas.
Queremos saber los apellidos de aquellas personas que tienen el mismo oficio que el que
se apellida ‘Bates’ (suponemos que sólo hay un ‘Bates’).
PASO 1
Averiguar el oficio de Bates:
SELECT JOB_ID FROM EMPLOYEES WHERE LAST_NAME = ‘Bates’
PASO 2
El JOB_ID es ‘SA_REP’
SELECT APELLIDO FROM EMPLE WHERE JOB_ID = ‘SA_REP’ AND LAST_NAME <> ‘Bates’
61
Departamento de Informática - Carmen Soler
62. 13. Subconsultas
Esto se puede resumir en una única consulta
SELECT LAST_NAME
FROM EMPLOYEES
WHERE JOB_ID =
(SELECT JOB_ID
FROM EMPLOYEES
WHERE LAST_NAME = ‘Bates’
)
AND LAST_NAME <> ‘Bates’;
62
Departamento de Informática - Carmen Soler
63. 13. Subconsultas
Subconsultas con valores simples
Devuelven una fila o un valor de la fila
El ejemplo anterior devuelve un solo valor que puedo igualar a oficio con ‘=‘.
SELECT LAST_NAME
FROM EMPLOYEES
WHERE JOB_ID =
(SELECT JOB_ID
FROM EMPLOYEES
WHERE LAST_NAME = ‘Bates’
)
AND LAST_NAME <> ‘Bates’;
63
Departamento de Informática - Carmen Soler
64. 13. Subconsultas
Subconsultas con valores simples
Pero si digo lo siguiente:
SELECT LAST_NAME
FROM EMPLOYEES
WHERE JOB_ID =
(SELECT JOB_ID
FROM EMPLOYEES
WHERE DEPTARTMENT_ID = 20
)
Esto devuelve más de un oficio y, por lo tanto, dará un error.
64
Departamento de Informática - Carmen Soler
65. 13. Subconsultas
Subconsultas que generan listas de valores
Si devuelve más de un valor, debemos usar el operador IN.
SELECT LAST_NAME
FROM EMPLOYEES
WHERE JOB_ID IN
(SELECT JOB_ID
FROM EMPLOYEES
WHERE DEPTARTMENT_ID = 20
)
65
Departamento de Informática - Carmen Soler
66. 13. Subconsultas
Ejercicio
Obtén los departamentos que estén situados en Seattle
(1) SELECT LOCATION_ID FROM LOCATIONS
WHERE CITY = ‘Seattle’
LOCATION_ID = 1700
(2) SELECT DEPARTMENT_NAME FROM DEPARTMENTS WHERE
LOCATION_ID = 1700
(2) Cómo juntamos (1) y (2)???
66
Departamento de Informática - Carmen Soler
67. 13. Subconsultas
Ejercicio
Obtener el apellido de los empleados con el mismo oficio que ‘Bates’ y un salario inferior
(comparación doble)
67
Departamento de Informática - Carmen Soler
68. 13. Subconsultas
Sacar el apellido de los empleados que cobren menos que el salario medio
de todos los empleados:
SELECT LAST_NAME FROM EMPLOYEES WHERE SALARY <
(SELECT AVG(SALARY) FROM EMPLOYEES)
Sacar el apellido de los empleados que cobren menos que el salario medio
dentro de su mismo departamento:
SELECT LAST_NAME FROM EMPLOYEES Q WHERE SALARY <
(SELECT AVG(SALARY) FROM EMPLOYEES S
WHERE S.DEPARTMENT_ID = Q.DEPARTMENT_ID)
68
Departamento de Informática - Carmen Soler
69. 13. Subconsultas
Sacar el apellido del empleado que más cobra de la empresa:
SELECT LAST_NAME FROM EMPLOYEES WHERE SALARY =
(SELECT MAX(SALARY) FROM EMPLOYEES)
Sacar el apellido de los empleados que sean jefe de algún otro empleado:
SELECT LAST_NAME FROM EMPLOYEES WHERE EMPLOYEE_ID IN
(SELECT MANAGER_ID FROM EMPLOYEES)
69
Departamento de Informática - Carmen Soler
70. 14. Combinación de tablas
Para consultas que necesiten varias tablas.
Reglas a tener en cuenta:
Es posible hacer la consulta de tantas tablas como queramos
Desde SELECT podemos referirnos a columnas de cualquier tabla
Si hay columnas de diferentes tablas con el mismo nombre, las distinguiremos así:
NombreTabla.NombreColumna
La forma de combinar las tablas se especifica en WHERE. Si no se indica nada, se hará un
producto cartesiano
70
Departamento de Informática - Carmen Soler
71. 14. Combinación de tablas
Ejemplos
SELECT LAST_NAME, JOB_ID, EMPLOYEE_ID, DEPARTMENT_NAME,
LOCATION_ID
FROM EMPLOYEES E, DEPARTMENTS D
WHERE E.DEPARTMENT_ID = D.DEPTARTMENT_ID
SELECT LAST_NAME, JOB_ID, EMPLOYEE_ID, DEPARTMENT_NAME,
LOCATION_ID
FROM EMPLOYEES E, DEPARTMENTS D
71
Departamento de Informática - Carmen Soler
72. 14. Combinación de tablas
Ejemplo join
72
Departamento de Informática - Carmen Soler
73. 14. Combinación de tablas
Para hacer joins, tenemos 2 formas:
Poner todas las condiciones en el WHERE como acabamos de ver.
Utilizar un INNER JOIN.
A efectos de resultados, el INNER JOIN es exactamente lo mismo.
Lo que cambia es el nivel de eficiencia. Si los campos de unión de tablas
tienen definidos índices, el INNER JOIN es capaz de aprovechar estos índices
para hacer la consulta más rápidamente.
73
Departamento de Informática - Carmen Soler
74. 14. Combinación de tablas
Explicamos brevemente cómo crear un índice:
(1)CREATE INDEX I_DEPT_NAME ON DEPARTMENTS(DEPARTMENT_NAME)
(2)CREATE UNIQUE INDEX UI_DEPARTMENT_NAME ON
DEPARTMENTS(DEPARTMENT_NAME)
(3)DROP INDEX I_DEPT_NAME
El caso (1), permite que en esa columna haya repetidos
El caso (2) no permite repetidos, podría usarse como índice de una clave
primaria
El caso (3) es para eliminar un índice.
Si el índice se está usando junto con una PK, primero habrá que eliminar la PK y luego el
índice.
74
Departamento de Informática - Carmen Soler
75. 14. Combinación de tablas
Inner Join
Poniendo condiciones en el WHERE
SELECT tCoches.matricula, tMarcas.marca, tCoches.modelo,
tCoches.color, tCoches.numero_kilometros, tCoches.num_plazas
FROM tCoches, tMarcas
WHERE tCoches.marca = tMarcas.codigo
Utilizando INNER JOIN
SELECT tCoches.matricula, tMarcas.marca, tCoches.modelo,
tCoches.color, tCoches.numero_kilometros, tCoches.num_plazas
FROM tCoches
INNER JOIN tMarcas ON tCoches.marca = tMarcas.codigo
75
Departamento de Informática - Carmen Soler
76. 14. Combinación de tablas
En la diapo 42, vemos que, en el listado de resultados que aparecerá sólo
veremos aquellas marcas que tengan asignadas algún coche. Las marcas 2, 4
y 5 no aparecerán en el listado.
Si quiero ver cada coche y su marca y también quiero que aparezcan en el
listado las marcas que no tienen coche, con lo que sabemos hasta ahora no
es posible hacerlo.
Una posible solución que veremos ahora será el left y el right join.
76
Departamento de Informática - Carmen Soler
77. 14. Combinación de tablas
Left Join
SELECT tCoches.matricula, tMarcas.marca, tCoches.modelo,
tCoches.color, tCoches.numero_kilometros, tCoches.num_plazas
FROM tCoches
LEFT JOIN tMarcas ON tCoches.marca = tMarcas.codigo
77
Departamento de Informática - Carmen Soler
78. 14. Combinación de tablas
Right Join
SELECT tCoches.matricula, tMarcas.marca, tCoches.modelo,
tCoches.color, tCoches.numero_kilometros, tCoches.num_plazas
FROM tCoches
RIGHT JOIN tMarcas ON tCoches.marca = tMarcas.codigo
78
Departamento de Informática - Carmen Soler
79. 14. Combinación de tablas
Sobre la base de datos del ejercicio 4, haz estas consultas:
1. Obtén un listado en el que aparezca en nombre y ciudad del comercio y el nombre y
versión de los programas que ha distribuido. Si un comercio no ha distribuido ningún
programa también tiene que aparecer.
2. Sacar un listado con el nombre de los clientes y los medios que han utilizado para registrar
programas. Si un cliente no ha hecho nunca un registro también tiene que aparecer. Que
no aparezcan repetidos.
3. Obtén una lista de los programas que ha desarrollado cada fabricante. Si un fabricante no
ha desarrollado ningún programa también tiene que aparecer.
4. Obtén una lista de todos los programas que no se hayan registrado.
79
Departamento de Informática - Carmen Soler
80. UD2.4. Varios
1. UNION, INTERSECT
2. Crear una tabla a partir de una consulta
3. Creación y uso de vistas
4. Inserción utilizando select
5. Actualización utilizando select
6. Borrado utilizando select
80
Departamento de Informática - Carmen Soler
81. 1. Union, intersect
Ejemplo de UNION
Tenemos dos tablas: ALUMNOS y NUEVOS que tienen la misma estructura y queremos
juntarlas:
SELECT NOMBRE FROM ALUMNOS UNION
SELECT NOMBRE FROM NUEVOS;
El UNION combina el resultado de las dos consultas. Si hay filas duplicadas, las reduce a
una. UNION ALL no compacta, mantiene todos los resultados aunque hayan repetidos.
SELECT NOMBRE FROM ALUMNOS UNION ALL
SELECT NOMBRE FROM NUEVOS;
81
Departamento de Informática - Carmen Soler
82. 1. Union, intersect
Ejemplo de INTERSECT
Tenemos dos tablas: ALUMNOS y ANTIGUOS que tienen la misma estructura y queremos
ver las tuplas comunes:
SELECT NOMBRE FROM ALUMNOS INTERSECT
SELECT NOMBRE FROM ANTIGUOS;
El INTERSECT es equivalente a esto:
SELECT NOMBRE FROM ALUMNOS WHERE NOMBRE IN
(SELECT NOMBRE FROM ANTIGUOS);
82
Departamento de Informática - Carmen Soler
83. 2. Crear una tabla a partir de una consulta
Ejemplos
CREATE TABLE EJEMPLO_COPY AS SELECT * FROM EJEMPLO;
CREATE TABLE EJEMPLO_COPY(COL1, COL2, COL3, COL4) AS
SELECT * FROM EJEMPLO;
CREATE TABLE EMPLEYDEPART AS SELECT E.APELLIDO,
D.NOMBRE FROM EMPLE E, DEPART D WHERE
E.DEPT_NO=D.DEPT_NO
83
Departamento de Informática - Carmen Soler
84. 3. Creación y uso de vistas
Para obtener datos, a veces hay que hacer
consultas complejas:
Podemos crear vistas que contengan el resultado de
esta consulta.
Así en lugar de hacer la consulta compleja, siempre
tenemos el resultado en esa vista.
La vista es una tabla lógica, no tiene información en sí
misma, sino que depende de lo que contienen otras
tablas (tablas base)
A las vistas se accede igual que lo haríamos a una tabla.
84
Departamento de Informática - Carmen Soler
85. 3. Creación y uso de vistas
Ejemplos
Mostrar apellidos y salario de los empleados del departamento 30:
CREATE VIEW DEP30 AS SELECT APELLIDO,SALARIO FROM
EMPLE WHERE DEPT_NO=30;
También puedo seleccionar las columnas que se mostrarán y cambiar su nombre:
CREATE VIEW DEP30 (APE, OFI, SAL) AS SELECT APELLIDO,
OFICIO, SALARIO FROM EMPLE WHERE DEPT_NO=30
85
Departamento de Informática - Carmen Soler
86. 3. Creación y uso de vistas
Si borro la tabla de la que depende la vista, cuando consultemos la vista, se
lanzará un error, pero la vista continuará existiendo
Para eliminar una vista:
DROP VIEW DEP30;
86
Departamento de Informática - Carmen Soler
87. 3. Creación y uso de vistas
Actualización/borrado de filas a través de una vista:
Para poder hacerlo, la vista se ha de crear:
Con las filas de una sola tabla
Sin usar GROUP BY ni DISTINCT
Sin utilizar funciones SQL
Insertar filas a través de una vista:
Se han de tener en cuenta las restricciones anteriores y además:
TODAS las columnas obligatorias de la tabla deben estar incluidas en la vista.
Sino será como si estuviéramos insertando un valor NULL para esa columna
y dará error.
87
Departamento de Informática - Carmen Soler
88. 4. Inserción utilizando Select
Hasta ahora podíamos insertar una tupla cada vez.
Combinándolo con un select, podemos añadir tantas filas como devuelva la
consulta:
Ejemplo:
INSERT INTO EMPLE30(EMP_NO, APELLIDO, OFICIO,
SALARIO, COMISION, DEPT_NO) (
SELECT EMP_NO, APELLIDO, OFICIO, SALARIO, COMISION,
DEPT_NO
FROM EMPLE
WHERE DEPT_NO = 30);
88
Departamento de Informática - Carmen Soler
89. 5. Actualización utilizando Select
Ejemplo:
UPDATE CENTROS SET (DIRECCION, NUMPLAZAS) =
(SELECT DIRECCION, NUMPLAZAS FROM CENTROS WHERE
COD_CENTRO=50)
WHERE COD_CENTRO=10;
89
Departamento de Informática - Carmen Soler
90. 6. Borrado utilizando Select
Ejemplo:
DELETE FROM DEPART WHERE DEPT_NO IN
(SELECT DEPT_NO FROM EMPLE GROUP BY DEPT_NO
HAVING COUNT(*)<4);
90
Departamento de Informática - Carmen Soler