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;