Tema 4 DML (Parte I) IES Francisco Romero Vargas Departamento de Informática Tema 4. DML (I). Página 1 de 9
1. Introducción Un Lenguaje de Manipulación de Datos (Data Manipulation Language, DML) es un lenguaje proporcionado por el sistema de gestión de base de datos que permite a los usuarios de la misma llevar a cabo las tareas de consulta o manipulación de los datos (inserción, borrado, actualización y consultas) basado en el modelo de datos adecuado. DML Funciones http://dev.mysql.com/doc/refman/5.7/en/sql-syntax-datamanipulation.html http://dev.mysql.com/doc/refman/5.7/en/functions.html Basándonos en la BD opera del tema anterior vamos a estudiar, mediante ejemplos, las siguientes sentencias DML: Objetivo Comando Aclaración Insertar INSERT Inserta uno o más registros en una tabla. información LOAD DATA INFILE Lee registros desde un fichero de texto y los copia en una tabla. REPLACE Inserta uno o más registros y/o modifica los existentes. Consultar datos SELECT Se usa para seleccionar registros de una o más tablas. Borrar DELETE Elimina uno o varios registros de una tabla. información TRUNCATE Elimina todos los resgistros de una tabla. Modificar información UPDATE Actualiza columnas de registros existentes en una tabla. 2. Inserción de datos en una tabla INSERT Inserta uno o más registros en una tabla. INSERT [INTO] mitabla [(columna1, [columna2,... ])] VALUES (valor1, [valor2,...]); Las cantidades de columnas y valores deben ser las mismas. Tema 4. DML (I). Página 2 de 9
Si una columna no se especifica, le será asignado el valor por omisión. Los valores especificados (o implícitos) por la sentencia INSERT deberán satisfacer todas las restricciones aplicables. Si ocurre un error de sintaxis o si alguna de las restricciones es violada, no se agrega la fila y se devuelve un error. INSERT INTO opera (nombre, fecha_estreno, lugar_estreno, autor_idautor, idioma) VALUES ('Don Pasquale', '1843-01- 03', 'Paris', 3, 'I'); Cuando se insertan todos los valores de una tabla, no es necesario poner los nombres de los campos (columnas). INSERT INTO opera VALUES (2, 'Tosca', Roma,'1900-01- 14', 'I', NULL, NULL, 2); Se pueden insertar varias filas (registros) a la vez con una única sentencia. LOAD DATA INFILE INSERT INTO opera VALUES (12, 'Macbeth', Florencia, '1847-03-14', 'I', 'Basada en la tragedia homónima de William Shakespeare', NULL, 1), (13, 'Fidelio', Viena, '1805-11-20', 'A', NULL, NULL, 6); Inserta registros en una tabla desde un fichero de texto. LOAD DATA INFILE 'data.txt' INTO TABLE mitabla; LOAD DATA INFILE 'opera.txt' INTO TABLE opera LINES TERMINATED BY '\n\r'; Cuando el archivo no contiene datos de todas las columnas o no siguen el orden original: LOAD DATA INFILE 'autor.txt' INTO TABLE autor (idautor,fecha_nacimiento,lugar_nacimiento,fecha_defunci on_lugar_defuncion); Tema 4. DML (I). Página 3 de 9
REPLACE Funciona como INSERT, pero si la clave primaria del registro que se inserta ya se encuentra en la tabla, entonces REEMPLAZA el registro de la tabla por el nuevo registro. REPLACE INTO opera (idopera,nombre) VALUES (13,'Fidelio'),(14,'Norma'); 3. Modificación de datos de una tabla UPDATE Actualiza columnas en registros existentes de una tabla. UPDATE [LOW_PRIORITY] [IGNORE] mitabla SET columna1=expr1 [, columna2=expr2...] [WHERE condicion] [ORDER BY...] [LIMIT numero_de_filas_afectadas] La cláusula SET indica qué columna modificar y los valores que puede recibir. La cláusula WHERE, si se da, especifica qué registros deben actualizarse. De otro modo, se actualizan todos los registros. Si la cláusula ORDER BY se especifica, los registros se actualizan en el orden que se especifica. La cláusula LIMIT es el límite de registros a actualizar. UPDATE opera SET autor_idautor=6 where nombre='fidelio'; 4. Borrado de filas de una tabla DELETE Borra registros de una tabla. DELETE FROM mitabla WHERE columna1 = valor1 DELETE FROM opera WHERE nombre LIKE '%Norma%'; Tema 4. DML (I). Página 4 de 9
TRUNCATE Vacía una tabla completamente. TRUNCATE TABLE mitabla Lógicamente, esto es equivalente a un comando DELETE que borre todos los registros, pero hay diferencias prácticas bajo ciertas circunstancias. Cuidado! Cuando existen claves foráneas no es posible realizar este comando salvo que se deshabiliten en el sistema las claves foráneas previamente. SET FOREIGN_KEY_CHECKS=0; TRUNCATE TABLE autor; SET FOREIGN_KEY_CHECKS=1; 5. Consulta de datos de una tabla SELECT Devuelve información de los datos contenidos en una tabla. SELECT [ALL DISTINCT ] select_expr,... [INTO OUTFILE 'file_name' export_options INTO DUMPFILE 'file_name'] [FROM table_references [WHERE where_definition] [GROUP BY {col_name expr position} [ASC DESC],... ] [HAVING where_definition] [ORDER BY {col_name expr position} [ASC DESC],...] [LIMIT {[offset,] row_count row_count OFFSET offset}] Es importante conocer el orden de las cláusulas: SELECT FROM WHERE GROUP BY HAVING ORDER LIMIT Tema 4. DML (I). Página 5 de 9
SELECT 1+1; (devuelve 2). Permite seleccionar una o varias columnas: SELECT idopera,nombre FROM opera; A las columnas se les puede poner alias: SELECT idopera, nombre AS titulo FROM opera; Se pueden ordenar los registros seleccionados: SELECT nombre, autor_idautor FROM opera ORDER BY autor_idautor,nombre; También se pueden agrupar registros. En este caso se contarán todos los registros por cada autor diferente: SELECT autor_idautor, COUNT(nombre) AS operas FROM opera GROUP BY autor_idautor ORDER BY operas DESC; Se pueden seleccionar solo los registros que cumplan una condición: SELECT nombre FROM opera WHERE autor_idautor=1; HAVING permite poner condiciones, como WHERE, pero estas condiciones se aplican después del ORDER BY y GROUP BY. Además, HAVING puede llevar funciones de agregación (max, min, count, avg...), mientras que WHERE no puede. SELECT autor_idautor, COUNT(nombre) FROM opera GROUP BY autor_idautor HAVING COUNT(nombre)>=2; Es posible enviar la consulta a un fichero de texto: SELECT nombre,fecha_estreno,lugar_estreno FROM opera INTO OUTFILE 'opera.txt'; Funciones de Agrupación Tema 4. DML (I). Página 6 de 9
Permiten obtener datos de una consulta con GROUP BY. AVG. Retorna el valor medio de la expresión. SELECT ciudad, AVG(aforo) FROM teatro GROUP BY ciudad; COUNT. Retorna el contador del número de valores no NULL en los registros recibidos por un comando SELECT. SELECT COUNT(distinct autor_idautor) FROM opera; SELECT COUNT(*) FROM opera; MIN, MAX. Retornas los valores máximos y mínimos. SELECT MAX(fecha_estreno) FROM opera; SUM. Retorna la suma de la expresión. SELECT SUM(espectadores) FROM representa WHERE opera_idopera=1; Subconsultas Corresponden a un comando SELECT dentro de otro comando. Ejemplo: SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2); Una subconsulta puede retornar un valor único, un registro, una columna o una tabla (uno o más registros de una o más columnas). En su forma más sencilla, una subconsulta es una subconsulta escalar que retorna un único valor. SELECT nombre FROM autor WHERE idautor = (SELECT autor_idautor FROM opera WHERE nombre = 'Aida'); Tema 4. DML (I). Página 7 de 9
La palabra clave ANY, que debe seguir a un operador de comparación, significa return TRUE si lacomparación es TRUE para cualquiera de los valores en la columna que retorna la subconsulta. SELECT nombre FROM opera WHERE autor_idautor = ANY (SELECT idautor FROM autor WHERE nombre LIKE '%Beethoven%' OR nombre LIKE '%Verdi%'); La palabra IN es un alias para = ANY. SELECT nombre FROM opera WHERE autor_idautor NOT IN (SELECT idautor FROM autor WHERE nombre LIKE '%Verdi%'); La palabra ALL, que debe seguir a un operador de comparación, significa return TRUE si la comparación es TRUE para todos los valores en la columna que retorna la subconsulta. Ejemplos de Funciones A continuación se presentan algunos ejemplos de uso de diferentes funciones MySQL: - Con operadores de comparación SELECT * FROM opera WHERE autor_idautor IS NULL; SELECT nombre, fecha_nacimiento FROM autor WHERE fecha_nacimiento BETWEEN '1800-01-01' AND '1900-12-31'; - De control de flujo - De cadenas SELECT nombre, CASE idioma WHEN 'I' THEN 'Italiano' WHEN 'A' THEN 'Alemán' WHEN 'F' THEN 'Francés' ELSE 'Desconocido' END AS 'Idioma' FROM opera; SELECT nombre, if(idioma='i','',idioma) as 'Idioma' from opera; Tema 4. DML (I). Página 8 de 9
SELECT CONCAT('My', 'S', 'QL'); SELECT UPPER(nombre) FROM opera; SELECT LTRIM(' los espacios del principio'); Quítame SELECT nombre FROM opera WHERE LOCATE('Violeta',sinopsis)!= 0; - De fecha y hora - Numéricas SELECT IF(STRCMP('a','a')=0,'Son iguales','no lo son'); SELECT CURDATE();// CURRENT_DATE(), NOW(), SELECT nombre, DATEDIFF(fecha_defuncion,fecha_nacimiento) AS 'Dias vividos' FROM autor; SELECT nombre, YEAR(fecha_defuncion) - YEAR(fecha_nacimiento) - ( RIGHT(fecha_defuncion,5) > RIGHT(fecha_nacimiento,5) ) as 'Murio con (años)' FROM autor WHERE fecha_nacimiento IS NOT NULL AND fecha_defuncion IS NOT NULL ORDER BY 2 DESC; SELECT nombre, DAYNAME(fecha_nacimiento), DATE_FORMAT(fecha_nacimiento,'%e de %M de %Y') FROM autor; SELECT SEC_TO_TIME(2378); SELECT PI(); SELECT SQRT(4); SELECT 5*4 MOD 2; SELECT nombre FROM opera ORDER BY RAND() LIMIT 1; Tema 4. DML (I). Página 9 de 9