499,7k - Mestre a casa

Anuncio
SQL - DDL y consultas de actualización
José Muñoz Jimeno
Febrero 2015
Control de cambios
Versión
Fecha
Comentarios
1.0
13/02/2015 Primera versión para el curso “Introducción a las bases de
datos con MySQL” en el COITCV
La última versión de este documento puede descargarse en
http://mestreacasa.gva.es/web/munoz_jos24/cursos
Introducción
Hasta ahora → Consultar datos: SELECT
Ahora veremos:
DDL – Data Definition Language
 Definir estructuras de datos: tablas, vistas, índices...
 Consultas de actualización
 Modificar el contenido de las tablas
 3 posibilidades
 INSERT: insertar nuevos registros
 UPDATE: modificar contenido registros existentes
 DELETE: borrar registros

Índice
DDL – Lenguaje de Definición de Datos
CREATE
 DROP
 ALTER

ÍNDICES
Consultas de actualización
INSERT
 UPDATE
 DELETE

Introdución
Hasta ahora → Consultar datos: SELECT
Ahora veremos:
DDL – Data Definition Language
 Definir estructuras de datos: tablas, vistas, índices...
 Crearlas
 Modificarlas
 Eliminarlas
 Consultas de actualización
 Modificar el contenido de las tablas
 Insertar nuevos registros
 Modificar contenido registros existentes
 Borrar registros

DDL – Data Definition Language
Crear y modificar estructuras de datos (tablas, índices...)
3 sentencias
CREATE: crear un objeto nuevo
 ALTER: modifica un objeto existente
 DROP: borra un objeto existente

Nos centraremos en tablas
Al crear definiremos los campos, tipos de datos, restricciones
DDL – Data Definition Language
CREATE TABLE
CREATE TABLE [IF NOT EXISTS] tabla
(campo1 tipo [(tamaño)] [restricción11] [restricción12][...]
[,campo2 tipo [(tamaño)] [restricción21] [restricción22][...]
[, ...]]
[, restricciónmultiple1 [, ...]] );
http://dev.mysql.com/doc/refman/5.6/en/create-table.html
IF NOT EXISTS → evita borrado de tabla con ese nombre
Cada campo daremos nombre y tipo → texto o numérico
podemos dar opcionalmente el tamaño
Opcionalmente restricciones
DDL – Data Definition Language
CREATE TABLE – Tipos datos
Tipos datos:
http://dev.mysql.com/doc/refman/5.6/en/data-types.html
Numéricas
INTEGER / INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT
[UNSIGNED] – Enteros de distintos tamaños
DECIMAL(x,y), NUMERIC(x,y) – Decimal exacto.
Ej: DECIMAL(5,2) soportaría -999.99 a 999.99.
FLOAT(x,y), DOUBLE(x,y) – Punto flotante
BOOL, BOOLEAN
BIT(x) → Numero binario de x posiciones
DDL – Data Definition Language
CREATE TABLE – Tipos datos
Texto
CHAR(x) – Long fija, hasta 255 caracteres
VARCHAR(x) – Long variable, hasta 65535 caracteres
TEXT, TINYTEXT, MEDIUMTEXT, LONGTEXT – Cadenas
alfanuméricas “case insensitive” de distintos tamaños
TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB → campos
binarios para cualquier tipo de datos
ENUM(lista) → lista de valores
Ej: ENUM('x-small', 'small', 'medium', 'large', 'x-large')
Fecha y hora
DATE → formato 'YYYY-MM-DD'
DATETIME / TIMESTAMP → formato 'YYYY-MM-DD
HH:MM:SS'
DDL – Data Definition Language
CREATE TABLE - Ejemplos
Crear nueva tabla Empleat1 con 2 campos: nom de tipo texto
de hasta 25 caracteres y cognoms de hasta 50
CREATE TABLE Empleat1 (
nom VARCHAR(25) ,
cognoms VARCHAR(50));
Crear una tabla llamada Empleat2 con los campos anteriores
y añadiendo: dni tipo texto de 10 caracteres,
data_naixement de tipo Fecha; otro llamado sou de tipo
entero y un último llamado departament de tipo byte.
CREATE TABLE EMPLEAT2
( dni VARCHAR(10) , nom VARCHAR(25) , cognoms
VARCHAR(50), data_naixement DATE , sou INT ,
departament TINYINT UNSIGNED );
DDL – Data Definition Language
CREATE TABLE - Restricciones - CONSTRAINT
Definir restricciones de usuario en una tabla: clave principal,
claves externas, campos no nulos y campos únicos
2 tipos:
Campo único: afectan sólo a un campo → en definición del
campo
 Campo múltiple: afectan a varios campos → definidas
separadamente de los campos

DDL – Data Definition Language
CREATE TABLE - Restricciones de campo único
CREATE TABLE [IF NOT EXISTS] tabla
(campo1 tipo [{PRIMARY KEY | UNIQUE | NOT NULL}])
Después del tipo de campo y antes de la coma separadora
de campos
DDL – Data Definition Language
CREATE TABLE - Restricciones de campo único
PRIMARY KEY → el campo es la clave principal
UNIQUE → no podrá darse 2 veces mismo valor
NOT NULL → campo no podrá tomar valor nulo
CREATE TABLE EMPLEAT2
(dni VARCHAR(10) PRIMARY KEY,
nom VARCHAR(25) ,
cognoms VARCHAR(50) UNIQUE,
data_naixement DATE ,
sou INT NOT NULL ,
departament TINYINT UNSIGNED )
DDL – Data Definition Language
CREATE TABLE - Restricciones de campo múltiple
CREATE TABLE [IF NOT EXISTS] tabla
(campo1 tipo [(tamaño)] [restricción11] [restricción12][...]
[,campo2 tipo [(tamaño)] [restricción21] [restricción22][...]
[, ...]]
[CONSTRAINT nom] {PRIMARY KEY | UNIQUE} (c11 [,c12]
[,...]);
Son restricciones de tabla
Van a continuación de los campos
Pueden afectar a uno o más campos
DDL – Data Definition Language
CREATE TABLE - Restricciones de campo múltiple
PRIMARY KEY → el campo o campos son la clave principal
CREATE TABLE EMPLEAT2
(dni VARCHAR(10),
nom VARCHAR(25) ,
cognoms VARCHAR(50),
data_naixement DATE ,
sou INT ,
departament TINYINT,
CONSTRAINT cp_emp2 PRIMARY KEY (dni) );
Si la clave principal la forma más de un campo.
CREATE TABLE FAMILIAR2 (...
CONSTRAINT cp_fam2 PRIMARY KEY (dni,nom) )
DDL – Data Definition Language
CREATE TABLE - Restricciones de campo múltiple
UNIQUE → no podrá darse 2 veces mismo valor, pero ahora
puede ser en un conjunto de campos
CREATE TABLE EMPLEAT2
(dni VARCHAR(10),
nom VARCHAR(25) ,
cognoms VARCHAR(50),
data_naixement DATE ,
sou INT ,
departament TINYINT,
CONSTRAINT u_nom UNIQUE (cognoms,nom) );
DDL – Data Definition Language
CREATE TABLE - Restricciones de campo múltiple
FOREIGN KEY → definir campo como clave externa
[CONSTRAINT nombre] FOREIGN KEY (c11 [,c12][,...])
REFERENCES tabla2 (c21 [,c22][,...]) [{ON DELETE | ON
UPDATE} { RESTRICT | CASCADE | SET NULL | NO ACTION}]
CREATE TABLE EMPLEAT2(
dni VARCHAR( 10 ) ,
Exactamente mismo tipo
nom VARCHAR( 25 ) ,
cognoms VARCHAR( 50 ) ,
data_naixement DATE,
sou INT,
departament TINYINT UNSIGNED,
CONSTRAINT ce_emp2_dep FOREIGN KEY ( departament )
REFERENCES Departament( Num_d ))

DDL – Data Definition Language
CREATE TABLE - Restricciones de campo múltiple
ON DELETE | ON UPDATE
 RESTRICT → impide el borrado/actualización del registro en
la tabla “padre”. Opción por defecto
 CASCADE → hacer lo mismo en los registros relacionados
 SET NULL → poner registros relacionados a NULL
 NO ACTION → sinónimo de RESTRICT
DDL – Data Definition Language
ALTER TABLE
ALTER TABLE tabla
{ADD | DROP } {COLUMN campo | PRIMARY KEY |
FOREIGN KEY nombre … | INDEX nombre}
http://dev.mysql.com/doc/refman/5.6/en/alter-table.html
Modificar la estructura de una tabla añadiendo o quitando:
Campos
 Restricciones

La sintaxis para campos y restricciones ya la hemos visto
DDL – Data Definition Language
ALTER TABLE - Ejemplos
Ejemplos sobre EMPLEAT2 sin restricciones
Añadir campo supervisor de 10 caracteres
ALTER TABLE EMPLEAT2
ADD COLUMN supervisor VARCHAR(10);
Añadir la clave externa reflexiva supervisor sobre dni
Nota: para poder crear esta clave externa antes hemos de crear un índice sobre dni
ALTER TABLE EMPLEAT2
ADD CONSTRAINT ce_emp2_emp2 FOREIGN KEY
(supervisor) REFERENCES EMPLEAT2(dni);
DDL – Data Definition Language
ALTER TABLE - Ejemplos
Eliminar la restricción de clave externa que acabamos de
crear en EMPLEAT2 → Necesitamos que tenga nombre!!
ALTER TABLE EMPLEAT2
DROP FOREIGN KEY ce_emp2_emp2
Eliminar el campo supervisor
ALTER TABLE EMPLEAT2
DROP COLUMN supervisor;
DDL – Data Definition Language
ALTER TABLE - Ejemplos
Modificar EMPLEAT2 y añadir CP de 5 caracteres
ALTER TABLE EMPLEAT2 ADD COLUMN cp CHAR(5);
Modificar EMPLEAT2 y añadir población de hasta 25 caracteres y
que no puede ser nulo
ALTER TABLE EMPLEAT2 ADD COLUMN poblacion VARCHAR(25)
NOT NULL;
Modificar EMPLEAT2 y añadir restricción (un poco rara) que no se
puede repetir cp y población
ALTER TABLE EMPLEAT2 ADD CONSTRAINT u_cp_pobl UNIQUE
(cp,poblacion);
Las restricciones de
UNIQUE las considera index
Borrar la restricción anterior

ALTER TABLE EMPLEAT2 DROP INDEX u_cp_pobl;
DDL – Data Definition Language
DROP TABLE
DROP TABLE tabla;
Eliminar la tabla (datos y estructura)
Ejemplo:
DROP TABLE EMPLEAT2;
DDL – Data Definition Language
Índices
Estructuras de datos para ordenar una tabla por un campo
(ascendente o descendente)
Reduce tiempo de ordenado o búsqueda (binarias o
dicotómicas)
Aumenta actualizaciones (inserción, modificación o borrado)
→ se ha de reestructurar el índice
Ocupa espacio → es una estructura de datos adicional
En resumen, con índices
SELECT → más rápidos
 INSERT, UPDATE y DELETE → más lentos

DDL – Data Definition Language
Índices
CREATE [UNIQUE] INDEX nombre
ON tabla (c1 [ASC|DESC][, c2 [ASC|DESC], …])
http://dev.mysql.com/doc/refman/5.6/en/create-index.html
Al crear el índice se puede aplicar la restricción

UNIQUE → no se podrán repetir valores en los campos que lo
forman
Al aplicar ciertas restricciones al crear la tabla se crean
índices automáticamente:
PRIMARY KEY
 UNIQUE

En MySQL para crear una clave externa, el campo
referenciado en la tabla “padre” debe tener un índice
DDL – Data Definition Language
Índices - Ejemplos
Crear un índice en la tabla EMPLEAT2 para el campo
departament en orden ascendente
CREATE INDEX i_dep ON EMPLEAT2 (departament);
Crear índice para el campo poblacio (descendente) y cp
(ascendente)
CREATE INDEX i_pob_cp ON EMPLEAT2 (poblacio DESC,
cp);
Crear un índice que no permita valores repetidos
conjuntamente en cognoms y nom.
CREATE UNIQUE INDEX i_cog_nom ON EMPLEAT2
(cognoms,nom);
DDL – Data Definition Language
Índices
Borrar un índice
DROP INDEX nombre ON tabla;
Ejemplo: borrar índice i_cog_nom del último ejemplo.
DROP INDEX i_cog_nom on EMPLEAT2;
Consultas de actualización
Hasta ahora:
Select → consultar información existente
 DDL → crear, modificar o borrar estructuras de datos

Consultas de actualización → modificar contenido de tablas
INSERT → introducir nuevas filas
 DELETE → borrar filas enteras
 UPDATE → modificar el contenido de filas existentes

Consultas de actualización
INSERT
Para introducir nuevas filas en la tabla
2 sintaxis
Inserción individual
 Inserción masiva

Inserción individual
INSERT INTO tabla [ (camp1 [,camp2 [,...]]) ]
VALUES (valor1 [,valor2 [,...]]);
Si damos valor a todos los campos no hace falta nombrarlos –
deben estar en mismo orden que en la tabla
 Si queremos dejar uno vacío debemos darle NULL
 Podemos decir qué campos rellenamos en el orden que
queramos

Consultas de actualización
INSERT - Ejemplos
Introducir en Departament estos datos: Número: 6; Nom:
Personal; Director: 18922222 i Data: 01/05/99.
INSERT INTO Departament
VALUES (6,'Personal','18922222','1999-05-01');
Introducir un departamento nuevo: Número: 7; Nom: Vendes;
Director: 18876543.
INSERT INTO Departament (num_d,director,nom_d)
VALUES (7,'18876543','Vendes');
INSERT INTO Departament
VALUES (7,'Vendes','18876543',NULL);
Consultas de actualización
INSERT
Inserción masiva
INSERT INTO tabla [ (campo1 [,campo2 [,...]]) ]
SELECT ...
Insertamos dentro de una tabla el resultado de un SELECT
Tiene que devolver mismo número de campos y tipo
Ejemplos. Vamos a crear una tabla Empleat3 con la misma
estructura que Empleat
Seleccionamos la tabla
 Menú operaciones
 Copiar la tabla a (base de datos).tabla

Consultas de actualización
INSERT - Ejemplos
Nota: antes de hacer cada ejemplo hay que vaciar Empleat3
Rellenar Empleat3 con todos los datos de Empleat
INSERT INTO Empleat3
SELECT * FROM Empleat;
Rellenar Empleat3 con los empleados de los departamentos
1y3
INSERT INTO Empleat3
SELECT * FROM Empleat
WHERE departament IN (1,3);
Consultas de actualización
INSERT - Ejemplos
Rellenar Empleat3 con los empleados que tienen más de 1
familiar
INSERT INTO Empleat3
SELECT * FROM Empleat
WHERE dni IN (SELECT dni
FROM Familiar
GROUP BY dni
HAVING COUNT(*) > 1);
Consultas de actualización
DELETE
DELETE FROM tabla
[WHERE condición]
Borrar filas enteras de una tabla
Si no ponemos WHERE borrará todas las filas, pero no la
estructura
Dada la peligrosidad conviene
Ejecutarla antes cambiando DELETE por SELECT *
 Hacer copia de seguridad de la tabla o BD

Ejemplos: hacer previamente copia con datos de Empleat
como Empleat3
Consultas de actualización
DELETE - Ejemplos
Borrar de Empleat3 los empleados del departamento 5
DELETE FROM Empleat3 WHERE departament =5;
Borrar de Empleat3 los empleados nacidos después del 1
enero de 1960
DELETE FROM Empleat3 WHERE Data_n > '1960-1-1';
Borrar todas las filas de Empleat3
DELETE FROM Empleat3;
Consultas de actualización
UPDATE
UPDATE tabla
SET campo1=valor1 [ ,campo2=valor2 [,...] ]
[ WHERE condición];
Cambiar campos concretos de una fila de una tabla
Para borrar un campo lo pondremos a NULL
OJO: si no ponemos WHERE se modificarán todas las filas
Mismas precauciones que tomamos con DELETE
Ejemplos: partimos de Empleat3 con los mismos datos que
Empleat
Consultas de actualización
UPDATE - Ejemplos
Borrar todos los cp de Empleat3
UPDATE Empleat3 SET cp=NULL;
Aumentar un 5% el sueldo de los empleados del
departamento 5 en Empleat3
UPDATE Empleat3 SET sou = sou * 1.05
WHERE departament =5;
Cambiar la población a Ares y el código postal a 12165 al
empleado con DNI 18876543
UPDATE Empleat3 SET cp=12165, població='Ares'
WHERE dni=18876543;
Descargar