Página 1 de 33 ENUM SELECCIONA UN SOLO VALOR NOT NULL CAMPO OBLIGATORIO PRIMARY KEY CAMPO A RELACIONAR UNSIGNED SOLO VALOR POSITIVO AUTO_INCREMENTE UNIQUE = NO SE PUEDE REPETIR VALORES, SE PUEDE USAR EN VARIAS COLUMNAS PERO NO SE PUEDE RELACIONAR CON OTRAS TABLAS DESCRIBE NOMBRE DE TABLA O DESC ALTER TABLE NOMB. DE TABLA ADD COLUMN – CHANGE CAMBIAR EL NOM. DE UN CAMPO POR OTRO FIRST AGREGAR UN CAMPO EN PRIMER LUGAR AFTER AGREGAR UN CAMPO DESPUES DE OTRO MODIFY SE MODIFICA EL TIPO DE DATO DE UN CAMPO DROP PARA BORRAR CAMPOS RENAME PARA RENOMBRAR UNA TABLA INSERT PARA INSERTAR DATOS EN UNA TABLA INSERT INTO N.T. VALUES (‘’); INSERT INTO N.T. SET CAMPO = VALOR, CAMP. = VALOR…; INSERT INTO N.T. (‘VALUES’) INGRESAR LOS DATOS SEGÚN EL ORDEN DE LOS CAMPOS SELECT * FROM N.T. MUESTRA TODOS LOS DATOS DELETE FROM N. CAMPO WHERE N. CAMPO = …; ALTER TABLE N. TABLA ADD PRIMARY KEY (CAMPO); MODULO 2 IMPORTAR TABLAS DESDE UN ARCHIVO CSV O JSON BOTON DERECHO SOBRE EL N. DE LA B.DATOS IMPORTAR TABLAS DESDE UN SCRIPT SQL DESDE LA OPCION FILE DE SQL CONSULTAS DE TABLAS Página 2 de 33 LAS 5 CLAUSULAS DE LA SENTENCIA SELECT EN ESTE ORDEN FROM – WHERE – GROUP BY – HAVING – ORDER BY SELECT N. CAMPO, CAMPO … FROM N. TABLA; SELECT *, N.CAMPO * 1.25 AS ‘PRECIO CON AUMENTO’ FROM N. TABLA; SE AGREGA UNA NUEVA COLUMNA SOLO EN MEMORIA SE LLAMA CAMPO CALCULADO SELECT *, ‘CHINA’ AS ORIGEN FROM N. TABLA; ORDER BY = PARA ORDENAR POR UNA O MAS COLUMNAS EN FORMA ASC O DESC CON PRIORIDAD DEL PRIMER CAMPO LIMIT CANTIDAD DE REGISTRO A MOSTRAR SELECT N. CAMPO, CAMPO … FROM N. TABLA LIMIT 2; LO MISMO PARA LA SENTENCIA DELETE OFFSET A PARTIR DEL PROXIMO REGISTRO (POSICION) ALIAS PERMITE CAMBIAR EL NOMBRE DE UN CAMPO EN EL RESULTADO DE UNA CONSULTA EJEMPLO SELECT N. CAMPO AS NOMBRE A MOSTRAR FORM N. TABLA; LITERALES = CADENAS ALFANUMERICAS, TAL COMO SE ESCRIBE EN LA INSTRUCCIÓN SELECT SE MUESTRAN EN EL RESULTADO DE UNA CONSULTA OPERADORES OPERADORES DE COMPARACION <, >, =, >=, <=,<> <=> EL OPERADOR <=> FUNCIONA IGUAL QUE EL OPERADOR =. SALVO QUE, SI EN LA COMPARACIÓN UNA O AMBAS DE LAS EXPRESIONES ES NULA, EL RESULTADO NO ES NULL. SI SE COMPARAN DOS EXPRESIONES NULAS, EL RESULTADO ES VERDADERO Página 3 de 33 SELECT * FROM N.T. WHERE N.CAMPO < VALOR; AND = CUMPLIR TODAS LAS CONDICIONES OR = O UNA O LA OTRA NOT = NINGUNA DEVUELVEN VALORES LOGICOS, VERDADEROS O FALSOS, 1 O 0 SI UNO O 2 VALORES SON NULL DEVUELVE NULL OPERADOR BETWEEN - PARA ESPECIFICAR RANGO DE VALORES SELECT * FROM N.T. WHERE N.CAMPO BETWEEN VALOR-MENOS AND VALOR MAYOR (INCLUSIVE ESTOS VALORES); OPERADOR IN – INCLUYE TODOS LOS REGISTROS QUE TENGAN ANLGUNOS DE LOS VALORES ESPECIFICADOS SELECT * FROM N.T. WHERE CIUDAD IN (‘VALOR1’, ‘VALOR2’, ‘VALOR..’); NOT IN QUE NO INCLUYA OPERADOR LIKE Y NOT LIKE CON COMODINES LOS COMODINES PERMITEN REEMPLAZAR CARACTERES EN LA CONDICION ESPECIFICADA EN LA CLAUSULA WHERE LOS COMODINES SON % REMMPLAZA UNA SERIE DE CARACTERES INDEFINIDOS _ ESTE COMODIN REEMPLAZA UN CARACTER SELECT * FORM N. TABLA WHERE N. CAMPO LIKE ‘C%’; TODOS LOS REGISTROS QUE EMPIEZAN CON C ‘%VALOR%’ ‘%C’ ‘B_____’ CAMPO QUE COMIENZA CON LA LETRA B Y CONTENGA 5 CARACTERES (UN GUION POR CARÁCTER) SI DENTRO DE LA CADENA HAY QUE COLOCAR EL SIGNO % O EL GUION_ SE COLOCA ENTONCES DELANTE DE ELLOS LA BARRA INVERTIDA \ (ALT + 92) Página 4 de 33 OPERADORES IS NULL Y IS NOT NULL EL PRIMERO VACIO EL SEGUNDO TIENE ALGUN DATO MODULO 3 BACKUP PARA GENERAR UN BACKUP DE UNA BASE DE DATOS, BASTARÁ CON INGRESAR EN MYSQL WORKBENCH Y EJECUTAR EL COMANDO SERVER DATA EXPORT. SELECCIONAR LA BASE DE DATO A RESPALDAR. DENTRO DEL CUADRO EXPORT OPTIONS, PODRÁS ESCOGER ENTRE CREAR EN UNA CARPETA, VARIOS ARCHIVOS POR CADA TABLA CONTENIDA EN LA BASE DE DATOS; O CREAR UN ÚNICO ARCHIVO PARA TODA LA BASE DE DATOS EXPORT TO SELF-CONTAINED FILE. DEFINIDO EL NOMBRE Y LA UBICACIÓN PARA EL ARCHIVO DE RESPALDO O BACKUP, BASTARÁ CON PULSAR EL BOTÓN START EXPORT PARA INICIAR EL PROCESO. RESTAURAR UN BACKUP DADO QUE EL BACKUP SE GENERÓ EN UN ÚNICO ARCHIVO, SE DEBERÁ SELECCIONAR LA OPCIÓN IMPORT FROM SELF-CONTAINED FILE BASTARÁ CON PULSAR EL BOTÓN START IMPORT PARA INICIAR EL PROCESO DE RECUPERACIÓN DE LA BASE DE DATOS FUNCIONES INTEGRADAS DE TEXTO FUNCIÓN CONCAT() ESTA FUNCIÓN PERMITE CONCATENAR (UNIFICAR) CADENAS DE CARACTERES (VALORES DE CAMPO O VALORES CONSTANTES DE TEXTO) EN UNA SOLA COLUMNA. EJEMPLO: SELECT CONCAT('SR./A. ', NOMBRE, ' ', APELLIDO) AS 'NOMBRE COMPLETO' FROM CLIENTES; Página 5 de 33 EJEMPLO SELECT COD_CLIENTE, EMPRESA , CONCAT (DIRECCION, ‘ – ‘, CIUDAD) UBICACIÓN FROM CLIENTES; FUNCIÓN CONCAT_WS() ESTA FUNCIÓN PERMITE CONCATENAR (UNIFICAR) CADENAS DE CARACTERES EN UNA SOLA COLUMNA. A DIFERENCIA DE LA FUNCIÓN CONCAT, EN EL PRIMER ARGUMENTO DE ESTA FUNCIÓN SE DEBE ESPECIFICAR EL CARÁCTER A UTILIZAR PARA SEPARAR LAS CADENAS A CONCATENAR (WS: WITH SEPARATOR). FUNCIÓN UPPER() ESTA FUNCIÓN CONVIERTE A MAYÚSCULAS EL VALOR DE UN CAMPO. SELECT UPPER(NOMBRE) NOMBRES FROM CLIENTES; FUNCIÓN LOWER() ESTA FUNCIÓN CONVIERTE A MINÚSCULAS EL VALOR DE UN CAMPO SELECT LOWER(APELLIDO) FROM CLIENTES; FUNCIÓN LEFT() ESTA FUNCIÓN PERMITE OBTENER LOS PRIMEROS CARACTERES DE UNA CADENA. SELECT CONCAT(LEFT(NOMBRE, 1), '.') AS INICIAL_NOMBRE FROM CLIENTES; FUNCIÓN RIGHT() ESTA FUNCIÓN PERMITE OBTENER LOS ULTIMOS CARACTERES DE UNA CADENA SELECT RIGHT(CUIT, 1) AS 'DÍGITO VERIFICADOR' FROM CLIENTES; SELECT *, UPPER(CONCAT(LEFT(CARGO, 1), RIGHT(CARGO,1))) CODIGO FROM EMPLEADOS; Página 6 de 33 FUNCIÓN SUBSTRING() ESTA FUNCIÓN PERMITE EXTRAER, A PARTIR DE UNA DETERMINADA POSICIÓN, UNA DETERMINADA CANTIDAD DE CARACTERES. EL EJEMPLO DEBAJO, UTILIZA LA FUNCIÓN SUBSTRING PARA EXTRAER DEL CAMPO CUIT DE LA TABLA CLIENTES LA CADENA DE CARACTERES QUE IDENTIFICA AL NÚMERO DE DOCUMENTO (DNI): SELECT SUBSTRING(CUIT, 4, 8) AS 'DNI' FROM CLIENTES; FUNCIÓN CHAR_LENGTH() ESTA FUNCIÓN PERMITE CONTABILIZAR LA CANTIDAD DE CARACTERES QUE CONTIENE UNA CADENA, E INCLUYE LOS ESPACIOS EN BLANCO. EJEMPLO: SELECT DIRECCION, CHAR_LENGTH(DIRECCION) AS ‘CANTIDAD DE CARACTERES’ FROM CLIENTES; FUNCIÓN LOCATE() ESTA FUNCIÓN DEVUELVE LA PRIMERA POSICIÓN EN LA QUE APARECE UNA CADENA. SELECT DIRECCION, LOCATE('AS', DIRECCION) 'POSICIÓN' FROM CLIENTES WHERE DIRECCION LIKE ‘%AS%’; FUNCIÓN LTRIM() ESTA FUNCIÓN PERMITE QUITAR LOS ESPACIOS EN BLANCO INICIALES DE UNA CADENA. SELECT LTRIM(DIRECCION) DIRECCION_CORRECTA FROM CLIENTES; FUNCIÓN RTRIM() ESTA FUNCIÓN PERMITE QUITAR LOS ESPACIOS EN BLANCO FINALES Página 7 de 33 DE UNA CADENA. SELECT RTRIM(DIRECCION) DIRECCION_CORRECTA FROM CLIENTES; FUNCIÓN REPLACE() ESTA FUNCIÓN PERMITE BUSCAR Y REEMPLAZAR UNA CADENA DE CARACTERES POR OTRA. SELECT REPLACE(DIRECCION, 'AV.', 'AVENIDA') DIRECCION FROM CLIENTES; FUNCIONES INTEGRADAS DE FECHA FUNCIÓN YEAR() ESTA FUNCIÓN PERMITE OBTENER EL AÑO DE UN CAMPO DE TIPO FECHA SELECT YEAR(FECHA) AS 'AÑO' FROM FACTURAS; SELECT * FORM NOMB. TABLA WHERE YEAR(NOMB. DEL CAMPO) = VALOR; FUNCIÓN MONTH() ESTA FUNCIÓN PERMITE OBTENER EL MES, DE UN CAMPO DE TIPO FECHA. SELECT MONTH(FECHA) AS 'MES' FROM FACTURAS; FUNCIÓN DAY() ESTA FUNCIÓN PERMITE OBTENER EL DÍA DE UN CAMPO DE TIPO FECHA. SELECT DAY(FECHA) AS 'DIA' FROM FACTURAS; SELECT * FORM NOMB. TABLA WHERE DAY(NOMB. DEL CAMPO) = VALOR AND MONTH(FECHA EN NUMERO) = 4; Página 8 de 33 FUNCIÓN HOUR() ESTA FUNCIÓN PERMITE OBTENER LA HORA DE UN CAMPO DE TIPO FECHA/HORA (DATETIME). SELECT HOUR(FECHA) AS 'HORA' FROM FACTURAS; FUNCIÓN CURDATE() ESTA FUNCIÓN DEVUELVE LA FECHA ACTUAL (LA FECHA DEL SISTEMA OPERATIVO) EN UNA COLUMNA CON EL NOMBRE FECHA ACTUAL. SELECT CURDATE() AS 'FECHA ACTUAL'; Función DATEDIFF() Esta función permite calcular la cantidad de días transcurridos entre 2 fechas. SELECT DATEDIFF('2020-06-30','2020-01-01') as 'DIAS TRANSCURRIDOS'; SELECT *, DATEDIFF(CURDATE(), FECHAPEDIDO) AS ' DIAS TRANSCURRIDOS' FROM PEDIDOS_NEPTUNO; FUNCIÓN TIMESTAMPDIFF() ESTA FUNCIÓN PERMITE CALCULAR LA CANTIDAD DE MESES O AÑOS TRANSCURRIDOS ENTRE 2 FECHAS. SELECT TIMESTAMPDIFF(MONTH, '2020-01-01', '2020-06-30') AS 'MESES TRANSCURRIDOS'; SELECT TIMESTAMPDIFF(YEAR, FECHA_EMISION, CURDATE()) AS 'AÑOS TRANSCURRIDOS' FROM FACTURAS; FUNCIÓN DAYNAME() Página 9 de 33 DEVUELVE EL NOMBRE DEL DÍA DE LA SEMANA, DE LA FECHA ACTUAL EN ESTE CASO, EN UNA COLUMNA CON EL ALIAS NOMBRE DEL DÍA. SELECT * DAYNAME(CURDATE()) AS 'NOMBRE DEL DÍA'; SELECT DAYNAME(NOMBRE DEL CAMPO) AS 'NOMBRE DEL DÍA' FROM NOMB. TABLA; FUNCIÓN DAYOFWEEK() ESTA FUNCIÓN DEVUELVE EL ÍNDICE O NÚMERO DEL DÍA DE LA SEMANA DE UN VALOR DE UN CAMPO DE TIPO FECHA. SELECT DAYOFWEEK(CURDATE()) AS 'NÚMERO DEL DÍA DE LA SEMANA'; FUNCIÓN DAYOFYEAR() ESTA FUNCIÓN DEVUELVE EL ÍNDICE O NÚMERO DEL DÍA DEL AÑO DE UN VALOR DE UN CAMPO DE TIPO FECHA. SELECT DAYOFYEAR(CURDATE()) AS 'DÍA DEL AÑO'; FUNCIÓN MONTHNAME() ESTA FUNCIÓN DEVUELVE EL NOMBRE DEL MES DE UN VALOR DE UN CAMPO DE TIPO FECHA. SELECT MONTHNAME(CURDATE()) AS 'NOMBRE DEL MES'; FUNCIÓN ADDDATE() ESTA FUNCIÓN PERMITE SUMARLE AL VALOR DE UN CAMPO DE TIPO FECHA UNA DETERMINADA CANTIDAD DE DÍAS, MESES O AÑOS. Página 10 de 33 EN EL EJEMPLO SIGUIENTE, SE UTILIZA LA FUNCIÓN ADDDATE PARA QUE, DADA LA FECHA ACTUAL, SE PUEDE AGREGAR UN INTERVALO DE 2 MESES EN UNA COLUMNA CON EL NOMBRE VENCIMIENTO A 2 MESES, SELECT CURDATE() 'FECHA ACTUAL', ADDDATE(CURDATE(), INTERVAL 2 MONTH) 'VENCIMIENTO A 2 MESES', ADDDATE(CURDATE(), INTERVAL 90 DAY) 'VENCIMIENTO A 90 DÍAS', ADDDATE(CURDATE(), INTERVAL 2 YEAR) 'VENCIMIENTO A 2 AÑOS'; FUNCIONES MATEMATICAS INTEGRADAS FUNCIÓN ROUND() ESTA FUNCIÓN PERMITE REDONDEAR VALORES NUMÉRICOS SELECT ROUND(PRECIO/3, 2) FROM ARTICULOS; (EL 2 INDICA CANTIDAD DE DECIMALES, TIENE QUE SER UN NUMERO ENTERO) SELECT NOM. CAMPOS, ROUND(PRECIO*0.21, 2) IVA, ROUND(PRECIO*1.21, 2) ‘PRECIO FINAL’, FROM NOMB. DE LA TABLA; FUNCIÓN MOD() ESTA FUNCIÓN PERMITE MOSTRAR EL RESTO DE UNA DIVISION SELECT NOM. CAMPOS, ROUND(MOD(PRECIO, 2) , 2) ‘RESTO’, FROM NOMB. DE LA TABLA; FUNCIÓN POW() ESTA FUNCIÓN PERMITE ELEVAR A UNA POTENCIA UN VALOR NUMÉRICO. SELECT POW(2, 8); Página 11 de 33 FUNCIÓN CEIL() ESTA FUNCIÓN DEVUELVE EL VALOR ENTERO MAYOR AL ARGUMENTO ESPECIFICADO. EJEMPLO: MULTIPLICA EL VALOR DEL CAMPO PRECIO POR 1.27 Y OBTIENE EL VALOR ENTERO MAYOR EN UNA COLUMNA CON EL NOMBRE PRECIO REDONDEADO. SELECT PRECIO, PRECIO * 1.27 'PRECIO CON AUMENTO', CEIL(PRECIO * 1.27) 'PRECIO REDONDEADO Función FLOOR() ESTA FUNCIÓN DEVUELVE EL VALOR ENTERO MENOR AL ARGUMENTO ESPECIFICADO. SELECT PRECIO, PRECIO * 1.27 'PRECIO CON AUMENTO', FLOOR(PRECIO * 1.27) 'PRECIO REDONDEADO' FROM ARTICULOS; FUNCIONES DE AGREGADO / AGRUPAMIENTO EXISTEN FUNCIONES EN SQL QUE NOS PERMITEN CONTAR REGISTROS, CALCULAR SUMAS, PROMEDIOS, OBTENER VALORES MÁXIMOS Y MÍNIMOS. ESTAS FUNCIONES SE DENOMINAN FUNCIONES DE AGRUPAMIENTO PORQUE OPERAN SOBRE CONJUNTOS DE REGISTROS, EN LUGAR DE HACERLO SOBRE DATOS INDIVIDUALES. TIENEN LA CARACTERÍSTICA DE AGRUPAR LOS RESULTADOS EN UN SOLO REGISTRO DE SALIDA Página 12 de 33 FUNCIÓN COUNT() ESTA FUNCIÓN RETORNA LA CANTIDAD DE VALORES QUE CONTIENE UN CAMPO ESPECIFICADO. SELECT COUNT(*) FROM Productos; Correcto SELECT COUNT (*) FROM Productos; Incorrecto PUEDE COMBINARSE CON LA CLÁUSULA WHERE. POR EJ., SI SE QUIERE SABER CUÁNTOS PRODUCTOS CONTIENEN LA PALABRA IPHONE EN EL CAMPO NOMBRE DE LA LA TABLA PRODUCTOS, LA SENTENCIA SERÍA: SELECT COUNT(*) FROM PRODUCTOS WHERE NOMBRE LIKE "%IPHONE%"; FUNCIÓN SUM() ESTA FUNCIÓN RETORNA LA SUMA DE LOS VALORES QUE CONTIENE EL CAMPO ESPECIFICADO. SELECT SUM(STOCK) FROM PRODUCTOS; FUNCIÓN MAX() PERMITE AVERIGUAR EL VALOR MÁXIMO DE UN CAMPO. POR EJEMPLO, PARA CONOCER CUÁL ES EL MAYOR PRECIO DE TODOS LOS PRODUCTOS, LA INSTRUCCIÓN SQL A EJECUTAR SERÁ: SELECT MAX(PRECIO) FROM PRODUCTOS; FUNCIÓN MIN() ESTA FUNCIÓN PERMITE CALCULAR EL VALOR MÍNIMO DE UN CAMPO. SELECT MIN(PRECIO) FROM PRODUCTOS; Página 13 de 33 FUNCIÓN AVG() ESTA FUNCIÓN RETORNA EL VALOR PROMEDIO DE LOS VALORES DEL CAMPO ESPECIFICADO. SELECT AVG(PRECIO) FROM PRODUCTOS; CLÁUSULA GROUP BY LA AGRUPACIÓN ES UN CONCEPTO BÁSICO DE BASES DE DATOS. LA CLÁUSULA GROUP BY, COMO SU TRADUCCIÓN LO INDICA (AGRUPAR POR) TIENE COMO PROPÓSITO AGRUPAR INFORMACIÓN DE ACUERDO A UN CRITERIO EN COMÚN. ● POR LO GENERAL SE UTILIZA CON FUNCIONES DE AGRUPACIÓN O DE AGREGACIÓN (COUNT, MIN, MAX, AVG, SUM). ● EL COMPORTAMIENTO DE LA CLÁUSULA GROUP BY DEPENDERÁ DE LA FUNCIÓN DE AGRUPACIÓN QUE SE ESTÉ UTILIZANDO. ID NOMBRE PRECIO MARCA CATEGORÍA PRESENTACIÓN STOCK DISPONIBLE 1 IPHONE 6 499.99 APPLE SMARTPHONE 16GB 500 SI 2 IPAD PRO 599.99 APPLE SMARTPHONE 128GB 300 SI 3 NEXUS 7 299.99 LG SMARTPHONE 32GB 250 NO 4 GALAXY S7 459.99 SAMSUNG SMARTPHONE 64GB 200 SI 5 IMPRESORA T23 489.99 EPSON IMPRESORAS COLOR 180 NO 6 IMPRESORA T33 399 EPSON IMPRESORAS COLOR 200 NO 7 LAVARROPA 7000 1679 LG LAVARROPAS AUTOMÁTICO 100 SI 8 CAMARA DIGITAL 760 649 KODAK FOTOGRAFÍA SIN DETALLE 150 NO 9 NOTEBOOK CQ40-300 2999 HP NOTEBOOKS INTEL CORE I3 100 SI Página 14 de 33 SUPONIENDO QUE SE QUIERE CALCULAR LA CANTIDAD DE PRODUCTOS EXISTENTES EN LA CATEGORÍA SMARTPHONE, ENTONCES HABRÁ QUE AGRUPAR LOS REGISTROS POR EL CAMPO CATEGORÍA. LA CLÁUSULA GROUP BY PERMITE HACER ESTO DE MANERA AUTOMÁTICA A PARTIR DE UN VALOR O DATO COMÚN: SELECT CATEGORIA, SUM(STOCK) FROM PRODUCTOS GROUP BY CATEGORIA; SELECT EMPLEADO AS EMPLEADOS, ROUND(SUM(CARGO), 2) AS FACTURACION, COUNT(*) AS VENTAS, ROUND(AVG(CARGO), 2) AS PROMEDIO, MAX(CARGO) AS 'MEJOR VENTA', MIN(CARGO) AS 'MENOR VENTA' FROM PEDIDOS_NEPTUNO GROUP BY EMPLEADOS; CLÁUSULA HAVING PERMITE HACER SELECCIONES (FILTRAR) EN SITUACIONES EN LAS QUE NO ES POSIBLE USAR LA CLÁUSULA WHERE, DADO QUE SE ESTABLECE UN CRITERIO SOBRE UN VALOR DADO POR UNA FUNCIÓN DE AGRUPAMIENTO Y NO POR VALORES DE REGISTROS SELECT CATEGORIA, SUM(STOCK) FROM PRODUCTOS GROUP BY CATEGORIA HAVING SUM(STOCK) > 250; SELECT EMPLEADO AS EMPLEADOS, Página 15 de 33 ROUND(SUM(CARGO), 2) AS FACTURACION, COUNT(*) AS VENTAS, ROUND(AVG(CARGO), 2) AS PROMEDIO, MAX(CARGO) AS 'MEJOR VENTA', MIN(CARGO) AS 'MENOR VENTA' FROM PEDIDOS_NEPTUNO GROUP BY EMPLEADOS HAVING FACTURACION > 9000; MODULO 4 EN ESTE MÓDULO VERÁS: ● MANIPULACIÓN DE REGISTROS CON CREATE, INSERT, UPDATE Y DELETE. ● CONSULTA DE CREACIÓN DE TABLAS. ● CONSULTA DE ACTUALIZACIÓN. ● CONSULTA DE ELIMINACIÓN. ● CONSULTA DE DATOS ANEXADOS. ● DML - DDL. CONSULTAS DE ACCION CREATE TABLE SELECT CONSULTA DE CREACIÓN DE TABLA PUEDES CREAR UNA NUEVA TABLA A PARTIR DE UNA SENTENCIA SELECT PARA PODER DUPLICAR LA ESTRUCTURA COMPLETA DE LA MISMA O SÓLO PARTE DE ELLA. CREATE TABLE CLIENTES_COPIA SELECT * FROM CLIENTES; Página 16 de 33 CREATE TABLE CLIENTES_ARGENTINA SELECT * FROM CLIENTES WHERE PAIS = ‘ARGENTINA’; Nota: en los ejemplos mencionados, se replica la estructura de la tabla original y el tipo de datos de cada uno de sus campos, pero no la Primary Key. MODIFICAR REGISTROS DE UNA TABLA UPDATE UPDATE TABLA SET CAMPO1 = VALOR1 WHERE CAMPO = 'VALOR'; UPDATE TABLA SET CAMPO1 = VALOR1, CAMPO2 = VALOR2 WHERE CAMPO = 'VALOR'; MODIFICAR REGISTROS DE UNA TABLA UPDATE - ACTUALIZACIONES SELECTIVAS UPDATE ARTICULOS SET NOMBRE = 'PALA ANCHA' WHERE NOMBRE = 'PALA'; UPDATE ARTICULOS SET PRECIO = '499.99' WHERE NOMBRE = 'PALA'; MODIFICAR REGISTROS DE UNA TABLA DESBLOQUEO DE BASES DE DATOS EN OCASIONES, EL MOTOR DE BASE DE DATOS MYSQL WORKBENCH BLOQUEA (POR DEFECTO) LAS BASES DE DATOS PARA EVITAR ACTUALIZACIONES O ELIMINACIONES INVOLUNTARIAS. POR LO TANTO, EN EL CASO DE QUERER LLEVAR A CABO LA ACTUALIZACIÓN (O ELIMINACIÓN) DE REGISTROS DE UNA BASE DE DATOS, SERÁ NECESARIO DESBLOQUEAR LA BASE DE DATOS EN USO EJECUTANDO LA SIGUIENTE INSTRUCCIÓN: SET SQL_SAFE_UPDATES = 0; Página 17 de 33 CONSULTA DE DATOS ANEXADOS: DML INSERT SE PUEDEN INSERTAR DATOS (PROVENIENTES DE OTRA TABLA) EN UNA TABLA A PARTIR DE UNA SENTENCIA SELECT. DE ESTE MODO, PODRÁS REALIZAR UNA INSERCIÓN MASIVA DE DATOS DESDE UNA TABLA HACIA OTRA EN UNA SOLA INSTRUCCIÓN O SENTENCIA. SINTAXIS: INSERT INTO TABLADESTINO (COLUMNA1, ..., COLUMNAX) SELECT (COLUMNA1, ..., COLUMNAX) FROM TABLAORIGEN; NOTA: LA TABLA DE DESTINO (LLAMADA TABLADESTINO EN EL EJEMPLO ANTERIOR) DEBE TENER LA MISMA ESTRUCTURA QUE LA CONSULTA SELECT; ES DECIR, LA MISMA CANTIDAD DE COLUMNAS Y TIPOS DE DATOS COMPATIBLES. UPDATE CLIENTES_NEPTUNO ELIMINAR REGISTROS DE UNA TABLA: DML DELETE PARA ELIMINAR REGISTROS DE UNA TABLA, SE UTILIZA LA SENTENCIA DELETE. AL HACERLO, SE DEBERÁ ESPECIFICAR LA CONDICIÓN QUE DEBEN CUMPLIR LOS REGISTROS DE LA TABLA A ELIMINAR. DELETE FROM PRODUCTOS WHERE IDPRODUCTO = 1; TRUNCATE TABLE LA SENTENCIA DELETE SE PUEDE UTILIZAR PARA ELIMINAR TODOS LOS REGISTROS DE UNA TABLA, PERO TIENE LA DESVENTAJA DE NO SER TAN EFICIENTE, YA Página 18 de 33 QUE, POR EJEMPLO (ENTRE OTRAS LIMITACIONES), NO RESETEA LOS VALORES DE LOS CAMPOS AUTO_INCREMENT. TRUNCATE TABLE PRODUCTOS; POR ESTE MOTIVO, SI SE OPTA POR VACIAR COMPLETAMENTE LA TABLA, ES RECOMENDABLE UTILIZAR LA SENTENCIA TRUNCATE TABLE, LA CUAL ELIMINA LOS REGISTROS EN SU TOTALIDAD Y DEJA VACÍA LA TABLA, DE MANERA MENOS COSTOSA (EN TÉRMINOS DE RENDIMIENTO) PARA EL SERVIDOR DE BASE DE DATOS. ALTER TABLE CLIENTES MODIFY TELEFONO VARCHAR(20); UPDATE CLIENTES SET TELEFONO = CONCAT(‘+34-’, TELEFONO); SELCT * FROM CLIENTES; ALTER TABLE PRODUCTOS ADD FECHA DATE; UPDATE PRODUCTOS SET FECHA = CONCAT(ANO, '-', MES, '-', DIA); SELECT DIA, MES, ANO, FECHA FROM PRODUCTOS; ALTER TABLE PRODUCTOS_NEPTUNO MODIFY SUSPENDIDO VARCHAR(2); UPDATE PRODUCTOS NEPTUNO SET SUSPENDIDO = IF(SUSPENDIDO = '0', 'NO', 'SI'); Página 19 de 33 SELECT * FROM PRODUCTOS_NEPTUNO; CREATE TABLE PRODUCTOS_SUSPENDIDOS SELECT * FROM PRODUCTOS_NEPTUNO WHERE SUSPENDIDO = 'SI'; (CREAR UNA TABLA A PARTIR DE UNA TABLA ACTUALIZADA) UPDATE PRODUCTOS_NEPTUNO SET SUSPENDIDO = 'SI' WHERE IDPROVEEDOR = 1; SELECT * FROM PRODUCTOS_NEPTUNO; (ACTUALIZAR UN CAMPO EN BASE A OTRO CAMPO) UPDATE CLIENTES_NEPTUNO SET CIUDAD = UPPER(CIUDAD), PAIS = UPPER(PAIS); SELECT * FROM CLIENTES_NEPTUNO; SET PAIS = 'UK' WHERE PAIS = 'REINO UNIDO'; SELECT * FROM CLIENTES_NEPTUNO; ALTER TABLE EMPLEADOS ADD NOMBRE_EMPLEADO VARCHAR(30) AFTER IDEMPLEADO; UPDATE EMPLEADOS SET NOMBRE_EMPLEADO = CONCAT(APELLIDOS, ', ', NOMBRE); ALTER TABLE EMPLEADOS DROP APELLIDOS, DROP NOMBRE; SELECT * FROM EMPLEADOS; ALTER TABLE CLIENTES ADD TIPO VARCHAR(3); Página 20 de 33 UPDATE CLIENTES SET TIPO = 'VIP' WHERE CIUDAD = 'MADRID'; SELECT * FROM CLIENTES; ALTER TABLE CLIENTES MODIFY TELEFONO VARCHAR(20); UPDATE CLIENTES SET TELEFONO = CONCAT('+34-', TELEFONO) WHERE TELEFONO IS NOT NULL; SELECT * FROM CLIENTES; UPDATE CLIENTES SET CIUDAD = CONCAT(UPPER(LEFT(CIUDAD, 1)), LOWER(SUBSTRING(CIUDAD, 2, LENGTH(CIUDAD)))); SELECT * FROM CLIENTES; SET SQL_SAFE_UPDATES = 0; DELETE FROM PRODUCTOS_NEPTUNO WHERE SUSPENDIDO = 'SI'; DESAFIO ALTER TABLE TOP_SPOTIFY ADD PERMANENCIA INT; UPDATE TOP_SPOTIFY SET PERMANENCIA = YEAR(CURDATE()) - ANO; CREATE TABLE ULTIMOS_LANZAMIENTOS SELECT * FROM TOP_SPOTIFY WHERE PERMANENCIA <= 3; DELETE FROM TOP_SPOTIFY WHERE PERMANENCIA <=3; AGREGAR EL REGISTRO SOLICITADO A LA TABLA TOP_SPOTIFY: INSERT INTO TOP_SPOTIFY Página 21 de 33 VALUES (610, 'GOD CONTROL', 'MADONNA', 'POP', 2018, 3); INSERT INTO ULTIMOS_LANZAMIENTOS (ID, TITULO, ARTISTA, GENERO, ANO, PERMANENCIA) SELECT ID, TITULO, ARTISTA, GENERO, ANO, PERMANENCIA FROM TOP_SPOTIFY WHERE PERMANENCIA <= 3; DELETE FROM TOP_SPOTIFY WHERE PERMANENCIA <= 3; SET SQL_SAFE_UPDATES = 0; UPDATE AUTORES SET NOMBRE = 'Esteban' WHERE APELLIDO = 'ECHEVERRÍA'; ALTER TABLE EMPLEADOS ADD PERMANENCIA INT; UPDATE EMPLEADOS SET PERMANENCIA = TIMESTAMPDIFF(YEAR, FECHA_INGRESO, CURDATE()); ALTER TABLE LIBROS ADD PRECIO_PUBLICO FLOAT; UPDATE LIBROS SET PRECIO_PUBLICO = ROUND(PRECIO * 1.21, 2); CREATE TABLE EMPLEADOS_ANTERIORES SELECT * FROM EMPLEADOS WHERE APELLIDO IN ('THOMAS', 'PEREIRA', 'DEVO'); DELETE FROM EMPLEADOS WHERE APELLIDO IN ('THOMAS', 'PEREIRA', 'DEVO'); Página 22 de 33 INSERT INTO EMPLEADOS_ANTERIORES (EMPLEADO_ID, NOMBRE, APELLIDO, PUESTO_ID, EDITORIAL_ID, FECHA_INGRESO, PERMANENCIA) SELECT EMPLEADO_ID, NOMBRE, APELLIDO, PUESTO_ID, EDITORIAL_ID, FECHA_INGRESO, PERMANENCIA FROM EMPLEADOS WHERE APELLIDO = 'CRUZ'; DELETE FROM EMPLEADOS WHERE APELLIDO = 'CRUZ'; MODULO 5 SUBCONSULTAS UNA SUBCONSULTA ES UNA CONSULTA, ES DECIR, UN SELECT DENTRO DE OTRA CONSULTA (OTRO SELECT). SU OBJETIVO ES OBTENER UN RESULTADO Y UTILIZARLO COMO CRITERIO DE BÚSQUEDA PARA OBTENER UN DETERMINADO LISTADO DE REGISTROS. SELECT * FROM ARTICULOS WHERE ARTICULOID IN (SELECT ARTICULOID FROM FACTURAS); EL SIGUIENTE EJEMPLO UTILIZA UNA SUBCONSULTA PARA CONOCER TODOS LOS REGISTROS DE LA TABLA ARTICULOS CUYO VALOR DE CAMPO ARTICULOID SE ENCUENTRA EN EL CAMPO ARTICULOID DE LA TABLA FACTURAS. SUBCONSULTA ESCALAR SE DENOMINA SUBCONSULTA ESCALAR A AQUELLA Página 23 de 33 SUBCONSULTA QUE DEVUELVE UN ÚNICO RESULTADO (COMO PUEDE SER UNA SUMA, UN PROMEDIO, UN VALOR MÁXIMO, UN VALOR MÍNIMO, ETC.). CONDICIONAL CASE EL CONDICIONAL CASE PERMITE ASIGNAR UN VALOR A UNA COLUMNA TOMANDO COMO REFERENCIA OTRO VALOR DE LA TABLA. POR CADA VALOR O GRUPO DE VALORES EXISTE UN WHEN Y UN THEN; SI ENCUENTRA UN VALOR COINCIDENTE EN ALGÚN WHEN, EJECUTA EL THEN CORRESPONDIENTE A ESE WHEN; CASO CONTRARIO, SE EJECUTA EL ELSE. ESTE CONDICIONAL SE DEBE CERRAR CON LA PALABRA END PARA INDICAR QUE EL CASE HA FINALIZADO. SELECT NOMBRE, PRECIO, CASE WHEN PRECIO < 20 THEN ‘BARATO’ WHEN PRECIO BETWEEN 20 AND 40 THEN ‘EQUILIBRADO’ ELSE ‘CARO’ END AS CATEGORIA FROM ARTICULOS; SELECT IDCLIENTE, NOMBRECOMPANIA, CIUDAD, PAIS, Página 24 de 33 CASE WHEN PAIS IN ('ARGENTINA', 'BRASIL', 'VENEZUELA') THEN 'AMERICA DEL SUR' WHEN PAIS IN ('MEXICO', 'USA', 'CANADA') THEN 'AMERICA DEL NORTE' ELSE 'EUROPA' END AS CONTINENTE FROM CLIENTES_NEPTUNO ORDER BY CONTINENTE, PAIS; COMPARACION DE CONSULTAS (UNION) COMBINACIÓN DE CONSULTAS: UNION PARA COMPARAR LOS RESULTADOS DE VARIAS CONSULTAS Y COMBINARLOS EN UN NUEVO RESULTADO BASADO EN ESA COMPARACIÓN EXISTE (ENTRE OTROS) EL OPERADOR UNION. DADO QUE SE COMPARARÁN VARIAS CONSULTAS, ES NECESARIO QUE: ● EN CADA RESULTADO EXISTA LA MISMA CANTIDAD DE CAMPOS Y ● LOS CAMPOS A COMPARAR TENGAN TIPOS DE DATOS COMPATIBLES (NO ES NECESARIO QUE TENGAN EL MISMO NOMBRE). CONSULTA1 UNION [ALL] CONSULTA2; SELECT * FROM nenes WHERE provincia = ‘Córdoba’ UNION Página 25 de 33 SELECT * FROM nenas WHERE provincia = ‘La Pampa’; SELECT * FROM VARONES WHERE SEMANAS < 20 UNION SELECT * FROM MUJERES WHERE SEMANAS < 20 UNION SELECT * FROM INDETERMINADOS WHERE SEMANAS < 20; SELECT * FROM VARONES WHERE FECHA LIKE '%/09/%' AND NACIONALIDAD = 'CHILENA' AND ESTADO_CIVIL_MADRE = 'CASADA' AND SEMANAS > 40 UNION SELECT * FROM MUJERES WHERE FECHA LIKE '%/09/%' AND NACIONALIDAD = 'CHILENA' AND ESTADO_CIVIL_MADRE = 'CASADA' AND SEMANAS > 40 UNION SELECT * FROM INDETERMINADOS WHERE FECHA LIKE '%/09/%' AND NACIONALIDAD = 'CHILENA' AND ESTADO_CIVIL_MADRE = 'CASADA' AND SEMANAS > 40; SELECT *, 'A LA VENTA' AS CONDICION FROM PRODUCTOS_NEPTUNO WHERE PRECIOUNIDAD > 80 UNION SELECT *, 'SUSPENDIDO' AS CONDICION FROM PRODUCTOS_SUSPENDIDOS WHERE PRECIOUNIDAD > 80 ORDER BY NOMBREPRODUCTO; Página 26 de 33 INSERT INTO PRODUCTOS_SUSPENDIDOS (IDPRODUCTO, NOMBREPRODUCTO, NOMBRECONTACTO, NOMBRECATEGORIA, PRECIOUNIDAD, SUSPENDIDO, IDPROVEEDOR) SELECT IDPRODUCTO, NOMBREPRODUCTO, NOMBRECONTACTO, NOMBRECATEGORIA, PRECIOUNIDAD, SUSPENDIDO, IDPROVEEDOR FROM PRODUCTOS_NEPTUNO WHERE IDPRODUCTO = 43 ; SET SQL_SAFE_UPDATES = 0; DELETE FROM PRODUCTOS_SUSPENDIDOS WHERE IDPRODUCTO = 43; CONSULTAS RELACIONADAS CONSULTAS DE MÁS DE UNA TABLA – CROSS JOIN ES POSIBLE CONSULTAR DATOS DESDE VARIAS TABLAS EN LA MISMA SENTENCIA SELECT. ESTO PERMITE REALIZAR OTRAS DOS OPERACIONES DE ÁLGEBRA RELACIONAL: EL PRODUCTO CARTESIANO Y LA COMPOSICIÓN INTERNA. ANALIZANDO EL PANORAMA, PODRÁS OBSERVAR QUE EN LA TABLA PRODUCTOS, EL CAMPO IDPRODUCTO ES CLAVE PRIMARIA Y, POR ENDE, NO PUEDE TENER VALORES REPETIDOS. PERO, EN EL CAMPO MARCA, EL VALOR NUMÉRICO HACE REFERENCIA A LA MARCA A LA QUE PERTENECE EL PRODUCTO. UNA MARCA PODRÍA NO TENER NINGÚN PRODUCTO ASOCIADO, UNO O MUCHOS. SINTAXIS: Página 27 de 33 SELECT * FROM PRODUCTOS, MARCAS; COMPOSICIÓN INTERNA LA COMPOSICIÓN INTERNA SE TRATA DE UN PRODUCTO CARTESIANO RESTRINGIDO EN DONDE LAS TUPLAS (CONJUNTO DE NOMBRES DE ATRIBUTOS RELACIONADOS) QUE SE EMPAREJAN DEBEN CUMPLIR UNA CONDICIÓN DETERMINADA. EJEMPLO: SELECT * FROM PRODUCTOS, MARCAS WHERE PRODUCTOS.MARCA = MARCAS.IDMARCA; CREATE TABLE SELECCIONES (EQUIPO VARCHAR(15) PRIMARY KEY); INSERT INTO SELECCIONES VALUES ('ARGENTINA'), ('BRASIL'), ('COLOMBIA'), ('PERU'), ('VENEZUELA'); SELECT * FROM SELECCIONES; SELECT * FROM SELECCIONES L CROSS JOIN SELECCIONES V WHERE L.EQUIPO <> V.EQUIPO ORDER BY L.EQUIPO; EL PRODUCTO CARTESIANO DE DOS TABLAS SON TODAS LAS COMBINACIONES DE TODAS LAS FILAS DE LAS DOS TABLAS ENTIDAD Página 28 de 33 UNA ENTIDAD ES CUALQUIER "OBJETO" DISCRETO SOBRE EL QUE SE TIENE INFORMACIÓN. CADA EJEMPLAR DE UNA ENTIDAD SE DENOMINA INSTANCIA. LAS ENTIDADES SON MODELADAS EN LA BASE DE DATOS COMO TABLAS. INTEGRIDAD REFERENCIAL LA INTEGRIDAD REFERENCIAL ES UN MECANISMO QUE GARANTIZA LA INTEGRIDAD DE DATOS EN TABLAS RELACIONADAS, YA QUE LA MISMA EVITA LA EXISTENCIA DE LOS LLAMADOS REGISTROS HUÉRFANOS (REGISTROS HIJOS SIN SU CORRESPONDIENTE REGISTRO PADRE). PARA ESTABLECER LA INTEGRIDAD REFERENCIAL ES NECESARIO CREAR EN UNA TABLA HIJA, UNA CLAVE EXTERNA O FORÁNEA QUE ESTÉ RELACIONADA A UNA CLAVE PRIMARIA DE LA TABLA PADRE. ES POSIBLE ESTABLECER EL COMPORTAMIENTO DE LOS REGISTROS EN LA TABLA HIJA, CUANDO SE PRODUCEN ACTUALIZACIONES DE DATOS EN LA CLAVE PRIMARIA DE LA TABLA PADRE, O SE ELIMINAN REGISTROS EN LA TABLA PADRE A TRAVÉS DE LA DEFINICIÓN DE OPERACIONES EN CASCADA: ON UPDATE, ON DELETE. CLAVE FORÁNEA (FOREIGN KEY) LA CLAVE FORÁNEA DE UNA TABLA ES AQUELLA QUE REFERENCIA A LA CLAVE PRIMARIA DE UNA TABLA. Página 29 de 33 ÉSTA PUEDE REFERENCIAR A LA CLAVE PRIMARIA DE LA MISMA TABLA O DE OTRA. ANTE UNA CONSULTA SQL, SE VALIDA LA LEGITIMIDAD DE LOS DATOS ALMACENADOS EN UNA CLAVE FORÁNEA Y SE FUERZA LA INTEGRIDAD REFERENCIAL. LA CLAVE FORÁNEA DEBE TENER EL MISMO TIPO DE DATOS QUE EL CAMPO AL CUAL HACE REFERENCIA, ES DECIR, LA CLAVE PRIMARIA. INNER JOIN SELECT COD_CLIENTE, EMPRESA FROM CLIENTES INNER JOIN PEDIDOS ON CLIENTES.COD_CLIENTE = PEDIDOS.CODIGO_CLIENTE ORDER BY COD_CLIENTE; SELECT TABLA1.CAMPOS, TABLA2.CAMPOS FROM TABLA1, TABLA2 WHERE TABLA1.CAMPO1=TABLA2.CAMPO1 AND CONDICIÓN LEFT [OUTER] JOIN ESTE JOIN DEVUELVE TODOS LOS REGISTROS DE LA TABLA DE LA IZQUIERDA Y LOS REGISTROS QUE COINCIDEN DE LA TABLA DE LA DERECHA: RIGHT [OUTER] JOIN ESTE JOIN DEVUELVE TODOS LOS REGISTROS DE LA TABLA Página 30 de 33 DE LA DERECHA Y LOS REGISTROS QUE COINCIDEN DE LA TABLA DE LA IZQUIERDA: SELECT *FROM TABLA1 RIGHT JOIN TABLA2 ON TABLA1.CODIGO = TABLA2.CODIGO; CROSS JOIN COMBINA CADA REGISTRO DE LA TABLA DE LA IZQUIERDA CON CADA REGISTRO DE LA TABLA DE LA DERECHA, SIN HACER COINCIDIR UN CAMPO EN PARTICULAR. SELECT * FROM TABLA1 CROSS JOIN TABLA2; PROYECTO 1 SELECT * FROM PRODUCTOS_NEPTUNO WHERE PRECIOUNIDAD > (SELECT AVG(PRECIOUNIDAD) FROM PRODUCTOS_NEPTUNO) ORDER BY NOMBREPRODUCTO; SELECT * FROM PRODUCTOS_NEPTUNO WHERE PRECIOUNIDAD > (SELECT MAX(PRECIOUNIDAD) FROM PRODUCTOS_SUSPENDIDOS) ORDER BY PRECIOUNIDAD DESC; SELECT * FROM VARONES WHERE SEMANAS < (SELECT MIN(SEMANAS) FROM INDETERMINADOS); SELECT * FROM PRODUCTOS_NEPTUNO Página 31 de 33 WHERE LEFT(NOMBREPRODUCTO, 1) = (SELECT LEFT(NOMBRE_EMPLEADO, 1) FROM EMPLEADOS WHERE IDEMPLEADO = 8) ORDER BY NOMBREPRODUCTO; SELECT * FROM PRODUCTOS_NEPTUNO WHERE NOMBRECATEGORIA = 'BEBIDAS' AND PRECIOUNIDAD > (SELECT MAX(PRECIOUNIDAD) FROM PRODUCTOS_NEPTUNO WHERE NOMBRECATEGORIA = 'CONDIMENTOS'); SELECT * FROM MUJERES WHERE EDAD_MADRE > (SELECT MAX(EDAD_MADRE) FROM VARONES); UTILIZAR LA TABLA TOP SPOTIFY Y OBTENER UNA LISTA DE TODOS AQUELLOS LANZAMIENTOS CORRESPONDIENTES A LADY GAGA CON MAYOR PERMANENCIA EN LA PLATAFORMA DIGITAL. EN EL RESULTADO DE LA CONSULTA, SÓLO MOSTRAR LOS TÍTULOS DE LAS CANCIONES DE LA ARTISTA. ORDENAR EL RESULTADO ALFABÉTICAMENTE POR LOS TÍTULOS DE LAS CANCIONES. SELECT TITULO FROM TOP_SPOTIFY WHERE PERMANENCIA = (SELECT MAX(PERMANENCIA) FROM TOP_SPOTIFY) AND ARTISTA = 'LADY GAGA' ORDER BY TITULO; Página 32 de 33 UTILIZA LA TABLA TOP SPOTIFY Y GENERA UNA CONSULTA QUE MUESTRE LOS CAMPOS ARTISTA Y TÍTULO. AGREGAR UNA COLUMNA CON EL NOMBRE TIPO EN LA QUE SE MUESTREN LOS VALORES DEFINIDOS EN EL EJERCICIO. ORDENA EL RESULTADO ALFABÉTICAMENTE POR NOMBRES DE LOS ARTISTAS. EN EL CASO DE QUE HAYA UN ARTISTA CON MÁS DE UNA CANCIÓN EN EL LISTADO, MOSTRAR ORDENADOS ALFABÉTICAMENTE LOS NOMBRES DE LAS CANCIONES. SELECT TITULO, ARTISTA, CASE WHEN GENERO LIKE '%POP%' THEN 'POP' WHEN GENERO LIKE '%ELECTRO%' OR GENERO LIKE '%HOUSE%' THEN 'ELECTRÓNICA' ELSE 'OTRO' END AS TIPO FROM TOP_SPOTIFY ORDER BY ARTISTA, TITULO; SELECT *, 'ANTERIOR' AS ESTADO FROM TOP_SPOTIFY WHERE TITULO LIKE '%BREAK%' UNION SELECT *, 'ULTIMO' AS ESTADO FROM ULTIMOS_LANZAMIENTOS WHERE TITULO LIKE '%BREAK%' ORDER BY TITULO; Página 33 de 33 DADA LA TABLA LIBROS, EXTRAER UNA LISTA DE TODOS LOS LIBROS PERTENECIENTES A LA CATEGORÍA NOVELAS CUYO PRECIO SEA SUPERIOR AL LIBRO MÁS CARO DE LA CATEGORÍA ENSAYOS. LA LISTA DEBE CONTENER TODOS LOS CAMPOS DE LA TABLA. MOSTRAR EL RESULTADO DE LA CONSULTA ORDENADO DE MAYOR A MENOR POR LOS PRECIOS DE LOS LIBROS. SELECT * FROM LIBROS WHERE CATEGORIA = 'NOVELAS' AND PRECIO > (SELECT MAX(PRECIO) FROM LIBROS WHERE CATEGORIA = 'ENSAYOS') ORDER BY PRECIO DESC; SELECT CONCAT(APELLIDO, ', ', NOMBRE) EMPLEADO, 'ACTIVO' AS ESTADO FROM EMPLEADOS WHERE PUESTO_ID = 9 UNION SELECT CONCAT(APELLIDO, ', ', NOMBRE), 'DESACTIVO' AS ESTADO FROM EMPLEADOS_ANTERIORES WHERE PUESTO_ID = 9 ORDER BY EMPLEADO;