├── Enunciados de problemas ├── 69) Subconsultas como expresión ├── 33) Indice de tipo Primary ├── 13) Valores Unsigned ├── 34) Index ├── 01) Tabla y campos ├── 48) Alter Table - Rename ├── 37) Create Index ├── 43) Alter Table - Modify ├── 38) CLáusula Limit ├── 14) Tipos de Datos (Texto) ├── 02) Registros de tablas ├── 46) Alter Table - Add Index ├── 74) Subconsulta Simil Autocombinación ├── 41) Alter Table - Add ├── 07) Borrado de registros ├── 78) Vistas basadas en otras vistas ├── 04) Consultas básicas I ├── 15) Tipos de Datos (Númericos) ├── 47) Alter Table - Drop Index ├── 73) Subconsultas (Exists y No Exists) ├── 08) Modificación de registros ├── 05) Consultas básicas II ├── 42) Alter Table - Drop ├── 36) Drop Index ├── 18) Atributo Zerofill ├── 81) Procedimientos Almacenados III ├── 03) Tipos de Datos (Básicos) ├── 72) Subconsultas correlacionadas ├── 45) Alter Table para Primary key ├── 51) Blob y Text ├── 53) Funcion CASE ├── 09) Primary Key ├── 35) Unique ├── 63) Cross Join II ├── 06) Operadores Racionales ├── 11) Comando Truncate Table ├── 70) Subconsultas con IN ├── 10) Autoincremento ├── 16) Tipos de Datos (Fecha y Hora) ├── 76) Subconsulta (Insert) ├── 64) Cross Join III ├── 23) Operadores Relacionales ├── 21) Cláusula Order By ├── 68) Variables de usuario ├── 32) Clave Primaria Compuesta ├── 39) Rand ├── 40) Replace ├── 71) Subconsultas ANY -SOME - ALL ├── 49) Enum ├── 79) Procedimientos Almacenados I ├── 17) Atributo Default ├── 19) Columnas Calculadas ├── 77) Vistas ├── 24) Búsqueda de Patrones ├── 44) Alter Table - Change ├── 80) Procedimientos Almacendados II ├── 28) Group by ├── 56) Join III ├── 55) Join II ├── 59) Left Join II ├── 57) Join IV ├── 60) Left Join III ├── 62) Cross Join I ├── 31) Alias ├── 22) Operadores Lógicos ├── 67) Funcion IF con varias tablas ├── 75) Subconsulta en lugar de una tabla ├── 29) Having ├── 25) Regexp ├── 30) Distinct ├── 61) Right Join ├── 27) Funciones de agrupamiento ├── 12) Valores Null ├── 26) Count ├── 54) Join ├── 58) Left Join I ├── 65) Join y Group By ├── 20) Funciones (Fecha y Hora) ├── 50) Set ├── 66) Join con más de 2 tablas └── 52) Funcion IF ├── Resolución de problemas ├── 37-CreateIndex.sql ├── 48-AlterTableRename.sql ├── 33-IndiceDeTipoPrimary.sql ├── 47-AlterTableDropIndex.sql ├── 13-ValoresUnsigned.sql ├── 46-AlterTableAddIndex.sql ├── 34-Index.sql ├── 03-TiposDeDatos(Basicos).sql ├── 04-ConsultasBasicasI.sql ├── 69-SubconsultasComoExpresion.sql ├── 01-TablayCampos.sql ├── 43-AlterTableModify.sql ├── 02-RegistrosDeTablas.sql ├── 15-TiposDeDatos(Númericos).sql ├── 36-DropIndex.sql ├── 18-AtributoZerofill.sql ├── 78-VistasBasadasEnOtrasVistas.sql ├── 51-BlobYText.sql ├── 63-CrossJoinII.sql ├── 05-ConsultasBasicasII.sql ├── 21-ClausulaOrderBy.sql ├── 41-AlterTableAdd.sql ├── 38-ClausulaLimit.sql ├── 74-SubconsultaSimilAutocombinacion.sql ├── 14-TiposDeDatos(Texto).sql ├── 68-VariablesDeUsuario.sql ├── 76-Subconsulta(Insert).sql ├── 81-ProcedimientosAlmacenadosIII.sql ├── 53.FuncionCASE.sql ├── 06-OperadoresRacionales.sql ├── 23-OperadoresRelacionales.sql ├── 32-ClavePrimariaCompuesta.sql ├── 39-Rand.sql ├── 08-ModificacionDeRegistros.sql ├── 64-CrossJoinIII.sql ├── 45-AlterTableParaPrimaryKey.sql ├── 49-Enum.sql ├── 42-AlterTableDrop.sql ├── 11-ComandoTruncateTable.sql ├── 16-TiposDeDatos(FechaYHora).sql ├── 10-Autoincremento.sql ├── 35-Unique.sql ├── 44-AlterTableChange.sql ├── 07-BorradoDeRegistros.sql ├── 62-CrossJoinI.sql ├── 09-PrimaryKey.sql ├── 30-Distinct.sql ├── 79-ProcedimientosAlmacenadosI.sql ├── 59-LeftJoinII.sql ├── 19-ColumnasCalculadas.sql ├── 72-SubconsultasCorrelacionadas.sql ├── 55-JoinII.sql ├── 17-AtriubutoDefault.sql ├── 56-JoinIII.sql ├── 73-Subconsultas(ExistsYNoExists).sql ├── 75-SubconsultaEnLugarDeUnaTabla.sql ├── 70-SubconsultasConIN.sql ├── 28-GroupBy.sql ├── 57-JoinIV.sql ├── 24-BusquedaDePatrones.sql ├── 40-Replace.sql └── 60-LeftJoinIII.sql ├── LICENSE └── README.md /Enunciados de problemas/69) Subconsultas como expresión: -------------------------------------------------------------------------------- 1 | Subconsultas como expresión 2 | 3 | Problema: 4 | 5 | Un profesor almacena el documento, nombre y la nota final de cada alumno de su clase en una tabla 6 | llamada "alumnos". 7 | 8 | 1- Elimine la tabla si existe y luego Créela 9 | 10 | 2-Ingrese algunos registros: 11 | 12 | 3- Obtenga todos los datos de los alumnos con la nota más alta, empleando subconsulta: 13 | 14 | 4- Muestre los alumnos que tienen una nota menor al promedio, su nota, y la diferencia con el 15 | promedio. 16 | -------------------------------------------------------------------------------- /Enunciados de problemas/33) Indice de tipo Primary: -------------------------------------------------------------------------------- 1 | Indice de tipo primary. 2 | 3 | Problema: 4 | 5 | Una empresa almacena los datos de sus clientes en una tabla llamada "clientes". 6 | 7 | 1- Elimine la tabla "clientes" si existe. 8 | 9 | 2- Créela con los siguientes campos y clave: 10 | 11 | create table clientes( 12 | documento char(8), 13 | apellido varchar(20), 14 | nombre varchar(20), 15 | domicilio varchar(30), 16 | primary key(documento) 17 | ); 18 | 19 | 3- Vea la estructura de los índices la tabla y analice la información: 20 | -------------------------------------------------------------------------------- /Enunciados de problemas/13) Valores Unsigned: -------------------------------------------------------------------------------- 1 | Valores numéricos sin signo (unsigned) 2 | 3 | Problema: 4 | 5 | Trabaje con la tabla que almacena los datos sobre películas. 6 | 7 | 1- Elimine la tabla "peliculas", si existe. 8 | 9 | 2- Cree la tabla "peliculas" teniendo en cuenta el rango de valores que almacenará cada campo: 10 | 11 | -codigo: entero a partir de 1, autoincrementable, 12 | -titulo: caracteres de 40 de longitud, no nulo, 13 | -actor: cadena de 20, 14 | -duracion: float positivo, 15 | -clave primaria: codigo. 16 | 17 | 3- Visualice la estructura de la tabla. 18 | -------------------------------------------------------------------------------- /Enunciados de problemas/34) Index: -------------------------------------------------------------------------------- 1 | Indice común (index) 2 | 3 | Problema: 4 | 5 | Retome la tabla llamada "medicamentos" de una farmacia. 6 | 7 | 1- Elimine la tabla, si existe. 8 | 9 | 2- Cree la tabla e indéxela por el campo "laboratorio": 10 | 11 | create table medicamentos( 12 | codigo int unsigned auto_increment, 13 | nombre varchar(20) not null, 14 | laboratorio varchar(20), 15 | precio decimal (6,2) unsigned, 16 | cantidad int unsigned, 17 | primary key(codigo), 18 | index i_laboratorio (laboratorio) 19 | ); 20 | 21 | 3- Visualice los índices de la tabla "medicamentos" y analice la información: 22 | -------------------------------------------------------------------------------- /Enunciados de problemas/01) Tabla y campos: -------------------------------------------------------------------------------- 1 | -- Creación de una tabla y mostrar sus campos (create table - show tables - describe - drop table) -- 2 | 3 | Problema: 4 | A) Queremos almacenar los datos de nuestros amigos. 5 | 1- Elimine la tabla "agenda" si existe: 6 | 7 | 2- Cree una tabla llamada "agenda", debe tener los siguientes campos: 8 | 9 | 3- Intente crearla nuevamente. 10 | 11 | 4- Visualice las tablas existentes. 12 | 13 | 5- Visualice la estructura de la tabla "agenda". 14 | 15 | 6- Elimine la tabla, si existe. 16 | 17 | 7- Intente eliminar la tabla sin la cláusula if exists. 18 | Debe aparecer un mensaje de error cuando no existe la tabla. 19 | -------------------------------------------------------------------------------- /Enunciados de problemas/48) Alter Table - Rename: -------------------------------------------------------------------------------- 1 | renombrar tablas (alter table - rename - rename table) 2 | 3 | Problema: 4 | 5 | Trabajamos con la tabla "peliculas" de un video club. 6 | 7 | 1- Elimine la tabla, si existe. 8 | 9 | 2- Cree la tabla "peliculas": 10 | 11 | create table peliculas( 12 | codigo int unsigned auto_increment, 13 | titulo varchar(40), 14 | duracion tinyint unsigned 15 | ); 16 | 17 | 3- Cambie el nombre de la tabla por "films" con "alter table": 18 | 19 | 4- Vea si existen las tablas "peliculas" y "films": 20 | 21 | 5- Cambie nuevamente el nombre, de la tabla "films" por "peliculas" usando "rename": 22 | 23 | 6- vea si existen las tablas: 24 | -------------------------------------------------------------------------------- /Enunciados de problemas/37) Create Index: -------------------------------------------------------------------------------- 1 | Creación de índices a tablas existentes (create index) 2 | 3 | Problema: 4 | 5 | Retome la tabla "clientes" que almacena información sobre los clientes de una empresa. 6 | 7 | 1- Elimine la tabla "clientes", si existe. 8 | 9 | 2- Créela con esta estructura: 10 | create table clientes ( 11 | documento char (8) not null, 12 | nombre varchar(30) not null, 13 | domicilio varchar(30), 14 | ciudad varchar(20), 15 | provincia varchar (20), 16 | telefono varchar(11) 17 | ); 18 | 19 | 3- Agregue un índice común por ciudad y provincia: 20 | 21 | 4- Agregue un índice único por el campo "documento": 22 | 23 | 5- Vea la información de los índices: 24 | -------------------------------------------------------------------------------- /Resolución de problemas/37-CreateIndex.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla "clientes", si existe. 2 | 3 | DROP TABLE IF EXISTS clientes; 4 | 5 | -- 2- Créela con esta estructura: 6 | 7 | CREATE TABLE clientes ( 8 | documento CHAR(8) NOT NULL, 9 | nombre VARCHAR(30) NOT NULL, 10 | domicilio VARCHAR(30), 11 | ciudad VARCHAR(20), 12 | provincia VARCHAR(20), 13 | telefono VARCHAR(11) 14 | ); 15 | 16 | -- 3- Agregue un índice común por ciudad y provincia: 17 | 18 | CREATE INDEX i_ciudadprovincia ON clientes (ciudad,provincia); 19 | 20 | -- 4- Agregue un índice único por el campo "documento": 21 | 22 | CREATE UNIQUE INDEX i_documento ON clientes (documento); 23 | 24 | -- 5- Vea la información de los índices: 25 | 26 | SHOW INDEX FROM clientes; 27 | -------------------------------------------------------------------------------- /Enunciados de problemas/43) Alter Table - Modify: -------------------------------------------------------------------------------- 1 | Modificar campos de una tabla (alter table - modify) 2 | 3 | Problema: 4 | 5 | Trabaje con la tabla "peliculas" de un video club. 6 | 7 | 1- Elimine la tabla, si existe. 8 | 9 | 2- Cree la tabla con la siguiente estructura: 10 | 11 | create table peliculas( 12 | codigo int unsigned, 13 | nombre varchar(20) not null, 14 | actor varchar(20), 15 | director varchar(25), 16 | duracion tinyint 17 | ); 18 | 19 | 3- Modifique el campo "duracion" por tinyint unsigned. 20 | 21 | 4- Modifique el campo "nombre" para almacenar una longitud de 40 caracteres y que no permita valores nulos: 22 | 23 | 5- Modifique el campo "actor" para que no permita valores nulos: 24 | 25 | 6- Intente definir "auto_increment" el campo "codigo": 26 | -------------------------------------------------------------------------------- /Enunciados de problemas/38) CLáusula Limit: -------------------------------------------------------------------------------- 1 | Cláusula limit del comando select. 2 | 3 | Problema: 4 | 5 | Trabaje con la tabla "peliculas" de un video club que alquila películas en video. 6 | 7 | 1- Elimine la tabla, si existe. 8 | 9 | 2- Créela con la siguiente estructura: 10 | -codigo (entero sin signo, autoincrementable), 11 | -titulo (cadena de 30), not null, 12 | -actor (cadena de 20), 13 | -duracion (entero sin signo no mayor a 200 aprox.), 14 | -clave primaria (codigo). 15 | 16 | 3- Ingrese 10 registros. 17 | 18 | 4- Realice una consulta limitando la salida a sólo 5 registros. 19 | 20 | 5- Muestre los registros desde el cero al 8 usando un solo argumento. 21 | 22 | 6- Muestre 3 registros a partir del 4. 23 | 24 | 7- Muestre los registros a partir del 2 hasta el final. 25 | -------------------------------------------------------------------------------- /Enunciados de problemas/14) Tipos de Datos (Texto): -------------------------------------------------------------------------------- 1 | Tipos de datos (texto) 2 | 3 | Problema: 4 | 5 | Una concesionaria de autos vende autos usados y almacena los datos de los autos en 6 | una tabla llamada "autos". 7 | 8 | 1- Elimine la tabla "autos" si existe. 9 | 10 | 2- Cree la tabla con los siguientes campos: patente (primary key), marca, modelo yprecio. 11 | 12 | 3- Ingrese los siguientes registros: 13 | 14 | ('ACD123','Fiat 128','1970',15000); 15 | ('ACG234','Renault 11','1990',40000); 16 | ('BCD333','Peugeot 505','1990',80000); 17 | ('GCD123','Renault Clio','1990',70000); 18 | ('BCC333','Renault Megane','1998',95000); 19 | ('BVF543','Fiat 128','1975',20000); 20 | 21 | 4- Seleccione todos los autos del año 1990: 22 | 23 | 5- Seleccione todos los autos con precio superior a 50000: 24 | -------------------------------------------------------------------------------- /Enunciados de problemas/02) Registros de tablas: -------------------------------------------------------------------------------- 1 | -- Carga de registros a una tabla y su recuperación (insert into - select) -- 2 | 3 | Problema: 4 | 5 | Trabaje con la tabla "agenda". 6 | 7 | 1- Elimine la tabla "agenda", si existe: 8 | 9 | 2- Cree una tabla llamada "agenda". Debe tener los campos nombre, domicio, telefono: 10 | 11 | 3- Visualice las tablas existentes para verificar la creación de "agenda". 12 | 13 | 4- Visualice la estructura de la tabla "agenda". 14 | 15 | 5- Ingrese los siguientes registros: 16 | 17 | ('Alberto Mores','Colon 123','4234567'); 18 | ('Juan Torres','Avellaneda 135','4458787'); 19 | 20 | 6- Seleccione y mustre todos los registros de la tabla: 21 | 22 | 7- Elimine la tabla "agenda", si existe: 23 | 24 | 8- Intente eliminar la tabla nuevamente, sin especificar "si existe": 25 | -------------------------------------------------------------------------------- /Enunciados de problemas/46) Alter Table - Add Index: -------------------------------------------------------------------------------- 1 | Agregar índices(alter table - add index) 2 | 3 | Problema: 4 | 5 | Trabaje con la tabla "alumnos" en el cual un instituto de enseñanza guarda los datos de sus alumnos. 6 | 7 | 1- Elimine la tabla "alumnos" si existe. 8 | 9 | 2- Cree la tabla: 10 | 11 | create table alumnos( 12 | legajo int unsigned auto_increment, 13 | nombre varchar(30), 14 | documento char(8) not null, 15 | domicilio varchar(30), 16 | ciudad varchar(20), 17 | provincia varchar(20), 18 | primary key(legajo) 19 | ); 20 | 21 | 3- Vea los índices de la tabla. 22 | 23 | 4- Agregue un índice común por los campos "ciudad" y "provincia" (que pueden repetirse): 24 | 25 | 5- Agregue un índice único (no pueden repetirse los valores) por el campo "documento": 26 | 27 | 6- Visualice los índices: 28 | -------------------------------------------------------------------------------- /Enunciados de problemas/74) Subconsulta Simil Autocombinación: -------------------------------------------------------------------------------- 1 | Subconsulta simil autocombinación 2 | 3 | Problema: 4 | 5 | Un club dicta clases de distintos deportes a sus socios. El club tiene una tabla llamada "deportes" 6 | en la cual almacena el nombre del deporte, el nombre del profesor que lo dicta, el día de la semana 7 | que se dicta y el costo de la cuota mensual. 8 | 9 | 1- Borre y luego cree la tabla 'deportes': 10 | 11 | 2- Ingrese algunos registros. Incluya profesores que dicten más de un curso: 12 | 13 | 3- Muestre los nombres de los profesores que dictan más de un deporte empleando subconsulta. 14 | 15 | 4- Obtenga el mismo resultado empleando join. 16 | 17 | 5- Buscamos todos los deportes que se dictan el mismo día que un determinado deporte (natacion): 18 | 19 | 6- Obtenga la misma salida empleando "join". 20 | -------------------------------------------------------------------------------- /Enunciados de problemas/41) Alter Table - Add: -------------------------------------------------------------------------------- 1 | Agregar campos a una tabla (alter table - add) 2 | 3 | Problema: 4 | 5 | Trabaje con la tabla "peliculas" de un video club. 6 | 7 | 1- Elimine la tabla, si existe. 8 | 9 | 2- Cree la tabla con la siguiente estructura: 10 | 11 | create table peliculas( 12 | codigo int unsigned auto_increment, 13 | nombre varchar(30) not null, 14 | actor varchar(20), 15 | primary key(codigo) 16 | ); 17 | 18 | 3- Ingrese algunos registros. 19 | 20 | 4- Agregue un campo para almacenar la duración de la película, de tipo tinyint unsigned: 21 | 22 | 5- Visualice la estructura de la tabla. 23 | 24 | 6- Agregue el campo "director" para almacenar el nombre del director, de tipo varchar(20): 25 | 26 | 7- Visualice la estructura de la tabla con su nuevo campo: 27 | 28 | 8- Intente agregar un campo existente: 29 | -------------------------------------------------------------------------------- /Enunciados de problemas/07) Borrado de registros: -------------------------------------------------------------------------------- 1 | Borrado de registros de una tabla (delete) 2 | 3 | Problema: 4 | 5 | Trabaje con la tabla "agenda" que registra la información referente a sus amigos. 6 | 7 | 1- Elimine la tabla "agenda" si existe. 8 | 9 | 2- Cree la tabla con los siguientes campos: apellido (cadena de 30), nombre (cadena de 20), 10 | domicilio (cadena de 30) y telefono (cadena de 11): 11 | 12 | 3- Visualice la estructura de la tabla "agenda". 13 | 14 | 4- Ingrese los siguientes registros: 15 | 16 | Mores,Alberto,Colon 123,4234567, 17 | Torres,Juan,Avellaneda 135,4458787, 18 | Lopez,Mariana,Urquiza 333,4545454, 19 | Lopez,Jose,Urquiza 333,4545454, 20 | Peralta,Susana,Gral. Paz 1234,4123456. 21 | 22 | 5- Elimine el registro cuyo nombre sea 'Juan'. 23 | 24 | 6- Elimine los registros cuyo número telefónico sea igual a '4545454'. 25 | -------------------------------------------------------------------------------- /Enunciados de problemas/78) Vistas basadas en otras vistas: -------------------------------------------------------------------------------- 1 | Vistas basadas en otras vistas 2 | 3 | Problema: 4 | 5 | Un profesor almacena el documento, nombre y la nota final de cada alumno de su clase en una tabla 6 | llamada "alumnos". 7 | 8 | 1- Elimine la tabla si existe y luego Créela 9 | 10 | create table alumnos( 11 | documento char(8), 12 | nombre varchar(30), 13 | nota decimal(4,2), 14 | primary key(documento) 15 | ); 16 | 17 | 18 | 2-Ingrese algunos registros: 19 | 20 | 3-Cree una vista que recupere el nombre y la nota de todos los alumnos 21 | 22 | 4-Mostrar el resultado de llamar la vista en un comando SQL 'select'. 23 | 24 | 5-Crear una vista que retorne el nombre y la nota de todos los alumnos aprobados (notas mayores 25 | iguales a 7) a partir de la vista anterior. 26 | 27 | 6-Muestre la información que genera la vista. 28 | -------------------------------------------------------------------------------- /Enunciados de problemas/04) Consultas básicas I: -------------------------------------------------------------------------------- 1 | -- Recuperación de algunos campos (select) -- 2 | 3 | Problema: 4 | Un videoclub que alquila películas en video almacena la información de sus películas en alquiler en una tabla llamada "peliculas". 5 | 6 | 1- Elimine la tabla, si existe: 7 | 8 | 2- Cree la tabla "peliculas" incluyendo titulo, actor, duracion y cantidad. 9 | 10 | 3- Vea la estructura de la tabla: 11 | 12 | 4- Ingrese los siguientes registros: 13 | 14 | ('Mision imposible','Tom Cruise',120,3); 15 | ('Mision imposible 2','Tom Cruise',180,2); 16 | ('Mujer bonita','Julia R.',90,3); 17 | ('Elsa y Fred','China Zorrilla',90,2); 18 | 19 | 5- Realice un "select" mostrando solamente el título y actor de todas las películas: 20 | 21 | 6- Muestre el título y duración de todas las peliculas. 22 | 23 | 7- Muestre el título y la cantidad de copias. 24 | -------------------------------------------------------------------------------- /Enunciados de problemas/15) Tipos de Datos (Númericos): -------------------------------------------------------------------------------- 1 | Tipos de datos (numéricos) 2 | 3 | Problema: 4 | 5 | Un comercio que envía pizzas y empanadas a domicilio registra los pedidos diariamente en una tabla 6 | llamada "pedidos" con los siguientes datos: 7 | 8 | - numero de pedido, autoincrementable, entero positivo comienza en 1 y menor a 200 aprox. 9 | - nombre: piza o empanada, 10 | - tipo: por ejemplo, si es pizza: especial, muzarela, etc., si son empanadas: salteñas, picantes, 11 | arabes, etc. 12 | - precio: precio por unidad, valor con decimales que no supera los $99.99 y será siempre mayor a 0, 13 | - cantidad: cantidad de articulos, entero positivo desde 1 e inferior a 200 aprox. 14 | - domicilio del cliente. 15 | 16 | 1- Elimine la tabla "pedidos" si existe. 17 | 18 | 2- Cree la tabla eligiendo el tipo de dato adecuado para cada campo. 19 | -------------------------------------------------------------------------------- /Enunciados de problemas/47) Alter Table - Drop Index: -------------------------------------------------------------------------------- 1 | Borrado de índices (alter table - drop index) 2 | 3 | Problema: 4 | 5 | Trabajamos con la tabla "alumnos" en la cual un instituto de enseñanza guarda los datos de sus 6 | alumnos. 7 | 8 | 1- Elimine la tabla "alumnos" si existe. 9 | 10 | 2- Cree la tabla con los siguientes índices: 11 | 12 | create table alumnos( 13 | año year not null, 14 | numero int unsigned not null, 15 | nombre varchar(30), 16 | documento char(8) not null, 17 | domicilio varchar(30), 18 | ciudad varchar(20), 19 | provincia varchar(20), 20 | primary key(año,numero), 21 | unique i_documento (documento), 22 | index i_ciudadprovincia (ciudad,provincia), 23 | ); 24 | 25 | 3- Vea los índices de la tabla. 26 | 27 | 4- Elimine el índice único: 28 | 29 | 5- Elimine el índice común: 30 | 31 | 6- Vea los índices: 32 | -------------------------------------------------------------------------------- /Resolución de problemas/48-AlterTableRename.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla "peliculas", si existe. 2 | 3 | DROP TABLE IF EXISTS peliculas; 4 | 5 | -- 2- Cree la tabla "peliculas": 6 | 7 | CREATE TABLE peliculas( 8 | codigo INT UNSIGNED, 9 | titulo VARCHAR(40), 10 | duracion TINYINT UNSIGNED 11 | ); 12 | 13 | -- 3- Cambie el nombre de la tabla por "films" con "alter table": 14 | 15 | ALTER TABLE peliculas 16 | RENAME films; 17 | 18 | -- 4- Vea si existen las tablas "peliculas" y "films": 19 | 20 | SHOW TABLES; 21 | 22 | -- Vemos que "peliculas" no existe, pero si "films". 23 | 24 | -- 5- Cambie nuevamente el nombre, de la tabla "films" por "peliculas" usando "rename": 25 | 26 | RENAME TABLE films TO peliculas; 27 | 28 | -- 6- vea si existen las tablas: 29 | 30 | SHOW TABLES; 31 | 32 | -- Ahora vemos que existe "peliculas", pero "films" ya no. 33 | -------------------------------------------------------------------------------- /Resolución de problemas/33-IndiceDeTipoPrimary.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla "clientes" si existe. 2 | 3 | DROP TABLE IF EXISTS clientes; 4 | 5 | -- 2- Créela con los siguientes campos y clave: 6 | 7 | CREATE TABLE clientes( 8 | documento CHAR(8), 9 | apellido VARCHAR(20), 10 | nombre VARCHAR(20), 11 | domicilio VARCHAR(30), 12 | PRIMARY KEY(documento) 13 | ); 14 | 15 | -- 3- Vea la estructura de los índices la tabla y analice la información: 16 | 17 | SHOW INDEX FROM clientes; 18 | 19 | /* El índice usa BTREE, que es la estructura más común para búsquedas eficientes. 20 | Es único y no permite valores NULL en las columnas que lo componen. 21 | Aparece en la columna Key_name como "PRIMARY", indicando que es la clave primaria de la tabla. 22 | Seq_in_index = 1, lo que significa que es la primera (y generalmente única) columna en el índice. */ 23 | -------------------------------------------------------------------------------- /Enunciados de problemas/73) Subconsultas (Exists y No Exists): -------------------------------------------------------------------------------- 1 | Subconsultas (Exists y No Exists) 2 | 3 | Problema: 4 | 5 | Un club dicta clases de distintos deportes a sus socios. El club tiene una tabla llamada 6 | "inscriptos" en la cual almacena el número de "socio", el código del deporte en el cual se inscribe 7 | y la cantidad de cuotas pagas (desde 0 hasta 10 que es el total por todo el año), y una tabla 8 | denominada "socios" en la que guarda los datos personales de cada socio. 9 | 10 | 1- Elimine las tablas "socios" e "inscriptos" si ya existen y luego creelas: 11 | 12 | 2- Ingrese algunos registros: 13 | 14 | 3- Emplee una subconsulta con el operador "exists" para devolver la lista de socios que se 15 | 16 | 4- Busque los socios que NO se han inscripto en 'natacion' empleando "not exists". 17 | 18 | 5- Muestre todos los datos de los socios que han pagado todas las cuotas. 19 | -------------------------------------------------------------------------------- /Enunciados de problemas/08) Modificación de registros: -------------------------------------------------------------------------------- 1 | Modificación de registros de una tabla (update) 2 | 3 | Problema: 4 | 5 | Trabaje con la tabla "agenda" que almacena los datos de sus amigos. 6 | 7 | 1- Elimine la tabla si existe. 8 | 9 | 2- Cree la tabla con los campos de apellido, nombre, domicilio y telefono: 10 | 11 | 3- Visualice la estructura de la tabla "agenda". 12 | 13 | 4- Ingrese los siguientes registros: 14 | 15 | Mores,Alberto,Colon 123,4234567, 16 | Torres,Juan,Avellaneda 135,4458787, 17 | Lopez,Mariana,Urquiza 333,4545454, 18 | Lopez,Jose,Urquiza 333,4545454, 19 | Peralta,Susana,Gral. Paz 1234,4123456. 20 | 21 | 5- Modifique el registro cuyo nombre sea "Juan" por "Juan Jose": 22 | 23 | 6- Actualice los registros cuyo número telefónico sea igual a '4545454' por '4445566': 24 | 25 | 7- Actualice los registros que tengan en el campo "nombre" el valor "Juan" por "Juan Jose" 26 | -------------------------------------------------------------------------------- /Enunciados de problemas/05) Consultas básicas II: -------------------------------------------------------------------------------- 1 | -- Recuperación de registros específicos (select - where) -- 2 | 3 | Problema: 4 | Trabajamos con nuestra tabla "agenda". 5 | 6 | 1- Eliminamos "agenda", si existe: 7 | 8 | 2- Creamos la tabla, con los siguientes campos: 9 | nombre, domicilio y telefono. 10 | 11 | 3- Visualice la estructura de la tabla "agenda". 12 | 13 | 4- Ingrese los siguientes registros: 14 | 15 | 'Alberto Mores','Colon 123','4234567', 16 | 'Juan Torres','Avellaneda 135','4458787', 17 | 'Mariana Lopez','Urquiza 333','4545454', 18 | 'Fernando Lopez','Urquiza 333','4545454'. 19 | 20 | 5- Seleccione todos los registros de la tabla. 21 | 22 | 6- Seleccione el registro cuyo nombre sea 'Juan Torres'. 23 | 24 | 7- Seleccione el registro cuyo domicilio sea 'Colon 123'. 25 | 26 | 8- Muestre los datos de quienes tengan el teléfono '4545454'. 27 | 28 | 9- Elimine la tabla "agenda". 29 | -------------------------------------------------------------------------------- /Enunciados de problemas/42) Alter Table - Drop: -------------------------------------------------------------------------------- 1 | Eliminar campos de una tabla (alter table - drop) 2 | 3 | Problema: 4 | 5 | Trabaje con la tabla "peliculas" de un video club. 6 | 7 | 1- Elimine la tabla, si existe. 8 | 9 | 2- Cree la tabla con la siguiente estructura: 10 | 11 | create table peliculas( 12 | codigo int unsigned auto_increment, 13 | nombre varchar(30) not null, 14 | protagonista varchar(20), 15 | actorsecundario varchar(20), 16 | director varchar(25), 17 | duracion tinyint unsigned, 18 | primary key(codigo), 19 | index i_director (director) 20 | ); 21 | 22 | 3- Ingrese algunos registros. 23 | 24 | 4- Vea los índices: 25 | 26 | 5- Elimine el campo "director": 27 | 28 | 6- Visualice la estructura modificada: 29 | 30 | 7- Vea los índices: 31 | 32 | 8- Intente eliminar un campo inexistente: 33 | 34 | 9- Elimine los campos "actorsecundario" y "duracion" en una misma sentencia: 35 | -------------------------------------------------------------------------------- /Enunciados de problemas/36) Drop Index: -------------------------------------------------------------------------------- 1 | Borrar indice (drop index) 2 | 3 | Problema: 4 | 5 | Un instituto de enseñanza guarda los datos de sus alumnos en una tabla llamada "alumnos". 6 | 7 | 1- Elimine la tabla si existe. 8 | 9 | 2- Cree la tabla con la siguiente estructura: 10 | 11 | create table alumnos( 12 | año year not null, 13 | numero int unsigned not null, 14 | nombre varchar(30), 15 | documento char(8) not null, 16 | domicilio varchar(30), 17 | ciudad varchar(20), 18 | provincia varchar(20), 19 | primary key(año,numero), 20 | unique i_documento (documento), 21 | index i_ciudadprovincia (ciudad,provincia) 22 | ); 23 | 24 | 3- Vea los índices de la tabla. 25 | 26 | 4- Elimine el índice "i_ciudadprovincia". 27 | 28 | 5- Verifique la eliminación. 29 | 30 | 6- Intente eliminar el índice PRIMARY. 31 | 32 | 7- Elimine el índice único. 33 | 34 | 8- Verifique nuevamente la eliminación. 35 | -------------------------------------------------------------------------------- /Resolución de problemas/47-AlterTableDropIndex.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla "alumnos" si existe. 2 | 3 | DROP TABLE IF EXISTS alumnos; 4 | 5 | -- 2- Cree la tabla con los siguientes índices: 6 | 7 | CREATE TABLE alumnos( 8 | año YEAR NOT NULL, 9 | numero INT UNSIGNED NOT NULL, 10 | nombre VARCHAR(30), 11 | documento CHAR(8) NOT NULL, 12 | domicilio VARCHAR(30), 13 | ciudad VARCHAR(20), 14 | provincia VARCHAR(20), 15 | PRIMARY KEY(año,numero), 16 | UNIQUE i_documento (documento), 17 | INDEX i_ciudadprovincia (ciudad,provincia) 18 | ); 19 | 20 | -- 3- Vea los índices de la tabla. 21 | 22 | SHOW INDEX FROM alumnos; 23 | 24 | -- 4- Elimine el índice único: 25 | 26 | ALTER TABLE alumnos 27 | DROP INDEX i_documento; 28 | 29 | -- 5- Elimine el índice común: 30 | 31 | ALTER TABLE alumnos 32 | DROP INDEX i_ciudadprovincia; 33 | 34 | -- 6- Vea los índices: 35 | 36 | SHOW INDEX FROM alumnos; 37 | -------------------------------------------------------------------------------- /Enunciados de problemas/18) Atributo Zerofill: -------------------------------------------------------------------------------- 1 | Atributo zerofill en una columna de una tabla. 2 | 3 | Problema: 4 | 5 | Un banco tiene registrados las cuentas corrientes de sus clientes en una tabla llamada "cuentas". 6 | 7 | 1- Elimine la tabla, si existe. 8 | 9 | 2- Cree y utilice la siguiente tabla: 10 | 11 | create table cuentas( 12 | numero int(8) zerofill auto_increment, 13 | documento char(8) not null, 14 | nombre varchar(30), 15 | saldo decimal(9,2), 16 | primary key(numero) 17 | ); 18 | 19 | 3- Visualice la estructura de la tabla: 20 | 21 | 4- Ingrese los siguientes registros: 22 | 23 | (1234,'22333444','Juan Perez',2000.60); 24 | (2566,'23333444','Maria Pereyra',5050); 25 | (5987,'24333444','Marcos Torres',200); 26 | (14434,'25333444','Ana Juarez',8000.60); 27 | 28 | 5- Vea cómo se guardaron los números de cuenta: 29 | 30 | 6- Ingrese un valor negativo para el número de cuenta y cuente que sucede. 31 | -------------------------------------------------------------------------------- /Resolución de problemas/13-ValoresUnsigned.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla "peliculas", si existe. 2 | 3 | DROP TABLE IF EXISTS peliculas; 4 | 5 | -- 2- Cree la tabla "peliculas" teniendo en cuenta el rango de valores que almacenará cada campo: 6 | 7 | -- -codigo: entero a partir de 1, autoincrementable, 8 | -- -titulo: caracteres de 40 de longitud, no nulo, 9 | -- -actor: cadena de 20, 10 | -- -duracion: float positivo, 11 | -- -clave primaria: codigo. 12 | 13 | CREATE TABLE peliculas( 14 | codigo INTEGER UNSIGNED AUTO_INCREMENT, 15 | titulo VARCHAR(40) NOT NULL, 16 | actor VARCHAR(20), 17 | duracion FLOAT UNSIGNED, 18 | PRIMARY KEY(codigo) 19 | ); 20 | 21 | -- Al crear la tabla, MySQL nos tira un "warning" que no es aconsejable usar "Unsigned" en tipos de datos númericos. 22 | -- Además, será removido en proximás actualizaciones 23 | 24 | -- 3- Visualice la estructura de la tabla. 25 | 26 | DESCRIBE peliculas; 27 | -------------------------------------------------------------------------------- /Resolución de problemas/46-AlterTableAddIndex.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla "alumnos" si existe. 2 | 3 | DROP TABLE IF EXISTS alumnos; 4 | 5 | -- 2- Cree la tabla: 6 | 7 | CREATE TABLE alumnos( 8 | legajo INT UNSIGNED AUTO_INCREMENT, 9 | nombre VARCHAR(30), 10 | documento CHAR(8) NOT NULL, 11 | domicilio VARCHAR(30), 12 | ciudad VARCHAR(20), 13 | provincia VARCHAR(20), 14 | PRIMARY KEY(legajo) 15 | ); 16 | 17 | -- 3- Vea los índices de la tabla. 18 | 19 | SHOW INDEX FROM alumnos; 20 | 21 | -- 4- Agregue un índice común por los campos "ciudad" y "provincia" (que pueden repetirse): 22 | 23 | ALTER TABLE alumnos 24 | ADD INDEX i_ciudadprovincia(ciudad,provincia); 25 | 26 | -- 5- Agregue un índice único (no pueden repetirse los valores) por el campo "documento": 27 | 28 | ALTER TABLE alumnos 29 | ADD UNIQUE INDEX i_documento (documento); 30 | 31 | -- 6- Visualice los índices: 32 | 33 | SHOW INDEX FROM alumnos; 34 | -------------------------------------------------------------------------------- /Enunciados de problemas/81) Procedimientos Almacenados III: -------------------------------------------------------------------------------- 1 | Procedimientos almacenados (parámetros de salida) 2 | 3 | Problema: 4 | 5 | Una empresa almacena los datos de sus empleados en una tabla llamada "empleados". 6 | 7 | 1- Eliminamos la tabla, si existe y la creamos: 8 | 9 | create table empleados( 10 | documento char(8), 11 | nombre varchar(20), 12 | apellido varchar(20), 13 | sueldo decimal(6,2), 14 | cantidadhijos int, 15 | seccion varchar(20), 16 | primary key(documento) 17 | ); 18 | 19 | 2- Ingrese algunos registros: 20 | 21 | 3- Elimine el procedimiento llamado "pa_seccion" si existe: 22 | 23 | 4- Cree un procedimiento almacenado llamado "pa_seccion" al cual le enviamos el nombre de una 24 | sección y que nos retorne el promedio de sueldos de todos los empleados de esa sección y el valor 25 | mayor de sueldo (de esa sección) 26 | 27 | 5- Ejecute el procedimiento creado anteriormente con distintos valores. 28 | -------------------------------------------------------------------------------- /Enunciados de problemas/03) Tipos de Datos (Básicos): -------------------------------------------------------------------------------- 1 | -- Típos de datos básicos de un campo de una tabla. -- 2 | 3 | Problema: 4 | Un videoclub que alquila películas en video almacena la información de sus películas en una tabla 5 | llamada "peliculas"; para cada película necesita los siguientes datos: 6 | 7 | -nombre, cadena de caracteres de 20 de longitud, 8 | -actor, cadena de caracteres de 20 de longitud, 9 | -duración, valor numérico entero. 10 | -cantidad de copias: valor entero. 11 | 12 | 1- Elimine la tabla, si existe: 13 | 14 | 2- Cree la tabla eligiendo el tipo de dato adecuado para cada campo: 15 | 16 | 3- Vea la estructura de la tabla: 17 | 18 | 4- Ingrese los siguientes registros: 19 | 20 | ('Mision imposible','Tom Cruise',120,3); 21 | ('Mision imposible 2','Tom Cruise',180,2); 22 | ('Mujer bonita','Julia R.',90,3); 23 | ('Elsa y Fred','China Zorrilla',90,2); 24 | 25 | 5- Muestre todos los registros: 26 | 27 | 28 | -------------------------------------------------------------------------------- /Enunciados de problemas/72) Subconsultas correlacionadas: -------------------------------------------------------------------------------- 1 | Subconsultas correlacionadas 2 | 3 | Problema: 4 | 5 | Un club dicta clases de distintos deportes a sus socios. El club tiene una tabla llamada 6 | "inscriptos" en la cual almacena el número de "socio", el código del deporte en el cual se inscribe 7 | y la cantidad de cuotas pagas (desde 0 hasta 10 que es el total por todo el año), y una tabla 8 | denominada "socios" en la que guarda los datos personales de cada socio. 9 | 10 | 1- Cree las tablas y bórrelas primero si ya existen: 11 | 12 | 2- Ingrese algunos registros: 13 | 14 | 3- Se necesita un listado de todos los socios que incluya nombre y domicilio, la cantidad de 15 | deportes a los cuales se ha inscripto, empleando subconsulta. 16 | 17 | 4- Se necesita el nombre de todos los socios, el total de cuotas que debe pagar (10 por cada 18 | deporte) y el total de cuotas pagas, empleando subconsulta. 19 | 20 | 5- Obtenga la misma salida anterior empleando join. 21 | -------------------------------------------------------------------------------- /Enunciados de problemas/45) Alter Table para Primary key: -------------------------------------------------------------------------------- 1 | Agregar y eliminar la clave primaria (alter table) 2 | 3 | Problema: 4 | 5 | Trabaje con la tabla llamada "medicamentos" de una farmacia. 6 | 7 | 1- Elimine la tabla, si existe: 8 | 9 | 2- Cree la tabla con la siguiente estructura: 10 | 11 | create table medicamentos( 12 | codigo int unsigned not null, 13 | nombre varchar(20) not null, 14 | laboratorio varchar(20), 15 | precio decimal(6,2) unsigned 16 | ); 17 | 18 | 3- Visualice la estructura de la tabla "medicamentos". 19 | 20 | 4- Agregue una clave primaria por "codigo": 21 | 22 | 5- Modifique el campo convirtiéndolo en autoincrementable: 23 | 24 | 6- Veamos los registros: 25 | 26 | 7- Ingrese los registros: 27 | 28 | ('Paracetamol 500','Bago',1.90); 29 | ('Bayaspirina','Bayer',2.10); 30 | 31 | 8- Intente eliminar la clave primaria: 32 | 33 | 9- Modifique el campo "codigo" quitándole el atributo "auto_increment": 34 | 35 | 10- Elimine la clave primaria: 36 | -------------------------------------------------------------------------------- /Enunciados de problemas/51) Blob y Text: -------------------------------------------------------------------------------- 1 | Tipos de datos blob y text. 2 | 3 | Problema: 4 | 5 | Una inmobiliaria guarda los datos de sus inmuebles en venta en una tabla llamada "inmuebles". 6 | 7 | 1- Elimine la tabla si existe: 8 | 9 | 2- Cree la tabla: 10 | 11 | create table inmuebles( 12 | codigo int unsigned auto_increment, 13 | domicilio varchar(30), 14 | barrio varchar(20), 15 | detalles text, 16 | primary key(codigo) 17 | ); 18 | 19 | 3- Ingrsee algunos registros: 20 | 21 | (1,'Colon 123','Centro','patio, 3 dormitorios, garage doble, pileta, 22 | asador, living, cocina, comedor, escritorio, 2 baños'); 23 | (2,'Caseros 345','Centro','patio, 2 dormitorios, cocina- comedor, 24 | living'); 25 | (3,'Sucre 346','Alberdi','2 dormitorios, problemas de humedad'); 26 | (4,'Sarmiento 832','Gral. Paz','3 dormitorios, garage, 2 patios'); 27 | (5,'Avellaneda 384','Centro',' 2 patios, 2 dormitorios, garage'); 28 | 29 | 4- Busque todos los inmuebles que tengan "patio": 30 | 31 | -------------------------------------------------------------------------------- /Enunciados de problemas/53) Funcion CASE: -------------------------------------------------------------------------------- 1 | Funciones de control de flujo (case) 2 | 3 | Problema: 4 | 5 | Un profesor guarda los promedios de sus alumnos de un curso en una tabla llamada "alumnos". 6 | 7 | 1- Elimine la tabla si existe. 8 | 9 | 2- Cree la tabla: 10 | 11 | create table alumnos( 12 | legajo char(5) not null, 13 | nombre varchar(30), 14 | promedio decimal(4,2) 15 | ); 16 | 17 | 3- Ingrese los siguientes registros: 18 | 19 | (3456,'Perez Luis',8.5); 20 | (3556,'Garcia Ana',7.0); 21 | (3656,'Ludueña Juan',9.6); 22 | (2756,'Moreno Gabriela',4.8); 23 | (4856,'Morales Hugo',3.2); 24 | (7856,'Gomez Susana',6.4); 25 | 26 | 4- Si el alumno tiene un promedio menor a 4, muestre un mensaje "reprobado", si el promedio es 27 | mayor o igual a 4 y menor a 7, muestre "regular", si el promedio es mayor o igual a 7, 28 | muestre "promocionado", usando la primer sintaxis de "case": 29 | 30 | 5- Obtenga la misma salida anterior pero empleando la sintaxis resumida de "case": 31 | -------------------------------------------------------------------------------- /Enunciados de problemas/09) Primary Key: -------------------------------------------------------------------------------- 1 | Clave primaria. 2 | 3 | Problema: 4 | 5 | Trabaje con la tabla "libros" de una librería. 6 | 7 | 1- Elimine la tabla si existe. 8 | 9 | 2- Créela con los siguientes campos y clave: codigo (integer), titulo (cadena de 20 caracteres de longitud), 10 | autor (cadena de 30), editorial (cadena de 15), codigo será clave primaria: 11 | 12 | 3- Visualice la estructura de la tabla "libros", compruebe la clave primaria. 13 | 14 | 4- Ingrese los siguientes registros: 15 | 16 | 1,El aleph,Borges,Planeta; 17 | 2,Martin Fierro,Jose Hernandez,Emece; 18 | 3,Aprenda PHP,Mario Molina,Emece; 19 | 4,Cervantes y el quijote,Borges,Paidos; 20 | 5,Matematica estas ahi, Paenza, Paidos; 21 | 22 | 5- Seleccione todos los registros. 23 | 24 | 6- Ingrese un registro con código no repetido y nombre de autor repetido. 25 | 26 | 7- Ingrese un registro con código no repetido y título y editorial repetidos. 27 | 28 | 8- Intente ingresar un registro que repita el campo clave. 29 | -------------------------------------------------------------------------------- /Enunciados de problemas/35) Unique: -------------------------------------------------------------------------------- 1 | Indice único (unique) 2 | 3 | Problema: 4 | 5 | Un instituto de enseñanza guarda los siguientes datos de sus alumnos: 6 | 7 | - año de inscripción, 8 | - número de inscripto, comienza desde 1 cada año, 9 | - nombre del alumno, 10 | - documento del alumno, 11 | - domicilio, 12 | - ciudad, 13 | - provincia, 14 | - clave primaria: número de inscripto y año de inscripción. 15 | 16 | 1- Elimine la tabla "alumnos" si existe. 17 | 18 | 2- Cree la tabla definiendo una clave primaria compuesta (año de inscripción y número de 19 | inscripto), un índice único por el campo "documento" y un índice común por ciudad y provincia: 20 | 21 | 3- Vea los índices de la tabla. 22 | 23 | 4- Ingrese algunos registros. Ingrese 2 ó 4 alumnos para los años 2004, 2005 y 2006. 24 | 25 | 5- Intente ingresar un alumno con clave primaria repetida. 26 | 27 | 6- Intente ingresar un alumno con documento repetido. 28 | 29 | 7- Ingrese varios alumnos de la misma ciudad y provincia. 30 | -------------------------------------------------------------------------------- /Enunciados de problemas/63) Cross Join II: -------------------------------------------------------------------------------- 1 | Varios clubes de barrio se organizaron para realizar campeonatos entre ellos. La tabla 2 | llamada "equipos" guarda la información de los distintos equipos que jugarán. 3 | 4 | 1- Elimine la tabla "equipos", si existe. 5 | 6 | 2- Cree la tabla: 7 | 8 | create table equipos( 9 | nombre varchar(30), 10 | barrio varchar(20), 11 | domicilio varchar(30), 12 | entrenador varchar(30) 13 | ); 14 | 15 | 3- Ingrese los siguientes registros: 16 | 17 | ('Los tigres','Gral. Paz','Sarmiento 234','Juan Lopez'); 18 | ('Los leones','Centro','Colon 123','Gustavo Fuentes'); 19 | ('Campeones','Pueyrredon','Guemes 346','Carlos Moreno'); 20 | ('Cebollitas','Alberdi','Colon 1234','Luis Duarte'); 21 | 22 | 4- Cada equipo jugará con todos los demás 2 veces, una vez en cada sede. Realice un "cross join" 23 | para combinar los equipos teniendo en cuenta que un equipo no juega consigo mismo: 24 | 25 | 5- Obtenga el mismo resultado empleando un "join" sin parte "on": 26 | -------------------------------------------------------------------------------- /Resolución de problemas/34-Index.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla "medicamentos", si existe. 2 | 3 | DROP TABLE IF EXISTS medicamentos; 4 | 5 | -- 2- Cree la tabla e indéxela por el campo "laboratorio": 6 | 7 | CREATE TABLE medicamentos( 8 | codigo INT UNSIGNED AUTO_INCREMENT, 9 | nombre VARCHAR(20) NOT NULL, 10 | laboratorio VARCHAR(20), 11 | precio DECIMAL(6,2) UNSIGNED, 12 | cantidad INT UNSIGNED, 13 | PRIMARY KEY(codigo), 14 | INDEX i_laboratorio (laboratorio) 15 | ); 16 | 17 | -- 3- Visualice los índices de la tabla "medicamentos" y analice la información: 18 | 19 | SHOW INDEX FROM medicamentos; 20 | 21 | /* Este índice mejora la velocidad de las consultas que filtran, buscan o ordenan por 22 | la columna laboratorio. En lugar de recorrer toda la tabla, MySQL usa el índice para 23 | encontrar los datos más rápido. 24 | En este caso, MySQL usará el índice i_laboratorio para buscar solo las filas que coincidan, 25 | en lugar de escanear toda la tabla. */ 26 | -------------------------------------------------------------------------------- /Enunciados de problemas/06) Operadores Racionales: -------------------------------------------------------------------------------- 1 | Operadores Relacionales = <> < <= > >= 2 | 3 | Problema: 4 | 5 | Un comercio que vende artículos de computación registra los datos de sus artículos 6 | en una tabla con ese nombre. 7 | 8 | 1- Elimine "articulos", si existe: 9 | 10 | 2- Cree la tabla, que contenga codigo, nombre, descripcion, precio y cantidad: 11 | 12 | 3- Vea la estructura de la tabla. 13 | 14 | 4- Ingrese algunos registros: 15 | 16 | (1,'impresora','Epson Stylus C45',400.80,20); 17 | (2,'impresora','Epson Stylus C85',500,30); 18 | (3,'monitor','Samsung 14',800,10); 19 | (4,'teclado','ingles Biswal',100,50); 20 | (5,'teclado','español Biswal',90,50); 21 | 22 | 5- Seleccione todos los registros de la tabla. 23 | 24 | 6- Muestre los datos de las impresoras. 25 | 26 | 7- Seleccione los artículos cuyo precio sea mayor o igual a 500: 27 | 28 | 8- Seleccione los artículos cuya cantidad sea menor a 30: 29 | 30 | 9- Selecciones el nombre y descripción de los artículos que no cuesten $100: 31 | -------------------------------------------------------------------------------- /Enunciados de problemas/11) Comando Truncate Table: -------------------------------------------------------------------------------- 1 | Comando truncate table. 2 | 3 | Problema: 4 | 5 | Una farmacia guarda información referente a sus medicamentos en una tabla llamada "medicamentos". 6 | 7 | 1- Elimine la tabla "medicamentos", si existe: 8 | 9 | 2- Cree la tabla con los siguiente campos: codigo (con primary key), nombre, laboratorio, precio y cantidad. 10 | 11 | 3- Ingrese los siguientes registros: 12 | 13 | ('Sertal','Roche',5.2,100); 14 | ('Buscapina','Roche',4.10,200); 15 | ('Amoxidal 500','Bayer',15.60,100); 16 | 17 | 4- Elimine todos los registros con "delete": 18 | 19 | 5- Ingrese 2 registros: 20 | 21 | ('Sertal','Roche',5.2,100); 22 | ('Amoxidal 500','Bayer',15.60,100); 23 | 24 | 6- Vea los registros para verificar que continuó la secuencia al generar el valor para "codigo": 25 | 26 | 7- Vacíe la tabla: 27 | 28 | 8- Ingrese el siguiente registro: 29 | 30 | ('Buscapina','Roche',4.10,200); 31 | 32 | 9- Vea los registros para verificar que al cargar el código reinició la secuencia en 1. 33 | -------------------------------------------------------------------------------- /Enunciados de problemas/70) Subconsultas con IN: -------------------------------------------------------------------------------- 1 | Subconsultas con in 2 | 3 | Problema: 4 | 5 | Una empresa tiene registrados sus clientes en una tabla llamada "clientes", también tiene una tabla 6 | "ciudades" donde registra los nombres de las ciudades. 7 | 8 | 1- Cree la tabla "clientes"(codigo, nombre, domicilio, ciudad, codigociudad) y "ciudades"(codigo, 9 | nombre). Agregue una restricción "primary key" para el campo "codigo" de ambas tablas): 10 | 11 | 2- Ingrese algunos registros para ambas tablas: 12 | 13 | 3- Necesitamos conocer los nombres de las ciudades de aquellos clientes cuyo domicilio es en calle 14 | "San Martin", empleando subconsulta 15 | 16 | 4- Obtenga la misma salida anterior pero empleando join. 17 | 18 | 5- Obtenga los nombre de las ciudades de los clientes cuyo apellido no comienza con una letra 19 | específica, empleando subconsulta. 20 | 21 | 6- Pruebe la subconsulta del punto 5 separada de la consulta exterior para verificar que retorna 22 | una lista de valores de un solo campo. 23 | -------------------------------------------------------------------------------- /Resolución de problemas/03-TiposDeDatos(Basicos).sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla, si existe: 2 | 3 | DROP TABLE IF EXISTS peliculas; 4 | 5 | -- 2- Cree la tabla eligiendo el tipo de dato adecuado para cada campo: 6 | 7 | CREATE TABLE peliculas( 8 | nombre VARCHAR(20), 9 | actor VARCHAR(20), 10 | duracion INTEGER, 11 | cantidad INTEGER 12 | ); 13 | 14 | -- 3- Vea la estructura de la tabla: 15 | 16 | DESCRIBE peliculas; 17 | 18 | -- 4- Ingrese los siguientes registros: 19 | 20 | -- ('Mision imposible','Tom Cruise',120,3); 21 | -- ('Mision imposible 2','Tom Cruise',180,2); 22 | -- ('Mujer bonita','Julia R.',90,3); 23 | -- ('Elsa y Fred','China Zorrilla',90,2); 24 | 25 | INSERT INTO peliculas (nombre, actor, duracion, cantidad) 26 | VALUES ('Mision imposible','Tom Cruise',120,3), 27 | ('Mision imposible 2','Tom Cruise',180,2), 28 | ('Mujer bonita','Julia R.',90,3), 29 | ('Elsa y Fred','China Zorrilla',90,2); 30 | 31 | -- 5- Muestre todos los registros: 32 | 33 | SELECT * FROM peliculas; 34 | -------------------------------------------------------------------------------- /Enunciados de problemas/10) Autoincremento: -------------------------------------------------------------------------------- 1 | Campo entero con autoincremento. 2 | 3 | Problema: 4 | 5 | Una farmacia guarda información referente a sus medicamentos en una tabla 6 | llamada "medicamentos". 7 | 8 | 1- Elimine la tabla,si existe: 9 | 10 | 2- Cree la tabla con los siguientes datos: codigo (con primary key), nombre, laboratorio, precio y cantidad. 11 | 12 | 3- Visualice la estructura de la tabla "medicamentos". 13 | 14 | 4- Ingrese los siguientes registros: 15 | 16 | ('Sertal','Roche',5.2,100); 17 | ('Buscapina','Roche',4.10,200); 18 | ('Amoxidal 500','Bayer',15.60,100); 19 | 20 | 5- Verifique que el campo "código" generó los valores de modo automático: 21 | 22 | 6- Intente ingresar un registro con un valor de clave primaria repetido. 23 | 24 | 7- Ingrese un registro con un valor de clave primaria no repetido salteando la secuencia: 25 | 26 | 8- Ingrese el siguiente registro: 27 | 28 | INSERT INTO medicamentos (nombre, laboratorio,precio,cantidad) 29 | VALUES('Bayaspirina','Bayer',2.10,150); -- Note que la secuencia sigue 30 | -------------------------------------------------------------------------------- /Enunciados de problemas/16) Tipos de Datos (Fecha y Hora): -------------------------------------------------------------------------------- 1 | Tipos de datos (fechas y horas) 2 | 3 | Problema: 4 | 5 | Una concesionaria de autos vende autos usados. Guarda los siguientes datos en la tabla "autos": 6 | 7 | - marca (fiat 128, renault 11, peugeot 505, etc.) 8 | - modelo (año) 9 | - dueño (nombre del dueño) 10 | - precio (valor con decimales positivo que puede llegar hasta 999999.99 aprox.). 11 | 12 | 1- Elimine la tabla si existe. 13 | 14 | 2- Cree la tabla eligiendo el tipo de dato adecuado para almacenar estos datos: 15 | 16 | 3- Ingrese los siguientes registros: 17 | 18 | ('Fiat 128','1970','Juan Lopez',50000); 19 | ('Renault 11','1990','Juan Lopez',80000); 20 | ('Fiat 128','1971','Ana Ferreyra',51000); 21 | ('Peugeot 505','1998','Luis Luque',99000); 22 | ('Peugeot 505','1997','Carola Perez',85000); 23 | 24 | 4- Seleccione todos los autos cuyo modelo sea menor a "1995": 25 | 26 | 5- Muestre la marca y modelo de los autos que no sean de "1970": 27 | 28 | 6- Ingrese un auto con el valor para "modelo" de tipo numérico: 29 | -------------------------------------------------------------------------------- /Resolución de problemas/04-ConsultasBasicasI.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla, si existe: 2 | 3 | DROP TABLE IF EXISTS peliculas; 4 | 5 | -- 2- Cree la tabla eligiendo el tipo de dato adecuado para cada campo: 6 | 7 | CREATE TABLE peliculas( 8 | nombre VARCHAR(20), 9 | actor VARCHAR(20), 10 | duracion INTEGER, 11 | cantidad INTEGER 12 | ); 13 | 14 | -- 3- Vea la estructura de la tabla: 15 | 16 | DESCRIBE peliculas; 17 | 18 | -- 4- Ingrese los siguientes registros: 19 | 20 | -- ('Mision imposible','Tom Cruise',120,3); 21 | -- ('Mision imposible 2','Tom Cruise',180,2); 22 | -- ('Mujer bonita','Julia R.',90,3); 23 | -- ('Elsa y Fred','China Zorrilla',90,2); 24 | 25 | -- 5- Realice un "select" mostrando solamente el nombre y actor de todas las películas: 26 | 27 | SELECT nombre, actor FROM peliculas; 28 | 29 | -- 6- Muestre el nombre y duración de todas las peliculas. 30 | 31 | SELECT nombre, duracion FROM peliculas; 32 | 33 | -- 7- Muestre el nombre y la cantidad de copias. 34 | 35 | SELECT nombre, cantidad FROM peliculas; 36 | -------------------------------------------------------------------------------- /Enunciados de problemas/76) Subconsulta (Insert): -------------------------------------------------------------------------------- 1 | Subconsulta (insert) 2 | 3 | Problema: 4 | 5 | Un comercio que vende artículos de librería y papelería almacena la información de sus ventas en una 6 | tabla llamada "facturas" y otra "clientes". 7 | 8 | 1-Cree las tablas (las borramos primero si ya existen): 9 | 10 | create table clientes( 11 | codigo int auto_increment, 12 | nombre varchar(30), 13 | domicilio varchar(30), 14 | primary key(codigo) 15 | ); 16 | 17 | create table facturas( 18 | numero int not null, 19 | fecha date, 20 | codigocliente int not null, 21 | total decimal(6,2), 22 | primary key(numero) 23 | ); 24 | 25 | 2-Ingrese algunos registros: 26 | 27 | 3- El comercio necesita una tabla llamada "clientespref" en la cual quiere almacenar el nombre y 28 | domicilio de aquellos clientes que han comprado hasta el momento más de 500 pesos en mercaderías. 29 | 30 | 4- Ingrese los registros en la tabla "clientespref" seleccionando registros de la tabla "clientes" y 31 | "facturas". 32 | 33 | 5- Vea los registros de "clientespref": 34 | -------------------------------------------------------------------------------- /Enunciados de problemas/64) Cross Join III: -------------------------------------------------------------------------------- 1 | Una agencia matrimonial almacena la información de sus clientes en una tabla llamada "clientes". 2 | 3 | 1- Elimine la tabla "clientes" si existe: 4 | 5 | 2- Cree la tabla: 6 | 7 | create table clientes( 8 | nombre varchar(30), 9 | domicilio varchar(30), 10 | sexo char(1), 11 | edad tinyint 12 | ); 13 | 14 | 3- Ingrese los siguientes registros: 15 | 16 | ('Juan Perez','m',45); 17 | ('Ana Lopez','f',50); 18 | ('Federico Herrero','m',30); 19 | ('Mariano Juarez','m',35); 20 | ('Maria Torres','f',36); 21 | ('Ines Duarte','f',55); 22 | ('Alejandra Figueroa','f',40); 23 | 24 | 4- La agencia necesita la combinación de todas las personas de sexo femenino con las de sexo 25 | masculino. Use un "join" sin parte "on" y establezca como condición que las personas de la 26 | primera tabla sean de sexo femenino y las de la segunda tabla de sexo masculino: 27 | 28 | 5- Obtenga la misma salida usando "cross join": 29 | 30 | 6- Se pide, además, que las edades de las posibles parejas no tengan una diferencia superior a 31 | 10 años: 32 | -------------------------------------------------------------------------------- /Resolución de problemas/69-SubconsultasComoExpresion.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla "alumnos" si existe y luego Créela 2 | 3 | DROP TABLE IF EXISTS alumnos; 4 | 5 | CREATE TABLE alumnos( 6 | documento CHAR(8), 7 | nombre VARCHAR(30), 8 | nota DECIMAL(4,2), 9 | PRIMARY KEY(documento) 10 | ); 11 | 12 | -- 2-Ingrese algunos registros: 13 | 14 | INSERT INTO alumnos 15 | VALUES('30111111','Ana Algarbe',5.1), 16 | ('30222222','Bernardo Bustamante',3.2), 17 | ('30333333','Carolina Conte',4.5), 18 | ('30444444','Diana Dominguez',9.7), 19 | ('30555555','Fabian Fuentes',8.5), 20 | ('30666666','Gaston Gonzalez',9.70); 21 | 22 | -- 3- Obtenga todos los datos de los alumnos con la nota más alta, empleando subconsulta: 23 | 24 | SELECT * FROM 25 | alumnos 26 | WHERE nota=(SELECT MAX(nota) FROM alumnos); 27 | 28 | /* 4- Muestre los alumnos que tienen una nota menor al promedio, su nota, y la diferencia con el 29 | promedio. */ 30 | 31 | SELECT *, 32 | (SELECT AVG(nota) FROM alumnos)-nota AS diferencia 33 | FROM alumnos 34 | WHERE nota< 35 | (SELECT AVG(nota) FROM alumnos); 36 | -------------------------------------------------------------------------------- /Enunciados de problemas/23) Operadores Relacionales: -------------------------------------------------------------------------------- 1 | Otros operadores relacionales (between - in) 2 | 3 | Problema: 4 | 5 | Trabaje con la tabla llamada "medicamentos" de una farmacia. 6 | 7 | 1- Elimine la tabla "medicamentos", si existe. 8 | 9 | 2- Cree y utilice la tabla con la siguiente estructura: 10 | 11 | create table medicamentos( 12 | codigo int unsigned auto_increment, 13 | nombre varchar(20), 14 | laboratorio varchar(20), 15 | precio decimal(5,2) unsigned, 16 | cantidad int unsigned, 17 | primary key(codigo) 18 | ); 19 | 20 | 3- Visualice la estructura de la tabla "medicamentos". 21 | 22 | 4- Ingrese los siguientes registros: 23 | 24 | ('Sertal','Roche',5.2,100); 25 | ('Buscapina','Roche',4.10,200); 26 | ('Amoxidal 500','Bayer',15.60,100); 27 | ('Paracetamol 500','Bago',1.90,200); 28 | ('Bayaspirina','Bayer',2.10,150); 29 | ('Amoxidal jarabe','Bayer',5.10,250); 30 | 31 | 5- Recupere los nombres y precios de los medicamentos cuyo precio esté entre 5 y 15: 32 | 33 | 6- Seleccione los registros cuyo laboratorio sea "Bayer" o "Bago": 34 | 35 | 7- Elimine los registros cuya cantidad esté entre 100 y 200: 36 | -------------------------------------------------------------------------------- /Resolución de problemas/01-TablayCampos.sql: -------------------------------------------------------------------------------- 1 | CREATE DATABASE challenge; 2 | 3 | USE challenge; 4 | 5 | -- 1- Elimine la tabla "agenda" si existe 6 | 7 | DROP TABLE IF EXISTS agenda; 8 | 9 | -- 2- Cree una tabla llamada "agenda", debe tener campos de nombre, domicilio y telefono: 10 | 11 | CREATE TABLE agenda( 12 | nombre VARCHAR(20), 13 | domicilio VARCHAR(30), 14 | telefono VARCHAR(11) 15 | ); 16 | 17 | -- 3- Intente crearla nuevamente. 18 | 19 | CREATE TABLE agenda( 20 | nombre VARCHAR(20), 21 | domicilio VARCHAR(30), 22 | telefono VARCHAR(11) 23 | ); 24 | 25 | -- aparece el error 1050. "Table 'agenda' already exists 26 | 27 | -- 4- Visualice las tablas existentes. 28 | 29 | SHOW TABLES; 30 | 31 | -- 5- Visualice la estructura de la tabla "agenda". 32 | 33 | DESCRIBE agenda; 34 | 35 | -- 6- Elimine la tabla, si existe. 36 | 37 | DROP TABLE IF EXISTS agenda; 38 | 39 | -- 7- Intente eliminar la tabla sin la cláusula if exists. Debe aparecer un mensaje de error cuando no existe la tabla. 40 | 41 | DROP TABLE IF EXISTS agenda; 42 | 43 | -- aparece un warning 1051, "Unkown table 'challenge.agenda'. 44 | -------------------------------------------------------------------------------- /Enunciados de problemas/21) Cláusula Order By: -------------------------------------------------------------------------------- 1 | Cláusula order by del select. 2 | 3 | Problema: 4 | 5 | Trabaje con la tabla llamada "medicamentos" que almacena la información de los productos que vende 6 | una farmacia. 7 | 8 | 1- Elimine la tabla "medicamentos", si existe. 9 | 10 | 2- Cree y utilice la tabla con la siguiente estructura: 11 | 12 | create table medicamentos( 13 | codigo int unsigned auto_increment, 14 | nombre varchar(20), 15 | laboratorio varchar(20), 16 | precio decimal(5,2), 17 | cantidad int unsigned, 18 | primary key(codigo) 19 | ); 20 | 21 | 3- Visualice la estructura de la tabla "medicamentos". 22 | 23 | 4- Ingrese los siguientes registros): 24 | 25 | ('Sertal','Roche',5.2,100); 26 | ('Buscapina','Roche',4.10,200); 27 | ('Amoxidal 500','Bayer',15.60,100); 28 | ('Paracetamol 500','Bago',1.90,200); 29 | ('Bayaspirina','Bayer',2.10,150); 30 | ('Amoxidal jarabe','Bayer',5.10,250); 31 | 32 | 5- Ordene los registros por precio, de mayor a menor. 33 | 34 | 6- Ordene los medicamentos por número del campo "cantidad". 35 | 36 | 7- Ordene los registros por "laboratorio" (descendente) y cantidad (ascendente). 37 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Agustin Musanti 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Resolución de problemas/43-AlterTableModify.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla "peliculas", si existe. 2 | 3 | DROP TABLE IF EXISTS peliculas; 4 | 5 | -- 2- Cree la tabla con la siguiente estructura: 6 | 7 | CREATE TABLE peliculas( 8 | codigo INT UNSIGNED, 9 | nombre VARCHAR(20) NOT NULL, 10 | actor VARCHAR(20), 11 | director VARCHAR(25), 12 | duracion TINYINT 13 | ); 14 | 15 | 16 | -- 3- Modifique el campo "duracion" por tinyint unsigned. 17 | 18 | ALTER TABLE peliculas 19 | MODIFY duracion TINYINT UNSIGNED; 20 | 21 | -- 4- Modifique el campo "nombre" para almacenar una longitud de 40 caracteres y que no permita valores nulos: 22 | 23 | ALTER TABLE peliculas 24 | MODIFY nombre VARCHAR(40) NOT NULL; 25 | 26 | -- 5- Modifique el campo "actor" para que no permita valores nulos: 27 | 28 | ALTER TABLE peliculas 29 | MODIFY actor VARCHAR(20) NOT NULL; 30 | 31 | -- 6- Intente definir "auto_increment" el campo "codigo": 32 | 33 | ALTER TABLE peliculas 34 | MODIFY codigo INT UNSIGNED AUTO_INCREMENT; 35 | 36 | /* No es posible dicha modificación ya que NO hemos definido en la creacion 37 | de la tabla que "codigo" es una Primary Key. */ 38 | -------------------------------------------------------------------------------- /Enunciados de problemas/68) Variables de usuario: -------------------------------------------------------------------------------- 1 | Variables de usuario. 2 | 3 | Problema: 4 | 5 | Un video club que alquila películas en video guarda información de sus películas en la 6 | tabla "peliculas". 7 | 8 | 1- Elimine la tabla si existe. 9 | 10 | 2- Créela con la siguiente estructura: 11 | 12 | create table peliculas ( 13 | codigo smallint unsigned auto_increment, 14 | titulo varchar(40) not null, 15 | actor varchar(30), 16 | duracion tinyint unsigned, 17 | primary key (codigo) 18 | ); 19 | 20 | 3- Ingrese los siguientes registros: 21 | 22 | ('Elsa y Fred','China Zorrilla',90); 23 | ('Mision imposible','Tom Cruise',120); 24 | ('Mision imposible 2','Tom Cruise',180); 25 | ('Harry Potter y la piedra filosofal','Daniel H.',120); 26 | ('Harry Potter y la camara secreta','Daniel H.',150); 27 | 28 | 4- Guarde en dos variables el valor de duración de la película más larga y el de la más corta: 29 | 30 | 5- Muestre todos los datos de ambas peliculas; 31 | 32 | 6- Guarde en una variable el nombre del actor de la película de mayor duración: 33 | 34 | 7- Muestre todas las películas en las cuales trabaja el autor almacenado en la variable "@actor": 35 | -------------------------------------------------------------------------------- /Enunciados de problemas/32) Clave Primaria Compuesta: -------------------------------------------------------------------------------- 1 | Clave primaria compuesta. 2 | 3 | Problema: 4 | 5 | Una pequeña biblioteca de barrio registra los préstamos de sus libros en una tabla 6 | llamada "prestamos". En ella almacena la siguiente información: 7 | 8 | -título del libro, 9 | -documento de identidad del socio a quien se le presta el libro, 10 | -fecha de préstamo, 11 | -fecha de devolución del libro, 12 | -devuelto: si el libro ha sido o no devuelto. 13 | 14 | 1- Elimine la tabla "prestamos" si existe. 15 | 16 | 2- Cree la tabla teniendo en cuenta que se necesita una clave que identifique cada registro en la tabla "prestamos". 17 | El mismo libro no puede prestarse en la misma fecha. 18 | 19 | 3- Ingrese los siguientes registros para la tabla "prestamos": 20 | 21 | ('Manual de 1 grado','22333444','2006-07-10'); 22 | ('Manual de 1 grado','22333444','2006-07-20'); 23 | ('Manual de 1 grado','23333444','2006-07-15'); 24 | ('El aleph','22333444','2006-07-10'); 25 | ('El aleph','30333444','2006-08-10'); 26 | 27 | Note que un mismo libro fue prestado a un mismo socio pero en una fecha distinta. 28 | 29 | 4- Intente ingresar un valor de clave primaria repetida: 30 | -------------------------------------------------------------------------------- /Resolución de problemas/02-RegistrosDeTablas.sql: -------------------------------------------------------------------------------- 1 | 2 | -- 1- Elimine la tabla "agenda", si existe: 3 | 4 | DROP TABLE IF EXISTS agenda; 5 | 6 | -- 2- Cree una tabla llamada "agenda". Debe tener los campos de nombre, domicilio, telefono: 7 | 8 | CREATE TABLE agenda( 9 | nombre VARCHAR(20), 10 | domicilio VARCHAR(30), 11 | telefono VARCHAR(11) 12 | ); 13 | 14 | -- 3- Visualice las tablas existentes para verificar la creación de "agenda". 15 | 16 | SHOW TABLES; 17 | 18 | -- 4- Visualice la estructura de la tabla "agenda". 19 | 20 | DESCRIBE agenda; 21 | 22 | -- 5- Ingrese los siguientes registros: 23 | 24 | -- ('Alberto Mores','Colon 123','4234567'); 25 | -- ('Juan Torres','Avellaneda 135','4458787'); 26 | 27 | INSERT INTO agenda values 28 | ('Alberto Mores','Colon 123','4234567'), 29 | ('Juan Torres','Avellaneda 135','4458787'); 30 | 31 | -- 6- Seleccione y mustre todos los registros de la tabla: 32 | 33 | SELECT * FROM agenda; 34 | 35 | -- 7- Elimine la tabla "agenda", si existe: 36 | 37 | DROP TABLE IF EXISTS agenda; 38 | 39 | -- 8- Intente eliminar la tabla nuevamente, sin especificar "si existe": 40 | 41 | DROP TABLE agenda; 42 | 43 | -- aparece el error 1051. "Unknown table 'challenge.agenda' 44 | -------------------------------------------------------------------------------- /Resolución de problemas/15-TiposDeDatos(Númericos).sql: -------------------------------------------------------------------------------- 1 | /* Un comercio que envía pizzas y empanadas a domicilio registra los pedidos diariamente en una tabla 2 | llamada "pedidos" con los siguientes datos: 3 | 4 | - numero de pedido, autoincrementable, entero positivo comienza en 1 y menor a 200 aprox. 5 | - nombre: piza o empanada, 6 | - tipo: por ejemplo, si es pizza: especial, muzarela, etc., si son empanadas: salteñas, picantes, 7 | arabes, etc. 8 | - precio: precio por unidad, valor con decimales que no supera los $99.99 y será siempre mayor a 0, 9 | - cantidad: cantidad de articulos, entero positivo desde 1 e inferior a 200 aprox. 10 | - domicilio del cliente. */ 11 | 12 | -- 1- Elimine la tabla "pedidos" si existe. 13 | 14 | DROP TABLE IF EXISTS pedidos; 15 | 16 | -- 2- Cree la tabla eligiendo el tipo de dato adecuado para cada campo. 17 | 18 | CREATE TABLE pedidos( 19 | numero INTEGER AUTO_INCREMENT, 20 | nombre CHAR(1) NOT NULL, -- P de Pizza o E de Empanada 21 | tipo VARCHAR(15) NOT NULL, 22 | precio FLOAT UNSIGNED NOT NULL, 23 | domicilio VARCHAR(30) NOT NULL, 24 | PRIMARY KEY(numero)); 25 | 26 | -- Utilizo el siguiente comando para ver las caractetisticas de la tabla: 27 | 28 | DESCRIBE pedidos; 29 | -------------------------------------------------------------------------------- /Enunciados de problemas/39) Rand: -------------------------------------------------------------------------------- 1 | Recuperación de registros en forma aleatoria(rand) 2 | 3 | Problema: 4 | 5 | Trabajamos con la tabla "alumnos" en el cual un instituto de enseñanza guarda los datos de sus 6 | alumnos. 7 | 8 | 1- Eliminamos la tabla "alumnos" si existe: 9 | 10 | 2- Creamos la tabla: 11 | 12 | create table alumnos( 13 | documento char(8) not null, 14 | nombre varchar(30), 15 | domicilio varchar(30), 16 | ciudad varchar(20), 17 | provincia varchar(20), 18 | primary key(documento) 19 | ); 20 | 21 | 3- Agregamos varios registros: 22 | 23 | ('22333444','Juan Perez','Colon 123','Cordoba','Cordoba'); 24 | ('23456789','Ana Acosta','Caseros 456','Cordoba','Cordoba'); 25 | ('24123123','Patricia Morales','Sucre 234','Villa del Rosario','Cordoba'); 26 | ('25000333','Jose Torres','Sarmiento 980','Carlos Paz','Cordoba'); 27 | ('26333444','Susana Molina','Avellaneda 234','Rosario','Santa Fe'); 28 | ('27987654','Marta Herrero','San Martin 356','Villa del Rosario','Cordoba'); 29 | ('28321321','Marcos Ferreyra','Urquiza 357','Cordoba','Cordoba'); 30 | ('30987464','Marta Perez','Rivadavia 234','Cordoba','Cordoba'); 31 | 32 | 4- El instituto quiere tomar 3 alumnos al azar para que representen al instituto en una feria de 33 | ciencias. 34 | -------------------------------------------------------------------------------- /Enunciados de problemas/40) Replace: -------------------------------------------------------------------------------- 1 | Remplazar registros (replace) 2 | 3 | Problema: 4 | 5 | Un instituto de enseñanza guarda los datos de sus alumnos en la tabla "alumnos". 6 | 7 | 1- Elimine la tabla si existe: 8 | 9 | 2- Cree la tabla: 10 | 11 | create table alumnos( 12 | legajo int(10) unsigned auto_increment, 13 | nombre varchar(30), 14 | documento char(8), 15 | domicilio varchar(30), 16 | primary key(legajo), 17 | unique i_documento (documento) 18 | ); 19 | 20 | 3- Ingrese algunos registros: 21 | 22 | ('1353','Juan Lopez','22333444','Colon 123'); 23 | ('2345','Ana Acosta','24000555','Caseros 456'); 24 | ('2356','Jose Torres','26888777','Sucre 312'); 25 | ('3567','Luis Perez','28020020','Rivadavia 234'); 26 | 27 | 4- Intente ingresar un registro con clave primaria repetida (legajo "3567"): 28 | 29 | 5- Ingrese el registro anterior reemplazando el existente: 30 | 31 | 6- Intente ingresar un alumno con documento repetido: 32 | 33 | 7- Reemplace el registro: ('4567','Susana Juarez','30000333','Avellaneda 33'); 34 | 35 | 8- Elimine el índice único: 36 | 37 | 9- Ingrese con "replace" el siguiente registro con documento existente: 38 | ('4888','Gustavo Garcia','30000333','San Martin 846'); 39 | 40 | 10- Muestre todos los registros: 41 | -------------------------------------------------------------------------------- /Enunciados de problemas/71) Subconsultas ANY -SOME - ALL: -------------------------------------------------------------------------------- 1 | Subconsultas any - some - all 2 | 3 | Problema: 4 | 5 | Un club dicta clases de distintos deportes a sus socios. El club tiene una tabla llamada 6 | "inscriptos" en la cual almacena el número de "socio", el código del deporte en el cual se inscribe 7 | y la cantidad de cuotas pagas (desde 0 hasta 10 que es el total por todo el año), y una tabla 8 | denominada "socios" en la que guarda los datos personales de cada socio. 9 | 10 | 1- Borre las tablas si existen y luego cree las tablas: 11 | 12 | 2- Ingrese algunos registros: 13 | 14 | 3- Muestre el número de socio, el nombre del socio y el deporte en que está inscripto con un join de 15 | ambas tablas. 16 | 17 | 4- Muestre los socios que serán compañeros en tenis y también en natación (empleando 18 | subconsulta) 19 | 20 | 5- Vea si el socio 1 se ha inscripto en algún deporte en el cual se haya inscripto el socio 2. 21 | 22 | 6- Obtenga el mismo resultado anterior pero empleando join. 23 | 24 | 7- Muestre los deportes en los cuales el socio 2 pagó más cuotas que ALGUN deporte en los que se 25 | inscribio el socio 1 26 | 27 | 8- Muestre los deportes en los cuales el socio 2 pagó más cuotas que TODOS los deportes en que se 28 | inscribió el socio 1. 29 | -------------------------------------------------------------------------------- /Enunciados de problemas/49) Enum: -------------------------------------------------------------------------------- 1 | Tipo de dato enum. 2 | 3 | Problema: 4 | 5 | Trabajamos con la tabla "empleados" de una empresa. 6 | 7 | 1- Elimine la tabla empleados, si existe. 8 | 9 | 2- Cree la tabla con la siguiente estructura: 10 | 11 | create table empleados( 12 | documento char(8), 13 | nombre varchar(30), 14 | sexo char(1), 15 | estadocivil enum('soltero','casado','divorciado','viudo') not null, 16 | sueldobasico decimal(6,2), 17 | primary key(documento) 18 | ); 19 | 20 | 3- Ingrese algunos registros: 21 | 22 | ('22333444','Juan Lopez','m','soltero',300); 23 | ('23333444','Ana Acosta','f','viudo',400); 24 | 25 | 4- Intente ingresar un valor "null" para el campo enumerado: 26 | 27 | 5- Ingrese resgistros con valores de índice para el campo "estadocivil": 28 | 29 | ('26333444','Luis Perez','m',1,400); 30 | ('26336444','Marcelo Torres','m',3,460); 31 | 32 | 6- Ingrese un valor inválido, uno no presente en la lista y un valor de índice fuera de rango: 33 | 34 | ('29333444','Lucas Perez','m',0,400); 35 | ('30336444','Federico Garcia','m',5,450); 36 | ('31333444','Karina Sosa','f','Concubino',500); 37 | 38 | 7- Seleccione todos los empleados solteros: 39 | 40 | 8- Seleccione todos los empleados viudos usando el número de índice de la enumeración: 41 | -------------------------------------------------------------------------------- /Enunciados de problemas/79) Procedimientos Almacenados I: -------------------------------------------------------------------------------- 1 | Procedimientos almacenados (crear - ejecutar) 2 | 3 | Problema: 4 | 5 | Una empresa almacena los datos de sus empleados en una tabla llamada "empleados". 6 | 7 | 1- Eliminamos la tabla, si existe y la creamos: 8 | 9 | create table empleados( 10 | documento char(8), 11 | nombre varchar(20), 12 | apellido varchar(20), 13 | sueldo decimal(6,2), 14 | cantidadhijos int, 15 | seccion varchar(20), 16 | primary key(documento) 17 | ); 18 | 19 | 2- Ingrese algunos registros: 20 | 21 | 3- Elimine el procedimiento llamado "pa_empleados_sueldo" si existe: 22 | 23 | 4- Cree un procedimiento almacenado llamado "pa_empleados_sueldo" que seleccione los nombres, 24 | apellidos y sueldos de los empleados. 25 | 26 | 5- Ejecute el procedimiento creado anteriormente. 27 | 28 | 6- Elimine el procedimiento llamado "pa_empleados_hijos" si existe: 29 | 30 | 7- Cree un procedimiento almacenado llamado "pa_empleados_hijos" que seleccione los nombres, 31 | apellidos y cantidad de hijos de los empleados con hijos. 32 | 33 | 8- Ejecute el procedimiento creado anteriormente. 34 | 35 | 9- Actualice la cantidad de hijos de algún empleado sin hijos y vuelva a ejecutar el procedimiento 36 | para verificar que ahora si aparece en la lista. 37 | -------------------------------------------------------------------------------- /Enunciados de problemas/17) Atributo Default: -------------------------------------------------------------------------------- 1 | Atributo default en una columna de una tabla. 2 | 3 | Problema: 4 | 5 | Un comercio que envía pizzas y empanadas a domicilio registra los pedidos diariamente en una tabla 6 | llamada "pedidos" con los siguientes datos: 7 | - numero de pedido, autoincrementable, entero positivo comienza en 1 y menor a 200 aprox. 8 | - nombre: pizza o empanada, por defecto "empanada", 9 | - tipo: por ejemplo, si es pizza: especial, muzarela, etc., si son empanadas: arabes, pollo, jamón 10 | y queso, criollas, etc. 11 | - precio: precio por unidad, valor con decimales que no supera los $99.99 y será siempre mayor a 12 | 0, por defecto "1", 13 | - cantidad: cantidad de articulos, entero positivo desde 1 e inferior a 200 aprox., por 14 | defecto "12" 15 | - domicilio del cliente. 16 | 17 | 1- Elimine la tabla "pedidos" si existe. 18 | 19 | 2- Cree la tabla eligiendo el tipo de dato adecuado para cada campo. 20 | 21 | 3- Ingrese los siguientes registros: 22 | 23 | ('piza','muzarela','4.00',3,'Sarmiento 235'); 24 | ('arabe','1.00',24,'Urquiza 296'); 25 | ('empanada','salteña','Colon 309'); 26 | ('arabe','San Martin 444'); 27 | ('piza','especial','4.00','Avellaneda 395'); 28 | 29 | 4- Muestre todos los campos de todos los pedidos para ver cómo se guardaron los datos no ingresados. 30 | -------------------------------------------------------------------------------- /Enunciados de problemas/19) Columnas Calculadas: -------------------------------------------------------------------------------- 1 | Columnas calculadas. 2 | 3 | Problema: 4 | 5 | Una empresa almacena los datos de sus empleados en una tabla "empleados". 6 | 7 | 1- Elimine la tabla "empleados" si existe. 8 | 9 | 2- Cree una tabla llamada "empleados" con la estructura necesaria para almacenar la siguiente información: 10 | 11 | - nombre del empleado, 12 | - documento, 13 | - sexo, 14 | - domicilio, 15 | - sueldo básico (hasta 9999.99), 16 | - hijos a cargo, 17 | - clave primaria: documento. 18 | 19 | 3- Ingrese algunos registros: 20 | 21 | ('Juan Perez','22333444','m',300,1); 22 | ('Ana Acosta','21333444','f',400,2); 23 | ('Alberto Lopez','24333444','m',600,0); 24 | ('Carlos Sanchez','30333444','m',550,3); 25 | ('Mariana Torres','23444555','f',600,1); 26 | ('Marcos Garcia','23664555','m',1500,2); 27 | 28 | 4- La empresa está pensando en aumentar un 10% el sueldo a los empleados, y quiere saber a cuánto 29 | subiría cada sueldo básico, para ello usamos la siguiente sentencia en la cual incluimos una 30 | columna que hará el cálculo de cada sueldo más el 10%: 31 | 32 | 5- La empresa paga un salario familiar por hijos a cargo, $200 por cada hijo. Necesitamos el nombre 33 | del empleado, el sueldo básico, la cantidad de hijos a cargo, el total del salario familiar y el 34 | suedo final (incluyendo el salario familiar): 35 | -------------------------------------------------------------------------------- /Resolución de problemas/36-DropIndex.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla "alumnos" si existe. 2 | 3 | DROP TABLE IF EXISTS alumnos; 4 | 5 | /* 2- Cree la tabla definiendo una clave primaria compuesta (año de inscripción y número de 6 | inscripto), un índice único por el campo "documento" y un índice común por ciudad y provincia: */ 7 | 8 | CREATE TABLE alumnos( 9 | año YEAR NOT NULL, 10 | numero INT UNSIGNED NOT NULL, 11 | nombre VARCHAR(30), 12 | documento CHAR(8) NOT NULL, 13 | domicilio VARCHAR(30), 14 | ciudad VARCHAR(20), 15 | provincia VARCHAR(20), 16 | PRIMARY KEY(año,numero), 17 | UNIQUE i_documento (documento), 18 | INDEX i_ciudadprovincia (ciudad,provincia) 19 | ); 20 | 21 | -- 3- Vea los índices de la tabla. 22 | 23 | SHOW INDEX FROM alumnos; 24 | 25 | -- 4- Elimine el índice "i_ciudadprovincia". 26 | 27 | DROP INDEX i_ciudadprovincia ON alumnos; 28 | 29 | -- 5- Verifique la eliminación. 30 | 31 | SHOW INDEX FROM alumnos; /* Comprobamos que se elimino correctamente */ 32 | 33 | -- 6- Intente eliminar el índice PRIMARY. 34 | 35 | DROP INDEX PRIMARY ON alumnos; /* Vemos que no es posible eliminar la Primary Key */ 36 | 37 | -- 7- Elimine el índice único. 38 | 39 | DROP INDEX i_documento ON alumnos; 40 | 41 | -- 8- Verifique la eliminación. 42 | 43 | SHOW INDEX FROM alumnos; /* Se observa que el indice UNIQUE se elimina correctamente */ 44 | -------------------------------------------------------------------------------- /Resolución de problemas/18-AtributoZerofill.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla "cuentas", si existe. 2 | 3 | DROP TABLE IF EXISTS cuentas; 4 | 5 | -- 2- Cree y utilice la tabla: 6 | 7 | CREATE TABLE cuentas( 8 | numero INT(8) ZEROFILL AUTO_INCREMENT, 9 | documento CHAR(8) NOT NULL, 10 | nombre VARCHAR(30), 11 | saldo DECIMAL(9,2), 12 | PRIMARY KEY(numero) 13 | ); 14 | 15 | -- 3- Visualice la estructura de la tabla: 16 | 17 | DESCRIBE cuentas; 18 | 19 | /* 4- Ingrese los siguientes registros: 20 | 21 | (1234,'22333444','Juan Perez',2000.60); 22 | (2566,'23333444','Maria Pereyra',5050); 23 | (5987,'24333444','Marcos Torres',200); 24 | (14434,'25333444','Ana Juarez',8000.60); */ 25 | 26 | INSERT INTO cuentas (numero,documento,nombre,saldo) 27 | VALUES(1234,'22333444','Juan Perez',2000.60), 28 | (2566,'23333444','Maria Pereyra',5050), 29 | (5987,'24333444','Marcos Torres',200), 30 | (14434,'25333444','Ana Juarez',8000.60); 31 | 32 | -- 5- Vea cómo se guardaron los números de cuenta: 33 | 34 | SELECT * FROM cuentas; 35 | 36 | -- 6- Ingrese un valor negativo para el número de cuenta: 37 | 38 | INSERT INTO cuentas (numero,documento,nombre,saldo) 39 | VALUES(-1234,'27333444','Luis Duarte',2800); 40 | 41 | /* Esta inserción no la toma ya que al poner el atributo "Zerofill", MySQL interpreta que no puede haber negativos, por lo 42 | que la columna se torna "Unsigned". */ 43 | -------------------------------------------------------------------------------- /Enunciados de problemas/77) Vistas: -------------------------------------------------------------------------------- 1 | Vistas 2 | 3 | Problema: 4 | 5 | Un club dicta cursos de distintos deportes. Almacena la información en varias tablas. 6 | El director no quiere que los empleados de administración conozcan la estructura de las tablas ni 7 | algunos datos de los profesores y socios, por ello se crean vistas a las cuales tendrán acceso. 8 | 9 | 1 - Elimine las tablas y créelas nuevamente: 10 | 11 | 2- Ingrese algunos registros para todas las tablas: 12 | 13 | 3- Elimine la vista "vista_club" si existe: 14 | 15 | 4 - Cree una vista en la que aparezca el nombre y documento del socio, el deporte, el día y el nombre 16 | del profesor (no mostrar datos de los socios que no están inscriptos en deportes) 17 | 18 | 5- Muestre la información contenida en la vista. 19 | 20 | 6- Realice una consulta a la vista donde muestre la cantidad de socios inscriptos en cada deporte 21 | ordenados por cantidad. 22 | 23 | 7- Muestre (consultando la vista) el nombre y documento de los socios que deben matrículas. 24 | 25 | 8- Consulte la vista y muestre los nombres de los profesores y los días en que asisten al club para 26 | dictar sus clases. 27 | 28 | 9- Muestre todos los socios que son compañeros en tenis los lunes. 29 | 30 | 10 - Cree una nueva vista llamada 'vista_inscriptos' que muestre la cantidad de 31 | inscriptos por curso, incluyendo el nombre del deporte y el día. 32 | 33 | 11- Consulte la vista 'vista_inscriptos': 34 | -------------------------------------------------------------------------------- /Enunciados de problemas/24) Búsqueda de Patrones: -------------------------------------------------------------------------------- 1 | Búsqueda de patrones (like y not like) 2 | 3 | Problema: 4 | 5 | Trabaje con la tabla llamada "medicamentos" de una farmacia. 6 | 7 | 1- Elimine la tabla "medicamentos", si existe: 8 | 9 | 2- Cree y utilice la tabla con la siguiente estructura: 10 | 11 | create table medicamentos( 12 | codigo int unsigned auto_increment, 13 | nombre varchar(20) not null, 14 | laboratorio varchar(20), 15 | precio decimal(6,2) unsigned, 16 | cantidad int unsigned, 17 | primary key(codigo) 18 | ); 19 | 20 | 3- Visualice la estructura de la tabla "medicamentos". 21 | 22 | 4- Ingrese los siguientes registros: 23 | 24 | ('Sertal gotas','Roche',5.2); 25 | ('Buscapina','Roche',4.10); 26 | ('Amoxidal 500','Bayer',15.60); 27 | ('Paracetamol 500','Bago',1.90); 28 | ('Bayaspirina','Bayer',2.10); 29 | ('Amoxidal jarabe','Bayer',5.10); 30 | ('Sertal compuesto','Bayer',5.10); 31 | ('Paracetamol 1000','Bago',2.90); 32 | ('Amoxinil','Roche',17.80); 33 | 34 | 5- Recupere los medicamentos cuyo nombre comiencen con "Amox": 35 | 36 | 6- Recupere los medicamentos "Paracetamol" cuyo precio sea menor a 2: 37 | 38 | 7- Busque todos los medicamentos cuyo precio tenga .10 centavos: 39 | 40 | 8- Muestre todos los medicamentos que no contengan la cadena "compuesto": 41 | 42 | 9- Elimine todos los registros cuyo laboratorio contenga la letra "y": 43 | 44 | 10- Cambie el precio por 5, al "Paracetamol" cuyo precio es mayor a 2: 45 | -------------------------------------------------------------------------------- /Resolución de problemas/78-VistasBasadasEnOtrasVistas.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla "alumnos" si existe y luego Créela: 2 | 3 | DROP TABLE IF EXISTS alumnos; 4 | 5 | CREATE TABLE alumnos( 6 | documento CHAR(8), 7 | nombre VARCHAR(30), 8 | nota DECIMAL(4,2), 9 | PRIMARY KEY(documento) 10 | ); 11 | 12 | 13 | -- 2-Ingrese algunos registros: 14 | 15 | INSERT INTO alumnos 16 | values('30111111','Ana Algarbe',5.1), 17 | ('30222222','Bernardo Bustamante',3.2), 18 | ('30333333','Carolina Conte',4.5), 19 | ('30444444','Diana Dominguez',9.7), 20 | ('30555555','Fabian Fuentes',8.5), 21 | ('30666666','Gaston Gonzalez',9.70); 22 | 23 | 24 | -- 3-Cree una vista que recupere el nombre y la nota de todos los alumnos 25 | 26 | DROP VIEW IF EXISTS vista_nota_alumnos; 27 | 28 | CREATE VIEW vista_nota_alumnos AS 29 | SELECT nombre, nota 30 | FROM alumnos; 31 | 32 | -- 4-Mostrar el resultado de llamar la vista en un comando SQL 'select'. 33 | 34 | SELECT * FROM vista_nota_alumnos; 35 | 36 | 37 | /* 5-Crear una vista que retorne el nombre y la nota de todos los alumnos aprobados (notas mayores 38 | iguales a 7) a partir de la vista anterior. */ 39 | 40 | DROP VIEW IF EXISTS vista_alumnos_aprobados; 41 | 42 | CREATE VIEW vista_alumnos_aprobados AS 43 | SELECT nombre, nota 44 | FROM alumnos 45 | WHERE nota>=7; 46 | 47 | 48 | -- 6-Muestre la información que genera la vista. 49 | 50 | SELECT * FROM vista_alumnos_aprobados; 51 | -------------------------------------------------------------------------------- /Resolución de problemas/51-BlobYText.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla "inmuebles" si existe: 2 | 3 | DROP TABLE IF EXISTS inmuebles; 4 | 5 | -- 2- Cree la tabla: 6 | 7 | CREATE TABLE inmuebles( 8 | codigo INT UNSIGNED AUTO_INCREMENT, 9 | domicilio VARCHAR(30), 10 | barrio VARCHAR(20), 11 | detalles TEXT, 12 | PRIMARY KEY(codigo) 13 | ); 14 | 15 | /* 3- Ingrsee algunos registros: 16 | 17 | (1,'Colon 123','Centro','patio, 3 dormitorios, garage doble, pileta, 18 | asador, living, cocina, comedor, escritorio, 2 baños'); 19 | (2,'Caseros 345','Centro','patio, 2 dormitorios, cocina- comedor, 20 | living'); 21 | (3,'Sucre 346','Alberdi','2 dormitorios, problemas de humedad'); 22 | (4,'Sarmiento 832','Gral. Paz','3 dormitorios, garage, 2 patios'); 23 | (5,'Avellaneda 384','Centro',' 2 patios, 2 dormitorios, garage'); */ 24 | 25 | INSERT INTO inmuebles 26 | VALUES(1,'Colon 123','Centro','patio, 3 dormitorios, garage doble, pileta, 27 | asador, living, cocina, comedor, escritorio, 2 baños'), 28 | (2,'Caseros 345','Centro','patio, 2 dormitorios, cocina- comedor, 29 | living'), 30 | (3,'Sucre 346','Alberdi','2 dormitorios, problemas de humedad'), 31 | (4,'Sarmiento 832','Gral. Paz','3 dormitorios, garage, 2 patios'), 32 | (5,'Avellaneda 384','Centro',' 2 patios, 2 dormitorios, garage'); 33 | 34 | -- 4- Busque todos los inmuebles que tengan "patio": 35 | 36 | SELECT * FROM inmuebles 37 | WHERE detalles REGEXP('patio'); 38 | -------------------------------------------------------------------------------- /Resolución de problemas/63-CrossJoinII.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla "equipos", si existe. 2 | 3 | DROP TABLE IF EXISTS equipos; 4 | 5 | -- 2- Cree la tabla: 6 | 7 | CREATE TABLE equipos( 8 | nombre VARCHAR(30), 9 | barrio VARCHAR(20), 10 | domicilio VARCHAR(30), 11 | entrenador VARCHAR(30) 12 | ); 13 | 14 | /* 3- Ingrese los siguientes registros: 15 | 16 | ('Los tigres','Gral. Paz','Sarmiento 234','Juan Lopez'); 17 | ('Los leones','Centro','Colon 123','Gustavo Fuentes'); 18 | ('Campeones','Pueyrredon','Guemes 346','Carlos Moreno'); 19 | ('Cebollitas','Alberdi','Colon 1234','Luis Duarte'); */ 20 | 21 | INSERT INTO equipos 22 | VALUES('Los tigres','Gral. Paz','Sarmiento 234','Juan Lopez'), 23 | ('Los leones','Centro','Colon 123','Gustavo Fuentes'), 24 | ('Campeones','Pueyrredon','Guemes 346','Carlos Moreno'), 25 | ('Cebollitas','Alberdi','Colon 1234','Luis Duarte'); 26 | 27 | /* 4- Cada equipo jugará con todos los demás 2 veces, una vez en cada sede. Realice un "cross join" 28 | para combinar los equipos teniendo en cuenta que un equipo no juega consigo mismo: */ 29 | 30 | SELECT e1.nombre AS 'Local', e2.nombre AS 'Visitante' 31 | FROM equipos AS e1 32 | CROSS JOIN equipos AS e2 33 | WHERE e1.nombre<>e2.nombre; 34 | 35 | -- 5- Obtenga el mismo resultado empleando un "join" sin parte "on": 36 | 37 | SELECT e1.nombre AS 'Local', e2.nombre AS 'Visitante' 38 | FROM equipos AS e1 39 | JOIN equipos AS e2 40 | WHERE e1.nombre<>e2.nombre; 41 | -------------------------------------------------------------------------------- /Enunciados de problemas/44) Alter Table - Change: -------------------------------------------------------------------------------- 1 | Cambiar el nombre de un campo de una tabla (alter table - change) 2 | 3 | Problema: 4 | 5 | Un comercio que vende por mayor artículos de librería y papelería tiene una tabla 6 | llamada "articulos". 7 | 8 | 1- Elimine la tabla, si existe. 9 | 10 | 2- Cree la tabla con la siguiente estructura: 11 | 12 | create table articulos( 13 | codigo int unsigned auto_increment, 14 | nombre varchar(20) not null, 15 | descripcion varchar(30), 16 | precio decimal(4,2) unsigned, 17 | primary key(codigo) 18 | ); 19 | 20 | 3- Ingrese los siguientes registros: 21 | 22 | ('escuadra','plastico 20 cm.',3.50); 23 | ('lápices colores','Faber x12',4.50); 24 | ('lápices colores','Faber x24',7.50); 25 | ('regla','30 cm.',2.50); 26 | ('fibras','Faber x12',10.30); 27 | ('fibras','Faber x6',5.10); 28 | 29 | 4- El comercio, que hasta ahora ha vendido sus artículos por mayor comenzará la venta por menor. 30 | Necesita alterar la tabla modificando el nombre del campo "precio" por "preciopormayor" además 31 | desea redefinirlo como no nulo: 32 | 33 | 5- También necesita alterar la tabla agregando un campo para almacenar el precio por menor para 34 | cada artículo. Agrege un campo llamado "preciopormenor" que no permita valores nulos: 35 | 36 | 6- Muestre todos los registros: 37 | 38 | 7- Actualice el campo "preciopormenor" de todos los registros, dándole el valor del campo "precio" 39 | incrementado en un 10%: 40 | 41 | 8- Muestre todos los registros: 42 | -------------------------------------------------------------------------------- /Enunciados de problemas/80) Procedimientos Almacendados II: -------------------------------------------------------------------------------- 1 | Procedimientos almacenados (parámetros de entrada) 2 | 3 | Problema: 4 | 5 | Una empresa almacena los datos de sus empleados en una tabla llamada "empleados". 6 | 7 | 1- Eliminamos la tabla, si existe y la creamos: 8 | 9 | create table empleados( 10 | documento char(8), 11 | nombre varchar(20), 12 | apellido varchar(20), 13 | sueldo decimal(6,2), 14 | cantidadhijos int, 15 | seccion varchar(20), 16 | primary key(documento) 17 | ); 18 | 19 | 2- Ingrese algunos registros: 20 | 21 | 3- Elimine el procedimiento llamado "pa_empleados_sueldo" si existe: 22 | 23 | 4- Cree un procedimiento almacenado llamado "pa_empleados_sueldo" que seleccione los nombres, 24 | apellidos y sueldos de los empleados que tengan un sueldo superior o igual al enviado como 25 | parámetro. 26 | 27 | 5- Ejecute el procedimiento creado anteriormente con distintos valores: 28 | 29 | 6- Intente ejecute el procedimiento almacenado "pa_empleados_sueldo" sin parámetros. 30 | 31 | 7- Elimine el procedimiento almacenado "pa_empleados_actualizar_sueldo" si existe: 32 | 33 | 8- Cree un procedimiento almacenado llamado "pa_empleados_actualizar_sueldo" que actualice los 34 | sueldos iguales al enviado como primer parámetro con el valor enviado como segundo parámetro. 35 | 36 | 9- Ejecute el procedimiento creado anteriormente y verifique si se ha ejecutado correctamente: 37 | 38 | 10- Ejecute el procedimiento "pa_empleados_actualizar_sueldo" enviando un solo parámetro. 39 | -------------------------------------------------------------------------------- /Resolución de problemas/05-ConsultasBasicasII.sql: -------------------------------------------------------------------------------- 1 | -- 1- Eliminamos "agenda", si existe: 2 | 3 | DROP TABLE IF EXISTS agenda; 4 | 5 | -- 2- Creamos la tabla, con los campos de nombre, domicilio y telefono: 6 | 7 | CREATE TABLE agenda( 8 | nombre VARCHAR(20), 9 | domicilio VARCHAR(30), 10 | telefono VARCHAR(11) 11 | ); 12 | 13 | -- 3- Visualice la estructura de la tabla "agenda". 14 | 15 | DESCRIBE agenda; 16 | 17 | -- 4- Ingrese los siguientes registros: 18 | 19 | -- 'Alberto Mores','Colon 123','4234567', 20 | -- 'Juan Torres','Avellaneda 135','4458787', 21 | -- 'Mariana Lopez','Urquiza 333','4545454', 22 | -- 'Fernando Lopez','Urquiza 333','4545454'. 23 | 24 | INSERT INTO agenda (nombre, domicilio, telefono) 25 | VALUES('Alberto Mores','Colon 123','4234567'), 26 | ('Juan Torres','Avellaneda 135','4458787'), 27 | ('Mariana Lopez','Urquiza 333','4545454'), 28 | ('Fernando Lopez','Urquiza 333','4545454'); 29 | 30 | -- 5- Seleccione todos los registros de la tabla. 31 | 32 | SELECT * FROM agenda; 33 | 34 | -- 6- Seleccione el registro cuyo nombre sea 'Juan Torres'. 35 | 36 | SELECT * FROM agenda 37 | WHERE nombre="Juan Torres"; 38 | 39 | -- 7- Seleccione el registro cuyo domicilio sea 'Colon 123'. 40 | 41 | SELECT * FROM agenda 42 | WHERE domicilio="Colon 123"; 43 | 44 | -- 8- Muestre los datos de quienes tengan el teléfono '4545454'. 45 | 46 | SELECT * FROM agenda 47 | WHERE telefono="4545454"; 48 | 49 | -- 9- Elimine la tabla "agenda". 50 | 51 | DROP TABLE agenda; 52 | -------------------------------------------------------------------------------- /Enunciados de problemas/28) Group by: -------------------------------------------------------------------------------- 1 | Agrupar registros (group by) 2 | 3 | Problema: 4 | 5 | Una empresa tiene registrados sus clientes en una tabla llamada "clientes". 6 | 7 | 1- Elimine la tabla "clientes", si existe. 8 | 9 | 2- Créela con la siguiente estructura: 10 | 11 | create table clientes ( 12 | codigo int unsigned auto_increment, 13 | nombre varchar(30) not null, 14 | domicilio varchar(30), 15 | ciudad varchar(20), 16 | provincia varchar (20), 17 | telefono varchar(11), 18 | primary key(codigo) 19 | ); 20 | 21 | 3- Ingrese algunos registros: 22 | 23 | ('Lopez Marcos', 'Colon 111', 'Córdoba','Cordoba','null'); 24 | ('Perez Ana', 'San Martin 222', 'Cruz del Eje','Cordoba','4578585'); 25 | ('Garcia Juan', 'Rivadavia 333', 'Villa Maria','Cordoba','4578445'); 26 | ('Perez Luis', 'Sarmiento 444', 'Rosario','Santa Fe',null); 27 | ('Pereyra Lucas', 'San Martin 555', 'Cruz del Eje','Cordoba','4253685'); 28 | ('Gomez Ines', 'San Martin 666', 'Santa Fe','Santa Fe','0345252525'); 29 | ('Torres Fabiola', 'Alem 777', 'Villa del Rosario','Cordoba','4554455'); 30 | ('Lopez Carlos', 'Irigoyen 888', 'Cruz del Eje','Cordoba',null); 31 | ('Ramos Betina', 'San Martin 999', 'Cordoba','Cordoba','4223366'); 32 | ('Lopez Lucas', 'San Martin 1010', 'Posadas','Misiones','0457858745'); 33 | 34 | 4- Obtenga el total de los registros (10): 35 | 36 | 5- Obtenga el total de los registros que no tienen valor nulo en los teléfonos: 37 | 38 | 6- Obtenga la cantidad de clientes agrupados por ciudad y provincia, ordenados por provincia: 39 | -------------------------------------------------------------------------------- /Enunciados de problemas/56) Join III: -------------------------------------------------------------------------------- 1 | Una pequeña biblioteca de barrio registra los préstamos de sus libros en una tabla 2 | llamada "prestamos" y los datos de sus libros en una tabla llamada "libros". 3 | 4 | 1- Elimine las tablas "prestamos" y "libros", si existen. 5 | 6 | 2- Cree las tablas: 7 | 8 | create table libros( 9 | codigo int unsigned auto_increment, 10 | titulo varchar(40), 11 | autor varchar (30), 12 | editorial varchar (15), 13 | primary key (codigo) 14 | ); 15 | 16 | create table prestamos( 17 | codigolibro int unsigned not null, 18 | documento char(8) not null, 19 | fechaprestamo date not null, 20 | fechadevolucion date, 21 | primary key(codigolibro,fechaprestamo) 22 | ); 23 | 24 | 3- Ingrese algunos registros para ambas tablas: 25 | 26 | libros: 27 | (15,'Manual de 1º grado','Moreno Luis','Emece'); 28 | (28,'Manual de 2º grado','Moreno Luis','Emece'); 29 | (30,'Alicia en el pais de las maravillas','Lewis Carroll','Planeta'); 30 | (35,'El aleph','Borges','Emece'); 31 | 32 | prestamos: 33 | (15,'22333444','2006-07-10','2006-07-12'); 34 | (15,'22333444','2006-07-20','2006-07-21'); 35 | (15,'23333444','2006-07-25'); 36 | (30,'23333444','2006-07-28'); 37 | (28,'25333444','2006-08-10'); 38 | 39 | 4- Muestre todos los datos de los préstamos, incluyendo el nombre del libro: 40 | 41 | 5- Muestre la información de los préstamos del libro "Manual de 1º grado": 42 | 43 | 6- Muestre los títulos de los libros, la fecha de préstamo y el documento del socio de todos los 44 | libros que no han sido devueltos: 45 | -------------------------------------------------------------------------------- /Enunciados de problemas/55) Join II: -------------------------------------------------------------------------------- 1 | A) Un club dicta clases de distintos deportes. En una tabla llamada "socios" guarda los datos de 2 | sus socios y en una tabla denominada "inscriptos" almacena la información necesaria para las 3 | inscripciones de los socios a los distintos deportes. 4 | 5 | 1- Elimine las tablas si existen. 6 | 7 | 2- Cree las tablas: 8 | 9 | create table socios( 10 | documento char(8) not null, 11 | nombre varchar(30), 12 | domicilio varchar(30), 13 | primary key(documento) 14 | ); 15 | 16 | create table inscriptos( 17 | documento char(8) not null, 18 | deporte varchar(15) not null, 19 | año year, 20 | matricula char(1), /*si esta paga ='s' sino 'n'*/ 21 | primary key(documento,deporte,año) 22 | ); 23 | 24 | 3- Ingrese algunos registros para ambas tablas: 25 | 26 | socios: 27 | ('22333444','Juan Perez','Colon 234'); 28 | ('23333444','Maria Lopez','Sarmiento 465'); 29 | ('24333444','Antonio Juarez','Caseros 980'); 30 | 31 | inscriptos: 32 | ('22333444','natacion','2005','s'); 33 | ('22333444','natacion','2006','n'); 34 | ('23333444','natacion','2005','s'); 35 | ('23333444','tenis','2006','s'); 36 | ('23333444','natacion','2006','s'); 37 | ('24333444','tenis','2006','n'); 38 | ('24333444','basquet','2006','n'); 39 | 40 | 4- Muestre el nombre del socio y todos los campos de la tabla "inscriptos": 41 | 42 | 5- Muestre el nombre de los socios y los deportes en los cuales están inscriptos este año: 43 | 44 | 6- Muestre el nombre y todas las inscripciones del socio con número de documento='23333444': 45 | -------------------------------------------------------------------------------- /Enunciados de problemas/59) Left Join II: -------------------------------------------------------------------------------- 1 | Un club dicta clases de distintos deportes. En una tabla llamada "socios" guarda los datos de 2 | sus socios y en una tabla denominada "inscriptos" almacena la información necesaria para las 3 | inscripciones de los socios a los distintos deportes. 4 | 5 | 1- Elimine las tablas "socios" e "inscriptos" si existen. 6 | 7 | 2- Cree las tablas: 8 | 9 | create table socios( 10 | documento char(8) not null, 11 | nombre varchar(30), 12 | domicilio varchar(30), 13 | primary key(documento) 14 | ); 15 | 16 | create table inscriptos( 17 | documento char(8) not null, 18 | deporte varchar(15) not null, 19 | año year, 20 | matricula char(1), /*si esta paga ='s' sino 'n'*/ 21 | primary key(documento,deporte,año) 22 | ); 23 | 24 | 3- Ingrese algunos registros para ambas tablas: 25 | 26 | socios: 27 | ('22333444','Juan Perez','Colon 234'); 28 | ('23333444','Maria Lopez','Sarmiento 465'); 29 | ('24333444','Antonio Juarez','Caseros 980'); 30 | ('25333444','Ana Juarez','Sucre 134'); 31 | ('26333444','Sofia Herrero','Avellaneda 1234'); 32 | 33 | inscriptos: 34 | ('22333444','natacion','2015','s'); 35 | ('22333444','natacion','2016','n'); 36 | ('23333444','natacion','2015','s'); 37 | ('23333444','tenis','2016','s'); 38 | ('23333444','natacion','2016','s'); 39 | ('25333444','tenis','2016','n'); 40 | ('25333444','basquet','2016','n'); 41 | 42 | 4- Muestre el nombre del socio, deporte y año realizando un join: 43 | 44 | 5- Muestre los nombres de los socios que no se han inscripto nunca en un deporte: 45 | -------------------------------------------------------------------------------- /Enunciados de problemas/57) Join IV: -------------------------------------------------------------------------------- 1 | Una clínica registra las consultas de los pacientes en una tabla llamada "consultas" y en otra 2 | tabla denominada "obrassociales" almacena los datos de las obras sociales que atiende. 3 | 4 | 1- Elimine las tablas "consultas" y "obrassociales" si existen. 5 | 6 | 2- Cree las tablas: 7 | 8 | create table consultas( 9 | fecha date, 10 | hora time, 11 | documento char(8) not null, 12 | codigoobrasocial tinyint unsigned, 13 | medico varchar(30), 14 | primary key(fecha,hora,medico) 15 | ); 16 | 17 | create table obrassociales( 18 | codigo tinyint unsigned auto_increment, 19 | nombre varchar(15), 20 | monto decimal(5,2) unsigned, 21 | primary key(codigo) 22 | ); 23 | 24 | 3- Ingrese algunos registros: 25 | 26 | obrassociales: 27 | ('PAMI',2); 28 | ('IPAM',5); 29 | ('OSDOP',3); 30 | 31 | consultas: 32 | ('2006-08-10','8:00','22333444',1,'Perez'); 33 | ('2006-08-10','10:00','22333444',1,'Lopez'); 34 | ('2006-08-10','8:30','23333444',1,'Perez'); 35 | ('2006-08-10','9:00','24333444',2,'Perez'); 36 | ('2006-08-10','10:00','25333444',3,'Perez'); 37 | ('2006-08-10','8:30','25333444',1,'Garcia'); 38 | ('2006-09-10','8:30','25333444',1,'Lopez'); 39 | 40 | 4- Muestre la fecha,hora,documento del paciente, médico, nombre y monto de la obra social de todas 41 | las consultas: 42 | 43 | 5- Muestre fecha,hora,documento del paciente y nombre de la obra social para las consultas del 44 | doctor "Perez": 45 | 46 | 6- Muestre las obras sociales DISTINTAS que atendió el doctor "Perez" el día "2006-08-10": 47 | -------------------------------------------------------------------------------- /Enunciados de problemas/60) Left Join III: -------------------------------------------------------------------------------- 1 | Un club de barrio realiza una rifa anual y guarda los datos de las rifas en dos tablas, una 2 | denominada "premios" y otra llamada "numerosrifa". 3 | 4 | 1- Elimine las tablas "premios" y "numerosrifa" si existen. 5 | 6 | 2- Cree las tablas: 7 | 8 | create table premios( 9 | posicion tinyint unsigned auto_increment, 10 | premio varchar(40), 11 | numeroganador tinyint unsigned, 12 | primary key(posicion) 13 | ); 14 | 15 | create table numerosrifa( 16 | numero tinyint unsigned not null, 17 | documento char(8) not null, 18 | primary key(numero) 19 | ); 20 | 21 | 3- Ingrese algunos registros: 22 | 23 | premios: 24 | (1,'PC I7',205); 25 | (2,'Televisor 75 pulgadas',29); 26 | (3,'Microondas',5); 27 | (4,'Multiprocesadora',15); 28 | (5,'Cafetera',33); 29 | 30 | numerosrifa: 31 | (205,'22333444'); 32 | (200,'23333444'); 33 | (5,'23333444'); 34 | (8,'23333444'); 35 | (1,'24333444'); 36 | (109,'28333444'); 37 | (15,'30333444'); 38 | (28,'32333444'); 39 | (29,'29333444'); 40 | 41 | 4- Muestre todos los números de rifas vendidos ("numerosrifas") y realice un "left join" mostrando 42 | la posición y el premio: 43 | 44 | 5- Muestre los mismos datos anteriores pero teniendo en cuenta los números ganadores solamente: 45 | 46 | 6- Realice un "left join" pero en esta ocasión busque los números ganadores de la tabla "premios" 47 | en la tabla "numerosrifa": 48 | 49 | 7- Realice el mismo "join" anterior pero sin considerar los valores de "premios" que no encuentren 50 | coincidencia en "numerosrifa". 51 | -------------------------------------------------------------------------------- /Enunciados de problemas/62) Cross Join I: -------------------------------------------------------------------------------- 1 | Varias tablas (cross join) 2 | 3 | Problema: 4 | 5 | Una empresa de seguridad almacena los datos de sus guardias de seguridad en una tabla 6 | llamada "guardias". también almacena los distintos sitios que solicitaron sus servicios en una 7 | tabla llamada "tareas". 8 | 9 | 1- Elimine las tablas "guardias" y "tareas" si existen. 10 | 11 | 2- Cree las siguientes tablas: 12 | 13 | create table guardias( 14 | documento char(8), 15 | nombre varchar(30), 16 | sexo char(1), /* 'f' o 'm' */ 17 | domicilio varchar(30), 18 | primary key (documento) 19 | ); 20 | 21 | create table tareas( 22 | codigo tinyint unsigned auto_increment, 23 | domicilio varchar(30), 24 | descripcion varchar(30), 25 | horario char(2), /* 'AM' o 'PM'*/ 26 | primary key (codigo) 27 | ); 28 | 29 | 3- Ingrese los siguientes registros: 30 | 31 | guardias: 32 | ('22333444','Juan Perez','m','Colon 123'); 33 | ('23333444','Lorena Viale','f','Sarmiento 988'); 34 | ('24333444','Alberto Torres','m','San Martin 567'); 35 | ('25333444','Luis Ferreyra','m','Chacabuco 235'); 36 | ('26333444','Irma Gonzalez','f','Mariano Moreno 111'); 37 | 38 | tareas: 39 | ('Colon 1111','vigilancia exterior','AM'); 40 | ('Urquiza 234','vigilancia exterior','PM'); 41 | ('Peru 345','vigilancia interior','AM'); 42 | ('Avellaneda 890','vigilancia interior','PM'); 43 | 44 | 4- La empresa quiere que todos sus empleados realicen todas las tareas. Realice una "cross join": 45 | 46 | 5- Obtenga la misma salida realizando un simple "join" sin parte "on": 47 | -------------------------------------------------------------------------------- /Enunciados de problemas/31) Alias: -------------------------------------------------------------------------------- 1 | Alias 2 | 3 | Problema: 4 | 5 | Una empresa tiene registrados sus clientes en una tabla llamada "clientes". 6 | 7 | 1- Elimine la tabla "clientes", si existe. 8 | 9 | 2- Créela con la siguiente estructura: 10 | 11 | create table clientes ( 12 | codigo int unsigned auto_increment, 13 | nombre varchar(30) not null, 14 | domicilio varchar(30), 15 | ciudad varchar(20), 16 | provincia varchar (20), 17 | telefono varchar(11), 18 | primary key(codigo) 19 | ); 20 | 21 | 3- Ingrese algunos registros: 22 | ('Lopez Marcos', 'Colon 111', 'Córdoba','Cordoba','null'); 23 | ('Perez Ana', 'San Martin 222', 'Cruz del Eje','Cordoba','4578585'); 24 | ('Garcia Juan', 'Rivadavia 333', 'Villa Maria','Cordoba','4578445'); 25 | ('Perez Luis', 'Sarmiento 444', 'Rosario','Santa Fe',null); 26 | ('Pereyra Lucas', 'San Martin 555', 'Cruz del Eje','Cordoba','4253685'); 27 | ('Gomez Ines', 'San Martin 666', 'Santa Fe','Santa Fe','0345252525'); 28 | ('Torres Fabiola', 'Alem 777', 'Villa del Rosario','Cordoba','4554455'); 29 | ('Lopez Carlos', 'Irigoyen 888', 'Cruz del Eje','Cordoba',null); 30 | ('Ramos Betina', 'San Martin 999', 'Cordoba','Cordoba','4223366'); 31 | ('Lopez Lucas', 'San Martin 1010', 'Posadas','Misiones','0457858745'); 32 | 33 | 4- Obtenga el total de los registros que no tienen valor nulo en los teléfonos y coloque un alias 34 | para dicha columna: 35 | 36 | 5- Muestre la cantidad de clientes que se apellidan "Perez" colocando un alias para dicha salida: 37 | 38 | 6- Obtenga la cantidad de ciudades DISTINTAS por provincia en las cuales hay clientes, coloque un alias: 39 | -------------------------------------------------------------------------------- /Resolución de problemas/21-ClausulaOrderBy.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla "medicamentos", si existe. 2 | 3 | DROP TABLE IF EXISTS medicamentos; 4 | 5 | -- 2- Cree la tabla con la siguiente estructura: 6 | 7 | CREATE TABLE medicamentos( 8 | codigo INT UNSIGNED AUTO_INCREMENT, 9 | nombre VARCHAR(20), 10 | laboratorio VARCHAR(20), 11 | precio DECIMAL(5,2), 12 | cantidad INT UNSIGNED, 13 | PRIMARY KEY(codigo) 14 | ); 15 | 16 | -- 3- Visualice la estructura de la tabla "medicamentos". 17 | 18 | DESCRIBE medicamentos; 19 | 20 | /* 4- Ingrese los siguientes registros: 21 | 22 | ('Sertal','Roche',5.2,100); 23 | ('Buscapina','Roche',4.10,200); 24 | ('Amoxidal 500','Bayer',15.60,100); 25 | ('Paracetamol 500','Bago',1.90,200); 26 | ('Bayaspirina','Bayer',2.10,150); 27 | ('Amoxidal jarabe','Bayer',5.10,250); */ 28 | 29 | INSERT INTO medicamentos (nombre, laboratorio, precio, cantidad) 30 | VALUES('Sertal','Roche',5.2,100), 31 | ('Buscapina','Roche',4.10,200), 32 | ('Amoxidal 500','Bayer',15.60,100), 33 | ('Paracetamol 500','Bago',1.90,200), 34 | ('Bayaspirina','Bayer',2.10,150), 35 | ('Amoxidal jarabe','Bayer',5.10,250); 36 | 37 | -- 5- Ordene los registros por precio, de mayor a menor. 38 | 39 | SELECT * FROM medicamentos 40 | ORDER BY precio DESC; 41 | 42 | -- 6- Ordene los medicamentos por número del campo "cantidad". 43 | 44 | SELECT * FROM medicamentos 45 | ORDER BY cantidad; 46 | 47 | -- 7- Ordene los registros por "laboratorio" (descendente) y cantidad (ascendente). 48 | 49 | SELECT * FROM medicamentos 50 | ORDER BY laboratorio DESC, cantidad ASC; 51 | -------------------------------------------------------------------------------- /Resolución de problemas/41-AlterTableAdd.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla "peliculas", si existe. 2 | 3 | DROP TABLE IF EXISTS peliculas; 4 | 5 | -- 2- Cree la tabla con la siguiente estructura: 6 | 7 | CREATE TABLE peliculas( 8 | codigo INT UNSIGNED AUTO_INCREMENT, 9 | nombre VARCHAR(30) NOT NULL, 10 | actor VARCHAR(20), 11 | PRIMARY KEY(codigo) 12 | ); 13 | 14 | -- 3- Ingrese algunos registros. 15 | 16 | INSERT INTO peliculas (nombre, actor) 17 | VALUES('El Padrino', 'Marlon Brando'), 18 | ('Titanic', 'Leonardo DiCaprio'), 19 | ('Forrest Gump', 'Tom Hanks'), 20 | ('Matrix', 'Keanu Reeves'), 21 | ('Gladiador', 'Russell Crowe'), 22 | ('El Caballero de la Noche', 'Christian Bale'), 23 | ('Pulp Fiction', 'John Travolta'), 24 | ('El Lobo de Wall Street', 'Leonardo DiCaprio'), 25 | ('Harry Potter', 'Daniel Radcliffe'), 26 | ('El Señor de los Anillos', 'Viggo Mortensen'); 27 | 28 | -- 4- Agregue un campo para almacenar la duración de la película, de tipo tinyint unsigned: 29 | 30 | ALTER TABLE peliculas 31 | ADD duracion TINYINT UNSIGNED; 32 | 33 | -- 5- Visualice la estructura de la tabla. 34 | 35 | DESCRIBE peliculas; 36 | 37 | -- 6- Agregue el campo "director" para almacenar el nombre del director, de tipo varchar(20): 38 | 39 | ALTER TABLE peliculas 40 | ADD director VARCHAR(20); 41 | 42 | -- 7- Visualice la estructura de la tabla con su nuevo campo: 43 | 44 | DESCRIBE peliculas; 45 | 46 | -- 8- Intente agregar un campo existente: 47 | 48 | ALTER TABLE peliculas 49 | ADD actor VARCHAR(20); 50 | 51 | -- No se puede ingresar un capo repetido ya que nos tira error "Duplicate column" 52 | -------------------------------------------------------------------------------- /Enunciados de problemas/22) Operadores Lógicos: -------------------------------------------------------------------------------- 1 | Operadores Lógicos (and - or - not) 2 | 3 | Problema: 4 | 5 | Trabaje con la tabla llamada "medicamentos" de una farmacia. 6 | 7 | 1- Elimine la tabla "medicamentos", si existe. 8 | 9 | 2- Cree y utilice la tabla con la siguiente estructura: 10 | 11 | create table medicamentos( 12 | codigo int unsigned auto_increment, 13 | nombre varchar(20), 14 | laboratorio varchar(20), 15 | precio decimal(5,2), 16 | cantidad int unsigned, 17 | primary key(codigo) 18 | ); 19 | 20 | 3- Visualice la estructura de la tabla "medicamentos". 21 | 22 | 4- Ingrese los siguientes registros: 23 | 24 | ('Sertal','Roche',5.2,100); 25 | ('Buscapina','Roche',4.10,200); 26 | ('Amoxidal 500','Bayer',15.60,100); 27 | ('Paracetamol 500','Bago',1.90,200); 28 | ('Bayaspirina','Bayer',2.10,150); 29 | ('Amoxidal jarabe','Bayer',5.10,250); 30 | 31 | 5- Recupere los códigos y nombres de los medicamentos cuyo laboratorio sea 'Roche' y cuyo precio 32 | sea menor a 5: 33 | 34 | 6- Recupere los medicamentos cuyo laboratorio sea 'Roche' o cuyo precio sea menor a 5: 35 | 36 | 7- Muestre todos los registros que no sean de "Bayer" usando el operador "not". 37 | 38 | 8- Muestre todos los medicamentos cuyo laboratorio NO sea "Bayer" y cuya cantidad sea=100: 39 | 40 | 9- Muestre todos los medicamentos cuyo laboratorio sea "Bayer" y cuya cantidad NO sea=100: 41 | 42 | 10- Elimine todos los registros cuyo laboratorio sea igual a "Bayer" y su precio sea mayor a 10: 43 | 44 | 11- Cambie la cantidad por 200, a todos los medicamentos de "Roche" cuyo precio sea mayor a 5: 45 | 46 | 12- Borre los medicamentos cuyo laboratorio sea "Bayer" o cuyo precio sea menor a 3. 47 | -------------------------------------------------------------------------------- /Enunciados de problemas/67) Funcion IF con varias tablas: -------------------------------------------------------------------------------- 1 | Función de control if con varias tablas. 2 | 3 | Problema: 4 | 5 | Un profesor guarda los promedios de sus alumnos de un curso en una tabla llamada "alumnos" y las 6 | notas de los mismos en la tabla "notas". 7 | 8 | 1- Elimine las tablas "alumnos", "notas" si existen. 9 | 10 | 2- Cree las tablas: 11 | 12 | create table alumnos( 13 | documento char(8) not null, 14 | nombre varchar(30), 15 | primary key(documento) 16 | ); 17 | 18 | create table notas( 19 | documento char(8) not null, 20 | nota decimal(4,2) unsigned 21 | ); 22 | 23 | 3- Ingrese los siguientes registros: 24 | 25 | alumnos: 26 | ('22333444','Juan Perez'); 27 | ('23555666','Marina Herrero'); 28 | ('24000333','Daniel Juarez'); 29 | ('25222111','Hector Paz'); 30 | 31 | notas: 32 | ('22333444',7); 33 | ('23555666',8); 34 | ('24000333',3); 35 | ('25222111',7); 36 | ('22333444',7); 37 | ('23555666',9); 38 | ('24000333',4); 39 | ('22333444',6); 40 | ('23555666',10); 41 | ('24000333',3); 42 | ('25222111',9); 43 | ('23555666',10); 44 | 45 | No todos los alumnos tienen la misma cantidad de notas porque algunos presentaron trabajos extras o 46 | no asistieron a los examenes. 47 | 48 | 4- Muestre el documento del alumno, su nombre y el promedio; si el alumno tiene un promedio menor a 49 | 4, muestre un mensaje "reprobado", si el promedio es mayor o igual a 4 y menor a 7, 50 | muestre "regular", si el promedio es mayor a 7, muestre "promocionado", usando "case": 51 | 52 | 5- Muestre el documento y nombre del alumno y con un "if" si el alumno está aprobado o no: 53 | 54 | 6- Muestre el documento, nombre del alumno y con un "case", si tiene 1 nota, 2 notas o más de 2 55 | notas: 56 | -------------------------------------------------------------------------------- /Enunciados de problemas/75) Subconsulta en lugar de una tabla: -------------------------------------------------------------------------------- 1 | Subconsulta en lugar de una tabla 2 | 3 | Problema: 4 | 5 | Un club dicta clases de distintos deportes. En una tabla llamada "socios" guarda los datos de los 6 | socios, en una tabla llamada "deportes" la información referente a los diferentes deportes que se 7 | dictan y en una tabla denominada "inscriptos", las inscripciones de los socios a los distintos 8 | deportes. 9 | Un socio puede inscribirse en varios deportes el mismo año. Un socio no puede inscribirse en el 10 | mismo deporte el mismo año. Distintos socios se inscriben en un mismo deporte en el mismo año. 11 | 12 | 1- Cree las tablas con las siguientes estructuras: 13 | 14 | create table socios( 15 | documento char(8) not null, 16 | nombre varchar(30), 17 | domicilio varchar(30), 18 | primary key(documento) 19 | ); 20 | 21 | create table deportes( 22 | codigo int auto_increment, 23 | nombre varchar(20), 24 | profesor varchar(15), 25 | primary key(codigo) 26 | ); 27 | 28 | create table inscriptos( 29 | documento char(8) not null, 30 | codigodeporte smallint not null, 31 | año char(4), 32 | matricula char(1), --'s'=paga, 'n'=impaga 33 | primary key(documento,codigodeporte,año) 34 | ); 35 | 36 | 2- Ingrese algunos registros en las 3 tablas: 37 | 38 | 3- Realice una consulta en la cual muestre todos los datos de las inscripciones, incluyendo el 39 | nombre del deporte y del profesor. 40 | 41 | 4- Utilice el resultado de la consulta anterior como una tabla derivada para emplear en lugar de una 42 | tabla para realizar un "join" y recuperar el nombre del socio, el deporte en el cual está inscripto, 43 | el año, el nombre del profesor y la matrícula. 44 | -------------------------------------------------------------------------------- /Resolución de problemas/38-ClausulaLimit.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla "peliculas" si existe. 2 | 3 | DROP TABLE IF EXISTS peliculas; 4 | 5 | /* 2- Créela con la siguiente estructura: 6 | 7 | -codigo (entero sin signo, autoincrementable), 8 | -titulo (cadena de 30), not null, 9 | -actor (cadena de 20), 10 | -duracion (entero sin signo no mayor a 200 aprox.), 11 | -clave primaria (codigo). */ 12 | 13 | CREATE TABLE peliculas( 14 | codigo INT UNSIGNED AUTO_INCREMENT, 15 | titulo VARCHAR(30) NOT NULL, 16 | actor VARCHAR(20), 17 | duracion TINYINT UNSIGNED CHECK (duracion <= 200), 18 | PRIMARY KEY (codigo) 19 | ); 20 | 21 | -- 3- Ingrese 10 registros. 22 | 23 | INSERT INTO peliculas (titulo, actor, duracion) 24 | VALUES('El Padrino', 'Marlon Brando', 175), 25 | ('Titanic', 'Leonardo DiCaprio', 195), 26 | ('Inception', 'Leonardo DiCaprio', 148), 27 | ('Matrix', 'Keanu Reeves', 136), 28 | ('Forrest Gump', 'Tom Hanks', 142), 29 | ('Gladiador', 'Russell Crowe', 155), 30 | ('Interstellar', 'Matthew McConaughey', 169), 31 | ('El Caballero Oscuro', 'Christian Bale', 152), 32 | ('Pulp Fiction', 'John Travolta', 154), 33 | ('El Señor de los Anillos', 'Elijah Wood', 178); 34 | 35 | -- 4- Realice una consulta limitando la salida a sólo 5 registros. 36 | 37 | SELECT * FROM peliculas 38 | LIMIT 5; 39 | 40 | -- 5- Muestre los registros desde el 1 al 8 usando un solo argumento. 41 | 42 | SELECT * FROM peliculas 43 | LIMIT 8; 44 | 45 | -- 6- Muestre 3 registros a partir del 4. 46 | 47 | SELECT * FROM peliculas 48 | LIMIT 3,3; 49 | 50 | -- 7- Muestre los registros a partir del 2 hasta el final. 51 | 52 | SELECT * FROM peliculas 53 | LIMIT 1,10000; 54 | -------------------------------------------------------------------------------- /Enunciados de problemas/29) Having: -------------------------------------------------------------------------------- 1 | Selección de un grupo de registros (having) 2 | 3 | Problema: 4 | 5 | Una empresa tiene registrados sus clientes en una tabla llamada "clientes". 6 | 7 | 1- Elimine la tabla "clientes", si existe. 8 | 9 | 2- Créela con la siguiente estructura: 10 | create table clientes ( 11 | codigo int unsigned auto_increment, 12 | nombre varchar(30) not null, 13 | domicilio varchar(30), 14 | ciudad varchar(20), 15 | provincia varchar (20), 16 | telefono varchar(11), 17 | primary key(codigo) 18 | ); 19 | 20 | 3- Ingrese algunos registros: 21 | 22 | ('Lopez Marcos', 'Colon 111', 'Córdoba','Cordoba','null'); 23 | ('Perez Ana', 'San Martin 222', 'Cruz del Eje','Cordoba','4578585'); 24 | ('Garcia Juan', 'Rivadavia 333', 'Villa Maria','Cordoba','4578445'); 25 | ('Perez Luis', 'Sarmiento 444', 'Rosario','Santa Fe',null); 26 | ('Pereyra Lucas', 'San Martin 555', 'Cruz del Eje','Cordoba','4253685'); 27 | ('Gomez Ines', 'San Martin 666', 'Santa Fe','Santa Fe','0345252525'); 28 | ('Torres Fabiola', 'Alem 777', 'Villa del Rosario','Cordoba','4554455'); 29 | ('Lopez Carlos', 'Irigoyen 888', 'Cruz del Eje','Cordoba',null); 30 | ('Ramos Betina', 'San Martin 999', 'Cordoba','Cordoba','4223366'); 31 | ('Lopez Lucas', 'San Martin 1010', 'Posadas','Misiones','0457858745'); 32 | 33 | 4- Obtenga el total de los registros agrupados por provincia: 34 | 35 | 5- Obtenga el total de los registros agrupados por ciudad y provincia: 36 | 37 | 6- Obtenga el total de los registros agrupados por ciudad y provincia sin considerar los que tienen 38 | menos de 2 clientes: 39 | 40 | 7- Obtenga el total de los registros sin teléfono nulo, agrupados por ciudad y provincia sin 41 | considerar los que tienen menos de 2 clientes: 42 | -------------------------------------------------------------------------------- /Enunciados de problemas/25) Regexp: -------------------------------------------------------------------------------- 1 | Búsqueda de patrones - Regular Expresion 2 | (regexp) 3 | 4 | Problema: 5 | Trabaje con la tabla "agenda" que registra la información referente a sus amigos. 6 | 7 | 1- Elimine la tabla si existe. 8 | 9 | 2- Cree la tabla con la siguiente estructura: 10 | 11 | create table agenda( 12 | apellido varchar(30), 13 | nombre varchar(20) not null, 14 | domicilio varchar(30), 15 | telefono varchar(11), 16 | mail varchar(30) 17 | ); 18 | 19 | 3- Ingrese los siguientes registros: 20 | 21 | ('Perez','Juan','Sarmiento 345','4334455','juancito@gmail.com'); 22 | ('Garcia','Ana','Urquiza 367','4226677','anamariagarcia@hotmail.com'); 23 | ('Lopez','Juan','Avellaneda 900',null,'juancitoLopez@gmail.com'); 24 | ('Juarez','Mariana','Sucre 123','0525657687','marianaJuarez2@gmail.com'); 25 | ('Molinari','Lucia','Peru 1254','4590987','molinarilucia@hotmail.com'); 26 | ('Ferreyra','Patricia','Colon 1534','4585858',null); 27 | ('Perez','Susana','San Martin 333',null,null); 28 | ('Perez','Luis','Urquiza 444','0354545256','perezluisalberto@hotmail.com'); 29 | ('Lopez','Maria','Salta 314',null,'lopezmariayo@gmail.com'); 30 | 31 | 4- Busque todos los mails que contengan la cadena "gmail": 32 | 33 | 5- Busque los nombres que no tienen "z" ni "g": 34 | 35 | 6- Busque los apellidos que tienen por lo menos una de las letras de la "v" hasta la "z" (v,w,x,y,z): 36 | 37 | 7- Seleccione los apellidos que terminen en "ez": 38 | 39 | 8- Seleccione los apellidos, nombres y domicilios de los amigos cuyos apellidos contengan 2 letras "i": 40 | 41 | 9- Seleccione los teléfonos que tengan 7 caracteres exactamente: 42 | 43 | 10- Seleccione el nombre y mail de todos los amigos cuyos mails tengan al menos 20 caracteres: 44 | -------------------------------------------------------------------------------- /Resolución de problemas/74-SubconsultaSimilAutocombinacion.sql: -------------------------------------------------------------------------------- 1 | -- 1- Borre y luego cree la tabla 'deportes': 2 | 3 | DROP TABLE IF EXISTS deportes; 4 | 5 | CREATE TABLE deportes( 6 | nombre VARCHAR(15), 7 | profesor VARCHAR(30), 8 | dia VARCHAR(10), 9 | cuota DECIMAL(5,2) 10 | ); 11 | 12 | -- 2- Ingrese algunos registros. Incluya profesores que dicten más de un curso: 13 | 14 | INSERT INTO deportes 15 | VALUES('tenis','Ana Lopez','lunes',20), 16 | ('natacion','Ana Lopez','martes',15), 17 | ('futbol','Carlos Fuentes','miercoles',10), 18 | ('basquet','Gaston Garcia','jueves',15), 19 | ('padle','Juan Huerta','lunes',15), 20 | ('handball','Juan Huerta','martes',10); 21 | 22 | -- 3- Muestre los nombres de los profesores que dictan más de un deporte empleando subconsulta. 23 | 24 | SELECT DISTINCT d1.profesor 25 | FROM deportes AS d1 26 | WHERE d1.profesor IN 27 | (SELECT d2.profesor 28 | FROM deportes AS d2 29 | WHERE d1.nombre <> d2.nombre); 30 | 31 | -- 4- Obtenga el mismo resultado empleando join. 32 | 33 | SELECT DISTINCT d1.profesor 34 | FROM deportes AS d1 35 | JOIN deportes AS d2 36 | ON d1.profesor=d2.profesor 37 | WHERE d1.nombre <> d2.nombre; 38 | 39 | /* 5- Buscamos todos los deportes que se dictan el mismo día que un determinado deporte (natacion) 40 | empleando subconsulta. */ 41 | 42 | SELECT nombre 43 | FROM deportes 44 | WHERE nombre<>'natacion' AND 45 | dia = 46 | (SELECT dia 47 | FROM deportes 48 | WHERE nombre='natacion'); 49 | 50 | -- 6- Obtenga la misma salida empleando "join". 51 | 52 | SELECT d1.nombre 53 | FROM deportes AS d1 54 | JOIN deportes AS d2 55 | ON d1.dia=d2.dia 56 | WHERE d2.nombre='natacion' 57 | AND d1.nombre<>d2.nombre; 58 | -------------------------------------------------------------------------------- /Resolución de problemas/14-TiposDeDatos(Texto).sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla "autos" si existe. 2 | 3 | DROP TABLE IF EXISTS autos; 4 | 5 | -- 2- Cree la tabla con los siguientes campos: patente (primary key), marca, modelo y precio: 6 | 7 | CREATE TABLE autos( 8 | patente CHAR(6), 9 | marca VARCHAR(20), 10 | modelo CHAR(4), 11 | precio FLOAT UNSIGNED, 12 | PRIMARY KEY(patente) 13 | ); 14 | 15 | /* 3- Ingrese los siguientes registros: 16 | 17 | ('ACD123','Fiat 128','1970',15000); 18 | ('ACG234','Renault 11','1990',40000); 19 | ('BCD333','Peugeot 505','1990',80000); 20 | ('GCD123','Renault Clio','1990',70000); 21 | ('BCC333','Renault Megane','1998',95000); 22 | ('BVF543','Fiat 128','1975',20000); */ 23 | 24 | INSERT INTO autos (patente,marca,modelo,precio) 25 | VALUES('ACD123','Fiat 128','1970',15000), 26 | ('ACG234','Renault 11','1990',40000), 27 | ('BCD333','Peugeot 505','1990',80000), 28 | ('GCD123','Renault Clio','1990',70000), 29 | ('BCC333','Renault Megane','1998',95000), 30 | ('BVF543','Fiat 128','1975',20000); 31 | 32 | /* He definido el campo "patente" de tipo "char" y no "varchar" porque la cadena de caracteres 33 | siempre tendrá la misma longitud (6 caracteres), con esta definición ocupa 6 bytes, si lo 34 | hubiése definido como "varchar(6)" ocuparía 7 bytes. Lo mismo sucede con el campo "modelo", en 35 | el cual se almacena el año, por lo que necesita 4 caracteres fijos. Para el campo "precio" definí un 36 | float sin signo porque los valores nunca serán negativos. */ 37 | 38 | -- 4- Seleccione todos los autos del año 1990: 39 | 40 | SELECT * FROM autos 41 | WHERE modelo='1990'; 42 | 43 | -- 5- Seleccione todos los autos con precio superior a 50000: 44 | 45 | SELECT * FROM autos 46 | WHERE precio>50000; 47 | -------------------------------------------------------------------------------- /Resolución de problemas/68-VariablesDeUsuario.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla "peliculas" si existe. 2 | 3 | DROP TABLE IF EXISTS peliculas; 4 | 5 | -- 2- Créela con la siguiente estructura: 6 | 7 | CREATE TABLE peliculas ( 8 | codigo SMALLINT UNSIGNED AUTO_INCREMENT, 9 | titulo VARCHAR(40) NOT NULL, 10 | actor VARCHAR(30), 11 | duracion TINYINT UNSIGNED, 12 | PRIMARY KEY(codigo) 13 | ); 14 | 15 | /* 3- Ingrese los siguientes registros: 16 | 17 | ('Elsa y Fred','China Zorrilla',90); 18 | ('Mision imposible','Tom Cruise',120); 19 | ('Mision imposible 2','Tom Cruise',180); 20 | ('Harry Potter y la piedra filosofal','Daniel H.',120); 21 | ('Harry Potter y la camara secreta','Daniel H.',150); */ 22 | 23 | INSERT INTO peliculas (titulo, actor,duracion) 24 | VALUES('Elsa y Fred','China Zorrilla',90), 25 | ('Mision imposible','Tom Cruise',120), 26 | ('Mision imposible 2','Tom Cruise',180), 27 | ('Harry Potter y la piedra filosofal','Daniel H.',120), 28 | ('Harry Potter y la camara secreta','Daniel H.',150); 29 | 30 | -- 4- Guarde en dos variables el valor de duración de la película más larga y el de la más corta: 31 | 32 | SELECT @mayorduracion:=MAX(duracion), 33 | @menorduracion:= MIN(duracion) 34 | FROM peliculas; 35 | 36 | -- 5- Muestre todos los datos de ambas peliculas; 37 | 38 | SELECT * FROM peliculas 39 | WHERE duracion=@mayorduracion 40 | OR duracion=@menorduracion; 41 | 42 | -- 6- Guarde en una variable el nombre del actor de la película de mayor duración: 43 | 44 | SELECT @actor:=actor 45 | FROM peliculas 46 | WHERE duracion=@mayorduracion; 47 | 48 | -- 7- Muestre todas las películas en las cuales trabaja el autor almacenado en la variable "@actor": 49 | 50 | SELECT * FROM peliculas 51 | WHERE actor=@actor; 52 | -------------------------------------------------------------------------------- /Resolución de problemas/76-Subconsulta(Insert).sql: -------------------------------------------------------------------------------- 1 | -- 1-Cree las tablas (las borramos primero si ya existen): 2 | 3 | DROP TABLE IF EXISTS clientes, facturas; 4 | 5 | CREATE TABLE clientes( 6 | codigo INT AUTO_INCREMENT, 7 | nombre VARCHAR(30), 8 | domicilio VARCHAR(30), 9 | PRIMARY KEY(codigo) 10 | ); 11 | 12 | CREATE TABLE facturas( 13 | numero INT NOT NULL, 14 | fecha DATE, 15 | codigocliente INT NOT NULL, 16 | total DECIMAL(6,2), 17 | PRIMARY KEY(numero) 18 | ); 19 | 20 | -- 2-Ingrese algunos registros: 21 | 22 | INSERT INTO clientes(nombre,domicilio) 23 | VALUES('Juan Lopez','Colon 123'), 24 | ('Luis Torres','Sucre 987'), 25 | ('Ana Garcia','Sarmiento 576'), 26 | ('Susana Molina','San Martin 555'); 27 | 28 | INSERT INTO facturas 29 | VALUES(1200,'2018-01-15',1,300), 30 | (1201,'2018-01-15',2,550), 31 | 1202,'2018-01-15',3,150), 32 | (1300,'2018-01-20',1,350), 33 | (1310,'2018-01-22',3,100); 34 | 35 | /* 3- El comercio necesita una tabla llamada "clientespref" en la cual quiere almacenar el nombre y 36 | domicilio de aquellos clientes que han comprado hasta el momento más de 500 pesos en mercaderías. */ 37 | 38 | CREATE TABLE clientespref( 39 | nombre VARCHAR(30), 40 | domicilio VARCHAR(30) 41 | ); 42 | 43 | /* 4- Ingrese los registros en la tabla "clientespref" seleccionando registros de la tabla "clientes" y 44 | "facturas". */ 45 | 46 | INSERT INTO clientespref (nombre,domicilio) 47 | SELECT nombre,domicilio 48 | FROM clientes AS c 49 | INNER JOIN facturas AS f 50 | ON f.codigocliente=c.codigo 51 | GROUP BY codigocliente 52 | HAVING SUM(total)>500; 53 | 54 | -- 5- Vea los registros de "clientespref": 55 | 56 | SELECT * FROM clientespref; 57 | -------------------------------------------------------------------------------- /Resolución de problemas/81-ProcedimientosAlmacenadosIII.sql: -------------------------------------------------------------------------------- 1 | -- 1- Eliminamos la tabla, si existe y la creamos: 2 | 3 | DROP TABLE IF EXISTS empleados; 4 | 5 | CREATE TABLE empleados( 6 | documento CHAR(8), 7 | nombre VARCHAR(20), 8 | apellido VARCHAR(20), 9 | sueldo DECIMAL(6,2), 10 | cantidadhijos INT, 11 | seccion VARCHAR(20), 12 | PRIMARY KEY(documento) 13 | ); 14 | 15 | -- 2- Ingrese algunos registros: 16 | 17 | INSERT INTO empleados 18 | VALUES('22222222','Juan','Perez',300,2,'Contaduria'), 19 | ('22333333','Luis','Lopez',300,0,'Contaduria'), 20 | ('22444444','Marta','Perez',500,1,'Sistemas'), 21 | ('22555555','Susana','Garcia',400,2,'Secretaria'), 22 | ('22666666','Jose Maria','Morales',400,3,'Secretaria'); 23 | 24 | -- 3- Elimine el procedimiento llamado "pa_empleados_sueldo" si existe: 25 | 26 | DROP PROCEDURE IF EXISTS pa_empleados_sueldo; 27 | 28 | /* 4- Cree un procedimiento almacenado llamado "pa_seccion" al cual le enviamos el nombre de una 29 | sección y que nos retorne el promedio de sueldos de todos los empleados de esa sección y el valor 30 | mayor de sueldo (de esa sección) */ 31 | 32 | delimiter // 33 | 34 | CREATE PROCEDURE pa_seccion( 35 | IN p_seccion VARCHAR(20), 36 | OUT promedio FLOAT, 37 | OUT mayor FLOAT) 38 | BEGIN 39 | SELECT AVG(sueldo) INTO promedio 40 | FROM empleados 41 | WHERE seccion=p_seccion; 42 | SELECT MAX(sueldo) INTO mayor 43 | FROM empleados 44 | WHERE seccion=p_seccion; 45 | END // 46 | 47 | delimiter ; 48 | 49 | 50 | -- 5- Ejecute el procedimiento creado anteriormente con distintos valores. 51 | 52 | CALL pa_seccion('Contaduria', @p, @m); 53 | SELECT @p,@m; 54 | 55 | CALL pa_seccion('Secretaria', @p, @m); 56 | SELECT @p,@m; 57 | -------------------------------------------------------------------------------- /Enunciados de problemas/30) Distinct: -------------------------------------------------------------------------------- 1 | Registros duplicados (distinct) 2 | 3 | Problema: 4 | 5 | Una academia de enseñanza dicta distintos cursos de informática. Los cursos se dictan por la mañana 6 | o por la tarde, todos los días de lunes a viernes. La academia guarda los datos de los cursos en 7 | una tabla llamada "cursos" en la cual almacena el código del curso, el tema, los días de la semana 8 | que se dicta, el horario, por la mañana (AM) o por la tarde (PM), la cantidad de clases que incluye 9 | cada curso (clases), la fecha de inicio y el costo del curso. 10 | 11 | 1- Elimine la tabla "cursos", si existe. 12 | 13 | 2- Cree la tabla "cursos" con la siguiente estructura: 14 | 15 | create table cursos( 16 | codigo tinyint unsigned auto_increment, 17 | tema varchar(20) not null, 18 | horario char(2) not null, 19 | clases tinyint unsigned default 10, 20 | fechainicio date, 21 | costo decimal(5,2) unsigned, 22 | primary key(codigo) 23 | ); 24 | 25 | 3- Ingrese los siguientes registros: 26 | 27 | ('PHP básico','AM',10,'2006-08-07',200); 28 | ('PHP básico','PM',default,'2006-08-14',200); 29 | ('PHP básico','AM',default,'2006-08-05',200); 30 | ('PHP avanzado','AM',20,'2006-08-01',350); 31 | ('JavaScript básico','PM',15,'2006-09-11',150); 32 | ('Paginas web','PM',15,'2006-08-08',200); 33 | ('Paginas web','AM',15,'2006-08-12',200); 34 | ('Paginas web','AM',15,'2006-08-21',200); 35 | ('HTML avanzado','AM',20,'2006-09-18',180); 36 | ('HTML avanzado','PM',20,'2006-09-25',180); 37 | ('JavaScript avanzado','PM',25,'2006-09-18',150); 38 | 39 | 4- Obtenga la lista de temas de los cursos sin repetición: 40 | 41 | 5- Seleccione los cursos donde el tema incluya "PHP", sin repetir horario ni tema: 42 | 43 | 6- Cuente la cantidad de cursos DISTINTOS agrupados por horario: 44 | -------------------------------------------------------------------------------- /Resolución de problemas/53.FuncionCASE.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla "alumnos" si existe. 2 | 3 | DROP TABLE IF EXISTS alumnos; 4 | 5 | -- 2- Cree la tabla: 6 | 7 | CREATE TABLE alumnos( 8 | legajo CHAR(5) NOT NULL, 9 | nombre VARCHAR(30), 10 | promedio DECIMAL(4,2) 11 | ); 12 | 13 | /* 3- Ingrese los siguientes registros: 14 | 15 | (3456,'Perez Luis',8.5); 16 | (3556,'Garcia Ana',7.0); 17 | (3656,'Ludueña Juan',9.6); 18 | (2756,'Moreno Gabriela',4.8); 19 | (4856,'Morales Hugo',3.2); 20 | (7856,'Gomez Susana',6.4); */ 21 | 22 | INSERT INTO alumnos 23 | VALUES(3456,'Perez Luis',8.5), 24 | (3556,'Garcia Ana',7.0), 25 | (3656,'Ludueña Juan',9.6), 26 | (2756,'Moreno Gabriela',4.8), 27 | (4856,'Morales Hugo',3.2), 28 | (7856,'Gomez Susana',6.4); 29 | 30 | /* 4- Si el alumno tiene un promedio menor a 4, muestre un mensaje "reprobado", si el promedio es 31 | mayor o igual a 4 y menor a 7, muestre "regular", si el promedio es mayor o igual a 7, 32 | muestre "promocionado", usando la primer sintaxis de "case": */ 33 | 34 | SELECT legajo,promedio, 35 | CASE TRUNCATE(promedio,0) 36 | WHEN 0 THEN 'reprobado' 37 | WHEN 1 THEN 'reprobado' 38 | WHEN 2 THEN 'reprobado' 39 | WHEN 3 THEN 'reprobado' 40 | WHEN 4 THEN 'regular' 41 | WHEN 5 THEN 'regular' 42 | WHEN 6 THEN 'regular' 43 | WHEN 7 THEN 'promocionado' 44 | WHEN 8 THEN 'promocionado' 45 | WHEN 9 THEN 'promocionado' 46 | ELSE 'promocionado' 47 | END AS 'estado' 48 | FROM alumnos; 49 | 50 | -- 5- Obtenga la misma salida anterior pero empleando la sintaxis resumida de "case": 51 | 52 | SELECT legajo,promedio, 53 | CASE WHEN promedio<4 THEN 'reprobado' 54 | WHEN promedio>4 AND promedio<7 THEN 'regular' 55 | ELSE'promocionado' 56 | END AS'estado' 57 | FROM alumnos; 58 | -------------------------------------------------------------------------------- /Resolución de problemas/06-OperadoresRacionales.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine "articulos", si existe: 2 | 3 | DROP TABLE IF EXISTS articulos; 4 | 5 | -- 2- Cree la tabla, con la siguiente información: codigo, nombre, descripcion, precio y cantidad 6 | 7 | CREATE TABLE articulos( 8 | codigo INTEGER, 9 | nombre VARCHAR(20), 10 | descripcion VARCHAR(30), 11 | precio FLOAT, 12 | cantidad INTEGER 13 | ); 14 | 15 | -- 3- Vea la estructura de la tabla. 16 | 17 | DESCRIBE articulos; 18 | 19 | -- 4- Ingrese algunos registros: 20 | 21 | -- (1,'impresora','Epson Stylus C45',400.80,20); 22 | -- (2,'impresora','Epson Stylus C85',500,30); 23 | -- (3,'monitor','Samsung 14',800,10); 24 | -- (4,'teclado','ingles Biswal',100,50); 25 | -- (5,'teclado','español Biswal',90,50); 26 | 27 | INSERT INTO articulos (codigo, nombre, descripcion, precio, cantidad) 28 | VALUES(1,'impresora','Epson Stylus C45',400.80,20), 29 | (2,'impresora','Epson Stylus C85',500,30), 30 | (3,'monitor','Samsung 14',800,10), 31 | (4,'teclado','ingles Biswal',100,50), 32 | (5,'teclado','español Biswal',90,50); 33 | 34 | -- 5- Seleccione todos los registros de la tabla. 35 | 36 | SELECT * FROM articulos; 37 | 38 | -- 6- Muestre los datos de las impresoras. 39 | 40 | SELECT * FROM articulos 41 | WHERE nombre="impresora"; 42 | 43 | -- 7- Seleccione los artículos cuyo precio sea mayor o igual a 500: 44 | 45 | SELECT * FROM articulos 46 | WHERE precio>=500; 47 | 48 | -- 8- Seleccione los artículos cuya cantidad sea menor a 30: 49 | 50 | SELECT * FROM articulos 51 | WHERE cantidad<30; 52 | 53 | -- 9- Selecciones el nombre y descripción de los artículos que no cuesten $100: 54 | 55 | SELECT nombre, descripcion 56 | FROM articulos 57 | WHERE precio<>100; 58 | -------------------------------------------------------------------------------- /Resolución de problemas/23-OperadoresRelacionales.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla "medicamentos", si existe. 2 | 3 | DROP TABLE IF EXISTS medicamentos; 4 | 5 | -- 2- Cree la tabla con la siguiente estructura: 6 | 7 | CREATE TABLE medicamentos( 8 | codigo INT UNSIGNED AUTO_INCREMENT, 9 | nombre VARCHAR(20), 10 | laboratorio VARCHAR(20), 11 | precio DECIMAL(5,2), 12 | cantidad INT UNSIGNED, 13 | PRIMARY KEY(codigo) 14 | ); 15 | 16 | -- 3- Visualice la estructura de la tabla "medicamentos". 17 | 18 | DESCRIBE medicamentos; 19 | 20 | /* 4- Ingrese los siguientes registros: 21 | 22 | ('Sertal','Roche',5.2,100); 23 | ('Buscapina','Roche',4.10,200); 24 | ('Amoxidal 500','Bayer',15.60,100); 25 | ('Paracetamol 500','Bago',1.90,200); 26 | ('Bayaspirina','Bayer',2.10,150); 27 | ('Amoxidal jarabe','Bayer',5.10,250); */ 28 | 29 | INSERT INTO medicamentos (nombre, laboratorio, precio, cantidad) 30 | VALUES('Sertal','Roche',5.2,100), 31 | ('Buscapina','Roche',4.10,200), 32 | ('Amoxidal 500','Bayer',15.60,100), 33 | ('Paracetamol 500','Bago',1.90,200), 34 | ('Bayaspirina','Bayer',2.10,150), 35 | ('Amoxidal jarabe','Bayer',5.10,250); 36 | 37 | -- 5- Recupere los nombres y precios de los medicamentos cuyo precio esté entre 5 y 15: 38 | 39 | SELECT nombre,precio 40 | FROM medicamentos 41 | WHERE precio BETWEEN 5 AND 15; 42 | 43 | -- 6- Seleccione los registros cuyo laboratorio sea "Bayer" o "Bago": 44 | 45 | SELECT * FROM medicamentos 46 | WHERE laboratorio IN ('Bayer','Bago'); 47 | 48 | -- 7- Elimine los registros cuya cantidad esté entre 100 y 200: 49 | 50 | DELETE FROM medicamentos 51 | WHERE cantidad BETWEEN 100 AND 200; 52 | 53 | -- Valido que los cambios se hayan ejecutado con la siguiente consulta 54 | 55 | SELECT * FROM medicamentos; 56 | -------------------------------------------------------------------------------- /Enunciados de problemas/61) Right Join: -------------------------------------------------------------------------------- 1 | Varias tablas (right join) 2 | 3 | Problema: 4 | 5 | Un club dicta clases de distintos deportes. En una tabla llamada "socios" guarda los datos de sus 6 | socios y en una tabla denominada "inscriptos" almacena la información necesaria para las 7 | inscripciones de los socios a los distintos deportes. 8 | 9 | 1- Elimine las tablas "socios" e "inscriptos" si existen. 10 | 11 | 2- Cree las tablas: 12 | 13 | create table socios( 14 | documento char(8) not null, 15 | nombre varchar(30), 16 | domicilio varchar(30), 17 | primary key(documento) 18 | ); 19 | 20 | create table inscriptos( 21 | documento char(8) not null, 22 | deporte varchar(15) not null, 23 | año year, 24 | matricula char(1), /*si esta paga ='s' sino 'n'*/ 25 | primary key(documento,deporte,año) 26 | ); 27 | 28 | 3- Ingrese algunos registros para ambas tablas: 29 | 30 | socios: 31 | ('22333444','Juan Perez','Colon 234'); 32 | ('23333444','Maria Lopez','Sarmiento 465'); 33 | ('24333444','Antonio Juarez','Caseros 980'); 34 | ('25333444','Marcelo Pereyra','Sucre 349'); 35 | 36 | inscriptos: 37 | ('22333444','natacion','2015','s'); 38 | ('22333444','natacion','2016','n'); 39 | ('23333444','natacion','2015','s'); 40 | ('23333444','tenis','2016','s'); 41 | ('23333444','natacion','2016','s'); 42 | ('24333444','tenis','2016','n'); 43 | ('24333444','basquet','2016','n'); 44 | 45 | 4- Realice un "left join" de la tabla "socios" a "inscriptos" buscando coincidencia de "documento": 46 | 47 | 5- Realice un "right join" para obtener la misma salida anterior: 48 | 49 | 6- Ingrese una inscripción de alguien que no sea socio (documento que no se encuentre en la 50 | tabla "socios"): 51 | 52 | 7- Realice un "right join" desde la tabla "socios" a "inscriptos" buscando coincidencia de documento: 53 | -------------------------------------------------------------------------------- /Resolución de problemas/32-ClavePrimariaCompuesta.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla "prestamos" si existe. 2 | 3 | DROP TABLE IF EXISTS prestamos; 4 | 5 | /* 2- Cree la tabla teniendo en cuenta que se necesita una clave que identifique cada registro en la tabla "prestamos". 6 | El mismo libro no puede prestarse en la misma fecha. */ 7 | 8 | CREATE TABLE prestamos( 9 | titulo VARCHAR(40) NOT NULL, 10 | documento CHAR(8) NOT NULL, 11 | fechaprestamo DATE NOT NULL, 12 | fechadevolucion DATE, 13 | devuelto CHAR(1) DEFAULT 'N', 14 | PRIMARY KEY(titulo,fechaprestamo) 15 | ); 16 | 17 | -- Tomo como clave primaria titulo y fechaprestamo 18 | 19 | /* 3- Ingrese los siguientes registros para la tabla "prestamos": 20 | 21 | ('Manual de 1 grado','22333444','2006-07-10'); 22 | ('Manual de 1 grado','22333444','2006-07-20'); 23 | ('Manual de 1 grado','23333444','2006-07-15'); 24 | ('El aleph','22333444','2006-07-10'); 25 | ('El aleph','30333444','2006-08-10'); 26 | 27 | Note que un mismo libro fue prestado a un mismo socio pero en una fecha distinta. */ 28 | 29 | INSERT INTO prestamos (titulo, documento, fechaprestamo) 30 | VALUES('Manual de 1 grado','22333444','2006-07-10'), 31 | ('Manual de 1 grado','22333444','2006-07-20'), 32 | ('Manual de 1 grado','23333444','2006-07-15'), 33 | ('El aleph','22333444','2006-07-10'), 34 | ('El aleph','30333444','2006-08-10'); 35 | 36 | -- 4- Intente ingresar un valor de clave primaria repetida: 37 | 38 | INSERT INTO prestamos (titulo,documento,fechaprestamo) 39 | VALUES('Manual de 1 grado','25333444','2006-07-10'); 40 | 41 | /*Al intentar ingresar un valor de clave primaria repetida nos da el error 1062: "Duplicate entry" 42 | Al ser compuesta la clave primaria, podemos repetir solo una de las condiciones en la inserción de datos */ 43 | -------------------------------------------------------------------------------- /Resolución de problemas/39-Rand.sql: -------------------------------------------------------------------------------- 1 | -- 1- Eliminamos la tabla "alumnos" si existe: 2 | 3 | DROP TABLE IF EXISTS alumnos; 4 | 5 | -- 2- Creamos la tabla: 6 | 7 | CREATE TABLE alumnos( 8 | documento CHAR(8) NOT NULL, 9 | nombre VARCHAR(30), 10 | domicilio VARCHAR(30), 11 | ciudad VARCHAR(20), 12 | provincia VARCHAR(20), 13 | PRIMARY KEY(documento) 14 | ); 15 | 16 | /* 3- Agregamos varios registros: 17 | 18 | ('22333444','Juan Perez','Colon 123','Cordoba','Cordoba'); 19 | ('23456789','Ana Acosta','Caseros 456','Cordoba','Cordoba'); 20 | ('24123123','Patricia Morales','Sucre 234','Villa del Rosario','Cordoba'); 21 | ('25000333','Jose Torres','Sarmiento 980','Carlos Paz','Cordoba'); 22 | ('26333444','Susana Molina','Avellaneda 234','Rosario','Santa Fe'); 23 | ('27987654','Marta Herrero','San Martin 356','Villa del Rosario','Cordoba'); 24 | ('28321321','Marcos Ferreyra','Urquiza 357','Cordoba','Cordoba'); 25 | ('30987464','Marta Perez','Rivadavia 234','Cordoba','Cordoba'); */ 26 | 27 | INSERT INTO alumnos 28 | VALUES('22333444','Juan Perez','Colon 123','Cordoba','Cordoba'), 29 | ('23456789','Ana Acosta','Caseros 456','Cordoba','Cordoba'), 30 | ('24123123','Patricia Morales','Sucre 234','Villa del Rosario','Cordoba'), 31 | ('25000333','Jose Torres','Sarmiento 980','Carlos Paz','Cordoba'), 32 | ('26333444','Susana Molina','Avellaneda 234','Rosario','Santa Fe'), 33 | ('27987654','Marta Herrero','San Martin 356','Villa del Rosario','Cordoba'), 34 | ('28321321','Marcos Ferreyra','Urquiza 357','Cordoba','Cordoba'), 35 | ('30987464','Marta Perez','Rivadavia 234','Cordoba','Cordoba'); 36 | 37 | /* 4- El instituto quiere tomar 3 alumnos al azar para que representen al instituto en una feria de 38 | ciencias: */ 39 | 40 | SELECT documento,nombre 41 | FROM alumnos 42 | ORDER BY RAND() 43 | LIMIT 3; 44 | -------------------------------------------------------------------------------- /Enunciados de problemas/27) Funciones de agrupamiento: -------------------------------------------------------------------------------- 1 | Funciones de agrupamiento (count - max - min - sum - avg) 2 | 3 | Problema: 4 | 5 | Un comercio que tiene un stand en una feria registra en una tabla llamada "visitantes" algunos 6 | datos de las personas que visitan o compran en su stand para luego enviarle publicidad de sus 7 | productos. 8 | 9 | 1- Elimine la tabla "visitantes", si existe. 10 | 11 | 2- Créela con la siguiente estructura: 12 | 13 | create table visitantes( 14 | nombre varchar(30), 15 | edad tinyint unsigned, 16 | sexo char(1), 17 | domicilio varchar(30), 18 | ciudad varchar(20), 19 | telefono varchar(11), 20 | montocompra decimal (6,2) unsigned 21 | ); 22 | 23 | (Note que no tiene clave primaria, no la necesita.) 24 | 25 | 3- Ingrese algunos registros: 26 | 27 | ('Susana Molina', 28,'f','Colon 123','Cordoba',null,45.50); 28 | ('Marcela Mercado',36,'f','Avellaneda 345','Cordoba','4545454',0); 29 | ('Alberto Garcia',35,'m','Gral. Paz 123','Alta Gracia','03547123456',25); 30 | ('Teresa Garcia',33,'f','Gral. Paz 123','Alta Gracia','03547123456',0); 31 | ('Roberto Perez',45,'m','Urquiza 335','Cordoba','4123456',33.20); 32 | ('Marina Torres',22,'f','Colon 222','Villa Dolores','03544112233',25); 33 | ('Julieta Gomez',24,'f','San Martin 333','Alta Gracia','03547121212',53.50); 34 | ('Roxana Lopez',20,'f','Triunvirato 345','Alta Gracia',null,0); 35 | ('Liliana Garcia',50,'f','Paso 999','Cordoba','4588778',48); 36 | ('Juan Torres',43,'m','Sarmiento 876','Cordoba','4988778',15.30); 37 | 38 | 4- Solicite la cantidad de visitantes al stand: 39 | 40 | 5- Muestre la suma de la compra de todos los visitantes de "Alta Gracia": 41 | 42 | 6- Muestre el valor máximo de las compras efectuadas: 43 | 44 | 7- Muestre la edad menor de los visitantes: 45 | 46 | 8- Muestre el promedio de edades de los visitantes: 47 | 48 | 9- Muestre el promedio del monto de compra: 49 | -------------------------------------------------------------------------------- /Enunciados de problemas/12) Valores Null: -------------------------------------------------------------------------------- 1 | Valores null. 2 | 3 | Problema: 4 | 5 | Retome la tabla llamada "medicamentos" que almacena la información de los productos 6 | que se venden en una farmacia. 7 | 8 | 1- Elimine la tabla, si existe. 9 | 10 | 2- Cree la tabla con los siguientes campos: codigo (con primary key), nombre, laboratorio, precio y cantidad. 11 | 12 | 3- Visualice la estructura de la tabla "medicamentos". 13 | 14 | 4- Ingrese los siguientes registros: 15 | 16 | ('Sertal gotas','Roche',5.2,100); 17 | ('Sertal compuesto','Roche',7.1,150); 18 | ('Buscapina','Roche',null,200); 19 | ('Amoxidal 500','Bayer',15.60,0); 20 | ('Amoxidal jarabe','Bayer',25,120); 21 | ('Amoxinil',null,25,120); 22 | ('Bayaspirina','',0,150); 23 | 24 | 5- Verifique que el campo "codigo" generó los valores de modo automático. 25 | 26 | 6- Recupere los registros que contengan valor "null" en el campo "laboratorio", 27 | luego los que tengan una cadena vacía en el mismo campo. Note que el resultado 28 | es diferente: 29 | 30 | 7- Recupere los registros que contengan valor "null" en el campo "precio", 31 | luego los que tengan el valor 0 en el mismo campo. Note que el resultado es diferente: 32 | 33 | 8- Intente ingresar el siguiente registro con valor "null" para el campo "nombre": 34 | 35 | (null,'Bayer',10.20,100); 36 | 37 | 9- Intente ingresar el siguiente registro con valor "null" para el campo "cantidad": 38 | 39 | ('Benadryl comprimidos','Bayer',10.20,null); 40 | 41 | 10- Ingrese el siguiente registro con valor "null" para el campo correspondiente al código: 42 | 43 | (null,'Benadryl comprimidos','Bayer',10.20,null); 44 | 45 | 11- Recupere los registros cuyo precio sea distinto de 0, luego los que 46 | sean distintos de "null": 47 | 48 | 12- Recupere los registros en los cuales el laboratorio no contenga una cadena vacía, 49 | luego los que sean distintos de "null": 50 | 51 | -------------------------------------------------------------------------------- /Resolución de problemas/08-ModificacionDeRegistros.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla "agenda" si existe. 2 | 3 | DROP TABLE IF EXISTS agenda; 4 | 5 | -- 2- Cree la tabla con los siguientes campos: apellido (cadena de 30), nombre (cadena de 20), domicilio (cadena de 30) 6 | -- y telefono (cadena de 11): 7 | 8 | CREATE TABLE agenda( 9 | apellido VARCHAR(30), 10 | nombre VARCHAR(20), 11 | domicilio VARCHAR(30), 12 | telefono VARCHAR(11) 13 | ); 14 | 15 | -- 3- Visualice la estructura de la tabla "agenda". 16 | 17 | DESCRIBE agenda; 18 | 19 | -- 4- Ingrese los siguientes registros: 20 | 21 | -- Mores,Alberto,Colon 123,4234567, 22 | -- Torres,Juan,Avellaneda 135,4458787, 23 | -- Lopez,Mariana,Urquiza 333,4545454, 24 | -- Lopez,Jose,Urquiza 333,4545454, 25 | -- Peralta,Susana,Gral. Paz 1234,4123456. 26 | 27 | INSERT INTO agenda (apellido, nombre, domicilio, telefono) 28 | VALUES('Mores','Alberto','Colon 123',4234567), 29 | ('Torres','Juan','Avellaneda 135',4458787), 30 | ('Lopez','Mariana','Urquiza 333',4545454), 31 | ('Lopez','Jose','Urquiza 333',4545454), 32 | ('Peralta','Susana','Gral. Paz 1234',4123456); 33 | 34 | -- 5- Modifique el registro cuyo nombre sea "Juan" por "Juan Jose": 35 | 36 | UPDATE agenda SET nombre='Juan Jose' 37 | WHERE nombre='Juan'; 38 | 39 | -- 6- Actualice los registros cuyo número telefónico sea igual a '4545454' por '4445566': 40 | 41 | UPDATE agenda SET telefono='4445566' 42 | WHERE telefono='4545454'; 43 | 44 | -- 7- Actualice los registros que tengan en el campo "nombre" el valor "Juan" por "Juan Jose": 45 | 46 | UPDATE agenda SET nombre='Juan Jose' 47 | WHERE nombre='Juan'; 48 | 49 | -- En este caso no se afecto ninguna columna ya que ningún registro cumple con la condición planteada 50 | 51 | -- Por último, realizo la siguiente consulta para verificar que los cambios se hayan efectuado: 52 | 53 | SELECT * FROM agenda; 54 | -------------------------------------------------------------------------------- /Resolución de problemas/64-CrossJoinIII.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla "clientes" si existe: 2 | 3 | DROP TABLE IF EXISTS clientes; 4 | 5 | -- 2- Cree la tabla: 6 | 7 | CREATE TABLE clientes( 8 | nombre VARCHAR(30), 9 | domicilio VARCHAR(30), 10 | sexo CHAR(1), 11 | edad TINYINT 12 | ); 13 | 14 | /* 3- Ingrese los siguientes registros: 15 | 16 | ('Juan Perez','m',45); 17 | ('Ana Lopez','f',50); 18 | ('Federico Herrero','m',30); 19 | ('Mariano Juarez','m',35); 20 | ('Maria Torres','f',36); 21 | ('Ines Duarte','f',55); 22 | ('Alejandra Figueroa','f',40); */ 23 | 24 | INSERT INTO clientes (nombre, sexo, edad) 25 | VALUES('Juan Perez','m',45), 26 | ('Ana Lopez','f',50), 27 | ('Federico Herrero','m',30), 28 | ('Mariano Juarez','m',35), 29 | ('Maria Torres','f',36), 30 | ('Ines Duarte','f',55), 31 | ('Alejandra Figueroa','f',40); 32 | 33 | /* 4- La agencia necesita la combinación de todas las personas de sexo femenino con las de sexo 34 | masculino. Use un "join" sin parte "on" y establezca como condición que las personas de la 35 | primera tabla sean de sexo femenino y las de la segunda tabla de sexo masculino: */ 36 | 37 | SELECT c1.nombre, c1.edad, c1.sexo, c2.nombre, c2.edad, c2.sexo 38 | FROM clientes AS c1 39 | JOIN clientes AS c2 40 | WHERE c1.sexo='f' AND c2.sexo='m'; 41 | 42 | -- 5- Obtenga la misma salida usando "cross join": 43 | 44 | SELECT c1.nombre, c1.edad, c1.sexo, c2.nombre, c2.edad, c2.sexo 45 | FROM clientes AS c1 46 | CROSS JOIN clientes AS c2 47 | WHERE c1.sexo='f' AND c2.sexo='m'; 48 | 49 | /* 6- Se pide, además, que las edades de las posibles parejas no tengan una diferencia superior a 50 | 10 años: */ 51 | 52 | SELECT c1.nombre, c1.edad, c1.sexo, c2.nombre, c2.edad, c2.sexo 53 | FROM clientes AS c1 54 | CROSS JOIN clientes AS c2 55 | WHERE c1.sexo='f' AND c2.sexo='m'AND 56 | c1.edad - c2.edad BETWEEN -10 AND 10; 57 | -------------------------------------------------------------------------------- /Enunciados de problemas/26) Count: -------------------------------------------------------------------------------- 1 | Contar registros (count) 2 | 3 | Problema: 4 | 5 | Un comercio que tiene un stand en una feria registra en una tabla llamada "visitantes" algunos 6 | datos de las personas que visitan o compran en su stand para luego enviarle publicidad de sus 7 | productos. 8 | 9 | 1- Elimine la tabla "visitantes", si existe. 10 | 11 | 2- Créela con la siguiente estructura: 12 | 13 | create table visitantes( 14 | nombre varchar(30), 15 | edad tinyint unsigned, 16 | sexo char(1), 17 | domicilio varchar(30), 18 | ciudad varchar(20), 19 | telefono varchar(11), 20 | montocompra decimal (6,2) unsigned 21 | ); 22 | 23 | 3- Ingrese algunos registros: 24 | 25 | ('Susana Molina', 28,'f','Colon 123','Cordoba',null,45.50); 26 | ('Marcela Mercado',36,'f','Avellaneda 345','Cordoba','4545454',0); 27 | ('Alberto Garcia',35,'m','Gral. Paz 123','Alta Gracia','03547123456',25); 28 | ('Teresa Garcia',33,'f','Gral. Paz 123','Alta Gracia','03547123456',0); 29 | ('Roberto Perez',45,'m','Urquiza 335','Cordoba','4123456',33.20); 30 | ('Marina Torres',22,'f','Colon 222','Villa Dolores','03544112233',25); 31 | ('Julieta Gomez',24,'f','San Martin 333','Alta Gracia','03547121212',53.50); 32 | ('Roxana Lopez',20,'f','Triunvirato 345','Alta Gracia',null,0); 33 | ('Liliana Garcia',50,'f','Paso 999','Cordoba','4588778',48); 34 | ('Juan Torres',43,'m','Sarmiento 876','Cordoba','4988778',15.30); 35 | 36 | 4- Solicite la cantidad de visitantes al stand: 37 | 38 | 5- Solicite la cantidad de visitantes que tienen teléfono (valor no nulo): 39 | 40 | 6- Muestre la cantidad de visitantes de sexo masculino que acudieron al stand: 41 | 42 | 7- Muestre la cantidad de mujeres mayores de 25 años que acudieron al stand: 43 | 44 | 8- Muestre la cantidad de visitantes que no son de "Cordoba": 45 | 46 | 9- Muestre la cantidad de visitantes que realizaron alguna compra: 47 | 48 | 10- Muestre la cantidad de visitantes que no realizaron compras: 49 | -------------------------------------------------------------------------------- /Enunciados de problemas/54) Join: -------------------------------------------------------------------------------- 1 | Varias tablas (join) 2 | 3 | Problema: 4 | 5 | Una empresa tiene registrados sus clientes en una tabla llamada "clientes", también tiene una 6 | tabla "provincias" donde registra los nombres de las provincias. 7 | 8 | 1- Elimine la tabla "clientes" y "provincias", si existen: 9 | 10 | 2- Créelas con las siguientes estructuras: 11 | 12 | create table clientes ( 13 | codigo int unsigned auto_increment, 14 | nombre varchar(30) not null, 15 | domicilio varchar(30), 16 | ciudad varchar(20), 17 | codigoprovincia tinyint unsigned, 18 | telefono varchar(11), 19 | primary key(codigo) 20 | ); 21 | 22 | create table provincias( 23 | codigo tinyint unsigned auto_increment, 24 | nombre varchar(20), 25 | primary key (codigo) 26 | ); 27 | 28 | 3- Ingrese algunos registros para ambas tablas: 29 | 30 | provincias: 31 | ('Cordoba'); 32 | ('Santa Fe'); 33 | ('Corrientes'); 34 | ('Misiones'); 35 | ('Salta'); 36 | ('Buenos Aires'); 37 | ('Neuquen'); 38 | 39 | clientes: 40 | ('Lopez Marcos', 'Colon 111', 'Córdoba',1,'null'); 41 | ('Perez Ana', 'San Martin 222', 'Cruz del Eje',1,'4578585'); 42 | ('Garcia Juan', 'Rivadavia 333', 'Villa Maria',1,'4578445'); 43 | ('Perez Luis', 'Sarmiento 444', 'Rosario',2,null); 44 | ('Pereyra Lucas', 'San Martin 555', 'Cruz del Eje',1,'4253685'); 45 | ('Gomez Ines', 'San Martin 666', 'Santa Fe',2,'0345252525'); 46 | ('Torres Fabiola', 'Alem 777', 'Villa del Rosario',1,'4554455'); 47 | ('Lopez Carlos', 'Irigoyen 888', 'Cruz del Eje',1,null); 48 | ('Ramos Betina', 'San Martin 999', 'Cordoba',1,'4223366'); 49 | ('Lopez Lucas', 'San Martin 1010', 'Posadas',4,'0457858745'); 50 | 51 | 4- Obtenga los datos de ambas tablas, use alias: 52 | 53 | 5- Obtenga la misma información anterior pero ordenada por nombre del cliente: 54 | 55 | 6- Omita la referencia a las tablas en la condición "on" para verificar que la sentencia no se 56 | ejecuta porque el nombre del campo "codigo" es ambiguo (ambas tablas lo tienen): 57 | -------------------------------------------------------------------------------- /Resolución de problemas/45-AlterTableParaPrimaryKey.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla "medicamentos", si existe: 2 | 3 | DROP TABLE IF EXISTS medicamentos; 4 | 5 | -- 2- Cree la tabla con la siguiente estructura: 6 | 7 | CREATE TABLE medicamentos( 8 | codigo INT UNSIGNED NOT NULL, 9 | nombre VARCHAR(20) NOT NULL, 10 | laboratorio VARCHAR(20), 11 | precio DECIMAL(6,2) UNSIGNED 12 | ); 13 | 14 | -- 3- Visualice la estructura de la tabla "medicamentos". 15 | 16 | DESCRIBE medicamentos; 17 | 18 | -- 4- Agregue una clave primaria por "codigo": 19 | 20 | ALTER TABLE medicamentos 21 | ADD PRIMARY KEY(codigo); 22 | 23 | /* La clave agregada no es auto_increment, por ello, al agregar registros debemos ingresar el código, 24 | si no lo hacemos, se almacenará el valor "0" en el primer registro agregado */ 25 | 26 | -- 5- Modifique el campo convirtiéndolo en autoincrementable: 27 | 28 | ALTER TABLE medicamentos 29 | MODIFY codigo INT UNSIGNED AUTO_INCREMENT; 30 | 31 | -- 6- Veamos los registros: 32 | 33 | SELECT * FROM medicamentos; 34 | 35 | -- NO habia registros hasta ese momento. 36 | 37 | /* 7- Ingrese los registros: 38 | 39 | ('Paracetamol 500','Bago',1.90); 40 | ('Bayaspirina','Bayer',2.10); */ 41 | 42 | INSERT INTO medicamentos (nombre, laboratorio, precio) 43 | VALUES('Paracetamol 500','Bago',1.90), 44 | ('Bayaspirina','Bayer',2.10); 45 | 46 | -- 8- Intente eliminar la clave primaria: 47 | 48 | ALTER TABLE medicamentos 49 | DROP PRIMARY KEY; 50 | 51 | /* Aparece un mensaje de error. La clave no se puede eliminar porque el campo "codigo" 52 | es "auto_increment" y si existe un campo con este atributo DEBE ser clave primaria. */ 53 | 54 | -- 9- Modifique el campo "codigo" quitándole el atributo "auto_increment": 55 | 56 | ALTER TABLE medicamentos 57 | MODIFY codigo INT UNSIGNED NOT NULL; 58 | 59 | -- 10- Elimine la clave primaria: 60 | 61 | ALTER TABLE medicamentos 62 | DROP PRIMARY KEY; 63 | 64 | -- En esta ocasión se elimino la primary key sin problemas. 65 | -------------------------------------------------------------------------------- /Resolución de problemas/49-Enum.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla empleados, si existe. 2 | 3 | DROP TABLE IF EXISTS empleados; 4 | 5 | -- 2- Cree la tabla con la siguiente estructura: 6 | 7 | CREATE TABLE empleados( 8 | documento CHAR(8), 9 | nombre VARCHAR(30), 10 | sexo CHAR(1), 11 | estadocivil ENUM('soltero','casado','divorciado','viudo') NOT NULL, 12 | sueldobasico DECIMAL(6,2), 13 | PRIMARY KEY(documento) 14 | ); 15 | 16 | /* 3- Ingrese algunos registros: 17 | 18 | ('22333444','Juan Lopez','m','soltero',300); 19 | ('23333484','Ana Acosta','f','viudo',400); */ 20 | 21 | INSERT INTO empleados 22 | VALUES('22333444','Juan Lopez','m','soltero',300), 23 | ('23333484','Ana Acosta','f','viudo',400); 24 | 25 | -- 4- Intente ingresar un valor "null" para el campo enumerado: 26 | 27 | INSERT INTO empleados 28 | VALUES('25333444','Ana Acosta','f',null,400); 29 | 30 | -- NO es posible ya que se definio que 'estadocivil' no puede ser null. 31 | 32 | -- 5- Ingrese registros con valores de índice para el campo "estadocivil": 33 | 34 | INSERT INTO empleados 35 | VALUES('26333444','Luis Perez','m',1,400), 36 | ('26336444','Marcelo Torres','m',3,460); 37 | 38 | -- La inserción fue exitosa 39 | 40 | -- 6- Ingrese un valor inválido, uno no presente en la lista y un valor de índice fuera de rango: 41 | 42 | INSERT INTO empleados VALUES('29333444','Lucas Perez','m',0,400); 43 | 44 | -- Esta inserción no es posible. 45 | 46 | INSERT INTO empleados VALUES ('30336444','Federico Garcia','m',5,450); 47 | 48 | -- Esta inserción no es posible. 49 | 50 | INSERT INTO empleados VALUES('31333444','Karina Sosa','f','Concubino',500); 51 | 52 | -- Esta inserción no es posible. 53 | 54 | -- 7- Seleccione todos los empleados solteros: 55 | 56 | SELECT * FROM empleados 57 | WHERE estadocivil='soltero'; 58 | 59 | -- 8- Seleccione todos los empleados viudos usando el número de índice de la enumeración: 60 | 61 | SELECT * FROM empleados 62 | WHERE estadocivil=4; 63 | -------------------------------------------------------------------------------- /Resolución de problemas/42-AlterTableDrop.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla "peliculas", si existe. 2 | 3 | DROP TABLE IF EXISTS peliculas; 4 | 5 | -- 2- Cree la tabla con la siguiente estructura: 6 | 7 | CREATE TABLE peliculas( 8 | codigo INT UNSIGNED AUTO_INCREMENT, 9 | nombre VARCHAR(30) NOT NULL, 10 | protagonista VARCHAR(20), 11 | actorsecundario VARCHAR(20), 12 | director VARCHAR(25), 13 | duracion TINYINT UNSIGNED, 14 | PRIMARY KEY(codigo), 15 | INDEX i_director (director) 16 | ); 17 | 18 | -- 3- Ingrese algunos registros. 19 | 20 | INSERT INTO peliculas (nombre, protagonista, actorsecundario, director, duracion) 21 | VALUES('Inception', 'Leonardo DiCaprio', 'Joseph Gordon-Levitt', 'Christopher Nolan', 148), 22 | ('El Padrino', 'Marlon Brando', 'Al Pacino', 'Francis Ford Coppola', 175), 23 | ('Interstellar', 'Matthew McConaughey', 'Anne Hathaway', 'Christopher Nolan', 169), 24 | ('Pulp Fiction', 'John Travolta', 'Samuel L. Jackson', 'Quentin Tarantino', 154), 25 | ('Gladiador', 'Russell Crowe', 'Joaquin Phoenix', 'Ridley Scott', 155); 26 | 27 | -- 4- Vea los índices: 28 | 29 | SHOW INDEX FROM peliculas; 30 | 31 | -- 5- Elimine el campo "director": 32 | 33 | ALTER TABLE peliculas 34 | DROP director; 35 | 36 | -- 6- Visualice la estructura modificada: 37 | 38 | DESCRIBE peliculas; 39 | 40 | -- 7- Vea los índices: 41 | 42 | SHOW INDEX FROM peliculas; 43 | 44 | /* Se observa que el índice por "editorial" ya no existe, esto es porque si se borra un campo que es parte de 45 | un índice, también se borra el índice. */ 46 | 47 | -- 8- Intente eliminar un campo inexistente: 48 | 49 | ALTER TABLE peliculas 50 | DROP director; 51 | 52 | -- NO es posible eliminar un campo inexistente. 53 | 54 | -- 9- Elimine los campos "actorsecundario" y "duracion" en una misma sentencia: 55 | 56 | ALTER TABLE peliculas 57 | DROP actorsecundario, DROP duracion; 58 | 59 | -- Vemos que es posible eliminar dos campos en una misma sentencia. 60 | -------------------------------------------------------------------------------- /Enunciados de problemas/58) Left Join I: -------------------------------------------------------------------------------- 1 | Varias tablas (left join) 2 | 3 | Problema: 4 | 5 | Una empresa tiene registrados sus clientes en una tabla llamada "clientes", también tiene una 6 | tabla "provincias" donde registra los nombres de las provincias. 7 | 8 | 1- Elimine las tablas "clientes" y "provincias", si existen: 9 | 10 | 2- Créelas con las siguientes estructuras: 11 | 12 | create table clientes ( 13 | codigo int unsigned auto_increment, 14 | nombre varchar(30) not null, 15 | domicilio varchar(30), 16 | ciudad varchar(20), 17 | codigoProvincia tinyint unsigned, 18 | telefono varchar(11), 19 | primary key(codigo) 20 | ); 21 | 22 | create table provincias( 23 | 24 | codigo tinyint unsigned auto_increment, 25 | nombre varchar(20), 26 | primary key (codigo) 27 | ); 28 | 29 | 3- Ingrese algunos registros para ambas tablas: 30 | 31 | provincias: 32 | ('Cordoba'); 33 | ('Santa Fe'); 34 | ('Corrientes'); 35 | ('Misiones'); 36 | ('Salta'); 37 | ('Buenos Aires'); 38 | ('Neuquen'); 39 | 40 | clientes: 41 | ('Lopez Marcos', 'Colon 111', 'Córdoba',1,'null'); 42 | ('Perez Ana', 'San Martin 222', 'Cruz del Eje',1,'4578585'); 43 | ('Garcia Juan', 'Rivadavia 333', 'Villa Maria',1,'4578445'); 44 | ('Perez Luis', 'Sarmiento 444', 'Rosario',2,null); 45 | ('Pereyra Lucas', 'San Martin 555', 'Cruz del Eje',1,'4253685'); 46 | ('Gomez Ines', 'San Martin 666', 'Santa Fe',2,'0345252525'); 47 | ('Torres Fabiola', 'Alem 777', 'Villa del Rosario',1,'4554455'); 48 | ('Lopez Carlos', 'Irigoyen 888', 'Cruz del Eje',1,null); 49 | ('Ramos Betina', 'San Martin 999', 'Cordoba',1,'4223366'); 50 | ('Lopez Lucas', 'San Martin 1010', 'Posadas',4,'0457858745'); 51 | 52 | 4- Queremos saber de qué provincias no tenemos clientes: 53 | 54 | 5- Queremos saber de qué provincias si tenemos clientes, sin repetir el nombre de la provincia: 55 | 56 | 6- Omita la referencia a las tablas en la condición "on" para verificar que la sentencia no se 57 | ejecuta porque el nombre del campo "codigo" es ambiguo (ambas tablas lo tienen): 58 | -------------------------------------------------------------------------------- /Resolución de problemas/11-ComandoTruncateTable.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla "medicamentos" ,si existe: 2 | 3 | DROP TABLE IF EXISTS medicamentos; 4 | 5 | -- 2- Cree la tabla con los siguientes campos: codigo (con primary key), nombre, laboratorio, precio y cantidad. 6 | 7 | CREATE TABLE medicamentos( 8 | codigo INTEGER AUTO_INCREMENT, 9 | nombre VARCHAR(20), 10 | laboratorio VARCHAR(20), 11 | precio FLOAT, 12 | cantidad INTEGER, 13 | PRIMARY KEY (codigo) 14 | ); 15 | 16 | -- 3- Ingrese los siguientes registros: 17 | 18 | -- ('Sertal','Roche',5.2,100); 19 | -- ('Buscapina','Roche',4.10,200); 20 | -- ('Amoxidal 500','Bayer',15.60,100); 21 | 22 | INSERT INTO medicamentos (nombre, laboratorio, precio, cantidad) 23 | VALUES('Sertal','Roche',5.2,100), 24 | ('Buscapina','Roche',4.10,200), 25 | ('Amoxidal 500','Bayer',15.60,100); 26 | 27 | -- 4- Elimine todos los registros con "delete": 28 | 29 | DELETE FROM medicamentos; 30 | 31 | -- Selecciono la tabla para ver que los cambios se hayan efectuado: 32 | 33 | SELECT * FROM medicamentos; 34 | 35 | -- 5- Ingrese 2 registros: 36 | 37 | INSERT INTO medicamentos (nombre, laboratorio,precio,cantidad) 38 | VALUES('Sertal','Roche',5.2,100), 39 | ('Amoxidal 500','Bayer',15.60,100); 40 | 41 | -- 6- Vea los registros para verificar que continuó la secuencia al generar el valor para "codigo": 42 | 43 | SELECT * FROM medicamentos; 44 | 45 | -- Se observa que de esta manera el codigo sigue con la secuencia original a pesar del "delete" anterior 46 | 47 | -- 7- Vacíe la tabla: 48 | 49 | TRUNCATE TABLE medicamentos; 50 | 51 | -- 8- Ingrese el siguiente registro: 52 | 53 | -- ('Buscapina','Roche',4.10,200) 54 | 55 | INSERT INTO medicamentos (nombre, laboratorio,precio,cantidad) 56 | VALUES('Buscapina','Roche',4.10,200); 57 | 58 | -- 9- Vea los registros para verificar que al cargar el código reinició la secuencia en 1. 59 | 60 | SELECT * FROM medicamentos; 61 | 62 | -- Efectivamente, al ejecutar el "Truncate", la secuencia comienza de nuevo en '1' 63 | -------------------------------------------------------------------------------- /Resolución de problemas/16-TiposDeDatos(FechaYHora).sql: -------------------------------------------------------------------------------- 1 | /* Problema: 2 | 3 | Una concesionaria de autos vende autos usados. Guarda los siguientes datos en la tabla "autos": 4 | 5 | - marca (fiat 128, renault 11, peugeot 505, etc.) 6 | - modelo (año) 7 | - dueño (nombre del dueño) 8 | - precio (valor con decimales positivo que puede llegar hasta 999999.99 aprox.). */ 9 | 10 | -- 1- Elimine la tabla si existe. 11 | 12 | DROP TABLE IF EXISTS autos; 13 | 14 | -- 2- Cree la tabla eligiendo el tipo de dato adecuado para almacenar estos datos: 15 | 16 | CREATE TABLE autos( 17 | marca VARCHAR(15), 18 | modelo YEAR, 19 | dueño VARCHAR(30), 20 | precio DECIMAL (8,2) UNSIGNED 21 | ); 22 | 23 | /* 3- Ingrese los siguientes registros: 24 | 25 | ('Fiat 128','1970','Juan Lopez',50000); 26 | ('Renault 11','1990','Juan Lopez',80000); 27 | ('Fiat 128','1971','Ana Ferreyra',51000); 28 | ('Peugeot 505','1998','Luis Luque',99000); 29 | ('Peugeot 505','1997','Carola Perez',85000); */ 30 | 31 | INSERT INTO autos 32 | VALUES('Fiat 128','1970','Juan Lopez',50000), 33 | ('Renault 11','1990','Juan Lopez',80000), 34 | ('Fiat 128','1971','Ana Ferreyra',51000), 35 | ('Peugeot 505','1998','Luis Luque',99000), 36 | ('Peugeot 505','1997','Carola Perez',85000); 37 | 38 | -- 4- Seleccione todos los autos cuyo modelo sea menor a "1995": 39 | 40 | SELECT * FROM autos 41 | WHERE modelo<1995; 42 | 43 | -- 5- Muestre la marca y modelo de los autos que no sean de "1970": 44 | 45 | SELECT marca,modelo FROM autos 46 | WHERE modelo<>1970; 47 | 48 | -- 6- Ingrese un auto con el valor para "modelo" de tipo numérico: 49 | 50 | INSERT INTO autos 51 | VALUES('Peugeot 505',1995,'Carlos Lopez',88000); 52 | 53 | -- Ejecuto la siguiente consulta para ver como trae los datos: 54 | 55 | SELECT * FROM autos; 56 | 57 | /* Pude observar que por más que ponga un valor númerico en la columna "modelo", MySQL lo interpreta de manera 58 | correcta, ya que he establecido que dicha columna sea "Year". 59 | Por lo tanto, mientras el valor sea de 4 digitios, MySQL lo interpretará de manera correcta. */ 60 | -------------------------------------------------------------------------------- /Resolución de problemas/10-Autoincremento.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla "medicamentos" ,si existe: 2 | 3 | DROP TABLE IF EXISTS medicamentos; 4 | 5 | -- 2- Cree la tabla con los siguientes campos: codigo (con primary key), nombre, laboratorio, precio y cantidad. 6 | 7 | CREATE TABLE medicamentos( 8 | codigo INTEGER AUTO_INCREMENT, 9 | nombre VARCHAR(20), 10 | laboratorio VARCHAR(20), 11 | precio FLOAT, 12 | cantidad INTEGER, 13 | PRIMARY KEY (codigo) 14 | ); 15 | 16 | -- 3- Visualice la estructura de la tabla "medicamentos". 17 | 18 | DESCRIBE medicamentos; 19 | 20 | -- 4- Ingrese los siguientes registros: 21 | 22 | -- ('Sertal','Roche',5.2,100); 23 | -- ('Buscapina','Roche',4.10,200); 24 | -- ('Amoxidal 500','Bayer',15.60,100); 25 | 26 | INSERT INTO medicamentos (nombre, laboratorio, precio, cantidad) 27 | VALUES('Sertal','Roche',5.2,100), 28 | ('Buscapina','Roche',4.10,200), 29 | ('Amoxidal 500','Bayer',15.60,100); 30 | 31 | -- 5- Verifique que el campo "código" generó los valores de modo automático: 32 | 33 | SELECT * FROM medicamentos; 34 | 35 | -- 6- Intente ingresar un registro con un valor de clave primaria repetido. 36 | 37 | INSERT INTO medicamentos (codigo, nombre, laboratorio, precio, cantidad) 38 | VALUES(2,'Tafirol', 'Zucho', 3.15, 50); 39 | 40 | -- No es posible, nos da el error 1062: "Duplicate entry '2' for key 'medicamentos.PRIMARY' 41 | 42 | -- 7- Ingrese un registro con un valor de clave primaria no repetido salteando la secuencia: 43 | 44 | INSERT INTO medicamentos (codigo,nombre, laboratorio,precio,cantidad) 45 | VALUES(12,'Paracetamol 500','Bago',1.90,200); 46 | 47 | -- Vemos que es posible modificar la secuencia sin problemas con la siguiente consulta: 48 | 49 | SELECT * FROM medicamentos; 50 | 51 | -- 8- Ingrese el siguiente registro: 52 | 53 | INSERT INTO medicamentos (nombre, laboratorio,precio,cantidad) 54 | VALUES('Bayaspirina','Bayer',2.10,150); 55 | 56 | -- Verificamos con la siguiente consulta que MySQL sigue la secuencia a partir del último valor que le indicamos: 57 | 58 | SELECT * FROM medicamentos; 59 | -------------------------------------------------------------------------------- /Enunciados de problemas/65) Join y Group By: -------------------------------------------------------------------------------- 1 | join, group by y funciones de agrupamiento. 2 | 3 | Problema: 4 | 5 | Una empresa tiene registrados sus clientes en una tabla llamada "clientes", también tiene una 6 | tabla "provincias" donde registra los nombres de las provincias de las cuales son oriundos los 7 | clientes. 8 | 9 | 1- Elimine la tabla "clientes" y "provincias", si existen: 10 | 11 | 2- Créelas con las siguientes estructuras: 12 | 13 | create table clientes ( 14 | codigo int unsigned auto_increment, 15 | nombre varchar(30) not null, 16 | domicilio varchar(30), 17 | ciudad varchar(20), 18 | codigoprovincia tinyint unsigned, 19 | telefono varchar(11), 20 | primary key(codigo) 21 | ); 22 | 23 | create table provincias( 24 | codigo tinyint unsigned auto_increment, 25 | nombre varchar(20), 26 | primary key (codigo) 27 | ); 28 | 29 | 3- Ingrese algunos registros para ambas tablas: 30 | 31 | provincias: 32 | ('Cordoba'); 33 | ('Santa Fe'); 34 | ('Corrientes'); 35 | ('Misiones'); 36 | ('Salta'); 37 | ('Buenos Aires'); 38 | ('Neuquen'); 39 | 40 | clientes: 41 | ('Lopez Marcos', 'Colon 111', 'Córdoba',1,'null'); 42 | ('Perez Ana', 'San Martin 222', 'Cruz del Eje',1,'4578585'); 43 | ('Garcia Juan', 'Rivadavia 333', 'Villa Maria',1,'4578445'); 44 | ('Perez Luis', 'Sarmiento 444', 'Rosario',2,null); 45 | ('Pereyra Lucas', 'San Martin 555', 'Cruz del Eje',1,'4253685'); 46 | ('Gomez Ines', 'San Martin 666', 'Santa Fe',2,'0345252525'); 47 | ('Torres Fabiola', 'Alem 777', 'Villa del Rosario',1,'4554455'); 48 | ('Lopez Carlos', 'Irigoyen 888', 'Cruz del Eje',1,null); 49 | ('Ramos Betina', 'San Martin 999', 'Cordoba',1,'4223366'); 50 | ('Lopez Lucas', 'San Martin 1010', 'Posadas',4,'0457858745'); 51 | 52 | 4- Agrupe por nombre de provincia y cuente la cantidad de clientes por provincia usando un "join":. 53 | 54 | 5- Agrupe por nombre de provincia y cuente la cantidad de clientes por provincia usando un "left 55 | join": 56 | 57 | 6- Agrupe por nombre de provincia y muestre la cantidad de clientes por provincia usando un "join" 58 | de las provincias en las cuales tenemos 2 o más clientes: 59 | -------------------------------------------------------------------------------- /Resolución de problemas/35-Unique.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla "alumnos" si existe. 2 | 3 | DROP TABLE IF EXISTS alumnos; 4 | 5 | /* 2- Cree la tabla definiendo una clave primaria compuesta (año de inscripción y número de 6 | inscripto), un índice único por el campo "documento" y un índice común por ciudad y provincia: */ 7 | 8 | CREATE TABLE alumnos( 9 | año YEAR NOT NULL, 10 | numero INT UNSIGNED NOT NULL, 11 | nombre VARCHAR(30), 12 | documento CHAR(8) NOT NULL, 13 | domicilio VARCHAR(30), 14 | ciudad VARCHAR(20), 15 | provincia VARCHAR(20), 16 | PRIMARY KEY(año,numero), 17 | UNIQUE i_documento (documento), 18 | INDEX i_ciudadprovincia (ciudad,provincia) 19 | ); 20 | 21 | -- 3- Vea los índices de la tabla. 22 | 23 | SHOW INDEX FROM alumnos; 24 | 25 | -- 4- Ingrese algunos registros. Ingrese 2 ó 4 alumnos para los años 2004, 2005 y 2006. 26 | 27 | INSERT INTO alumnos 28 | VALUES(2004,555, 'Agustin', 42733667, 'Calle 6', 'La Plata', 'Buenos Aires'), 29 | (2005,545, 'Juan', 32735667, 'Calle 11', 'Villa Elvira', 'Buenos Aires'), 30 | (2006,535, 'Ignacio', 73829667, 'Calle 161', 'Berazategui', 'Buenos Aires'); 31 | 32 | -- 5- Intente ingresar un alumno con clave primaria repetida. 33 | 34 | INSERT INTO alumnos 35 | VALUES(2004,555, 'Valentino', 42733667, 'Calle 78', 'Alem', 'Buenos Aires'); 36 | 37 | -- No es posible ingresar alumno con clave primaria compuesta repetida. 38 | 39 | -- 6- Intente ingresar un alumno con documento repetido. 40 | 41 | INSERT INTO alumnos 42 | VALUES(2005,565, 'Federico', 42733667, 'Calle 89', 'Vedia', 'Buenos Aires'); 43 | 44 | -- No es posible insertar un alumno con documento repetido ya que es UNIQUE 45 | 46 | -- 7- Ingrese varios alumnos de la misma ciudad y provincia. 47 | 48 | INSERT INTO alumnos 49 | VALUES(2004,585, 'Oscar', 42933667, 'Calle 68', 'Alem', 'Buenos Aires'), 50 | (2005,595, 'Isaias', 42933568, 'Calle 118', 'Alem', 'Buenos Aires'), 51 | (2005,505, 'Martin', 42223568, 'Calle 5', 'Alem', 'Buenos Aires'); 52 | 53 | -- Vemos que es posible ingresar a alumnos de la misma ciudad y provincia 54 | -------------------------------------------------------------------------------- /Resolución de problemas/44-AlterTableChange.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla "articulos", si existe. 2 | 3 | DROP TABLE IF EXISTS articulos; 4 | 5 | -- 2- Cree la tabla con la siguiente estructura: 6 | 7 | CREATE TABLE articulos( 8 | codigo INT UNSIGNED AUTO_INCREMENT, 9 | nombre VARCHAR(20) NOT NULL, 10 | descripcion VARCHAR(30), 11 | precio DECIMAL(4,2) UNSIGNED, 12 | PRIMARY KEY(codigo) 13 | ); 14 | 15 | /* 3- Ingrese los siguientes registros: 16 | 17 | ('escuadra','plastico 20 cm.',3.50); 18 | ('lápices colores','Faber x12',4.50); 19 | ('lápices colores','Faber x24',7.50); 20 | ('regla','30 cm.',2.50); 21 | ('fibras','Faber x12',10.30); 22 | ('fibras','Faber x6',5.10); */ 23 | 24 | INSERT INTO articulos (nombre, descripcion, precio) 25 | VALUES('escuadra','plastico 20 cm.',3.50), 26 | ('lápices colores','Faber x12',4.50), 27 | ('lápices colores','Faber x24',7.50), 28 | ('regla','30 cm.',2.50), 29 | ('fibras','Faber x12',10.30), 30 | ('fibras','Faber x6',5.10); 31 | 32 | /* 4- El comercio, que hasta ahora ha vendido sus artículos por mayor comenzará la venta por menor. 33 | Necesita alterar la tabla modificando el nombre del campo "precio" por "preciopormayor" además 34 | desea redefinirlo como no nulo: */ 35 | 36 | ALTER TABLE articulos 37 | CHANGE precio preciopormayor DECIMAL(4,2) UNSIGNED NOT NULL; 38 | 39 | /* 5- También necesita alterar la tabla agregando un campo para almacenar el precio por menor para 40 | cada artículo. Agrege un campo llamado "preciopormenor" que no permita valores nulos: */ 41 | 42 | ALTER TABLE articulos 43 | ADD preciopormenor DECIMAL(4,2) UNSIGNED NOT NULL; 44 | 45 | -- 6- Muestre todos los registros: 46 | 47 | SELECT * FROM articulos; 48 | 49 | -- Se observa que para el nuevo campo los valores se setearon en "0.00". 50 | 51 | /* 7- Actualice el campo "preciopormenor" de todos los registros, dándole el valor del campo "preciopormayor" 52 | incrementado en un 10%: */ 53 | 54 | UPDATE articulos SET preciopormenor=preciopormayor+(preciopormayor*0.10); 55 | 56 | -- 8- Muestre todos los registros: 57 | 58 | SELECT * FROM articulos; 59 | -------------------------------------------------------------------------------- /Resolución de problemas/07-BorradoDeRegistros.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla "agenda" si existe. 2 | 3 | DROP TABLE IF EXISTS agenda; 4 | 5 | -- 2- Cree la tabla con los siguientes campos: apellido (cadena de 30), nombre (cadena de 20), domicilio (cadena de 30) 6 | -- y telefono (cadena de 11): 7 | 8 | CREATE TABLE agenda( 9 | apellido VARCHAR(30), 10 | nombre VARCHAR(20), 11 | domicilio VARCHAR(30), 12 | telefono VARCHAR(11) 13 | ); 14 | 15 | -- 3- Visualice la estructura de la tabla "agenda". 16 | 17 | DESCRIBE agenda; 18 | 19 | -- 4- Ingrese los siguientes registros: 20 | 21 | -- Mores,Alberto,Colon 123,4234567, 22 | -- Torres,Juan,Avellaneda 135,4458787, 23 | -- Lopez,Mariana,Urquiza 333,4545454, 24 | -- Lopez,Jose,Urquiza 333,4545454, 25 | -- Peralta,Susana,Gral. Paz 1234,4123456. 26 | 27 | INSERT INTO agenda (apellido, nombre, domicilio, telefono) 28 | VALUES('Mores','Alberto','Colon 123',4234567), 29 | ('Torres','Juan','Avellaneda 135',4458787), 30 | ('Lopez','Mariana','Urquiza 333',4545454), 31 | ('Lopez','Jose','Urquiza 333',4545454), 32 | ('Peralta','Susana','Gral. Paz 1234',4123456); 33 | 34 | -- 5- Elimine el registro cuyo nombre sea 'Juan'. 35 | 36 | -- Por default, MySQL tiene activada una opción que nos impide eliminar datos. 37 | -- Para llevar a cabo este desafio, lo desactivamos ejecutando el siguiente código: 38 | 39 | SET sql_safe_updates=0; 40 | 41 | -- Además, para eliminar este default y no tener que ejecutar el código anterior cada vez que trabajamos con MySQL, voy al 42 | -- apartado "edit", luego a "preferences", desde alli clickeo "SQL editor" y bajo hasta encontrar la casilla de: 43 | -- Safe Updates (rejects UPDATEs and DELETEs with no restrictions) y la destildo. 44 | 45 | -- Ahora si, siguiendo con el ejercicio 5: 46 | 47 | DELETE FROM agenda 48 | WHERE nombre='Juan'; 49 | 50 | -- 6- Elimine los registros cuyo número telefónico sea igual a '4545454'. 51 | 52 | DELETE FROM agenda 53 | WHERE telefono=4545454; 54 | 55 | -- Por último, ejecuto la siguiente consulta para ver que los cambios se hayan efectuado: 56 | 57 | SELECT * FROM agenda; 58 | -------------------------------------------------------------------------------- /Resolución de problemas/62-CrossJoinI.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine las tablas "guardias" y "tareas" si existen. 2 | 3 | DROP TABLE IF EXISTS guardias, tareas; 4 | 5 | -- 2- Cree las siguientes tablas: 6 | 7 | CREATE TABLE guardias( 8 | documento CHAR(8), 9 | nombre VARCHAR(30), 10 | sexo CHAR(1), /* 'f' o 'm' */ 11 | domicilio VARCHAR(30), 12 | PRIMARY KEY(documento) 13 | ); 14 | 15 | CREATE TABLE tareas( 16 | codigo TINYINT UNSIGNED AUTO_INCREMENT, 17 | domicilio VARCHAR(30), 18 | descripcion VARCHAR(30), 19 | horario CHAR(2), /* 'AM' o 'PM'*/ 20 | PRIMARY KEY(codigo) 21 | ); 22 | 23 | /* 3- Ingrese los siguientes registros: 24 | 25 | guardias: 26 | ('22333444','Juan Perez','m','Colon 123'); 27 | ('23333444','Lorena Viale','f','Sarmiento 988'); 28 | ('24333444','Alberto Torres','m','San Martin 567'); 29 | ('25333444','Luis Ferreyra','m','Chacabuco 235'); 30 | ('26333444','Irma Gonzalez','f','Mariano Moreno 111'); 31 | 32 | tareas: 33 | ('Colon 1111','vigilancia exterior','AM'); 34 | ('Urquiza 234','vigilancia exterior','PM'); 35 | ('Peru 345','vigilancia interior','AM'); 36 | ('Avellaneda 890','vigilancia interior','PM'); */ 37 | 38 | INSERT INTO guardias 39 | VALUES('22333444','Juan Perez','m','Colon 123'), 40 | ('23333444','Lorena Viale','f','Sarmiento 988'), 41 | ('24333444','Alberto Torres','m','San Martin 567'), 42 | ('25333444','Luis Ferreyra','m','Chacabuco 235'), 43 | ('26333444','Irma Gonzalez','f','Mariano Moreno 111'); 44 | 45 | INSERT INTO tareas (domicilio, descripcion, horario) 46 | VALUES('Colon 1111','vigilancia exterior','AM'), 47 | ('Urquiza 234','vigilancia exterior','PM'), 48 | ('Peru 345','vigilancia interior','AM'), 49 | ('Avellaneda 890','vigilancia interior','PM'); 50 | 51 | -- 4- La empresa quiere que todos sus empleados realicen todas las tareas. Realice una "cross join": 52 | 53 | SELECT g.nombre, g.domicilio, t.descripcion 54 | FROM guardias AS g 55 | CROSS JOIN tareas AS t; 56 | 57 | -- 5- Obtenga la misma salida realizando un simple "join" sin parte "on": 58 | 59 | SELECT g.nombre, g.domicilio, t.descripcion 60 | FROM guardias AS g 61 | JOIN tareas AS t; 62 | -------------------------------------------------------------------------------- /Resolución de problemas/09-PrimaryKey.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla "libros" si existe. 2 | 3 | DROP TABLE IF EXISTS libros; 4 | 5 | -- 2- Créela con los siguientes campos y clave: codigo (integer), titulo (cadena de 20 caracteres de longitud), 6 | -- autor (cadena de 30), editorial (cadena de 15), codigo será clave primaria: 7 | 8 | CREATE TABLE libros( 9 | codigo INTEGER, 10 | titulo VARCHAR(20), 11 | autor VARCHAR(30), 12 | editorial VARCHAR(15), 13 | PRIMARY KEY (codigo) 14 | ); 15 | 16 | -- 3- Visualice la estructura de la tabla "libros", compruebe la clave primaria. 17 | 18 | DESCRIBE libros; 19 | 20 | -- 4- Ingrese los siguientes registros: 21 | 22 | -- (1,El aleph,Borges,Planeta); 23 | -- (2,Martin Fierro,Jose Hernandez,Emece); 24 | -- (3,Aprenda PHP,Mario Molina,Emece); 25 | -- (4,Cervantes,Borges,Paidos); 26 | -- (5,Matematica estas ahi, Paenza, Paidos); 27 | 28 | INSERT INTO libros (codigo, titulo, autor, editorial) 29 | VALUES(1,'El aleph','Borges','Planeta'), 30 | (2,'Martin Fierro','Jose Hernandez','Emece'), 31 | (3,'Aprenda PHP','Mario Molina','Emece'), 32 | (4,'Cervantes','Borges','Paidos'), 33 | (5,'Matematica estas ahi', 'Paenza', 'Paidos'); 34 | 35 | -- 5- Seleccione todos los registros. 36 | 37 | SELECT * FROM libros; 38 | 39 | -- 6- Ingrese un registro con código no repetido y nombre de autor repetido. 40 | 41 | INSERT INTO libros (codigo, titulo, autor, editorial) 42 | VALUES(6, 'PowerBI', 'Mario Molina', 'PwC'); 43 | 44 | -- 7- Ingrese un registro con código no repetido y título y editorial repetidos. 45 | 46 | INSERT INTO libros (codigo, titulo, autor, editorial) 47 | VALUES(7, 'PowerBI', 'Juan Vazquez', 'PwC'); 48 | 49 | -- Utilizo la siguiente consulta para erificar que las inserciones se hayan ejecutado correctamente: 50 | 51 | SELECT * FROM libros; 52 | 53 | -- 8- Intente ingresar un registro que repita el campo clave. 54 | 55 | INSERT INTO libros (codigo, titulo, autor, editorial) 56 | VALUES(5, 'SQL', 'Juan Vazquez', 'AgusMusanti'); 57 | 58 | -- NO se puede repetir codigo al ser una clave primaria. 59 | -- Nos da el error 1062: "Duplicate entry '5' for key libros.PRYMARY' 60 | -------------------------------------------------------------------------------- /Resolución de problemas/30-Distinct.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla "cursos", si existe. 2 | 3 | DROP TABLE IF EXISTS cursos; 4 | 5 | -- 2- Cree la tabla "cursos" con la siguiente estructura: 6 | 7 | CREATE TABLE cursos( 8 | codigo TINYINT UNSIGNED AUTO_INCREMENT, 9 | tema VARCHAR(20) NOT NULL, 10 | horario CHAR(2) NOT NULL, 11 | clases TINYINT UNSIGNED DEFAULT 10, 12 | fechainicio DATE, 13 | costo DECIMAL(5,2) UNSIGNED, 14 | PRIMARY KEY(codigo) 15 | ); 16 | 17 | /* 3- Ingrese los siguientes registros: 18 | 19 | ('PHP básico','AM',10,'2006-08-07',200); 20 | ('PHP básico','PM',default,'2006-08-14',200); 21 | ('PHP básico','AM',default,'2006-08-05',200); 22 | ('PHP avanzado','AM',20,'2006-08-01',350); 23 | ('JavaScript básico','PM',15,'2006-09-11',150); 24 | ('Paginas web','PM',15,'2006-08-08',200); 25 | ('Paginas web','AM',15,'2006-08-12',200); 26 | ('Paginas web','AM',15,'2006-08-21',200); 27 | ('HTML avanzado','AM',20,'2006-09-18',180); 28 | ('HTML avanzado','PM',20,'2006-09-25',180); 29 | ('JavaScript avanzado','PM',25,'2006-09-18',150); */ 30 | 31 | INSERT INTO cursos (tema, horario, clases, fechainicio, costo) 32 | VALUES('PHP básico','AM',10,'2006-08-07',200), 33 | ('PHP básico','PM',default,'2006-08-14',200), 34 | ('PHP básico','AM',default,'2006-08-05',200), 35 | ('PHP avanzado','AM',20,'2006-08-01',350), 36 | ('JavaScript básico','PM',15,'2006-09-11',150), 37 | ('Paginas web','PM',15,'2006-08-08',200), 38 | ('Paginas web','AM',15,'2006-08-12',200), 39 | ('Paginas web','AM',15,'2006-08-21',200), 40 | ('HTML avanzado','AM',20,'2006-09-18',180), 41 | ('HTML avanzado','PM',20,'2006-09-25',180), 42 | ('JavaScript avanzado','PM',25,'2006-09-18',150); 43 | 44 | -- 4- Obtenga la lista de temas de los cursos sin repetición: 45 | 46 | SELECT DISTINCT tema 47 | FROM cursos; 48 | 49 | -- 5- Seleccione los cursos donde el tema incluya "PHP", sin repetir horario ni tema: 50 | 51 | SELECT DISTINCT horario,tema FROM cursos 52 | WHERE tema REGEXP 'PHP'; 53 | 54 | -- 6- Cuente la cantidad de cursos DISTINTOS agrupados por horario: 55 | 56 | SELECT horario,COUNT(DISTINCT tema) AS 'Cursos distintos' 57 | FROM cursos 58 | GROUP BY horario; 59 | -------------------------------------------------------------------------------- /Resolución de problemas/79-ProcedimientosAlmacenadosI.sql: -------------------------------------------------------------------------------- 1 | -- 1- Eliminamos la tabla, si existe y la creamos: 2 | 3 | DROP TABLE IF EXISTS empleados; 4 | 5 | CREATE TABLE empleados( 6 | documento CHAR(8), 7 | nombre VARCHAR(20), 8 | apellido VARCHAR(20), 9 | sueldo DECIMAL(6,2), 10 | cantidadhijos INT, 11 | seccion VARCHAR(20), 12 | PRIMARY KEY(documento) 13 | ); 14 | 15 | -- 2- Ingrese algunos registros: 16 | 17 | INSERT INTO empleados 18 | VALUES('22222222','Juan','Perez',300,2,'Contaduria'), 19 | ('22333333','Luis','Lopez',300,0,'Contaduria'), 20 | ('22444444','Marta','Perez',500,1,'Sistemas'), 21 | ('22555555','Susana','Garcia',400,2,'Secretaria'), 22 | ('22666666','Jose Maria','Morales',400,3,'Secretaria'); 23 | 24 | -- 3- Elimine el procedimiento llamado "pa_empleados_sueldo" si existe: 25 | 26 | DROP PROCEDURE IF EXISTS pa_empleados_sueldo; 27 | 28 | /* 4- Cree un procedimiento almacenado llamado "pa_empleados_sueldo" que seleccione los nombres, 29 | apellidos y sueldos de los empleados. */ 30 | 31 | delimiter // 32 | 33 | CREATE PROCEDURE pa_empleados_sueldo() 34 | BEGIN 35 | SELECT nombre,apellido,sueldo 36 | FROM empleados; 37 | 38 | END// 39 | 40 | delimiter ; 41 | 42 | -- 5- Ejecute el procedimiento creado anteriormente. 43 | 44 | CALL pa_empleados_sueldo(); 45 | 46 | -- 6- Elimine el procedimiento llamado "pa_empleados_hijos" si existe: 47 | 48 | DROP PROCEDURE IF EXISTS pa_empleados_hijos; 49 | 50 | /* 7- Cree un procedimiento almacenado llamado "pa_empleados_hijos" que seleccione los nombres, 51 | apellidos y cantidad de hijos de los empleados con hijos. */ 52 | 53 | delimiter // 54 | 55 | CREATE PROCEDURE pa_empleados_hijos() 56 | BEGIN 57 | SELECT nombre,apellido,cantidadhijos 58 | FROM empleados 59 | WHERE cantidadhijos>0; 60 | END // 61 | 62 | delimiter ; 63 | 64 | -- 8- Ejecute el procedimiento creado anteriormente. 65 | 66 | CALL pa_empleados_hijos(); 67 | 68 | /* 9- Actualice la cantidad de hijos de algún empleado sin hijos y vuelva a ejecutar el procedimiento 69 | para verificar que ahora si aparece en la lista. */ 70 | 71 | UPDATE empleados SET cantidadhijos=1 72 | WHERE documento='22333333'; 73 | 74 | CALL pa_empleados_hijos(); 75 | -------------------------------------------------------------------------------- /Resolución de problemas/59-LeftJoinII.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine las tablas "socios" e "inscriptos" si existen. 2 | 3 | DROP TABLE IF EXISTS socios, inscriptos; 4 | 5 | -- 2- Cree las tablas: 6 | 7 | CREATE TABLE socios( 8 | documento CHAR(8) NOT NULL, 9 | nombre VARCHAR(30), 10 | domicilio VARCHAR(30), 11 | PRIMARY KEY(documento) 12 | ); 13 | 14 | CREATE TABLE inscriptos( 15 | documento CHAR(8) NOT NULL, 16 | deporte VARCHAR(15) NOT NULL, 17 | año YEAR, 18 | matricula CHAR(1), /*si esta paga ='s' sino 'n'*/ 19 | PRIMARY KEY(documento,deporte,año) 20 | ); 21 | 22 | /* 3- Ingrese algunos registros para ambas tablas: 23 | 24 | socios: 25 | ('22333444','Juan Perez','Colon 234'); 26 | ('23333444','Maria Lopez','Sarmiento 465'); 27 | ('24333444','Antonio Juarez','Caseros 980'); 28 | ('25333444','Ana Juarez','Sucre 134'); 29 | ('26333444','Sofia Herrero','Avellaneda 1234'); 30 | 31 | inscriptos: 32 | ('22333444','natacion','2015','s'); 33 | ('22333444','natacion','2016','n'); 34 | ('23333444','natacion','2015','s'); 35 | ('23333444','tenis','2016','s'); 36 | ('23333444','natacion','2016','s'); 37 | ('25333444','tenis','2016','n'); 38 | ('25333444','basquet','2016','n'); */ 39 | 40 | INSERT INTO socios 41 | VALUES('22333444','Juan Perez','Colon 234'), 42 | ('23333444','Maria Lopez','Sarmiento 465'), 43 | ('24333444','Antonio Juarez','Caseros 980'), 44 | ('25333444','Ana Juarez','Sucre 134'), 45 | ('26333444','Sofia Herrero','Avellaneda 1234'); 46 | 47 | INSERT INTO inscriptos 48 | VALUES('22333444','natacion','2015','s'), 49 | ('22333444','natacion','2016','n'), 50 | ('23333444','natacion','2015','s'), 51 | ('23333444','tenis','2016','s'), 52 | ('23333444','natacion','2016','s'), 53 | ('25333444','tenis','2016','n'), 54 | ('25333444','basquet','2016','n'); 55 | 56 | -- 4- Muestre el nombre del socio, deporte y año realizando un join: 57 | 58 | SELECT s.nombre, i.deporte, i.año 59 | FROM socios AS s 60 | LEFT JOIN inscriptos AS i 61 | ON s.documento=i.documento; 62 | 63 | -- 5- Muestre los nombres de los socios que no se han inscripto nunca en un deporte: 64 | 65 | SELECT s.nombre 66 | FROM socios AS s 67 | LEFT JOIN inscriptos AS i 68 | ON s.documento=i.documento 69 | WHERE deporte IS NULL; 70 | -------------------------------------------------------------------------------- /Resolución de problemas/19-ColumnasCalculadas.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla "empleados" si existe. 2 | 3 | DROP TABLE IF EXISTS empleados; 4 | 5 | /* 2- Cree una tabla llamada "empleados" con la estructura necesaria para almacenar la siguiente información: 6 | 7 | - nombre del empleado, 8 | - documento, 9 | - sexo, 10 | - domicilio, 11 | - sueldo básico (hasta 9999.99), 12 | - hijos a cargo, 13 | - clave primaria: documento. */ 14 | 15 | CREATE TABLE empleados( 16 | nombre VARCHAR(25) NOT NULL, 17 | documento INT UNIQUE, 18 | sexo ENUM('m','f'), 19 | domicilio VARCHAR(35) DEFAULT 'Desconocido', 20 | sueldo DECIMAL(5,2) CHECK (sueldo <= 9999.99), 21 | hijos TINYINT UNSIGNED, 22 | PRIMARY KEY(documento)); 23 | 24 | /* 3- Ingrese algunos registros: 25 | 26 | ('Juan Perez','22333444','m', 'Alem'300,1); 27 | ('Ana Acosta','21333474','f','DEFAULT', 400,2); 28 | ('Alberto Lopez','24333444','m', 'Vedia', 600,0); 29 | ('Carlos Sanchez','30333444','m', 'Junin',550,3); 30 | ('Mariana Torres','23444555','f', 'DEFAULT', 600,1); 31 | ('Marcos Garcia','23664555','m', 'Lomas',850,2); */ 32 | 33 | INSERT INTO empleados 34 | VALUES('Juan Perez','22333444','m', 'Alem', 300,1), 35 | ('Ana Acosta','21333474','f', DEFAULT, 400,2), 36 | ('Alberto Lopez','24333444','m', 'Vedia', 600,0), 37 | ('Carlos Sanchez','30333444','m', 'Junin', 550,3), 38 | ('Mariana Torres','23444555','f', DEFAULT, 600,1), 39 | ('Marcos Garcia','23664555','m', 'Lomas', 850,2); 40 | 41 | 42 | /* 4- La empresa está pensando en aumentar un 10% el sueldo a los empleados, y quiere saber a cuánto 43 | subiría cada sueldo básico, para ello usaremos una sentencia en la cual incluimos una 44 | columna que hará el cálculo de cada sueldo más el 10%: */ 45 | 46 | SELECT nombre, sueldo, ROUND(sueldo*1.10,2) AS SueldoConAumento 47 | FROM empleados; 48 | 49 | -- En este caso utilizo un ROUND para redondear en dos decimales 50 | 51 | /* 5- La empresa paga un salario familiar por hijos a cargo, $200 por cada hijo. Necesitamos el nombre 52 | del empleado, el sueldo básico, la cantidad de hijos a cargo, el total del salario familiar y el 53 | suedo final (incluyendo el salario familiar): */ 54 | 55 | SELECT nombre, sueldo,hijos,(200*hijos),sueldo+(200*hijos) 56 | FROM empleados; 57 | -------------------------------------------------------------------------------- /Resolución de problemas/72-SubconsultasCorrelacionadas.sql: -------------------------------------------------------------------------------- 1 | -- 1- Borre las tablas si existen y luego cree las tablas: 2 | 3 | DROP TABLE IF EXISTS socios, inscriptos; 4 | 5 | CREATE TABLE socios( 6 | numero INT AUTO_INCREMENT, 7 | documento CHAR(8), 8 | nombre VARCHAR(30), 9 | domicilio VARCHAR(30), 10 | PRIMARY KEY(numero) 11 | ); 12 | 13 | CREATE TABLE inscriptos ( 14 | numerosocio INT NOT NULL, 15 | deporte VARCHAR(20) NOT NULL, 16 | cuotas SMALLINT, 17 | PRIMARY KEY(numerosocio,deporte) 18 | ); 19 | 20 | -- 2- Ingrese algunos registros: 21 | 22 | INSERT INTO socios(documento,nombre,domicilio) 23 | VALUES('23333333','Alberto Paredes','Colon 111'), 24 | ('24444444','Carlos Conte','Sarmiento 755'), 25 | ('25555555','Fabian Fuentes','Caseros 987'), 26 | ('26666666','Hector Lopez','Sucre 344'); 27 | 28 | INSERT INTO inscriptos 29 | VALUES(1,'tenis',1), 30 | (1,'basquet',2), 31 | (1,'natacion',1), 32 | (2,'tenis',9), 33 | (2,'natacion',1), 34 | (2,'basquet',default), 35 | (2,'futbol',2), 36 | (3,'tenis',8), 37 | (3,'basquet',9), 38 | (3,'natacion',0), 39 | (4,'basquet',10); 40 | 41 | /* 3- Se necesita un listado de todos los socios que incluya nombre y domicilio, la cantidad de 42 | deportes a los cuales se ha inscripto, empleando subconsulta. */ 43 | 44 | SELECT nombre,domicilio, 45 | (SELECT COUNT(*) 46 | FROM inscriptos AS i 47 | WHERE s.numero=i.numerosocio) AS deportes 48 | FROM socios AS s 49 | ORDER BY deportes DESC; 50 | 51 | 52 | /* 4- Se necesita el nombre de todos los socios, el total de cuotas que debe pagar (10 por cada 53 | deporte) y el total de cuotas pagas, empleando subconsulta. */ 54 | 55 | SELECT nombre, 56 | (SELECT (COUNT(*)*10) 57 | FROM inscriptos AS i 58 | WHERE s.numero=i.numerosocio) AS total, 59 | (SELECT SUM(i.cuotas) 60 | FROM inscriptos AS i 61 | WHERE s.numero=i.numerosocio) AS pagas 62 | FROM socios AS s; 63 | 64 | 65 | -- 5- Obtenga la misma salida anterior empleando join. 66 | 67 | SELECT nombre, 68 | COUNT(i.deporte)*10 AS total, 69 | SUM(i.cuotas) AS pagas 70 | FROM socios AS s 71 | JOIN inscriptos AS i 72 | ON numero=numerosocio 73 | GROUP BY s.nombre; 74 | 75 | -- Es mucho más sencillo de esta forma 76 | -------------------------------------------------------------------------------- /Resolución de problemas/55-JoinII.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine las tablas "socios" e "inscriptos" si existen. 2 | 3 | DROP TABLE IF EXISTS socios, inscriptos; 4 | 5 | -- 2- Cree las tablas: 6 | 7 | CREATE TABLE socios( 8 | documento CHAR(8) NOT NULL, 9 | nombre VARCHAR(30), 10 | domicilio VARCHAR(30), 11 | PRIMARY KEY(documento) 12 | ); 13 | 14 | CREATE TABLE inscriptos( 15 | documento CHAR(8) NOT NULL, 16 | deporte VARCHAR(15) NOT NULL, 17 | año YEAR, 18 | matricula CHAR(1), -- si esta paga ='s' sino 'n' 19 | PRIMARY KEY(documento,deporte,año) 20 | ); 21 | 22 | /* 3- Ingrese algunos registros para ambas tablas: 23 | 24 | socios: 25 | ('22333444','Juan Perez','Colon 234'); 26 | ('23333444','Maria Lopez','Sarmiento 465'); 27 | ('24333444','Antonio Juarez','Caseros 980'); 28 | 29 | inscriptos: 30 | ('22333444','natacion','2005','s'); 31 | ('22333444','natacion','2006','n'); 32 | ('23333444','natacion','2005','s'); 33 | ('23333444','tenis','2006','s'); 34 | ('23333444','natacion','2006','s'); 35 | ('24333444','tenis','2006','n'); 36 | ('24333444','basquet','2006','n'); */ 37 | 38 | INSERT INTO socios 39 | VALUES('22333444','Juan Perez','Colon 234'), 40 | ('23333444','Maria Lopez','Sarmiento 465'), 41 | ('24333444','Antonio Juarez','Caseros 980'); 42 | 43 | INSERT INTO inscriptos 44 | VALUES('22333444','natacion','2005','s'), 45 | ('22333444','natacion','2006','n'), 46 | ('23333444','natacion','2005','s'), 47 | ('23333444','tenis','2006','s'), 48 | ('23333444','natacion','2006','s'), 49 | ('24333444','tenis','2006','n'), 50 | ('24333444','basquet','2006','n'); 51 | 52 | -- 4- Muestre el nombre del socio y todos los campos de la tabla "inscriptos": 53 | 54 | SELECT s.nombre, i.* 55 | FROM socios AS s 56 | JOIN inscriptos AS i 57 | ON s.documento=i.documento; 58 | 59 | -- 5- Muestre el nombre de los socios y los deportes en los cuales están inscriptos en 2006: 60 | 61 | SELECT s.nombre, i.deporte 62 | FROM socios AS s 63 | JOIN inscriptos AS i 64 | ON s.documento=i.documento 65 | WHERE año=2006; 66 | 67 | -- 6- Muestre el nombre y todas las inscripciones del socio con número de documento='23333444': 68 | 69 | SELECT s.nombre, i.deporte 70 | FROM socios AS s 71 | JOIN inscriptos AS i 72 | ON s.documento=i.documento 73 | WHERE s.documento='23333444'; 74 | -------------------------------------------------------------------------------- /Enunciados de problemas/20) Funciones (Fecha y Hora): -------------------------------------------------------------------------------- 1 | Funciones para el uso de fecha y hora. 2 | 3 | Problema: 4 | 5 | Una empresa registra los datos de sus empleados en una tabla llamada "empleados". 6 | 7 | 1- Elimine la tabla "empleados" si existe. 8 | 9 | 2- Cree y utilice la siguiente tabla: 10 | 11 | create table empleados( 12 | documento char(8) not null, 13 | nombre varchar(30) not null, 14 | sexo char(1), 15 | domicilio varchar(30), 16 | fechaIngreso date, 17 | fechaNacimiento date, 18 | sueldoBasico decimal(5,2) unsigned, 19 | primary key(documento) 20 | ); 21 | 22 | 3- Ingrese algunos registros: 23 | 24 | ('22333111','Juan Perez','m','Colon 123','1990-02-01','1970-05-10',550); 25 | ('25444444','Susana Morales','f','Avellaneda 345','1995-04-01','1975-11-06',650); 26 | ('20111222','Hector Pereyra','m','Caseros 987','1995-04-01','1965-03-25',510); 27 | ('30000222','Luis Luque','m','Urquiza 456','1980-09-01','1980-03-29',700); 28 | ('20555444','Maria Laura Torres','f','San Martin 1122','2000-05-15','1965-12-22',700); 29 | ('30000234','Alberto Soto','m','Peru 232','2003-08-15','1989-10-10',420); 30 | ('20125478','Ana Gomez','f','Sarmiento 975','2004-06-14','1976-09-21',350); 31 | ('24154269','Ofelia Garcia','f','Triunvirato 628','2004-09-23','1974-05-12',390); 32 | ('306154269','Federico Gonzalez','m','Peru 390','1996-08-15','1985-05-01',580); 33 | 34 | 4- Es política de la empresa festejar cada fin de mes, los cumpleaños de todos los empleados que 35 | cumplen ese mes. Necesitamos los nombres y fecha de nacimiento de los empleados que cumplen años en 36 | el mes de mayo: 37 | 38 | 5- También es política de la empresa, aumentar el 1% del sueldo básico a los empleados, cada vez 39 | que cumplen un año más de servicio. Necesitamos los nombres, fecha de ingreso a la empresa y sueldo 40 | básico de todos los empleados que cumplen un año más de servicio en el mes de agosto, y una columna 41 | calculando el incremento del sueldo: 42 | 43 | 6- Actualizamos el sueldo aumentando el 1% a los empleados que cumplen un año de servicio en el mes 44 | de agosto: 45 | 46 | 7- Verifique si la actualización se realizó: 47 | 48 | 8- Si el empleado cumple 10,20,30,40... años de servicio, se le regala una placa recordatoria. La 49 | secretaria de Gerencia necesita saber la cantidad de años de servicio que cumplen los empleados que 50 | ingresaron en el mes de agosto para encargar dichas placas: 51 | -------------------------------------------------------------------------------- /Enunciados de problemas/50) Set: -------------------------------------------------------------------------------- 1 | Tipo de dato set. 2 | 3 | Problema: 4 | 5 | Una academia de enseñanza dicta distintos cursos de informática. Los cursos se dictan por la mañana 6 | (de 8 a 12 hs.) o por la tarde (de 16 a 20 hs.), distintos días a la semana. La academia guarda los 7 | datos de los cursos en una tabla llamada "cursos" en la cual almacena el código del curso, el tema, 8 | los días de la semana que se dicta, el horario, por la mañana (AM) o por la tarde (PM), la cantidad 9 | de clases que incluye cada curso (clases), la fecha de inicio y el costo del curso. 10 | 11 | 1- Elimine la tabla "cursos", si existe. 12 | 13 | 2- Cree la tabla "cursos" con la siguiente estructura: 14 | 15 | create table cursos( 16 | codigo tinyint unsigned auto_increment, 17 | tema varchar(20) not null, 18 | dias set ('lunes','martes','miercoles','jueves','viernes','sabado') not null, 19 | horario enum ('AM','PM') not null, 20 | clases tinyint unsigned default 1, 21 | fechainicio date, 22 | costo decimal(5,2) unsigned, 23 | primary key(codigo) 24 | ); 25 | 26 | 3- Ingrese los siguientes registros: 27 | 28 | ('PHP básico','lunes,martes,miercoles','AM',18,'2006-08-07',200); 29 | ('PHP básico','lunes,martes,miercoles','PM',18,'2006-08-14',200); 30 | ('PHP básico','sabado','AM',18,'2006-08-05',280); 31 | ('PHP avanzado','martes,jueves','AM',20,'2006-08-01',350); 32 | ('JavaScript','lunes,martes,miercoles','PM',15,'2006-09-11',150); 33 | ('Paginas web','martes,jueves','PM',10,'2006-08-08',250); 34 | ('Paginas web','sabado','AM',10,'2006-08-12',280); 35 | ('Paginas web','lunes,viernes','AM',10,'2006-08-21',200); 36 | ('Paginas web','lunes,martes,miercoles,jueves,viernes','AM',10,'2006-09-18',180); 37 | ('Paginas web','lunes,viernes','PM',10,'2006-09-25',280); 38 | ('JavaScript','lunes,martes,viernes,sabado','PM',12,'2006-09-18',150); 39 | 40 | 4- Una persona quiere inscribirse en un curso de "PHP" y sólo tiene disponibles los sábados. 41 | Localice los cursos de "PHP" que se dictan solamente los sábados: 42 | 43 | 5- Otra persona quiere aprender a diseñar páginas web, tiene disponibles todas las mañanas excepto 44 | los miércoles. Vea si existe algún curso que cumpla con sus necesidades: 45 | 46 | 6- Otra persona necesita aprender JavaScript, tiene disponibles todos las tardes excepto los jueves 47 | y quiere un curso que no supere las 15 clases para el mes de setiembre. Busque algún curso para 48 | esta persona: 49 | -------------------------------------------------------------------------------- /Resolución de problemas/17-AtriubutoDefault.sql: -------------------------------------------------------------------------------- 1 | /* Problema: 2 | 3 | Un comercio que envía pizzas y empanadas a domicilio registra los pedidos diariamente en una tabla 4 | llamada "pedidos" con los siguientes datos: 5 | 6 | - numero de pedido, autoincrementable, entero positivo comienza en 1 y menor a 200 aprox. 7 | - nombre: pizza o empanada, por defecto "empanada", 8 | - tipo: por ejemplo, si es pizza: especial, muzarela, etc., si son empanadas: arabes, pollo, jamón 9 | y queso, criollas, etc. 10 | - precio: precio por unidad, valor con decimales que no supera los $99.99 y será siempre mayor a 11 | 0, por defecto "1", 12 | - cantidad: cantidad de articulos, entero positivo desde 1 e inferior a 200 aprox., por 13 | defecto "12" 14 | - domicilio del cliente. */ 15 | 16 | -- 1- Elimine la tabla "pedidos" si existe. 17 | 18 | DROP TABLE IF EXISTS pedidos; 19 | 20 | -- 2- Cree la tabla eligiendo el tipo de dato adecuado para cada campo. 21 | 22 | CREATE TABLE pedidos ( 23 | numero_pedido INT AUTO_INCREMENT PRIMARY KEY, 24 | nombre ENUM('pizza', 'empanada') DEFAULT 'empanada', 25 | tipo VARCHAR(50) NOT NULL, 26 | precio DECIMAL(4,2) DEFAULT 1 CHECK (precio > 0 AND precio <= 99.99), 27 | cantidad INT DEFAULT 12 CHECK (cantidad >= 1 AND cantidad < 200), 28 | domicilio VARCHAR(255) NOT NULL 29 | ); 30 | 31 | /* 3- Ingrese los siguientes registros: 32 | 33 | ('piza','muzarela','4.00',3,'Sarmiento 235'); 34 | ('arabe','1.00',24,'Urquiza 296'); 35 | ('empanada','salteña','Colon 309'); 36 | ('arabe','San Martin 444'); 37 | ('piza','especial','4.00','Avellaneda 395'); */ 38 | 39 | 40 | INSERT INTO pedidos (nombre,tipo,precio,cantidad,domicilio) 41 | VALUES('pizza','muzarela','4.00',3,'Sarmiento 235'); 42 | 43 | INSERT INTO pedidos (tipo,precio,cantidad,domicilio) 44 | VALUES('arabe','1.00',24,'Urquiza 296'); 45 | 46 | 47 | INSERT INTO pedidos (nombre,tipo,domicilio) 48 | VALUES('empanada','salteña','Colon 309'); 49 | 50 | INSERT INTO pedidos (tipo,domicilio) 51 | VALUES('arabe','San Martin 444'); 52 | 53 | INSERT INTO pedidos (nombre,tipo,precio,domicilio) 54 | VALUES('pizza','especial','4.00','Avellaneda 395'); 55 | 56 | -- 4- Muestre todos los campos de todos los pedidos para ver cómo se guardaron los datos no ingresados. 57 | 58 | SELECT * FROM pedidos; 59 | 60 | -- Podemos ver que donde NO indicamos un dato, el default que establecimos "salto" correctamente 61 | -------------------------------------------------------------------------------- /Resolución de problemas/56-JoinIII.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine las tablas "prestamos" y "libros", si existen. 2 | 3 | DROP TABLE IF EXISTS prestamos, libros; 4 | 5 | -- 2- Cree las tablas: 6 | 7 | CREATE TABLE libros( 8 | codigo INT UNSIGNED AUTO_INCREMENT, 9 | titulo VARCHAR(40), 10 | autor VARCHAR(30), 11 | editorial VARCHAR(15), 12 | PRIMARY KEY(codigo) 13 | ); 14 | 15 | CREATE TABLE prestamos( 16 | codigolibro INT UNSIGNED NOT NULL, 17 | documento CHAR(8) NOT NULL, 18 | fechaprestamo DATE NOT NULL, 19 | fechadevolucion DATE, 20 | PRIMARY KEY(codigolibro,fechaprestamo) 21 | ); 22 | 23 | /* 3- Ingrese algunos registros para ambas tablas: 24 | 25 | libros: 26 | (15,'Manual de 1º grado','Moreno Luis','Emece'); 27 | (28,'Manual de 2º grado','Moreno Luis','Emece'); 28 | (30,'Alicia en el pais de las maravillas','Lewis Carroll','Planeta'); 29 | (35,'El aleph','Borges','Emece'); 30 | 31 | prestamos: 32 | (15,'22333444','2006-07-10','2006-07-12'); 33 | (15,'22333444','2006-07-20','2006-07-21'); 34 | (15,'23333444','2006-07-25'); 35 | (30,'23333444','2006-07-28'); 36 | (28,'25333444','2006-08-10'); */ 37 | 38 | INSERT INTO libros 39 | VALUES(15,'Manual de 1º grado','Moreno Luis','Emece'), 40 | (28,'Manual de 2º grado','Moreno Luis','Emece'), 41 | (30,'Alicia en el pais de las maravillas','Lewis Carroll','Planeta'), 42 | (35,'El aleph','Borges','Emece'); 43 | 44 | INSERT INTO prestamos 45 | VALUES(15,'22333444','2006-07-10','2006-07-12'), 46 | (15,'22333444','2006-07-20','2006-07-21'), 47 | (15,'23333444','2006-07-25', NULL), 48 | (30,'23333444','2006-07-28', NULL), 49 | (28,'25333444','2006-08-10', NULL); 50 | 51 | -- 4- Muestre todos los datos de los préstamos, incluyendo el nombre del libro: 52 | 53 | SELECT l.titulo, p.* 54 | FROM prestamos AS p 55 | JOIN libros AS l 56 | ON p.codigolibro=l.codigo; 57 | 58 | -- 5- Muestre la información de los préstamos del libro "Manual de 1º grado": 59 | 60 | SELECT l.titulo, p.* 61 | FROM prestamos AS p 62 | JOIN libros AS l 63 | ON p.codigolibro=l.codigo 64 | WHERE l.titulo='Manual de 1º grado'; 65 | 66 | /* 6- Muestre los títulos de los libros, la fecha de préstamo y el documento del socio de todos los 67 | libros que no han sido devueltos: */ 68 | 69 | SELECT l.titulo, p.fechaprestamo,p.documento 70 | FROM prestamos AS p 71 | JOIN libros AS l 72 | ON p.codigolibro=l.codigo 73 | WHERE p.fechadevolucion IS NULL; 74 | -------------------------------------------------------------------------------- /Resolución de problemas/73-Subconsultas(ExistsYNoExists).sql: -------------------------------------------------------------------------------- 1 | -- 1- Borre las tablas si existen y luego cree las tablas: 2 | 3 | DROP TABLE IF EXISTS socios, inscriptos; 4 | 5 | CREATE TABLE socios( 6 | numero INT AUTO_INCREMENT, 7 | documento CHAR(8), 8 | nombre VARCHAR(30), 9 | domicilio VARCHAR(30), 10 | PRIMARY KEY(numero) 11 | ); 12 | 13 | CREATE TABLE inscriptos ( 14 | numerosocio INT NOT NULL, 15 | deporte VARCHAR(20) NOT NULL, 16 | cuotas SMALLINT, 17 | PRIMARY KEY(numerosocio,deporte) 18 | ); 19 | 20 | -- 2- Ingrese algunos registros: 21 | 22 | INSERT INTO socios(documento,nombre,domicilio) 23 | VALUES('23333333','Alberto Paredes','Colon 111'), 24 | ('24444444','Carlos Conte','Sarmiento 755'), 25 | ('25555555','Fabian Fuentes','Caseros 987'), 26 | ('26666666','Hector Lopez','Sucre 344'); 27 | 28 | INSERT INTO inscriptos 29 | VALUES(1,'tenis',1), 30 | (1,'basquet',2), 31 | (1,'natacion',1), 32 | (2,'tenis',9), 33 | (2,'natacion',1), 34 | (2,'basquet',default), 35 | (2,'futbol',2), 36 | (3,'tenis',8), 37 | (3,'basquet',9), 38 | (3,'natacion',0), 39 | (4,'basquet',10); 40 | 41 | /* 3- Emplee una subconsulta con el operador "exists" para devolver la lista de socios que se 42 | inscribieron en 'natacion'. */ 43 | 44 | SELECT nombre 45 | FROM socios AS s 46 | WHERE EXISTS 47 | (SELECT * FROM inscriptos AS i 48 | WHERE s.numero=i.numerosocio 49 | AND i.deporte='natacion'); 50 | 51 | -- Esta subconsulta se puede realizar más facil con el siguiente JOIN: 52 | 53 | SELECT s.nombre 54 | FROM socios AS s 55 | JOIN inscriptos AS i 56 | ON s.numero=i.numerosocio 57 | WHERE i.deporte='natacion'; 58 | 59 | 60 | -- 4- Busque los socios que NO se han inscripto en 'natacion' empleando "not exists". 61 | 62 | SELECT nombre 63 | FROM socios AS s 64 | WHERE NOT EXISTS 65 | (SELECT * FROM inscriptos AS i 66 | WHERE s.numero=i.numerosocio 67 | AND i.deporte='natacion'); 68 | 69 | 70 | -- 5- Muestre todos los datos de los socios que han pagado todas las cuotas. 71 | 72 | -- Usando subconsultas: 73 | 74 | SELECT s.* 75 | FROM socios AS s 76 | WHERE EXISTS 77 | (SELECT * FROM inscriptos AS i 78 | WHERE s.numero=i.numerosocio 79 | AND i.cuotas=10); 80 | 81 | -- Usando JOIN: 82 | 83 | SELECT s.* 84 | FROM socios AS s 85 | JOIN inscriptos AS i 86 | ON s.numero = i.numerosocio 87 | WHERE i.cuotas= 10; 88 | -------------------------------------------------------------------------------- /Enunciados de problemas/66) Join con más de 2 tablas: -------------------------------------------------------------------------------- 1 | join con más de dos tablas. 2 | 3 | Problema: 4 | 5 | Un video club que alquila películas en video guarda información de sus películas en alquiler, sus 6 | socios y los alquileres en 3 tablas llamadas "peliculas", "socios" y "alquileres" respectivamente. 7 | 8 | 1- Elimine las tablas "peliculas", "socios" y "alquileres" si existen. 9 | 10 | 2- Créelas con las siguientes estructuras: 11 | 12 | create table peliculas ( 13 | codigo smallint unsigned auto_increment, 14 | titulo varchar(40) not null, 15 | actores varchar(40), 16 | duracion tinyint unsigned, 17 | primary key (codigo) 18 | ); 19 | 20 | create table socios( 21 | codigo smallint unsigned auto_increment, 22 | documento char(8), 23 | nombre varchar(30), 24 | domicilio varchar(30), 25 | primary key (codigo) 26 | ); 27 | 28 | create table alquileres( 29 | codigopelicula smallint unsigned not null, 30 | codigosocio smallint unsigned not null, 31 | fechaprestamo date not null, 32 | fechadevolucion date, 33 | primary key (codigopelicula,fechaprestamo) 34 | ); 35 | 36 | 3- Ingrese los siguientes registros para las 3 tablas. 37 | 38 | peliculas: 39 | ('Elsa y Fred','China Zorrilla',90); 40 | ('Mision imposible','Tom Cruise',120); 41 | ('Mision imposible 2','Tom Cruise',180); 42 | ('Harry Potter y la piedra filosofal','Daniel H.',120); 43 | ('Harry Potter y la camara secreta','Daniel H.',150); 44 | 45 | socios: 46 | ('22333444','Juan Lopez'); 47 | ('23333444','Diana Perez'); 48 | ('24333444','Luis Fuentes'); 49 | 50 | alquileres: 51 | (1,1,'2016-07-02','2016-07-10'), 52 | (2,1,'2016-07-02', NULL), 53 | (3,1,'2016-07-12','2016-07-20'), 54 | (1,2,'2016-08-02','2016-08-10'), 55 | (3,2,'2016-08-12', NULL), 56 | (4,2,'2016-08-02','2016-08-15'), 57 | (1,3,'2016-09-02', NULL), 58 | (2,3,'2016-08-02','2016-08-12'), 59 | (3,3,'2016-08-15','2016-08-22'), 60 | (4,3,'2016-08-22', NULL), 61 | (4,1,'2016-08-25','2016-09-01'), 62 | (1,3,'2016-08-25', NULL); 63 | 64 | 4- Muestre toda la información de los "alquileres" (nombre de la película, nombre del socio, fecha 65 | de préstamo y de devolución): 66 | 67 | 5- Muestre la cantidad de veces que se alquiló cada película: 68 | 69 | 6- Muestre la cantidad de películas que alquiló cada socio: 70 | 71 | 7- Muestre la cantidad de películas DISTINTAS que alquiló cada socio: 72 | 73 | 8- Muestre la cantidad de películas alquiladas por cada socio ordenado por mes: 74 | 75 | -------------------------------------------------------------------------------- /Resolución de problemas/75-SubconsultaEnLugarDeUnaTabla.sql: -------------------------------------------------------------------------------- 1 | -- 1- Cree las tablas con las siguientes estructuras: 2 | 3 | DROP TABLE IF EXISTS socios, deportes, inscriptos; 4 | 5 | CREATE TABLE socios( 6 | documento CHAR(8) NOT NULL, 7 | nombre VARCHAR(30), 8 | domicilio VARCHAR(30), 9 | PRIMARY KEY(documento) 10 | ); 11 | 12 | CREATE TABLE deportes( 13 | codigo INT AUTO_INCREMENT, 14 | nombre VARCHAR(20), 15 | profesor VARCHAR(15), 16 | PRIMARY KEY(codigo) 17 | ); 18 | 19 | CREATE TABLE inscriptos( 20 | documento CHAR(8) NOT NULL, 21 | codigodeporte SMALLINT NOT NULL, 22 | año CHAR(4), 23 | matricula CHAR(1), -- 's'=paga, 'n'=impaga 24 | PRIMARY KEY(documento,codigodeporte,año) 25 | ); 26 | 27 | -- 2- Ingrese algunos registros en las 3 tablas: 28 | 29 | INSERT INTO socios 30 | VALUES('22222222','Ana Acosta','Avellaneda 111'), 31 | ('23333333','Betina Bustos','Bulnes 222'), 32 | ('24444444','Carlos Castro','Caseros 333'), 33 | ('25555555','Daniel Duarte','Dinamarca 44'); 34 | 35 | INSERT INTO deportes(nombre,profesor) 36 | VALUES('basquet','Juan Juarez'), 37 | ('futbol','Pedro Perez'), 38 | ('natacion','Marina Morales'), 39 | ('tenis','Marina Morales'); 40 | 41 | INSERT INTO inscriptos 42 | VALUES('22222222',3,'2006','s'), 43 | ('23333333',3,'2006','s'), 44 | ('24444444',3,'2006','n'), 45 | ('22222222',3,'2005','s'), 46 | ('22222222',3,'2007','n'), 47 | ('24444444',1,'2006','s'), 48 | ('24444444',2,'2006','s'); 49 | 50 | /* 3- Realice una consulta en la cual muestre todos los datos de las inscripciones, incluyendo el 51 | nombre del deporte y del profesor. */ 52 | 53 | SELECT i.documento,i.codigodeporte,d.nombre AS deporte, año, matricula, d.profesor 54 | FROM deportes AS d 55 | JOIN inscriptos AS i 56 | ON d.codigo=i.codigodeporte; 57 | 58 | /* 4- Utilice el resultado de la consulta anterior como una tabla derivada para emplear en lugar de una 59 | tabla para realizar un "join" y recuperar el nombre del socio, el deporte en el cual está inscripto, 60 | el año, el nombre del profesor y la matrícula. */ 61 | 62 | SELECT s.nombre,td.deporte,td.profesor,td.año,td.matricula 63 | FROM socios AS s 64 | JOIN (SELECT i.documento,i.codigodeporte,d.nombre AS deporte, año, matricula, d.profesor 65 | FROM deportes AS d 66 | JOIN inscriptos AS i 67 | ON d.codigo=i.codigodeporte) AS td 68 | ON td.documento=s.documento; 69 | -------------------------------------------------------------------------------- /Enunciados de problemas/52) Funcion IF: -------------------------------------------------------------------------------- 1 | Funciones de control de flujo (if) 2 | 3 | Problema: 4 | 5 | Una empresa registra los datos de sus empleados en una tabla llamada "empleados". 6 | 7 | 1- Elimine la tabla "empleados" si existe: 8 | 9 | 2- Cree la tabla: 10 | 11 | create table empleados( 12 | documento char(8) not null, 13 | nombre varchar(30) not null, 14 | sexo char(1), 15 | domicilio varchar(30), 16 | fechaingreso date, 17 | fechanacimiento date, 18 | sueldobasico decimal(5,2) unsigned, 19 | hijos tinyint unsigned, 20 | primary key(documento) 21 | ); 22 | 23 | 3- Ingrese algunos registros: 24 | 25 | ('22333111','Juan Perez','m','Colon 123','1990-02-01','1970-05-10',550,0); 26 | ('25444444','Susana Morales','f','Avellaneda 345','1995-04-01','1975-11-06',650,2); 27 | ('20111222','Hector Pereyra','m','Caseros 987','1995-04-01','1965-03-25',510,1); 28 | ('30000222','Luis LUque','m','Urquiza 456','1980-09-01','1980-03-29',700,3); 29 | ('20555444','Maria Laura Torres','f','San Martin 1122','2000-05-15','1965-12-22',400,3); 30 | ('30000234','Alberto Soto','m','Peru 232','2003-08-15','1989-10-10',420,1); 31 | ('20125478','Ana Gomez','f','Sarmiento 975','2004-06-14','1976-09-21',350,2); 32 | ('24154269','Ofelia Garcia','f','Triunvirato 628','2004-09-23','1974-05-12',390,0); 33 | ('30419964','Oscar Torres','m','Hernandez 1234','1996-04-10','1978-05-02',400,0); 34 | 35 | 4- Es política de la empresa festejar cada fin de mes, los cumpleaños de todos los empleados que 36 | cumplen ese mes. Si los empleados son de sexo femenino, se les regala un ramo de rosas, si son de 37 | sexo masculino, una corbata. La secretaria de la Gerencia necesita saber cuántos ramos de rosas y 38 | cuántas corbatas debe comprar para el mes de mayo: 39 | 40 | 5- Además, si el empleado cumple 10,20,30,40... años de servicio, se le regala una placa 41 | recordatoria. La secretaria de Gerencia necesita saber la cantidad de años de servicio que cumplen 42 | los empleados que ingresaron en el mes de abril para encargar dichas placas: 43 | 44 | 6- La empresa paga un sueldo adicional por hijos a cargos. para un sueldo básico menor o igual a 45 | $500 el salario familiar por hijo es de $300, para un sueldo superior, el monto es de $150 por 46 | hijo. Muestre el nombre del empleado, el sueldo básico, la cantidad de hijos a cargo, el valor del 47 | salario por hijo, el valor total del salario familiar y el sueldo final con el salario familiar 48 | incluido de todos los empleados con hijos a cargo: 49 | -------------------------------------------------------------------------------- /Resolución de problemas/70-SubconsultasConIN.sql: -------------------------------------------------------------------------------- 1 | /*1- Cree la tabla "clientes" (codigo, nombre, domicilio, ciudad, codigociudad) y "ciudades" (codigo, 2 | nombre). Agregue una restricción "primary key" para el campo "codigo" de ambas tablas): */ 3 | 4 | DROP TABLE IF EXISTS clientes, ciudades; 5 | 6 | CREATE TABLE ciudades( 7 | codigo INT AUTO_INCREMENT, 8 | nombre VARCHAR(20), 9 | PRIMARY KEY(codigo) 10 | ); 11 | 12 | CREATE TABLE clientes ( 13 | codigo INT AUTO_INCREMENT, 14 | nombre VARCHAR(30), 15 | domicilio VARCHAR(30), 16 | codigociudad SMALLINT NOT NULL, 17 | PRIMARY KEY(codigo) 18 | ); 19 | 20 | -- 2- Ingrese algunos registros para ambas tablas: 21 | 22 | INSERT INTO ciudades (nombre) 23 | VALUES('Cordoba'), 24 | ('Cruz del Eje'), 25 | ('Carlos Paz'), 26 | ('La Falda'), 27 | ('Villa Maria'); 28 | 29 | INSERT INTO clientes(nombre,domicilio,codigociudad) 30 | VALUES('Lopez Marcos','Colon 111',1), 31 | ('Lopez Hector','San Martin 222',1), 32 | ('Perez Ana','San Martin 333',2), 33 | ('Garcia Juan','Rivadavia 444',3), 34 | ('Perez Luis','Sarmiento 555',3), 35 | ('Gomez Ines','San Martin 666',4), 36 | ('Torres Fabiola','Alem 777',5), 37 | ('Garcia Luis','Sucre 888',5); 38 | 39 | /* 3- Necesitamos conocer los nombres de las ciudades de aquellos clientes cuyo domicilio es en calle 40 | "San Martin", empleando subconsulta. */ 41 | 42 | SELECT nombre 43 | FROM ciudades 44 | WHERE codigo IN 45 | (SELECT codigociudad 46 | FROM clientes 47 | WHERE domicilio LIKE 'San Martin %'); 48 | 49 | -- 4- Obtenga la misma salida anterior pero empleando join. 50 | 51 | SELECT DISTINCT ci.nombre 52 | FROM ciudades AS ci 53 | JOIN clientes AS cl 54 | ON codigociudad=ci.codigo 55 | WHERE domicilio LIKE 'San Martin%'; 56 | 57 | -- En este caso, en mi opinion, es mas facil y eficiente utilizar JOIN. 58 | 59 | /* 5- Obtenga los nombres de las ciudades de los clientes cuyo apellido no comienza con una letra 60 | específica, empleando subconsulta. */ 61 | 62 | SELECT nombre 63 | FROM ciudades 64 | WHERE codigo NOT IN 65 | (SELECT codigociudad 66 | FROM clientes 67 | WHERE nombre LIKE 'G%'); 68 | 69 | 70 | /* 6- Pruebe la subconsulta del punto 5 separada de la consulta exterior para verificar que retorna 71 | una lista de valores de un solo campo. */ 72 | 73 | SELECT codigociudad 74 | FROM clientes 75 | WHERE nombre LIKE 'G%'; 76 | -------------------------------------------------------------------------------- /Resolución de problemas/28-GroupBy.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla "clientes", si existe. 2 | 3 | DROP TABLE IF EXISTS clientes; 4 | 5 | -- 2- Créela con la siguiente estructura: 6 | 7 | CREATE TABLE clientes ( 8 | codigo INT UNSIGNED AUTO_INCREMENT, 9 | nombre VARCHAR(30) NOT NULL, 10 | domicilio VARCHAR(30), 11 | ciudad VARCHAR(20), 12 | provincia VARCHAR(20), 13 | telefono VARCHAR(11), 14 | PRIMARY KEY(codigo) 15 | ); 16 | 17 | /* 3- Ingrese algunos registros: 18 | 19 | ('Lopez Marcos', 'Colon 111', 'Córdoba','Cordoba','null'); 20 | ('Perez Ana', 'San Martin 222', 'Cruz del Eje','Cordoba','4578585'); 21 | ('Garcia Juan', 'Rivadavia 333', 'Villa Maria','Cordoba','4578445'); 22 | ('Perez Luis', 'Sarmiento 444', 'Rosario','Santa Fe',null); 23 | ('Pereyra Lucas', 'San Martin 555', 'Cruz del Eje','Cordoba','4253685'); 24 | ('Gomez Ines', 'San Martin 666', 'Santa Fe','Santa Fe','0345252525'); 25 | ('Torres Fabiola', 'Alem 777', 'Villa del Rosario','Cordoba','4554455'); 26 | ('Lopez Carlos', 'Irigoyen 888', 'Cruz del Eje','Cordoba',null); 27 | ('Ramos Betina', 'San Martin 999', 'Cordoba','Cordoba','4223366'); 28 | ('Lopez Lucas', 'San Martin 1010', 'Posadas','Misiones','0457858745'); */ 29 | 30 | INSERT INTO clientes (nombre, domicilio, ciudad, provincia, telefono) 31 | VALUES('Lopez Marcos', 'Colon 111', 'Córdoba','Cordoba','null'), 32 | ('Perez Ana', 'San Martin 222', 'Cruz del Eje','Cordoba','4578585'), 33 | ('Garcia Juan', 'Rivadavia 333', 'Villa Maria','Cordoba','4578445'), 34 | ('Perez Luis', 'Sarmiento 444', 'Rosario','Santa Fe',null), 35 | ('Pereyra Lucas', 'San Martin 555', 'Cruz del Eje','Cordoba','4253685'), 36 | ('Gomez Ines', 'San Martin 666', 'Santa Fe','Santa Fe','0345252525'), 37 | ('Torres Fabiola', 'Alem 777', 'Villa del Rosario','Cordoba','4554455'), 38 | ('Lopez Carlos', 'Irigoyen 888', 'Cruz del Eje','Cordoba',null), 39 | ('Ramos Betina', 'San Martin 999', 'Cordoba','Cordoba','4223366'), 40 | ('Lopez Lucas', 'San Martin 1010', 'Posadas','Misiones','0457858745'); 41 | 42 | -- 4- Obtenga el total de los registros: 43 | 44 | SELECT COUNT(*) FROM clientes; 45 | 46 | -- 5- Obtenga el total de los registros que no tienen valor nulo en los teléfonos: 47 | 48 | SELECT COUNT(telefono) FROM clientes; 49 | 50 | -- 6- Obtenga la cantidad de clientes agrupados por ciudad y provincia, ordenados por provincia: 51 | 52 | SELECT ciudad,provincia, COUNT(*) FROM clientes 53 | GROUP BY ciudad, provincia 54 | ORDER BY provincia; 55 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Desafío MySQL - Diego Moisset De Espanes 2 | 3 | Este repositorio contiene la resolución de un extenso desafío de SQL propuesto por el profesor Diego Moisset De Espanes, quien comparte ejercicios para aprender y practicar MySQL a través de su canal de YouTube. 4 | 5 | ## 📌 Descripción del Desafío 6 | 7 | El desafío abarca más de 80 problemas de SQL, organizados en distintos niveles de dificultad, desde lo básico hasta lo avanzado. Cada problema incluye varios incisos que cubren temas esenciales como: 8 | 9 | - Consultas `SELECT` básicas y avanzadas 10 | - Filtrado y ordenación de datos 11 | - Funciones de agregación y agrupamiento 12 | - Subconsultas y consultas anidadas 13 | - `JOINs` y combinaciones de tablas 14 | - Creación y manipulación de bases de datos 15 | - Vistas 16 | - Procedimientos almacenados 17 | - Optimización de consultas y buenas prácticas 18 | 19 | ## 📂 Estructura del Repositorio 20 | 21 | El repositorio está organizado en las siguientes carpetas: 22 | 23 | - `Enunciados de problemas`: Contiene los enunciados de cada problema en formato `.txt`. 24 | - `Resolución de problemas`: Contiene los archivos `.sql` con la solución a cada problema. 25 | 26 | Cada archivo en la carpeta de resoluciones está numerado según el enunciado correspondiente para facilitar la identificación y el seguimiento de las soluciones. 27 | 28 | ## 🛠️ Tecnologías Utilizadas 29 | 30 | - **MySQL**: Todas las consultas y soluciones están diseñadas para ejecutarse en un entorno MySQL. 31 | 32 | ## 🚀 Cómo Usar Este Repositorio 33 | 34 | 1. Clonar el repositorio: 35 | ```bash 36 | git clone https://github.com/agustinmusanti/SQLchallenge-6.git 37 | ``` 38 | 2. Explorar los enunciados dentro de la carpeta `Enunciados de problemas/`. 39 | 3. Ejecutar las soluciones dentro de la carpeta `Resolución de problemas/` en un entorno MySQL. 40 | 41 | ## 📚 Recursos Adicionales 42 | 43 | Si queres aprender más sobre SQL, podes visitar el canal de YouTube de **Diego Moisset De Espanes** para seguir sus clases y desafíos. 44 | 45 | 📌 [Canal de YouTube de Diego Moisset](https://www.youtube.com/@diegomoissetdeespanes) 46 | 47 | ## 📩 Contribuciones 48 | 49 | Este repositorio es un espacio de aprendizaje y práctica. Si tenes una forma diferente de resolver un problema o queres optimizar una consulta, sentite libre de hacer un **pull request** o abrir un **issue**. 50 | 51 | ## 📜 Licencia 52 | 53 | Este proyecto se comparte bajo la licencia MIT. Podes usarlo y modificarlo libremente respetando los términos de la licencia. 54 | 55 | -------------------------------------------------------------------------------- /Resolución de problemas/57-JoinIV.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine las tablas "consultas" y "obrassociales" si existen. 2 | 3 | DROP TABLE IF EXISTS consultas, obrassociales; 4 | 5 | -- 2- Cree las tablas: 6 | 7 | CREATE TABLE consultas( 8 | fecha DATE, 9 | hora TIME, 10 | documento CHAR(8) NOT NULL, 11 | codigoobrasocial TINYINT UNSIGNED, 12 | medico VARCHAR(30), 13 | PRIMARY KEY(fecha,hora,medico) 14 | ); 15 | 16 | CREATE TABLE obrassociales( 17 | codigo TINYINT UNSIGNED AUTO_INCREMENT, 18 | nombre VARCHAR(15), 19 | monto DECIMAL(5,2) UNSIGNED, 20 | PRIMARY KEY(codigo) 21 | ); 22 | 23 | /* 3- Ingrese algunos registros: 24 | 25 | obrassociales: 26 | ('PAMI',2); 27 | ('IPAM',5); 28 | ('OSDOP',3); 29 | 30 | consultas: 31 | ('2006-08-10','8:00','22333444',1,'Perez'); 32 | ('2006-08-10','10:00','22333444',1,'Lopez'); 33 | ('2006-08-10','8:30','23333444',1,'Perez'); 34 | ('2006-08-10','9:00','24333444',2,'Perez'); 35 | ('2006-08-10','10:00','25333444',3,'Perez'); 36 | ('2006-08-10','8:30','25333444',1,'Garcia'); 37 | ('2006-09-10','8:30','25333444',1,'Lopez'); */ 38 | 39 | INSERT INTO obrassociales (nombre, monto) 40 | VALUES('PAMI',2), 41 | ('IPAM',5), 42 | ('OSDOP',3); 43 | 44 | INSERT INTO consultas 45 | VALUES('2006-08-10','8:00','22333444',1,'Perez'), 46 | ('2006-08-10','10:00','22333444',1,'Lopez'), 47 | ('2006-08-10','8:30','23333444',1,'Perez'), 48 | ('2006-08-10','9:00','24333444',2,'Perez'), 49 | ('2006-08-10','10:00','25333444',3,'Perez'), 50 | ('2006-08-10','8:30','25333444',1,'Garcia'), 51 | ('2006-09-10','8:30','25333444',1,'Lopez'); 52 | 53 | /*4- Muestre la fecha,hora,documento del paciente, médico, nombre y monto de la obra social de todas 54 | las consultas: */ 55 | 56 | SELECT c.fecha, c.hora, c.documento, c.medico, os.nombre, os.monto 57 | FROM consultas AS c 58 | JOIN obrassociales AS os 59 | ON c.codigoobrasocial=os.codigo; 60 | 61 | /*5- Muestre fecha,hora,documento del paciente y nombre de la obra social para las consultas del 62 | doctor "Perez": */ 63 | 64 | SELECT c.fecha, c.hora, c.documento, os.nombre 65 | FROM consultas AS c 66 | JOIN obrassociales AS os 67 | ON c.codigoobrasocial=os.codigo 68 | WHERE c.medico="Perez"; 69 | 70 | -- 6- Muestre las obras sociales DISTINTAS que atendió el doctor "Perez" el día "2006-08-10": 71 | 72 | SELECT DISTINCT os.nombre 73 | FROM consultas AS c 74 | JOIN obrassociales AS os 75 | ON c.codigoobrasocial=os.codigo 76 | WHERE c.medico="Perez" AND c.fecha="2006-08-10"; 77 | -------------------------------------------------------------------------------- /Resolución de problemas/24-BusquedaDePatrones.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla "medicamentos", si existe. 2 | 3 | DROP TABLE IF EXISTS medicamentos; 4 | 5 | -- 2- Cree la tabla con la siguiente estructura: 6 | 7 | CREATE TABLE medicamentos( 8 | codigo INT UNSIGNED AUTO_INCREMENT, 9 | nombre VARCHAR(20), 10 | laboratorio VARCHAR(20), 11 | precio DECIMAL(6,2) UNSIGNED, 12 | cantidad INT UNSIGNED, 13 | PRIMARY KEY(codigo) 14 | ); 15 | 16 | -- 3- Visualice la estructura de la tabla "medicamentos". 17 | 18 | DESCRIBE medicamentos; 19 | 20 | /* 4- Ingrese los siguientes registros: 21 | 22 | ('Sertal gotas','Roche',5.2); 23 | ('Buscapina','Roche',4.10); 24 | ('Amoxidal 500','Bayer',15.60); 25 | ('Paracetamol 500','Bago',1.90); 26 | ('Bayaspirina','Bayer',2.10); 27 | ('Amoxidal jarabe','Bayer',5.10); 28 | ('Sertal compuesto','Bayer',5.10); 29 | ('Paracetamol 1000','Bago',2.90); 30 | ('Amoxinil','Roche',17.80); */ 31 | 32 | INSERT INTO medicamentos (nombre, laboratorio, precio) 33 | VALUES('Sertal gotas','Roche',5.2), 34 | ('Buscapina','Roche',4.10), 35 | ('Amoxidal 500','Bayer',15.60), 36 | ('Paracetamol 500','Bago',1.90), 37 | ('Bayaspirina','Bayer',2.10), 38 | ('Amoxidal jarabe','Bayer',5.10), 39 | ('Sertal compuesto','Bayer',5.10), 40 | ('Paracetamol 1000','Bago',2.90), 41 | ('Amoxinil','Roche',17.80); 42 | 43 | -- 5- Recupere los medicamentos cuyo nombre comiencen con "Amox": 44 | 45 | SELECT * FROM medicamentos 46 | WHERE nombre LIKE 'Amox%'; 47 | 48 | -- 6- Recupere los medicamentos "Paracetamol" cuyo precio sea menor a 2: 49 | 50 | SELECT * FROM medicamentos 51 | WHERE nombre LIKE 'Paracetamol%' AND 52 | precio<2; 53 | 54 | -- 7- Busque todos los medicamentos cuyo precio tenga .10 centavos: 55 | 56 | SELECT * FROM medicamentos 57 | WHERE precio LIKE '%.1%'; 58 | 59 | -- 8- Muestre todos los medicamentos que no contengan la cadena "compuesto": 60 | 61 | SELECT * FROM medicamentos 62 | WHERE nombre NOT LIKE'%compuesto%'; 63 | 64 | -- 9- Elimine todos los registros cuyo laboratorio contenga la letra "y": 65 | 66 | DELETE FROM medicamentos 67 | WHERE laboratorio LIKE '%y%'; 68 | 69 | -- Ejecuto la siguiente consulta para verificar el paso anterior: 70 | 71 | SELECT * FROM medicamentos; 72 | 73 | -- 10- Cambie el precio por 5, al "Paracetamol" cuyo precio es mayor a 2: 74 | 75 | UPDATE medicamentos SET precio=5 76 | WHERE nombre LIKE 'Paracetamol%' AND 77 | precio>2; 78 | 79 | -- Ejecuto la siguiente consulta para verificar el paso anterior: 80 | 81 | SELECT * FROM medicamentos; 82 | -------------------------------------------------------------------------------- /Resolución de problemas/40-Replace.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine la tabla " alumnos" si existe: 2 | 3 | DROP TABLE IF EXISTS alumnos; 4 | 5 | -- 2- Cree la tabla: 6 | 7 | CREATE TABLE alumnos( 8 | legajo INT(10) UNSIGNED AUTO_INCREMENT, 9 | nombre VARCHAR(30), 10 | documento CHAR(8), 11 | domicilio VARCHAR(30), 12 | PRIMARY KEY(legajo), 13 | UNIQUE i_documento (documento) 14 | ); 15 | 16 | /* 3- Ingrese algunos registros: 17 | 18 | ('1353','Juan Lopez','22333444','Colon 123'); 19 | ('2345','Ana Acosta','24000555','Caseros 456'); 20 | ('2356','Jose Torres','26888777','Sucre 312'); 21 | ('3567','Luis Perez','28020020','Rivadavia 234'); */ 22 | 23 | INSERT INTO alumnos 24 | VALUES('1353','Juan Lopez','22333444','Colon 123'), 25 | ('2345','Ana Acosta','24000555','Caseros 456'), 26 | ('2356','Jose Torres','26888777','Sucre 312'), 27 | ('3567','Luis Perez','28020020','Rivadavia 234'); 28 | 29 | -- 4- Intente ingresar un registro con clave primaria repetida (legajo "3567"): 30 | 31 | INSERT INTO alumnos 32 | VALUES('3567','Marcos Pereyra','30000333','Guemes 134'); 33 | 34 | -- No es posible ingresar registros con clave primaria repetida. 35 | 36 | -- 5- Ingrese el registro anterior reemplazando el existente: 37 | 38 | REPLACE INTO alumnos 39 | VALUES('3567','Marcos Pereyra','30000333','Guemes 134'); 40 | 41 | -- Observamos que REPLACE elimina el registro anterior y lo reemplaza por el nuevo. 42 | 43 | -- 6- Intente ingresar un alumno con documento repetido: 44 | 45 | INSERT INTO alumnos 46 | VALUES('4567','Susana Juarez','30000333','Avellaneda 33'); 47 | 48 | -- No es posible dicha insercion ya que hemos definido que el documento es UNIQUE. 49 | 50 | -- 7- Reemplace el registro del enunciado anterior: 51 | 52 | REPLACE INTO alumnos 53 | VALUES('4567','Susana Juarez','30000333','Avellaneda 33'); 54 | 55 | SELECT * FROM alumnos; 56 | 57 | -- Vemos que el alumno con documento "30000333" se eliminó y se reemplazó por el nuevo registro. 58 | 59 | -- 8- Elimine el índice único: 60 | 61 | DROP INDEX i_documento ON alumnos; 62 | 63 | /* 9- Ingrese con "replace" el siguiente registro con documento existente: 64 | ('4888','Gustavo Garcia','30000333','San Martin 846') */ 65 | 66 | REPLACE INTO alumnos 67 | VALUES('4888','Gustavo Garcia','30000333','San Martin 846'); 68 | 69 | -- Como hemos eliminado el indice UNIQUE esta vez no hubo eliminación, solamente inserción. 70 | 71 | -- 10- Muestre todos los registros: 72 | 73 | SELECT * FROM alumnos; 74 | 75 | -- Vemos que hay dos alumnos con el mismo número de documento. Esto se debe a la eliminacion de UNIQUE. 76 | -------------------------------------------------------------------------------- /Resolución de problemas/60-LeftJoinIII.sql: -------------------------------------------------------------------------------- 1 | -- 1- Elimine las tablas "premios" y "numerosrifa" si existen. 2 | 3 | 4 | DROP TABLE IF EXISTS premios, numerosrifa; 5 | 6 | -- 2- Cree las tablas: 7 | 8 | CREATE TABLE premios( 9 | posicion TINYINT UNSIGNED AUTO_INCREMENT, 10 | premio VARCHAR(40), 11 | numeroganador TINYINT UNSIGNED, 12 | PRIMARY KEY(posicion) 13 | ); 14 | 15 | CREATE TABLE numerosrifa( 16 | numero TINYINT UNSIGNED AUTO_INCREMENT, 17 | documento CHAR(8) NOT NULL, 18 | PRIMARY KEY(numero) 19 | ); 20 | 21 | /* 3- Ingrese algunos registros: 22 | 23 | premios: 24 | (1,'PC I7',205); 25 | (2,'Televisor 75 pulgadas',29); 26 | (3,'Microondas',5); 27 | (4,'Multiprocesadora',15); 28 | (5,'Cafetera',33); 29 | 30 | numerosrifa: 31 | (205,'22333444'); 32 | (200,'23333444'); 33 | (5,'23333444'); 34 | (8,'23333444'); 35 | (1,'24333444'); 36 | (109,'28333444'); 37 | (15,'30333444'); 38 | (28,'32333444'); 39 | (29,'29333444'); */ 40 | 41 | INSERT INTO premios 42 | VALUES(1,'PC I7',205), 43 | (2,'Televisor 75 pulgadas',29), 44 | (3,'Microondas',5), 45 | (4,'Multiprocesadora',15), 46 | (5,'Cafetera',33); 47 | 48 | INSERT INTO numerosrifa 49 | VALUES(205,'22333444'), 50 | (200,'23333444'), 51 | (5,'23333444'), 52 | (8,'23333444'), 53 | (1,'24333444'), 54 | (109,'28333444'), 55 | (15,'30333444'), 56 | (28,'32333444'), 57 | (29,'29333444'); 58 | 59 | /* 4- Muestre todos los números de rifas vendidos ("numerosrifas") y realice un "left join" mostrando 60 | la posición y el premio: */ 61 | 62 | SELECT nr.numero, p.posicion, p.premio 63 | FROM numerosrifa AS nr 64 | LEFT JOIN premios AS p 65 | ON nr.numero=p.numeroganador; 66 | 67 | -- 5- Muestre los mismos datos anteriores pero teniendo en cuenta los números ganadores solamente: 68 | 69 | SELECT nr.numero, p.posicion, p.premio 70 | FROM numerosrifa AS nr 71 | LEFT JOIN premios AS p 72 | ON nr.numero=p.numeroganador 73 | WHERE p.numeroganador IS NOT NULL; 74 | 75 | /* 6- Realice un "left join" pero en esta ocasión busque los números ganadores de la tabla "premios" 76 | en la tabla "numerosrifa": */ 77 | 78 | SELECT p.numeroganador, p.posicion, nr.numero 79 | FROM premios AS p 80 | LEFT JOIN numerosrifa AS nr 81 | ON nr.numero=p.numeroganador; 82 | 83 | /* 7- Realice el mismo "join" anterior pero sin considerar los valores de "premios" que no encuentren 84 | coincidencia en "numerosrifa". */ 85 | 86 | SELECT p.numeroganador, p.posicion, nr.numero 87 | FROM premios AS p 88 | LEFT JOIN numerosrifa AS nr 89 | ON nr.numero=p.numeroganador 90 | WHERE nr.numero IS NOT NULL; 91 | --------------------------------------------------------------------------------