Sunteți pe pagina 1din 278

Manual y Ejercicios de MySQL http://www.mysqlya.com.

ar/
Nota: Las Respuestas a los Ejercicios se encuentran en la pgina arriba mencionada
.
<------------------------------------------------------------------->
1 - Introduccin
SQL, Structure Query Language (Lenguaje de Consulta Estructurado) es un lenguaje
de programacion para trabajar con base de datos relacionales como MySQL, Oracle
, etc.
MySQL es un interpretador de SQL, es un servidor de base de datos.
MySQL permite crear base de datos y tablas, insertar datos, modificarlos, elimin
arlos, ordenarlos, hacer consultas y realizar muchas operaciones, etc., resumien
do: administrar bases de datos.
Ingresando instrucciones en la linea de comandos o embebidas en un lenguaje como
PHP nos comunicamos con el servidor. Cada sentencia debe acabar con punto y com
a (;).
La sensibilidad a maysculas y minsculas, es decir, si hace diferencia entre ellas,
depende del sistema operativo, Windows no es sensible, pero Linux si. Por ejemp
lo Windows interpreta igualmente las siguientes sentencias:
create database administracion;
Create DataBase administracion;
Pero Linux interpretar como un error la segunda.
Se recomienda usar siempre minsculas. Es ms el sitio mysqlya.com.ar est instalado s
obre un servidor Linux por lo que todos los ejercicios debern respetarse maysculas
y minsculas.
<------------------------------------------------------------------->
2 - Show Databases
Una base de datos es un conjunto de tablas.
Una base de datos tiene un nombre con el cual accederemos a ella.
Vamos a trabajar en una base de datos ya creada en el sitio mysqlya.com.ar, llam
ada "administracion".
Para que el servidor nos muestre las bases de datos existentes, se lo solicitamo
s enviando la instruccin:
show databases;
Nos mostrar los nombres de las bases de datos, debe aparecer en este sitio "admin
istracion".
<------------------------------------------------------------------->
3 - Creacin de una tabla y mostrar sus campos (create table - show tables - descr
ibe - drop table)
Una base de datos almacena sus datos en tablas.
Una tabla es una estructura de datos que organiza los datos en columnas y filas;
cada columna es un campo (o atributo) y cada fila, un registro. La interseccin d
e una columna con una fila, contiene un dato especfico, un solo valor.
Cada registro contiene un dato por cada columna de la tabla.
Cada campo (columna) debe tener un nombre. El nombre del campo hace referencia a
la informacin que almacenar.
Cada campo (columna) tambin debe definir el tipo de dato que almacenar.
nombre clave
MarioPerez Marito
MariaGarcia Mary
DiegoRodriguez z8080
Grficamente ac tenemos la tabla usuarios, que contiene dos campos llamados:nombre
y clave. Luego tenemos tres registros almacenados en esta tabla, el primero alma
cena en el campo nombre el valor "MarioPerez" y en el campo clave "Marito", y as
sucesivamente con los otros dos registros.
Las tablas forman parte de una base de datos.
Nosotros trabajaremos con la base de datos llamada "administracion", que ya hemo
s creado en el servidor mysqlya.com.ar.
Para ver las tablas existentes en una base de datos tipeamos:
show tables;
Deben aparecer todas las tablas que han creado los visitantes al sitio mysqlya.c
om.ar
Al crear una tabla debemos resolver qu campos (columnas) tendr y que tipo de datos
almacenarn cada uno de ellos, es decir, su estructura.
La tabla debe ser definida con un nombre que la identifique y con el cual accede
remos a ella.
Creamos una tabla llamada "usuarios", tipeamos:
create table usuarios (
nombre varchar(30),
clave varchar(10)
);
Si intentamos crear una tabla con un nombre ya existente (existe otra tabla con
ese nombre), mostrar un mensaje de error indicando que la accin no se realiz porque
ya existe una tabla con el mismo nombre.
Para ver las tablas existentes en una base de datos tipeamos nuevamente:
show tables;
Ahora aparece "usuarios" entre otras que ya pueden estar creadas.
Cuando se crea una tabla debemos indicar su nombre y definir sus campos con su t
ipo de dato. En esta tabla "usuarios" definimos 2 campos:
- nombre: que contendr una cadena de hasta 30 caracteres de longitud,
que almacenar el nombre de usuario y
- clave: otra cadena de caracteres de 10 de longitud, que guardar la clave de
cada usuario.
Cada usuario ocupar un registro de esta tabla, con su respectivo nombre y clave.
Para ver la estructura de una tabla usamos el comando "describe" junto al nombre
de la tabla:
describe usuarios;
Aparece lo siguiente:
Field Type Null
_________________________
nombre varchar(30) YES
clave varchar(10) YES
Esta es la estructura de la tabla "usuarios"; nos muestra cada campo, su tipo, l
o que ocupa en bytes y otros datos como la aceptacin de valores nulos etc, que ve
remos ms adelante en detalle.
Para eliminar una tabla usamos "drop table". Tipeamos:
drop table usuarios;
Si tipeamos nuevamente:
drop table usuarios;
Aparece un mensaje de error, indicando que no existe, ya que intentamos borrar u
na tabla inexistente.
Para evitar este mensaje podemos tipear:
drop table if exists usuarios;
En la sentencia precedente especificamos que elimine la tabla "usuarios" si exis
te.
Problema :
A) Queremos almacenar los datos de nuestros amigos.
1- Elimine la tabla "agenda" si existe:
drop table if exists agenda;
2- Cree una tabla llamada "agenda", debe tener los siguientes campos:
nombre varchar(20)
domicilio varchar(30)
y telefono varchar(11)
create table agenda(
nombre varchar(20),
domicilio varchar(30),
telefono varchar(11)
);
3- Intente crearla nuevamente. Aparece mensaje de error.
4- Visualice las tablas existentes (show tables).
5- Visualice la estructura de la tabla "agenda" (describe agenda).
6- Elimine la tabla, si existe (drop table, if exists).
7- Intente eliminar la tabla sin la clusula if exists (drop table agenda).
Debe aparecer un mensaje de error cuando no existe la tabla.
Segundo Problema :
A) Queremos almacenar informacin referente a nuestros libros.
1- Elimine la tabla "libros", si existe.
2- Cree una tabla llamada "libros".
Debe definirse con los siguientes campos:
titulo varchar(20),
autor varchar(30),
y editorial varchar(15)
3- Intente crearla nuevamente. Aparece mensaje de error.
4- Visualice las tablas existentes.
5- Visualice la estructura de la tabla "libros".
6- Elimine la tabla, si existe.
7- Intente eliminar la tabla.
<------------------------------------------------------------------->
4 - Carga de registros a una tabla y su recuperacin (insert into - select)
Un registro es una fila de la tabla que contiene los datos propiamente dichos. C
ada registro tiene un dato por cada columna.
Recordemos como crear la tabla "usuarios":
create table usuarios (
nombre varchar(30),
clave varchar(10)
);
Al ingresar los datos de cada registro debe tenerse en cuenta la cantidad y el o
rden de los campos.
Ahora vamos a agregar un registro a la tabla:
insert into usuarios (nombre, clave) values ('MarioPerez','Marito');
Usamos "insert into". Especificamos los nombres de los campos entre parntesis y s
eparados por comas y luego los valores para cada campo, tambin entre parntesis y s
eparados por comas.
La tabla usuarios ahora la podemos graficar de la siguiente forma:
nombre clave
MarioPerez Marito
Es importante ingresar los valores en el mismo orden en que se nombran los campo
s, si ingresamos los datos en otro orden, no aparece un mensaje de error y los d
atos se guardan de modo incorrecto.
Note que los datos ingresados, como corresponden a campos de cadenas de caracter
es se colocan entre comillas simples. Las comillas simples son OBLIGATORIAS.
Para ver los registros de una tabla usamos "select":
select nombre,clave from usuarios;
Aparece un registro.
El comando "select" recupera los registros de una tabla. Luego del comando selec
t indicamos los nombres de los campos a rescatar.
Problema :
Trabaje con la tabla "agenda".
1- Elimine la tabla "agenda", si existe:
drop table if exists agenda;
2- Cree una tabla llamada "agenda". Debe tener los siguientes campos:
nombre (cadena de 20), domicilio (cadena de 30) y telefono (cadena de 11):
create table agenda(
nombre varchar(20),
domicilio varchar(30),
telefono varchar(11)
);
3- Visualice las tablas existentes para verificar la creacin de "agenda".
(show tables).
4- Visualice la estructura de la tabla "agenda". (describe).
5- Ingrese los siguientes registros:
insert into agenda (nombre, domicilio, telefono) values
('Alberto Mores','Colon 123','4234567');
insert into agenda (nombre, domicilio, telefono) values
('Juan Torres','Avellaneda 135','4458787');
6- Seleccione y mustre todos los registros de la tabla:
select nombre, domicilio, telefono from agenda;
7- Elimine la tabla "agenda", si existe:
drop table if exists agenda;
8- Intente eliminar la tabla nuevamente, sin especificar "si existe":
drop table agenda;
Segundo Problema :
A) Trabaje con la tabla "libros".
1- Elimine la tabla "libros", si existe. (drop table- if exists).
2- Cree una tabla llamada "libros". Debe definirse con los siguientes campos:
titulo (cadena de 20), autor (cadena de 30) y editorial (cadena de 15).
3- Visualice las tablas existentes. (show tables).
4- Visualice la estructura de la tabla "libros". (describe).
5- Ingrese los siguientes registros:
'El aleph','Borges','Planeta';
'Martin Fierro','Jose Hernandez','Emece';
'Aprenda PHP','Mario Molina','Emece';
6- Muestre todos los registros. (select).
<------------------------------------------------------------------->
5 - Tpos de datos bsicos de un campo de una tabla.
Ya explicamos que al crear una tabla debemos resolver qu campos (columnas) tendr y
que tipo de datos almacenar cada uno de ellos, es decir, su estructura. Estos so
n algunos tipos de datos bsicos:
- varchar: se usa para almacenar cadenas de caracteres. Una cadena es una secuen
cia de caracteres. Se coloca entre comillas (simples): 'Hola'. El tipo "varchar"
define una cadena de longitud variable en la cual determinamos el mximo de carac
teres. Puede guardar hasta 255 caracteres. Para almacenar cadenas de hasta 30 ca
racteres, definimos un campo de tipo varchar(30). Si asignamos una cadena de car
acteres de mayor longitud que la definida, la cadena se corta. Por ejemplo, si d
efinimos un campo de tipo varchar(10) y le asignamos la cadena 'Buenas tardes',
se almacenar 'Buenas tar' ajustndose a la longitud de 10 caracteres.
- integer: se usa para guardar valores numricos enteros, de -2000000000 a 2000000
000 aprox. Definimos campos de este tipo cuando queremos representar, por ejempl
o, cantidades.
- float: se usa para almacenar valores numricos decimales. Se utiliza como separa
dor el punto (.). Definimos campos de este tipo para precios, por ejemplo.
Antes de crear una tabla debemos pensar en sus campos y optar por el tipo de dat
o adecuado para cada uno de ellos. Por ejemplo, si en un campo almacenaremos nmer
os enteros, el tipo "float" sera una mala eleccin; si vamos a guardar precios, el
tipo "float" es correcto, no as "integer" que no tiene decimales.
Problema :
Un videoclub que alquila pelculas en video almacena la informacin de sus pelculas e
n una tabla
llamada "peliculas"; para cada pelcula necesita los siguientes datos:
-nombre, cadena de caracteres de 20 de longitud,
-actor, cadena de caracteres de 20 de longitud,
-duracin, valor numrico entero.
-cantidad de copias: valor entero.
1- Elimine la tabla, si existe:
drop table if exists peliculas;
2- Cree la tabla eligiendo el tipo de dato adecuado para cada campo:
create table peliculas(
nombre varchar(20),
actor varchar(20),
duracion integer,
cantidad integer
);
3- Vea la estructura de la tabla:
describe peliculas;
4- Ingrese los siguientes registros:
insert into peliculas (nombre, actor, duracion, cantidad)
values ('Mision imposible','Tom Cruise',120,3);
insert into peliculas (nombre, actor, duracion, cantidad)
values ('Mision imposible 2','Tom Cruise',180,2);
insert into peliculas (nombre, actor, duracion, cantidad)
values ('Mujer bonita','Julia R.',90,3);
insert into peliculas (nombre, actor, duracion, cantidad)
values ('Elsa y Fred','China Zorrilla',90,2);
5- Muestre todos los registros:
select * from peliculas;
Segundo Problema:
Una empresa almacena los datos de sus empleados en una tabla "empleados" que gua
rda los siguientes
datos: nombre, documento, sexo, domicilio, sueldobasico.
1- Elimine la tabla, si existe:
drop table if exists empleados;
2- Cree la tabla eligiendo el tipo de dato adecuado para cada campo:
create table empleados(
nombre varchar(20),
documento varchar(8),
sexo varchar(1),
domicilio varchar(30),
sueldobasico float
);
3- Vea la estructura de la tabla:
describe empleados;
4- Ingrese algunos registros:
insert into empleados (nombre, documento, sexo, domicilio, sueldobasico)
values ('Juan Perez','22345678','m','Sarmiento 123',300);
insert into empleados (nombre, documento, sexo, domicilio, sueldobasico)
values ('Ana Acosta','24345678','f','Colon 134',500);
insert into empleados (nombre, documento, sexo, domicilio, sueldobasico)
values ('Marcos Torres','27345678','m','Urquiza 479',800);
5- Seleccione todos los registros:
select * from empleados;
<------------------------------------------------------------------->
6 - Recuperacin de algunos campos (select)
Hemos aprendido cmo ver todos los registros de una tabla:
select * from libros;
El comando "select" recupera los registros de una tabla. Con el asterisco (*) in
dicamos que seleccione todos los campos de la tabla que nombramos.
Podemos especificar el nombre de los campos que queremos ver separndolos por coma
s:
select titulo,autor,editorial from libros;
En la sentencia anterior la consulta mostrar slo los campos "titulo", "autor" y "e
ditorial". En la siguiente sentencia, veremos los campos correspondientes al ttul
o y precio de todos los libros:
select titulo,precio from libros;
Para ver solamente la editorial y la cantidad de libros tipeamos:
select editorial,cantidad from libros;
Problema :
Un videoclub que alquila pelculas en video almacena la informacin de sus pelculas e
n alquiler en una tabla llamada "peliculas".
1- Elimine la tabla, si existe:
drop table if exists peliculas;
2- Cree la tabla:
create table peliculas(
titulo varchar(20),
actor varchar(20),
duracion integer,
cantidad integer
);
3- Vea la estructura de la tabla:
describe peliculas;
4- Ingrese los siguientes registros:
insert into peliculas (titulo, actor, duracion, cantidad)
values ('Mision imposible','Tom Cruise',120,3);
insert into peliculas (titulo, actor, duracion, cantidad)
values ('Mision imposible 2','Tom Cruise',180,2);
insert into peliculas (titulo, actor, duracion, cantidad)
values ('Mujer bonita','Julia R.',90,3);
insert into peliculas (titulo, actor, duracion, cantidad)
values ('Elsa y Fred','China Zorrilla',90,2);
5- Realice un "select" mostrando solamente el ttulo y actor de todas las pelculas:

select titulo,actor from peliculas;
6- Muestre el ttulo y duracin de todas las peliculas.
7- Muestre el ttulo y la cantidad de copias.
Segundo Problema :
A- Una empresa almacena los datos de sus empleados en una tabla llamada "emplead
os".
1- Elimine la tabla, si existe:
drop table if exists empleados;
2- Cree la tabla:
create table empleados(
nombre varchar(20),
documento varchar(8),
sexo varchar(1),
domicilio varchar(30),
sueldobasico float
);
3- Vea la estructura de la tabla:
describe empleados;
4- Ingrese algunos registros:
insert into empleados (nombre, documento, sexo, domicilio, sueldobasico)
values ('Juan Perez','22345678','m','Sarmiento 123',300);
insert into empleados (nombre, documento, sexo, domicilio, sueldobasico)
values ('Ana Acosta','24345678','f','Colon 134',500);
insert into empleados (nombre, documento, sexo, domicilio, sueldobasico)
values ('Marcos Torres','27345678','m','Urquiza 479',800);
5- Muestre todos los datos de los empleados.
6- Muestre el nombre y documento de los empleados.
7- Realice un "select" mostrando el nombre, documento y sueldo bsico de todos los
empleados.
Tercer Problema :
B) Un comercio que vende artculos de computacin registra la informacin de sus
productos en la tabla llamada "articulos".
1- Elimine la tabla si existe:
drop table if exists articulos;
2- Cree la tabla "articulos" con los campos necesarios para almacenar los siguie
ntes datos:
- cdigo del artculo: entero,
- nombre del artculo: 20 caracteres de longitud,
- descripcin: 30 caracteres de longitud,
- precio: float.
3- Vea la estructura de la tabla (describe).
4- Ingrese algunos registros:
insert into articulos (codigo, nombre, descripcion, precio)
values (1,'impresora','Epson Stylus C45',400.80);
insert into articulos (codigo, nombre, descripcion, precio)
values (2,'impresora','Epson Stylus C85',500);
insert into articulos (codigo, nombre, descripcion, precio)
values (3,'monitor','Samsung 14',800);
5- Muestre todos los campos de todos los registros.
6- Muestre slo el nombre, descripcin y precio.
<------------------------------------------------------------------->
7 - Recuperacin de registros especficos (select - where)
Hemos aprendido cmo ver todos los registros de una tabla:
select nombre, clave from usuarios;
El comando "select" recupera los registros de una tabla. Detallando los nombres
de los campos separados por comas, indicamos que seleccione todos los campos de
la tabla que nombramos.
Existe una clusula, "where" que es opcional, con ella podemos especificar condici
ones para la consulta "select". Es decir, podemos recuperar algunos registros, sl
o los que cumplan con ciertas condiciones indicadas con la clusula "where". Por e
jemplo, queremos ver el usuario cuyo nombre es "MarioPerez", para ello utilizamo
s "where" y luego de ella, la condicin:
select nombre, clave from usuarios where nombre='MarioPerez';
Para las condiciones se utilizan operadores relacionales (tema que trataremos ms
adelante en detalle). El signo igual(=) es un operador relacional. Para la sigui
ente seleccin de registros especificamos una condicin que solicita los usuarios cu
ya clave es igual a 'bocajunior':
select nombre, clave from usuarios where clave='bocajunior';
Si ningn registro cumple la condicin establecida con el "where", no aparecer ningn r
egistro.
Problema :
Trabajamos con nuestra tabla "agenda".
1- Eliminamos "agenda", si existe:
drop table if exists agenda;
2- Creamos la tabla, con los siguientes campos:
nombre (cadena de 20), domicilio (cadena de 30) y telefono (cadena de 11).
3- Visualice la estructura de la tabla "agenda".(describe).
4- Ingrese los siguientes registros:
'Alberto Mores','Colon 123','4234567',
'Juan Torres','Avellaneda 135','4458787',
'Mariana Lopez','Urquiza 333','4545454',
'Fernando Lopez','Urquiza 333','4545454'.
5- Seleccione todos los registros de la tabla. (select).
6- Seleccione el registro cuyo nombre sea 'Juan Torres'.
7- Seleccione el registro cuyo domicilio sea 'Colon 123'.
8- Muestre los datos de quienes tengan el telfono '4545454'.
9- Elimine la tabla "agenda".
Segundo Problema :
A) Trabaje con la tabla "libros".
1- Elimine la tabla si existe. (drop table- if exists),
2- Cree la tabla "libros". Debe tener la siguiente estructura:
create table libros (
titulo varchar(20),
autor varchar(30),
editorial varchar(15)
);
3- Visualice la estructura de la tabla "libros".
4- Ingrese los siguientes registros:
'El aleph','Borges','Planeta';
'Martin Fierro','Jose Hernandez','Emece';
'Aprenda PHP','Mario Molina','Emece';
'Cervantes','Borges','Paidos';
5- Muestre todos los registros. (select).
6- Seleccione los registros cuyo autor sea 'Borges'.
7- Seleccione los registros cuya editorial sea 'Emece'.
8- Seleccione los libros cuyo titulo sea 'Martin Fierro'.
9- Elimine la tabla "libros".
Tercer Problema :
B) Un comercio que vende artculos de computacin registra los datos de sus artculos
en una tabla llamada "articulos".
1- Elimine la tabla si existe.
2- Cree la tabla "articulos" con la siguiente estructura:
create table articulos(
codigo integer,
nombre varchar(20),
descripcion varchar(30),
precio float
);
3- Vea la estructura de la tabla (describe).
4- Ingrese algunos registros:
insert into articulos (codigo, nombre, descripcion, precio)
values (1,'impresora','Epson Stylus C45',400.80);
insert into articulos (codigo, nombre, descripcion, precio)
values (2,'impresora','Epson Stylus C85',500);
insert into articulos (codigo, nombre, descripcion, precio)
values (3,'monitor','Samsung 14',800);
insert into articulos (codigo, nombre, descripcion, precio)
values (4,'teclado','ingles Biswal',100);
insert into articulos (codigo, nombre, descripcion, precio)
values (5,'teclado','espaol Biswal',90);
5- Seleccione todos los datos de los registros cuyo nombre sea "impresora".
6- Muestre slo el cdigo, descripcin y precio de los teclados.
<------------------------------------------------------------------->
8 - Operadores Relacionales = <> < <= > >=
Hemos aprendido a especificar condiciones de igualdad para seleccionar registros
de una tabla; por ejemplo:
select titulo,autor,editorial from libros where autor='Borges';
Utilizamos el operador relacional de igualdad.
Los operadores relacionales vinculan un campo con un valor para que MySQL compar
e cada registro (el campo especificado) con el valor dado.
Los operadores relacionales son los siguientes:
= igual
<> distinto
> mayor
< menor
>= mayor o igual
<= menor o igual
Podemos seleccionar los registros cuyo autor sea diferente de 'Borges', para ell
o usamos la condicin:
select titulo,autor,editorial from libros where autor<>'Borges';
Podemos comparar valores numricos. Por ejemplo, queremos mostrar los libros cuyos
precios sean mayores a 20 pesos:
select titulo,autor,editorial,precio from libros where precio>20;
Tambin, los libros cuyo precio sea menor o igual a 30:
select titulo,autor,editorial,precio from libros where precio<=30;
Problema :
Un comercio que vende artculos de computacin registra los datos de sus artculos
en una tabla con ese nombre.
1- Elimine "articulos", si existe:
drop table if exists articulos;
2- Cree la tabla, con la siguiente estructura:
create table articulos(
codigo integer,
nombre varchar(20),
descripcion varchar(30),
precio float,
cantidad integer
);
3- Vea la estructura de la tabla (describe).
4- Ingrese algunos registros:
insert into articulos (codigo, nombre, descripcion, precio,cantidad)
values (1,'impresora','Epson Stylus C45',400.80,20);
insert into articulos (codigo, nombre, descripcion, precio,cantidad)
values (2,'impresora','Epson Stylus C85',500,30);
insert into articulos (codigo, nombre, descripcion, precio,cantidad)
values (3,'monitor','Samsung 14',800,10);
insert into articulos (codigo, nombre, descripcion, precio,cantidad)
values (4,'teclado','ingles Biswal',100,50);
insert into articulos (codigo, nombre, descripcion, precio,cantidad)
values (5,'teclado','espaol Biswal',90,50);
5- Seleccione todos los registros de la tabla. (select).
6- Muestre los datos de las impresoras.
7- Seleccione los artculos cuyo precio sea mayor o igual a 500:
select * from articulos
where precio>=500;
8- Seleccione los artculos cuya cantidad sea menor a 30:
select nombre,descripcion, precio,cantidad
from articulos
where cantidad<20;
9- Selecciones el nombre y descripcin de los artculos que no cuesten $100:
select nombre, descripcion
from articulos
where precio<>100;
Segundo Problema :
A) Un video club que alquila pelculas en video almacena la informacin de sus pelcul
as
en alquiler en una tabla denominada "peliculas".
1- Elimine la tabla, si existe.
2- Cree la tabla eligiendo el tipo de dato adecuado para cada campo:
create table peliculas(
titulo varchar(20),
actor varchar(20),
duracion integer,
cantidad integer
);
3- Vea la estructura de la tabla:
describe peliculas;
4- Ingrese los siguientes registros:
insert into peliculas (titulo, actor, duracion, cantidad)
values ('Mision imposible','Tom Cruise',120,3);
insert into peliculas (titulo, actor, duracion, cantidad)
values ('Mision imposible 2','Tom Cruise',180,2);
insert into peliculas (titulo, actor, duracion, cantidad)
values ('Mujer bonita','Julia R.',90,3);
insert into peliculas (titulo, actor, duracion, cantidad)
values ('Elsa y Fred','China Zorrilla',90,2);
5- Seleccione las pelculas cuya duracin no supere los 90 minutos:
select *from peliculas
where duracion<=90;
6- Seleccione todas las pelculas en las que el actor no sea 'Tom Cruise':
select * from peliculas
where actor<>'Tom Cruise';
7- Seleccione todas las pelculas de las que haya ms de 2 copias:
select * from peliculas
where cantidad >2;
Tercer Problema :
B) Trabaje con la tabla "agenda" en la que registra los datos de sus amigos.
1- Elimine "agenda", si existe.
2- Cree la tabla, con los siguientes campos: apellido (cadena de 30), nombre (ca
dena de 20),
domicilio (cadena de 30) y telefono (cadena de 11).
3- Visualice la estructura de la tabla.
4- Ingrese los siguientes registros:
Mores,Alberto,Colon 123,4234567,
Torres,Juan,Avellaneda 135,4458787,
Lopez,Mariana,Urquiza 333,4545454,
Lopez,Fernando,Urquiza 333,4545454.
Suarez,Mariana,Sarmiento 643,4445544.
Lopez,Ana,Sucre 309,4252587.
5- Seleccione todos los registros de la tabla.
6- Seleccione los amigos cuyo apellido sea 'Lopez'.
7- Seleccione los registros cuyo nombre NO sea 'Mariana'.
8- Seleccione los registros cuyo domicilio sea 'Colon 123'.
9- Muestre los datos de quienes tengan el telfono '4545454'.
<------------------------------------------------------------------->
9 - Borrado de registros de una tabla (delete)
Para eliminar los registros de una tabla usamos el comando "delete":
delete from usuarios;
La ejecucin del comando indicado en la lnea anterior borra TODOS los registros de
la tabla.
Si queremos eliminar uno o varios registros debemos indicar cul o cules, para ello
utilizamos el comando "delete" junto con la clausula "where" con la cual establ
ecemos la condicin que deben cumplir los registros a borrar. Por ejemplo, queremo
s eliminar aquel registro cuyo nombre de usuario es 'Leonardo':
delete from usuarios where nombre='Leonardo';
Si solicitamos el borrado de un registro que no existe, es decir, ningn registro
cumple con la condicin especificada, no se borrarn registros, pues no encontr regis
tros con ese dato.
Problema :
Trabaje con la tabla "agenda" que registra la informacin referente a sus amigos.
1- Elimine la tabla (drop table) si existe (if exists).
2- Cree la tabla con los siguientes campos: apellido (cadena de 30), nombre (cad
ena de 20),
domicilio (cadena de 30) y telefono (cadena de 11):
create table agenda(
apellido varchar(30),
nombre varchar(20),
domicilio varchar(30),
telefono varchar(11)
);
3- Visualice la estructura de la tabla "agenda" (describe).
4- Ingrese los siguientes registros (insert into):
Mores,Alberto,Colon 123,4234567,
Torres,Juan,Avellaneda 135,4458787,
Lopez,Mariana,Urquiza 333,4545454,
Lopez,Jose,Urquiza 333,4545454,
Peralta,Susana,Gral. Paz 1234,4123456.
5- Elimine el registro cuyo nombre sea 'Juan'(delete - where).
6- Elimine los registros cuyo nmero telefnico sea igual a '4545454'.
Segundo Problema :
A) Trabaje con la tabla "libros" en la cual almacena la informacin de sus libros
una librera.
1- Elimine la tabla.
2- Crela con los siguientes campos: titulo (cadena de 20 caracteres de longitud),

autor (cadena de 30), editorial (cadena de 15) y precio (float).
3- Visualice la estructura de la tabla "libros".
4- Ingrese los siguientes registros:
El aleph,Borges,Planeta,15.00;
Martin Fierro,Jose Hernandez,Emece,25.50;
Aprenda PHP,Mario Molina,Emece,26.80;
Cervantes y el quijote,Borges,Paidos,45.50;
Matematica estas ahi, Paenza, Paidos,50.00;
5- Muestre todos los registros.
6- Elimine los registros cuyo autor sea igual a 'Paenza'. (1 registro eliminado)
7- Nuevamente, elimine los registros cuyo autor sea igual a 'Paenza'. (ningn regi
stro afectado)
8- Borre los registros cuyo precio sea menor a 20.(<20).
9- Borre los registros que cuyo precio sea mayor o igual a 40 pesos. (>=).
10- Elimine todos los registros de la tabla.
Tercer Problema :
B) Un comercio que vende artculos de computacin registra los datos de sus artculos
en una tabla con ese nombre.
1- Elimine "articulos", si existe.
2- Cree la tabla, con la siguiente estructura:
create table articulos(
codigo integer,
nombre varchar(20),
descripcion varchar(30),
precio float,
cantidad integer
);
3- Vea la estructura de la tabla (describe).
4- Ingrese algunos registros:
insert into articulos (codigo, nombre, descripcion, precio,cantidad)
values (1,'impresora','Epson Stylus C45',400.80,20);
insert into articulos (codigo, nombre, descripcion, precio,cantidad)
values (2,'impresora','Epson Stylus C85',500,30);
insert into articulos (codigo, nombre, descripcion, precio,cantidad)
values (3,'monitor','Samsung 14',800,10);
insert into articulos (codigo, nombre, descripcion, precio,cantidad)
values (4,'teclado','ingles Biswal',100,50);
insert into articulos (codigo, nombre, descripcion, precio,cantidad)
values (5,'teclado','espaol Biswal',90,50);
5- Seleccione todos los registros de la tabla.
6- Elimine los artculos cuyo precio sea mayor o igual a 500.
7- Elimine todas las impresoras.
8- Elimine todos los artculos cuyo cdigo sea diferente a 4.
<------------------------------------------------------------------->
10 - Modificacin de registros de una tabla (update)
Para modificar uno o varios datos de uno o varios registros utilizamos "update"
(actualizar).
Por ejemplo, en nuestra tabla "usuarios", queremos cambiar los valores de todas
las claves, por "RealMadrid":
update usuarios set clave='RealMadrid';
Utilizamos "update" junto al nombre de la tabla y "set" junto con el campo a mod
ificar y su nuevo valor.
El cambio afectar a todos los registros.
Podemos modificar algunos registros, para ello debemos establecer condiciones de
seleccin con "where".
Por ejemplo, queremos cambiar el valor correspondiente a la clave de nuestro usu
ario llamado 'MarioPerez', queremos como nueva clave 'Boca', necesitamos una con
dicin "where" que afecte solamente a este registro:
update usuarios set clave='Boca'
where nombre='MarioPerez';
Si no encuentra registros que cumplan con la condicin del "where", ningn registro
es afectado.
Las condiciones no son obligatorias, pero si omitimos la clusula "where", la actu
alizacin afectar a todos los registros.
Tambin se puede actualizar varios campos en una sola instruccin:
update usuarios set nombre='MarceloDuarte', clave='Marce'
where nombre='Marcelo';
Para ello colocamos "update", el nombre de la tabla, "set" junto al nombre del c
ampo y el nuevo valor y separado por coma, el otro nombre del campo con su nuevo
valor.
Problema :
Trabaje con la tabla "agenda" que almacena los datos de sus amigos.
1- Elimine la tabla si existe.
2- Cree la tabla:
create table agenda(
apellido varchar(30),
nombre varchar(20),
domicilio varchar(30),
telefono varchar(11)
);
3- Visualice la estructura de la tabla "agenda" (describe).
4- Ingrese los siguientes registros (insert into):
Mores,Alberto,Colon 123,4234567,
Torres,Juan,Avellaneda 135,4458787,
Lopez,Mariana,Urquiza 333,4545454,
Lopez,Jose,Urquiza 333,4545454,
Peralta,Susana,Gral. Paz 1234,4123456.
5- Modifique el registro cuyo nombre sea "Juan" por "Juan Jose"(update- where):
update agenda set nombre='Juan Jose'
where nombre='Juan';
6- Actualice los registros cuyo nmero telefnico sea igual a '4545454' por '4445566
':
update agenda set telefono='4445566'
where telefono='4545454';
7- Actualice los registros que tengan en el campo "nombre" el valor "Juan" por "
Juan Jose"
(ningn registro afectado porque ninguno cumple con la condicin del "where"):
update agenda set nombre='Juan Jose'
where nombre='Juan';
Segundo problema:
A) Trabaje con la tabla "libros" de una librera.
1- Elimine la tabla.
2- Crela con los siguientes campos: titulo (cadena de 20 caracteres de longitud),

autor (cadena de 30), editorial (cadena de 15) y precio (float).
3- Visualice la estructura de la tabla "libros".
4- Ingrese los siguientes registros:
El aleph,Borges,Planeta,15.00;
Martin Fierro,Jose Hernandez,Emece,25.50;
Aprenda PHP,Mario Molina,Emece,25.00;
Cervantes y el quijote,Borges,Paidos,25;
Matematica estas ahi, Paenza, Paidos,40.80;
5- Muestre todos los registros.
6- Modifique los registros cuyo autor sea igual a "Paenza", por "Adrian Paenza"
.
(1 registro afectado)
7- Nuevamente, modifique los registros cuyo autor sea igual a "Paenza",
por "Adrian Paenza". (ningn registro afectado).
8- Actualice el precio del libro de "Mario Molina" a 27 pesos:
9- Actualice el valor del campo "editorial" por "Emece S.A.", para todos los reg
istros
cuya editorial sea igual a "Emece".
Tercer Problema:
B) Un comercio que vende artculos de computacin registra los datos de sus artculos
en una tabla con ese nombre.
1- Elimine "articulos", si existe.
2- Cree la tabla, con la siguiente estructura:
create table articulos(
codigo integer,
nombre varchar(20),
descripcion varchar(30),
precio float,
cantidad integer
);
3- Vea la estructura de la tabla (describe).
4- Ingrese algunos registros:
insert into articulos (codigo, nombre, descripcion, precio,cantidad)
values (1,'impresora','Epson Stylus C45',400.80,20);
insert into articulos (codigo, nombre, descripcion, precio,cantidad)
values (2,'impresora','Epson Stylus C85',500,30);
insert into articulos (codigo, nombre, descripcion, precio,cantidad)
values (3,'monitor','Samsung 14',800,10);
insert into articulos (codigo, nombre, descripcion, precio,cantidad)
values (4,'teclado','ingles Biswal',100,50);
insert into articulos (codigo, nombre, descripcion, precio,cantidad)
values (5,'teclado','espaol Biswal',90,50);
5- Actualice el precio a "400" del artculo cuya descripcin sea "Epson Stylus C45":
update articulos set precio=400
where descripcion='Epson Stylus C45';
6- Actualice la cantidad a 100 de todas los teclados:
update articulos set cantidad=100
where nombre='teclado';
7- Actualice la cantidad a 50 y el precio a 550 del artculo con cdigo 2:
update articulos set cantidad=50, precio=550
where codigo=2;
8- Actualice la cantidad a 100 de todos los registros con cantidad=1000
(no hay registros que cumplan la condicin, ningn registro afectado):
update articulos set cantidad=100
where cantidad=1000;
<------------------------------------------------------------------->
11 - Clave primaria.
Una clave primaria es un campo (o varios) que identifica 1 solo registro (fila)
en una tabla.
Para un valor del campo clave existe solamente 1 registro. Los valores no se rep
iten ni pueden ser nulos.
Veamos un ejemplo, si tenemos una tabla con datos de personas, el nmero de docume
nto puede establecerse como clave primaria, es un valor que no se repite; puede
haber personas con igual apellido y nombre, incluso el mismo domicilio (padre e
hijo por ejemplo), pero su documento ser siempre distinto.
Si tenemos la tabla "usuarios", el nombre de cada usuario puede establecerse com
o clave primaria, es un valor que no se repite; puede haber usuarios con igual c
lave, pero su nombre de usuario ser siempre distinto.
Establecemos que un campo sea clave primaria al momento de creacin de la tabla:
create table usuarios (
nombre varchar(20),
clave varchar(10),
primary key(nombre)
);
Para definir un campo como clave primaria agregamos "primary key" luego de la de
finicin de todos los campos y entre parntesis colocamos el nombre del campo que qu
eremos como clave.
Si visualizamos la estructura de la tabla con "describe" vemos que el campo "nom
bre" es clave primaria y no acepta valores nulos(ms adelante explicaremos esto de
talladamente).
Ingresamos algunos registros:
insert into usuarios (nombre, clave)
values ('Leonardo','payaso');
insert into usuarios (nombre, clave)
values ('MarioPerez','Marito');
insert into usuarios (nombre, clave)
values ('Marcelo','River');
insert into usuarios (nombre, clave)
values ('Gustavo','River');
Si intentamos ingresar un valor para el campo clave que ya existe, aparece un me
nsaje de error indicando que el registro no se carg pues el dato clave existe. Es
to sucede porque los campos definidos como clave primaria no pueden repetirse.
Ingresamos un registro con un nombre de usuario repetido, por ejemplo:
insert into usuarios (nombre, clave)
values ('Gustavo','Boca');
Una tabla slo puede tener una clave primaria. Cualquier campo (de cualquier tipo)
puede ser clave primaria, debe cumplir como requisito, que sus valores no se re
pitan.
Al establecer una clave primaria estamos indexando la tabla, es decir, creando u
n ndice para dicha tabla; a este tema lo veremos ms adelante.
Problema :
Trabaje con la tabla "libros" de una librera.
1- Elimine la tabla si existe.
2- Crela con los siguientes campos y clave: codigo (integer),
titulo (cadena de 20 caracteres de longitud), autor (cadena de 30),
editorial (cadena de 15), codigo ser clave primaria:
create table libros(
codigo integer,
titulo varchar(20),
autor varchar(30),
editorial varchar(15),
primary key(codigo)
);
3- Visualice la estructura de la tabla "libros", compruebe la clave primaria.
4- Ingrese los siguientes registros:
1,El aleph,Borges,Planeta;
2,Martin Fierro,Jose Hernandez,Emece;
3,Aprenda PHP,Mario Molina,Emece;
4,Cervantes y el quijote,Borges,Paidos;
5,Matematica estas ahi, Paenza, Paidos;
5- Seleccione todos los registros.
6- Ingrese un registro con cdigo no repetido y nombre de autor repetido.
7- Ingrese un registro con cdigo no repetido y ttulo y editorial repetidos.
8- Intente ingresar un registro que repita el campo clave (aparece mensaje de er
ror
por clave repetida).
Segundo problema:
A) Una empresa almacena los datos de sus clientes en una tabla llamada "clientes
".
1- Elimine la tabla "clientes" si existe:
drop table if exists clientes;
2- Crela con los siguientes campos y clave:
create table clientes(
documento varchar(8),
apellido varchar(20),
nombre varchar(20),
domicilio varchar(30),
telefono varchar (11),
primary key(documento)
);
3- Visualice la estructura de la tabla para compruebar la clave primaria estable
cida.
4- Ingrese los siguientes registros:
insert into clientes (documento,apellido,nombre,domicilio, telefono)
values('22345678','Perez','Marcos','Colon 123','4545454');
insert into clientes (documento,apellido,nombre,domicilio, telefono)
values('23222222','Garcia','Ana','Avellaneda 1345','4252652');
insert into clientes (documento,apellido,nombre,domicilio, telefono)
values('20454545','Lopez','Susana','Urquiza 344','4522525');
insert into clientes (documento,apellido,nombre,domicilio, telefono)
values('35454545','Lopez','Susana','Urquiza 344','4522525');
Note que hay 2 registros con todos los datos iguales excepto el documento.
6- Ingrese un cliente con cdigo no repetido y apellido y nombre repetido.
7- Ingrese un cliente con cdigo no repetido y domicilio repetido.
8- Intente ingresar un registro con documento repetido (aparece mensaje de error
por clave repetida).
Tercer Problema:
B) Un instituto de enseanza almacena los datos de sus estudiantes
en una tabla llamada "alumnos".
1- Elimine la tabla "alumnos" si existe.
2- Cree la tabla con la siguiente estructura:
create table alumnos(
legajo varchar(4) not null,
documento varchar(8) not null,
apellido varchar(30),
nombre varchar(30),
domicilio varchar(30),
primary key (legajo)
);
3- Ingrese los siguientes registros:
insert into alumnos (legajo,documento,apellido,nombre,domicilio)
values('A233','22345345','Perez','Mariana','Colon 234');
insert into alumnos (legajo,documento,apellido,nombre,domicilio)
values('A567','23545345','Morales','Marcos','Avellaneda 348');
insert into alumnos (legajo,documento,apellido,nombre,domicilio)
values('B654','24356345','Gonzalez','Analia','Caseros 444');
insert into alumnos (legajo,documento,apellido,nombre,domicilio)
values('A642','20254125','Torres','Ramiro','Dinamarca 209');
insert into alumnos (legajo,documento,apellido,nombre,domicilio)
values('B509','20445778','Miranda','Carmen','Uspallata 999');
insert into alumnos (legajo,documento,apellido,nombre,domicilio)
values('C777','28111444','Figueroa','Natalia','Sarmiento 856');
4- Seleccione todos los registros.
5- Ingrese 2 alumnos con igual nombre y apellido pero distinto legajo.
6- Intente ingresar un registro que repita el campo clave ("legajo").
Aparece mensaje de error por clave repetida).
<------------------------------------------------------------------->
12- Campo entero con autoincremento.
Un campo de tipo entero puede tener otro atributo extra 'auto_increment'. Los va
lores de un campo 'auto_increment', se inician en 1 y se incrementan en 1 automti
camente.
Se utiliza generalmente en campos correspondientes a cdigos de identificacin para
generar valores nicos para cada nuevo registro que se inserta.
Slo puede haber un campo "auto_increment" y debe ser clave primaria (o estar inde
xado).
Para establecer que un campo autoincremente sus valores automticamente, ste debe s
er entero (integer) y debe ser clave primaria:
create table libros(
codigo int auto_increment,
titulo varchar(20),
autor varchar(30),
editorial varchar(15),
primary key (codigo)
);
Para definir un campo autoincrementable colocamos "auto_increment" luego de la d
efinicin del campo al crear la tabla.
Hasta ahora, al ingresar registros, colocamos el nombre de todos los campos ante
s de los valores; es posible ingresar valores para algunos de los campos de la t
abla, pero recuerde que al ingresar los valores debemos tener en cuenta los camp
os que detallamos y el orden en que lo hacemos.
Cuando un campo tiene el atributo "auto_increment" no es necesario ingresar valo
r para l, porque se inserta automticamente tomando el ltimo valor como referencia,
o 1 si es el primero.
Para ingresar registros omitimos el campo definido como "auto_increment", por ej
emplo:
insert into libros (titulo,autor,editorial)
values('El aleph','Borges','Planeta');
Este primer registro ingresado guardar el valor 1 en el campo correspondiente al
cdigo.
Si continuamos ingresando registros, el cdigo (dato que no ingresamos) se cargar a
utomticamente siguiendo la secuencia de autoincremento.
Un campo "auto_increment" funciona correctamente slo cuando contiene nicamente val
ores positivos. Ms adelante explicaremos cmo definir un campo con slo valores posit
ivos.
Est permitido ingresar el valor correspondiente al campo "auto_increment", por ej
emplo:
insert into libros (codigo,titulo,autor,editorial)
values(6,'Martin Fierro','Jose Hernandez','Paidos');
Pero debemos tener cuidado con la insercin de un dato en campos "auto_increment".
Debemos tener en cuenta que:
- si el valor est repetido aparecer un mensaje de error y el registro no se
ingresar.
- si el valor dado saltea la secuencia, lo toma igualmente y en las siguientes
inserciones, continuar la secuencia tomando el valor ms alto.
- si el valor ingresado es 0, no lo toma y guarda el registro continuando la
secuencia.
- si el valor ingresado es negativo (y el campo no est definido para aceptar slo
valores positivos), lo ingresa.
Para que este atributo funcione correctamente, el campo debe contener solamente
valores positivos; ms adelante trataremos este tema.
Problema :
Una farmacia guarda informacin referente a sus medicamentos en una tabla
llamada "medicamentos".
1- Elimine la tabla,si existe:
drop table if exists medicamentos;
2- Cree la tabla con la siguiente estructura:
create table medicamentos(
codigo integer auto_increment,
nombre varchar(20),
laboratorio varchar(20),
precio float,
cantidad integer,
primary key (codigo)
);
3- Visualice la estructura de la tabla "medicamentos" (describe).
4- Ingrese los siguientes registros (insert into):
insert into medicamentos (nombre, laboratorio,precio,cantidad)
values('Sertal','Roche',5.2,100);
insert into medicamentos (nombre, laboratorio,precio,cantidad)
values('Buscapina','Roche',4.10,200);
insert into medicamentos (nombre, laboratorio,precio,cantidad)
values('Amoxidal 500','Bayer',15.60,100);
5- Verifique que el campo "cdigo" gener los valores de modo automtico:
select codigo,nombre,laboratorio,precio,cantidad
from medicamentos;
6- Intente ingresar un registro con un valor de clave primaria repetido.
7- Ingrese un registro con un valor de clave primaria no repetido salteando la s
ecuencia:
insert into medicamentos (codigo,nombre, laboratorio,precio,cantidad)
values(12,'Paracetamol 500','Bago',1.90,200);
8- Ingrese el siguiente registro:
insert into medicamentos (nombre, laboratorio,precio,cantidad)
values('Bayaspirina','Bayer',2.10,150);
Note que sigue la secuencia.

Segundo problema:
Un videoclub almacena informacin sobre sus pelculas en una tabla llamada "pelicula
s".
1- Elimine la tabla si existe.
2- Crela con la siguiente estructura:
-codigo (entero), autoincremento,
-titulo (cadena de 30),
-actor (cadena de 20),
-duracion (entero),
-clave primaria: codigo.
3- Visualice la estructura de la tabla "peliculas".
4- Ingrese los siguientes registros:
insert into peliculas (titulo,actor,duracion)
values('Mision imposible','Tom Cruise',120);
insert into peliculas (titulo,actor,duracion)
values('Harry Potter y la piedra filosofal','xxx',180);
insert into peliculas (titulo,actor,duracion)
values('Harry Potter y la camara secreta','xxx',190);
insert into peliculas (titulo,actor,duracion)
values('Mision imposible 2','Tom Cruise',120);
insert into peliculas (titulo,actor,duracion)
values('La vida es bella','zzz',220);
5- Seleccione todos los registros y verifique la carga automtica de los cdigos.
6- Actualice las pelculas cuyo cdigo es 3 colocando en "actor" 'Daniel R.'
7- Elimine la pelcula 'La vida es bella'.
8- Elimine todas las pelculas cuya duracin sea igual a 120 minutos.
9- Visualice los registros.
10- Ingrese el siguiente registro, sin valor para la clave primaria:
insert into peliculas (titulo,actor,duracion)
values('Mujer bonita','Richard Gere',120);
Note que sigue la secuencia tomando el ltimo valor generado, aunque ya no est.
11- Ingrese el siguiente registro, con valor para la clave primaria:
insert into peliculas (codigo,titulo,actor,duracion)
values(1,'Tootsie','D. Hoffman',90);
Lo acepta porque la clave no est repetida.
12- Intente ingresar un registro con valor de clave repetida.
13- Ingrese el siguiente registro, sin valor para la clave primaria:
insert into peliculas (titulo,actor,duracion)
values('Un oso rojo','Julio Chavez',100);
Note que sigue la secuencia.
<------------------------------------------------------------------->
13 - Comando truncate table.
Aprendimos que para borrar todos los registro de una tabla se usa "delete" sin c
ondicin "where".
Tambin podemos eliminar todos los registros de una tabla con "truncate table". Po
r ejemplo, queremos vaciar la tabla "libros", usamos:
truncate table libros;
La sentencia "truncate table" vaca la tabla (elimina todos los registros) y vuelv
e a crear la tabla con la misma estructura.
La diferencia con "drop table" es que esta sentencia borra la tabla, "truncate t
able" la vaca.
La diferencia con "delete" es la velocidad, es ms rpido "truncate table" que "dele
te" (se nota cuando la cantidad de registros es muy grande) ya que ste borra los
registros uno a uno.
Otra diferencia es la siguiente: cuando la tabla tiene un campo "auto_increment"
, si borramos todos los registros con "delete" y luego ingresamos un registro, a
l cargarse el valor en el campo autoincrementable, contina con la secuencia tenie
ndo en cuenta el valor mayor que se haba guardado; si usamos "truncate table" par
a borrar todos los registros, al ingresar otra vez un registro, la secuencia del
campo autoincrementable vuelve a iniciarse en 1.
Por ejemplo, tenemos la tabla "libros" con el campo "codigo" definido "auto_incr
ement", y el valor ms alto de ese campo es "5", si borramos todos los registros c
on "delete" y luego ingresamos un registro sin valor de cdigo, se guardar el valor
"6"; si en cambio, vaciamos la tabla con "truncate table", al ingresar un nuevo
registro sin valor para el cdigo, iniciar la secuencia en 1 nuevamente.
Problema :
Una farmacia guarda informacin referente a sus medicamentos en una tabla llamada
"medicamentos".
1- Elimine la tabla, si existe:
drop table if exists medicamentos;
2- Cree la tabla con la siguiente estructura:
create table medicamentos(
codigo integer auto_increment,
nombre varchar(20),
laboratorio varchar(20),
precio float,
cantidad integer,
primary key (codigo)
);
3- Ingrese los siguientes registros:
insert into medicamentos (nombre, laboratorio,precio,cantidad)
values('Sertal','Roche',5.2,100);
insert into medicamentos (nombre, laboratorio,precio,cantidad)
values('Buscapina','Roche',4.10,200);
insert into medicamentos (nombre, laboratorio,precio,cantidad)
values('Amoxidal 500','Bayer',15.60,100);
4- Elimine todos los registros con "delete":
delete from medicamentos;
5- Ingrese 2 registros:
insert into medicamentos (nombre, laboratorio,precio,cantidad)
values('Sertal','Roche',5.2,100);
insert into medicamentos (nombre, laboratorio,precio,cantidad)
values('Amoxidal 500','Bayer',15.60,100);
6- Vea los registros para verificar que continu la secuencia al generar el valor
para "codigo":
select * from medicamentos;
7- Vace la tabla:
truncate table medicamentos;
8- Ingrese el siguiente registro:
insert into medicamentos (nombre, laboratorio,precio,cantidad)
values('Buscapina','Roche',4.10,200);
9- Vea los registros para verificar que al cargar el cdigo reinici la secuencia en
1.

Segundo problema:
Un videoclub almacena informacin sobre sus pelculas en una tabla llamada "pelicula
s".
1- Elimine la tabla si existe.
2- Crela con la siguiente estructura:
-codigo (entero), autoincremento,
-titulo (cadena de 30),
-actor (cadena de 20),
-duracion (entero),
-clave primaria: codigo.
3- Ingrese los siguientes registros:
insert into peliculas (titulo,actor,duracion)
values('Mision imposible','Tom Cruise',120);
insert into peliculas (titulo,actor,duracion)
values('Harry Potter y la piedra filosofal','xxx',180);
insert into peliculas (titulo,actor,duracion)
values('Harry Potter y la camara secreta','xxx',190);
insert into peliculas (titulo,actor,duracion)
values('Mision imposible 2','Tom Cruise',120);
insert into peliculas (titulo,actor,duracion)
values('La vida es bella','zzz',220);
4- Seleccione todos los registros y verifique la carga automtica de los cdigos.
5- Elimine todos los registros:
delete from peliculas;
6- Ingrese el siguiente registro, sin valor para la clave primaria:
insert into peliculas (titulo,actor,duracion)
values('Mujer bonita','Richard Gere',120);
7- Vea los registros para verificar que al generar el valor para "codigo" contin
u la secuencia:
select *from peliculas;
8- Elimine todos los registros vaciando la tabla:
truncate table peliculas;
9- Ingrese el siguiente registro:
insert into peliculas (titulo,actor,duracion)
values('Elsa y Fred','China Zorrilla',90);
10- Muestre el registro ingresado para verificar que inici la secuencia nuevament
e para el
campo "codigo":
select * from peliculas;
<------------------------------------------------------------------->
14 - Valores null.

Analizaremos la estructura de una tabla que vemos al utilizar el comando "descri
be". Tomamos como ejemplo la tabla "libros":
Field Type Null Key Default Extra
______________________________________________________________________
codigo int(11) 7 b.. NO PRI auto_increment
titulo varchar(20) 11 b.. YES (NULL)
autor varchar(30) 11 b.. YES (NULL)
editorial varchar(15) 11 b.. YES (NULL)
precio float 5 b.. YES (NULL)
La primera columna indica el tipo de dato de cada campo.
La segunda columna "Null" especifica si el campo permite valores nulos; vemos qu
e en el campo "codigo", aparece "NO" y en las dems "YES", esto significa que el p
rimer campo no acepta valores nulos (porque es clave primaria) y los otros si lo
s permiten.
La tercera columna "Key", muestra los campos que son clave primaria; en el campo
"codigo" aparece "PRI" (es clave primaria) y los otros estn vacos, porque no son
clave primaria.
La cuarta columna "Default", muestra los valores por defecto, esto es, los valor
es que MySQL ingresa cuando omitimos un dato o colocamos un valor invlido; para t
odos los campos, excepto para el que es clave primaria, el valor por defecto es
"null".
La quinta columna "Extra", muestra algunos atributos extra de los campos; el cam
po "codigo" es "auto_increment".
Vamos a explicar los valores nulos.
"null' significa "dato desconocido" o "valor inexistente". No es lo mismo que un
valor 0, una cadena vaca o una cadena literal "null".
A veces, puede desconocerse o no existir el dato correspondiente a algn campo de
un registro. En estos casos decimos que el campo puede contener valores nulos. P
or ejemplo, en nuestra tabla de libros, podemos tener valores nulos en el campo
"precio" porque es posible que para algunos libros no le hayamos establecido el
precio para la venta.
En contraposicin, tenemos campos que no pueden estar vacos jams, por ejemplo, los c
ampos que identifican cada registro, como los cdigos de identificacin, que son cla
ve primaria.
Por defecto, es decir, si no lo aclaramos en la creacin de la tabla, los campos p
ermiten valores nulos.
Imaginemos que ingresamos los datos de un libro, para el cual an no hemos definid
o el precio:
insert into libros (titulo,autor,editorial,precio)
values ('El aleph','Borges','Planeta',null);
Note que el valor "null" no es una cadena de caracteres, no se coloca entre comi
llas.
Si un campo acepta valores nulos, podemos ingresar "null" cuando no conocemos el
valor.
Los campos establecidos como clave primaria no aceptan valores nulos. Nuestro ca
mpo clave primaria, est definido "auto_increment"; si intentamos ingresar el valo
r "null" para este campo, no lo tomar y seguir la secuencia de incremento.
El campo "titulo", no debera aceptar valores nulos, para establecer este atributo
debemos crear la tabla con la siguiente sentencia:
create table libros(
codigo int auto_increment,
titulo varchar(20) not null
autor varchar(30),
editorial varchar(15),
precio float,
primary key (codigo)
);
Entonces, para que un campo no permita valores nulos debemos especificarlo luego
de definir el campo, agregando "not null". Por defecto, los campos permiten val
ores nulos, pero podemos especificarlo igualmente agregando "null".
Explicamos que "null" no es lo mismo que una cadena vaca o un valor 0 (cero).
Para recuperar los registros que contengan el valor "null" en el campo "precio"
no podemos utilizar los operadores relacionales vistos anteriormente: = (igual)
y <> (distinto); debemos utilizar los operadores "is null" (es igual a null) y "
is not null" (no es null):
select * from libros
where precio is null;
La sentencia anterior tendr una salida diferente a la siguiente:
select * from libros
where precio=0;
Con la primera sentencia veremos los libros cuyo precio es igual a "null" (desco
nocido); con la segunda, los libros cuyo precio es 0.
Igualmente para campos de tipo cadena, las siguientes sentencias "select" no ret
ornan los mismos registros:
select * from libros where editorial is null;
select * from libros where editorial='';
Con la primera sentencia veremos los libros cuya editorial es igual a "null", co
n la segunda, los libros cuya editorial guarda una cadena vaca.
Problema :
Retome la tabla llamada "medicamentos" que almacena la informacin de los producto
s
que se venden en una farmacia.
1- Elimine la tabla, si existe.
2- Cree la tabla con la siguiente estructura:
create table medicamentos(
codigo integer auto_increment,
nombre varchar(20) not null,
laboratorio varchar(20),
precio float,
cantidad integer not null,
primary key (codigo)
);
3- Visualice la estructura de la tabla "medicamentos".
4- Ingrese los siguientes registros:
insert into medicamentos (nombre,laboratorio,precio,cantidad)
values('Sertal gotas','Roche',5.2,100);
insert into medicamentos (nombre,laboratorio,precio,cantidad)
values('Sertal compuesto','Roche',7.1,150);
insert into medicamentos (nombre,laboratorio,precio,cantidad)
values('Buscapina','Roche',null,200);
insert into medicamentos (nombre,laboratorio,precio,cantidad)
values('Amoxidal 500','Bayer',15.60,0);
insert into medicamentos (nombre,laboratorio,precio,cantidad)
values('Amoxidal jarabe','Bayer',25,120);
insert into medicamentos (nombre,laboratorio,precio,cantidad)
values('Amoxinil',null,25,120);
insert into medicamentos (nombre, laboratorio,precio,cantidad)
values('Bayaspirina','',0,150);
5- Verifique que el campo "codigo" gener los valores de modo automtico (select).
6- Recupere los registros que contengan valor "null" en el campo "laboratorio",
luego los que tengan una cadena vaca en el mismo campo. Note que el resultado
es diferente:
select * from medicamentos where laboratorio is null;
select * from medicamentos where laboratorio='';
7- Recupere los registros que contengan valor "null" en el campo "precio",
luego los que tengan el valor 0 en el mismo campo. Note que el resultado es d
iferente:
select * from medicamentos where precio is null;
select * from medicamentos where precio=0;
8- Intente ingresar el siguiente registro con valor "null" para el campo "nombre
":
insert into medicamentos (nombre, laboratorio,precio,cantidad)
values(null,'Bayer',10.20,100);
Aparece un mensaje de error.
8- Intente ingresar el siguiente registro con valor "null" para el campo "cantid
ad":
insert into medicamentos (nombre, laboratorio,precio,cantidad)
values('Benadryl comprimidos','Bayer',10.20,null);
Aparece un mensaje de error.
9- Ingrese el siguiente registro con valor "null" para el campo correspondiente
al cdigo:
insert into medicamentos (codigo,nombre, laboratorio,precio,cantidad)
values(null,'Benadryl comprimidos','Bayer',10.20,null);
No muestra un mensaje de error. Si recuperamos todos los registros, ver que almac
en
el siguiente valor de la secuencia de autoincremento.
10- Recupere los registros cuyo precio sea distinto de 0, luego los que
sean distintos de "null":
select * from medicamentos where precio<>0;
select * from medicamentos where precio is not null;
Note que la salida de la primera sentencia no muestra los registros con valor 0
y tampoco
los que tienen valor nulo; el resultado de la segunda sentencia muestra los regi
stros con
valor para el campo precio (incluso el valor 0). Esto es porque los valores "nul
l" no
pueden compararse con operadores relacionales.
11- Recupere los registros en los cuales el laboratorio no contenga una cadena v
aca,
luego los que sean distintos de "null":
select * from medicamentos where laboratorio<>'';
select * from medicamentos where laboratorio is not null;
Note que la primera sentencia solicita los registros que no tengan cadena vaca, e
s decir,
los que guardan una cadena, como "null" no es una cadena, no retorna los registr
os con valor nulo.
El resultado de la segunda sentencia solicita que no muestre los valores nulos,
es decir,
que muestre cualquier cadena, incluso vaca.

Segundo problema:
Trabaje con la tabla que almacena los datos sobre pelculas, llamada "peliculas".
1- Elimine la tabla.
2- Crela con la siguiente estructura:
-codigo (entero, autoincremento),
-titulo (cadena de 30, not null),
-actor (cadena de 20),
-duracion (entero),
-clave primaria (codigo).
3- Visualice la estructura de la tabla.
4- Ingrese los siguientes registros:
insert into peliculas (titulo,actor,duracion)
values('Mision imposible','Tom Cruise',120);
insert into peliculas (titulo,actor,duracion)
values('Harry Potter y la piedra filosofal','Daniel R.',180);
insert into peliculas (titulo,actor,duracion)
values('Harry Potter y la camara secreta','Daniel R.',190);
insert into peliculas (titulo,actor,duracion)
values('Mision imposible 2','Tom Cruise',150);
insert into peliculas (titulo,actor,duracion)
values('Titanic','L. Di Caprio',220);
insert into peliculas (titulo,actor,duracion)
values('Mujer bonita','R. Gere-J. Roberts',200);
5- Recupere todos los registros para verificar la carga automtica de los cdigos.
6- Ingrese un registro con valor nulo para el campo clave primaria:
insert into peliculas (codigo,titulo,actor,duracion)
values(null,'Elsa y Fred','China Zorrilla',90);
Verifique que acepta el registro pero pasa por alto el dato ingresado para el cdi
go colocando en
su lugar el valor siguiente de la secuencia.
7- Intente ingresar un registro con valor nulo para el campo "titulo". Verifique
que no realiza la accin.
8- Ingrese un registro con valor nulo para los campos "actor" y "duracion":
insert into peliculas (titulo,actor,duracion)
values('Mr. Johns',null,null);
Verifique que el registro ha sido ingresado.
9- Ingrese un registro con cadenas vacas para los campos varchar y valor 0 para l
os campos numricos:
insert into peliculas (codigo,titulo,actor,duracion)
values(0,'','',0);
Visualice el registro para ver cmo almacen MySQL el registro ingresado anteriormen
te.
10- Coloque 120 en la duracin de la pelcula cuyo valor de duracin sea nulo (1 regis
tro actualizado):
update peliculas set duracion=120 where duracion is null;
11- Coloque 'Desconocido' en el campo "actor" en los registros que tengan valor
nulo en dicho campo
(1 registro afectado):
update peliculas set actor='Desconocido'
where actor is null;
12- Muestre todos los registros. Note que el cambio anterior no afect al registro
con valor nulo
en el campo "actor".
13- Coloque 'Desconocido' en el campo "actor" en los registros que tengan cadena
vaca en dicho
campo (1 registro afectado):
update peliculas set actor='Desconocido'
where actor='';
14- Elimine los registros cuyo ttulo sea una cadena vaca:
delete from peliculas
where titulo='';
<------------------------------------------------------------------->
15 - Valores numricos sin signo (unsigned)
Hemos visto algunos atributos extra para los campos.
Los campos de tipo entero pueden tener el atributo "auto_increment", que increme
nta automticamente el valor del campo en 1.
Los campos de cualquier tipo aceptan el atributo "null" y "not null" con lo cual
permiten o no valores nulos.
Otro atributo que permiten los campos de tipo numrico es "unsigned".
El atributo "unsigned" (sin signo) permite slo valores positivos.
Si necesitamos almacenar edades, por ejemplo, nunca guardaremos valores negativo
s, entonces sera adecuado definir un campo "edad" de tipo entero sin signo:
edad integer unsigned;
Si necesitamos almacenar el precio de los libros, definimos un campo de tipo "fl
oat unsigned" porque jams guardaremos un valor negativo.
Hemos aprendido que al crear una tabla, es importante elegir el tipo de dato ade
cuado, el ms preciso, segn el caso. Si un campo almacenar slo valores positivos, es t
il definir dicho campo con este atributo.
En los tipos enteros, "unsigned" duplica el rango, es decir, el tipo "integer" p
ermite valores de -2000000000 a 2000000000 aprox., si se define "integer unsigne
d" el rango va de 0 a 4000000000 aprox.
Los tipos de coma flotante (float por ejemplo) tambin aceptan el atributo "unsign
ed", pero el valor del lmite superior del rango se mantiene.
Problema :
Trabaje con la tabla que almacena los datos sobre pelculas.
1- Elimine la tabla "peliculas", si existe.
2- Tenga en cuenta el rango de valores que almacenar cada campo:
-codigo: entero a partir de 1, autoincrementable,
-titulo: caracteres de 40 de longitud, no nulo,
-actor: cadena de 20,
-duracion: entero positivo,
-clave primaria: codigo.
3- Cree la tabla y defina cada campo segn el rango de valores que almacenar:
create table peliculas(
codigo integer unsigned auto_increment,
titulo varchar(40) not null,
actor varchar(20),
duracion integer unsigned,
primary key(codigo)
);
4- Visualice la estructura de la tabla.
Segundo problema:
Un comercio que tiene un stand en una feria registra en una tabla llamada "visit
antes" algunos
datos de las personas que visitan o compran en su stand para luego enviarle publ
icidad de sus
productos.
1- Elimine la tabla "visitantes", si existe.
2- Cree la tabla y al definir los campos tenga en cuenta el rango de valores que
almacenar cada
campo:
- nombre: cadena de 30 caracteres,
- edad: entero positivo. No hay edades con valores negativos.
- sexo: 'f' o 'm',
- domicilio: cadena de 30,
- ciudad: cadena de 30,
- telfono: cadena de 11,
- monto compra: valor con decimales mayor o igual a cero. No hay compras con mo
nto negativo.
3- Visualice la estructura de la tabla.
<------------------------------------------------------------------->
16 - Tipos de datos
Ya explicamos que al crear una tabla debemos elegir la estructura adecuada, esto
es, definir los campos y sus tipos ms precisos, segn el caso. Por ejemplo, si un
campo numrico almacenar solamente valores enteros positivos el tipo "integer" con
el atributo "unsigned" es ms adecuado que, por ejemplo un "float".
Hasta ahora hemos visto 3 tipos de datos: varchar, integer (con y sin signo) y f
loat (con y sin signo). Hay ms tipos, incluso, subtipos.
Los valores que podemos guardar son:
A) TEXTO: Para almacenar texto usamos cadenas de caracteres. Las cadenas se colo
can entre comillas simples. Podemos almacenar dgitos con los que no se realizan o
peraciones matemticas, por ejemplo, cdigos de identificacin, nmeros de documentos, nm
eros telefnicos. Tenemos los siguientes tipos: varchar, char y text.
B) NUMEROS: Existe variedad de tipos numricos para representar enteros, negativos
, decimales. Para almacenar valores enteros, por ejemplo, en campos que hacen re
ferencia a cantidades, precios, etc., usamos el tipo integer. Para almacenar val
ores con decimales utilizamos: float o decimal.
C) FECHAS Y HORAS: para guardar fechas y horas dispone de varios tipos: date (fe
cha), datetime (fecha y hora), time (hora), year (ao) y timestamp.
D) OTROS TIPOS: enum y set representan una enumeracin y un conjunto respectivamen
te. Lo veremos ms adelante.
E) Otro valor que podemos almacenar es el valor "null". El valor 'null' signific
a valor desconocido o "dato inexistente", ya lo estudiamos. No es lo mismo que 0 o
una cadena vaca.
<------------------------------------------------------------------->
17 - Tipos de datos (texto)
Ya explicamos que al crear una tabla debemos elegir la estructura adecuada, esto
es, definir los campos y sus tipos ms precisos, segn el caso.
Hasta ahora hemos visto 3 tipos de datos: varchar, integer (con y sin signo) y f
loat (con y sin signo). Hay ms tipos, incluso, subtipos.
Para almacenar TEXTO usamos cadenas de caracteres. Las cadenas se colocan entre
comillas simples. Podemos almacenar dgitos con los que no se realizan operaciones
matemticas, por ejemplo, cdigos de identificacin, nmeros de documentos, nmeros telefn
icos. Tenemos los siguientes tipos:
1) varchar(x): define una cadena de caracteres de longitud variable en la cual d
eterminamos el mximo de caracteres con el argumento "x" que va entre parntesis. Su
rango va de 1 a 255 caracteres. Un varchar(10) ocupa 11 bytes, pues en uno de e
llos almacena la longitud de la cadena. Ocupa un byte ms que la cantidad definida
.
2) char(x): define una cadena de longitud fija, su rango es de 1 a 255 caractere
s. Si la cadena ingresada es menor a la longitud definida (por ejemplo cargamos
'Juan' en un char(10)), almacena espacios en blanco a la derecha, tales espacios
se eliminan al recuperarse el dato. Un char(10) ocupa 10 bytes, pues al ser fij
a su longitud, no necesita ese byte adicional donde guardar la longitud. Por ell
o, si la longitud es invariable, es conveniente utilizar el tipo char; caso cont
rario, el tipo varchar.
Ocupa tantos bytes como se definen con el argumento "x". Si ingresa un argumento
mayor al permitido (255) aparece un mensaje indicando que no se permite y sugir
iendo que use "blob" o "text". Si omite el argumento, coloca 1 por defecto.
3) blob o text: bloques de datos de 60000 caracteres de longitud aprox. No lo ve
remos por ahora.
Para los tipos que almacenan cadenas, si asignamos una cadena de caracteres de m
ayor longitud que la permitida o definida, la cadena se corta. Por ejemplo, si d
efinimos un campo de tipo varchar(10) y le asignamos la cadena 'Buenas tardes',
se almacenar 'Buenas tar' ajustndose a la longitud de 10.
Es importante elegir el tipo de dato adecuado segn el caso, el ms preciso. Por eje
mplo, si vamos a almacenar un caracter, conviene usar char(1), que ocupa 1 byte
y no varchar(1), que ocupa 2 bytes.
Tipo Bytes de almacenamiento
_______________________________________
char(x) x
varchar(x) x+1
Problema :
Una concesionaria de autos vende autos usados y almacena los datos de los autos
en
una tabla llamada "autos".
1- Elimine la tabla "autos" si existe.
2- Cree la tabla con la siguiente estructura:
create table autos(
patente char(6),
marca varchar(20),
modelo char(4),
precio float unsigned,
primary key(patente)
);
3- Ingrese los siguientes registros:
insert into autos (patente,marca,modelo,precio)
values('ACD123','Fiat 128','1970',15000);
insert into autos (patente,marca,modelo,precio)
values('ACG234','Renault 11','1990',40000);
insert into autos (patente,marca,modelo,precio)
values('BCD333','Peugeot 505','1990',80000);
insert into autos (patente,marca,modelo,precio)
values('GCD123','Renault Clio','1990',70000);
insert into autos (patente,marca,modelo,precio)
values('BCC333','Renault Megane','1998',95000);
insert into autos (patente,marca,modelo,precio)
values('BVF543','Fiat 128','1975',20000);
Hemos definido el campo "patente" de tipo "char" y no "varchar" porque la cadena
de caracteres
siempre tendr la misma longitud (6 caracteres), con esta definicin ocupamos 6 byte
s, si lo
hubisemos definido como "varchar(6)" ocupara 7 bytes. Lo mismo sucede con el campo
"modelo", en
el cual almacenaremos el ao, necesitamos 4 caracteres fijos. Para el campo "preci
o" definimos un
float sin signo porque los valores nunca sern negativos.
4- Seleccione todos los autos del ao 1990:
select * from autos
where modelo='1990';
5- Seleccione todos los autos con precio superior a 50000:
select * from autos
where precio>50000;

Segundo problema:
Una empresa almacena los datos de sus clientes en una tabla llamada "clientes".
1- Elimine la tabla "clientes" si existe:
drop table if exists clientes;
2- Crela con los siguientes campos y clave:
create table clientes(
documento char(8),
apellido varchar(20),
nombre varchar(20),
domicilio varchar(30),
telefono varchar (11),
primary key(documento)
);
3- Analice la definicin de los campos. Se utiliza char(8) para el documento porqu
e siempre
constar de 8 caracteres. Para el nmero telefnico se usar "varchar" y no un tipo numr
ico porque
si bien es un nmero, con l no se realizarn operaciones matemticas.
4- Ingrese algunos registros:
insert into clientes (documento,apellido,nombre,domicilio,telefono)
values('2233344','Perez','Juan','Sarmiento 980','4342345');
insert into clientes (documento,apellido,nombre,domicilio)
values('2333344','Perez','Ana','Colon 234');
insert into clientes (documento,apellido,nombre,domicilio,telefono)
values('2433344','Garcia','Luis','Avellaneda 1454','4558877');
insert into clientes (documento,apellido,nombre,domicilio,telefono)
values('2533344','Juarez','Ana','Urquiza 444','4789900');
5- Seleccione todos los clientes de apellido 'Perez'.
6- seleccione el apellido, domicilio y telfono de todas las 'Ana'.
<------------------------------------------------------------------->
18- Tipos de datos (numricos)
Hasta ahora hemos visto 2 tipos de datos para almacenar valores numricos: integer
(con y sin signo) y float (con y sin signo). Existe variedad de tipos numricos p
ara representar enteros, negativos, decimales.
Para almacenar valores enteros, por ejemplo, en campos que hacen referencia a ca
ntidades, precios, etc., usamos: 1) integer(x) o int(x): su rango es de -2000000
000 a 2000000000 aprox. El tipo "int unsigned" va de 0 a 4000000000. El tipo "in
teger" tiene subtipos:
- mediumint(x): va de 8000000 a 8000000 aprox. Sin signo va de 0 a 16000000 aprox
.
- smallint(x): va de 30000 a 30000 aprox., sin signo, de 0 a 60000 aprox.
- tinyint(x): define un valor entero pequeo, cuyo rango es de -128 a 127. El tipo
sin signo va de 0 a 255.
- bool o boolean: sinnimos de tinyint(1). Un valor cero se considera falso, los v
alores distintos de cero, verdadero.
- bigint(x): es un entero largo. Va de 9000000000000000000 a 9000000000000000000
aprox. Sin signo es de 0 a 10000000000000000000.
Para almacenar valores con decimales utilizamos:
2) float (t,d): nmero de coma flotante. Su rango es de -3.4e+38 a 1.1e-38 (9 cifra
s).
3) decimal o numeric (t,d): el primer argumento indica el total de dgitos y el se
gundo, la cantidad de decimales. El rango depende de los argumentos, tambin los b
ytes que ocupa. Si queremos almacenar valores entre 0.00 y 99.99 debemos definir
el campo como tipo "decimal (4,2)". Si no se indica el valor del segundo argume
nto, por defecto es 0. Para los tipos "float" y "decimal" se utiliza el punto co
mo separador de decimales.
Todos los tipos enteros pueden tener el atributo "unsigned", esto permite slo val
ores positivos y duplica el rango. Los tipos de coma flotante tambin aceptan el a
tributo "unsigned", pero el valor del lmite superior del rango no se modifica.
Es importante elegir el tipo de dato adecuado segn el caso, el ms preciso. Por eje
mplo, si un campo numrico almacenar valores positivos menores a 10000, el tipo "in
t" no es el ms adecuado, porque su rango va de -2000000000 a 2000000000 aprox., c
onviene el tipo "smallint unsigned", cuyo rango va de 0 a 60000 aprox. De esta m
anera usamos el menor espacio de almacenamiento posible.
Tipo Bytes de almacenamiento
_______________________________________
tinyint 1
smallint 2
mediumint 3
int 4
bigint 8
float 4
decimal(t,d) t+2 si d>0, t+1 si d=0 y d+2 si t<d
Problema :
Un comercio que enva pizzas y empanadas a domicilio registra los pedidos diariame
nte en una tabla
llamada "pedidos" con los siguientes datos:
- numero de pedido, autoincrementable, entero positivo comienza en 1 y menor a
200 aprox.
- nombre: piza o empanada,
- tipo: por ejemplo, si es pizza: especial, muzarela, etc., si son empanadas: s
alteas, picantes,
arabes, etc.
- precio: precio por unidad, valor con decimales que no supera los $99.99 y ser
siempre mayor a 0,
- cantidad: cantidad de articulos, entero positivo desde 1 e inferior a 200 apr
ox.
- domicilio del cliente.
1- Elimine la tabla "pedidos" si existe.
2- Cree la tabla eligiendo el tipo de dato adecuado para cada campo.

Segundo problema:
A) El departamento de Meteorologa de una ciudad tiene almacenados en una tabla la
s estadsticas de
temperatura y precipitaciones de varias ciudades del mundo. La tabla tiene regis
trados los
siguientes datos:
Ciudad Pas Temperatura Maxima Temp.Min Precipitaciones Media An
ual
________________________________________________________________________________
_____
Bs. As. Argentina 30 8 1200
Canberra Australia 28 0 620
Brasilia Brasil 27 13 1500
Madrid Espaa 31 2 400
Mexico Mexico 23 7 850
Moscu Rusia 24 -13 690
Oslo Noruega 28 -16 750
Ottawa Canad 26 -16 900
Santiago Chile 29 3 300
Viena Austria 25 -4 600
1- Elimine la tabla "estadisticas".
2- Cree la tabla eligiendo el tipo de dato adecuado para almacenar los datos des
criptos arriba:
- ciudad y pas: cadena de caracteres,
- temperaturas (mxima y mnima): entero desde -20 hasta 40 aprox.
- precipitaciones media anual: desde 0 a 2000 aprox.
B) Un instituto de fsica que realiza investigaciones acerca de los gases guarda e
n una tabla las
temperaturas crticas y la presin crtica de los mismos. La tabla contiene estos regi
stros:
Gas Temperatura Crtica Presin Crtica
________________________________________________________
Helio -269.7 2.26
Hidrgeno -239.9 12.8
Nitrgeno -147.1 33.5
Oxgeno -120.0 50.1
Dix. de carb. 31.3 72.9
Amonaco 132.4 111.5
Vapor de agua 374.2 218.0
1- Elimine la tabla "gases" si existe.
2- Cree la tabla eligiendo el tipo de dato adecuado para almacenar los datos des
criptos arriba:
- Gas: cadena,
- Temperatura Crtica: valores decimales desde -300 hasta 400 aprox.,
- Presin Crtica: valores decimales positivos hasta 300 aprox.
C) Un banco tiene registrados las cuentas corrientes de sus clientes en una tabl
a llamada "cuentas".
La tabla contiene estos datos:
Nmero de Cuenta Documento Nombre Saldo
______________________________________________________________
1234 22555666 Perez Luis 2000.60
2566 33558778 Pereyra Maria 5050.00
3456 34567765 Lopez Susana 10.00
3900 34590697 Torres Marcos -50.50
4560 35098098 Juarez Ana -232.00
1- Elimine la tabla "cuentas" si existe. 2- Cree la tabla eligiendo el tipo de d
ato adecuado para almacenar los datos descriptos arriba: - Nmero de cuenta: enter
o positivo, no nulo, - Documento del propietario de la cuenta: cadena de caracte
res de 8 de longitud (siempre 8), no nulo - Nombre del propietario de la cuenta:
cadena de caracteres, - Saldo de la cuenta: valores positivos y negativos altos
.
<------------------------------------------------------------------->
19 - Tipos de datos (fechas y horas)
Para guardar fechas y horas dispone de varios tipos:
1) date: representa una fecha con formato "YYYY-MM-DD". El rango va de "1000-01-
01" a "9999-12-31".
2) datetime: almacena fecha y hora, su formato es "YYYY-MM-DD HH:MM:SS". El rang
o es de "1000-01-01 00:00:00" a "9999-12-31 23:59:59".
3) time: una hora. Su formato es "HH:MM:SS". El rango va de "-838:59:59" a "838:
59:59".
4) year(2) y year(4): un ao. Su formato es "YYYY" o "YY". Permite valores desde 1
901 a 2155 (en formato de 4 dgitos) y desde 1970 a 2069 (en formato de 2 dgitos).
Si ingresamos los valores como cadenas, un valor entre "00" y "69" es convertido
a valores "year" en el rango de 2000 a 2069; si el valor est entre "70" y "99",
se convierten a valores "year" en el rango 1970 a 1999.
Si ingresamos un valor numrico 0, se convierte en "0000"; entre 1 y 69, se convie
rte a valores "year" entre 2001 a 2069; entre 70 y 99, es convertido a valores "
year" de 1970 a 1999.
Para almacenar valores de tipo fecha se permiten como separadores "/", "-" y "."
.
Si ingresamos '06-12-31' (ao de 2 dgitos), lo toma como '2006-12-31'.
Si ingresamos '2006-2-1' (mes y da de 1 dgito), lo toma como '2006-02-01'.
Si ingresamos '20061231' (cadena sin separador), lo toma como '2006-12-31'.
Si ingresamos 20061231 (numrico), lo toma como '2006-12-31'.
Si ingresamos '20061231153021' (cadena sin separadores), lo toma como '2006-12-3
1 15:30:21'.
Si ingresamos '200612311530' (cadena sin separadores con un dato faltante) no lo
reconoce como fechahora y almacena ceros.
Si ingresamos '2006123' (cadena sin separadores con un dato faltante) no lo reco
noce como fecha y almacena ceros.
Si ingresamos '2006-12-31 11:30:21' (valor date time) en un campo 'date', toma sl
o la parte de la fecha, la hora se corta, se guarda '2006-12-31'.
Es importante elegir el tipo de dato adecuado segn el caso, el ms preciso. Por eje
mplo, si slo necesitamos registrar un ao (sin da ni mes), el tipo adecuado es "year
" y no "date".
Tipo Bytes de almacenamiento
_______________________________________
date 3
datetime 8
time 3
year 1
Problema :
Una concesionaria de autos vende autos usados. Guarda los siguientes datos en la
tabla "autos":
- marca (fiat 128, renault 11, peugeot 505, etc.)
- modelo (ao)
- dueo (nombre del dueo)
- precio (valor con decimales positivo que puede llegar hasta 999999.99 aprox.).
1- Elimine la tabla si existe.
2- Cree la tabla eligiendo el tipo de dato adecuado para almacenar estos datos:
create table autos(
marca varchar(15),
modelo year,
dueo varchar(30),
precio decimal (8,2) unsigned
);
3- Ingrese los siguientes registros:
insert into autos values('Fiat 128','1970','Juan Lopez',50000);
insert into autos values('Renault 11','1990','Juan Lopez',80000);
insert into autos values('Fiat 128','1971','Ana Ferreyra',51000);
insert into autos values('Peugeot 505','1998','Luis Luque',99000);
insert into autos values('Peugeot 505','1997','Carola Perez',85000);
4- Seleccione todos los autos cuyo modelo sea menor a "1995":
select * from autos
where modelo<1995;
5- Muestre la marca y modelo de los autos que no sean de "1970":
select marca,modelo from autos
where modelo<>1970;
6- Ingrese un auto con el valor para "modelo" de tipo numrico:
insert into autos values('Peugeot 505',1995,'Carlos Lopez',88000);

Segundo problema:
Una empresa almacena los datos de sus empleados en una tabla "empleados".
1- Elimine la tabla, si existe:
drop table if exists empleados;
2- Cree la tabla eligiendo el tipo de dato adecuado para cada campo:
create table empleados(
nombre varchar(20),
documento char(8),
sexo char(1),
domicilio varchar(30),
fechaingreso date
);
3- Ingrese algunos registros:
insert into empleados
values('Juan Perez','22333444','m','Colon 123','1990-10-08');
insert into empleados
values('Ana Acosta','23333444','f','Caseros 987','1995-12-18');
insert into empleados
values('Lucas Duarte','25333444','m','Sucre 235','2005-05-15');
insert into empleados
values('Pamela Gonzalez','26333444','f','Sarmiento 873','1999-02-12');
insert into empleados
values('Marcos Juarez','30333444','m','Rivadavia 801','2002-09-22');
4- Seleccione todos los datos de los empleados que ingresaron a la empresa antes
del 2000:
select * from empleados
where fechaingreso<'2000';
5- Muestre el nombre y la fecha de ingreso de los empleados de sexo masculino:
select nombre,fechaingreso from empleados
where sexo='m';
6- Modifique la fecha de ingreso del empleado con documento "22333444" a "1990-1
0-18":
update empleados set fechaingreso='1990-10-18'
where documento='22333444';
7- Ingrese un empleado con valor para "fechaingreso" en la cual coloque 2 digito
s correspondientes
al ao:
insert into empleados
values('Susana Duarte','30123456','f','Sucre 1234','99-02-12');
8- Ingrese un empleado colocando slo un dgito en la parte de la fecha correspondie
nte al mes y
da:
insert into empleados
values('Daniel Herrero','30000001','m',null,'1980-2-03');
9- Ingrese una fecha de ingreso sin separadores:
insert into empleados
values('Ana Juarez','31123123','f',null,'19900306');
10- Ingrese un valor de tipo fecha y hora:
insert into empleados
values('Juan Mores','32222333','m',null,'1990-03-06 10:15');
Slo guarda la parte de la fecha.
11- Ingrese un valor que MySQL no reconozca como fecha:
insert into empleados
values('Hector Perez','34444555','m',null,'1990036');
Almacenar ceros.
<------------------------------------------------------------------->
20 - Valores por defecto.
Hemos visto los valores por defecto de los distintos tipos de datos. Ahora que c
onocemos ms tipos de datos, vamos a ampliar la informacin referente a ellos y a re
pasar los conocidos.
Para campos de cualquier tipo no declarados "not null" el valor por defecto es "
null" (excepto para tipos "timestamp" que no trataremos aqu).
Para campos declarados "not null", el valor por defecto depende del tipo de dato
. Para cadenas de caracteres el valor por defecto es una cadena vaca. Para valore
s numricos el valor por defecto es 0; en caso de ser "auto_increment" es el valor
mayor existente+1 comenzando en 1. Para campos de tipo fecha y hora, el valor p
or defecto es 0 (por ejemplo, en un campo "date" es "0000-00-00").
Para todos los tipos, excepto "blob", "text" y "auto_increment" se pueden explic
itar valores por defecto con la clusula "default"; tema que veremos ms adelante.
Un valor por defecto se inserta cuando no est presente al ingresar un registro y
en algunos casos en que el dato ingresado es invlido.
Los campos para los cuales no se ingresaron valores tomarn los valores por defect
o segn el tipo de dato del campo, en el campo "codigo" ingresar el siguiente valor
de la secuencia porque es "auto_increment"; en el campo "titulo", ingresar una c
adena vaca porque es "varchar not null"; en el campo "editorial" almacenar "null",
porque no est definido "not null"; en el campo "precio" guardar "null" porque es
el valor por defecto de los campos no definidos como "not null" y en el campo "c
antidad" ingresar 0 porque es el valor por defecto de los campos numricos que no a
dmiten valores nulos.
Tipo Valor por defecto Clusula "defau
lt"
________________________________________________________________________________
_____
caracter not null cadena vaca permite
numerico not null 0 permite
fecha not null 0000-00-00 permite
hora not null 00:00:00 permite
auto_increment siguiente de la sec., empieza en 1 no permite
carac.,numer.,fecha,hora null null permite
Problema :
Trabaje con la tabla que almacena los datos sobre pelculas, llamada "peliculas".
1- Elimine la tabla si existe.
2- Crela con la siguiente estructura:
-codigo (entero sin signo, autoincrementable),
-titulo (cadena de 30, not nulo),
-actor (cadena de 20),
-duracion (entero positivo hasta 200 apox.),
-clave primaria (codigo).
3- Agregue los siguientes registros para ver cmo guarda MySQL los valores no ingr
esados:
insert into peliculas (titulo,actor,duracion)
values('Mision imposible','Tom Cruise',120);
insert into peliculas (codigo,duracion)
values(5,90);
insert into peliculas (titulo,actor)
('Harry Potter y la piedra filosofal','Daniel R.');
insert into peliculas (titulo,actor,duracion)
('Harry Potter y la piedra filosofal','Daniel R.',120);
4- Seleccione todos los datos de las pelculas para ver cmo guard MySQL los valores
no
ingresados. En el primer registro ingresado, en el campo "codigo" ingresar "1", e
l primer valor
para campos "auto_increment". En el segundo registro ingresado se almacena una c
adena vaca para
el ttulo y el valor "null" para el actor. En el tercer registro guarda "6" en "co
digo", el
siguiente valor de la secuencia tomando el valor ms alto y en "duracion" almacena
"0". En el
cuarto registro sigue la secuencia del cdigo.
Segundo problema:
Una empresa almacena los datos de sus empleados en una tabla "empleados".
1- Elimine la tabla, si existe.
2- Cree la tabla:
create table empleados(
nombre varchar(20),
documento char(8) not null,
sexo char(1),
domicilio varchar(30),
fechaingreso date not null,
fechanacimiento date,
sueldo decimal(5,2) unsigned not null
);
3- Agregue los siguientes registros para ver cmo guarda MySQL los valores no ingr
esados:
insert into empleados (nombre,documento,sexo)
values('Marcela Medina','22333444','f');
insert into empleados (domicilio,fechaingreso)
values('Avellaneda 200','2005-08-16');
insert into empleados (fechanacimiento,sueldo)
values('1970-09-26',500.90);
4- Seleccione todos los datos de los empleados para ver cmo guard MySQL los valore
s no ingresados.
En el primer registro ingresado, en los campos "domicilio" y "fechanacimiento" i
ngresar "null",
porque ninguno de los campos estn definidos como "not null"; en el campo "fechain
greso"
almacena "000-00-00" ya que dicho campo no admite valores nulos; en el campo "su
eldo" guarda "0.00"
porque el campo no admite valores nulos. En el segundo registro ingresado se alm
acena "null" en los
campos "nombre", "sexo" y "fechanacimiento" pues estos campos admiten valores "n
ull"; en el
campo "documento", que no admite valores nulos, se almacena una cadena vaca. En e
l tercer registro
guarda "null" en los campos "nombre", "sexo" y "domicilio", ya que los permiten;
en el
campo "documento", almacena una cadena vaca.
<------------------------------------------------------------------->
21 - Valores invlidos.
Hemos visto los valores por defecto de los distintos tipos de datos.
Un valor por defecto se inserta cuando no est presente al ingresar un registro y
en algunos casos en que el dato ingresado es invlido.
Un valor es invlido por tener un tipo de dato incorrecto para el campo o por esta
r fuera de rango.
Veamos los distintos tipos de datos invlidos.
Para campos de tipo caracter:
-valor numrico: si en un campo definido de tipo caracter ingresamos un valor numri
co, lo convierte automticamente a cadena. Por ejemplo, si guardamos 234 en un var
char, almacena '234'.
-mayor longitud: si intentamos guardar una cadena de caracteres mayor a la longi
tud definida, la cadena se corta guardando slo la cantidad de caracteres que quep
a. Por ejemplo, si definimos un campo de tipo varchar(10) y le asignamos la cade
na 'Buenas tardes', se almacenar 'Buenas tar' ajustndose a la longitud de 10.
Para campos numricos:
-cadenas: si en un campo numrico ingresamos una cadena, lo pasa por alto y coloca
0. Por ejemplo, si en un campo de tipo "integer" guardamos 'abc', almacenar 0.
-valores fuera de rango: si en un campo numrico intentamos guardar un valor fuera
de rango, se almacena el valor lmite del rango ms cercano (menor o mayor). Por ej
emplo, si definimos un campo 'tinyint' (cuyo rango va de -128 a 127) e intentamo
s guardar el valor 200, se almacenar 127, es decir el mximo permitido del rango; s
i intentamos guardar -200, se guardar -128, el mnimo permitido por el rango. Otro
ejemplo, si intentamos guardar el valor 1000.00 en un campo definido como decima
l(5,2) guardar 999.99 que es el mayor del rango.
-valores incorrectos: si cargamos en un campo definido de tipo decimal un valor
con ms decimales que los permitidos en la definicin, el valor es redondeado al ms c
ercano. Por ejemplo, si cargamos en un campo definido como decimal(4,2) el valor
22.229, se guardar 22.23, si cargamos 22.221 se guardar 22.22.
Para campos definidos auto_increment el tratamiento es el siguiente:
- Pasa por alto los valores fuera del rango, 0 en caso de no ser "unsigned" y to
dos los menores a 1 en caso de ser "unsigned".
- Si ingresamos un valor fuera de rango contina la secuencia.
- Si ingresamos un valor existente, aparece un mensaje de error indicando que el
valor ya existe.
Para campos de fecha y hora:
-valores incorrectos: si intentamos almacenar un valor que MySql no reconoce com
o fecha (sea fuera de rango o un valor invlido), convierte el valor en ceros (segn
el tipo y formato). Por ejemplo, si intentamos guardar '20/07/2006' en un campo
definido de tipo "date", se almacena '0000-00-00'. Si intentamos guardar '20/07
/2006 15:30' en un campo definido de tipo "datetime", se almacena '0000-00-00 00
:00:00'. Si intentamos almacenar un valor invlido en un campo de tipo "time", se
guarda ceros. Para "time", si intentamos cargar un valor fuera de rango, se guar
da el menor o mayor valor permitido (segn sea uno u otro el ms cercano).
Para campos de cualquier tipo:
-valor "null": si un campo est definido "not null" e intentamos ingresar "null",
aparece un mensaje de error y la sentencia no se ejecuta.
Los valores invlidos para otros tipos de campos lo trataremos ms adelante.
RESUMEN:
Tipo Valor invlido
Resultado
________________________________________________________________________________
__________
caracter null/ not null 123
'123'
caracter null/ not null mayor longitud
se corta
caracter not null null
error
numrico null/ not null '123'
0
numrico null/ not null fuera de rango
lmite ms cercano
numrico not null null error
numrico decimal null/ not null ms decimales que los definidos
redondea al ms cercano
num. auto_incr. c/signo null/not null 0
siguiente de la secuencia
num. auto_incr. s/signo null/not null todos los menores a 1
siguiente de la secuencia
num. auto_incr. c/s signo null null
siguiente de la secuencia
num. auto_incr. c/s signo null/not null valor existente
error
fecha fuera de rango
0000-00-00
fecha '20-07-2006' (otro orden)
0000-00-00
hora fuera de rango
lmite ms cercano
fecha y hora not null null
error
Problema :
Una empresa registra los datos de sus empleados en una tabla llamada "empleados"
.
1- Elimine la tabla "empleados" si existe.
2- Cree la tabla:
create table empleados(
documento char(8) not null,
nombre varchar(30) not null,
domicilio varchar(30),
fechaingreso date not null,
fechanacimiento date,
primary key(documento)
);
3- Intente ingresar la fecha "20-10-2005" para la fecha de ingreso:
insert into empleados (documento,fechaiIngreso,fechanacimiento)
values('22333444','20-10-2005',null);
Se almacenan ceros.
4- Intente almacenar "null" en "fechaingreso":
insert into empleados (documento,fechaingreso,fechanacimiento)
values('22333444',null,'2005-10-10');
Muestra un mensaje de error.
5- Intente almacenar valores nulos en los campos "documento" y " nombre".
6- Almacene un valor numrico en un campo de tipo caracter.
7- Almacene en "documento" el valor "22.345.678".

Segundo problema:
Trabaje con la tabla que almacena los datos sobre pelculas, llamada "peliculas".
1- Elimine la tabla si existe.
2- Crela con la siguiente estructura:
create table peliculas(
codigo int unsigned auto_increment,
titulo varchar(15) not null,
actor varchar(20),
duracion tinyint unsigned,
primary key (codigo)
);
3- Ingrese el siguiente registro:
insert into peliculas values(-10,'Mision imposible','Tom Cruise',120);
4- Muestre los registros para ver qu valor se guard en "codigo".
5- Intente ingresar el siguiente registro (error por clave duplicada):
insert into peliculas values(1,'Mision imposible 2','Tom Cruise',120);
6- Intente ingresar el siguiente registro:
insert into peliculas values(null,'Mision imposible 2','Tom Cruise',120);
7- Muestre los registros para ver qu valor se guard en "codigo".
8- Intente ingresar el siguiente registro (no ingresa, el campo "ttulo" no admite
valores nulos):
insert into peliculas values(3,null,'Tom Cruise',120);
9- Ingrese el siguiente registro:
insert into peliculas values(5,'Harry Potter y la camara secreta','Daniel R.',1
50);
10- Muestre los registros para ver qu se almacen en "titulo" (cadena cortada).
11- Ingrese el siguiente registro:
insert into peliculas values(10,'Elsa y Fred','China Zorrilla',12345);
12- Muestre los registros para ver qu se almacen en "duracin" (el valor lmite permit
ido por el
rango ms cercano al ingresado).
<------------------------------------------------------------------->
22 - Atributo default en una columna de una tabla.
Si al insertar registros no se especifica un valor para un campo, se inserta su
valor por defecto implcito segn el tipo de dato del campo. Por ejemplo:
insert into libros (titulo,autor,editorial,precio,cantidad)
values('Java en 10 minutos','Juan Pereyra','Paidos',25.7,100);
Como no ingresamos valor para el campo "codigo", MySQL insertar el valor por defe
cto, como "codigo" es un campo "auto_increment", el valor por defecto es el sigu
iente de la secuencia.
Si omitimos el valor correspondiente al autor:
insert into libros (titulo,editorial,precio,cantidad)
values('Java en 10 minutos','Paidos',25.7,200);
MySQL insertar "null", porque el valor por defecto de un campo (de cualquier tipo
) que acepta valores nulos, es "null".
Lo mismo sucede si no ingresamos el valor del precio:
insert into libros (titulo,autor,editorial,cantidad)
values('Java en 10 minutos','Juan Pereyra',Paidos',150);
MySQL insertar el valor "null" porque el valor por defecto de un campo (de cualqu
ier tipo) que acepta valores nulos, es "null".
Si omitimos el valor correspondiente al ttulo:
insert into libros (autor,editorial,precio,cantidad)
values ('Borges','Paidos',25.7,200);
MySQL guardar una cadena vaca, ya que ste es el valor por defecto de un campo de ti
po cadena definido como "not null" (no acepta valores nulos).
Si omitimos el valor correspondiente a la cantidad:
insert into libros (titulo,autor,editorial,precio)
values('Alicia a traves del espejo','Lewis Carroll','Emece',34.5);
el valor que se almacenar ser 0, porque el campo "precio" es de tipo numrico "not n
ull" y el valor por defecto de los tipos numricos que no aceptan valores nulos es
0.
Podemos establecer valores por defecto para los campos cuando creamos la tabla.
Para ello utilizamos "default" al definir el campo. Por ejemplo, queremos que el
valor por defecto del campo "precio" sea 1.11 y el valor por defecto del campo
"autor" sea "Desconocido":
create table libros(
codigo int unsigned auto_increment,
titulo varchar(40) not null,
autor varchar(30) default 'Desconocido',
precio decimal(5,2) unsigned default 1.11,
cantidad int unsigned not null,
primary key (codigo)
);
Si al ingresar un nuevo registro omitimos los valores para el campo "autor" y "p
recio", MySQL insertar los valores por defecto definidos con la palabra clave "de
fault":
insert into libros (titulo,editorial,cantidad)
values('Java en 10 minutos','Paidos',200);
MySQL insertar el registro con el siguiente valor de la secuencia en "codigo", co
n el ttulo, editorial y cantidad ingresados, en "autor" colocar "Desconocido" y en
precio "1.11".
Entonces, si al definir el campo explicitamos un valor mediante la clusula "defau
lt", se ser el valor por defecto; sino insertar el valor por defecto implcito segn el
tipo de dato del campo.
Los campos definidos "auto_increment" no pueden explicitar un valor con "default
", tampoco los de tipo "blob" y "text".
Los valores por defecto implcitos son los siguientes:
-para campos de cualquier tipo que admiten valores nulos, el valor por defecto "
null";
-para campos que no admiten valores nulos, es decir, definidos "not null", el va
lor por defecto depende del tipo de dato:
-para campos numricos no declarados "auto_increment": 0;
-para campos numricos definidos "auto_increment": el valor siguiente de la secuen
cia, comenzando en 1;
-para los tipos cadena: cadena vaca.
Ahora al visualizar la estructura de la tabla con "describe" podemos entender un
poco ms lo que informa cada columna:
describe libros;
"Field" contiene el nombre del campo; "Type", el tipo de dato; "NULL" indica si
el campo admite valores nulos; "Key" indica si el campo est indexado (lo veremos
ms adelante); "Default" muestra el valor por defecto del campo y "Extra" muestra
informacin adicional respecto al campo, por ejemplo, aqu indica que "codigo" est de
finido "auto_increment".
Tambin se puede utilizar "default" para dar el valor por defecto a los campos en
sentencias "insert", por ejemplo:
insert into libros (titulo,autor,precio,cantidad)
values ('El gato con botas',default,default,100);
Problema :
Un comercio que enva pizzas y empanadas a domicilio registra los pedidos diariame
nte en una tabla
llamada "pedidos" con los siguientes datos:
- numero de pedido, autoincrementable, entero positivo comienza en 1 y menor a
200 aprox.
- nombre: pizza o empanada, por defecto "empanada",
- tipo: por ejemplo, si es pizza: especial, muzarela, etc., si son empanadas: a
rabes, pollo, jamn
y queso, criollas, etc.
- precio: precio por unidad, valor con decimales que no supera los $99.99 y ser
siempre mayor a
0, por defecto "1",
- cantidad: cantidad de articulos, entero positivo desde 1 e inferior a 200 apr
ox., por
defecto "12"
- domicilio del cliente.
1- Elimine la tabla "pedidos" si existe.
2- Cree la tabla eligiendo el tipo de dato adecuado para cada campo.
3- Ingrese los siguientes registros:
insert into pedidos (nombre,tipo,precio,cantidad,domicilio)
values('piza','muzarela','4.00',3,'Sarmiento 235');
insert into pedidos (tipo,precio,cantidad,domicilio)
values('arabe','1.00',24,'Urquiza 296');
insert into pedidos (nombre,tipo,domicilio)
values('empanada','saltea','Colon 309');
insert into pedidos (tipo,domicilio)
values('arabe','San Martin 444');
insert into pedidos (nombre,tipo,precio,domicilio)
values('piza','especial','4.00','Avellaneda 395');
4- Muestre todos los campos de todos los pedidos para ver cmo se guardaron los da
tos no ingresados.
Segundo problema:
A) Un comercio que tiene un stand en una feria registra en una tabla llamada "vi
sitantes" algunos
datos de las personas que visitan o compran en su stand para luego enviarle publ
icidad de sus
productos.
1- Elimine la tabla "visitantes", si existe.
2- Cree la tabla con la siguiente estructura:
create table visitantes(
nombre varchar(30) not null,
edad tinyint unsigned,
sexo char(1) default 'f',
domicilio varchar(30),
ciudad varchar(20) default 'Cordoba',
telefono varchar(11),
mail varchar(30) default 'no tiene',
montocompra decimal (6,2)
);
4- Ingrese algunos registros sin especificar valores para algunos campos para ve
r cmo opera la
clusula "default".
5- Muestre todos los registros.
Tercer problema:
B) Una pequea biblioteca de barrio registra los prstamos de sus libros en una tabl
a
llamada "prestamos". En ella almacena la siguiente informacin: ttulo del libro, do
cumento de
identidad del socio a quien se le presta el libro, fecha de prstamo, fecha en que
tiene que
devolver el libro y si el libro ha sido o no devuelto.
1- Elimine la tabla "prestamos" si existe.
2- Cree la tabla:
create table prestamos(
titulo varchar(40) not null,
documento char(8) not null,
fechaprestamo date not null,
fechadevolucion date,
devuelto char(1) default 'n'
);
3- Ingrese algunos registros:
insert into prestamos (titulo,documento,fechaprestamo,fechadevolucion)
values ('Manual de 1 grado','23456789','2006-08-10','2006-08-12');
insert into prestamos (titulo,documento,fechaprestamo,fechadevolucion)
values ('Alicia en el pais de las maravillas','23456789','2006-08-12','2006-08
-14');
insert into prestamos (titulo,documento,fechaprestamo,fechadevolucion)
values ('El aleph','22543987','2006-08-15','2006-08-17');
insert into prestamos (titulo,documento,fechaprestamo,fechadevolucion)
values ('Manual de geografia 5 grado','25555666','2006-08-30','2006-09-01');
4- Seleccione todos los registros para ver qu se guard en el campo "devuelto" para
el cual no
ingresamos datos.
<------------------------------------------------------------------->
23 - Atributo zerofill en una columna de una tabla.
Cualquier campo numrico puede tener otro atributo extra "zerofill".
"zerofill" rellena con ceros los espacios disponibles a la izquierda.
Por ejemplo, creamos la tabla "libros", definiendo los campos "codigo" y "cantid
ad" con el atributo "zerofill":
create table libros(
codigo int(6) zerofill auto_increment,
titulo varchar(40) not null,
autor varchar(30),
editorial varchar(15),
precio decimal(5,2) unsigned,
cantidad smallint zerofill,
primary key (codigo)
);
Note que especificamos el tamao del tipo "int" entre parntesis para que muestre po
r la izquierda ceros, cuando los valores son inferiores al indicado; dicho parmet
ro no restringe el rango de valores que se pueden almacenar ni el nmero de digito
s.
Al ingresar un valor de cdigo con menos cifras que las especificadas (6), aparece
rn ceros a la izquierda rellenando los espacios; por ejemplo, si ingresamos "33",
aparecer "000033". Al ingresar un valor para el campo "cantidad", suceder lo mism
o.
Si especificamos "zerofill" a un campo numrico, se coloca automticamente el atribu
to "unsigned".
Cualquier valor negativo ingresado en un campo definido "zerofill" es un valor i
nvlido.
Problema :
Un banco tiene registrados las cuentas corrientes de sus clientes en una tabla l
lamada "cuentas".
1- Elimine la tabla, si existe.
2- Cree la tabla:
create table cuentas(
numero int(8) zerofill auto_increment,
documento char(8) not null,
nombre varchar(30),
saldo decimal(9,2),
primary key(numero)
);
3- Visualice la estructura de la tabla:
describe cuentas;
note que en la columna que muestra el tipo aparece "zerofill" en el campo "numer
o".
4- Ingrese los siguientes registros:
insert into cuentas (numero,documento,nombre,saldo)
values(1234,'22333444','Juan Perez',2000.60);
insert into cuentas (numero,documento,nombre,saldo)
values(2566,'23333444','Maria Pereyra',5050);
insert into cuentas (numero,documento,nombre,saldo)
values(5987,'24333444','Marcos Torres',200);
insert into cuentas (numero,documento,nombre,saldo)
values(14434,'25333444','Ana Juarez',8000.60);
5- Vea cmo se guardaron los nmeros de cuenta:
select * from cuentas;
6- Ingrese un valor negativo para el nmero de cuenta:
insert into cuentas (numero,documento,nombre,saldo)
values(-1234,'27333444','Luis Duarte',2800);
note que no lo toma y sigue la secuencia.

Segundo problema:
Trabaje con la tabla que almacena los datos sobre pelculas, llamada "peliculas".
1- Elimine la tabla si existe.
2- Crela con la siguiente estructura:
create table peliculas(
codigo int(4) zerofill auto_increment,
titulo varchar(30) not null,
actor varchar(20),
duracion tinyint zerofill default 90,
primary key (codigo)
);
3- Vea la estructura de la tabla:
describe peliculas;
note que el atributo "zerofill" aparece en los campos "codigo" y "duracion", en
la columna que
describe el tipo de cada dato.
4- Ingrese algunos registros.
5- Ingrese un valor de cdigo negativo.
6- Ingrese un valor de duracin negativo.
<------------------------------------------------------------------->
24 - Columnas calculadas.
Es posible obtener salidas en las cuales una columna sea el resultado de un clcul
o y no un campo de una tabla.
Si queremos ver los ttulos, precio y cantidad de cada libro escribimos la siguien
te sentencia:
select titulo,precio,cantidad
from libros;
Si queremos saber el monto total en dinero de un ttulo podemos multiplicar el pre
cio por la cantidad por cada ttulo, pero tambin podemos hacer que MySQL realice el
clculo y lo incluya en una columna extra en la salida:

select titulo, precio,cantidad,precio*cantidad
from libros;
Si queremos saber el precio de cada libro con un 10% de descuento podemos inclui
r en la sentencia los siguientes clculos:
select titulo, precio,precio*0.1,precio-(precio*0.1)
from libros;
Problema :
Una empresa almacena los datos de sus empleados en una tabla "empleados".
1- Elimine la tabla "empleados" si existe.
2- Cree una tabla llamada "empleados" con la estructura necesaria para almacenar
la siguiente informacin:
- nombre del empleado,
- documento,
- sexo,
- domicilio,
- sueldo bsico (hasta 9999.99),
- hijos a cargo,
- clave primaria: documento.
3- Ingrese algunos registros:
insert into empleados (nombre,documento,sexo,sueldobasico,hijos)
values ('Juan Perez','22333444','m',300,1);
insert into empleados (nombre,documento,sexo,sueldobasico,hijos)
values ('Ana Acosta','21333444','f',400,2);
insert into empleados (nombre,documento,sexo,sueldobasico,hijos)
values ('Alberto Lopez','24333444','m',600,0);
insert into empleados (nombre,documento,sexo,sueldobasico,hijos)
values ('Carlos Sanchez','30333444','m',550,3);
insert into empleados (nombre,documento,sexo,sueldobasico,hijos)
values ('Mariana Torres','23444555','f',600,1);
insert into empleados (nombre,documento,sexo,sueldobasico,hijos)
values ('Marcos Garcia','23664555','m',1500,2);
4- La empresa est pensando en aumentar un 10% el sueldo a los empleados, y quiere
saber a cunto
subira cada sueldo bsico, para ello usamos la siguiente sentencia en la cual inclu
imos una
columna que har el clculo de cada sueldo ms el 10%:
select nombre, sueldobasico,sueldobasico+sueldobasico*1/10
from empleados;
5- La empresa paga un salario familiar por hijos a cargo, $200 por cada hijo. Ne
cesitamos el nombre
del empleado, el sueldo bsico, la cantidad de hijos a cargo, el total del salario
familiar y el
suedo final (incluyendo el salario familiar):
select nombre, sueldobasico,hijos,(200*hijos),sueldobasico+(200*hijos)
from empleados;
Segundo problema:
Un comercio vende artculos de librera y papelera. Almacena en una tabla los siguie
ntes datos:
- codigo: int unsigned auto_increment, clave primaria,
- nombre: varchar(30),
- precio: decimal(5,2),
- cantidad: smallint unsigned.
1- Elimine la tabla, si existe.
2- Cree la tabla con la estructura necesaria para almacenar los datos descriptos
anteriormente.
3- Ingrese los siguientes registros:
insert into articulos (nombre,precio,cantidad)
values ('lapices coloresx6',1.4,100);
insert into articulos (nombre,precio,cantidad)
values ('lapices coloresx12',2.5,100);
insert into articulos (nombre,precio,cantidad)
values ('lapices coloresx24',4.7,100);
insert into articulos (nombre,precio,cantidad)
values ('goma tinta',0.2,150);
insert into articulos (nombre,precio,cantidad)
values ('birome',1.2,200);
insert into articulos (nombre,precio,cantidad)
values ('escuadra',3.2,200);
insert into articulos (nombre,precio,cantidad)
values ('comps plstico',5,200);
insert into articulos (nombre,precio,cantidad)
values ('comps metal',8.4,250);
4- El precio representa el costo del artculo al comprarlo. Este comercio vende su
s artculos por
mayor y por menor, para la venta minorista incrementa el precio de costo en un 1
0%, para la venta
mayorista lo incrementa en un 5%. Muestre los precios de cada artculo y calcule e
n 2 columnas
diferentes el precio de cada uno de ellos al venderse por mayor y por menor:
select nombre,precio,precio+precio*0.1,precio+precio*0.05
from articulos;
5- El gerente de dicho comercio necesita saber cunto dinero hay invertido en cada
artculo, para
ello, necesitamos multiplicar el precio de cada artculo por la cantidad:
select nombre,precio,cantidad,precio*cantidad
from articulos;
<------------------------------------------------------------------>
25 - Funciones para el manejo de cadenas.
RECUERDE que NO debe haber espacios entre un nombre de funcin y los parntesis porq
ue MySQL puede confundir una llamada a una funcin con una referencia a una tabla
o campo que tenga el mismo nombre de una funcin.
MySQL tiene algunas funciones para trabajar con cadenas de caracteres. Estas son
algunas:
-ord(caracter): Retorna el cdigo ASCII para el caracter enviado como argumento. E
jemplo:
select ord('A');
retorna 65.
-char(x,..): retorna una cadena con los caracteres en cdigo ASCII de los enteros
enviados como argumentos. Ejemplo:

select char(65,66,67);
retorna "ABC".
-concat(cadena1,cadena2,...): devuelve la cadena resultado de concatenar los arg
umentos. Ejemplo:
select concat('Hola,',' ','como esta?');
retorna "Hola, como esta?".
-concat_ws(separador,cadena1,cadena2,...): "ws" son las iniciales de "with separ
ator". El primer argumento especifica el separador que utiliza para los dems argu
mentos; el separador se agrega entre las cadenas a concatenar. Ejemplo:
select concat_ws('-','Juan','Pedro','Luis');
retorna "Juan-Pedro-Luis".
-find_in_set(cadena,lista de cadenas): devuelve un valor entre de 0 a n (corresp
ondiente a la posicin), si la cadena envidada como primer argumento est presente e
n la lista de cadenas enviadas como segundo argumento. La lista de cadenas envia
da como segundo argumento es una cadena formada por subcadenas separadas por com
as. Devuelve 0 si no encuentra "cadena" en la "lista de cadenas". Ejemplo:
select find_in_set('hola','como esta,hola,buen dia');
retorna 2, porque la cadena "hola" se encuentra en la lista de cadenas, en la po
sicin 2.
-length(cadena): retorna la longitud de la cadena enviada como argumento. Ejempl
o:
select length('Hola');
devuelve 4.
- locate(subcadena,cadena): retorna la posicin de la primera ocurrencia de la sub
cadena en la cadena enviadas como argumentos. Devuelve "0" si la subcadena no se
encuentra en la cadena. Ejemplo:
select locale('o','como le va');
retorna 2.
- position(subcadena in cadena): funciona como "locate()". Devuelve "0" si la su
bcadena no se encuentra en la cadena. Ejemplo:
select position('o' in 'como le va');
retorna 2.
- locate(subcadena,cadena,posicioninicial): retorna la posicin de la primera ocur
rencia de la subcadena enviada como primer argumentos en la cadena enviada como
segundo argumento, empezando en la posicin enviada como tercer argumento. Devuelv
e "0" si la subcadena no se encuentra en la cadena. Ejemplos:
select locate('ar','Margarita',1);
retorna 1.
select locate('ar','Margarita',3);
retorna 5.
- instr(cadena,subcadena): retorna la posicin de la primera ocurrencia de la subc
adena enviada como segundo argumento en la cadena enviada como primer argumento.
Ejemplo:
select instr('como le va','om');
devuelve 2.
- lpad(cadena,longitud,cadenarelleno): retorna la cadena enviada como primer arg
umento, rellenada por la izquierda con la cadena enviada como tercer argumento h
asta que la cadena retornada tenga la longitud especificada como segundo argumen
to. Si la cadena es ms larga, la corta. Ejemplo:
select lpad('hola',10,'0');
retorna "000000hola".
- rpad(cadena,longitud,cadenarelleno): igual que "lpad" excepto que rellena por
la derecha.
- left(cadena,longitud): retorna la cantidad (longitud) de caracteres de la cade
na comenzando desde la inquierda, primer caracter. Ejemplo:
select left('buenos dias',8);
retorna "buenos d".
- right(cadena,longitud): retorna la cantidad (longitud) de caracteres de la cad
ena comenzando desde la derecha, ltimo caracter. Ejemplo:
select right('buenos dias',8);
retorna "nos dias".
- substring(cadena,posicion,longitud): retorna una subcadena de tantos caractere
s de longitud como especifica en tercer argumento, de la cadena enviada como pri
mer argumento, empezando desde la posicin especificada en el segundo argumento. E
jemplo:
select substring('Buenas tardes',3,5);
retorna "enas".
- substring(cadena from posicion for longitud): variante de "substring(cadena,po
sicion,longitud)". Ejemplo:
select substring('Buenas tardes' from 3 for 5);
- mid(cadena,posicion,longitud): igual que "substring(cadena,posicion,longitud)"
. Ejemplo:
select mid('Buenas tardes' from 3 for 5);
retorna "enas".
- substring(cadena,posicion): retorna la subcadena de la cadena enviada como arg
umento, empezando desde la posicin indicada por el segundo argumento. Ejemplo:
select substring('Margarita',4);
retorna "garita".
-substring(cadena from posicion): variante de "substring(cadena,posicion)". Ejem
plo:
select substring('Margarita' from 4);
retorna "garita".
-substring_index(cadena,delimitador,ocurrencia): retorna la subcadena de la cade
na enviada como argumento antes o despus de la "ocurrencia" de la cadena enviada
como delimitador. Si "ocurrencia" es positiva, retorna la subcadena anterior al
delimitador (comienza desde la izquierda); si "ocurrencia" es negativa, retorna
la subcadena posterior al delimitador (comienza desde la derecha). Ejemplo:
select substring_index( 'margarita','ar',2);
retorna "marg", todo lo anterior a la segunda ocurrencia de "ar".
select substring_index( 'margarita','ar',-2);
retorna "garita", todo lo posterior a la segunda ocurrencia de "ar".
-ltrim(cadena): retorna la cadena con los espacios de la izquierda eliminados. E
jemplo:
select ltrim(' Hola ');
retorna
"Hola "
.
- rtrim(cadena): retorna la cadena con los espacios de la derecha eliminados. Ej
emplo:
select rtrim(' Hola ');
retorna
" Hola"
.
-trim([[both|leading|trailing] [subcadena] from] cadena): retorna una cadena igu
al a la enviada pero eliminando la subcadena prefijo y/o sufijo. Si no se indica
ningn especificador (both, leading o trailing) se asume "both" (ambos). Si no se
especifica prefijos o sufijos elimina los espacios. Ejemplos:
select trim(' Hola ');
retorna 'Hola'.
select trim (leading '0' from '00hola00');
retorna "hola00".
select trim (trailing '0' from '00hola00');
retorna "00hola".
select trim (both '0' from '00hola00');
retorna "hola".
select trim ('0' from '00hola00');
retorna "hola".
select trim (' hola ');
retorna "hola".
-replace(cadena,cadenareemplazo,cadenareemplazar): retorna la cadena con todas l
as ocurrencias de la subcadena reemplazo por la subcadena a reemplazar. Ejemplo:
select replace('xxx.mysql.com','x','w');
retorna "www.mysql.com'.
-repeat(cadena,cantidad): devuelve una cadena consistente en la cadena repetida
la cantidad de veces especificada. Si "cantidad" es menor o igual a cero, retorn
a una cadena vaca. Ejemplo:
select repeat('hola',3);
retorna "holaholahola".
-reverse(cadena): devuelve la cadena invirtiendo el order de los caracteres. Eje
mplo:
select reverse('Hola');
retorna "aloH".
-insert(cadena,posicion,longitud,nuevacadena): retorna la cadena con la nueva ca
dena colocndola en la posicin indicada por "posicion" y elimina la cantidad de car
acteres indicados por "longitud". Ejemplo:
select insert('buenas tardes',2,6,'xx');
retorna ""bxxtardes".
-lcase(cadena) y lower(cadena): retornan la cadena con todos los caracteres en m
insculas. Ejemplo:
select lower('HOLA ESTUDIAnte');
retorna "hola estudiante".
select lcase('HOLA ESTUDIAnte');
retorna "hola estudiante".
-ucase(cadena) y upper(cadena): retornan la cadena con todos los caracteres en m
aysculas. Ejemplo:
select upper('HOLA ESTUDIAnte');
retorna "HOLA ESTUDIANTE".
select ucase('HOLA ESTUDIAnte');
retorna "HOLA ESTUDIANTE".
-strcmp(cadena1,cadena2): retorna 0 si las cadenas son iguales, -1 si la primera
es menor que la segunda y 1 si la primera es mayor que la segunda. Ejemplo:
select strcmp('Hola','Chau');
retorna 1.
<------------------------------------------------------------------>
26 - Funciones matemticas.
Los operadores aritmticos son "+","-","*" y "/". Todas las operaciones matemticas
retornan "null" en caso de error. Ejemplo:
select 5/0;
MySQL tiene algunas funciones para trabajar con nmeros. Aqu presentamos algunas.
RECUERDE que NO debe haber espacios entre un nombre de funcin y los parntesis porq
ue MySQL puede confundir una llamada a una funcin con una referencia a una tabla
o campo que tenga el mismo nombre de una funcin.
-abs(x): retorna el valor absoluto del argumento "x". Ejemplo:
select abs(-20);
retorna 20.
-ceiling(x): redondea hacia arriba el argumento "x". Ejemplo:
select ceiling(12.34),
retorna 13.
-floor(x): redondea hacia abajo el argumento "x". Ejemplo:
select floor(12.34);
retorna 12.
-greatest(x,y,..): retorna el argumento de mximo valor.
-least(x,y,...): con dos o ms argumentos, retorna el argumento ms pequeo.
-mod(n,m): significa "mdulo aritmtico"; retorna el resto de "n" dividido en "m". E
jemplos:
select mod(10,3);
retorna 1.
select mod(10,2);
retorna 0.
- %: %: devuelve el resto de una divisin. Ejemplos:
select 10%3;
retorna 1.
select 10%2;
retorna 0.
-power(x,y): retorna el valor de "x" elevado a la "y" potencia. Ejemplo:
select power(2,3);
retorna 8.
-rand(): retorna un valor de coma flotante aleatorio dentro del rango 0 a 1.0.
-round(x): retorna el argumento "x" redondeado al entero ms cercano. Ejemplos:
select round(12.34);
retorna 12.
select round(12.64);
retorna 13.
-srqt(): devuelve la raiz cuadrada del valor enviado como argumento.
-truncate(x,d): retorna el nmero "x", truncado a "d" decimales. Si "d" es 0, el r
esultado no tendr parte fraccionaria. Ejemplos:
select truncate(123.4567,2);
retorna 123.45;
select truncate (123.4567,0);
retorna 123.
Todas retornan null en caso de error.
<------------------------------------------------------------------->
27 - Funciones para el uso de fecha y hora.
MySQL tiene algunas funciones para trabajar con fechas y horas. Estas son alguna
s:
-adddate(fecha, interval expresion): retorna la fecha agregndole el intervalo esp
ecificado. Ejemplos: adddate('2006-10-10',interval 25 day) retorna "2006-11-04".
adddate('2006-10-10',interval 5 month) retorna "2007-03-10".
-adddate(fecha, dias): retorna la fecha agregndole a fecha "dias". Ejemplo: addda
te('2006-10-10',25), retorna "2006-11-04".
-addtime(expresion1,expresion2): agrega expresion2 a expresion1 y retorna el res
ultado.
-current_date: retorna la fecha de hoy con formato "YYYY-MM-DD" o "YYYYMMDD".
-current_time: retorna la hora actual con formato "HH:MM:SS" o "HHMMSS".
-date_add(fecha,interval expresion tipo) y date_sub(fecha,interval expresion tip
o): el argumento "fecha" es un valor "date" o "datetime", "expresion" especifica
el valor de intervalo a ser aadido o substrado de la fecha indicada (puede empeza
r con "-", para intervalos negativos), "tipo" indica la medida de adicin o substr
accin. Ejemplo: date_add('2006-08-10', interval 1 month) retorna "2006-09-10"; da
te_add('2006-08-10', interval -1 day) retorna "2006-09-09"; date_sub('2006-08-10
18:55:44', interval 2 minute) retorna "2006-08-10 18:53:44"; date_sub('2006-08-
10 18:55:44', interval '2:3' minute_second) retorna "2006-08-10 18:52:41". Los v
alores para "tipo" pueden ser: second, minute, hour, day, month, year, minute_se
cond (minutos y segundos), hour_minute (horas y minutos), day_hour (das y horas),
year_month (ao y mes), hour_second (hora, minuto y segundo), day_minute (dias, h
oras y minutos), day_second(dias a segundos).
-datediff(fecha1,fecha2): retorna la cantidad de das entre fecha1 y fecha2.
-dayname(fecha): retorna el nombre del da de la semana de la fecha. Ejemplo: dayn
ame('2006-08-10') retorna "thursday".
-dayofmonth(fecha): retorna el da del mes para la fecha dada, dentro del rango 1
a 31. Ejemplo: dayofmonth('2006-08-10') retorna 10.
-dayofweek(fecha): retorna el ndice del da de semana para la fecha pasada como arg
umento. Los valores de los ndices son: 1=domingo, 2=lunes,... 7=sbado). Ejemplo: d
ayofweek('2006-08-10') retorna 5, o sea jueves.
-dayofyear(fecha): retorna el da del ao para la fecha dada, dentro del rango 1 a 3
66. Ejemplo: dayofmonth('2006-08-10') retorna 222.
-extract(tipo from fecha): extrae partes de una fecha.
Ejemplos:
extract(year from '2006-10-10'), retorna "2006".
extract(year_month from '2006-10-10 10:15:25') retorna "200610".
extract(day_minute from '2006-10-10 10:15:25') retorna "101015";
Los valores para tipo pueden ser: second, minute, hour, day, month, year, minute
_second, hour_minute, day_hour, year_month, hour_second (horas, minutos y segund
os), day_minute (das, horas y minutos), day_second (das a segundos).
-hour(hora): retorna la hora para el dato dado, en el rango de 0 a 23.
Ejemplo: hour('18:25:09') retorna "18";
-minute(hora): retorna los minutos de la hora dada, en el rango de 0 a 59.
-monthname(fecha): retorna el nombre del mes de la fecha dada.
Ejemplo: monthname('2006-08-10') retorna "August".
-month(fecha): retorna el mes de la fecha dada, en el rango de 1 a 12.
-now() y sysdate(): retornan la fecha y hora actuales.
-period_add(p,n): agrega "n" meses al periodo "p", en el formato "YYMM" o "YYYYM
M"; retorna un valor en el formato "YYYYMM". El argumento "p" no es una fecha, s
ino un ao y un mes. Ejemplo: period_add('200608',2) retorna "200610".
-period_diff(p1,p2): retorna el nmero de meses entre los perodos "p1" y "p2", en e
l formato "YYMM" o "YYYYMM". Los argumentos de perodo no son fechas sino un ao y u
n mes. Ejemplo: period_diff('200608','200602') retorna 6.
-second(hora): retorna los segundos para la hora dada, en el rango de 0 a 59.
-sec_to_time(segundos): retorna el argumento "segundos" convertido a horas, minu
tos y segundos. Ejemplo: sec_to_time(90) retorna "1:30".
-timediff(hora1,hora2): retorna la cantidad de horas, minutos y segundos entre h
ora1 y hora2.
-time_to_sec(hora): retorna el argumento "hora" convertido en segundos.
-to_days(fecha): retorna el nmero de da (el nmero de da desde el ao 0).
-weekday(fecha): retorna el ndice del da de la semana para la fecha pasada como ar
gumento. Los ndices son: 0=lunes, 1=martes,... 6=domingo). Ejemplo: weekday('2006
-08-10') retorna 3, o sea jueves.
-year(fecha): retorna el ao de la fecha dada, en el rango de 1000 a 9999. Ejemplo
: year('06-08-10') retorna "2006".
Problema :
Una empresa registra los datos de sus empleados en una tabla llamada "empleados"
.
1- Elimine la tabla "empleados" si existe.
2- Cree la tabla:
create table empleados(
documento char(8) not null,
nombre varchar(30) not null,
sexo char(1),
domicilio varchar(30),
fechaIngreso date,
fechaNacimiento date,
sueldoBasico decimal(5,2) unsigned,
primary key(documento)
);
3- Ingrese algunos registros:
insert into empleados (documento,nombre,sexo,domicilio,fechaIngreso,fechaNacimi
ento,sueldoBasico)
values ('22333111','Juan Perez','m','Colon 123','1990-02-01','1970-05-10',550)
;
insert into empleados (documento,nombre,sexo,domicilio,fechaIngreso,fechaNacimi
ento,sueldoBasico)
values ('25444444','Susana Morales','f','Avellaneda 345','1995-04-01','1975-11
-06',650);
insert into empleados (documento,nombre,sexo,domicilio,fechaIngreso,fechaNacimi
ento,sueldoBasico)
values ('20111222','Hector Pereyra','m','Caseros 987','1995-04-01','1965-03-25
',510);
insert into empleados (documento,nombre,sexo,domicilio,fechaIngreso,fechaNacimi
ento,sueldoBasico)
values ('30000222','Luis Luque','m','Urquiza 456','1980-09-01','1980-03-29',70
0);
insert into empleados (documento,nombre,sexo,domicilio,fechaIngreso,fechaNacimi
ento,sueldoBasico)
values ('20555444','Maria Laura Torres','f','San Martin 1122','2000-05-15','19
65-12-22',700);
insert into empleados (documento,nombre,sexo,domicilio,fechaIngreso,fechaNacimi
ento,sueldoBasico)
values ('30000234','Alberto Soto','m','Peru 232','2003-08-15','1989-10-10',420
);
insert into empleados (documento,nombre,sexo,domicilio,fechaIngreso,fechaNacimi
ento,sueldoBasico)
values ('20125478','Ana Gomez','f','Sarmiento 975','2004-06-14','1976-09-21',3
50);
insert into empleados (documento,nombre,sexo,domicilio,fechaIngreso,fechaNacimi
ento,sueldoBasico)
values ('24154269','Ofelia Garcia','f','Triunvirato 628','2004-09-23','1974-05
-12',390);
insert into empleados (documento,nombre,sexo,domicilio,fechaIngreso,fechaNacimi
ento,sueldoBasico)
values ('306154269','Federico Gonzalez','m','Peru 390','1996-08-15','1985-05-0
1',580);
4- Es poltica de la empresa festejar cada fin de mes, los cumpleaos de todos los e
mpleados que
cumplen ese mes. Necesitamos los nombres y fecha de nacimiento de los empleados
que cumplen aos en
el mes de mayo:
select nombre,fechaNacimiento from empleados
where month(fechaNacimiento)=5;
5- Tambin es poltica de la empresa, aumentar el 1% del sueldo bsico a los empleados
, cada vez
que cumplen un ao ms de servicio. Necesitamos los nombres, fecha de ingreso a la e
mpresa y sueldo
bsico de todos los empleados que cumplen un ao ms de servicio en el mes de agosto,
y una columna
calculando el incremento del sueldo:
select nombre,fechaIngreso,sueldoBasico,
(sueldoBasico+sueldoBasico*0.01) as 'Sueldo Incrementado'
from empleados
where month(fechaIngreso)=8;
6- Actualizamos el sueldo aumentando el 1% a los empleados que cumplen un ao de s
ervicio en el mes
de agosto:
select nombre,fechaIngreso,sueldoBasico,
(sueldoBasico+sueldoBasico*0.01) as 'Sueldo Incrementado'
from empleados
where month(fechaIngreso)=8;
7- Verifique si la actualizacin se realiz:
select nombre, sueldobasico
from empleados
where month(fechaIngreso)=8;
8- Si el empleado cumple 10,20,30,40... aos de servicio, se le regala una placa r
ecordatoria. La
secretaria de Gerencia necesita saber la cantidad de aos de servicio que cumplen
los empleados que
ingresaron en el mes de agosto para encargar dichas placas:
select nombre,fechaIngreso,
year(current_date)-year(fechaIngreso) as 'Aos de servicio'
from empleados
where month(fechaIngreso)=8;
En la sentencia anterior, extraemos el ao de las fechas actual y de ingreso con l
a funcin "year
()" y las restamos, para calcular los aos de servicio.
Segundo problema:
A) Un instituto de enseanza almacena los datos de sus estudiantes en una tabla ll
amada "alumnos".
1- Elimine la tabla "alumnos" si existe.
2- Cree la tabla con la siguiente estructura:
create table alumnos(
documento char(8) not null,
nombre varchar(30),
domicilio varchar(30),
fechaNacimiento date,
primary key (documento)
);
3- Ingrese los siguientes registros:
insert into alumnos (documento,nombre,domicilio,fechaNacimiento)
values('22345345','Mariana Perez','Colon 234','1986-10-08');
insert into alumnos (documento,nombre,domicilio,fechaNacimiento)
values('23545345','Marcos Morales','Avellaneda 348','1985-12-18');
insert into alumnos (documento,nombre,domicilio,fechaNacimiento)
values('24356345','Analia Gonzalez','Caseros 444','1976-06-28');
insert into alumnos (documento,nombre,domicilio,fechaNacimiento)
values('20254125','Ramiro Torres','Dinamarca 209','1978-01-28');
insert into alumnos (documento,nombre,domicilio,fechaNacimiento)
values('20445778','Carmen Miranda','Uspallata 999','1980-05-30');
insert into alumnos (documento,nombre,domicilio,fechaNacimiento)
values('28111444','Natalia Figueroa','Sarmiento 856','1986-04-29');
4- El institulo quiere conocer las edades de los alumnos:
select nombre, fechaNacimiento, current_date as 'Fecha actual',
(year(current_date)-year(fechaNacimiento)) -
(right(current_date,5)<right(fechaNacimiento,5)) as 'Edad'
from alumnos;
En la sentencia anterior con "year()" extraemos la parte correspondiente al ao de
ambas fechas
(actual y de nacimiento) y con "right()" extraemos los 5 primeros caracteres que
representan la
parte del mes y da de ambas fechas; la comparacin retorna 1 0, lo que corresponde
a la
diferencia de 1 ao a restar de la edad si el dia de la fecha actual es anterior q
ue la fecha de
nacimiento. Finalmente, se coloca un alias para usar como ttulo de la columna par
a hacerlo ms
comprensible.
Tercer Problema:
B) La empresa que provee de luz a los usuarios de un municipio la luz. Almacena
en una tabla
algunos datos de los usuarios:
- documento, cadena siempre de 8 caracteres, no nulo,
- monto a pagar, valor con decimales positivo,
- fecha de vencimiento.
Si la boleta no se paga hasta el da del vencimiento, inclusive, se incrementa al
monto, un 1% del
monto cada da de atraso.
1- Elimine la tabla, si existe.
2- Cree la tabla.
3- Ingrese algunos registros con fechas de vencimiento anterior a la fecha actua
l (vencidas) y
posteriores a la fecha actual (no vencidas).
4- Muestre el documento del usuario, la fecha de vencimiento, la fecha actual (e
n que efecta el
pago), el monto, la cantidad de das de atraso (respecto de la fecha de vencimient
o), el recargo y
el total a pagar con el recargo:
select documento,fechavencimiento,
current_date as 'Fecha Pago',
monto,
datediff(current_date,fechavencimiento) as 'Retraso en dias',
(monto*0.01*datediff(current_date,fechavencimiento)) as 'Recargo',
monto+((monto*0.01)*datediff(current_date,fechavencimiento)) as 'Total a Pagar
'
from luz
where datediff(current_date,fechavencimiento)>0;
"datediff()" retorna la cantidad de das entre una fecha y otra; si la fecha envia
da como primer
argumento es anterior a la del segundo argumento, retorna un valor negativo. Por
eso, en la
sentencia anterior colocamos la condicin "where", si la obviamos, descontar el 1%
del monto por
cada da de diferencia entre la fecha de vencimiento y la fecha actual.
Cuarto Problema:
C-) En una pgina web se solicitan los siguientes datos para guardar informacin de
sus visitas:
nombre, mail, pais.
1- Elimine la tabla "visitas", si existe.
2- Crela con la siguiente estructura:
create table visitas (
numero int unsigned auto_increment,
nombre varchar(30) not null,
mail varchar(50),
pais varchar (20),
fecha datetime,
primary key(numero)
);
3- Ingrese algunos registros:
insert into visitas (nombre,mail,fecha)
values ('Ana Maria Lopez','AnaMaria@hotmail.com','2006-10-10 10:10');
insert into visitas (nombre,mail,fecha)
values ('Gustavo Gonzalez','GustavoGGonzalez@hotmail.com','2006-10-10 21:30');
insert into visitas (nombre,mail,fecha)
values ('Juancito','JuanJosePerez@hotmail.com','2006-10-11 15:45');
insert into visitas (nombre,mail,fecha)
values ('Fabiola Martinez','MartinezFabiola@hotmail.com','2006-10-12 08:15');
insert into visitas (nombre,mail,fecha)
values ('Fabiola Martinez','MartinezFabiola@hotmail.com','2006-09-12 20:45');
insert into visitas (nombre,mail,fecha)
values ('Juancito','JuanJosePerez@hotmail.com','2006-09-12 16:20');
insert into visitas (nombre,mail,fecha)
values ('Juancito','JuanJosePerez@hotmail.com','2006-09-15 16:25');
4- Se necesita el nombre de los usuarios y la hora de visita:
select nombre,time(fecha) from visitas;
5- Se necesita conocer el nombre de los usuarios y el nombre del mes de cada vis
ita:
select nombre,monthname(fecha)
from visitas;
6- Se necesita saber la cantidad de visitas por da (lunes, martes...), mostrando
el nombre del da:
select dayname(fecha),count(*)
from visitas
group by dayname(fecha);
<------------------------------------------------------------------->
28 - Clusula order by del select.
Podemos ordenar el resultado de un "select" para que los registros se muestren o
rdenados por algn campo, para ello usamos la clusula "order by".
Por ejemplo, recuperamos los registros de la tabla "libros" ordenados por el ttul
o:
select codigo,titulo,autor,editorial,precio from libros order by titulo;
Aparecen los registros ordenados alfabticamente por el campo especificado.
Tambin podemos colocar el nmero de orden del campo por el que queremos que se orde
ne en lugar de su nombre. Por ejemplo, queremos el resultado del "select" ordena
do por "precio":
select codigo,titulo,autor,editorial,precio from libros order by 5;
Por defecto, si no aclaramos en la sentencia, los ordena de manera ascendente (d
e menor a mayor). Podemos ordenarlos de mayor a menor, para ello agregamos la pa
labra clave "desc":
select codigo,titulo,autor,editorial,precio from libros order by editorial desc;
Tambin podemos ordenar por varios campos, por ejemplo, por "titulo" y "editorial"
:
select codigo,titulo,autor,editorial,precio from libros order by titulo, editori
al;
Incluso, podemos ordenar en distintos sentidos, por ejemplo, por "titulo" en sen
tido ascendente y "editorial" en sentido descendente:
select codigo,titulo,autor,editorial,precio
from libros order by titulo asc, editorial desc;
Debe aclararse al lado de cada campo, pues estas palabras claves afectan al camp
o inmediatamente anterior.
Problema :
Trabaje con la tabla llamada "medicamentos" que almacena la informacin de los pro
ductos que vende
una farmacia.
1- Elimine la tabla, si existe.
2- Cree la tabla con la siguiente estructura:
create table medicamentos(
codigo int unsigned auto_increment,
nombre varchar(20),
laboratorio varchar(20),
precio decimal(5,2),
cantidad int unsigned,
primary key(codigo)
);
3- Visualice la estructura de la tabla "medicamentos".
4- Ingrese los siguientes registros (insert into):
insert into medicamentos (nombre, laboratorio,precio,cantidad)
values('Sertal','Roche',5.2,100);
insert into medicamentos (nombre, laboratorio,precio,cantidad)
values('Buscapina','Roche',4.10,200);
insert into medicamentos (nombre, laboratorio,precio,cantidad)
values('Amoxidal 500','Bayer',15.60,100);
insert into medicamentos (nombre, laboratorio,precio,cantidad)
values('Paracetamol 500','Bago',1.90,200);
insert into medicamentos (nombre, laboratorio,precio,cantidad)
values('Bayaspirina','Bayer',2.10,150);
insert into medicamentos (nombre, laboratorio,precio,cantidad)
values('Amoxidal jarabe','Bayer',5.10,250);
5- Ordene los registros por precio, de mayor a menor.
6- Ordene los medicamentos por nmero del campo "cantidad".
7- Ordene los registros por "laboratorio" (descendente) y cantidad (ascendente).
Segundo problema:
A) Trabaje con la tabla "peliculas" que guarda informacin de pelculas de video en
alquiler.
1- Elimine la tabla, si existe.
2- Crela con la siguiente estructura:
-codigo (entero, sin signo, autoincrementable),
-titulo (cadena de 40),
-actor (cadena de 20),
-duracion (integer sin signo, mximo valor 200 aprox.),
-clave primaria (codigo).
3- Visualice la estructura de la tabla "peliculas".
4- Ingrese los siguientes registros:
insert into peliculas (titulo,actor,duracion)
values('Mision imposible','Tom Cruise',120);
insert into peliculas (titulo,actor,duracion)
values('Harry Potter y la piedra filosofal','Daniel R.',180);
insert into peliculas (titulo,actor,duracion)
values('Harry Potter y la camara secreta','Daniel R.',190);
insert into peliculas (titulo,actor,duracion)
values('Mision imposible 2','Tom Cruise',120);
insert into peliculas (titulo,actor,duracion)
values('Mujer bonita','Richard Gere',120);
insert into peliculas (titulo,actor,duracion)
values('Tootsie','D. Hoffman',90);
insert into peliculas (titulo,actor,duracion)
values('Un oso rojo','Julio Chavez',100);
5- Ordene los registros por el campo "actor".
6- Muestre las pelculas ordenadas por la duracin, de mayor a menor.
Tercer Problema:
B) En una pgina web se solicitan los siguientes datos para guardar informacin de s
us visitas.
1- Elimine la tabla "visitas", si existe.
2- Crela con la siguiente estructura:
create table visitas (
numero int unsigned auto_increment,
nombre varchar(30) not null,
mail varchar(50),
pais varchar (20),
fecha date,
primary key(numero)
);
3- Ingrese algunos registros:
insert into visitas (nombre,mail,fecha)
values ('Ana Maria Lopez','AnaMaria@hotmail.com','2006-10-10');
insert into visitas (nombre,mail,fecha)
values ('Gustavo Gonzalez','GustavoGGonzalez@hotmail.com','2006-10-10');
insert into visitas (nombre,mail,fecha)
values ('Juancito','JuanJosePerez@hotmail.com','2006-10-11');
insert into visitas (nombre,mail,fecha)
values ('Fabiola Martinez','MartinezFabiola@hotmail.com','2006-10-12');
insert into visitas (nombre,mail,fecha)
values ('Fabiola Martinez','MartinezFabiola@hotmail.com','2006-09-12');
insert into visitas (nombre,mail,fecha)
values ('Juancito','JuanJosePerez@hotmail.com','2006-09-12');
insert into visitas (nombre,mail,fecha)
values ('Juancito','JuanJosePerez@hotmail.com','2006-09-15');
4- Ordene los rergistros por fecha, en orden descendente:
select * from visitas
order by fecha desc;
5- Ordene por nombre en forma ascendente y fecha en orden descendente:
select * from visitas
order by nombre asc,fecha asc;
<------------------------------------------------------------------>
29 - Operadores Lgicos (and - or - not)
Hasta el momento, hemos aprendido a establer una condicin con "where" utilizando
operadores relacionales. Podemos establecer ms de una condicin con la clusula "wher
e", para ello aprenderemos los operadores lgicos.
Son los siguientes:
- and, significa "y",
- or, significa "y/o",
- xor, significa "o",
- not, significa "no", invierte el resultado
- (), parntesis
Los operadores lgicos se usan para combinar condiciones.
Queremos recuperar todos los registros cuyo autor sea igual a "Borges" y cuyo pr
ecio no supere los 20 pesos, para ello necesitamos 2 condiciones:
select * from libros
where (autor='Borges') and
(precio<=20);
Los registros recuperados en una sentencia que une 2 condiciones con el operador
"and", cumplen con las 2 condiciones.
Queremos ver los libros cuyo autor sea "Borges" y/o cuya editorial sea "Planeta"
:
select * from libros
where autor='Borges' or
editorial='Planeta';
En la sentencia anterior usamos el operador "or", indicamos que recupere los lib
ros en los cuales el valor del campo "autor" sea "Borges" y/o el valor del campo
"editorial" sea "Planeta", es decir, seleccionar los registros que cumplan con l
a primera condicin, con la segunda condicin o con ambas condiciones.
Los registros recuperados con una sentencia que une 2 condiciones con el operado
r "or", cumplen 1 de las condiciones o ambas.
Queremos ver los libros cuyo autor sea "Borges" o cuya editorial sea "Planeta":
select * from libros
where (autor='Borges') xor
(editorial='Planeta');
En la sentencia anterior usamos el operador "xor", indicamos que recupere los li
bros en los cuales el valor del campo "autor" sea "Borges" o el valor del campo
"editorial" sea "Planeta", es decir, seleccionar los registros que cumplan con la
primera condicin o con la segunda condicin pero no los que cumplan con ambas cond
iciones. Los registros recuperados con una sentencia que une 2 condiciones con e
l operador "xor", cumplen 1 de las condiciones, no ambas.
Queremos recuperar los libros que no cumplan la condicin dada, por ejemplo, aquel
los cuya editorial NO sea "Planeta":
select * from libros
where not (editorial='Planeta');
El operador "not" invierte el resultado de la condicin a la cual antecede.
Los registros recuperados en una sentencia en la cual aparece el operador "not",
no cumplen con la condicin a la cual afecta el "NO".
Los parntesis se usan para encerrar condiciones, para que se evalen como una sola
expresin.
Cuando explicitamos varias condiciones con diferentes operadores lgicos (combinam
os "and", "or") permite establecer el orden de prioridad de la evaluacin; adems pe
rmite diferenciar las expresiones ms claramente.
Por ejemplo, las siguientes expresiones devuelven un resultado diferente:
select * from libros
where (autor='Borges') or
(editorial='Paidos' and precio<20);
select*from libros
where (autor='Borges' or editorial='Paidos') and
(precio<20);
Si bien los parntesis no son obligatorios en todos los casos, se recomienda utili
zarlos para evitar confusiones.
El orden de prioridad de los operadores lgicos es el siguiente: "not" se aplica a
ntes que "and" y "and" antes que "or", si no se especifica un orden de evaluacin
mediante el uso de parntesis.
El orden en el que se evalan los operadores con igual nivel de precedencia es ind
efinido, por ello se recomienda usar los parntesis.

Problema :
Trabaje con la tabla llamada "medicamentos" de una farmacia.
1- Elimine la tabla, si existe.
2- Cree la tabla con la siguiente estructura:
create table medicamentos(
codigo int unsigned auto_increment,
nombre varchar(20),
laboratorio varchar(20),
precio decimal(5,2) unsigned,
cantidad int unsigned,
primary key(codigo)
);
3- Visualice la estructura de la tabla "medicamentos".
4- Ingrese los siguientes registros (insert into):
insert into medicamentos (nombre, laboratorio,precio,cantidad)
values('Sertal','Roche',5.2,100);
insert into medicamentos (nombre, laboratorio,precio,cantidad)
values('Buscapina','Roche',4.10,200);
insert into medicamentos (nombre, laboratorio,precio,cantidad)
values('Amoxidal 500','Bayer',15.60,100);
insert into medicamentos (nombre, laboratorio,precio,cantidad)
values('Paracetamol 500','Bago',1.90,200);
insert into medicamentos (nombre, laboratorio,precio,cantidad)
values('Bayaspirina','Bayer',2.10,150);
insert into medicamentos (nombre, laboratorio,precio,cantidad)
values('Amoxidal jarabe','Bayer',5.10,250);
5- Recupere los cdigos y nombres de los medicamentos cuyo laboratorio sea 'Roche'
y cuyo precio
sea menor a 5:
select codigo,nombre
from medicamentos
where laboratorio='Roche' and
precio<5;
Qued seleccionado 1 registro, es el nico que cumple con ambas condiciones.
6- Recupere los medicamentos cuyo laboratorio sea 'Roche' o cuyo precio sea meno
r a 5:
select * from medicamentos
where laboratorio='Roche' or
precio<5;
Note que la salida es diferente, hemos cambiado el operador de la sentencia ante
rior. Ahora se
recuperaron todos los registros cuyo laboratorio es igual a 'Roche' y todos los
registros cuyo
precio es menor a 5. Aquellos registros que no cumplieron con la condicin 1 (no s
on de "Roche") ni
con la condicion2 (no cuestan menos de 5) no aparecen.
7- Muestre todos los registros que no sean de "Bayer" usando el operador "not".
8- Muestre todos los medicamentos cuyo laboratorio NO sea "Bayer" y cuya cantida
d sea=100:
select * from medicamentos
where not laboratorio='Bayer' and
cantidad=100;
9- Muestre todos los medicamentos cuyo laboratorio sea "Bayer" y cuya cantidad N
O sea=100:
select * from medicamentos
where laboratorio='Bayer' and
not cantidad=100;
Analice estas 2 ltimas sentencias. El operador "not" afecta a la condicin a la cua
l antecede, no
a las siguientes. Los resultados de estas 2 sentencias son diferentes.
10- Elimine todos los registros cuyo laboratorio sea igual a "Bayer" y su precio
sea mayor a 10:
delete from medicamentos
where laboratorio='Bayer' and
precio>10;
Slo 1 registro debe ser eliminado, el que cumple con ambas condiciones.
11- Cambie la cantidad por 200, a todos los medicamentos de "Roche" cuyo precio
sea mayor a 5:
update medicamentos set cantidad=200
where laboratorio='Roche' and
precio>5;
Un solo registro fue actualizado porque slo uno cumpli con las condiciones especif
icadas.
12- Borre los medicamentos cuyo laboratorio sea "Bayer" o cuyo precio sea menor
a 3. Antes veamos
cules cumplen con la condicin, los registros 5 y 6 son de "Bayer, cumplen con la p
rimera
condicin, los registros 4 y 5 cumplen con la segunda condicin, es decir, se borrarn
3 registros:
el 4 porque cumple con la segunda condicin, el 5 porque cumple con ambas y el 6 p
orque cumple con
la primera. Tipeamos:
delete from medicamentos
where laboratorio='Bayer' or
precio<3;
Segundo problema:
A) Trabajamos con la tabla "peliculas" de un video club que alquila pelculas en v
ideo.
1- Elimine la tabla, si existe.
2- Crela con la siguiente estructura:
-codigo (entero sin signo, autoincrementable),
-titulo (cadena de 30),
-actor (cadena de 20),
-duracion (entero sin signo no mayor a 200),
-clave primaria (codigo).
3- Ingrese los siguientes registros:
insert into peliculas (titulo,actor,duracion)
values('Mision imposible','Tom Cruise',120);
insert into peliculas (titulo,actor,duracion)
values('Harry Potter y la piedra filosofal','Daniel R.',180);
insert into peliculas (titulo,actor,duracion)
values('Harry Potter y la camara secreta','Daniel R.',190);
insert into peliculas (titulo,actor,duracion)
values('Mision imposible 2','Tom Cruise',120);
insert into peliculas (titulo,actor,duracion)
values('Mujer bonita','Richard Gere',120);
insert into peliculas (titulo,actor,duracion)
values('Tootsie','D. Hoffman',90);
insert into peliculas (titulo,actor,duracion)
values('Un oso rojo','Julio Chavez',100);
insert into peliculas (titulo,actor,duracion)
values('Elsa y Fred','China Zorrilla',110);
4- Recupere los registros cuyo actor sea "Tom Cruise" or "Richard Gere". (3 regi
stros).
5- Recupere los registros cuyo actor sea "Tom Cruise" y "Richard Gere".
(ninguno cumple ambas condiciones).
6- Cambie la duracin a 200, de las pelculas cuyo actor sea "Daniel R." y cuya dura
cin sea 180.
(1 registro afectado).
8- Borre todas las pelculas donde el actor NO sea "Tom Cruise" y cuya duracin sea
mayor o igual a
100:
delete from peliculas
where not actor='Tom Cruise' and
duracion<=100;
Deben borrarse 2 registros.

Tercer Problema:
B) En una pgina web se solicitan los siguientes datos para guardar informacin de s
us visitas:
nombre, mail, pais.
1- Elimine la tabla "visitas", si existe.
2- Crela con la siguiente estructura:
create table visitas (
numero int unsigned auto_increment,
nombre varchar(30) not null,
mail varchar(50),
pais varchar (20),
fecha datetime,
primary key(numero)
);
3- Ingrese algunos registros:
insert into visitas (nombre,mail,pais,fecha)
values ('Ana Maria Lopez','AnaMaria@hotmail.com','Argentina','2006-10-10 10:10
');
insert into visitas (nombre,mail,pais,fecha)
values ('Gustavo Gonzalez','GustavoGGonzalez@hotmail.com','Chile','2006-10-10
21:30');
insert into visitas (nombre,mail,pais,fecha)
values ('Juancito','JuanJosePerez@hotmail.com','Argentina','2006-10-11 15:45')
;
insert into visitas (nombre,mail,pais,fecha)
values ('Fabiola Martinez','MartinezFabiola@hotmail.com','Mexico','2006-10-12
08:15');
insert into visitas (nombre,mail,pais,fecha)
values ('Fabiola Martinez','MartinezFabiola@hotmail.com','Mexico','2006-09-12
20:45');
insert into visitas (nombre,mail,pais,fecha)
values ('Juancito','JuanJosePerez@hotmail.com','Argentina','2006-09-12 16:20')
;
insert into visitas (nombre,mail,pais,fecha)
values ('Juancito','JuanJosePerez@hotmail.com','Argentina','2006-09-15 16:25')
;
4- Muestre los datos de las visitas de "Argentina" que hayan ingresado despus del
mes de
septiembre (9):
select*from visitas
where pais='Argentina' and
month(fecha)>9;
5- Elimine todos los registros cuyo pais no sea "Mexico" y que hayan visitado la
pgina antes de
las 16 hs.:
delete from visitas
where pais<>'Mexico' and
hour(fecha)<16;
<------------------------------------------------------------------->
30 - Otros operadores relacionales (between - in)
Hemos visto los operadores relacionales:
= (igual), <> (distinto), > (mayor), < (menor), >= (mayor o igual), <= (menor o
igual), is null/is not null (si un valor es NULL o no).
Existen otros que simplifican algunas consultas:
Para recuperar de nuestra tabla "libros" los registros que tienen precio mayor o
igual a 20 y menor o igual a 40, usamos 2 condiciones unidas por el operador lgi
co "and":
select * from libros
where precio>=20 and precio<=40;
Podemos usar "between":
select * from libros
where precio between 20 and 40;
"between" significa "entre". Averiguamos si el valor de un campo dado (precio) e
st entre los valores mnimo y mximo especificados (20 y 40 respectivamente).
Si agregamos el operador "not" antes de "between" el resultado se invierte.
Para recuperar los libros cuyo autor sea 'Paenza' o 'Borges' usamos 2 condicione
s:
select * from libros
where autor='Borges' or autor='Paenza';
Podemos usar "in":
select * from libros
where autor in('Borges','Paenza');
Con "in" averiguamos si el valor de un campo dado (autor) est incluido en la list
a de valores especificada (en este caso, 2 cadenas).
Para recuperar los libros cuyo autor no sea 'Paenza' ni 'Borges' usamos:
select * from libros where autor<>'Borges' and autor<>'Paenza';
Tambin podemos usar "in" :
select * from libros
where autor not in ('Borges','Paenza');
Con "in" averiguamos si el valor del campo est incluido en la lista, con "not" an
tecediendo la condicin, invertimos el resultado.
Problema :
Trabaje con la tabla llamada "medicamentos" de una farmacia.
1- Elimine la tabla, si existe.
2- Cree la tabla con la siguiente estructura:
create table medicamentos(
codigo int unsigned auto_increment,
nombre varchar(20),
laboratorio varchar(20),
precio decimal(5,2) unsigned,
cantidad int unsigned,
primary key(codigo)
);
3- Visualice la estructura de la tabla "medicamentos".
4- Ingrese los siguientes registros:
insert into medicamentos (nombre,laboratorio,precio,cantidad)
values('Sertal','Roche',5.2,100);
insert into medicamentos (nombre,laboratorio,precio,cantidad)
values('Buscapina','Roche',4.10,200);
insert into medicamentos (nombre,laboratorio,precio,cantidad)
values('Amoxidal 500','Bayer',15.60,100);
insert into medicamentos (nombre,laboratorio,precio,cantidad)
values('Paracetamol 500','Bago',1.90,200);
insert into medicamentos (nombre,laboratorio,precio,cantidad)
values('Bayaspirina','Bayer',2.10,150);
insert into medicamentos (nombre,laboratorio,precio,cantidad)
values('Amoxidal jarabe','Bayer',5.10,250);
5- Recupere los nombres y precios de los medicamentos cuyo precio est entre 5 y 1
5:
select nombre,precio from medicamentos
where precio between 5 and 15;
6- Seleccione los registros cuyo laboratorio sea "Bayer" o "Bago":
select * from medicamentos
where laboratorio in ('Bayer','Bago');
7- Elimine los registros cuya cantidad est entre 100 y 200:
delete from medicamentos
where cantidad between 100 and 200;
Segundo problema:
Una concesionaria de autos vende autos usados y almacena la informacin en una tab
la
llamada "autos".
1- Elimine la tabla "autos" si existe.
2- Cree la tabla con la siguiente estructura:
create table autos(
patente char(6),
marca varchar(20),
modelo char(4),
precio decimal(8,2) unsigned,
primary key(patente)
);
3- Ingrese los siguientes registros:
insert into autos(patente,marca,modelo,precio)
values('ACD123','Fiat 128','1970',15000);
insert into autos(patente,marca,modelo,precio)
values('ACG234','Renault 11','1990',40000);
insert into autos(patente,marca,modelo,precio)
values('BCD333','Peugeot 505','1990',80000);
insert into autos(patente,marca,modelo,precio)
values('GCD123','Renault Clio','1990',70000);
insert into autos(patente,marca,modelo,precio)
values('BCC333','Renault Megane','1998',95000);
insert into autos(patente,marca,modelo,precio)
values('BVF543','Fiat 128','1975',20000);
4- Seleccione todos los autos cuyo ao sea '1970' o '1975' usando el operador "in"
:
select * from autos
where modelo in ('1970','1975');
5- Seleccione todos los autos cuyo precio est entre 50000 y 100000:
select * from autos
where precio between 50000 and 100000;
<------------------------------------------------------------------>
31 - Bsqueda de patrones (like y not like)
Hemos realizado consultas utilizando operadores relacionales para comparar caden
as. Por ejemplo, sabemos recuperar los libros cuyo autor sea igual a la cadena "
Borges":
select * from libros
where autor='Borges';
Los operadores relacionales nos permiten comparar valores numricos y cadenas de c
aracteres. Pero al realizar la comparacin de cadenas, busca coincidencias de cade
nas completas.
Imaginemos que tenemos registrados estos 2 libros:
El Aleph de Borges;
Antologia poetica de J.L. Borges;
Si queremos recuperar todos los libros cuyo autor sea "Borges", y especificamos
la siguiente condicin:
select * from libros
where autor='Borges';
slo aparecer el primer registro, ya que la cadena "Borges" no es igual a la cadena
"J.L. Borges".
Esto sucede porque el operador "=" (igual), tambin el operador "<>" (distinto) co
mparan cadenas de caracteres completas. Para comparar porciones de cadenas utili
zamos los operadores "like" y "not like".
Entonces, podemos comparar trozos de cadenas de caracteres para realizar consult
as. Para recuperar todos los registros cuyo autor contenga la cadena "Borges" de
bemos tipear:
select * from libros
where autor like "%Borges%";
El smbolo "%" (porcentaje) reemplaza cualquier cantidad de caracteres (incluyendo
ningn caracter). Es un caracter comodn. "like" y "not like" son operadores de com
paracin que sealan igualdad o diferencia.
Para seleccionar todos los libros que comiencen con "A":
select * from libros
where titulo like 'A%';
Note que el smbolo "%" ya no est al comienzo, con esto indicamos que el ttulo debe
tener como primera letra la "A" y luego, cualquier cantidad de caracteres.
Para seleccionar todos los libros que no comiencen con "A":
select * from libros
where titulo not like 'A%';
As como "%" reemplaza cualquier cantidad de caracteres, el guin bajo "_" reemplaza
un caracter, es el otro caracter comodn. Por ejemplo, queremos ver los libros de
"Lewis Carroll" pero no recordamos si se escribe "Carroll" o "Carrolt", entonce
s tipeamos esta condicin:
select * from libros
where autor like "%Carrol_";
Si necesitamos buscar un patrn en el que aparezcan los caracteres comodines, por
ejemplo, queremos ver todos los registros que comiencen con un guin bajo, si util
izamos '_%', mostrar todos los registros porque lo interpreta como "patrn que comi
enza con un caracter cualquiera y sigue con cualquier cantidad de caracteres". D
ebemos utilizar "\_%", esto se interpreta como 'patrn que comienza con guin bajo y
contina con cualquier cantidad de caracteres". Es decir, si queremos incluir en
una bsqueda de patrones los caracteres comodines, debemos anteponer al caracter c
omodn, la barra invertida "\", as lo tomar como caracter de bsqueda literal y no com
o comodn para la bsqueda. Para buscar el caracter literal "%" se debe colocar "\%"
.
Problema :
Trabaje con la tabla llamada "medicamentos" de una farmacia.
1- Elimine la tabla, si existe:
drop table if exists medicamentos;
2- Cree la tabla con la siguiente estructura:
create table medicamentos(
codigo int unsigned auto_increment,
nombre varchar(20) not null,
laboratorio varchar(20),
precio decimal(6,2) unsigned,
cantidad int unsigned,
primary key(codigo)
);
3- Visualice la estructura de la tabla "medicamentos".
4- Ingrese los siguientes registros:
insert into medicamentos (nombre, laboratorio,precio)
values('Sertal gotas','Roche',5.2);
insert into medicamentos (nombre, laboratorio,precio)
values('Buscapina','Roche',4.10);
insert into medicamentos (nombre, laboratorio,precio)
values('Amoxidal 500','Bayer',15.60);
insert into medicamentos (nombre, laboratorio,precio)
values('Paracetamol 500','Bago',1.90);
insert into medicamentos (nombre, laboratorio,precio)
values('Bayaspirina','Bayer',2.10);
insert into medicamentos (nombre, laboratorio,precio)
values('Amoxidal jarabe','Bayer',5.10);
insert into medicamentos (nombre, laboratorio,precio)
values('Sertal compuesto','Bayer',5.10);
insert into medicamentos (nombre, laboratorio,precio)
values('Paracetamol 1000','Bago',2.90);
insert into medicamentos (nombre, laboratorio,precio)
values('Amoxinil','Roche',17.80);
5- Recupere los medicamentos cuyo nombre comiencen con "Amox":
select codigo,nombre,laboratorio,precio
from medicamentos
where nombre like 'Amox%';
Quedaron 3 registros seleccionados.
6- Recupere los medicamentos "Paracetamol" cuyo precio sea menor a 2:
select codigo,nombre,laboratorio,precio
from medicamentos
where nombre like 'Paracetamol%' and
precio<2;
7- Busque todos los medicamentos cuyo precio tenga .10 centavos:
select codigo,nombre,laboratorio,precio
from medicamentos
where precio like '%.1%';
8- Muestre todos los medicamentos que no contengan la cadena "compuesto":
select codigo,nombre,laboratorio,precio
from medicamentos
where nombre not like'%compuesto%';
9- Elimine todos los registros cuyo laboratorio contenga la letra "y":
delete from medicamentos
where laboratorio like '%y%';
10- Cambie el precio por 5, al "Paracetamol" cuyo precio es mayor a 2:
update medicamentos set precio=5
where nombre like 'Paracetamol%' and
precio>2;
Segundo problema:
A) Trabaje con la tabla "peliculas" de un video club.
1- Elimine la tabla, si existe.
2- Crela con la siguiente estructura:
-codigo (entero sin signo, autoincrementable),
-titulo (cadena de 30), not null,
-actor (cadena de 20),
-duracion (entero sin signo no mayor a 200 aprox.),
-clave primaria (codigo).
3- Visualice la estructura de la tabla "peliculas".
4- Ingrese los siguientes registros:
insert into peliculas (titulo,actor,duracion)
values('Mision imposible','Tom Cruise',120);
insert into peliculas (titulo,actor,duracion)
values('Harry Potter y la piedra filosofal','Daniel R.',180);
insert into peliculas (titulo,actor,duracion)
values('Harry Potter y la camara secreta','Daniel R.',190);
insert into peliculas (titulo,actor,duracion)
values('Mision imposible 2','Tom Cruise',120);
insert into peliculas (titulo,actor,duracion)
values('Mujer bonita','Richard Gere',120);
insert into peliculas (titulo,actor,duracion)
values('Tootsie','D. Hoffman',90);
insert into peliculas (titulo,actor,duracion)
values('Un oso rojo',null,100);
insert into peliculas (titulo,actor,duracion)
values('Elsa y Fred','China Zorrilla',110);
insert into peliculas (titulo,actor,duracion)
values('Mrs. Johns','Richard Gere',180);
5- Actualice el valor del campo "actor" cambiando por 'R. Gere- J. Roberts', de
la pelcula cuyo
cdigo es 5:
update peliculas set actor='R. Gere-J. Roberts'
where codigo=5;
6- Seleccione todas las pelculas en las cuales trabaje el actor "Gere". Use "like
". (2 registros
seleccionados).
7- Recupere los registros que NO contengan la letra "y" en el ttulo y contenga "c
h" en el
campo "actor" (2 registros):
select * from peliculas
where titulo not like '%y%' and
actor like '%ch%';
8- Seleccione las pelculas que comiencen con "M" y cuya duracin sea menor a 150 (3
registros):
select * from peliculas
where titulo like 'M%' and
duracion<150;
9- Cambie el valor de la duracin a 100 en las pelculas en las cuales el campo "act
or" comience
con "D":
update peliculas set duracion=100
where actor like 'D%';
10- Recupere los registros que cumplan la condicin del punto anterior, para verif
icar el cambio de
la duracin:
select * from peliculas
where actor like 'D%';
11- Vea si existen pelculas con ttulos nulos:
select * from peliculas
where titulo like null;
12- Vea si existen pelculas con valor nulo en el campo "actor":
select * from peliculas
where actor like null;
Tercer Problema:
B) Trabaje con la tabla "usuarios" que almacena el nombre y clave de cada usuari
o.
1- Elimine la tabla, si existe.
- Crela con la siguiente estructura:
-nombre (cadena de 20),
-clave (cadena de 10),
-clave primaria (clave).
3- Visualice la estructura de la tabla "usuarios".
4- Ingrese los siguientes registros:
insert into usuarios (nombre, clave) values ('Leonardo','payaso');
insert into usuarios (nombre, clave) values ('MarioPerez','Marito');
insert into usuarios (nombre, clave) values ('Marcelo','River');
insert into usuarios (nombre, clave) values ('Gustavo','Boca');
insert into usuarios (nombre, clave) values ('MarcosMercado','RealMadrid');
insert into usuarios (nombre, clave) values ('Susana','chapita');
insert into usuarios (nombre, clave) values ('Gonzalo','Z80');
insert into usuarios (nombre, clave) values ('GustavoPereyra','RealMadrid');
5- Busque los registros cuya clave contenga slo 5 letras:
select * from usuarios
where clave like '_____';
6- Busque los registros cuyo nombre de usuario termine con "o":
select * from usuarios
where nombre like '%o';
<------------------------------------------------------------------>
32 - Bsqueda de patrones (regexp)
Los operadores "regexp" y "not regexp" busca patrones de modo similar a "like" y
"not like".
Para buscar libros que contengan la cadena "Ma" usamos:
select titulo from libros
where titulo regexp 'Ma';
Para buscar los autores que tienen al menos una "h" o una "k" o una "w" tipeamos
:
select autor from libros
where autor regexp '[hkw]';
Para buscar los autores que no tienen ni "h" o una "k" o una "w" tipeamos:
select autor from libros
where autor not regexp '[hkw]';
Para buscar los autores que tienen por lo menos una de las letras de la "a" hast
a la "d", es decir, "a,b,c,d", usamos:
select autor from libros
where autor regexp '[a-d]';
Para ver los ttulos que comienzan con "A" tipeamos:
select titulo from libros
where titulo regexp '^A';
Para ver los ttulos que terminan en "HP" usamos:
select titulo from libros
where titulo regexp 'HP$';
Para buscar ttulos que contengan una "a" luego un caracter cualquiera y luego una
"e" utilizamos la siguiente sentencia:
select titulo from libros
where titulo regexp 'a.e';
El punto (.) identifica cualquier caracter.
Podemos mostrar los ttulos que contienen una "a" seguida de 2 caracteres y luego
una "e":
select titulo from libros
where titulo regexp 'a..e';
Para buscar autores que tengan 6 caracteres exactamente usamos:
select autor from libros
where autor regexp '^......$';
Para buscar autores que tengan al menos 6 caracteres usamos:
select autor from libros
where autor regexp '......';
Para buscar ttulos que contengan 2 letras "a" usamos:
select titulo from libros
where titulo regexp 'a.*a';
El asterisco indica que busque el caracter inmediatamente anterior, en este caso
cualquiera porque hay un punto.
Problema :
Trabaje con la tabla "agenda" que registra la informacin referente a sus amigos.
1- Elimine la tabla si existe.
2- Cree la tabla con la siguiente estructura:
create table agenda(
apellido varchar(30),
nombre varchar(20) not null,
domicilio varchar(30),
telefono varchar(11),
mail varchar(30)
);
3- Ingrese los siguientes registros:
insert into agenda values('Perez','Juan','Sarmiento 345','4334455','juancito@gm
ail.com');
insert into agenda values('Garcia','Ana','Urquiza 367','4226677','anamariagarci
a@hotmail.com');
insert into agenda values('Lopez','Juan','Avellaneda 900',null,'juancitoLopez@g
mail.com');
insert into agenda values('Juarez','Mariana','Sucre 123','0525657687','marianaJ
uarez2@gmail.com');
insert into agenda values('Molinari','Lucia','Peru 1254','4590987','molinariluc
ia@hotmail.com');
insert into agenda values('Ferreyra','Patricia','Colon 1534','4585858',null);
insert into agenda values('Perez','Susana','San Martin 333',null,null);
insert into agenda values('Perez','Luis','Urquiza
444','0354545256','perezluisalberto@hotmail.com');
insert into agenda values('Lopez','Maria','Salta 314',null,'lopezmariayo@gmail.
com');
4- Busque todos los mails que contengan la cadena "gmail":
select *from agenda
where mail regexp 'gmail';
5- Busque los nombres que no tienen "z" ni "g":
select * from agenda
where nombre not regexp '[zg]';
6- Busque los apellidos que tienen por lo menos una de las letras de la "v" hast
a la "z" (v,w,x,y,z):
select * from agenda
where apellido regexp '[v-z]';
7- Seleccione los apellidos que terminen en "ez":
select * from agenda
where apellido regexp 'ez$';
8- Seleccione los apellidos, nombres y domicilios de los amigos cuyos apellidos
contengan 2 letras "i":
select apellido,nombre,domicilio from agenda
where nombre regexp 'i.*i';
9- Seleccione los telfonos que tengan 7 caracteres exactamente:
select * from agenda
where telefono regexp '^.......$';
10- Seleccione el nombre y mail de todos los amigos cuyos mails tengan al menos
20 caracteres:
select nombre,mail from agenda
where mail regexp '....................';
Segundo problema:
Un comercio que vende artculos de computacin registra los datos de sus artculos en
una tabla con
ese nombre.
1- Elimine "articulos", si existe:
drop table if exists articulos;
2- Cree la tabla, con la siguiente estructura:
create table articulos(
codigo int unsigned auto_increment,
nombre varchar(25) not null,
descripcion varchar(30),
precio decimal(6,2) unsigned,
cantidad tinyint unsigned,
primary key(codigo)
);
3- Ingrese algunos registros:
insert into articulos (nombre, descripcion, precio,cantidad)
values ('impresora','Epson Stylus C45',400.80,20);
insert into articulos (nombre, descripcion, precio,cantidad)
values ('impresora','Epson Stylus C85',500,30);
insert into articulos (nombre, descripcion, precio,cantidad)
values ('monitor','Samsung 14',800,10);
insert into articulos (nombre, descripcion, precio,cantidad)
values ('teclado','ingles Biswal',100,50);
insert into articulos (nombre, descripcion, precio,cantidad)
values ('teclado','espaol Biswal',90,50);
insert into articulos (nombre, descripcion, precio,cantidad)
values ('impresora multifuncion','HP 1410',300,20);
4- Seleccione todos los artculos que comienzan con "impresora":
select * from articulos
where nombre regexp '^impresora';
5-Busque los artculos en los cuales el campo "descripcion" no tienen "H" ni "W":
select * from articulos
where descripcion not regexp '[hw]';
6- Seleccione las descripciones que contengan una letra "s" seguida de un caract
er cualquiera y
luego una "n":
select * from articulos
where descripcion regexp 's.n';
<------------------------------------------------------------------>
33 - Contar registros (count)
Existen en MySQL funciones que nos permiten contar registros, calcular sumas, pr
omedios, obtener valores mximos y mnimos. Veamos algunas de ellas.
Imaginemos que nuestra tabla "libros" contiene muchos registros. Para averiguar
la cantidad sin necesidad de contarlos manualmente usamos la funcin "count()":
select count(*) from libros;
La funcin "count()" cuenta la cantidad de registros de una tabla, incluyendo los
que tienen valor nulo.
Para saber la cantidad de libros de la editorial "Planeta" tipeamos:
select count(*) from libros
where editorial='Planeta';
Tambin podemos utilizar esta funcin junto con la clausula "where" para una consult
a ms especfica. Por ejemplo, solicitamos la cantidad de libros que contienen la ca
dena "Borges":
select count(*) from libros
where autor like '%Borges%';
Para contar los registros que tienen precio (sin tener en cuenta los que tienen
valor nulo), usamos la funcin "count()" y en los parntesis colocamos el nombre del
campo que necesitamos contar:
select count(precio) from libros;
Note que "count(*)" retorna la cantidad de registros de una tabla (incluyendo lo
s que tienen valor "null") mientras que "count(precio)" retorna la cantidad de r
egistros en los cuales el campo "precio" no es nulo. No es lo mismo. "count(*)"
cuenta registros, si en lugar de un asterisco colocamos como argumento el nombre
de un campo, se contabilizan los registros cuyo valor en ese campo no es nulo.
Tenga en cuenta que no debe haber espacio entre el nombre de la funcin y el parnte
sis, porque puede confundirse con una referencia a una tabla o campo. Las siguie
ntes sentencias son distintas:
select count(*) from libros;
select count (*) from libros;
La primera es correcta, la segunda incorrecta.
Problema :
Un comercio que tiene un stand en una feria registra en una tabla llamada "visit
antes" algunos
datos de las personas que visitan o compran en su stand para luego enviarle publ
icidad de sus
productos.
1- Elimine la tabla "visitantes", si existe.
2- Crela con la siguiente estructura:
create table visitantes(
nombre varchar(30),
edad tinyint unsigned,
sexo char(1),
domicilio varchar(30),
ciudad varchar(20),
telefono varchar(11),
montocompra decimal (6,2) unsigned
);
3- Ingrese algunos registros:
insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra
)
values ('Susana Molina', 28,'f','Colon 123','Cordoba',null,45.50);
insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra
)
values ('Marcela Mercado',36,'f','Avellaneda 345','Cordoba','4545454',0);
insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra
)
values ('Alberto Garcia',35,'m','Gral. Paz 123','Alta Gracia','03547123456',25
);
insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra
)
values ('Teresa Garcia',33,'f','Gral. Paz 123','Alta Gracia','03547123456',0);
insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra
)
values ('Roberto Perez',45,'m','Urquiza 335','Cordoba','4123456',33.20);
insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra
)
values ('Marina Torres',22,'f','Colon 222','Villa Dolores','03544112233',25);
insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra
)
values ('Julieta Gomez',24,'f','San Martin 333','Alta Gracia','03547121212',53
.50);
insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra
)
values ('Roxana Lopez',20,'f','Triunvirato 345','Alta Gracia',null,0);
insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra
)
values ('Liliana Garcia',50,'f','Paso 999','Cordoba','4588778',48);
insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra
)
values ('Juan Torres',43,'m','Sarmiento 876','Cordoba','4988778',15.30);
4- Solicite la cantidad de visitantes al stand (10 registros):
select count(*) from visitantes;
5- Solicite la cantidad de visitantes que tienen telfono (valor no nulo) (8 regis
tros):
select count(telefono)
from visitantes;
Recuerde que no es lo mismo contar todos los registros que contar los que tienen
telfono, porque
en el segundo caso no considera los registros con valor nulo en el campo "telefo
no".
6- Muestre la cantidad de visitantes de sexo masculino que acudieron al stand (3
):
select count(*) from visitantes
where sexo='m';
7- Muestre la cantidad de mujeres mayores de 25 aos que acudieron al stand (4):
select count(*) from visitantes
where sexo='f' and
edad>25;
8- Muestre la cantidad de visitantes que no son de "Cordoba" (5):
select count(*) from visitantes
where ciudad<>'Cordoba';
9- Muestre la cantidad de visitantes que realizaron alguna compra (7):
select count(*) from visitantes
where montocompra<>0;
10- Muestre la cantidad de visitantes que no realizaron compras (3):
select count(*) from visitantes
where montocompra=0;
Segundo problema:
A) Una pequea biblioteca de barrio registra los prstamos de sus libros en una tabl
a
llamada "prestamos".
1- Elimine la tabla "prestamos" si existe.
2- Cree la tabla:
create table prestamos(
titulo varchar(40) not null,
documento char(8) not null,
fechaprestamo date not null,
fechadevuelto date
);
La tabla registra el documento del socio a quien se le presta el libro, el ttulo
del libro
prestado, la fecha de prstamo y la fecha en que se devuelve.
3- Ingrese los siguientes registros:
insert into prestamos (titulo,documento,fechaprestamo,fechadevuelto)
values ('Manual de 1 grado','23456789','2006-07-10','2006-07-12');
insert into prestamos (titulo,documento,fechaprestamo,fechadevuelto)
values ('El aleph','22245679','2006-07-15',null);
insert into prestamos (titulo,documento,fechaprestamo,fechadevuelto)
values ('Alicia en el pais de las maravillas','24456789','2006-07-20','2006-07
-22');
insert into prestamos (titulo,documento,fechaprestamo,fechadevuelto)
values ('Manual de biologia','25456789','2006-08-14',null);
insert into prestamos (titulo,documento,fechaprestamo,fechadevuelto)
values ('Manual de geografia 5 grado','27456789','2006-08-21','2006-08-25');
insert into prestamos (titulo,documento,fechaprestamo,fechadevuelto)
values ('Antologia poetica','28456789','2006-08-26','2006-08-27');
insert into prestamos (titulo,documento,fechaprestamo,fechadevuelto)
values ('Manual de 1 grado','23456789','2006-08-26','2006-08-28');
insert into prestamos (titulo,documento,fechaprestamo,fechadevuelto)
values ('Manual de 1 grado','30456789','2006-09-01','2006-09-03');
4- Cuente la cantidad de veces que se prest el libro "Manual de 1 grado":
select count(*)
from prestamos
where titulo='Manual de 1 grado';
5- Cuente la cantidad de libros devueltos (contando por fechadevuelto):
select count(fechadevuelto)
from prestamos;
6- Cuente la cantidad de veces que se le prestaron libros a la persona con docum
ento "23456789":
select count(*)
from prestamos
where documento='23456789';
7- Cuente la cantidad de libros prestados en el mes de agosto:
select count(*)
from prestamos
where month(fechaprestamo)=8;
Tercer Problema:
B) Trabaje con la tabla "agenda" que registra la informacin referente a sus amigo
s.
1- Elimine la tabla si existe.
2- Cree la tabla con la siguiente estructura:
create table agenda(
apellido varchar(30),
nombre varchar(20) not null,
domicilio varchar(30),
telefono varchar(11),
mail varchar(30)
);
3- Ingrese los siguientes registros:
insert into agenda values('Perez','Juan','Sarmiento 345','4334455','juancito@gm
ail.com');
insert into agenda values('Garcia','Ana','Urquiza 367','4226677','anamariagarci
a@hotmail.com');
insert into agenda values('Lopez','Juan','Avellaneda 900',null,'juancitoLopez@g
mail.com');
insert into agenda values('Juarez','Mariana','Sucre 123','0525657687','marianaJ
uarez2@gmail.com');
insert into agenda values('Molinari','Lucia','Peru 1254','4590987','molinariluc
ia@hotmail.com');
insert into agenda values('Ferreyra','Patricia','Colon 1534','4585858',null);
insert into agenda values('Perez','Susana','San Martin 333',null,null);
insert into agenda values('Perez','Luis','Urquiza 444','0354545256','perezluisa
lberto@hotmail.com');
insert into agenda values('Lopez','Maria','Salta 314',null,'lopezmariayo@gmail.
com');
4- Cuente cuntos de sus amigos tienen mail:
select count(mail)
from agenda;
5-Cuente cuntos de sus amigos tienen telfono:
select count(telefono)
from agenda;
6- Cuente cuntos se apellidan "Perez":
select count(*)
from agenda
where apellido like '%Perez%';
<------------------------------------------------------------------>
34 - Funciones de agrupamiento (count - max - min - sum - avg)
Existen en MySQL funciones que nos permiten contar registros, calcular sumas, pr
omedios, obtener valores mximos y mnimos. Ya hemos aprendido "count()", veamos otr
as.
La funcin "sum()" retorna la suma de los valores que contiene el campo especifica
do. Por ejemplo, queremos saber la cantidad de libros que tenemos disponibles pa
ra la venta:
select sum(cantidad) from libros;
Tambin podemos combinarla con "where". Por ejemplo, queremos saber cuntos libros t
enemos de la editorial "Planeta":
select sum(cantidad) from libros
where editorial ='Planeta';
Para averiguar el valor mximo o mnimo de un campo usamos las funciones "max()" y "
min()" respectivamente. Ejemplo, queremos saber cul es el mayor precio de todos l
os libros:
select max(precio) from libros;
Queremos saber cul es el valor mnimo de los libros de "Rowling":
select min(precio) from libros
where autor like '%Rowling%';
La funcin avg() retorna el valor promedio de los valores del campo especificado.
Por ejemplo, queremos saber el promedio del precio de los libros referentes a "P
HP":
select avg(precio) from libros
where titulo like '%PHP%';
Estas funciones se denominan "funciones de agrupamiento" porque operan sobre con
juntos de registros, no con datos individuales.
Tenga en cuenta que no debe haber espacio entre el nombre de la funcin y el parnte
sis, porque puede confundirse con una referencia a una tabla o campo. Las siguie
ntes sentencias son distintas:
select count(*) from libros;
select count (*) from libros;
La primera es correcta, la segunda incorrecta.
Problema :
Un comercio que tiene un stand en una feria registra en una tabla llamada "visit
antes" algunos
datos de las personas que visitan o compran en su stand para luego enviarle publ
icidad de sus
productos.
1- Elimine la tabla "visitantes", si existe.
2- Crela con la siguiente estructura:
create table visitantes(
nombre varchar(30),
edad tinyint unsigned,
sexo char(1),
domicilio varchar(30),
ciudad varchar(20),
telefono varchar(11),
montocompra decimal (6,2) unsigned
);
Note que no tiene clave primaria, no la necesita.
3- Ingrese algunos registros:
insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra
)
values ('Susana Molina', 28,'f','Colon 123','Cordoba',null,45.50);
insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra
)
values ('Marcela Mercado',36,'f','Avellaneda 345','Cordoba','4545454',0);
insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra
)
values ('Alberto Garcia',35,'m','Gral. Paz 123','Alta Gracia','03547123456',25
);
insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra
)
values ('Teresa Garcia',33,'f','Gral. Paz 123','Alta Gracia','03547123456',0);
insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra
)
values ('Roberto Perez',45,'m','Urquiza 335','Cordoba','4123456',33.20);
insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra
)
values ('Marina Torres',22,'f','Colon 222','Villa Dolores','03544112233',25);
insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra
)
values ('Julieta Gomez',24,'f','San Martin 333','Alta Gracia','03547121212',53
.50);
insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra
)
values ('Roxana Lopez',20,'f','Triunvirato 345','Alta Gracia',null,0);
insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra
)
values ('Liliana Garcia',50,'f','Paso 999','Cordoba','4588778',48);
insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra
)
values ('Juan Torres',43,'m','Sarmiento 876','Cordoba','4988778',15.30);
4- Solicite la cantidad de visitantes al stand (10 registros):
select count(*) from visitantes;
5- Muestre la suma de la compra de todos los visitantes de "Alta Gracia" (78.5):
select sum(montocompra) from visitantes
where ciudad='Alta Gracia';
6- Muestre el valor mximo de las compras efectuadas (53.50):
select max(montocompra) from visitantes;
7- Muestre la edad menor de los visitantes (20):
select min(edad) from visitantes;
8- Muestre el promedio de edades de los visitantes (33.66):
select avg(edad) from visitantes;
9- Muestre el promedio del monto de compra (24.55):
select avg(montocompra) from visitantes;
Segundo problema:
A) Una academia de informtica dicta distintos cursos y almacena en una tabla
llamada "inscripciones" la siguiente informacin: nombre del curso, documento del
alumno, fecha en
que se inscribe el alumno, monto del pago (algunos dejan una sea, otros pagan el
curso completo).
1- Elimine la tabla si existe.
2- cree la tabla:
create table inscripciones(
nombre varchar(30),
documento char(8),
fechainscripto date,
pago decimal(5,2) unsigned not null
);
3- Ingrese algunos registros:
insert into inscripciones values('PHP bsico', '22333444','2006-08-10',50);
insert into inscripciones values('PHP bsico', '23333444','2006-08-10',50);
insert into inscripciones values('PHP bsico', '24333444','2006-08-11',30);
insert into inscripciones values('PHP experto', '25333444','2006-08-11',0);
insert into inscripciones values('PHP experto', '26333444','2006-08-12',200);
insert into inscripciones values('JavaScript bsico', '22333444','2006-08-10',100
);
insert into inscripciones values('Operador de PC', '27333444','2006-08-12',10);
insert into inscripciones values('Operador de PC', '28333444','2006-08-13',50);
insert into inscripciones values('Operador de PC', '29333444','2006-08-14',40);
insert into inscripciones values('Operador de PC', '30333444','2006-08-14',0);
insert into inscripciones values('Diseo web', '29333444','2006-08-14',200);
insert into inscripciones values('Diseo web', '30333444','2006-08-14',0);
4- calcule la cantidad de inscriptos para el curso de "Operador de PC":
select count(*)
from inscripciones
where nombre='Operador de PC';
5- Calcule la suma recaudada por los pagos de los cursos el da "2006-08-10":
select sum(pago)
from inscripciones
where fechainscripto='2006-08-10';
6- Calcule el promedio de los pagos de los inscriptos:
select avg(pago)
from inscripciones;
7- Muestre el mximo y el mnimo valor de pago, sin considerar quienes no pagan:
select max(pago),min(pago)
from inscripciones
where pago>0;
8- Vea en cuntos cursos se inscribi el alumno con documento "22333444" y cunto abon
en total:
select count(*) as 'cantidad',
sum(pago) as 'Abono'
from inscripciones
where documento='22333444';
Tercer Problema:
B) Trabaje con la tabla "peliculas" de un video club.
1- Elimine la tabla, si existe.
2- Crela con la siguiente estructura:
-codigo (entero sin signo, autoincrementable),
-titulo (cadena de 30), not null,
-actor (cadena de 20),
-duracion (entero sin signo no mayor a 200 aprox.),
-clave primaria (codigo).
3- Ingrese los siguientes registros:
insert into peliculas (titulo,actor,duracion)
values('Mision imposible','Tom Cruise',120);
insert into peliculas (titulo,actor,duracion)
values('Harry Potter y la piedra filosofal','Daniel R.',180);
insert into peliculas (titulo,actor,duracion)
values('Harry Potter y la camara secreta','Daniel R.',190);
insert into peliculas (titulo,actor,duracion)
values('Mision imposible 2','Tom Cruise',120);
insert into peliculas (titulo,actor,duracion)
values('Mujer bonita','Richard Gere',120);
insert into peliculas (titulo,actor,duracion)
values('Tootsie','D. Hoffman',90);
insert into peliculas (titulo,actor,duracion)
values('Un oso rojo',null,100);
insert into peliculas (titulo,actor,duracion)
values('Elsa y Fred','China Zorrilla',110);
insert into peliculas (titulo,actor,duracion)
values('Mrs. Johns','Richard Gere',180);
4- Muestre el valor de duracin ms grande:
select max(duracion)from peliculas;
5- Muestre el promedio de duracin de las pelculas:
select avg(duracion) from peliculas;
6- Cuente la cantidad de pelculas que comiencen con la cadena "Harry Potter":
select count(*)
from peliculas
where titulo like 'Harry Potter%';
7- Un socio alquil todas las pelculas en las cuales trabaja "Richard Gere", quiere
saber el total
de minutos que duran todas sus pelculas:
select sum(duracion)
from peliculas
where actor='Richard Gere';
Cuarto Problema:
C) Una concesionaria de autos vende autos usados y almacena la informacin en una
tabla
llamada "autos".
1- Elimine la tabla "autos" si existe.
2- Cree la tabla con la siguiente estructura:
create table autos(
patente char(6),
marca varchar(20),
modelo char(4),
precio decimal(8,2) unsigned,
primary key(patente)
);
3- Ingrese los siguientes registros:
insert into autos
values('ACD123','Fiat 128','1970',15000);
insert into autos
values('ACG234','Renault 11','1990',40000);
insert into autos
values('BCD333','Peugeot 505','1990',80000);
insert into autos
values('GCD123','Renault Clio','1990',70000);
insert into autos
values('BCC333','Renault Megane','1998',95000);
insert into autos
values('BVF543','Fiat 128','1975',20000);
4- Muestre el valor del auto ms caro y ms barato:
select max(precio), min(precio)
from autos;
5- Muestre el valor de auto ms caro de 1990:
select max(precio)
from autos
where modelo='1990';
6- Muestre el promedio de los precios de los autos "Fiat 128":
select avg(precio)
from autos
where marca='Fiat 128';
7- Calcule el valor en dinero de todos los autos marca "Renault" con modelos men
ores a "1995":
select sum(precio)
from autos
where marca like '%Renault%' and
modelo<1995;
Quinto Problema:
D) Un comercio guarda la informacin de sus ventas en una tabla llamada "facturas"
en la que
registra el nmero de factura, la descripcin de los items comprados, el precio por
unidad de los
items y la cantidad.
1- Elimine la tabla si existe.
2- Cree la tabla:
create table facturas(
numero int(10) zerofill,
descripcion varchar(30),
precioporunidad decimal(5,2) unsigned,
cantidad tinyint unsigned
);
3- Ingrese algunos registros:
insert into facturas values(504,'escuadra 20 cm.',2.5,100);
insert into facturas values(504,'escuadra 50 cm.',5,80);
insert into facturas values(2002,'compas plastico',8,120);
insert into facturas values(2002,'compas metal',15.4,100);
insert into facturas values(2002,'escuadra 20 cm.',2.5,100);
insert into facturas values(4567,'escuadra 50 cm.',5,200);
4- Cuente la cantidad de items de la factura nmero "2002":
select count(*)
from facturas
where numero='2002';
5- Sume la cantidad de productos de la factura nmero "2002":
select sum(cantidad)
from facturas
where numero='2002';
6- Muestre el total en dinero de la factura "504":
select sum(cantidad*precioporunidad)
from facturas
where numero='504';
<------------------------------------------------------------------>
35 - Agrupar registros (group by)
Hemos aprendido que las funciones de agrupamiento permiten contar registros, cal
cular sumas y promedios, obtener valores mximos y mnimos. Tambin dijimos que dichas
funciones operan sobre conjuntos de registros, no con datos individuales.
Generalmente esta funciones se combinan con la sentencia "group by", que agrupa
registros para consultas detalladas.
Queremos saber la cantidad de visitantes de cada ciudad, podemos tipear la sigui
ente sentencia:
select count(*) from visitantes
where ciudad='Cordoba';
y repetirla con cada valor de "ciudad":
select count(*) from visitantes
where ciudad='Alta Gracia';
select count(*) from visitantes
where ciudad='Villa Dolores';
...
Pero hay otra manera, utilizando la clusula "group by":
select ciudad, count(*)
from visitantes
group by ciudad;
Entonces, para saber la cantidad de visitantes que tenemos en cada ciudad utiliz
amos la funcin "count()", agregamos "group by" y el campo por el que deseamos que
se realice el agrupamiento, tambin colocamos el nombre del campo a recuperar.
La instruccin anterior solicita que muestre el nombre de la ciudad y cuente la ca
ntidad agrupando los registros por el campo "ciudad". Como resultado aparecen lo
s nombres de las ciudades y la cantidad de registros para cada valor del campo.
Para obtener la cantidad visitantes con telfono no nulo, de cada ciudad utilizamo
s la funcin "count()" envindole como argumento el campo "telefono", agregamos "gro
up by" y el campo por el que deseamos que se realice el agrupamiento (ciudad):
select ciudad, count(telefono)
from visitantes
group by ciudad;
Como resultado aparecen los nombres de las ciudades y la cantidad de registros d
e cada una, sin contar los que tienen telfono nulo. Recuerde la diferencia de los
valores que retorna la funcin "count()" cuando enviamos como argumento un asteri
sco o el nombre de un campo: en el primer caso cuenta todos los registros incluy
endo los que tienen valor nulo, en el segundo, los registros en los cuales el ca
mpo especificado es no nulo.
Para conocer el total de las compras agrupadas por sexo:
select sexo, sum(montocompra)
from visitantes
group by sexo;
Para saber el mximo y mnimo valor de compra agrupados por sexo:
select sexo, max(montocompra) from visitantes
group by sexo;
select sexo, min(montocompra) from visitantes
group by sexo;
Se pueden simplificar las 2 sentencias anteriores en una sola sentencia, ya que
usan el mismo "group by":
select sexo, max(montocompra),
min(montocompra)
from visitantes
group by sexo;
Para calcular el promedio del valor de compra agrupados por ciudad:
select ciudad, avg(montocompra) from visitantes
group by ciudad;
Podemos agrupar por ms de un campo, por ejemplo, vamos a hacerlo por "ciudad" y "
sexo":
select ciudad, sexo, count(*) from visitantes
group by ciudad,sexo;
Tambin es posible limitar la consulta con "where".
Vamos a contar y agrupar por ciudad sin tener en cuenta "Cordoba":
select ciudad, count(*) from visitantes
where ciudad<>'Cordoba'
group by ciudad;
Podemos usar las palabras claves "asc" y "desc" para una salida ordenada:
select ciudad, count(*) from visitantes
group by ciudad desc;
Problema :
Una empresa tiene registrados sus clientes en una tabla llamada "clientes".
1- Elimine la tabla "clientes", si existe.
2- Crela con la siguiente estructura:
create table clientes (
codigo int unsigned auto_increment,
nombre varchar(30) not null,
domicilio varchar(30),
ciudad varchar(20),
provincia varchar (20),
telefono varchar(11),
primary key(codigo)
);
3- Ingrese algunos registros:
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Lopez Marcos', 'Colon 111', 'Crdoba','Cordoba','null');
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Perez Ana', 'San Martin 222', 'Cruz del Eje','Cordoba','4578585');
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Garcia Juan', 'Rivadavia 333', 'Villa Maria','Cordoba','4578445');
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Perez Luis', 'Sarmiento 444', 'Rosario','Santa Fe',null);
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Pereyra Lucas', 'San Martin 555', 'Cruz del Eje','Cordoba','4253685')
;
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Gomez Ines', 'San Martin 666', 'Santa Fe','Santa Fe','0345252525');
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Torres Fabiola', 'Alem 777', 'Villa del Rosario','Cordoba','4554455')
;
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Lopez Carlos', 'Irigoyen 888', 'Cruz del Eje','Cordoba',null);
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Ramos Betina', 'San Martin 999', 'Cordoba','Cordoba','4223366');
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Lopez Lucas', 'San Martin 1010', 'Posadas','Misiones','0457858745');
4- Obtenga el total de los registros (10):
select count(*) from clientes;
5- Obtenga el total de los registros que no tienen valor nulo en los telfonos (8)
:
select count(telefono) from clientes;
6- Obtenga la cantidad de clientes agrupados por ciudad y provincia, ordenados p
or provincia:
select ciudad,provincia, count(*) from clientes
group by ciudad, provincia
order by provincia;
Segundo problema:
A) En una pgina web se solicitan los siguientes datos para guardar informacin de s
us visitas.
1- Elimine la tabla "visitas", si existe.
2- Crela con la siguiente estructura:
create table visitas (
numero int unsigned auto_increment,
nombre varchar(30) not null,
mail varchar(50),
pais varchar (20),
fecha date,
primary key(numero)
);
3- Ingrese algunos registros:
insert into visitas (nombre,mail,fecha)
values ('Ana Maria Lopez','AnaMaria@hotmail.com','2006-10-10');
insert into visitas (nombre,mail,fecha)
values ('Gustavo Gonzalez','GustavoGGonzalez@hotmail.com','2006-10-10');
insert into visitas (nombre,mail,fecha)
values ('Juancito','JuanJosePerez@hotmail.com','2006-10-11');
insert into visitas (nombre,mail,fecha)
values ('Fabiola Martinez','MartinezFabiola@hotmail.com','2006-10-12');
insert into visitas (nombre,mail,fecha)
values ('Fabiola Martinez','MartinezFabiola@hotmail.com','2006-09-12');
insert into visitas (nombre,mail,fecha)
values ('Juancito','JuanJosePerez@hotmail.com','2006-09-12');
insert into visitas (nombre,mail,fecha)
values ('Juancito','JuanJosePerez@hotmail.com','2006-09-15');
4- Obtenga el total de visitas.
5- Cantidad de visitas agrupadas por fecha:
select fecha,count(*) from visitas
group by fecha;
6- Cantidad de visitas agrupadas por nombre y mes:
select nombre,month(fecha),count(*)
from visitas
group by nombre,month(fecha);
Tercer Problema:
B) Una empresa registra los datos de sus empleados en una tabla llamada "emplead
os".
1- Elimine la tabla "empleados" si existe:
drop table if exists empleados;
2- Cree la tabla:
create table empleados(
documento char(8) not null,
nombre varchar(30) not null,
sexo char(1),
domicilio varchar(30),
fechaingreso date,
fechanacimiento date,
sueldobasico decimal(5,2) unsigned,
primary key(documento)
);
3- Ingrese algunos registros:
insert into empleados (documento,nombre,sexo,domicilio,fechaingreso,fechanacimie
nto,sueldoBasico)
values ('22333111','Juan Perez','m','Colon 123','1990-02-01','1970-05-10',550)
;
insert into empleados (documento,nombre,sexo,domicilio,fechaingreso,fechanacimi
ento,sueldoBasico)
values ('25444444','Susana Morales','f','Avellaneda 345','1995-04-01','1975-11
-06',650);
insert into empleados (documento,nombre,sexo,domicilio,fechaingreso,fechanacimi
ento,sueldoBasico)
values ('20111222','Hector Pereyra','m','Caseros 987','1995-04-01','1965-03-25
',510);
insert into empleados (documento,nombre,sexo,domicilio,fechaingreso,fechanacimi
ento,sueldoBasico)
values ('30000222','Luis Luque','m','Urquiza 456','1980-09-01','1980-03-29',70
0);
insert into empleados (documento,nombre,sexo,domicilio,fechaingreso,fechanacimi
ento,sueldoBasico)
values ('20555444','Maria Laura Torres','f','San Martin 1122','2000-05-15','19
65-12-22',700);
insert into empleados (documento,nombre,sexo,domicilio,fechaingreso,fechanacimi
ento,sueldoBasico)
values ('30000234','Alberto Soto','m','Peru 232','2003-08-15','1989-10-10',420
);
insert into empleados (documento,nombre,sexo,domicilio,fechaingreso,fechanacimi
ento,sueldoBasico)
values ('20125478','Ana Gomez','f','Sarmiento 975','2004-06-14','1976-09-21',3
50);
insert into empleados (documento,nombre,sexo,domicilio,fechaingreso,fechanacimi
ento,sueldoBasico)
values ('24154269','Ofelia Garcia','f','Triunvirato 628','2004-09-23','1974-05
-12',390);
insert into empleados (documento,nombre,sexo,domicilio,fechaingreso,fechanacimie
nto,sueldoBasico)
values ('30154269','Oscar Mendez','m','Colon 1245','2004-06-23','1984-05-14',3
00);
4- Es poltica de la empresa festejar cada fin de mes, los cumpleaos de todos los e
mpleados que
cumplen ese mes. Si los empleados son de sexo femenino, se les regala un ramo de
rosas, si son de
sexo masculino, una corbata. La secretaria de la Gerencia necesita saber cuntos r
amos de rosas y
cuntas corbatas debe comprar para el mes de mayo:
select sexo,count(sexo)
from empleados
where month(fechanacimiento)=5
group by sexo;
5- Se necesita conocer la cantidad de empleados agrupados por ao de ingreso a la
empresa:
select year(fechaingreso),count(*)
from empleados
group by year(fechaingreso);
Cuarto Problema:
C) Un comercio guarda la informacin de sus ventas en una tabla llamada "facturas"
en la que
registra el nmero de factura, la descripcin de los items comprados, el precio por
unidad de los
items y la cantidad.
1- Elimine la tabla si existe.
2- Cree la tabla:
create table facturas(
numero int(10) zerofill,
descripcion varchar(30),
precioporunidad decimal(5,2) unsigned,
cantidad tinyint unsigned
);
3- Ingrese algunos registros:
insert into facturas values(504,'escuadra 20 cm.',2.5,100);
insert into facturas values(504,'escuadra 50 cm.',5,80);
insert into facturas values(2002,'compas plastico',8,120);
insert into facturas values(2002,'compas metal',15.4,100);
insert into facturas values(2002,'escuadra 20 cm.',2.5,100);
insert into facturas values(4567,'escuadra 50 cm.',5,200);
4- Cuente la cantidad de items por factura:
select numero, count(*)
from facturas
group by numero;
5- Sume la cantidad de productos de las facturas:
select numero,sum(cantidad)
from facturas
group by numero;
6- Muestre el total en dinero de las facturas:
select numero,sum(cantidad*precioporunidad)
from facturas
group by numero;
<------------------------------------------------------------------>
36 - Seleccin de un grupo de registros (having)
As como la clusula "where" permite seleccionar (o rechazar) registros individuales
; la clusula "having" permite seleccionar (o rechazar) un grupo de registros.
Si queremos saber la cantidad de libros agrupados por editorial usamos la siguie
nte instruccin ya aprendida:
select editorial, count(*) from libros
group by editorial;
Si queremos saber la cantidad de libros agrupados por editorial pero considerand
o slo algunos grupos, por ejemplo, los que devuelvan un valor mayor a 2, usamos l
a siguiente instruccin:
select editorial, count(*) from libros
group by editorial
having count(*)>2;
Se utiliza "having", seguido de la condicin de bsqueda, para seleccionar ciertas f
ilas retornadas por la clusula "group by".
Veamos otros ejemplos. Queremos el promedio de los precios de los libros agrupad
os por editorial:
select editorial, avg(precio) from libros
group by editorial;
Ahora, slo queremos aquellos cuyo promedio supere los 25 pesos:
select editorial, avg(precio) from libros
group by editorial
having avg(precio)>25;
En algunos casos es posible confundir las clusulas "where" y "having". Queremos c
ontar los registros agrupados por editorial sin tener en cuenta a la editorial "
Planeta".
Analicemos las siguientes sentencias:
select editorial, count(*) from libros
where editorial<>'Planeta'
group by editorial;
select editorial, count(*) from libros
group by editorial
having editorial<>'Planeta';
Ambas devuelven el mismo resultado, pero son diferentes.
La primera, selecciona todos los registros rechazando los de editorial "Planeta"
y luego los agrupa para contarlos. La segunda, selecciona todos los registros,
los agrupa para contarlos y finalmente rechaza la cuenta correspondiente a la ed
itorial "Planeta".
No debemos confundir la clusula "where" con la clusula "having"; la primera establ
ece condiciones para la seleccin de registros de un "select"; la segunda establec
e condiciones para la seleccin de registros de una salida "group by".
Veamos otros ejemplos combinando "where" y "having".
Queremos la cantidad de libros, sin considerar los que tienen precio nulo, agrup
ados por editorial, sin considerar la editorial "Planeta":
select editorial, count(*) from libros
where precio is not null
group by editorial
having editorial<>'Planeta';
Aqu, selecciona los registros rechazando los que no cumplan con la condicin dada e
n "where", luego los agrupa por "editorial" y finalmente rechaza los grupos que
no cumplan con la condicin dada en el "having".
Generalmente se usa la clusula "having" con funciones de agrupamiento, esto no pu
ede hacerlo la clusula "where". Por ejemplo queremos el promedio de los precios a
grupados por editorial, de aquellas editoriales que tienen ms de 2 libros:
select editorial, avg(precio) from libros
group by editorial
having count(*) > 2;
Podemos encontrar el mayor valor de los libros agrupados por editorial y luego s
eleccionar las filas que tengan un valor mayor o igual a 30:
select editorial, max(precio) from libros
group by editorial
having max(precio)>=30;
Esta misma sentencia puede usarse empleando un "alias", para hacer referencia a
la columna de la expresin:
select editorial, max(precio) as 'mayor' from libros
group by editorial
having mayor>=30;
Problema :
Una empresa tiene registrados sus clientes en una tabla llamada "clientes".
1- Elimine la tabla "clientes", si existe.
2- Crela con la siguiente estructura:
create table clientes (
codigo int unsigned auto_increment,
nombre varchar(30) not null,
domicilio varchar(30),
ciudad varchar(20),
provincia varchar (20),
telefono varchar(11),
primary key(codigo)
);
3- Ingrese algunos registros:
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Lopez Marcos', 'Colon 111', 'Crdoba','Cordoba','null');
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Perez Ana', 'San Martin 222', 'Cruz del Eje','Cordoba','4578585');
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Garcia Juan', 'Rivadavia 333', 'Villa Maria','Cordoba','4578445');
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Perez Luis', 'Sarmiento 444', 'Rosario','Santa Fe',null);
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Pereyra Lucas', 'San Martin 555', 'Cruz del Eje','Cordoba','4253685')
;
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Gomez Ines', 'San Martin 666', 'Santa Fe','Santa Fe','0345252525');
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Torres Fabiola', 'Alem 777', 'Villa del Rosario','Cordoba','4554455')
;
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Lopez Carlos', 'Irigoyen 888', 'Cruz del Eje','Cordoba',null);
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Ramos Betina', 'San Martin 999', 'Cordoba','Cordoba','4223366');
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Lopez Lucas', 'San Martin 1010', 'Posadas','Misiones','0457858745');
4- Obtenga el total de los registros agrupados por provincia:
select provincia, count(*)
from clientes
group by provincia;
5- Obtenga el total de los registros agrupados por ciudad y provincia:
select ciudad, provincia, count(*)
from clientes
group by ciudad,provincia;
6- Obtenga el total de los registros agrupados por ciudad y provincia sin consid
erar los que tienen
menos de 2 clientes:
select ciudad, provincia, count(*)
from clientes
group by ciudad,provincia
having count(*)>1;
7- Obtenga el total de los registros sin telfono nulo, agrupados por ciudad y pro
vincia sin
considerar los que tienen menos de 2 clientes:
select ciudad, provincia, count(*)
from clientes
where telefono is not null
group by ciudad,provincia
having count(*)>1;
Segundo problema:
A) Un comercio que tiene un stand en una feria registra en una tabla llamada "vi
sitantes" algunos
datos de las personas que visitan o compran en su stand para luego enviarle publ
icidad de sus
productos.
1- Elimine la tabla "visitantes", si existe.
2- Crela con la siguiente estructura:
create table visitantes(
nombre varchar(30),
edad tinyint unsigned,
sexo char(1),
domicilio varchar(30),
ciudad varchar(20),
telefono varchar(11),
montocompra decimal(6,2)
);
3- Ingrese algunos registros:
insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra
)
values ('Susana Molina', 28,'f','Colon 123','Cordoba',null,45.50);
insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra
)
values ('Marcela Mercado',36,'f','Avellaneda 345','Cordoba','4545454',0);
insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra
)
values ('Alberto Garcia',35,'m','Gral. Paz 123','Alta Gracia','03547123456',25
);
insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra
)
values ('Teresa Garcia',33,'f','Gral. Paz 123','Alta Gracia','03547123456',0);
insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra
)
values ('Roberto Perez',45,'m','Urquiza 335','Cordoba','4123456',33.20);
insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra
)
values ('Marina Torres',22,'f','Colon 222','Villa Dolores','03544112233',25);
insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra
)
values ('Julieta Gomez',24,'f','San Martin 333','Alta Gracia','03547121212',53
.50);
insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra
)
values ('Roxana Lopez',20,'f','Triunvirato 345','Alta Gracia',null,0);
insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra
)
values ('Liliana Garcia',50,'f','Paso 999','Cordoba','4588778',48);
insert into visitantes (nombre,edad, sexo,domicilio,ciudad,telefono,montocompra
)
values ('Juan Torres',43,'m','Sarmiento 876','Cordoba','4988778',15.30);
4- Obtenga el total de las compras agrupados por ciudad y sexo:
select ciudad, sexo, sum(montocompra)
from visitantes
group by ciudad, sexo;
5- Obtenga el total de las compras agrupados por ciudad y sexo, considerando slo
las sumas
superiores a 50 pesos:
select ciudad, sexo, sum(montocompra)
from visitantes
group by ciudad, sexo
having sum(montocompra)>50;
6- Muestre el monto mayor de compra agrupado por ciudad, siempre que el valor su
pere los 30 pesos,
considerando slo los visitantes con telefono no nulo:
select ciudad, max(montocompra)
from visitantes
where telefono is not null
group by ciudad
having max(montocompra)>30;
7- Agrupe por ciudad y muestre para cada grupo (ciudad) el total de visitantes,
la suma de sus
compras y el promedio de compras:
select ciudad, count(*), sum(montocompra),avg(montocompra)
from visitantes
group by ciudad;
Tercer Problema:
B) En una pgina web se solicitan los siguientes datos para guardar informacin de s
us visitas.
1- Elimine la tabla "visitas", si existe.
2- Crela con la siguiente estructura:
create table visitas (
numero int unsigned auto_increment,
nombre varchar(30) not null,
mail varchar(50),
pais varchar (20),
puntaje tinyint unsigned,
primary key(numero)
);
El puntaje va de 0 a 10.
3- Ingrese algunos registros:
insert into visitas (nombre,mail,pais,puntaje)
values ('Ana Maria Lopez','AnaMaria@hotmail.com','Argentina',9);
insert into visitas (nombre,mail,pais,puntaje)
values ('Gustavo Gonzalez','GustavoGGonzalez@yahoo.com','Chile',8);
insert into visitas (nombre,mail,pais,puntaje)
values ('Juancito','JuanJosePerez@hotmail.com','Mexico',5);
insert into visitas (nombre,mail,pais,puntaje)
values ('Fabiola Martinez','MartinezFabiolaM@hotmail.com','Chile',9);
insert into visitas (nombre,mail,pais,puntaje)
values ('Fabiola Martinez',null,'Peru',8);
insert into visitas (nombre,mail,pais,puntaje)
values ('Mariana Torres','MarianitaTorres','Peru',7);
4- Muestre el promedio de los puntajes agrupados por pais, considerando slo aquel
los pases que
tiene ms de 1 visita:
select pais, avg(puntaje) from visitas
group by pais
having count(*)>=2;
5- Muestre el promedio de los puntajes agrupados por pais, considerando slo aquel
los pases cuyo
promedio es mayor a 8:
select pais, avg(puntaje) from visitas
group by pais
having avg(puntaje)>8;
Cuarto Problema:
C) Una empresa registra los datos de sus empleados en una tabla llamada "emplead
os".
1- Elimine la tabla "empleados" si existe:
drop table if exists empleados;
2- Cree la tabla:
create table empleados(
documento char(8) not null,
nombre varchar(30) not null,
sexo char(1),
domicilio varchar(30),
fechaIngreso date,
fechaNacimiento date,
sueldoBasico decimal(5,2),
primary key(documento)
);
3- Ingrese algunos registros:
insert into empleados (documento,nombre,sexo,domicilio,fechaingreso,fechanacimi
ento,sueldobasico)
values ('22333111','Juan Perez','m','Colon 123','1990-02-01','1970-05-10',550)
;
insert into empleados (documento,nombre,sexo,domicilio,fechaingreso,fechanacimi
ento,sueldobasico)
values ('25444444','Susana Morales','f','Avellaneda 345','1995-04-01','1975-11
-06',650);
insert into empleados (documento,nombre,sexo,domicilio,fechaingreso,fechanacimi
ento,sueldobasico)
values ('20111222','Hector Pereyra','m','Caseros 987','1995-04-01','1965-03-25
',510);
insert into empleados (documento,nombre,sexo,domicilio,fechaingreso,fechanacimi
ento,sueldobasico)
values ('30000222','Luis LUque','m','Urquiza 456','1980-09-01','1980-03-29',70
0);
insert into empleados (documento,nombre,sexo,domicilio,fechaingreso,fechanacimi
ento,sueldobasico)
values ('20555444','Maria Laura Torres','f','San Martin 1122','2000-05-15','19
65-12-22',700);
insert into empleados (documento,nombre,sexo,domicilio,fechaingreso,fechanacimi
ento,sueldobasico)
values ('30000234','Alberto Soto','m','Peru 232','2003-08-15','1989-10-10',420
);
insert into empleados (documento,nombre,sexo,domicilio,fechaingreso,fechanacimi
ento,sueldobasico)
values ('20125478','Ana Gomez','f','Sarmiento 975','2004-06-14','1976-09-21',3
50);
insert into empleados (documento,nombre,sexo,domicilio,fechaingreso,fechanacimi
ento,sueldobasico)
values ('24154269','Ofelia Garcia','f','Triunvirato 628','2004-09-23','1974-05
-12',390);
4- La empresa festeja cada mes los cumpleaos de todos los empleados que cumplen e
se mes. Queremos
saber cuntos empleados cumplen aos en los meses de agosto a diciembre:
select month(fechanacimiento) as mes,
count(*) as cantidad
from empleados
group by mes
having mes>=8;
5- Se necesita conocer la cantidad de empleados agrupados por fecha de ingreso a
la empresa slo de
las fechas posteriores a "1990-02-01":
select fechaingreso,count(*)
from empleados
group by fechaingreso
having fechaingreso>'1990-02-01';
<------------------------------------------------------------------>
37 - Registros duplicados (distinct)
Con la clusula "distinct" se especifica que los registros con ciertos datos dupli
cados sean obviadas en el resultado. Por ejemplo, queremos conocer todos los aut
ores de los cuales tenemos libros, si utilizamos esta sentencia:
select autor from libros;
Aparecen repetidos. Para obtener la lista de autores sin repeticin usamos:
select distinct autor from libros;
Tambin podemos tipear:
select autor from libros
group by autor;
Note que en los tres casos anteriores aparece "null" como un valor para "autor" S
i slo queremos la lista de autores conocidos, es decir, no queremos incluir "null
" en la lista, podemos utilizar la sentencia siguiente:
select distinct autor from libros
where autor is not null;
Para contar los distintos autores, sin considerar el valor "null" usamos:
select count(distinct autor)
from libros;
Note que si contamos los autores sin "distinct", no incluir los valores "null" pe
ro si los repetidos:
select count(autor)
from libros;
Esta sentencia cuenta los registros que tienen autor.
Para obtener los nombres de las editoriales usamos:
select editoriales from libros;
Para una consulta en la cual los nombres no se repitan tipeamos:
select distinct editorial from libros;
Podemos saber la cantidad de editoriales distintas usamos:
select count(distinct editoriales) from libros;
Podemos combinarla con "where". Por ejemplo, queremos conocer los distintos auto
res de la editorial "Planeta":
select distinct autor from libros
where editorial='Planeta';
Tambin puede utilizarse con "group by":
select editorial, count(distinct autor)
from libros
group by editorial;
Para mostrar los ttulos de los libros sin repetir ttulos, usamos:
select distinct titulo from libros
order by titulo;
La clusula "distinct" afecta a todos los campos presentados. Para mostrar los ttul
os y editoriales de los libros sin repetir ttulos ni editoriales, usamos:
select distinct titulo,editorial
from libros
order by titulo;
Note que los registros no estn duplicados, aparecen ttulos iguales pero con editor
ial diferente, cada registro es diferente.

Problema :
Una academia de enseanza dicta distintos cursos de informtica. Los cursos se dicta
n por la maana
o por la tarde, todos los das de lunes a viernes. La academia guarda los datos de
los cursos en
una tabla llamada "cursos" en la cual almacena el cdigo del curso, el tema, los da
s de la semana
que se dicta, el horario, por la maana (AM) o por la tarde (PM), la cantidad de c
lases que incluye
cada curso (clases), la fecha de inicio y el costo del curso.
1- Elimine la tabla "cursos", si existe.
2- Cree la tabla "cursos" con la siguiente estructura:
create table cursos(
codigo tinyint unsigned auto_increment,
tema varchar(20) not null,
horario char(2) not null,
clases tinyint unsigned default 10,
fechainicio date,
costo decimal(5,2) unsigned,
primary key(codigo)
);
3- Ingrese los siguientes registros:
insert into cursos (tema,horario,clases,fechainicio,costo)
values('PHP bsico','AM',10,'2006-08-07',200);
insert into cursos (tema,horario,clases,fechainicio,costo)
values('PHP bsico','PM',default,'2006-08-14',200);
insert into cursos (tema,horario,clases,fechainicio,costo)
values('PHP bsico','AM',default,'2006-08-05',200);
insert into cursos (tema,horario,clases,fechainicio,costo)
values('PHP avanzado','AM',20,'2006-08-01',350);
insert into cursos (tema,horario,clases,fechainicio,costo)
values('JavaScript bsico','PM',15,'2006-09-11',150);
insert into cursos (tema,horario,clases,fechainicio,costo)
values('Paginas web','PM',15,'2006-08-08',200);
insert into cursos (tema,horario,clases,fechainicio,costo)
values('Paginas web','AM',15,'2006-08-12',200);
insert into cursos (tema,horario,clases,fechainicio,costo)
values('Paginas web','AM',15,'2006-08-21',200);
insert into cursos (tema,horario,clases,fechainicio,costo)
values('HTML avanzado','AM',20,'2006-09-18',180);
insert into cursos (tema,horario,clases,fechainicio,costo)
values('HTML avanzado','PM',20,'2006-09-25',180);
insert into cursos (tema,horario,clases,fechainicio,costo)
values('JavaScript avanzado','PM',25,'2006-09-18',150);
4- Obtenga la lista de temas de los cursos sin repeticin:
select distinct tema
from cursos;
5- Seleccione los cursos donde el tema incluya "PHP", sin repetir horario ni tem
a:
select distinct horario,tema from cursos
where tema like '%PHP%';
6- Cuente la cantidad de cursos DISTINTOS agrupados por horario:
select horario,count(distinct tema)
from cursos
group by horario;
Segundo problema:
A) Una empresa tiene registrados sus clientes en una tabla llamada "clientes".
1- Elimine la tabla "clientes", si existe.
2- Crela con la siguiente estructura:
create table clientes (
codigo int unsigned auto_increment,
nombre varchar(30) not null,
domicilio varchar(30),
ciudad varchar(20),
provincia varchar (20),
telefono varchar(11),
primary key(codigo)
);
3- Ingrese algunos registros:
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Lopez Marcos', 'Colon 111', 'Crdoba','Cordoba','null');
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Perez Ana', 'San Martin 222', 'Cruz del Eje','Cordoba','4578585');
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Garcia Juan', 'Rivadavia 333', 'Villa Maria','Cordoba','4578445');
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Perez Luis', 'Sarmiento 444', 'Rosario','Santa Fe',null);
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Pereyra Lucas', 'San Martin 555', 'Cruz del Eje','Cordoba','4253685')
;
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Gomez Ines', 'San Martin 666', 'Santa Fe','Santa Fe','0345252525');
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Torres Fabiola', 'Alem 777', 'Villa del Rosario','Cordoba','4554455')
;
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Lopez Carlos', 'Irigoyen 888', 'Cruz del Eje','Cordoba',null);
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Ramos Betina', 'San Martin 999', 'Cordoba','Cordoba','4223366');
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Lopez Lucas', 'San Martin 1010', 'Posadas','Misiones','0457858745');
4- Muestre las distintas provincias y ciudades en las cuales la empresa tiene cl
ientes:
select distinct provincia,ciudad
from clientes;
5- Obtenga la cantidad de ciudades distintas, por provincia en las cuales hay cl
ientes:
select provincia, count(distinct ciudad)
from clientes
group by provincia;
Tercer Problema:
B) En una pgina web se solicitan los siguientes datos para guardar informacin de s
us visitas.
1- Elimine la tabla "visitas", si existe.
2- Crela con la siguiente estructura:
create table visitas (
numero int unsigned auto_increment,
nombre varchar(30) not null,
mail varchar(50),
pais varchar (20),
fecha date,
primary key(numero)
);
3- Ingrese algunos registros:
insert into visitas (nombre,mail,fecha)
values ('Ana Maria Lopez','AnaMaria@hotmail.com','2006-10-10');
insert into visitas (nombre,mail,fecha)
values ('Gustavo Gonzalez','GustavoGGonzalez@hotmail.com','2006-10-10');
insert into visitas (nombre,mail,fecha)
values ('Juancito','JuanJosePerez@hotmail.com','2006-10-11');
insert into visitas (nombre,mail,fecha)
values ('Fabiola Martinez','MartinezFabiola@hotmail.com','2006-10-12');
insert into visitas (nombre,mail,fecha)
values ('Fabiola Martinez','MartinezFabiola@hotmail.com','2006-09-12');
insert into visitas (nombre,mail,fecha)
values ('Juancito','JuanJosePerez@hotmail.com','2006-09-12');
insert into visitas (nombre,mail,fecha)
values ('Juancito','JuanJosePerez@hotmail.com','2006-09-15');
insert into visitas (nombre,mail,fecha)
values ('Juancito','JuanJosePerez@hotmail.com','2006-09-15');
4- Obtenga los distintos nombres de quienes visitaron la pgina:
select distinct nombre
from visitas;
5- Muestre la cantidad de veces que cada persona ingres a la pgina:
select nombre, count(fecha)
from visitas
group by nombre;
6- Muestre la cantidad de veces que cada persona ingres a la pgina en distintas fe
chas:
select nombre, count(distinct fecha)
from visitas
group by nombre;
Note que las dos ltimas sentencias tienen una salida diferente. Una persona ingre
s 2 veces en el
mismo da, en el punto N6 se cuenta, en el punto N 7 no se cuenta porque solicitamos
fechas
diferentes.
Cuarto Problema:
C) Una concesionaria de autos vende autos usados y almacena la informacin en una
tabla
llamada "autos".
1- Elimine la tabla "autos" si existe.
2- Cree la tabla con la siguiente estructura:
create table autos(
patente char(6),
marca varchar(20),
modelo year,
precio decimal(8,2) unsigned,
primary key(patente)
);
3- Ingrese los siguientes registros:
insert into autos values('ACD123','Fiat 128','1970',15000);
insert into autos values('ACG234','Renault 11','1990',40000);
insert into autos values('BCD333','Peugeot 505','1990',80000);
insert into autos values('GCD123','Renault 11','1990',70000);
insert into autos values('BCC333','Renault Megane','1998',95000);
insert into autos values('BVF543','Fiat 128','1975',20000);
insert into autos values('FCD123','Renault 11','1995',70000);
insert into autos values('HCC333','Renault Megane','1995',95000);
insert into autos values('IVF543','Fiat 128','1970',20000);
4- Muestre las distintas marcas de autos disponibles:
select distinct marca from autos;
5- Muestre la cantidad de autos por marca, de diferentes modelos:
select marca, count(distinct modelo)
from autos
group by marca;
6- Muestre los distintos modelos de autps disponibles:
select distinct modelo from autos;
Quinto Problema:
D) Un consultorio mdico en el cual trabajan varios mdicos registra las consultas d
e los pacientes
en una tabla llamada "consultas".
1- Elimine la tabla si existe.
2- Cree la tabla con la siguiente estructura:
create table consultas(
fechayhora datetime not null,
medico varchar(30) not null,
documento char(8) not null,
paciente varchar(30),
obrasocial varchar(30)
);
4- Ingrese los siguientes registros:
insert into consultas values('2006-08-10 8:00','Perez','22333444','Juana Garcia
','PAMI');
insert into consultas values('2006-08-10 10:00','Lopez','22333444','Juana Garci
a','PAMI');
insert into consultas values('2006-08-10 8:30','Perez','23333444','Adela Gomez'
,'PAMI');
insert into consultas values('2006-08-10 9:00','Perez','24333444','Juan Lopez',
'IPAM');
insert into consultas values('2006-08-10 10:00','Perez','25333444','Hector Juar
ez','OSDOP');
insert into consultas values('2006-08-10 8:30','Garcia','25333444','Ana Molina'
,'PAMI');
insert into consultas values('2006-09-10 8:30','Garcia','25333444','Ana Molina'
,'PAMI');
5- Muestre las distintas obras sociales:
select distinct obrasocial from consultas;
6- Muestre los nombres de los distintos pacientes:
select distinct paciente from consultas;
7- Muestre la cantidad de distintas obras sociales:
select distinct obrasocial from consultas;
8- Cuente la cantidad de mdicos (SIN REPETIR) que tienen consultas agrupado por m
es y da:
select extract(month from fechayhora),extract(day from fechayhora),
count(distinct medico) from consultas
group by extract(month from fechayhora),extract(day from fechayhora);
Sexto Problema:
E) Un club dicta clases de distintos deportes. En una tabla llamada "inscriptos"
almacena la
informacin necesaria.
1- Elimine la tabla "inscriptos" si existe.
2- Cree la tabla:
create table inscriptos(
documento char(8) not null,
nombre varchar(30),
deporte varchar(15) not null,
ao year,
matricula char(1) default 'N'
);
3- Ingrese los siguientes registros:
insert into inscriptos values('35333444','Juan Lopez','tenis','1990','S');
insert into inscriptos values('35333444','Juan Lopez','basquet','1990','S');
insert into inscriptos values('35333444','Juan Lopez','natacin','1990','S');
insert into inscriptos values('36333444','Ana Juarez','tenis','1990','S');
insert into inscriptos values('36333444','Ana Juarez','natacin','1990','S');
insert into inscriptos values('35333444','Juan Lopez','voley','1991','S');
insert into inscriptos values('35333444','Juan Lopez','voley','1992','S');
insert into inscriptos values('35333444','Juan Lopez','tenis','1992','S');
insert into inscriptos values('36333444','Ana Juarez','tenis','1991','S');
insert into inscriptos values('37333444','Luis Duarte','tenis','1990','S');
insert into inscriptos values('37333444','Luis Duarte','tenis','1991','S');
4- Muestre los nombres de los inscriptos sin repetir:
select distinct nombre
from inscriptos;
5- Muestre los nombres de los deportes sin repetir:
select distinct deporte
from inscriptos;
6- Muestre la cantidad de alumnos DISTINTOS inscriptos en cada deporte:
select deporte,count(distinct nombre)
from inscriptos
group by deporte;
7- Muestre la cantidad de inscriptos por ao, sin considerar los alumnos que se in
scribieron en ms
de un deporte:
select ao,count(distinct nombre)
from inscriptos
group by ao;
<------------------------------------------------------------------>
38 - Alias
Un "alias" se usa como nombre de un campo o de una expresin o para referenciar un
a tabla cuando se utilizan ms de una tabla (tema que veremos ms adelante).
Cuando usamos una funcin de agrupamiento, por ejemplo:
select count(*)
from libros
where autor like '%Borges%';
la columna en la salida tiene como encabezado "count(*)", para que el resultado
sea ms claro podemos utilizar un alias:
select count(*) as librosdeborges
from libros
where autor like '%Borges%';
La columna de la salida ahora tiene como encabezado el alias, lo que hace ms comp
rensible el resultado.
Un alias puede tener hasta 255 caracteres, acepta todos los caracteres. La palab
ra clave "as" es opcional en algunos casos, pero es conveniente usarla. Si el al
ias consta de una sola cadena las comillas no son necesarias, pero si contiene ms
de una palabra, es necesario colocarla entre comillas.
Se pueden utilizar alias en las clsulas "group by", "order by", "having". Por eje
mplo:
select editorial as 'Nombre de editorial'
from libros
group by 'Nombre de editorial';
select editorial, count(*) as cantidad
from libros
group by editorial
order by cantidad;
select editorial, count(*) as cantidad
from libros
group by editorial
having cantidad>2;
No est permitido utilizar alias de campos en las clusulas "where".
Los alias sern de suma importancia cuando rescate datos desde el lenguaje PHP
Problema :
Una empresa tiene registrados sus clientes en una tabla llamada "clientes".
1- Elimine la tabla "clientes", si existe.
2- Crela con la siguiente estructura:
create table clientes (
codigo int unsigned auto_increment,
nombre varchar(30) not null,
domicilio varchar(30),
ciudad varchar(20),
provincia varchar (20),
telefono varchar(11),
primary key(codigo)
);
3- Ingrese algunos registros:
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Lopez Marcos', 'Colon 111', 'Crdoba','Cordoba','null');
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Perez Ana', 'San Martin 222', 'Cruz del Eje','Cordoba','4578585');
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Garcia Juan', 'Rivadavia 333', 'Villa Maria','Cordoba','4578445');
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Perez Luis', 'Sarmiento 444', 'Rosario','Santa Fe',null);
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Pereyra Lucas', 'San Martin 555', 'Cruz del Eje','Cordoba','4253685')
;
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Gomez Ines', 'San Martin 666', 'Santa Fe','Santa Fe','0345252525');
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Torres Fabiola', 'Alem 777', 'Villa del Rosario','Cordoba','4554455')
;
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Lopez Carlos', 'Irigoyen 888', 'Cruz del Eje','Cordoba',null);
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Ramos Betina', 'San Martin 999', 'Cordoba','Cordoba','4223366');
insert into clientes (nombre,domicilio,ciudad,provincia,telefono)
values ('Lopez Lucas', 'San Martin 1010', 'Posadas','Misiones','0457858745');
4- Obtenga el total de los registros que no tienen valor nulo en los telfonos y c
oloque un alias
para dicha columna:
select count(telefono) as 'con telefono'
from clientes;
5- Muestre la cantidad de clientes que se apellidan "Perez" colocando un alias p
ara dicha salida:
select count(*) as 'Perez'
from clientes
where nombre like '%Perez%' ;
6- Obtenga la cantidad de ciudades DISTINTAS por provincia en las cuales hay cli
entes, coloque un alias:
select provincia, count(distinct ciudad) as 'ciudades'
from clientes
group by provincia;
<------------------------------------------------------------------>
39 - Clave primaria compuesta.
Las claves primarias pueden ser simples, formadas por un solo campo o compuestas
, ms de un campo.
Recordemos que una clave primaria identifica 1 solo registro en una tabla. Para
un valor del campo clave existe solamente 1 registro. Los valores no se repiten
ni pueden ser nulos.
Retomemos el ejemplo de la playa de estacionamiento que almacena cada da los dato
s de los vehculos que ingresan en la tabla llamada "vehiculos" con los siguientes
campos:
- patente char(6) not null,
- tipo char (4),
- horallegada time not null,
- horasalida time,
Necesitamos definir una clave primaria para una tabla con los datos descriptos a
rriba. No podemos usar la patente porque un mismo auto puede ingresar ms de una v
ez en el da a la playa; tampoco podemos usar la hora de entrada porque varios aut
os pueden ingresar a una misma hora. Tampoco sirven los otros campos.
Como ningn campo, por si solo cumple con la condicin para ser clave, es decir, deb
e identificar un solo registro, el valor no puede repetirse, debemos usar 2 camp
os.
Definimos una clave compuesta cuando ningn campo por si solo cumple con la condic
in para ser clave.
En este ejemplo, un auto puede ingresar varias veces en un da a la playa, pero si
empre ser a distinta hora.
Usamos 2 campos como clave, la patente junto con la hora de llegada, as identific
amos unvocamente cada registro.
Para establecer ms de un campo como clave primaria usamos la siguiente sintaxis:
create table vehiculos(
patente char(6) not null,
tipo char(4),
horallegada time not null
horasalida time,
primary key(patente,horallegada)
);
Nombramos los campos que formarn parte de la clave separados por comas.
Si vemos la estructura de la tabla con "describe" vemos que en la columna "key",
en ambos campos aparece "PRI", porque ambos son clave primaria.
Un campo que es parte de una clave primaria puede ser autoincrementable slo si es
el primer campo que compone la clave, si es secundario no se permite.
Es posible eliminar un campo que es parte de una clave primaria, la clave queda
con los campos restantes. Esto, siempre que no queden registros con clave repeti
da. Por ejemplo, podemos eliminar el campo "horallegada":
alter table vehiculos drop horallegada;
siempre que no haya registros con "patente" duplicada, en ese caso aparece un me
nsaje de error y la eliminacin del campo no se realiza.
En caso de ejecutarse la sentencia anterior, la clave queda formada slo por el ca
mpo "patente".
Problema :
Una pequea biblioteca de barrio registra los prstamos de sus libros en una tabla
llamada "prestamos". En ella almacena la siguiente informacin:
-ttulo del libro,
-documento de identidad del socio a quien se le presta el libro,
-fecha de prstamo,
-fecha de devolucin del libro,
-devuelto: si el libro ha sido o no devuelto.
1- Elimine la tabla "prestamos" si existe.
2- Necesitamos una clave que identifique cada registro en la tabla "prestamos".
El mismo libro no
puede prestarse en la misma fecha.
3- Cree la tabla:
create table prestamos(
titulo varchar(40) not null,
documento char(8) not null,
fechaprestamo date not null,
fechadevolucion date,
devuelto char(1) default 'N',
primary key(titulo,fechaprestamo)
);
4- Ingrese los siguientes registros para la tabla "prestamos":
insert into prestamos (titulo,documento,fechaprestamo)
values('Manual de 1 grado','22333444','2006-07-10');
insert into prestamos (titulo,documento,fechaprestamo)
values('Manual de 1 grado','22333444','2006-07-20');
insert into prestamos (titulo,documento,fechaprestamo)
values('Manual de 1 grado','23333444','2006-07-15');
insert into prestamos (titulo,documento,fechaprestamo)
values('El aleph','22333444','2006-07-10');
insert into prestamos (titulo,documento,fechaprestamo)
values('El aleph','30333444','2006-08-10');
Note que un mismo libro fue prestado a un mismo socio pero en una fecha distinta
.
5- Intente ingresar un valor de clave primaria repetida:
insert into prestamos (titulo,documento,fechaprestamo)
values('Manual de 1 grado','25333444','2006-07-10');
Segundo problema:
A) Un consultorio mdico en el cual trabajan 3 mdicos registra las consultas de los
pacientes en
una tabla llamada "consultas".
1- Elimine la tabla si existe.
2- La tabla contiene los siguientes datos:
- fechayhora: datetime not null, fecha y hora de la consulta,
- medico: varchar(30), not null, nombre del mdico (Perez,Lopez,Duarte),
- documento: char(8) not null, documento del paciente,
- paciente: varchar(30), nombre del paciente,
- obrasocial: varchar(30), nombre de la obra social ('IPAM','PAMI').
);
3- Un mdico slo puede atender a un paciente en una fecha y hora determianada. En u
na fecha y hora
determinada, varios mdicos atienden a distintos pacientes. Cree la tabla definien
do una clave
primaria compuesta:
create table consultas(
fechayhora datetime not null,
medico varchar(30) not null,
documento char(8) not null,
paciente varchar(30),
obrasocial varchar(30),
primary key(fechayhora,medico)
);
4- Ingrese varias consultas para un mismo mdico en distintas horas el mismo da.
5- Ingrese varias consultas para diferentes mdicos en la misma fecha y hora.
6- Intente ingresar una consulta para un mismo mdico en la misma hora el mismo da.
Tercer Problema:
B) Un club dicta clases de distintos deportes. En una tabla llamada "inscriptos"
almacena la
informacin necesaria.
1- Elimine la tabla "inscriptos" si existe.
2- La tabla contiene los siguientes campos:
- documento del socio alumno: char(8) not null
- nombre del socio: varchar(30),
- nombre del deporte (tenis, futbol, natacin, basquet): varchar(15) not null,
- ao de inscripcion: year,
- matrcula: si la matrcula ha sido o no pagada ('s' o 'n').
3- Necesitamos una clave primaria que identifique cada registro. Un socio puede
inscribirse en
varios deportes en distintos aos. Un socio no puede inscribirse en el mismo depor
te el mismo ao.
varios socios se inscriben en un mismo deporte. Cree la tabla con una clave comp
uesta:
create table inscriptos(
documento char(8) not null,
nombre varchar(30),
deporte varchar(15) not null,
ao year,
matricula char(1),
primary key(documento,deporte,ao)
);
4- Inscriba a varios alumnos en el mismo deporte en el mismo ao.
5- Inscriba a un mismo alumno en varios deportes en el mismo ao.
6- Ingrese un registro con el mismo documento de socio en el mismo deporte en di
stintos aos.
7- Intente inscribir a un socio alumno en un deporte en el cual ya est inscripto
en un ao en el
cual ya se haya inscripto.
8- Intente eliminar un campo parte de la clave.
Cuarto Problema:
C) Un comercio guarda la informacin de sus ventas en una tabla llamada "facturas"
.
1- Elimine la tabla si existe.
2- Intente crear la tabla con la siguiente estructura:
create table facturas(
serie char(1) not null,
numero int(10) zerofill auto_increment,
descripcion varchar(30),
precioporunidad decimal(5,2) unsigned,
cantidad tinyint unsigned,
primary key (serie,numero)
);
3- Aparece un mensaje de error, la tabla no puede ser creada porque el campo def
inido
como "auto_increment" es secundario (primero est "serie") y sabemos que un campo
"auto_increment"
debe estar primero en orden al ser definido parte de la clave compuesta.
4- Cree la tabla cambiando el orden de los campos estabecidos como clave primari
a:
create table facturas(
serie char(1) not null,
numero int(10) zerofill auto_increment,
numeroitem smallint unsigned not null,
descripcion varchar(30),
precioporunidad decimal(5,2) unsigned,
cantidad tinyint unsigned,
primary key (numero,serie,numeroitem)
);
Tenga en cuenta al ingresar registros que el campo "numero" se autoincrementar si
n tener en cuenta
los dems campos.
5- Ingrese 3 registros con igual "serie", "numero" y distintos nmeros de items:
insert into facturas (serie,numero,numeroitem,descripcion,precioporunidad,canti
dad)
values('A',100,1,'escuadra 20 cm.',2.50,20);
insert into facturas (serie,numero,numeroitem,descripcion,precioporunidad,canti
dad)
values('A',100,2,'escuadra 50 cm.',5,30);
insert into facturas (serie,numero,numeroitem,descripcion,precioporunidad,canti
dad)
values('A',100,3,'goma lapiz-tinta',0.35,100);
6- Ingrese los siguientes registros:
insert into facturas (serie,numero,numeroitem,descripcion,precioporunidad,canti
dad)
values('A',102,1,'lapices coloresx6',4.40,50);
insert into facturas (serie,numero,numeroitem,descripcion,precioporunidad,canti
dad)
values('A',102,2,'lapices coloresx12',8,60);
insert into facturas (serie,numero,numeroitem,descripcion,precioporunidad,canti
dad)
values('B',102,1,'lapices coloresx24',12.35,100);
insert into facturas (serie,numero,numeroitem,descripcion,precioporunidad,canti
dad)
values('B',102,2,'goma lapiz-tinta',0.35,200);
7- Ingrese los siguientes registros y vea qu valor da al "numero" que no se ingre
sa:
insert into facturas (serie,numeroitem,descripcion,precioporunidad,cantidad)
values('A',1,'compas plastico',12,50);
insert into facturas (serie,numeroitem,descripcion,precioporunidad,cantidad)
values('A',1,'compas metal',18.90,80);
8- Intente ingresar un registro con valores de clave repetida:
insert into facturas (serie,numero,numeroitem,descripcion,precioporunidad,cantid
ad)
values('A',104,1,'compas metal',18.90,80);
9- Muestre los registros concatenando "serie" con "numero", usando un alias para
esa columna,
muestre los dems campos y ordene por el alias:
select concat_ws('-',serie,numero) as serienumero,
numeroitem,descripcion,precioporunidad,cantidad
from facturas
order by serienumero;
10- Agrupe los registros por serie y nmero de factura y muestre el total (en una
columna
calculada) de cada factura:
select serie,numero,
sum(precioporunidad*cantidad) as total
from facturas
group by serie,numero;
<------------------------------------------------------------------>
40 - Indice de una tabla.
Para facilitar la obtencin de informacin de una tabla se utilizan ndices.
El indice de una tabla desempea la misma funcin que el ndice de un libro: permite e
ncontrar datos rpidamente; en el caso de las tablas, localiza registros.
Una tabla se indexa por un campo (o varios).
El ndice es un tipo de archivo con 2 entradas: un dato (un valor de algn campo de
la tabla) y un puntero.
Un ndice posibilita el acceso directo y rpido haciendo ms eficiente las bsquedas. Si
n ndice, se debe recorrer secuencialmente toda la tabla para encontrar un registr
o.
El objetivo de un indice es acelerar la recuperacin de informacin.
La desventaja es que consume espacio en el disco.
La indexacin es una tcnica que optimiza el acceso a los datos, mejora el rendimien
to acelerando las consultas y otras operaciones. Es til cuando la tabla contiene
miles de registros.
Los ndices se usan para varias operaciones:
- para buscar registros rpidamente.
- para recuperar registros de otras tablas empleando "join".
Es importante identificar el o los campos por los que sera til crear un indice, aq
uellos campos por los cuales se realizan operaciones de bsqueda con frecuencia.
Hay distintos tipos de ndices, a saber:
1) "primary key": es el que definimos como clave primaria. Los valores indexados
deben ser nicos y adems no pueden ser nulos. MySQL le da el nombre "PRIMARY". Una
tabla solamente puede tener una clave primaria.
2) "index": crea un indice comn, los valores no necesariamente son unicos y acept
an valores "null". Podemos darle un nombre, si no se lo damos, se coloca uno por
defecto. "key" es sinnimo de "index". Puede haber varios por tabla.
3) "unique": crea un indice para los cuales los valores deben ser nicos y diferen
tes, aparece un mensaje de error si intentamos agregar un registro con un valor
ya existente. Permite valores nulos y pueden definirse varios por tabla. Podemos
darle un nombre, si no se lo damos, se coloca uno por defecto.
Todos los ndices pueden ser multicolumna, es decir, pueden estar formados por ms d
e 1 campo.
En las siguientes lecciones aprenderemos sobre cada uno de ellos.
Una tabla puede tener hasta 64 ndices. Los nombres de ndices aceptan todos los car
acteres y pueden tener una longitud mxima de 64 caracteres. Pueden comenzar con u
n dgito, pero no pueden tener slo dgitos.
Una tabla puede ser indexada por campos de tipo numrico o de tipo caracter. Tambin
se puede indexar por un campo que contenga valores NULL, excepto los PRIMARY.
"show index" muestra informacin sobre los ndices de una tabla. Por ejemplo:
show index from libros;
<------------------------------------------------------------------->
41 - Indice de tipo primary.
El ndice llamado primary se crea automticamente cuando establecemos un campo como
clave primaria, no podemos crearlo directamente. El campo por el cual se indexa
puede ser de tipo numrico o de tipo caracter.
Los valores indexados deben ser nicos y adems no pueden ser nulos. Una tabla solam
ente puede tener una clave primaria por lo tanto, solamente tiene un ndice PRIMAR
Y.
Puede ser multicolumna, es decir, pueden estar formados por ms de 1 campo.
Veamos un ejemplo definiendo la tabla "libros" con una clave primaria:
create table libros(
codigo int unsigned auto_increment,
titulo varchar(40) not null,
autor varchar(30),
editorial varchar(15),
primary key(codigo)
);
Podemos ver la estructura de los ndices de una tabla con "show index". Por ejempl
o:
show index from libros;
Aparece el ndice PRIMARY creado automticamente al definir el campo "codigo" como c
lave primaria.
Problema :
Una empresa almacena los datos de sus clientes en una tabla llamada "clientes".
1- Elimine la tabla "clientes" si existe.
2- Crela con los siguientes campos y clave:
create table clientes(
documento char(8),
apellido varchar(20),
nombre varchar(20),
domicilio varchar(30),
primary key(documento)
);
3- Vea la estructura de los ndices la tabla y analice la informacin:
show index from clientes;
Segundo problema:
Un instituto de enseanza almacena los datos de sus estudiantes en una tabla llama
da "alumnos".
1- Elimine la tabla "alumnos" si existe.
2- Cree la tabla con la siguiente estructura:
create table alumnos(
legajo varchar(4) not null,
documento char(8) not null,
apellido varchar(30),
nombre varchar(30),
domicilio varchar(30),
primary key (legajo)
);
3- Vea la estructura de los ndices la tabla y analice la informacin:
show index from alumnos;
<------------------------------------------------------------------>
42 - Indice comn (index)
Dijimos que hay 3 tipos de ndices. Hasta ahora solamente conocemos la clave prima
ria que definimos al momento de crear una tabla.
Vamos a ver el otro tipo de ndice, comn. Un ndice comn se crea con "index", los valo
res no necesariamente son nicos y aceptan valores "null". Puede haber varios por
tabla.
Vamos a trabajar con nuestra tabla "libros".
Un campo por el cual realizamos consultas frecuentemente es "editorial", indexar
la tabla por ese campo sera til.
Creamos un ndice al momento de crear la tabla:
create table libros(
codigo int unsigned auto_increment,
titulo varchar(40) not null,
autor varchar(30),
editorial varchar(15),
primary key(codigo),
index i_editorial (editorial)
);
Luego de la definicin de los campos colocamos "index" seguido del nombre que le d
amos y entre parntesis el o los campos por los cuales se indexar dicho ndice.
"show index" muestra la estructura de los ndices:
show index from libros;
Si no le asignamos un nombre a un ndice, por defecto tomar el nombre del primer ca
mpo que forma parte del ndice, con un sufijo opcional (_2,_3,...) para que sea nic
o.
Ciertas tablas (MyISAM, InnoDB y BDB) soportan ndices en campos que permiten valo
res nulos, otras no, debiendo definirse el campo como "not null".
Se pueden crear ndices por varios campos:
create table libros(
codigo int unsigned auto_increment,
titulo varchar(40) not null,
autor varchar(30),
editorial varchar(15),
index i_tituloeditorial (titulo,editorial)
);
Para crear ndices por mltiple campos se listan los campos dentro de los parntesis s
eparados con comas. Los valores de los ndices se crean concatenando los valores d
e los campos mencionados.
Recuerde que "index" es sinnimo de "key".
Problema :
Retome la tabla llamada "medicamentos" de una farmacia.
1- Elimine la tabla, si existe.
2- Cree la tabla e indxela por el campo "laboratorio":
create table medicamentos(
codigo int unsigned auto_increment,
nombre varchar(20) not null,
laboratorio varchar(20),
precio decimal (6,2) unsigned,
cantidad int unsigned,
primary key(codigo),
index i_laboratorio (laboratorio)
);
3- Visualice los ndices de la tabla "medicamentos" y analice la informacin:
show index from medicamentos;
Segundo problema:
A) Retomamos la tabla "clientes" de una empresa.
1- Elimine la tabla "clientes", si existe.
2- Crela y defina un ndice por mltiples campos, por ciudad y provincia:
create table clientes (
documento char (8) not null,
nombre varchar(30) not null,
domicilio varchar(30),
ciudad varchar(20),
provincia varchar (20),
telefono varchar(11),
primary key (codigo),
index i_ciudadprovincia (ciudad,provincia)
);
3- Muestre los ndices:
show index from clientes;
4- Analice la informacin:
Aparecen 3 filas, 3 ndices. Uno de ellos corresponde a la clave primaria (PRIMARY
), es nico (los
valores no se repiten) y no acepta valores nulos. Otro ndice, llamado "i_ciudadpr
ovincia", es No
nico, es decir, acepta valores repetidos, consta de 2 campos, el orden es "ciudad
" y "provincia" y
acepta valores nulos (ambos campos).
Tercer Problema:
B) Trabaje con la tabla "agenda" que registra la informacin referente a sus amigo
s.
1- Elimine la tabla si existe.
2- Cree la tabla con la siguiente estructura:
create table agenda(
apellido varchar(30),
nombre varchar(20) not null,
domicilio varchar(30),
telefono varchar(11),
mail varchar(30),
index i_apellido (apellido)
);
3- Ingrese los siguientes registros:
insert into agenda values('Perez','Juan','Sarmiento 345','4334455','juancito@gm
ail.com');
insert into agenda values('Garcia','Ana','Urquiza 367','4226677','anamariagarci
a@hotmail.com');
insert into agenda values('Lopez','Juan','Avellaneda 900',null,'juancitoLopez@g
mail.com');
insert into agenda values('Juarez','Mariana','Sucre 123','0525657687','marianaJ
uarez2@gmail.com');
insert into agenda values('Molinari','Lucia','Peru 1254','4590987','molinariluc
ia@hotmail.com');
insert into agenda values('Ferreyra','Patricia','Colon 1534','4585858',null);
insert into agenda values('Perez','Susana','San Martin 333',null,null);
insert into agenda values('Perez','Luis','Urquiza
444','0354545256','perezluisalberto@hotmail.com');
insert into agenda values('Lopez','Maria','Salta 314',null,'lopezmariayo@gmail.
com');
4- Vea la informacin de los ndices:
show index from agenda;
5- Analice la informacin.
<------------------------------------------------------------------>
43 - Indice nico (unique)
Veamos el otro tipo de ndice, nico. Un ndice nico se crea con "unique", los valores
deben ser nicos y diferentes, aparece un mensaje de error si intentamos agregar u
n registro con un valor ya existente. Permite valores nulos y pueden definirse v
arios por tabla. Podemos darle un nombre, si no se lo damos, se coloca uno por d
efecto.
Vamos a trabajar con nuestra tabla "libros".
Crearemos dos ndices nicos, uno por un solo campo y otro multicolumna:
create table libros(
codigo int unsigned auto_increment,
titulo varchar(40) not null,
autor varchar(30),
editorial varchar(15),
unique i_codigo(codigo),
unique i_tituloeditorial (titulo,editorial)
);
Luego de la definicin de los campos colocamos "unique" seguido del nombre que le
damos y entre parntesis el o los campos por los cuales se indexar dicho ndice.
"show index" muestra la estructura de los ndices:
show index from libros;
RESUMEN: Hay 3 tipos de ndices con las siguientes caractersticas:
Tipo Nombre Palabra clave Valores nicos Acepta n
ull Cantidad por tabla
________________________________________________________________________________
___________________________
clave primaria PRIMARY no Si No
1
comn darlo o por defecto "index" o "key" No Si
varios
nico darlo o por defecto "unique" Si Si
varios
Problema :
Un instituto de enseanza guarda los siguientes datos de sus alumnos:
- ao de inscripcin,
- nmero de inscripto, comienza desde 1 cada ao,
- nombre del alumno,
- documento del alumno,
- domicilio,
- ciudad,
- provincia,
- clave primaria: nmero de inscripto y ao de inscripcin.
1- Elimine la tabla "alumnos" si existe.
2- Cree la tabla definiendo una clave primaria compuesta (ao de inscripcin y nmero
de
inscripto), un ndice nico por el campo "documento" y un ndice comn por ciudad y prov
incia:
create table alumnos(
ao year not null,
numero int unsigned not null,
nombre varchar(30),
documento char(8) not null,
domicilio varchar(30),
ciudad varchar(20),
provincia varchar(20),
primary key(ao,numero),
unique i_documento (documento),
index i_ciudadprovincia (ciudad,provincia),
);
3- Vea los ndices de la tabla.
4- Ingrese algunos registros. Ingrese 2 4 alumnos para los aos 2004, 2005 y 2006.
5- Intente ingresar un alumno con clave primaria repetida.
6- Intente ingresar un alumno con documento repetido.
7- Ingrese varios alumnos de la misma ciudad y provincia.
Segundo Problema:
A) Una clnica registra las consultas de los pacientes en una tabla llamada "consu
ltas" que
almacena la siguiente informacin:
- fecha de la consulta,
- nmero de consulta por da,
- documento del paciente,
- obra social del paciente,
- nombre del mdico que atiende al paciente,
1- Elimine la tabla si existe.
2- Cree la tabla con una clave primaria compuesta (fecha y nmero de consulta); un
ndice nico
(fecha,documento y mdico). Hay 2 campos por los cuales podemos realizar consultas

frecuentemente: "medico" y "obrasocial", cree ndices para esos campos.
3- Cree la tabla con la siguiente estructura:
create table consultas(
fecha date,
numero int unsigned,
documento char(8) not null,
obrasocial varchar(30),
medico varchar(30),
primary key(fecha,numero),
unique i_consulta(documento,fecha,medico),
index i_medico (medico),
index i_obrasocial (obrasocial)
);
4- Vea los ndices.
5- Los valores de la clave primaria no pueden repetirse. Intente ingresar dos pa
cientes el mismo
da con el mismo nmero de consulta.
6- Los valores para el ndice nico no pueden repetirse. Intente ingresar una consul
ta del mismo
paciente, en la misma fecha con el mismo mdico.
7- Note que los ndices por los campos "medico" y "obrasocial" son comunes, porque
los valores se
repiten. Ingrese consultas en las cuales se repitan los mdicos y las obras social
es.
Tercer Problema:
B) Una empresa de remises tiene registrada la informacin de sus vehculos en una ta
bla
llamada "remis".
1- Elimine la tabla si existe.
2- Cree la tabla con una clave primaria por nmero de vehculo y un ndice nico por "pa
tente",
ste es un valor por el cual podemos realizar consultas frecuentemente y es nico (i
gual que el
nmero del remis):
create table remis(
patente char(6) not null,
numero tinyint unsigned not null,
marca varchar(15),
modelo year,
primary key (numero),
unique i_patente (patente),
);
3- Vea los ndices y analice la informacin.
4- Los valores de la clave primaria no pueden repetirse. Intente ingresar 2 vehcu
los con el mismo
nmero.
5- Los valores para el ndice nico no pueden repetirse. Intente ingresar 2 vehculos
con igual
patente.
<------------------------------------------------------------------>
44 - Borrar indice (drop index)
Para eliminar un ndice usamos "drop index". Ejemplo:
drop index i_editorial on libros;
drop index i_tituloeditorial on libros;
Se elimina el ndice con "drop index" seguido de su nombre y "on" seguido del nomb
re de la tabla a la cual pertenece.
Podemos eliminar los ndices creados con "index" y con "unique" pero no el que se
crea al definir una clave primaria. Un ndice PRIMARY se elimina automticamente al
eliminar la clave primaria (tema que veremos ms adelante).
Problema :
Un instituto de enseanza guarda los datos de sus alumnos en una tabla llamada "al
umnos".
1- Elimine la tabla si existe.
2- Cree la tabla con la siguiente estructura:
create table alumnos(
ao year not null,
numero int unsigned not null,
nombre varchar(30),
documento char(8) not null,
domicilio varchar(30),
ciudad varchar(20),
provincia varchar(20),
primary key(ao,numero),
unique i_documento (documento),
index i_ciudadprovincia (ciudad,provincia),
);
3- Vea los ndices de la tabla.
4- Elimine el ndice "i_ciudadprovincia".
5- Verifique la eliminacin usando "show index".
6- Intente eliminar el ndice PRIMARY.
7- Elimine el ndice nico.
8- Verifique la eliminacin usando "show index".
Segundo problema:
Una clnica registra las consultas de los pacientes en una tabla llamada "consulta
s".
1- Elimine la tabla si existe.
2- Cree la tabla con la estructura siguiente:
create table consultas(
fecha date,
numero int unsigned,
documento char(8) not null,
obrasocial varchar(30),
medico varchar(30),
primary key(fecha,numero),
unique i_consulta(documento,fecha,medico),
index i_medico (medico),
index i_obrasocial (obrasocial)
);
4- Vea los ndices.
5- Elimine el ndice nico.
6- Elimine el ndice "i_medico".
7- Verifique las eliminaciones anteriores visualizando los ndices.
8- Elimine el ndice "i_obrasocial".
<------------------------------------------------------------------>
45 - Creacin de ndices a tablas existentes (create index)
Podemos agregar un ndice a una tabla existente.
Para agregar un ndice comn a la tabla "libros" tipeamos:
create index i_editorial on libros (editorial);
Entonces, para agregar un ndice comn a una tabla existente usamos "create index",
indicamos el nombre, sobre qu tabla y el o los campos por los cuales se indexar, e
ntre parntesis.
Para agregar un ndice nico a la tabla "libros" tipeamos:
create unique index i_tituloeditorial on libros (titulo,editorial);
Para agregar un ndice nico a una tabla existente usamos "create unique index", ind
icamos el nombre, sobre qu tabla y entre parntesis, el o los campos por los cuales
se indexar.
Un ndice PRIMARY no puede agregarse, se crea automticamente al definir una clave p
rimaria.
Problema :
Retome la tabla "clientes" que almacena informacin sobre los clientes de una empr
esa.
1- Elimine la tabla "clientes", si existe.
2- Crela con esta estructura:
create table clientes (
documento char (8) not null,
nombre varchar(30) not null,
domicilio varchar(30),
ciudad varchar(20),
provincia varchar (20),
telefono varchar(11)
);
3- Agregue un ndice comn por ciudad y provincia:
create index i_ciudadprovincia on clientes (ciudad,provincia);
4- Vea la informacin de los ndices:
show index from clientes;
5- Agregue un ndice nico por el campo "documento":
create unique index i_documento on clientes (documento);
Segundo problema:
Una clnica registra las consultas de los pacientes en una tabla llamada "consulta
s".
1- Elimine la tabla si existe.
2- Cree la tabla con la siguiente estructura:
create table consultas(
fecha date,
numero int unsigned,
documento char(8) not null,
obrasocial varchar(30),
medico varchar(30),
);
3- Agregue un ndice nico multicampo (fecha,documento,medico):
create unique index i_consulta on consultas (fecha,documento,medico);
4- Agregue un ndice comn por el campo "medico":
create index i_medico on consultas (medico);
5- Agregue un ndice comn por el campo "obrasocial":
create index i_obrasocial on consultas (obrasocial);
6- Vea los ndices.
<------------------------------------------------------------------>
46 - Clusula limit del comando select.
La clusula "limit" se usa para restringir los registros que se retornan en una co
nsulta "select".
Recibe 1 2 argumentos numricos enteros positivos; el primero indica el nmero del p
rimer registro a retornar, el segundo, el nmero mximo de registros a retornar. El
nmero de registro inicial es 0 (no 1).
Si el segundo argumento supera la cantidad de registros de la tabla, se limita h
asta el ltimo registro.
Ejemplo:
select * from libros limit 0,4;
Muestra los primeros 4 registros, 0,1,2 y 3.
Si tipeamos:
select * from libros limit 5,4;
recuperamos 4 registros, desde el 5 al 8.
Si se coloca un solo argumento, indica el mximo nmero de registros a retornar, com
enzando desde 0. Ejemplo:
select * from libros limit 8;
Muestra los primeros 8 registros.
Para recuperar los registros desde cierto nmero hasta el final, se puede colocar
un nmero grande para el segundo argumento:
select * from libros limit 6,10000;
recupera los registros 7 al ltimo.
"limit" puede combinarse con el comando "delete". Si queremos eliminar 2 registr
os de la tabla "libros" Usamos:
delete from libros
limit 2;
Podemos ordenar los regitros por precio (por ejemplo) y borrar 2:
delete from libros
order by precio
limit 2;
esta sentencia borrar los 2 primeros registros, es decir, los de precio ms bajo.
Podemos emplear la clusula "limit" para eliminar registros duplicados. Por ejempl
o, continuamos con la tabla "libros" de una librera, ya hemos almacenado el libro
"El aleph" de "Borges" de la editorial "Planeta", pero nos equivocamos y volvem
os a ingresar el mismo libro, del mismo autor y editorial 2 veces ms, es un error
que no controla MySQL. Para eliminar el libro duplicado y que slo quede un regis
tro de l vemos cuntos tenemos:
select * from libros
where titulo='El aleph' and
autor='Borges' and
editorial='Planeta';
Luego eliminamos con "limit" la cantidad sobrante (tenemos 3 y queremos solo 1):
delete from libros
where titulo='El aleph" and
autor='Borges' and
editorial='Planeta'
limit 2;
Un mensaje nos muestra la cantidad de registros eliminados.
Es decir, con "limit" indicamos la cantidad a eliminar.
Veamos cuntos hay ahora:
select * from libros
where titulo='El aleph" and
autor='Borges' and
editorial='Planeta';
Slo queda 1.
Problema :
Trabaje con la tabla "peliculas" de un video club que alquila pelculas en video.
1- Elimine la tabla, si existe.
- Crela con la siguiente estructura:
-codigo (entero sin signo, autoincrementable),
-titulo (cadena de 30), not null,
-actor (cadena de 20),
-duracion (entero sin signo no mayor a 200 aprox.),
-clave primaria (codigo).
3- Ingrese 10 registros.
4- Realice una consulta limitando la salida a slo 5 registros.
5- Muestre los registros desde el cero al 8 usando un solo argumento.
6- Muestre 3 registros a partir del 4.
7- Muestre los registros a partir del 2 hasta el final.
Segundo problema:
Trabaje con la tabla "agenda" que registra la informacin referente a sus amigos.
1- Elimine la tabla si existe.
2- Cree la tabla con la siguiente estructura:
create table agenda(
apellido varchar(30),
nombre varchar(20) not null,
domicilio varchar(30),
telefono varchar(11),
mail varchar(30),
index i_apellido (apellido)
);
3- Ingrese 10 registros.
4- Realice una consulta limitando la salida a slo 3 registros.
5- Muestre los registros desde el cero al 9 usando un solo argumento.
6- Muestre 5 registros a partir del 5.
7- Muestre los registros a partir del 7 hasta el final.
<------------------------------------------------------------------>
47 - Recuperacin de registros en forma aleatoria(rand)
Una librera que tiene almacenados los datos de sus libros en una tabla llamada "l
ibros" quiere donar a una institucin 5 libros tomados al azar.
Para recuperar de una tabla registros aleatorios se puede utilizar la funcin "ran
d()" combinada con "order by" y "limit":
select * from libros
order by rand()
limit 5;
Nos devuelve 5 registros tomados al azar de la tabla "libros".
Podemos ejecutar la sentencia anterior varias veces seguidas y veremos que los r
egistros recuperados son diferentes en cada ocasin.
Problema :
Trabajamos con la tabla "alumnos" en el cual un instituto de enseanza guarda los
datos de sus
alumnos.
Eliminamos la tabla "alumnos" si existe:
drop table if exists alumnos;
Creamos la tabla:
create table alumnos(
documento char(8) not null,
nombre varchar(30),
domicilio varchar(30),
ciudad varchar(20),
provincia varchar(20),
primary key(documento)
);
Agregamos varios registros:
insert into alumnos values('22333444','Juan Perez','Colon 123','Cordoba','Cordo
ba');
insert into alumnos values('23456789','Ana Acosta','Caseros 456','Cordoba','Cor
doba');
insert into alumnos values('24123123','Patricia Morales','Sucre 234','Villa del
Rosario','Cordoba');
insert into alumnos values('25000333','Jose Torres','Sarmiento 980','Carlos Paz
','Cordoba');
insert into alumnos values('26333444','Susana Molina','Avellaneda 234','Rosario
','Santa Fe');
insert into alumnos values('27987654','Marta Herrero','San Martin 356','Villa d
el
Rosario','Cordoba');
insert into alumnos values('28321321','Marcos Ferreyra','Urquiza 357','Cordoba'
,'Cordoba');
insert into alumnos values('30987464','Marta Perez','Rivadavia 234','Cordoba','
Cordoba');
El instituto quiere tomar 3 alumnos al azar para que representen al instituto en
una feria de
ciencias. Para recuperar de una tabla registros aleatorios se puede utilizar la
funcin "rand()"
combinada con "order by" y "limit":
select documento,nombre
from alumnos
order by rand()
limit 3;
Nos devuelve los nombres y documentos de 3 alumnos tomados al azar de la tabla "
alumnos". Podemos
ejecutar la sentencia anterior varias veces seguidas y veremos que los registros
recuperados son
diferentes en cada ocasin:
select documento,nombre from alumnos order by rand() limit 3;
select documento,nombre from alumnos order by rand() limit 3;
select documento,nombre from alumnos order by rand() limit 3;
Segundo problema:
Un comercio que vende artculos de computacin registra los datos de sus artculos en
una tabla con
ese nombre.
1- Elimine "articulos", si existe:
drop table if exists articulos;
2- Cree la tabla, con la siguiente estructura:
create table articulos(
codigo int unsigned auto_increment,
nombre varchar(25) not null,
descripcion varchar(30),
precio decimal(6,2) unsigned,
cantidad tinyint unsigned,
primary key(codigo)
);
3- Ingrese algunos registros:
insert into articulos (nombre, descripcion, precio,cantidad)
values ('impresora','Epson Stylus C45',400.80,20);
insert into articulos (nombre, descripcion, precio,cantidad)
values ('impresora','Epson Stylus C85',500,30);
insert into articulos (nombre, descripcion, precio,cantidad)
values ('monitor','Samsung 14',800,10);
insert into articulos (nombre, descripcion, precio,cantidad)
values ('teclado','ingles Biswal',100,50);
insert into articulos (nombre, descripcion, precio,cantidad)
values ('teclado','espaol Biswal',90,50);
insert into articulos (nombre, descripcion, precio,cantidad)
values ('impresora multifuncion','HP 1410',300,20);
4- El comercio quiere tomar 2 artculos al azar para ofrecer una oferta especial h
aciendo un
descuento. Seleccione 2 registros al azar de la tabla "articulos":
select * from articulos
order by rand()
limit 2;
Ejecute la sentencia varias veces para verificar que los registros seleccionados
son diferentes.
<------------------------------------------------------------------>
48 - Remplazar registros (replace)
"replace" reemplaza un registro por otro.
Cuando intentamos ingresar con "insert" un registro que repite el valor de un ca
mpo clave o indexado con ndice nico, aparece un mensaje de error indicando que el
valor est duplicado. Si empleamos "replace" en lugar de "insert", el registro exi
stente se borra y se ingresa el nuevo, de esta manera no se duplica el valor nico
.
Si tenemos la tabla "libros" con el campo "codigo" establecido como clave primar
ia e intentamos ingresar ("insert") un valor de cdigo existente, aparece un mensa
je de error porque no est permitido repetir los valores del campo clave. Si emple
amos "replace" en lugar de "insert", la sentencia se ejecuta reemplazando el reg
istro con el valor de cdigo existente por el nuevo registro.
Veamos un ejemplo. Tenemos los siguientes registros almacenados en "libros":
codigo titulo autor editorial precio
_______________________________________________________________
10 Alicia en .. Lewis Carroll Emece 15.4
15 Aprenda PHP Mario Molina Planeta 45.8
23 El aleph Borges Planeta 23.0
Intentamos insertar un registro con valor de clave repetida (cdigo 23):
insert into libros values(23,'Java en 10 minutos','Mario Molina','Emece',25.5);
Aparece un mensaje de error indicando que hay registros duplicados.
Si empleamos "replace":
replace into libros values(23,'Java en 10 minutos','Mario Molina','Emece',25.5)
;
la sentencia se ejecuta y aparece un mensaje indicando que se afectaron 2 filas,
esto es porque un registro se elimin y otro se insert.
"replace" funciona como "insert" en los siguientes casos: - si los datos ingresa
dos no afectan al campo nico, es decir no se ingresa valor para el campo indexado
:
replace into libros(titulo,autor,editorial,precio)
values('Cervantes y el quijote','Borges','Paidos',28);
aparece un mensaje indicando que se afect un solo registro, el ingresado, que se
guarda con valor de cdigo 0.
- si el dato para el campo indexado que se ingresa no existe:
replace into libros values(30,'Matematica estas ahi','Paenza','Paidos',12.8);
aparece un mensaje indicando que se afect solo una fila, no hubo reemplazo porque
el cdigo no exista antes de la nueva insercin.
- si la tabla no tiene indexacin. Si la tabla "libros" no tuviera establecida nin
guna clave primaria (ni ndice nico), podramos ingresar varios registros con igual cd
igo:
replace into libros values(1,'Harry Potter ya la piedra filosofal','Hawking','E
mece',48);
aparecera un mensaje indicando que se afect 1 registro (el ingresado), no se reemp
laz ninguno y ahora habra 2 libros con cdigo 1.
Problema :
Un instituto de enseanza guarda los datos de sus alumnos en la tabla "alumnos".
1- Elimine la tabla si existe:
drop table if exists alumnos;
2- Cree la tabla:
create table alumnos(
legajo int(10) unsigned auto_increment,
nombre varchar(30),
documento char(8),
domicilio varchar(30),
primary key(legajo),
unique i_documento (documento)
);
3- Ingrese algunos registros:
insert into alumnos values('1353','Juan Lopez','22333444','Colon 123');
insert into alumnos values('2345','Ana Acosta','24000555','Caseros 456');
insert into alumnos values('2356','Jose Torres','26888777','Sucre 312');
insert into alumnos values('3567','Luis Perez','28020020','Rivadavia 234');
4- Intente ingresar un registro con clave primaria repetida (legajo "3567"):
insert into alumnos values('3567','Marcos Pereyra','30000333','Guemes 134');
aparece un mensaje de error.
5- Ingrese el registro anterior reemplazando el existente:
replace into alumnos values('3567','Marcos Pereyra','30000333','Guemes 134');
6- Intente ingresar un alumno con documento repetido:
insert into alumnos values('4567','Susana Juarez','30000333','Avellaneda 33');
aparece un mensaje de error.
7- Reemplace el registro:
replace into alumnos values('4567','Susana Juarez','30000333','Avellaneda 33');
note que el alumno con documento "30000333" se elimin y se reemplaz por el nuevo r
egistro.
8- Elimine el ndice nico:
drop index i_documento on alumnos;
9- Ingrese con "replace" el siguiente registro con documento existente:
replace into alumnos values('4888','Gustavo Garcia','30000333','San Martin 846'
);
un registro afectado, no hubo eliminacin solamente insercin.
10- Muestre todos los registros:
select * from alumnos;
note que hay dos alumnos con el mismo nmero de documento.
<------------------------------------------------------------------>
49 - Agregar campos a una tabla (alter table - add)
Para modificar la estructura de una tabla existente, usamos "alter table".
"alter table" se usa para:
- agregar nuevos campos,
- eliminar campos existentes,
- modificar el tipo de dato de un campo,
- agregar o quitar modificadores como "null", "unsigned", "auto_increment",
- cambiar el nombre de un campo,
- agregar o eliminar la clave primaria,
- agregar y eliminar ndices,
- renombrar una tabla.
"alter table" hace una copia temporal de la tabla original, realiza los cambios
en la copia, luego borra la tabla original y renombra la copia.
Aprenderemos a agregar campos a una tabla.
Para ello utilizamos nuestra tabla "libros", definida con la siguiente estructur
a:
- cdigo, int unsigned auto_increment, clave primaria,
- titulo, varchar(40) not null,
- autor, varchar(30),
- editorial, varchar (20),
- precio, decimal(5,2) unsigned.
Necesitamos agregar el campo "cantidad", de tipo smallint unsigned not null, tip
eamos:
alter table libros
add cantidad smallint unsigned not null;
Usamos "alter table" seguido del nombre de la tabla y "add" seguido del nombre d
el nuevo campo con su tipo y los modificadores.
Agreguemos otro campo a la tabla:
alter table libros
add edicion date;
Si intentamos agregar un campo con un nombre existente, aparece un mensaje de er
ror indicando que el campo ya existe y la sentencia no se ejecuta.
Cuando se agrega un campo, si no especificamos, lo coloca al final, despus de tod
os los campos existentes; podemos indicar su posicin (luego de qu campo debe apare
cer) con "after":
alter table libros
add cantidad tinyint unsigned after autor;
Problema :
Trabaje con la tabla "peliculas" de un video club.
1- Elimine la tabla, si existe.
2- Cree la tabla con la siguiente estructura:
create table peliculas(
codigo int unsigned auto_increment,
nombre varchar(30) not null,
actor varchar(20),
primary key(codigo)
);
3- Ingrese algunos registros.
4- Agregue un campo para almacenar la duracin de la pelcula, de tipo tinyint unsig
ned:
alter table peliculas
add duracion tinyint unsigned;
5- Visualice la estructura de la tabla con "describe".
6- Agregue el campo "director" para almacenar el nombre del director, de tipo va
rchar(20):
alter table peliculas
add director varchar(20);
7- Visualice la estructura de la tabla con su nuevo campo:
describe peliculas;
8- Intente agregar un campo existente. Aparece un mensaje de error:
alter table peliculas
add actor varchar(20);
Segundo problema:
Un comercio que vende por mayor artculos de librera y papelera tiene una tabla
llamada "articulos".
1- Elimine la tabla, si existe.
2- Cree la tabla con la siguiente estructura:
create table articulos(
codigo int unsigned auto_increment,
nombre varchar(20) not null,
descripcion varchar(30),
precio decimal(4,2) unsigned,
primary key(codigo)
);
3- Ingrese los siguientes registros:
insert into articulos (nombre,descripcion,precio)
values('escuadra','plastico 20 cm.',3.50);
insert into articulos (nombre,descripcion,precio)
values('lpices colores','Join x12',4.50);
insert into articulos (nombre,descripcion,precio)
values('lpices colores','Join x24',7.50);
insert into articulos (nombre,descripcion,precio)
values('regla','30 cm.',2.50);
insert into articulos (nombre,descripcion,precio)
values('fibras','Join x12',10.30);
insert into articulos (nombre,descripcion,precio)
values('fibras','Join x6',5.10);
4- El comercio, que hasta ahora ha vendido sus artculos por mayor, comenzar la ven
ta por menor.
Necesita alterar la tabla agregando un campo para almacenar el precio por menor
para cada artculo.
Agrege un campo llamado "preciopormenor":
alter table articulos
add preciopormenor decimal(4,2) unsigned;
5- Muestre todos los registros:
select * from articulos;
Note que para el nuevo campo los valores se setearon en "null".
6- Actualice el campo "preciopormenor" de todos los registros, dndole el valor de
l campo "precio"
incrementado en un 10%:
update articulos set preciopormenor=precio+(precio*0.10);
7- Muestre todos los registros:
select * from articulos;
<------------------------------------------------------------------>
50 - Eliminar campos de una tabla (alter table - drop)
"alter table" nos permite alterar la estructura de la tabla, podemos usarla para
eliminar un campo.
Continuamos con nuestra tabla "libros".
Para eliminar el campo "edicion" tipeamos:
alter table libros
drop edicion;
Entonces, para borrar un campo de una tabla usamos "alter table" junto con "drop
" y el nombre del campo a eliminar.
Si intentamos borrar un campo inexistente aparece un mensaje de error y la accin
no se realiza.
Podemos eliminar 2 campos en una misma sentencia:
alter table libros
drop editorial, drop cantidad;
Si se borra un campo de una tabla que es parte de un ndice, tambin se borra el ndic
e.
Si una tabla tiene slo un campo, ste no puede ser borrado.
Hay que tener cuidado al eliminar un campo, ste puede ser clave primaria. Es posi
ble eliminar un campo que es clave primaria, no aparece ningn mensaje:
alter table libros
drop codigo;
Si eliminamos un campo clave, la clave tambin se elimina.
Problema :
Trabaje con la tabla "peliculas" de un video club.
1- Elimine la tabla, si existe.
2- Cree la tabla con la siguiente estructura:
create table peliculas(
codigo int unsigned auto_increment,
nombre varchar(30) not null,
protagonista varchar(20),
actorsecundario varchar(20),
director varchar(25),
duracion tinyint unsigned,
primary key(codigo),
index i_director (director)
);
3- Ingrese algunos registros.
4- Vea los ndices:
show index from peliculas;
5- Elimine el campo "director":
alter table peliculas
drop director;
6- Visualice la estructura modificada:
describe peliculas;
7- Vea los ndices:
show index from peliculas;
Note que el ndice por "editorial" ya no existe, esto es porque si borra un campo
que es parte de
un ndice, tambin se borra el ndice.
8- Intente eliminar un campo inexistente. Aparece un mensaje de error:
alter table peliculas
drop director;
9- Elimine los campos "actorsecundario" y "duracion" en una misma sentencia:
alter table peliculas
drop actorsecundario, drop cantidad;
Segundo problema:
Trabajamos con nuestra tabla "usuarios" que almacena los nombres de los usuarios
y sus claves.
1- Elimine la tabla si existe.
2- Cree la tabla:
create table usuarios (
nombre varchar(30),
clave varchar(10)
);
3- Elimine el campo "clave":
alter table usuarios
drop clave;
4- Visualice la estructura de la tabla:
describe usuarios;
5- Intente eliminar el nico campo de la tabla:
alter table usuarios
drop nombre;
Aparece un mensaje de error y la sentencia no se ejecuta, esto es porque no se p
uede dejar una
tabla vaca de campos.
<------------------------------------------------------------------>
51 - Modificar campos de una tabla (alter table - modify)
Con "alter table" podemos modificar el tipo de algn campo incluidos sus atributos
.
Continuamos con nuestra tabla "libros", definida con la siguiente estructura:
- cdigo, int unsigned,
- titulo, varchar(30) not null,
- autor, varchar(30),
- editorial, varchar (20),
- precio, decimal(5,2) unsigned,
- cantidad int unsigned.
Queremos modificar el tipo del campo "cantidad", como guardaremos valores que no
superarn los 50000 usaremos smallint unsigned, tipeamos:
alter table libros
modify cantidad smallint unsigned;
Usamos "alter table" seguido del nombre de la tabla y "modify" seguido del nombr
e del nuevo campo con su tipo y los modificadores.
Queremos modificar el tipo del campo "titulo" para poder almacenar una longitud
de 40 caracteres y que no permita valores nulos, tipeamos:
alter table libros
modify titulo varchar(40) not null;
Hay que tener cuidado al alterar los tipos de los campos de una tabla que ya tie
ne registros cargados. Si tenemos un campo de texto de longitud 50 y lo cambiamo
s a 30 de longitud, los registros cargados en ese campo que superen los 30 carac
teres, se cortarn.
Igualmente, si un campo fue definido permitiendo valores nulos, se cargaron regi
stros con valores nulos y luego se lo define "not null", todos los registros con
valor nulo para ese campo cambiarn al valor por defecto segn el tipo (cadena vaca
para tipo texto y 0 para numricos), ya que "null" se convierte en un valor invlido
.
Si definimos un campo de tipo decimal(5,2) y tenemos un registro con el valor "9
00.00" y luego modificamos el campo a "decimal(4,2)", el valor "900.00" se convi
erte en un valor invlido para el tipo, entonces guarda en su lugar, el valor lmite
ms cercano, "99.99".
Si intentamos definir "auto_increment" un campo que no es clave primaria, aparec
e un mensaje de error indicando que el campo debe ser clave primaria. Por ejempl
o:
alter table libros
modify codigo int unsigned auto_increment;
"alter table" combinado con "modify" permite agregar y quitar campos y atributos
de campos. Para modificar el valor por defecto ("default") de un campo podemos
usar tambin "modify" pero debemos colocar el tipo y sus modificadores, entonces r
esulta muy extenso, podemos setear slo el valor por defecto con la siguienmte sin
taxis:
alter table libros
alter autor set default 'Varios';
Para eliminar el valor por defecto podemos emplear:
alter table libros
alter autor drop default;
Problema :
Trabaje con la tabla "peliculas" de un video club.
1- Elimine la tabla, si existe.
2- Cree la tabla con la siguiente estructura:
create table peliculas(
codigo int unsigned,
nombre varchar(20) not null,
actor varchar(20),
director varchar(25),
duracion tinyint
);
3- Modifique el campo "duracion" por tinyint unsigned.
alter table peliculas
modify duracion tinyint unsigned;
4- Modifique el campo "nombre" para poder almacenar una longitud de 40 caractere
s y que no permita
valores nulos:
alter table peliculas
modify nombre varchar(40) not null;
5- Modifique el campo "actor" para que no permita valores nulos:
alter table peliculas
modify actor varchar(20) not null;
6- Intente definir "auto_increment" el campo "codigo" (mensaje de error):
alter table peliculas
modify codigo int unsigned auto_increment;
Segundo problema:
Un comercio que vende artculos de computacin registra los datos de sus artculos en
una tabla con
ese nombre.
1- Elimine "articulos", si existe.
2- Cree la tabla, con la siguiente estructura:
create table articulos(
codigo int unsigned,
nombre varchar(25) not null,
descripcion varchar(30),
precio decimal(4,2) unsigned,
cantidad tinyint,
primary key(codigo)
);
3- Modifique el campo "precio" para que pueda guardar valores hasta "9999.99".
4- Modifique el campo "codigo" para que se autoincremente.
5- Modifique el campo "cantidad" para que no permita valores negativos.
<------------------------------------------------------------------>
52 - Cambiar el nombre de un campo de una tabla (alter table - change)
Con "alter table" podemos cambiar el nombre de los campos de una tabla.
Continuamos con nuestra tabla "libros", definida con la siguiente estructura:
- cdigo, int unsigned auto_increment,
- nombre, varchar(40),
- autor, varchar(30),
- editorial, varchar (20),
- costo, decimal(5,2) unsigned,
- cantidad int unsigned,
- clave primaria: cdigo.
Queremos cambiar el nombre del campo "costo" por "precio", tipeamos:
alter table libros
change costo precio decimal (5,2);
Usamos "alter table" seguido del nombre de la tabla y "change" seguido del nombr
e actual y el nombre nuevo con su tipo y los modificadores.
Con "change" cambiamos el nombre de un campo y tambin podemos cambiar el tipo y s
us modificadores. Por ejemplo, queremos cambiar el nombre del campo "nombre" por
"titulo" y redefinirlo como "not null", tipeamos:
alter table libros
change nombre titulo varchar(40) not null;
Problema :
Un comercio que vende por mayor artculos de librera y papelera tiene una tabla
llamada "articulos".
1- Elimine la tabla, si existe.
2- Cree la tabla con la siguiente estructura:
create table articulos(
codigo int unsigned auto_increment,
nombre varchar(20) not null,
descripcion varchar(30),
precio decimal(4,2) unsigned,
primary key(codigo)
);
3- Ingrese los siguientes registros:
insert into articulos (nombre,descripcion,precio)
values('escuadra','plastico 20 cm.',3.50);
insert into articulos (nombre,descripcion,precio)
values('lpices colores','Faber x12',4.50);
insert into articulos (nombre,descripcion,precio)
values('lpices colores','Faber x24',7.50);
insert into articulos (nombre,descripcion,precio)
values('regla','30 cm.',2.50);
insert into articulos (nombre,descripcion,precio)
values('fibras','Faber x12',10.30);
insert into articulos (nombre,descripcion,precio)
values('fibras','Faber x6',5.10);
4- El comercio, que hasta ahora ha vendido sus artculos por mayor comenzar la vent
a por menor.
Necesita alterar la tabla modificando el nombre del campo "precio" por "preciopo
rmayor" adems
desea redefinirlo como no nulo:
alter table articulos
change precio preciopormayor decimal(4,2) unsigned not null;
5- Tambin necesita alterar la tabla agregando un campo para almacenar el precio p
or menor para
cada artculo. Agrege un campo llamado "preciopormenor" que no permita valores nul
os:
alter table articulos
add preciopormenor decimal(4,2) unsigned not null;
6- Muestre todos los registros:
select * from articulos;
Note que para el nuevo campo los valores se setearon en "null".
7- Actualice el campo "preciopormenor" de todos los registros, dndole el valor de
l campo "precio"
incrementado en un 10%:
update articulos set preciopormenor=precio+(precio*0.10);
8- Muestre todos los registros:
select * from articulos;
Segundo problema:
Trabaje con la tabla "peliculas" de un video club.
1- Elimine la tabla, si existe.
2- Cree la tabla con la siguiente estructura:
create table peliculas(
codigo int unsigned,
nombre varchar(40) not null,
actor varchar(20),
director varchar(25),
duracion tinyint unsigned
);
3- Cambie el nombre del campo "actor" por "protagonista" y modifquelo para que pe
rmita valores
nulos:
alter table peliculas
change actor protagonista varchar(20);
4- Cambie el campo "nombre" por "titulo" sin alterar los otros atributos:
alter table peliculas
change nombre titulo varchar(40) not null;
5- Cambie el nombre del campo "duracion" por "minutos":
alter table peliculas
change duracion minutos tinyint unsigned;
<------------------------------------------------------------------>
53 - Agregar y eliminar la clave primaria (alter table)
Hasta ahora hemos aprendido a definir una clave primaria al momento de crear una
tabla. Con "alter table" podemos agregar una clave primaria a una tabla existen
te.
Continuamos con nuestra tabla "libros", definida con la siguiente estructura:
- cdigo, int unsigned auto_increment,
- titulo, varchar(40),
- autor, varchar(30),
- editorial, varchar (20),
- precio, decimal(5,2) unsigned,
- cantidad smallint unsigned.
Para agregar una clave primaria a una tabla existente usamos:
alter table libros
add primary key (codigo);
Usamos "alter table" con "add primary key" y entre parntesis el nombre del campo
que ser clave.
Si intentamos agregar otra clave primaria, aparecer un mensaje de error porque (r
ecuerde) una tabla solamente puede tener una clave primaria.
Para que un campo agregado como clave primaria sea autoincrementable, es necesar
io agregarlo como clave y luego redefinirlo con "modify" como "auto_increment".
No se puede agregar una clave y al mismo tiempo definir el campo autoincrementab
le. Tampoco es posible definir un campo como autoincrementable y luego agregarlo
como clave porque para definir un campo "auto_increment" ste debe ser clave prim
aria.
Tambin usamos "alter table" para eliminar una clave primaria.
Para eliminar una clave primaria usamos:
alter table libros
drop primary key;
Con "alter table" y "drop primary key" eliminamos una clave primaria definida al
crear la tabla o agregada luego.
Si queremos eliminar la clave primaria establecida en un campo "auto_increment"
aparece un mensaje de error y la sentencia no se ejecuta porque si existe un cam
po con este atributo DEBE ser clave primaria. Primero se debe modificar el campo
quitndole el atributo "auto_increment" y luego se podr eliminar la clave.
Si intentamos establecer como clave primaria un campo que tiene valores repetido
s, aparece un mensaje de error y la operacin no se realiza.
Problema :
Trabaje con la tabla llamada "medicamentos" de una farmacia.
1- Elimine la tabla, si existe:
drop table if exists medicamentos;
2- Cree la tabla con la siguiente estructura:
create table medicamentos(
codigo int unsigned not null,
nombre varchar(20) not null,
laboratorio varchar(20),
precio decimal(6,2) unsigned
);
3- Visualice la estructura de la tabla "medicamentos".
4- Agregue una clave primaria por "codigo":
alter table medicamentos
add primary key (codigo);
La clave agregada, no es auto_increment, por ello, al agregar registros debemos
ingresar el cdigo,
si no lo hacemos, se almacenar el valor "0" en el primer registro agregado:
insert into medicamentos (nombre, laboratorio,precio)
values('Sertal compuesto','Bayer',5.10);
y si intentamos agregar ms registros, aparecer un mensaje indicando que la clave e
st repetida:
insert into medicamentos (nombre, laboratorio,precio)
values('Paracetamol 1000','Bago',2.90);
5- Para solucionar esto podemos modificar el campo convirtindolo en autoincrement
able:
alter table medicamentos
modify codigo int unsigned auto_increment;
6- Veamos los registros:
select * from medicamentos;
El cdigo se alter, ahora tiene el valor "1".
7- Ingrese ms registros:
insert into medicamentos (nombre, laboratorio,precio)
values('Paracetamol 500','Bago',1.90);
insert into medicamentos (nombre, laboratorio,precio)
values('Bayaspirina','Bayer',2.10);
8- Intente eliminar la clave primaria:
alter table medicamentos
drop primary key;
Aparece un mensaje de error. La clave no se puede eliminar porque el campo "codi
go"
es "auto_increment" y si existe un campo con este atributo DEBE ser clave primar
ia.
9- Modifique el campo "codigo" quitndole el atributo "auto_increment":
alter table medicamentos
modify codigo int unsigned not null;
10- Elimine la clave primaria:
alter table medicamentos
drop primary key;
Segundo problema:
Una pequea biblioteca de barrio registra los prstamos de sus libros en una tabla l
lamada "prestamos".
1- Elimine la tabla "prestamos" si existe.
2- Cree la tabla:
create table prestamos(
codigo int unsigned,
titulo varchar(40) not null,
documento char(8) not null,
fechaprestamo date not null,
fechadevolucion date,
devuelto char(1) /* si se devolvi 's' sino 'n'*/
);
3- Agregue una clave primaria compuesta por "codigo" y "fechaprestamo":
alter table prestamos
add primary key (codigo,fechaprestamo);
4- Intente agregar un registro con clave repetida.
5- Elimine la clave primaria:
alter table prestamos
drop primary key;
<------------------------------------------------------------------>
54 - Agregar ndices(alter table - add index)
Aprendimos a crear ndices al momento de crear una tabla. Tambin a crearlos luego d
e haber creado la tabla, con "create index". Tambin podemos agregarlos a una tabl
a usando "alter table".
Creamos la tabla "libros":
create table libros(
codigo int unsigned,
titulo varchar(40),
autor varchar(30),
editorial varchar (20),
precio decimal(5,2) unsigned,
cantidad smallint unsigned
);
Para agregar un ndice comn por el campo "editorial" usamos la siguiente sentencia:
alter table libros
add index i_editorial (editorial);
Usamos "alter table" junto con "add index" seguido del nombre que le daremos al n
dice y entre parntesis el nombre de el o los campos por los cuales se indexar.
Para agregar un ndice nico multicampo, por los campos "titulo" y "editorial", usam
os la siguiente sentencia:
alter table libros
add unique index i_tituloeditorial (titulo,editorial);
Usamos "alter table" junto con "add unique index" seguido del nombre que le dare
mos al ndice y entre parntesis el nombre de el o los campos por los cuales se inde
xar.
En ambos casos, para ndices comunes o nicos, si no colocamos nombre de ndice, se co
loca uno por defecto, como cuando los creamos junto con la tabla.
Problema :
Trabaje con la tabla "alumnos" en el cual un instituto de enseanza guarda los dat
os de sus alumnos.
1- Elimine la tabla "alumnos" si existe.
2- Cree la tabla:
create table alumnos(
legajo int unsigned auto_increment,
nombre varchar(30),
documento char(8) not null,
domicilio varchar(30),
ciudad varchar(20),
provincia varchar(20),
primary key(legajo)
);
3- Vea los ndices de la tabla.
4- Agregue un ndice comn por los campos "ciudad" y "provincia" (que pueden repetir
se):
alter table alumnos
add index i_ciudadprovincia(ciudad,provincia);
5- Agregue un ndice nico (no pueden repetirse los valores) por el campo "documento
":
alter table alumnos
add unique index i_documento (documento);
6- Visualice los ndices:
show index from alumnos;
Segundo problema:
Una clnica registra las consultas de los pacientes en una tabla llamada "consulta
s".
1- Elimine la tabla si existe.
2- Cree la tabla con una clave primaria compuesta (fecha y nmero de consulta):
create table consultas(
fecha date,
numero int unsigned,
documento char(8) not null,
obrasocial varchar(30),
medico varchar(30),
primary key(fecha,numero)
);
3- Agregue un ndice nico llamado "i_consulta" compuesto por los campos "documento"
, "fecha"
y "medico":
alter table consultas
add unique index i_consulta(documento,fecha,medico);
4- Hay 2 campos por los cuales podemos realizar consultas frecuentemente: "medic
o" y "obrasocial",
cree ndices comunes para esos campos:
alter table consultas
add index i_medico (medico);
alter table consultas
add index i_obrasocial (obrasocial);
5- Vea los ndices.
<------------------------------------------------------------------>
55 - Borrado de ndices (alter table - drop index)
Los ndices comn y nicos se eliminan con "alter table".
Trabajamos con la tabla "libros" de una librera, que tiene los siguientes campos
e ndices:
create table libros(
codigo int unsigned auto_increment,
titulo varchar(40) not null,
autor varchar(30),
editorial varchar(15),
primary key(codigo),
index i_editorial (editorial),
unique i_tituloeditorial (titulo,editorial)
);
Para eliminar un ndice usamos la siguiente sintaxis:
alter table libros
drop index i_editorial;
Usamos "alter table" y "drop index" seguido del nombre del ndice a borrar.
Para eliminar un ndice nico usamos la misma sintaxis:
alter table libros
drop index i_tituloeditorial;
Problema :
Trabajamos con la tabla "alumnos" en la cual un instituto de enseanza guarda los
datos de sus
alumnos.
1- Elimine la tabla "alumnos" si existe.
2- Cree la tabla con los siguientes ndices:
create table alumnos(
ao year not null,
numero int unsigned not null,
nombre varchar(30),
documento char(8) not null,
domicilio varchar(30),
ciudad varchar(20),
provincia varchar(20),
primary key(ao,numero),
unique i_documento (documento),
index i_ciudadprovincia (ciudad,provincia),
);
3- Vea los ndices de la tabla.
4- Elimine el ndice nico:
alter table alumnos
drop index i_documento;
5- Elimine el ndice comn:
alter table alumnos
drop index i_ciudadprovincia;
6- Vea los ndices:
show index from alumnos;
Segundo problema:
Una clnica registra las consultas de los pacientes en una tabla llamada "consulta
s".
1- Elimine la tabla si existe.
2- Cree la tabla con la siguiente estructura:
create table consultas(
fecha date,
numero int unsigned,
documento char(8) not null,
obrasocial varchar(30),
medico varchar(30),
primary key(fecha,numero),
unique i_consulta(documento,fecha,medico),
index i_medico (medico),
index i_obrasocial (obrasocial)
);
3- Vea los ndices de la tabla.
4- Elimine el ndice nico:
alter table consultas
drop index i_consulta;
5- Elimine los ndices comumes:
alter table consultas
drop index i_medico;
alter table consultas
drop index i_obrasocial;
6- Vea los ndices:
show index from consultas;
<------------------------------------------------------------------>
56 - renombrar tablas (alter table - rename - rename table)
Podemos cambiar el nombre de una tabla con "alter table".
Para cambiar el nombre de una tabla llamada "amigos" por "contactos" usamos esta
sintaxis:
alter table amigos rename contactos;
Entonces usamos "alter table" seguido del nombre actual, "rename" y el nuevo nom
bre.
Tambin podemos cambiar el nombre a una tabla usando la siguiente sintaxis:
rename table amigos to contactos;
La renombracin se hace de izquierda a derecha, con lo cual, si queremos intercamb
iar los nombres de dos tablas, debemos tipear lo siguiente:
rename table amigos to auxiliar,
contactos to amigos,
auxiliar to contactos;
Problema :
Trabajamos con la tabla "peliculas" de un video club.
1- Elimine la tabla, si existe.
2- Cree la tabla "peliculas":
create table peliculas(
codigo int unsigned auto_increment,
titulo varchar(40),
duracion tinyint unsigned
);
3- Cambie el nombre de la tabla por "films" con "alter table":
alter table peliculas rename films;
4- Vea si existen las tablas "peliculas" y "films":
show tables;
5- Cambie nuevamente el nombre, de la tabla "films" por "peliculas" usando "rena
me":
rename table films to peliculas;
6- vea si existen las tablas:
show tables;
Segundo problema:
Una empresa tiene almacenados los datos de sus clientes en una tabla llamada "cl
ientes" y los datos
de sus empleados en otra tabla denominada "empleados".
1- Elimine ambas tablas si existen.
2- Cree las tablas dndoles el nombre equivocado, es decir, de el nombre "clientes
" a la tabla que
contiene los datos de los empleados y el nombre "empleados" a la tabla con la in
formacimn de los
clientes:
create table clientes(
documento char(8) not null,
nombre varchar(30),
domicilio varchar(30),
fechaingreso date,
sueldo decimal(6,2) unsigned
);
create table empleados(
documento char(8) not null,
nombre varchar(30),
domicilio varchar(30),
ciudad varchar(30),
provincia varchar(30)
);
3- Vea la estructura de ambas tablas:
describe clientes;
describe empleados;
4- Intercambie los nombres de las dos tablas:
rename table clientes to auxiliar,
empleados to clientes,
auxiliar to empleados;
5- Verifique el cambio de nombre:
describe clientes;
describe empleados;
6- Vea si existe la tabla "auxiliar":
show tables;
<------------------------------------------------------------------>
57 - Tipo de dato enum.
Adems de los tipos de datos ya conocidos, existen otros que analizaremos ahora, l
os tipos "enum" y "set".
El tipo de dato "enum" representa una enumeracin. Puede tener un mximo de 65535 va
lores distintos. Es una cadena cuyo valor se elige de una lista enumerada de val
ores permitidos que se especifica al definir el campo. Puede ser una cadena vaca,
incluso "null".
Los valores presentados como permitidos tienen un valor de ndice que comienza en
1.
Una empresa necesita personal, varias personas se han presentado para cubrir dis
tintos cargos. La empresa almacena los datos de los postulantes a los puestos en
una tabla llamada "postulantes". Le interesa, entre otras cosas, conocer los es
tudios que tiene cada persona, si tiene estudios primario, secundario, terciario
, universitario o ninguno. Para ello, crea un campo de tipo "enum" con esos valo
res.
Para definir un campo de tipo "enum" usamos la siguiente sintaxis al crear la ta
bla:
create table postulantes(
numero int unsigned auto_increment,
documento char(8),
nombre varchar(30),
estudios enum('ninguno','primario','secundario', 'terciario','universitario'),
primary key(numero)
);
Los valores presentados deben ser cadenas de caracteres.
Si un "enum" permite valores nulos, el valor por defecto el "null"; si no permit
e valores nulos, el valor por defecto es el primer valor de la lista de permitid
os.
Si se ingresa un valor numrico, lo interpreta como ndice de la enumeracin y almacen
a el valor de la lista con dicho nmero de ndice. Por ejemplo:
insert into postulantes (documento,nombre,estudios)
values('22255265','Juana Pereyra',5);
En el campo "estudios" almacenar "universitario" que es valor de ndice 5.
Si se ingresa un valor invlido, puede ser un valor no presente en la lista o un v
alor de ndice fuera de rango, coloca una cadena vaca. Por ejemplo:
insert into postulantes (documento,nombre,estudios)
values('22255265','Juana Pereyra',0);
insert into postulantes (documento,nombre,estudios)
values('22255265','Juana Pereyra',6);
insert into postulantes (documento,nombre,estudios)
values('22255265','Juana Pereyra','PostGrado');
En los 3 casos guarda una cadena vaca, en los 2 primeros porque los ndices ingresa
dos estn fuera de rango y en el tercero porque el valor no est incluido en la list
a de permitidos.
Esta cadena vaca de error, se diferencia de una cadena vaca permitida porque la pr
imera tiene el valor de ndice 0; entonces, podemos seleccionar los registros con
valores invlidos en el campo de tipo "enum" as:
select * from postulantes
where estudios=0;
El ndice de un valor "null" es "null".
Para seleccionar registros con un valor especfico de un campo enumerado usamos "w
here", por ejemplo, queremos todos los postulantes con estudios universitarios:
select * from postulantes
where estudios='universitario';
Los tipos "enum" aceptan clusula "default".
Si el campo est definido como "not null" e intenta almacenar el valor "null" apar
ece un mensaje de error y la sentencia no se ejecuta.
Los bytes de almacenamiento del tipo "enum" depende del nmero de valores enumerad
os.
Problema :
Trabajamos con la tabla "empleados" de una empresa.
1- Elimine la tabla empleados, si existe.
2- Cree la tabla con la siguiente estructura:
create table empleados(
documento char(8),
nombre varchar(30),
sexo char(1),
estadocivil enum('soltero','casado','divorciado','viudo') not null,
sueldobasico decimal(6,2),
primary key(documento)
);
3- Ingrese algunos registros:
insert into empleados (documento,nombre,sexo,estadocivil,sueldobasico)
values ('22333444','Juan Lopez','m','soltero',300);
insert into empleados (documento,nombre,sexo,estadocivil,sueldobasico)
values ('23333444','Ana Acosta','f','viudo',400);
4- Intente ingresar un valor "null" para el campo enumerado:
insert into empleados (documento,nombre,sexo,estadocivil,sueldobasico)
values ('25333444','Ana Acosta','f',null,400);
5- Ingrese resgistros con valores de ndice para el campo "estadocivil":
insert into empleados (documento,nombre,sexo,estadocivil,sueldobasico)
values ('26333444','Luis Perez','m',1,400);
insert into empleados (documento,nombre,sexo,estadocivil,sueldobasico)
values ('26336444','Marcelo Torres','m',3,460);
6- Ingrese un valor invlido, uno no presente en la lista y un valor de ndice fuera
de rango
(guarda una cadena vaca):
insert into empleados (documento,nombre,sexo,estadocivil,sueldobasico)
values ('29333444','Lucas Perez','m',0,400);
insert into empleados (documento,nombre,sexo,estadocivil,sueldobasico)
values ('30336444','Federico Garcia','m',5,450);
insert into empleados (documento,nombre,sexo,estadocivil,sueldobasico)
values ('31333444','Karina Sosa','f','Concubino',500);
7- Seleccione todos los empleados solteros:
select * from empleados
where estadocivil='soltero';
8- Seleccione todos los empleados viudos usando el nmero de ndice de la enumeracin:
select * from empleados
where estadocivil=4;
Segundo problema:
A) Una empresa de turismo vende paquetes de viajes y almacena la informacin refer
ente a los mismos
en una tabla llamada "viajes":
1- Elimine la tabla si existe.
2- Cree la tabla:
create table viajes(
codigo int unsigned auto_increment,
nombre varchar(50),
pension enum ('no','media','completa') not null,
hotel enum ('1','2','3','4','5'),/* cantidad de estrellas*/
dias tinyint unsigned,
salida date,
precioporpersona decimal(8,2) unsigned,
primary key(codigo)
);
4- Ingrese algunos registros:
insert into viajes (nombre,pension,hotel,dias,salida)
values ('Mexico mgico','completa','4',15,'2005-12-01');
insert into viajes (nombre,pension,hotel,dias,salida)
values ('Europa fantastica','media','5',28,'2005-05-10');
insert into viajes (nombre,pension,hotel,dias,salida)
values ('Caribe especial','no','3',7,'2005-11-25');
5- Intente ingresar un valor "null" para el campo "pension":
insert into viajes (nombre,pension,hotel,dias,salida)
values ('Mexico maravilloso',null,'4',15,'2005-12-01');
6- Ingrese valor nulo para el campo "hotel"
insert into viajes (nombre,pension,hotel,dias,salida)
values ('Mexico especial','media',3,18,'2005-11-01');
7- Ingrese un valor invlido, no presente en la lista de "pension" (guarda una cad
ena vaca):
insert into viajes (nombre,pension,hotel,dias,salida)
values ('Caribe especial','ninguna','4',18,'2005-11-01');
8- Ingrese un valor de ndice fuera de rango para el campo "hotel":
insert into viajes (nombre,pension,hotel,dias,salida)
values ('Venezuela nica','no',6,18,'2005-11-01');
9- Seleccione todos los viajes que incluyen media pensin:
select * from viajes
where pension=2;
10- Seleccione todos los viajes que incluyen un hotel de 4 estrellas:
select * from viajes
where hotel='4';
Tercer Problema:
B) Una inmobiliaria vende inmuebles; los inmuebles pueden ser: casa, departament
o, local o terreno.
1- Elimine la tabla "inmuebles" si existe.
2- Cree la tabla "inmuebles" para registrar la siguiente informacin:
- tipo de inmueble: tipo enum (casa,dpto,local,terreno), not null,
- domicilio: varchar(30),
- propietario: nombre del dueo,
- precio: decimal hasta $999999.99 positivo.
3- Ingrese algunos registros.
4- Seleccione el domicilio y precio de todos los departamentos en alquiler.
5- Seleccione el domicilio, propietario y precio de todos los locales en venta.
6- Seleccione el domicilio y precio de todas las casas disponibles.
<------------------------------------------------------------------>
58 - Tipo de dato set.
El tipo de dato "set" representa un conjunto de cadenas.
Puede tener 1 ms valores que se eligen de una lista de valores permitidos que se
especifican al definir el campo y se separan con comas. Puede tener un mximo de 6
4 miembros. Ejemplo: un campo definido como set ('a', 'b') not null, permite los
valores 'a', 'b' y 'a,b'. Si carga un valor no incluido en el conjunto "set", s
e ignora y almacena cadena vaca.
Es similar al tipo "enum" excepto que puede almacenar ms de un valor en el campo.
Una empresa necesita personal, varias personas se han presentado para cubrir dis
tintos cargos. La empresa almacena los datos de los postulantes a los puestos en
una tabla llamada "postulantes". Le interesa, entre otras cosas, saber los dist
intos idiomas que conoce cada persona; para ello, crea un campo de tipo "set" en
el cual guardar los distintos idiomas que conoce cada postulante.
Para definir un campo de tipo "set" usamos la siguiente sintaxis:
create table postulantes(
numero int unsigned auto_increment,
documento char(8),
nombre varchar(30),
idioma set('ingles','italiano','portuges'),
primary key(numero)
);
Ingresamos un registro:
insert into postulantes (documento,nombre,idioma)
values('22555444','Ana Acosta','ingles');
Para ingresar un valor que contenga ms de un elemento del conjunto, se separan po
r comas, por ejemplo:
insert into postulantes (documento,nombre,idioma)
values('23555444','Juana Pereyra','ingles,italiano');
No importa el orden en el que se inserten, se almacenan en el orden que han sido
definidos, por ejemplo, si ingresamos:
insert into postulantes (documento,nombre,idioma)
values('23555444','Juana Pereyra','italiano,ingles');
en el campo "idioma" guardar 'ingles,italiano'.
Tampoco importa si se repite algn valor, cada elemento repetido, se ignora y se g
uarda una vez y en el orden que ha sido definido, por ejemplo, si ingresamos:
insert into postulantes (documento,nombre,idioma)
values('23555444','Juana Pereyra','italiano,ingles,italiano');
en el campo "idioma" guardar 'ingles,italiano'.
Si ingresamos un valor que no est en la lista "set", se ignora y se almacena una
cadena vaca, por ejemplo:
insert into postulantes (documento,nombre,idioma)
values('22255265','Juana Pereyra','frances');
Si un "set" permite valores nulos, el valor por defecto es "null"; si no permite
valores nulos, el valor por defecto es una cadena vaca.
Si se ingresa un valor de ndice fuera de rango, coloca una cadena vaca. Por ejempl
o:
insert into postulantes (documento,nombre,idioma)
values('22255265','Juana Pereyra',0);
insert into postulantes (documento,nombre,idioma)
values('22255265','Juana Pereyra',8);
Si se ingresa un valor numrico, lo interpreta como ndice de la enumeracin y almacen
a el valor de la lista con dicho nmero de ndice. Los valores de ndice se definen en
el siguiente orden, en este ejemplo:
1='ingles',
2='italiano',
3='ingles,italiano',
4='portugues',
5='ingles,portugues',
6='italiano,portugues',
7='ingles,italiano,portugues'.
Ingresamos algunos registros con valores de ndice:
insert into postulantes (documento,nombre,idioma)
values('22255265','Juana Pereyra',2);
insert into postulantes (documento,nombre,idioma)
values('22555888','Juana Pereyra',3);
En el campo "idioma", con la primera insercin se almacenar "italiano" que es valor
de ndice 2 y con la segunda insercin, "ingles,italiano" que es el valor con ndice
3.
Para bsquedas de valores en campos "set" se utiliza el operador "like" o la funcin
"find_in_set()".
Para recuperar todos los valores que contengan la cadena "ingles" podemos usar c
ualquiera de las siguientes sentencias:
select * from postulantes
where idioma like '%ingles%';
select * from postulantes
where find_in_set('ingles',idioma)>0;
La funcin "find_in_set()" retorna 0 si el primer argumento (cadena) no se encuent
ra en el campo set colocado como segundo argumento. Esta funcin no funciona corre
ctamente si el primer argumento contiene una coma.
Para recuperar todos los valores que incluyan "ingles,italiano" tipeamos:
select * from postulantes
where idioma like '%ingles,italiano%';
Para realizar bsquedas, es importante respetar el orden en que se presentaron los
valores en la definicin del campo; por ejemplo, si se busca el valor "italiano,i
ngles" en lugar de "ingles,italiano", no retornar registros.
Para buscar registros que contengan slo el primer miembro del conjunto "set" usam
os:
select * from postulantes
where idioma='ingles';
Tambin podemos buscar por el nmero de ndice:
select * from postulantes
where idioma=1;
Para buscar los registros que contengan el valor "ingles,italiano" podemos utili
zar cualquiera de las siguientes sentencias:
select * from postulantes
where idioma='ingles,italiano';
select * from postulantes
where idioma=3;
Tambin podemos usar el operador "not". Para recuperar todos los valores que no co
ntengan la cadena "ingles" podemos usar cualquiera de las siguientes sentencias:
select * from postulantes
where idioma not like '%ingles%';
select * from postulantes
where not find_in_set('ingles',idioma)>0;
Los tipos "set" admiten clusula "default".
Los bytes de almacenamiento del tipo "set" depende del nmero de miembros, se calc
ula as: (cantidad de miembros+7)/8 bytes; entonces puede ser 1,2,3,4 u 8 bytes.
Problema :
Una academia de enseanza dicta distintos cursos de informtica. Los cursos se dicta
n por la maana
(de 8 a 12 hs.) o por la tarde (de 16 a 20 hs.), distintos das a la semana. La ac
ademia guarda los
datos de los cursos en una tabla llamada "cursos" en la cual almacena el cdigo de
l curso, el tema,
los das de la semana que se dicta, el horario, por la maana (AM) o por la tarde (P
M), la cantidad
de clases que incluye cada curso (clases), la fecha de inicio y el costo del cur
so.
1- Elimine la tabla "cursos", si existe.
2- Cree la tabla "cursos" con la siguiente estructura:
create table cursos(
codigo tinyint unsigned auto_increment,
tema varchar(20) not null,
dias set ('lunes','martes','miercoles','jueves','viernes','sabado') not null,
horario enum ('AM','PM') not null,
clases tinyint unsigned default 1,
fechainicio date,
costo decimal(5,2) unsigned,
primary key(codigo)
);
3- Ingrese los siguientes registros:
insert into cursos (tema, dias,horario,clases,fechainicio,costo)
values('PHP bsico','lunes,martes,miercoles','AM',18,'2006-08-07',200);
insert into cursos (tema, dias,horario,clases,fechainicio,costo)
values('PHP bsico','lunes,martes,miercoles','PM',18,'2006-08-14',200);
insert into cursos (tema, dias,horario,clases,fechainicio,costo)
values('PHP bsico','sabado','AM',18,'2006-08-05',280);
insert into cursos (tema, dias,horario,clases,fechainicio,costo)
values('PHP avanzado','martes,jueves','AM',20,'2006-08-01',350);
insert into cursos (tema, dias,horario,clases,fechainicio,costo)
values('JavaScript','lunes,martes,miercoles','PM',15,'2006-09-11',150);
insert into cursos (tema, dias,horario,clases,fechainicio,costo)
values('Paginas web','martes,jueves','PM',10,'2006-08-08',250);
insert into cursos (tema, dias,horario,clases,fechainicio,costo)
values('Paginas web','sabado','AM',10,'2006-08-12',280);
insert into cursos (tema, dias,horario,clases,fechainicio,costo)
values('Paginas web','lunes,viernes','AM',10,'2006-08-21',200);
insert into cursos (tema, dias,horario,clases,fechainicio,costo)
values('Paginas web','lunes,martes,miercoles,jueves,viernes','AM',10,'2006-09-
18',180);
insert into cursos (tema, dias,horario,clases,fechainicio,costo)
values('Paginas web','lunes,viernes','PM',10,'2006-09-25',280);
insert into cursos (tema, dias,horario,clases,fechainicio,costo)
values('JavaScript','lunes,martes,viernes,sabado','PM',12,'2006-09-18',150);
4- Una persona quiere inscribirse en un curso de "PHP" y slo tiene disponibles lo
s sbados.
Localice los cursos de "PHP" que se dictan solamente los sbados:
select * from cursos
where tema like '%PHP%' and
dias='sabado';
5- Otra persona quiere aprender a disear pginas web, tiene disponibles todas las m
aanas excepto
los mircoles. Vea si existe algn curso que cumpla con sus necesidades:
select * from cursos
where tema like '%paginas web%' and
horario='AM' and
dias not like '%miercoles%';
6- Otra persona necesita aprender JavaScript, tiene disponibles todos las tardes
excepto los jueves
y quiere un curso que no supere las 15 clases para el mes de setiembre. Busque a
lgn curso para
esta persona:
select * from cursos
where tema='%javascript%' and
horario='PM' and
not find_in_set('jueves',dias)>0 and
clases<=15 and
month(fechainicio)=9;
Segundo problema:
A) Trabaje con la tabla "inmuebles" en la cual una inmobiliaria almacena la info
rmacin referente a
sus departamentos en venta.
1- Elimine la tabla "inmuebles" si existe.
2- Cree la tabla "inmuebles":
create table inmuebles(
detalles set ('estacionamiento','terraza','pileta','patio','ascensor'),
domicilio varchar(30),
propietario varchar(30),
precio decimal (9,2) unsigned
);
3- Ingrese algunos registros:
insert into inmuebles (detalles,precio)
values('terraza,pileta',50000);
insert into inmuebles (detalles,precio)
values('patio,terraza,pileta',60000);
insert into inmuebles (detalles,precio)
values('ascensor,terraza,pileta',80000);
insert into inmuebles (detalles,precio)
values('patio,estacionamiento',65000);
insert into inmuebles (detalles,precio)
values('estacionamiento',90000);
4- Seleccione todos los datos de los departamentos con terraza:
select * from inmuebles
where find_in_set('terraza',detalles)>0;
5- Seleccione los departamentos que no tiene ascensor:
select * from inmuebles
where detalles not like '%ascensor%';
6- Muestre los inmuebles que tengan terraza y pileta solamente:
select *from inmuebles
where detalles='terraza,pileta';
7- Muestre los inmuebles que no tengan ascensor y si estacionamiento, adems de ot
ros detalles:
select * from inmuebles
where detalles not like '%ascensor%' and
detalles like '%estacionamiento%';
8- Ingrese un registro con valor inexistente en "detalles":
insert into inmuebles (detalles,precio)
values('gimnasio',90000);
9 Ingrese un registro sin valor para "detalles":
insert into inmuebles (domicilio,precio)
values('Colon 354',90000);
Tercer Problema:
B) Una empresa de turismo vende paquetes de viajes a Mxico y almacena la informac
in referente a
los mismos en una tabla llamada "viajes":
1- Elimine la tabla si existe.
2- Cree la tabla:
create table viajes(
codigo int unsigned auto_increment,
nombre varchar(50),
pension enum ('no','media','completa') not null,
ciudades set ('Acapulco','DF','Cancun','Puerto Vallarta','Cuernavaca') not nul
l,
dias tinyint unsigned,
salida date,
precioporpersona decimal(8,2) unsigned,
primary key(codigo)
);
3- Ingrese los siguientes registros:
insert into viajes (nombre,pension,ciudades,dias,salida)
values ('Mexico mgico','completa','DF,Acapulco',15,'2005-12-01');
insert into viajes (nombre,pension,ciudades,dias,salida)
values ('Mexico especial','media','DF,Acapulco,Cuernavaca',28,'2005-05-10');
insert into viajes (nombre,pension,ciudades,dias,salida)
values ('Mexico unico','no','Acapulco,Puerto Vallarta',7,'2005-11-15');
insert into viajes (nombre,pension,ciudades,dias,salida)
values ('Mexico DF','no','DF',5,'2005-10-25');
insert into viajes (nombre,pension,ciudades,dias,salida)
values ('Mexico caribeo','completa','Cancun',15,'2005-10-25');
4- Ingrese un registro sin valor para el campo "ciudades":
insert into viajes (nombre,pension,dias,salida)
values ('Mexico maravilloso','completa',5,'2005-10-25');
5- Seleccione todos los viajes que incluyan "Acapulco":
select * from viajes
where find_in_set('acapulco',ciudades)>0;
6- Seleccione todos los viajes que no incluyan "Acapulco" y que incluyan pensin c
ompleta:
select * from viajes
where ciudades not like '%Acapulco%' and
pension='completa';
7- Muestre los viajes que incluyan "Puerto Vallarta" o "Cuernavaca":
select * from viajes
where find_in_set('Cuernavaca',ciudades)>0 or
find_in_set('Puerto Vallarta',ciudades)>0;
<------------------------------------------------------------------>
59 - Tipos de datos blob y text.
Los tipos "blob" o "text" son bloques de datos. Tienen una longitud de 65535 car
acteres.
Un "blob" (Binary Large Object) puede almacenar un volumen variable de datos. La
diferencia entre "blob" y "text" es que "text" diferencia maysculas y minsculas y
"blob" no; esto es porque "text" almacena cadenas de caracteres no binarias (ca
racteres), en cambio "blob" contiene cadenas de caracteres binarias (de bytes).
No permiten valores "default".
Existen subtipos:
- tinyblob o tinytext: longitud mxima de 255 caracteres.
- mediumblob o mediumtext: longitud de 16777215 caracteres.
- longblob o longtext: longitud para 4294967295 caracteres.
Se utiliza este tipo de datos cuando se necesita almacenar imgenes, sonidos o tex
tos muy largos.
Un video club almacena la informacin de sus pelculas en alquiler en una tabla deno
minada "peliculas". Adems del ttulo, actor y duracin de cada pelcula incluye un camp
o en el cual guarda la sinopsis de cada una de ellas.
La tabla contiene un campo de tipo "text" llamado "sinopsis":
- codigo: int unsigned auto_increment, clave primaria,
- nombre: varchar(40),
- actor: varchar(30),
- duracion: tinyint unsigned,
- sinopsis: text,
Se ingresan los datos en un campo "text" o "blob" como si fuera de tipo cadena d
e caracteres, es decir, entre comillas:
insert into peliculas values(1,'Mentes que brillan','Jodie Foster',120,
'El no entiende al mundo ni el mundo lo entiende a l; es un nio superdotado. La
escuela
especial a la que asiste tampoco resuelve los problemas del nio. Su madre har todo
lo que est a
su alcance para ayudarlo. Drama');
Para buscar un texto en un campo de este tipo usamos "like":
select * from peliculas
where sinopsis like '%Drama%';
No se pueden establecer valores por defecto a los campos de tipo "blob" o "text"
, es decir, no aceptan la clusula "default" en la definicin del campo.
Problema :
Una inmobiliaria guarda los datos de sus inmuebles en venta en una tabla llamada
"inmuebles".
1- Elimine la tabla si existe:
drop table if exists inmuebles;
2- Cree la tabla:
create table inmuebles(
codigo int unsigned auto_increment,
domicilio varchar(30),
barrio varchar(20),
detalles text,
primary key(codigo)
);
3- Ingrsee algunos registros:
insert into inmuebles values(1,'Colon 123','Centro','patio, 3 dormitorios, gara
ge doble, pileta,
asador, living, cocina, comedor, escritorio, 2 baos');
insert into inmuebles values(2,'Caseros 345','Centro','patio, 2 dormitorios, co
cina- comedor,
living');
insert into inmuebles values(3,'Sucre 346','Alberdi','2 dormitorios, problemas
de humedad');
insert into inmuebles values(4,'Sarmiento 832','Gral. Paz','3 dormitorios, gara
ge, 2 patios');
insert into inmuebles values(5,'Avellaneda 384','Centro',' 2 patios, 2 dormitor
ios, garage');
4- Busque todos los inmuebles que tengan "patio":
select * from inmuebles
where detalles like '%patio%';
Segundo problema:
Una librera guarda la informacin de sus libros en una tabla llamada "libros".
1- Elimine la tabla si existe:
drop table if exists libros;
2- Cree la tabla con un campo "blob" en el cual se pueda almacenar los temas pri
ncipales que trata
el libro:
create table libros(
codigo int unsigned auto_increment,
titulo varchar(40),
autor varchar(30),
editorial varchar(20),
temas blob,
precio decimal(5,2) unsigned,
primary key(codigo)
);
3- Ingrese algunos registros.:
insert into libros values(1,'Aprenda PHP','Mario Molina','Emece',
'Instalacion de PHP.
Palabras reservadas.
Sentencias basicas.
Definicion de variables.',
45.6);

insert into libros values(2,'Java en 10 minutos','Mario Molina','Planeta',
'Instalacion de Java en Windows.
Instalacion de Java en Linux.
Palabras reservadas.
Sentencias basicas.
Definir variables.',
55);
insert into libros values(3,'PHP desde cero','Joaquin Perez','Planeta',
'Instalacion de PHP.
Instrucciones basicas.
Definicin de variables.',
50);
4- Busque todos los libros sobre "PHP" que incluyan el tema "variables":
select * from libros
where titulo like '%PHP%' and
temas like '%variables%';
5- Busque los libros de "Java" que incluyan el tema "Instalacion" o "Instalar":
select * from libros
where titulo like '%Java%' and
temas like '%Instalacion%' or '%Instalar%';
<------------------------------------------------------------------>
60 - Funciones de control de flujo (if)
Trabajamos con las tablas "libros" de una librera.
No nos interesa el precio exacto de cada libro, sino si el precio es menor o may
or a $50. Podemos utilizar estas sentencias:
select titulo from libros
where precio<50;
select titulo from libros
where precio >=50;
En la primera sentencia mostramos los libros con precio menor a 50 y en la segun
da los dems.
Tambin podemos usar la funcin "if".
"if" es una funcin a la cual se le envan 3 argumentos: el segundo y tercer argumen
to corresponden a los valores que retornar en caso que el primer argumento (una e
xpresin de comparacin) sea "verdadero" o "falso"; es decir, si el primer argumento
es verdadero, retorna el segundo argumento, sino retorna el tercero.
Veamos el ejemplo:
select titulo,
if (precio>50,'caro','economico')
from libros;
Si el precio del libro es mayor a 50 (primer argumento del "if"), coloca "caro"
(segundo argumento del "if"), en caso contrario coloca "economico" (tercer argum
ento del "if").
Veamos otros ejemplos.
Queremos mostrar los nombres de los autores y la cantidad de libros de cada uno
de ellos; para ello especificamos el nombre del campo a mostrar ("autor"), conta
mos los libros con "autor" conocido con la funcin "count()" y agrupamos por nombr
e de autor:
select autor, count(*)
from libros
group by autor;
El resultado nos muestra cada autor y la cantidad de libros de cada uno de ellos
. Si solamente queremos mostrar los autores que tienen ms de 1 libro, es decir, l
a cantidad mayor a 1, podemos usar esta sentencia:
select autor, count(*)
from libros
group by autor
having count(*)>1;
Pero si no queremos la cantidad exacta sino solamente saber si cada autor tiene
ms de 1 libro, podemos usar "if":
select autor,
if (count(*)>1,'Ms de 1','1')
from libros
group by autor;
Si la cantidad de libros de cada autor es mayor a 1 (primer argumento del "if"),
coloca "Ms de 1" (segundo argumento del "if"), en caso contrario coloca "1" (ter
cer argumento del "if").
Queremos saber si la cantidad de libros por editorial supera los 4 o no:
select editorial,
if (count(*)>4,'5 o ms','menos de 5') as cantidad
from libros
group by editorial
order by cantidad;
Si la cantidad de libros de cada editorial es mayor a 4 (primer argumento del "i
f"), coloca "5 o ms" (segundo argumento del "if"), en caso contrario coloca "meno
s de 5" (tercer argumento del "if").
Problema :
Una empresa registra los datos de sus empleados en una tabla llamada "empleados"
.
1- Elimine la tabla "empleados" si existe:
drop table if exists empleados;
2- Cree la tabla:
create table empleados(
documento char(8) not null,
nombre varchar(30) not null,
sexo char(1),
domicilio varchar(30),
fechaingreso date,
fechanacimiento date,
sueldobasico decimal(5,2) unsigned,
primary key(documento)
);
3- Ingrese algunos registros:
insert into empleados
(documento,nombre,sexo,domicilio,fechaingreso,fechanacimiento,sueldobasico,hijos
)
values ('22333111','Juan Perez','m','Colon 123','1990-02-01','1970-05-10',550,
0);
insert into empleados
(documento,nombre,sexo,domicilio,fechaingreso,fechanacimiento,sueldobasico,hijos
)
values ('25444444','Susana Morales','f','Avellaneda 345','1995-04-01','1975-11
-06',650,2);
insert into empleados
(documento,nombre,sexo,domicilio,fechaingreso,fechanacimiento,sueldobasico,hijos
)
values ('20111222','Hector Pereyra','m','Caseros 987','1995-04-01','1965-03-25
',510,1);
insert into empleados
(documento,nombre,sexo,domicilio,fechaingreso,fechanacimiento,sueldobasico,hijos
)
values ('30000222','Luis LUque','m','Urquiza 456','1980-09-01','1980-03-29',70
0,3);
insert into empleados
(documento,nombre,sexo,domicilio,fechaingreso,fechanacimiento,sueldobasico,hijos
)
values ('20555444','Maria Laura Torres','f','San Martin 1122','2000-05-15','19
65-12-22',400,3);
insert into empleados
(documento,nombre,sexo,domicilio,fechaingreso,fechanacimiento,sueldobasico,hijos
)
values ('30000234','Alberto Soto','m','Peru 232','2003-08-15','1989-10-10',420
,1);
insert into empleados
(documento,nombre,sexo,domicilio,fechaingreso,fechanacimiento,sueldobasico,hijos
)
values ('20125478','Ana Gomez','f','Sarmiento 975','2004-06-14','1976-09-21',3
50,2);
insert into empleados
(documento,nombre,sexo,domicilio,fechaingreso,fechanacimiento,sueldobasico,hijos
)
values ('24154269','Ofelia Garcia','f','Triunvirato 628','2004-09-23','1974-05
-12',390,0);
insert into empleados
(documento,nombre,sexo,domicilio,fechaIngreso,fechaNacimiento,sueldoBasico,hijos
)
values ('304154269','Oscar Torres','m','Hernandez 1234','1996-04-10','1978-05-
02',400,0);
4- Es poltica de la empresa festejar cada fin de mes, los cumpleaos de todos los e
mpleados que
cumplen ese mes. Si los empleados son de sexo femenino, se les regala un ramo de
rosas, si son de
sexo masculino, una corbata. La secretaria de la Gerencia necesita saber cuntos r
amos de rosas y
cuntas corbatas debe comprar para el mes de mayo:
select sexo,count(sexo),
if (sexo='f','rosas','corbata') as 'Obsequio'
from empleados
where month(fechanacimiento)=5
group by sexo;
5- Adems, si el empleado cumple 10,20,30,40... aos de servicio, se le regala una p
laca
recordatoria. La secretaria de Gerencia necesita saber la cantidad de aos de serv
icio que cumplen
los empleados que ingresaron en el mes de abril para encargar dichas placas:
select nombre,fechaingreso,
year(current_date)-year(fechaingreso) as 'Aos de servicio',
if ( (year(current_date)-year(fechaingreso)) %10=0,'Si','No') as 'Placa'
from empleados
where month(fechaingreso)=4;
6- La empresa paga un sueldo adicional por hijos a cargos. para un sueldo bsico m
enor o igual a
$500 el salario familiar por hijo es de $300, para un sueldo superior, el monto
es de $150 por
hijo. Muestre el nombre del empleado, el sueldo bsico, la cantidad de hijos a car
go, el valor del
salario por hijo, el valor total del salario familiar y el sueldo final con el s
alario familiar
incluido de todos los empleados con hijos a cargo:
select nombre,sueldobasico,hijos,
if (sueldobasico<=500,300,150) as salarioporhijo,
if (sueldobasico<=500,300*hijos,150*hijos) as salariofamiliar,
if (sueldobasico<=500,sueldobasico+(300*hijos),sueldobasico+(150*hijos)) as to
tal
from empleados
where hijos>0;
Segundo problema:
A) La empresa que provee de luz a los usuarios de un municipio, almacena en una
tabla algunos datos
de los usuarios y el monto a cobrar:
- documento,
- domicilio,
- monto a pagar,
- fecha de vencimiento.
Si la boleta no se paga hasta el da del vencimiento, inclusive, se incrementa al
monto, un 1% del
monto cada da de atraso.
1- Elimine la tabla "luz", si existe.
2- Cree la tabla:
create table luz(
documento char(8) not null,
domicilio varchar(30),
monto decimal(5,2) unsigned,
vencimiento date
);
3- Ingrese algunos registros con fechas de vencimiento anterior a la fecha actua
l (vencidas) y
posteriores a la fecha actual (no vencidas).
4- Ingrese para el mismo usuario (igual documento) 2 boletas vencidas.
5- Muestre el documento del usuario, la fecha de vencimiento, la fecha actual (e
n que efecta el
pago) y si debe pagar recargo o no.:
select documento,vencimiento,
current_date as 'Fecha actual',
monto,
if (datediff(current_date,vencimiento)>0,'Si','No') as vencida
from luz;
La funcin "datediff()" retorna la cantidad de das de diferencia entre las fecha en
viadas como
argumento, si el primer argumento es anterior al segundo, el valor retornado es
negativo, por ello,
colocamos como condicin que el valor retornado por esta funcin sea mayor a cero, e
s decir, que la
fecha actual sea posterior a la del vencimiento, as las vencidas mostrarn "Si" y l
as que no hayan
vencido "No".
6- Si un usuario tiene ms de una boleta vencida se le corta el servicio. Muestre
el documento y la
cantidad de boletas vencidas de cada usuario que tenga boletas vencidas y muestr
e un
mensaje "Cortar servicio" si tiene 2 o ms vencidas:
select documento,count(*),
if (count(*)>1,'Cortar servicio','') as 'aa'
from luz
where datediff(current_date,vencimiento)>0
group by documento;
Tercer Problema:
B) Un profesor guarda los promedios de sus alumnos de un curso en una tabla llam
ada "alumnos".
1- Elimine la tabla si existe.
2- cree la tabla:
create table alumnos(
legajo char(5) not null,
nombre varchar(30),
promedio decimal(4,2)
);
3- Ingrese los siguientes registros:
insert into alumnos values(3456,'Perez Luis',8.5);
insert into alumnos values(3556,'Garcia Ana',7.0);
insert into alumnos values(3656,'Luduea Juan',9.6);
insert into alumnos values(2756,'Moreno Gabriela',4.8);
insert into alumnos values(4856,'Morales Hugo',3.2);
4- Si el alumno tiene un promedio superior o igual a 4, muestre un mensaje "apro
bado" en caso
contrario "reprobado":
select legajo,promedio,
if (promedio>=4,'aprobado','reprobado')
from alumnos;
5- Es poltica del profesor entregar una medalla a quienes tengan un promedio igua
l o superior a 9.
Muestre los nombres y promedios de los alumnos y un mensaje "medalla" a quienes
cumplan con ese
requisito:
select nombre,promedio,
if (promedio>=9,'medalla','')
from alumnos;
Cuarto Problema:
C) Una playa de estacionamiento guarda cada da los datos de los vehculos que ingre
san a la playa
en una tabla llamada "vehiculos".
1- Elimine la tabla, si existe.
2- Cree la tabla:
create table vehiculos(
patente char(6) not null,
tipo char(4),
horallegada time not null,
horasalida time,
primary key(patente,horallegada)
);
3- Ingrese algunos registros:
insert into vehiculos (patente,tipo,horallegada,horasalida)
values('ACD123','auto','8:30','9:40');
insert into vehiculos (patente,tipo,horallegada,horasalida)
values('AKL098','auto','8:45','15:10');
insert into vehiculos (patente,tipo,horallegada,horasalida)
values('HGF123','auto','9:30','18:40');
insert into vehiculos (patente,tipo,horallegada,horasalida)
values('DRT123','auto','15:30',null);
insert into vehiculos (patente,tipo,horallegada,horasalida)
values('FRT545','moto','19:45',null);
insert into vehiculos (patente,tipo,horallegada,horasalida)
values('GTY154','auto','20:30','21:00');
4- Muestre la patente, la hora de llegada y de salida de todos los vehculos, ms un
a columna que
calcule la cantidad de horas que estuvo cada vehculo en la playa, sin considerar
los que an no se
retiraron de la playa:
select patente,horallegada,horasalida,
left(timediff(horasalida,horallegada),5) as horasminutos
from vehiculos
where horasalida is not null;
5- Se cobra 1 peso por hora. Pero si un vehculo permanece en la playa 4 horas, se
le cobran 3
pesos, es decir, no se le cobra la cuarta hora; si est 8 horas, se cobran 6 pesos
, y as
sucesivamente. Muestre la patente, la hora de llegada y de salida de todos los v
ehculos, ms la
columna que calcule la cantidad de horas que estuvo cada vehculo en la playa (sin
considerar los
que an no se retiraron de la playa) y otra columna utilizando "if" que muestre la
cantidad de
horas gratis:
select patente,horallegada,horasalida,
left(timediff(horasalida,horallegada),5) as horasminutos,
if (hour(timediff(horasalida,horallegada))>4,
hour(timediff(horasalida,horallegada)) div 4,0) as horagratis
from vehiculos
where horasalida is not null;
Quinto Problema:
D) Un teatro con varias salas guarda la informacin de las entradas vendidas en un
a tabla
llamada "entradas".
1- Elimine la tabla, si existe.
2- Cree la tabla:
create table entradas(
sala tinyint unsigned,
fecha date,
hora time,
capacidad smallint unsigned,
entradasvendidas smallint unsigned,
primary key(sala,fecha,hora)
);
3- Ingrese algunos registros:
insert into entradas values(1,'2006-05-10','20:00',300,50);
insert into entradas values(1,'2006-05-10','23:00',300,250);
insert into entradas values(2,'2006-05-10','20:00',400,350);
insert into entradas values(2,'2006-05-11','20:00',400,380);
insert into entradas values(2,'2006-05-11','23:00',400,400);
insert into entradas values(3,'2006-05-12','20:00',350,350);
insert into entradas values(3,'2006-05-12','22:30',350,100);
insert into entradas values(4,'2006-05-12','20:00',250,0);
4- Muestre todos los registros y un mensaje si las entradas para una funcin estn a
gotadas:
select sala,fecha,hora,
if (capacidad=entradasvendidas,'sala llena',capacidad-entradasvendidas) as 'En
tradas disponibles'
from entradas;
5- Muestre todos los datos de las funciones que tienen vendidad entradas y muest
re un mensaje si se
vendi ms o menos de la mitad de la capacidad de la sala:
select *,
if (entradasvendidas>(capacidad div 2),'mas de la mitad','menos de la mitad ve
ndidas') as vendidas
from entradas
where entradasvendidas>0;
<------------------------------------------------------------------>
61 - Funciones de control de flujo (case)
La funcin "case" es similar a la funcin "if", slo que se pueden establecer varias c
ondiciones a cumplir.
Trabajemos con la tabla "libros" de una librera.
Queremos saber si la cantidad de libros de cada editorial es menor o mayor a 1,
tipeamos:
select editorial,
if (count(*)>1,'Mas de 2','1') as 'cantidad'
from libros
group by editorial;
vemos los nombres de las editoriales y una columna "cantidad" que especifica si
hay ms o menos de uno. Podemos obtener la misma salida usando un "case":
select editorial,
case count(*)
when 1 then 1
else 'mas de 1' end as 'cantidad'
from libros
group by editorial;
Por cada valor hay un "when" y un "then"; si encuentra un valor coincidente en a
lgn "where" ejecuta el "then" correspondiente a ese "where", si no encuentra ning
una coincidencia, se ejecuta el "else", si no hay parte "else" retorna "null". F
inalmente se coloca "end" para indicar que el "case" ha finalizado.
Entonces, la sintaxis es:
case
when then
...
else end
Se puede obviar la parte "else":
select editorial,
case count(*)
when 1 then 1
end as 'cantidad'
from libros
group by editorial;
Con el "if" solamente podemos obtener dos salidas, cuando la condicin resulta ver
dadera y cuando es falsa, si queremos ms opciones podemos usar "case". Vamos a ex
tender el "case" anterior para mostrar distintos mensajes:
select editorial,
case count(*)
when 1 then 1
when 2 then 2
when 3 then 3
else 'Ms de 3' end as 'cantidad'
from libros
group by editorial;
Incluso podemos agregar una clusula "order by" y ordenar la salida por la columna
"cantidad":
select editorial,
case count(*)
when 1 then 1
when 2 then 2
when 3 then 3
else 'Ms de 3' end as 'cantidad'
from libros
group by editorial
order by cantidad;
La diferencia con "if" es que el "case" toma valores puntuales, no expresiones.
La siguiente sentencia provocar un error:
select editorial,
case count(*)
when 1 then 1
when >1 then 'mas de 1'
end as 'cantidad'
from libros
group by editorial;
Pero existe otra sintaxis de "case" que permite condiciones:
case
when then
...
else
end
Veamos un ejemplo:
select editorial,
case
when count(*)=1 then 1
else 'mas de uno'
end as cantidad
from libros
group by editorial;
Problema :
Un profesor guarda los promedios de sus alumnos de un curso en una tabla llamada
"alumnos".
1- Elimine la tabla si existe.
2- Cree la tabla:
create table alumnos(
legajo char(5) not null,
nombre varchar(30),
promedio decimal(4,2)
);
3- Ingrese los siguientes registros:
insert into alumnos values(3456,'Perez Luis',8.5);
insert into alumnos values(3556,'Garcia Ana',7.0);
insert into alumnos values(3656,'Luduea Juan',9.6);
insert into alumnos values(2756,'Moreno Gabriela',4.8);
insert into alumnos values(4856,'Morales Hugo',3.2);
insert into alumnos values(7856,'Gomez Susana',6.4);
4- Si el alumno tiene un promedio menor a 4, muestre un mensaje "reprobado", si
el promedio es
mayor o igual a 4 y menor a 7, muestre "regular", si el promedio es mayor o igua
l a 7,
muestre "promocionado", usando la primer sintaxis de "case":
select legajo,promedio,
case truncate(promedio,0)
when 0 then 'reprobado'
when 1 then 'reprobado'
when 2 then 'reprobado'
when 3 then 'reprobado'
when 4 then 'regular'
when 5 then 'regular'
when 6 then 'regular'
when 7 then 'promocionado'
when 8 then 'promocionado'
when 9 then 'promocionado'
else 'promocionado'
end as 'estado'
from alumnos;
5- Obtenga la misma salida anterior pero empleando la otra sintaxis de "case":
select legajo,promedio,
case when promedio<4 then 'reprobado'
when promedio>4 and promedio<7 then 'regular'
else 'promocionado'
end as 'estado'
from alumnos;
Segundo problema:
A) Una playa de estacionamiento guarda cada da los datos de los vehculos que ingre
san a la playa
en una tabla llamada "vehiculos".
1- Elimine la tabla, si existe.
2- Cree la tabla:
create table vehiculos(
patente char(6) not null,
tipo char(4),
horallegada time not null,
horasalida time,
primary key(patente,horallegada)
);
3- Ingrese algunos registros:
insert into vehiculos (patente,tipo,horallegada,horasalida)
values('ACD123','auto','8:30','9:40');
insert into vehiculos (patente,tipo,horallegada,horasalida)
values('AKL098','auto','8:45','15:10');
insert into vehiculos (patente,tipo,horallegada,horasalida)
values('HGF123','auto','9:30','18:40');
insert into vehiculos (patente,tipo,horallegada,horasalida)
values('DRT123','auto','15:30',null);
insert into vehiculos (patente,tipo,horallegada,horasalida)
values('FRT545','moto','19:45',null);
insert into vehiculos (patente,tipo,horallegada,horasalida)
values('GTY154','auto','20:30','21:00');
4- Se cobra 1 peso por hora. Pero si un vehculo permanece en la playa 4 horas, se
le cobran 3
pesos, es decir, no se le cobra la cuarta hora; si est 8 horas, se cobran 6 pesos
, y as
sucesivamente. Muestre la patente, la hora de llegada y de salida de todos los v
ehculos, ms la
columna que calcule la cantidad de horas que estuvo cada vehculo en la playa (sin
considerar los
que an no se retiraron de la playa) y otra columna utilizando "case" que muestre
la cantidad de
horas gratis:
select patente,horallegada,horasalida,
left(timediff(horasalida,horallegada),5) as horasminutos,
case when hour(timediff(horasalida,horallegada))>4 then
hour(timediff(horasalida,horallegada)) div 4
else 0
end as horagratis
from vehiculos
where horasalida is not null;
5- Muestre la patente, la hora de llegada y de salida de todos los vehculos, ms un
a columna que
calcule la cantidad de horas que estuvo cada vehculo en la playa (sin considerar
los que an no se
retiraron de la playa) y otra columna (con "case") que calcule la cantidad de ho
ras cobradas:
select patente,horallegada,horasalida,
left(timediff(horasalida,horallegada),5) as horasminutos,
case when extract(hour_minute from timediff(horasalida,horallegada))<200 then
1
else hour(timediff(horasalida,horallegada))-hour(timediff(horasalida,horalle
gada)) div 4
end as horascobradas
from vehiculos
where horasalida is not null;
Tercer Problema:
B) En una pgina web se solicitan los siguientes datos para guardar informacin de s
us visitas.
1- Elimine la tabla "visitas", si existe.
2- Crela con la siguiente estructura:
create table visitas (
numero int unsigned auto_increment,
nombre varchar(30) not null,
mail varchar(50),
pais varchar (20),
fecha date,
primary key(numero)
);
3- Ingrese algunos registros:
insert into visitas (nombre,mail,fecha)
values ('Ana Maria Lopez','AnaMaria@hotmail.com','2006-02-10');
insert into visitas (nombre,mail,fecha)
values ('Gustavo Gonzalez','GustavoGGonzalez@hotmail.com','2006-05-10');
insert into visitas (nombre,mail,fecha)
values ('Juancito','JuanJosePerez@hotmail.com','2006-06-11');
insert into visitas (nombre,mail,fecha)
values ('Fabiola Martinez','MartinezFabiola@hotmail.com','2006-10-12');
insert into visitas (nombre,mail,fecha)
values ('Fabiola Martinez','MartinezFabiola@hotmail.com','2006-09-12');
insert into visitas (nombre,mail,fecha)
values ('Juancito','JuanJosePerez@hotmail.com','2006-09-12');
insert into visitas (nombre,mail,fecha)
values ('Juancito','JuanJosePerez@hotmail.com','2006-09-15');
insert into visitas (nombre,mail,fecha)
values ('Juancito','JuanJosePerez@hotmail.com','2006-09-15');
4- Muestre el nombre, la fecha de ingreso y los nombres de los das de la semana e
mpleando
un "case":
select nombre,fecha,
case dayname(fecha)
when 'Monday' then 'lunes'
when 'Tuesday' then 'martes'
when 'Wednesday' then 'miercoles'
when 'Thursday' then 'jueves'
when 'Friday' then 'viernes'
when 'Saturday' then 'sabado'
else 'domingo'
end as 'dia'
from visitas;
5- Muestre el nombre y fecha de ingreso a la pgina y con un "case" muestre si el
nombre del mes
corresponde al 1, 2 o 3 cuatrimestre del ao.
select nombre,fecha,
case when (monthname(fecha) in ('January','February','March','April'))
then '1 cuatrimestre'
when (monthname(fecha) in ('May','June','July','August'))
then '2 cuatrimestre'
else '3 cuatrimestre'
end as 'mes'
from visitas;
<------------------------------------------------------------------>
62 - Varias tablas (join)
Hasta ahora hemos trabajado con una sola tabla, pero en general, se trabaja con
varias tablas.
Para evitar la repeticin de datos y ocupar menos espacio, se separa la informacin
en varias tablas. Cada tabla tendr parte de la informacin total que queremos regis
trar.
Por ejemplo, los datos de nuestra tabla "libros" podran separarse en 2 tablas, un
a "libros" y otra "editoriales" que guardar la informacin de las editoriales. En n
uestra tabla "libros" haremos referencia a la editorial colocando un cdigo que la
identifique. Veamos:
create table libros(
codigo int unsigned auto_increment,
titulo varchar(40) not null,
autor varchar(30) not null default 'Desconocido',
codigoeditorial tinyint unsigned not null,
precio decimal(5,2) unsigned,
cantidad smallint unsigned default 0,
primary key (codigo)
);
create table editoriales(
codigo tinyint unsigned auto_increment,
nombre varchar(20) not null,
primary key(codigo)
);
De este modo, evitamos almacenar tantas veces los nombres de las editoriales en
la tabla "libros" y guardamos el nombre en la tabla "editoriales"; para indicar
la editorial de cada libro agregamos un campo referente al cdigo de la editorial
en la tabla "libros" y en "editoriales".
Al recuperar los datos de los libros:
select * from libros;
vemos que en el campo "editorial" aparece el cdigo, pero no sabemos el nombre de
la editorial. Para obtener los datos de cada libro, incluyendo el nombre de la e
ditorial, necesitamos consultar ambas tablas, traer informacin de las dos.
Cuando obtenemos informacin de ms de una tabla decimos que hacemos un "join" (unin)
. Veamos un ejemplo:
select * from libros
join editoriales
on libros.codigoeditorial=editoriales.codigo;
Analicemos la consulta anterior.
Indicamos el nombre de la tabla luego del "from" ("libros"), unimos esa tabla co
n "join" y el nombre de la otra tabla ("editoriales"), luego especificamos la co
ndicin para enlazarlas con "on", es decir, el campo por el cual se combinarn. "on"
hace coincidir registros de las dos tablas basndose en el valor de algn campo, en
este ejemplo, los cdigos de las editoriales de ambas tablas, el campo "codigoedi
torial" de "libros" y el campo "codigo" de "editoriales" son los que enlazarn amb
as tablas.
Cuando se combina (join, unin) informacin de varias tablas, es necesario indicar q
u registro de una tabla se combinar con qu registro de la otra tabla.
Si no especificamos por qu campo relacionamos ambas tablas, por ejemplo:
select * from libros
join editoriales;
el resultado es el producto cartesiano de ambas tablas (cada registro de la prim
era tabla se combina con cada registro de la segunda tabla), un "join" sin condi
cin "on" genera un resultado en el que aparecen todas las combinaciones de los re
gistros de ambas tablas. La informacin no sirve.
Note que en la consulta
select * from libros
join editoriales
on libros.codigoeditorial=editoriales.codigo;
al nombrar el campo usamos el nombre de la tabla tambin. Cuando las tablas refere
nciadas tienen campos con igual nombre, esto es necesario para evitar confusione
s y ambiguedades al momento de referenciar un campo. En este ejemplo, si no espe
cificamos "editoriales.codigo" y solamente tipeamos "codigo", MySQL no sabr si no
s referimos al campo "codigo" de "libros" o de "editoriales".
Si omitimos la referencia a las tablas al nombrar el campo "codigo" (nombre de c
ampo que contienen ambas tablas):
select * from libros
join editoriales
on codigoeditorial=codigo;
aparece un mensaje de error indicando que "codigo" es ambiguo.
Entonces, si en las tablas, los campos tienen el mismo nombre, debemos especific
ar a cul tabla pertenece el campo al hacer referencia a l, para ello se antepone e
l nombre de la tabla al nombre del campo, separado por un punto (.).
Entonces, se nombra la primer tabla, se coloca "join" junto al nombre de la segu
nda tabla de la cual obtendremos informacin y se asocian los registros de ambas t
ablas usando un "on" que haga coincidir los valores de un campo en comn en ambas
tablas, que ser el enlace.
Para simplificar la sentencia podemos usar un alias para cada tabla:
select * from libros as l
join editoriales as e
on l.codigoeditorial=e.codigo;
Cada tabla tiene un alias y se referencian los campos usando el alias correspond
iente. En este ejemplo, el uso de alias es para fines de simplificacin, pero en a
lgunas consultas es absolutamente necesario.
En la consulta anterior vemos que el cdigo de la editorial aparece 2 veces, desde
la tabla "libros" y "editoriales". Podemos solicitar que nos muestre algunos ca
mpos:
select titulo,autor,nombre from libros as l
join editoriales as e
on l.codigoeditorial=e.codigo;
Al presentar los campos, en este caso, no es necesario aclarar a qu tabla pertene
cen porque los campos solicitados no se repiten en ambas tablas, pero si solicitr
amos el cdigo del libro, debemos especificar de qu tabla porque el campo "codigo"
se repite en ambas tablas ("libros" y "editoriales"):
select l.codigo,titulo,autor,nombre from libros as l
join editoriales as e
on l.codigoeditorial=e.codigo;
Si obviamos la referencia a la tabla, la sentencia no se ejecuta y aparece un me
nsaje indicando que el campo "codigo" es ambiguo.
Problema :
Una empresa tiene registrados sus clientes en una tabla llamada "clientes", tamb
in tiene una
tabla "provincias" donde registra los nombres de las provincias.
1- Elimine la tabla "clientes" y "provincias", si existen:
drop table if exists clientes, provincias;
2- Crelas con las siguientes estructuras:
create table clientes (
codigo int unsigned auto_increment,
nombre varchar(30) not null,
domicilio varchar(30),
ciudad varchar(20),
codigoprovincia tinyint unsigned,
telefono varchar(11),
primary key(codigo)
);
create table provincias(
codigo tinyint unsigned auto_increment,
nombre varchar(20),
primary key (codigo)
);
3- Ingrese algunos registros para ambas tablas:
insert into provincias (nombre) values('Cordoba');
insert into provincias (nombre) values('Santa Fe');
insert into provincias (nombre) values('Corrientes');
insert into provincias (nombre) values('Misiones');
insert into provincias (nombre) values('Salta');
insert into provincias (nombre) values('Buenos Aires');
insert into provincias (nombre) values('Neuquen');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Lopez Marcos', 'Colon 111', 'Crdoba',1,'null');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Perez Ana', 'San Martin 222', 'Cruz del Eje',1,'4578585');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Garcia Juan', 'Rivadavia 333', 'Villa Maria',1,'4578445');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Perez Luis', 'Sarmiento 444', 'Rosario',2,null);
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Pereyra Lucas', 'San Martin 555', 'Cruz del Eje',1,'4253685');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Gomez Ines', 'San Martin 666', 'Santa Fe',2,'0345252525');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Torres Fabiola', 'Alem 777', 'Villa del Rosario',1,'4554455');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Lopez Carlos', 'Irigoyen 888', 'Cruz del Eje',1,null);
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Ramos Betina', 'San Martin 999', 'Cordoba',1,'4223366');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Lopez Lucas', 'San Martin 1010', 'Posadas',4,'0457858745');
4- Obtenga los datos de ambas tablas, use alias:
select c.nombre,c.domicilio,c.ciudad,p.nombre,c.telefono
from clientes as c
join provincias as p
on c.codigoProvincia=p.codigo;
5- Obtenga la misma informacin anterior pero ordenada por nombre del cliente:
select c.nombre,c.domicilio,c.ciudad,p.nombre,c.telefono
from clientes as c
join provincias as p
on c.codigoProvincia=p.codigo
order by c.nombre;
6- Omita la referencia a las tablas en la condicin "on" para verificar que la sen
tencia no se
ejecuta porque el nombre del campo "codigo" es ambiguo (ambas tablas lo tienen):
select c.nombre,c.domicilio,c.ciudad,p.nombre,c.telefono
from clientes as c
join provincias as p
on codigoProvincia=codigo
Segundo problema:
A) Un club dicta clases de distintos deportes. En una tabla llamada "socios" gua
rda los datos de
sus socios y en una tabla denominada "inscriptos" almacena la informacin necesari
a para las
inscripciones de los socios a los distintos deportes.
1- Elimine las tablas si existen.
2- Cree las tablas:
create table socios(
documento char(8) not null,
nombre varchar(30),
domicilio varchar(30),
primary key(documento)
);
create table inscriptos(
documento char(8) not null,
deporte varchar(15) not null,
ao year,
matricula char(1), /*si esta paga ='s' sino 'n'*/
primary key(documento,deporte,ao)
);
3- Ingrese algunos registros para ambas tablas:
insert into socios values('22333444','Juan Perez','Colon 234');
insert into socios values('23333444','Maria Lopez','Sarmiento 465');
insert into socios values('24333444','Antonio Juarez','Caseros 980');
insert into inscriptos values ('22333444','natacion','2005','s');
insert into inscriptos values ('22333444','natacion','2006','n');
insert into inscriptos values ('23333444','natacion','2005','s');
insert into inscriptos values ('23333444','tenis','2006','s');
insert into inscriptos values ('23333444','natacion','2006','s');
insert into inscriptos values ('24333444','tenis','2006','n');
insert into inscriptos values ('24333444','basquet','2006','n');
4- Muestre el nombre del socio y todos los campos de la tabla "inscriptos":
select s.nombre,i.*
from socios as s
join inscriptos as i
on s.documento=i.documento;
5- Omita la referencia a las tablas en la condicin "on" para verificar que la sen
tencia no se
ejecuta porque el nombre del campo "documento" es ambiguo (ambas tablas lo tiene
n):
select s.nombre,i.*
from socios as s
join inscriptos as i
on documento=documento;
6- Muestre el nombre de los socios y los deportes en los cuales estn inscriptos e
ste ao:
select s.nombre,i.deporte
from socios as s
join inscriptos as i
on s.documento=i.documento
where ao=2006;
7- Muestre el nombre y todas las inscripciones del socio con nmero de documento='
23333444':
select s.nombre,i.*
from socios as s
join inscriptos as i
on s.documento=i.documento
where s.documento='23333444';
Tercer Problema:
B) Una pequea biblioteca de barrio registra los prstamos de sus libros en una tabl
a
llamada "prestamos" y los datos de sus libros en una tabla llamada "libros".
1- Elimine las tablas, si existen.
2- Cree las tablas:
create table libros(
codigo int unsigned auto_increment,
titulo varchar(40),
autor varchar (30),
editorial varchar (15),
primary key (codigo)
);
create table prestamos(
codigolibro int unsigned not null,
documento char(8) not null,
fechaprestamo date not null,
fechadevolucion date,
primary key(codigolibro,fechaprestamo)
);
3- Ingrese algunos registros para ambas tablas:
insert into libros values (15,'Manual de 1 grado','Moreno Luis','Emece');
insert into libros values (28,'Manual de 2 grado','Moreno Luis','Emece');
insert into libros values (30,'Alicia en el pais de las maravillas','Lewis Carr
oll','Planeta');
insert into libros values (35,'El aleph','Borges','Emece');
insert into prestamos
values(15,'22333444','2006-07-10','2006-07-12');
insert into prestamos
values(15,'22333444','2006-07-20','2006-07-21');
insert into prestamos (codigolibro,documento,fechaprestamo)
values(15,'23333444','2006-07-25');
insert into prestamos (codigolibro,documento,fechaprestamo)
values(30,'23333444','2006-07-28');
insert into prestamos (codigolibro,documento,fechaprestamo)
values(28,'25333444','2006-08-10');
4- Muestre todos los datos de los prstamos, incluyendo el nombre del libro (join
con "libros"):
select l.titulo,p.*
from prestamos as p
join libros as l
on l.codigo=p.codigolibro;
5- Muestre la informacin de los prstamos del libro "Manual de 1 grado":
select p.documento,fechaprestamo,fechadevolucion
from prestamos as p
join libros as l
on l.codigo=p.codigolibro
where l.titulo='Manual de 1 grado';
6- Muestre los ttulos de los libros, la fecha de prstamo y el documento del socio
de todos los
libros que no han sido devueltos:
select l.titulo,p.documento,p.fechaprestamo
from prestamos as p
join libros as l
on l.codigo=p.codigolibro
where p.fechadevolucion is null;
Cuarto Problema:
C) Una clnica registra las consultas de los pacientes en una tabla llamada "consu
ltas" y en otra
tabla denominada "obrassociales" almacena los datos de las obras sociales que at
iende.
1- Elimine las tablas si existen.
2- Cree las tablas:
create table consultas(
fecha date,
hora time,
documento char(8) not null,
codigoobrasocial tinyint unsigned,
medico varchar(30),
primary key(fecha,hora,medico)
);
create table obrassociales(
codigo tinyint unsigned auto_increment,
nombre varchar(15),
monto decimal(5,2) unsigned,
primary key(codigo)
);
3- Ingrese algunos registros:
insert into obrassociales (nombre,monto)
values('PAMI',2);
insert into obrassociales (nombre,monto)
values('IPAM',5);
insert into obrassociales (nombre,monto)
values('OSDOP',3);
insert into consultas values('2006-08-10','8:00','22333444',1,'Perez');
insert into consultas values('2006-08-10','10:00','22333444',1,'Lopez');
insert into consultas values('2006-08-10','8:30','23333444',1,'Perez');
insert into consultas values('2006-08-10','9:00','24333444',2,'Perez');
insert into consultas values('2006-08-10','10:00','25333444',3,'Perez');
insert into consultas values('2006-08-10','8:30','25333444',1,'Garcia');
insert into consultas values('2006-09-10','8:30','25333444',1,'Lopez');
4- Muestre la fecha,hora,documento del paciente, mdico, nombre y monto de la obra
social de todas
las consultas (join con "obrassociales"):
select c.fecha,c.hora,c.documento,c.medico,os.nombre,os.monto
from consultas as c
join obrassociales as os
on os.codigo=c.codigoobrasocial;
5- Muestre fecha,hora,documento del paciente y nombre de la obra social para las
consultas del
doctor "Perez":
select c.fecha,c.hora,c.documento,os.nombre,os.monto
from consultas as c
join obrassociales as os
on os.codigo=c.codigoobrasocial
where c.medico='Perez';
6- Muestre las obras sociales DISTINTAS que atendi el doctor "Perez" el da "2006-0
8-10":
select distinct os.nombre
from consultas as c
join obrassociales as os
on os.codigo=c.codigoobrasocial
where c.fecha='2006-08-10' and
medico='Perez';
<------------------------------------------------------------------>
63 - Clave fornea.
Un campo que se usa para establecer un "join" (unin) con otra tabla en la cual es
clave primaria, se denomina "clave ajena o fornea".
En el ejemplo de la librera en que utilizamos las tablas "libros" y "editoriales"
con los campos:
libros: codigo (clave primaria), titulo, autor, codigoeditorial, precio, cantid
ad y
editoriales: codigo (clave primaria), nombre.
el campo "codigoeditorial" de "libros" es una clave fornea, se emplea para enlaza
r la tabla "libros" con "editoriales" y es clave primaria en "editoriales" con e
l nombre "codigo".
Cuando alteramos una tabla, debemos tener cuidado con las claves forneas. Si modi
ficamos el tipo, longitud o atributos de una clave fornea, sta puede quedar inhabi
litada para hacer los enlaces.
Las claves forneas y las claves primarias deben ser del mismo tipo para poder enl
azarse. Si modificamos una, debemos modificar la otra para que los valores se co
rrespondan.
Problema :
Una empresa tiene registrados sus clientes en una tabla llamada "clientes", tamb
in tiene una
tabla "provincias" donde registra los nombres de las provincias.
1- Elimine la tabla "clientes" y "provincias", si existen:
drop table if exists clientes, provincias;
2- Crelas con las siguientes estructuras:
create table clientes (
codigo int unsigned auto_increment,
nombre varchar(30) not null,
domicilio varchar(30),
ciudad varchar(20),
codigoprovincia tinyint unsigned,
telefono varchar(11),
primary key(codigo)
);
create table provincias(
codigo tinyint unsigned auto_increment,
nombre varchar(20),
primary key (codigo)
);
En este ejemplo, el campo "codigoprovincia" de "clientes" es una clave fornea, se
emplea para
enlazar la tabla "clientes" con "provincias".
3- Ingrese algunos registros para ambas tablas:
insert into provincias(codigo,nombre) values(1,'Cordoba');
insert into provincias(codigo,nombre) values(2,'Santa Fe');
insert into provincias(codigo,nombre) values(30,'Misiones');
insert into provincias(codigo,nombre) values(13,'Salta');
insert into provincias(codigo,nombre) values(15,'Buenos Aires');
insert into provincias(codigo,nombre) values(20,'Neuquen');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Lopez Marcos', 'Colon 111', 'Crdoba',1,'null');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Perez Ana', 'San Martin 222', 'Cruz del Eje',1,'4578585');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Garcia Juan', 'Rivadavia 333', 'Villa Maria',1,'4578445');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Perez Luis', 'Sarmiento 444', 'Rosario',2,null);
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Ramos Betina', 'San Martin 999', 'Bahia Blanca',15,'4223366');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Lopez Lucas', 'San Martin 1010', 'Posadas',30,'0457858745');
4- Enlace las tablas:
select c.nombre,c.ciudad,p.nombre
from clientes as c
left join provincias as p
on c.codigoprovincia=p.codigo;
5- Modifique el campo "codigoprovincia" a "char(1)":
alter table clientes
modify codigoprovincia char(1);
6- Vea cmo afect el cambio a la tabla "clientes":
select * from clientes;
El cliente de "Bahia Blanca" con cdigo de provincia "15" ("Buenos Aires") ahora t
iene "1"
("Cordoba") y el cliente con cdigo de provincia "30" ("Misiones") ahora almacena
"3" (valor
inexistente en "provincias").
7- Realice un "left join" buscando coincidencia de cdigos en la tabla "provincias
":
select c.nombre,c.ciudad,p.nombre
from clientes as c
left join provincias as p
on c.codigoprovincia=p.codigo;
El resultado es errneo.
8- Intente modificar la clave primaria en "provincias" para que se corresponda
con "codigoprovincia" de "clientes":
alter table provincias
modify codigo char(1);
No lo permite porque si la modifica los valores para el campo clave quedan repet
idos.
Segundo problema:
Un club dicta clases de distintos deportes. En una tabla llamada "deportes" guar
da la informacin
de los distintos deportes que se ensean y en una tabla denominada "inscriptos" al
macena la
informacin necesaria para las inscripciones a los distintos deportes.
1- Elimine las tablas si existen.
2- Cree las tablas:
create table deportes(
codigo tinyint unsigned,
nombre varchar(20),
profesor varchar(30),
primary key(codigo)
);
create table inscriptos(
documento char(8) not null,
codigodeporte tinyint unsigned not null,
ao year,
matriculapaga char(1),/* 's' si est paga, 'n' si no est paga*/
primary key(documento,codigodeporte,ao)
);
3- Ingrese algunos registros para ambas tablas:
insert into deportes values(1,'Tenis','Juan Lopez');
insert into deportes values(2,'Natacion','Maria Lopez');
insert into deportes values(3,'Basquet','Antonio Juarez');
insert into inscriptos values ('22333444',2,'2005','s');
insert into inscriptos values ('22333444',2,'2006','n');
insert into inscriptos values ('23333444',2,'2005','s');
insert into inscriptos values ('23333444',1,'2005','s');
insert into inscriptos values ('23333444',1,'2006','s');
insert into inscriptos values ('24333444',2,'2006','n');
insert into inscriptos values ('24333444',3,'2006','n');
4- Muestre el nombre del deporte y todos los campos de la tabla "inscriptos":
select d.nombre,i.*
from deportes as d
join inscriptos as i
on d.codigo=i.codigodeporte;
5- Modifique el campo "codigo" de "deportes" para que almacene 1 caracter:
alter table deportes modify codigo char(1);
6- Actualice la tabla "deportes" almacenando en "codigo" el primer caracter del
nombre del deporte:
update deportes set codigo=left(nombre,1);
7- Vea cmo cambi la tabla:
select * from deportes;
8- Realice un "join":
select d.nombre,i.*
from deportes as d
join inscriptos as i
on d.codigo=i.codigodeporte;
No encuentra coincidencia.
<------------------------------------------------------------------>
64 - Varias tablas (left join)
Hemos visto cmo usar registros de una tabla para encontrar registros de otra tabl
a, uniendo ambas tablas con "join" y enlazndolas con una condicin "on" en la cual
colocamos el campo en comn. O sea, hacemos un "join" y asociamos registros de 2 t
ablas usando el "on", buscando coincidencia en los valores del campo que tienen
en comun ambas tablas.
Trabajamos con las tablas de una librera:
-libros: codigo (clave primaria), titulo, autor, codigoeditorial, precio, cantid
ad y
-editoriales: codigo (clave primaria), nombre.
Queremos saber de qu editoriales no tenemos libros.
Para averiguar qu registros de una tabla no se encuentran en otra tabla necesitam
os usar un "join" diferente.
Necesitamos determinar qu registros no tienen correspondencia en otra tabla, cules
valores de la primera tabla (de la izquierda) no estn en la segunda (de la derec
ha).
Para obtener la lista de editoriales y sus libros, incluso de aquellas editorial
es de las cuales no tenemos libros usamos:
select * from editoriales
left join libros
on editoriales.codigo=libros.codigoeditorial;
Un "left join" se usa para hacer coincidir registros en una tabla (izquierda) co
n otra tabla (derecha), pero, si un valor de la tabla de la izquierda no encuent
ra coincidencia en la tabla de la derecha, se genera una fila extra (una por cad
a valor no encontrado) con todos los campos seteados a "null".
Entonces, la sintaxis es la siguiente: se nombran ambas tablas, una a la izquier
da del "join" y la otra a la derecha, y la condicin para enlazarlas, es decir, el
campo por el cual se combinarn, se establece luego de "on". Es importante la pos
icin en que se colocan las tablas en un "left join", la tabla de la izquierda es
la que se usa para localizar registros en la tabla de la derecha. Por lo tanto,
estos "join" no son iguales:
select * from editoriales
left join libros
on editoriales.codigo=libros.codigoeditorial;

select * from libros
left join editoriales
on editoriales.codigo=libros.codigoeditorial;
La primera sentencia opera as: por cada valor de codigo de "editoriales" busca co
incidencia en la tabla "libros", si no encuentra coincidencia para algn valor, ge
nera una fila seteada a "null".
La segunda sentencia opera de modo inverso: por cada valor de "codigoeditorial"
de "libros" busca coincidencia en la tabla "editoriales", si no encuentra coinci
dencia, setea la fila a "null".
Usando registros de la tabla de la izquierda se encuentran registros en la tabla
de la derecha.
Luego del "on" se especifican los campos que se asociarn; no se deben colocar con
diciones en la parte "on" para restringir registros que deberan estar en el resul
tado, para ello hay que usar la clusula "where".
Un "left join" puede tener clausula "where" que restringa el resultado de la con
sulta considerando solamente los registros que encuentran coincidencia en la tab
la de la derecha:
select e.nombre,l.titulo
from editoriales as e
left join libros as l
on e.codigo=l.codigoeditorial
where l.codigoeditorial is not null;
El anterior "left join" muestra los valores de la tabla "editoriales" que estn pr
esentes en la tabla de la derecha ("libros").
Tambin podemos mostrar las editoriales que no estn presentes en "libros":
select e.nombre,l.titulo from editoriales as e
left join libros as l
on e.codigo=l.codigoeditorial
where l.codigoeditorial is null;
El anterior "left join" muestra los valores de la tabla "editoriales" que no enc
uentran correspondencia en la tabla de la derecha, "libros".
Problema :
Una empresa tiene registrados sus clientes en una tabla llamada "clientes", tamb
in tiene una
tabla "provincias" donde registra los nombres de las provincias.
1- Elimine las tablas "clientes" y "provincias", si existen:
drop table if exists clientes, provincias;
2- Crelas con las siguientes estructuras:
create table clientes (
codigo int unsigned auto_increment,
nombre varchar(30) not null,
domicilio varchar(30),
ciudad varchar(20),
codigoProvincia tinyint unsigned,
telefono varchar(11),
primary key(codigo)
);
create table provincias(
codigo tinyint unsigned auto_increment,
nombre varchar(20),
primary key (codigo)
);
3- Ingrese algunos registros para ambas tablas:
insert into provincias (nombre) values('Cordoba');
insert into provincias (nombre) values('Santa Fe');
insert into provincias (nombre) values('Corrientes');
insert into provincias (nombre) values('Misiones');
insert into provincias (nombre) values('Salta');
insert into provincias (nombre) values('Buenos Aires');
insert into provincias (nombre) values('Neuquen');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Lopez Marcos', 'Colon 111', 'Crdoba',1,'null');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Perez Ana', 'San Martin 222', 'Cruz del Eje',1,'4578585');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Garcia Juan', 'Rivadavia 333', 'Villa Maria',1,'4578445');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Perez Luis', 'Sarmiento 444', 'Rosario',2,null);
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Pereyra Lucas', 'San Martin 555', 'Cruz del Eje',1,'4253685');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Gomez Ines', 'San Martin 666', 'Santa Fe',2,'0345252525');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Torres Fabiola', 'Alem 777', 'Villa del Rosario',1,'4554455');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Lopez Carlos', 'Irigoyen 888', 'Cruz del Eje',1,null);
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Ramos Betina', 'San Martin 999', 'Cordoba',1,'4223366');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Lopez Lucas', 'San Martin 1010', 'Posadas',4,'0457858745');
4- Queremos saber de qu provincias no tenemos clientes:
select p.codigo,p.nombre from provincias as p
left join clientes as c
on c.codigoProvincia=p.codigo
where c.codigoprovincia is null;
5- Queremos saber de qu provincias si tenemos clientes, sin repetir el nombre de
la provincia:
select distinct p.codigo,p.nombre from provincias as p
left join clientes as c
on c.codigoProvincia=p.codigo
where c.codigoprovincia is not null;
6- Omita la referencia a las tablas en la condicin "on" para verificar que la sen
tencia no se
ejecuta porque el nombre del campo "codigo" es ambiguo (ambas tablas lo tienen):
select distinct codigo,p.nombre from provincias as p
left join clientes as c
on c.codigoProvincia=p.codigo
where c.codigoprovincia is not null;
Segundo problema:
A) Un club dicta clases de distintos deportes. En una tabla llamada "socios" gua
rda los datos de
sus socios y en una tabla denominada "inscriptos" almacena la informacin necesari
a para las
inscripciones de los socios a los distintos deportes.
1- Elimine las tablas si existen.
2- Cree las tablas:
create table socios(
documento char(8) not null,
nombre varchar(30),
domicilio varchar(30),
primary key(documento)
);
create table inscriptos(
documento char(8) not null,
deporte varchar(15) not null,
ao year,
matricula char(1), /*si esta paga ='s' sino 'n'*/
primary key(documento,deporte,ao)
);
3- Ingrese algunos registros para ambas tablas:
insert into socios values('22333444','Juan Perez','Colon 234');
insert into socios values('23333444','Maria Lopez','Sarmiento 465');
insert into socios values('24333444','Antonio Juarez','Caseros 980');
insert into socios values('25333444','Ana Juarez','Sucre 134');
insert into socios values('26333444','Sofia Herrero','Avellaneda 1234');
insert into inscriptos values ('22333444','natacion','2005','s');
insert into inscriptos values ('22333444','natacion','2006','n');
insert into inscriptos values ('23333444','natacion','2005','s');
insert into inscriptos values ('23333444','tenis','2006','s');
insert into inscriptos values ('23333444','natacion','2006','s');
insert into inscriptos values ('25333444','tenis','2006','n');
insert into inscriptos values ('25333444','basquet','2006','n');

4- Muestre el nombre del socio, deporte y ao realizando un join:
select s.nombre,i.deporte,i.ao
from socios as s
left join inscriptos as i
on s.documento=i.documento;
5- Muestre los nombres de los socios que no se han inscripto nunca en un deporte
:
select s.nombre
from socios as s
left join inscriptos as i
on s.documento=i.documento
where i.documento is null;
6- Omita la referencia a las tablas en la condicin "on" para verificar que la sen
tencia no se
ejecuta porque el nombre del campo "documento" es ambiguo (ambas tablas lo tiene
n):
select s.nombre
from socios as s
left join inscriptos as i
on documento=documento;
Tercer Problema:
B) Un club de barrio realiza una rifa anual y guarda los datos de las rifas en d
os tablas, una
denominada "premios" y otra llamada "numerosrifa".
1- Elimine las tablas si existen.
2- Cree las tablas:
create table premios(
posicion tinyint unsigned auto_increment,
premio varchar(20),
numeroganador tinyint unsigned,
primary key(posicion)
);

create table numerosrifa(
numero tinyint unsigned not null,
documento char(8) not null,
primary key(numero)
);
3- Ingrese algunos registros:
insert into premios values(1,'PC Pentium',205);
insert into premios values(2,'Televisor 21 pulgadas',29);
insert into premios values(3,'Microondas',5);
insert into premios values(4,'Multiprocesadora',15);
insert into premios values(5,'Cafetera',33);
insert into numerosrifa values(205,'22333444');
insert into numerosrifa values(200,'23333444');
insert into numerosrifa values(5,'23333444');
insert into numerosrifa values(8,'23333444');
insert into numerosrifa values(1,'24333444');
insert into numerosrifa values(109,'28333444');
insert into numerosrifa values(15,'30333444');
insert into numerosrifa values(29,'29333444');
insert into numerosrifa values(28,'32333444');
4- Muestre todos los nmeros de rifas vendidos ("numerosrifas") y realice un "left
join" mostrando
la posicin y el premio:
select nr.numero,p.posicion,p.premio
from numerosrifa as nr
left join premios as p
on p.numeroganador=nr.numero;
note que la posicin "5" no aparece en la lista porque el nmero ganador de esa posi
cin no fue
vendido, no se encuentra en la tabla "premios". Y note que los nmeros vendidos qu
e no ganaron
tiene la fila seteada a "null".
5- Muestre los mismos datos anteriores pero teniendo en cuenta los nmeros ganador
es solamente:
select nr.numero,p.posicion,p.premio
from numerosrifa as nr
left join premios as p
on p.numeroganador=nr.numero
where p.numeroganador is not null;
6- Realice un "left join" pero en esta ocasin busque los nmeros ganadores de la ta
bla "premios"
en la tabla "numerosrifa":
select nr.numero,p.posicion,p.premio
from premios as p
left join numerosrifa as nr
on p.numeroganador=nr.numero;
Note que el premio de la posicin "5" no encuentra coincidencia en la tabla "numer
osrifa" (porque
no fue vendido) y el campo est seteado a "null".
7- Realice el mismo "join" anterior pero sin considerar los valores de "premios"
que no encuentren
coincidencia en "numerosrifa".
select nr.numero,p.posicion,p.premio
from premios as p
left join numerosrifa as nr
on p.numeroganador=nr.numero
where nr.numero is not null;
<------------------------------------------------------------------>
65 - Varias tablas (right join)
"right join" opera del mismo modo que "left join" slo que la bsqueda de coincidenc
ias la realiza de modo inverso, es decir, los roles de las tablas se invierten,
busca coincidencia de valores desde la tabla de la derecha en la tabla de la izq
uierda y si un valor de la tabla de la derecha no encuentra coincidencia en la t
abla de la izquierda, se genera una fila extra (una por cada valor no encontrado
) con todos los campos seteados a "null".
Trabajamos con las tablas de una librera:
-libros: codigo (clave primaria), titulo, autor, codigoeditorial, precio, cantid
ad y
-editoriales: codigo (clave primaria), nombre.
Estas sentencias devuelven el mismo resultado:
select nombre,titulo
from editoriales as e
left join libros as l
on e.codigo=l.codigoeditorial;
select nombre,titulo
from libros as l
right join editoriales as e
on e.codigo=l.codigoeditorial;
La primera busca valores de "codigo" de la tabla "editoriales" (tabla de la izqu
ierda) coincidentes con los valores de "codigoeditorial" de la tabla "libros" (t
abla de la derecha). La segunda busca valores de la tabla de la derecha coincide
ntes con los valores de la tabla de la izquierda.
Problema :
Un club dicta clases de distintos deportes. En una tabla llamada "socios" guarda
los datos de sus
socios y en una tabla denominada "inscriptos" almacena la informacin necesaria pa
ra las
inscripciones de los socios a los distintos deportes.
1- Elimine las tablas si existen.
2- Cree las tablas:
create table socios(
documento char(8) not null,
nombre varchar(30),
domicilio varchar(30),
primary key(documento)
);
create table inscriptos(
documento char(8) not null,
deporte varchar(15) not null,
ao year,
matricula char(1), /*si esta paga ='s' sino 'n'*/
primary key(documento,deporte,ao)
);
3- Ingrese algunos registros para ambas tablas:
insert into socios values('22333444','Juan Perez','Colon 234');
insert into socios values('23333444','Maria Lopez','Sarmiento 465');
insert into socios values('24333444','Antonio Juarez','Caseros 980');
insert into socios values('25333444','Marcelo Pereyra','Sucre 349');
insert into inscriptos values ('22333444','natacion','2005','s');
insert into inscriptos values ('22333444','natacion','2006','n');
insert into inscriptos values ('23333444','natacion','2005','s');
insert into inscriptos values ('23333444','tenis','2006','s');
insert into inscriptos values ('23333444','natacion','2006','s');
insert into inscriptos values ('24333444','tenis','2006','n');
insert into inscriptos values ('24333444','basquet','2006','n');
4- Realice un "left join" de la tabla "socios" a "inscriptos" buscando coinciden
cia de "documento":
select s.documento,nombre,i.deporte,i.ao,i.matricula
from socios as s
left join inscriptos as i
on s.documento=i.documento;
Note que el socio que no est inscripto en ningn deporte tiene la fila seteada a "n
ull".
5- Realice un "right join" para obtener la misma salida anterior:
select s.documento,nombre,i.deporte,i.ao,i.matricula
from inscriptos as i
right join socios as s
on s.documento=i.documento;
6- Ingrese una inscripcin de alguien que no sea socio (documento que no se encuen
tre en la
tabla "socios"):
insert into inscriptos values ('26333444','basquet','2006','n');
7- Realice un "right join" desde la tabla "socios" a "inscriptos" buscando coinc
idencia de documento:
select nombre,i.documento,deporte,i.ao,i.matricula
from socios as s
right join inscriptos as i
on s.documento=i.documento;
Note que la persona con documento "26333444" no se encuentra en "socios", la col
umna "nombre"
(correspondiente a la tabla "socios") contiene "null".
<----------------------------------------------------------------->
66 - Varias tablas (cross join)
"cross join" retorna todos los registros de todas las tablas implicadas en la un
in, devuelve el producto cartesiano. No es muy utilizado.
Un pequeo restaurante tiene almacenados los nombres y precios de sus comidas en u
na tabla llamada "comidas" y en una tabla denominada "postres" los mismos datos
de sus postres.
El restaurante quiere combinar los registros de ambas tablas para mostrar los di
stintos menes que ofrece. Podemos usar "cross join":
select c.*,p.*
from comidas as c
cross join postres as p;
es igual a un simple "join" sin parte "on":
select c.*,p.*
from comidas as c
join postres as p;
Podemos organizar la salida del "cross join" para obtener el nombre del plato pr
incipal, del postre y el precio total de cada combinacin (men):
select c.nombre,p.nombre,
c.precio+p.precio as total
from comidas as c
cross join postres as p;
Para realizar un "join" no es necesario utilizar 2 tablas, podemos combinar los
registros de una misma tabla. Para ello debemos utilizar 2 alias para la tabla.
Si los datos de las tablas anteriores ("comidas" y "postres") estuvieran en una
sola tabla con la siguiente estructura:
create table comidas(
codigo tinyint unsigned auto_increment,
nombre varchar(30),
rubro varchar(20),/*plato principal y postre*/
precio decimal (5,2) unsigned,
primary key(codigo)
);
Podemos obtener la combinacin de platos principales con postres empleando un "cro
ss join" con una sola tabla:
select c1.nombre,c1.precio,c2.nombre,c2.precio
from comidas as c1
cross join comidas as c2
where c1.rubro='plato principal' and
c2.rubro='postre';
Se emple un "where" para combinar "plato principal" con "postre".
Si queremos el monto total de cada combinacin:
select c1.nombre,c2.nombre,
c1.precio+c2.precio as total
from comidas as c1
cross join comidas as c2
where c1.rubro='plato principal' and
c2.rubro='postre';
Problema :
Una empresa de seguridad almacena los datos de sus guardias de seguridad en una
tabla
llamada "guardias". tambin almacena los distintos sitios que solicitaron sus serv
icios en una
tabla llamada "tareas".
1- Elimine las tablas "guardias" y "tareas" si existen.
2- Cree las siguientes tablas:
create table guardias(
documento char(8),
nombre varchar(30),
sexo char(1), /* 'f' o 'm' */
domicilio varchar(30),
primary key (documento)
);
create table tareas(
codigo tinyint unsigned auto_increment,
domicilio varchar(30),
descripcion varchar(30),
horario char(2), /* 'AM' o 'PM'*/
primary key (codigo)
);
3- Ingrese los siguientes registros:
insert into guardias values('22333444','Juan Perez','m','Colon 123');
insert into guardias values('23333444','Lorena Viale','f','Sarmiento 988');
insert into guardias values('24333444','Alberto Torres','m','San Martin 567');
insert into guardias values('25333444','Luis Ferreyra','m','Chacabuco 235');
insert into guardias values('26333444','Irma Gonzalez','f','Mariano Moreno 111'
);
insert into tareas (domicilio,descripcion,horario)
values('Colon 1111','vigilancia exterior','AM');
insert into tareas (domicilio,descripcion,horario)
values('Urquiza 234','vigilancia exterior','PM');
insert into tareas (domicilio,descripcion,horario)
values('Peru 345','vigilancia interior','AM');
insert into tareas (domicilio,descripcion,horario)
values('Avellaneda 890','vigilancia interior','PM');
4- La empresa quiere que todos sus empleados realicen todas las tareas. Realice
una "cross join":
select nombre,t.domicilio,descripcion
from guardias
cross join tareas as t;
Devuelve el producto cartesiano de ambas tablas, combina todos los registros de
una tabla con todos
los registros de la otra.
5- Obtenga la misma salida realizando un simple "join" sin parte "on":
select nombre,t.domicilio,descripcion
from guardias
join tareas as t;
Segundo problema:
A) Varios clubes de barrio se organizaron para realizar campeonatos entre ellos.
La tabla
llamada "equipos" guarda la informacin de los distintos equipos que jugarn.
1- Elimine la tabla, si existe.
2- Cree la tabla:
create table equipos(
nombre varchar(30),
barrio varchar(20),
domicilio varchar(30),
entrenador varchar(30)
);
3- Ingrese los siguientes registros:
insert into equipos values('Los tigres','Gral. Paz','Sarmiento 234','Juan Lopez
');
insert into equipos values('Los leones','Centro','Colon 123','Gustavo Fuentes')
;
insert into equipos values('Campeones','Pueyrredon','Guemes 346','Carlos Moreno
');
insert into equipos values('Cebollitas','Alberdi','Colon 1234','Luis Duarte');
4- Cada equipo jugar con todos los dems 2 veces, una vez en cada sede. Realice un
"cross join"
para combinar los equipos teniendo en cuenta que un equipo no juega consigo mism
o:
select e1.nombre,e2.nombre,e1.barrio as 'sede'
from equipos as e1
cross join equipos as e2
where e1.nombre<>e2.nombre;
5- Obtenga el mismo resultado empleando un "join" sin parte "on":
select e1.nombre,e2.nombre,e1.barrio as 'sede'
from equipos as e1
join equipos as e2
where e1.nombre<>e2.nombre;
Tercer Problema:
B) Una agencia matrimonial almacena la informacin de sus clientes en una tabla ll
amada "clientes".
1- Elimine la tabla si existe:
2- Cree la tabla:
create table clientes(
nombre varchar(30),
domicilio varchar(30),
sexo char(1),
edad tinyint unsigned
);
3- Ingrese los siguientes registros:
insert into clientes (nombre,sexo,edad) values('Juan Perez','m',45);
insert into clientes (nombre,sexo,edad) values('Ana Lopez','f',50);
insert into clientes (nombre,sexo,edad) values('Federico Herrero','m',30);
insert into clientes (nombre,sexo,edad) values('Mariano Juarez','m',35);
insert into clientes (nombre,sexo,edad) values('Maria Torres','f',36);
insert into clientes (nombre,sexo,edad) values('Ines Duarte','f',55);
insert into clientes (nombre,sexo,edad) values('Alejandra Figueroa','f',40);
4- La agencia necesita la combinacin de todas las personas de sexo femenino con l
as de sexo
masculino. Use un "join" sin parte "on" y establezca como condicin que las person
as de la primera
tabla sean de sexo femenino y las de la segunda tabla de sexo masculino:
select c1.nombre,c1.edad,c1.sexo, c2.nombre,c2.edad,c2.sexo
from clientes as c1
join clientes as c2
where c1.sexo='f' and c2.sexo='m';
5- Obtenga la misma salida usando "cross join":
select c1.nombre,c1.edad,c1.sexo, c2.nombre,c2.edad,c2.sexo
from clientes as c1
cross join clientes as c2
where c1.sexo='f' and c2.sexo='m';
6- Se pide, adems, que las edades de las posibles parejas no tengan una diferenci
a superior a 10
aos:
select c1.nombre,c1.edad,c1.sexo, c2.nombre,c2.edad,c2.sexo
from clientes as c1
cross join clientes as c2
where c1.sexo='f' and c2.sexo='m' and
c2.edad - c1.edad between -10 and 10;
<------------------------------------------------------------------>
67 - Varias tablas (natural join)
"natural join" se usa cuando los campos por los cuales se enlazan las tablas tie
nen el mismo nombre.
Tenemos las tablas "libros" y "editoriales" de una librera.
Las tablas tienen las siguientes estructuras:
- libros: codigo (clave primaria), titulo, autor, codigoeditorial, precio.
- editoriales: codigoeditorial(clave primaria), nombre.
Como en ambas tablas, el cdigo de la editorial se denomina "codigoeditorial", pod
emos omitir la parte "on" que indica los nombres de los campos por el cual se en
lazan las tablas, empleando "natural join", se unirn por el campo que tienen en c
omn:
select titulo,nombre
from libros as l
natural join editoriales as e;
La siguiente sentencia tiene la misma salida anterior:
select titulo,nombre
from libros as l
join editoriales as e
on l.codigoeditorial=e.codigoeditorial;
Tambin se puede usar "natural" con "left join" y "right join":
select nombre,titulo
from editoriales as e
natural left join libros as l;
que tiene la misma salida que:
select nombre,titulo
from editoriales as e
left join libros as l
on e.codigoeditorial=l.codigoeditorial;
Es decir, con "natural join" no se coloca la parte "on" que especifica los campo
s por los cuales se enlazan las tablas, porque MySQL busca los campos con igual
nombre y enlaza las tablas por ese campo.
Hay que tener cuidado con este tipo de "join" porque si ambas tablas tiene ms de
un campo con igual nombre, MySQL no sabr por cual debe realizar la unin. Por ejemp
lo, si el campo "titulo" de la tabla "libros" se llamara "nombre", las tablas te
ndran 2 campos con igual nombre ("codigoeditorial" y "nombre").
Otro problema que puede surgir es el siguiente. Tenemos la tabla "libros" con lo
s siguientes campos: codigo (del libro), titulo, autor y codigoeditorial, y la t
abla "editoriales" con estos campos: codigo (de la editorial) y nombre. Si usamo
s "natural join", unir las tablas por el campo "codigo", que es el campo que tien
en igual nombre, pero el campo "codigo" de "libros" no hace referencia al cdigo d
e la editorial sino al del libro, as que la salida ser errnea.
Problema :
Un club dicta clases de distintos deportes. En una tabla llamada "socios" guarda
los datos de sus
socios y en una tabla denominada "inscriptos" almacena la informacin necesaria pa
ra las
inscripciones de los socios a los distintos deportes.
1- Elimine las tablas si existen.
2- Cree las tablas:
create table socios(
documento char(8) not null,
nombre varchar(30),
domicilio varchar(30),
primary key(documento)
);
create table inscriptos(
documento char(8) not null,
deporte varchar(15) not null,
ao year,
matricula char(1), /*si esta paga ='s' sino 'n'*/
primary key(documento,deporte,ao)
);
3- Ingrese algunos registros para ambas tablas:
insert into socios values('22333444','Juan Perez','Colon 234');
insert into socios values('23333444','Maria Lopez','Sarmiento 465');
insert into socios values('24333444','Antonio Juarez','Caseros 980');
insert into socios values('25333444','Marcelo Pereyra','Sucre 349');
insert into inscriptos values ('22333444','natacion','2005','s');
insert into inscriptos values ('22333444','natacion','2006','n');
insert into inscriptos values ('23333444','natacion','2005','s');
insert into inscriptos values ('23333444','tenis','2006','s');
insert into inscriptos values ('23333444','natacion','2006','s');
insert into inscriptos values ('24333444','tenis','2006','n');
insert into inscriptos values ('24333444','basquet','2006','n');
4- Realice un "natural join" de ambas tablas:
select nombre,i.*
from socios as s
natural join inscriptos as i;
5- Obtenga el mismo resultado con un "join":
select nombre,i.*
from socios as s
join inscriptos as i
on s.documento=i.documento;
6- Realice un "left join" de la tabla "socios" a "inscriptos" buscando coinciden
cia de "documento":
select nombre,i.*
from socios as s
left join inscriptos as i
on s.documento=i.documento;
Note que el socio que no est inscripto en ningn deporte tiene la fila seteada a "n
ull".
7- Realice un "natural left join" para obtener la misma salida anterior:
select nombre,i.*
from socios as s
natural left join inscriptos as i;
8- Realice un "natural right join" para obtener la misma salida anterior:
select nombre,i.*
from inscriptos as i
natural right join socios as s;
<------------------------------------------------------------------>
68 - Varias tablas (inner join - straight join)
Existen otros tipos de "join" adems del simple "join", "left join", "right join",
"cross join" y "natural join". Vemoslos.
"inner join" es igual que "join". Con "inner join", todos los registros no coinc
identes son descartados, slo los coincidentes se muestran en el resultado:
select nombre,titulo
from editoriales as e
inner join libros as l
on e.codigo=l.codigoeditorial;
Tiene la misma salida que un simple "join":
select nombre,titulo
from editoriales as e
join libros as l
on e.codigo=l.codigoeditorial;
"straight join" es igual a "join", slo que la tabla de la izquierda es leda siempr
e antes que la de la derecha.
<------------------------------------------------------------------>
69 - join, group by y funciones de agrupamiento.
Podemos usar "group by" y las funciones de agrupamiento con "join".
Para ver todas las editoriales, agrupadas por nombre, con una columna llamada "C
antidad de libros" en la que aparece la cantidad calculada con "count()" de todo
s los libros de cada editorial tipeamos:
select e.nombre,count(l.codigoeditorial) as 'Cantidad de libros'
from editoriales as e
left join libros as l
on l.codigoeditorial=e.codigo
group by e.nombre;
Si usamos "left join" la consulta mostrar todas las editoriales, y para cualquier
editorial que no encontrara coincidencia en la tabla "libros" colocar "0" en "Ca
ntidad de libros". Si usamos "join" en lugar de "left join":
select e.nombre,count(l.codigoeditorial) as 'Cantidad de libros'
from editoriales as e
join libros as l
on l.codigoeditorial=e.codigo
group by e.nombre;
solamente mostrar las editoriales para las cuales encuentra valores coincidentes
para el cdigo de la editorial en la tabla "libros".
Para conocer el mayor precio de los libros de cada editorial usamos la funcin "ma
x()", hacemos una unin y agrupamos por nombre de la editorial:
select e.nombre,
max(l.precio) as 'Mayor precio'
from editoriales as e
left join libros as l
on l.codigoeditorial=e.codigo
group by e.nombre;
En la sentencia anterior, mostrar, para la editorial de la cual no haya libros, e
l valor "null" en la columna calculada; si realizamos un simple "join":
select e.nombre,
max(l.precio) as 'Mayor precio'
from editoriales as e
join libros as l
on l.codigoeditorial=e.codigo
group by e.nombre;
slo mostrar las editoriales para las cuales encuentra correspondencia en la tabla
de la derecha.
Problema :
Una empresa tiene registrados sus clientes en una tabla llamada "clientes", tamb
in tiene una
tabla "provincias" donde registra los nombres de las provincias de las cuales so
n oriundos los
clientes.
1- Elimine la tabla "clientes" y "provincias", si existen:
drop table if exists clientes, provincias;
2- Crelas con las siguientes estructuras:
create table clientes (
codigo int unsigned auto_increment,
nombre varchar(30) not null,
domicilio varchar(30),
ciudad varchar(20),
codigoprovincia tinyint unsigned,
telefono varchar(11),
primary key(codigo)
);
create table provincias(
codigo tinyint unsigned auto_increment,
nombre varchar(20),
primary key (codigo)
);
3- Ingrese algunos registros para ambas tablas:
insert into provincias (nombre)
values('Cordoba');
insert into provincias (nombre)
values('Santa Fe');
insert into provincias (nombre)
values('Corrientes');
insert into provincias (nombre)
values('Misiones');
insert into provincias (nombre)
values('Salta');
insert into provincias (nombre)
values('Buenos Aires');
insert into provincias (nombre)
values('Neuquen');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Lopez Marcos', 'Colon 111', 'Crdoba',1,'null');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Perez Ana', 'San Martin 222', 'Cruz del Eje',1,'4578585');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Garcia Juan', 'Rivadavia 333', 'Villa Maria',1,'4578445');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Perez Luis', 'Sarmiento 444', 'Rosario',2,null);
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Pereyra Lucas', 'San Martin 555', 'Cruz del Eje',1,'4253685');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Gomez Ines', 'San Martin 666', 'Santa Fe',2,'0345252525');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Torres Fabiola', 'Alem 777', 'Villa del Rosario',1,'4554455');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Lopez Carlos', 'Irigoyen 888', 'Cruz del Eje',1,null);
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Ramos Betina', 'San Martin 999', 'Cordoba',1,'4223366');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Lopez Lucas', 'San Martin 1010', 'Posadas',4,'0457858745');
4- Agrupe por nombre de provincia y cuente la cantidad de clientes por provincia
usando un "join":
select p.nombre,
count(c.codigoprovincia) as 'cant. clientes'
from provincias as p
join clientes as c
on p.codigo=c.codigoprovincia
group by p.nombre;
slo aparecen las provincias en las cuales tenemos clientes.
5- Agrupe por nombre de provincia y cuente la cantidad de clientes por provincia
usando un "left
join":
select p.nombre,
count(c.codigoprovincia) as 'cant. clientes'
from provincias as p
left join clientes as c
on p.codigo=c.codigoprovincia
group by p.nombre;
Muestra todas las provincias.
6- Agrupe por nombre de provincia y muestre la cantidad de clientes por provinci
a usando un "join"
de las provincias en las cuales tenemos 2 o ms clientes:
select p.nombre,
count(c.codigoprovincia) as 'cant. clientes'
from provincias as p
join clientes as c
on p.codigo=c.codigoprovincia
group by p.nombre
having count(c.codigoprovincia)>=2;
Segundo problema:
A) Un comercio que tiene un stand en una feria registra en una tabla llamada "vi
sitantes" algunos
datos de las personas que visitan o compran en su stand para luego enviarle publ
icidad de sus
productos.
1- Elimine las tablas "visitantes" y "ciudades", si existen.
2- Crelas con las siguientes estructuras:
create table visitantes(
nombre varchar(30),
edad tinyint unsigned,
sexo char(1),
domicilio varchar(30),
codigociudad tinyint unsigned not null,
telefono varchar(11),
montocompra decimal(6,2) unsigned
);
create table ciudades(
codigo tinyint unsigned auto_increment,
nombre varchar(20),
primary key (codigo)
);

3- Ingrese algunos registros:
insert into ciudades (nombre)
values('Cordoba');
insert into ciudades (nombre)
values('Alta Gracia');
insert into ciudades (nombre)
values('Villa Dolores');
insert into ciudades (nombre)
values('Carlos Paz');
insert into visitantes (nombre,edad, sexo,domicilio,codigociudad,telefono,monto
compra)
values ('Susana Molina', 28,'f','Colon 123',1,null,45.50);
insert into visitantes (nombre,edad, sexo,domicilio,codigociudad,telefono,monto
compra)
values ('Marcela Mercado',36,'f','Avellaneda 345',1,'4545454',0);
insert into visitantes (nombre,edad, sexo,domicilio,codigociudad,telefono,monto
compra)
values ('Alberto Garcia',35,'m','Gral. Paz 123',2,'03547123456',25);
insert into visitantes (nombre,edad, sexo,domicilio,codigociudad,telefono,monto
compra)
values ('Teresa Garcia',33,'f','Gral. Paz 123',2,'03547123456',0);
insert into visitantes (nombre,edad, sexo,domicilio,codigociudad,telefono,monto
compra)
values ('Roberto Perez',45,'m','Urquiza 335',1,'4123456',33.20);
insert into visitantes (nombre,edad, sexo,domicilio,codigociudad,telefono,monto
compra)
values ('Marina Torres',22,'f','Colon 222',3,'03544112233',25);
insert into visitantes (nombre,edad, sexo,domicilio,codigociudad,telefono,monto
compra)
values ('Julieta Gomez',24,'f','San Martin 333',2,'03547121212',53.50);
insert into visitantes (nombre,edad, sexo,domicilio,codigociudad,telefono,monto
compra)
values ('Roxana Lopez',20,'f','Triunvirato 345',2,null,0);
insert into visitantes (nombre,edad, sexo,domicilio,codigociudad,telefono,monto
compra)
values ('Liliana Garcia',50,'f','Paso 999',1,'4588778',48);
insert into visitantes (nombre,edad, sexo,domicilio,codigociudad,telefono,monto
compra)
values ('Juan Torres',43,'m','Sarmiento 876',1,'4988778',15.30);
4- Muestre la cantidad de visitantes agrupados por nombre de la ciudad:
select c.nombre,count(v.codigociudad)
from ciudades as c
left join visitantes as v
on c.codigo=v.codigociudad
group by c.nombre;
5- Muestre la cantidad de visitantes que hicieron alguna compra, agrupados por n
ombre de la ciudad:
select c.nombre,count(v.codigociudad)
from ciudades as c
join visitantes as v
on c.codigo=v.codigociudad
where v.montocompra>0
group by c.nombre;
6- Muestre la suma de las compras y el promedio de las mismas, agrupados por ciu
dad y sexo:
select c.nombre,sexo,sum(montocompra) as 'total',
avg(montocompra) as 'promedio'
from ciudades as c
join visitantes as v
on c.codigo=v.codigociudad
group by c.nombre,sexo;
Tercer Problema:
B) Una inmobiliaria que alquila departamentos guarda la informacin de los mismos
en una tabla
llamada "departamentos" y "barrios".
1- Elimine las tablas si existen.
2- Cree las tablas con las siguientes estructuras:
create table inmuebles(
edificio varchar(30),
domicilio varchar(30) not null,
piso char(1) not null,
numerodpto char(2) not null,
detalles varchar(200),
codigobarrio tinyint unsigned,
precio decimal(6,2) unsigned,
primary key (edificio,piso,numerodpto)
);
create table barrios(
codigo tinyint unsigned auto_increment,
nombre varchar(30),
primary key(codigo)
);
3- Ingrese los siguientes registros:
insert into barrios (nombre) values ('Centro');
insert into barrios (nombre) values ('Alberdi');
insert into barrios (nombre) values ('Gral. Paz');
insert into barrios (nombre) values ('Pueyrredon');
insert into departamentos (edificio,domicilio,piso,numerodpto,codigobarrio,prec
io)
values('Avellaneda','Avellaneda 86','1','1',1,400.50);
insert into departamentos (edificio,domicilio,piso,numerodpto,codigobarrio,prec
io)
values('Avellaneda','Avellaneda 86','1','2',1,400.50);
insert into departamentos (edificio,domicilio,piso,numerodpto,codigobarrio,prec
io)
values('Avellaneda','Avellaneda 86','2','1',1,400.50);
insert into departamentos (edificio,domicilio,piso,numerodpto,codigobarrio,prec
io)
values('Bolivar','Sarmiento 1203','1','1',3,500);
insert into departamentos (edificio,domicilio,piso,numerodpto,codigobarrio,prec
io)
values('Centauro I','Peru 456','1','A',4,300);
insert into departamentos (edificio,domicilio,piso,numerodpto,codigobarrio,prec
io)
values('Centauro I','Peru 456','2','C',4,350);
insert into departamentos (edificio,domicilio,piso,numerodpto,codigobarrio,prec
io)
values('Paris','Urquiza 364','1','12',1,600);
4- Muestre todos los departamentos incluido el nombre del barrio:
select edificio,domicilio,piso,numerodpto,nombre,precio
from departamentos as d
join barrios as b
on d.codigobarrio=b.codigo;
5- Muestre la cantidad de departamentos por edificio con el nombre del barrio:
select edificio,nombre,count(*)
from departamentos as d
join barrios as b
on d.codigobarrio=b.codigo
group by edificio;
6- Muestre el promedio de los precios de los departamentos agrupados por barrio:
select nombre,avg(precio)
from departamentos as d
join barrios as b
on d.codigobarrio=b.codigo
group by nombre;
7- Muestre el promedio de los precios de los departamentos agrupados por barrio
teniendo en cuenta
todos los barrios, incluso aquellos en los cuales no hay departamentos disponibl
es:
select nombre,avg(precio)
from barrios as b
left join departamentos as d
on d.codigobarrio=b.codigo
group by nombre;
Cuarto Problema:
C) Un video club que alquila pelculas en video guarda informacin de sus pelculas en
alquiler y
los alquileres en las tabla "peliculas" y "alquileres" respectivamente.
1- Elimine las tablas si existen.
2- Crelas con las siguientes estructuras:
create table peliculas (
codigo smallint unsigned auto_increment,
titulo varchar(30) not null,
actores varchar(40),
duracion tinyint unsigned,
primary key (codigo)
);
create table alquileres(
codigopelicula smallint unsigned not null,
socio varchar(30) not null,
fechaprestamo date not null,
fechadevolucion date,
primary key (codigopelicula,fechaprestamo)
);
3- Ingrese los siguientes registros para las 2 tablas.
insert into peliculas (titulo,actores,duracion)
values('Elsa y Fred','China Zorrilla',90);
insert into peliculas (titulo,actores,duracion)
values('Mision imposible','Tom Cruise',120);
insert into peliculas (titulo,actores,duracion)
values('Mision imposible 2','Tom Cruise',180);
insert into peliculas (titulo,actores,duracion)
values('Harry Potter y la piedra filosofal','Daniel H.',120);
insert into peliculas (titulo,actores,duracion)
values('Harry Potter y la camara secreta','Daniel H.',150);
insert into alquileres (codigopelicula,socio,fechaprestamo)
values(1,'Juan Lopez','2006-07-02');
insert into alquileres (codigopelicula,socio,fechaprestamo)
values(2,'Juan Lopez','2006-07-02');
insert into alquileres (codigopelicula,socio,fechaprestamo)
values(3,'Juan Lopez','2006-07-12');
insert into alquileres (codigopelicula,socio,fechaprestamo)
values(1,'Luis Molina','2006-08-02');
insert into alquileres (codigopelicula,socio,fechaprestamo)
values(3,'Luis Molina','2006-08-12');
insert into alquileres (codigopelicula,socio,fechaprestamo)
values(4,'Luis Molina','2006-08-02');
insert into alquileres (codigopelicula,socio,fechaprestamo)
values(1,'Andrea Torres','2006-09-02');
insert into alquileres (codigopelicula,socio,fechaprestamo)
values(2,'Andrea Torres','2006-08-02');
insert into alquileres (codigopelicula,socio,fechaprestamo)
values(3,'Andrea Torres','2006-08-15');
insert into alquileres (codigopelicula,socio,fechaprestamo)
values(4,'Andrea Torres','2006-08-22');
insert into alquileres (codigopelicula,socio,fechaprestamo)
values(4,'Juan Lopez','2006-08-25');
insert into alquileres (codigopelicula,socio,fechaprestamo)
values(1,'Andrea Torres','2006-08-25');
4- Muestre toda la informacin de los "alquileres" (nombre de la pelcula, nombre de
l socio, fecha
de prstamo y de devolucin):
select titulo,socio,fechaprestamo,fechadevolucion from alquileres as a
join peliculas as p
on a.codigopelicula=p.codigo
5- Muestre la cantidad de veces que se alquil cada pelcula:
select p.titulo,count(*) from peliculas as p
join alquileres as a
on p.codigo=a.codigopelicula
group by p.titulo;
6- Muestre la cantidad de pelculas que alquil cada socio:
select socio,count(a.codigopelicula) from alquileres
group by socio;
7- Muestre la cantidad de pelculas DISTINTAS que alquil cada socio:
select socio,count(distinct a.codigopelicula) from alquileres
group by socio;
8- Muestre la cantidad de pelculas alquiladas por mes por cada socio ordenado por
mes:
select socio,
monthname(a.fechaprestamo) as mes,
count(a.codigopelicula)
from alquileres
group by socio, mes
order by mes;
<------------------------------------------------------------------>
70 - join con ms de dos tablas.
Podemos hacer un "join" con ms de dos tablas.
Una biblioteca registra la informacin de sus libros en una tabla llamada "libros"
, los datos de sus socios en "socios" y los prstamos en una tabla "prestamos".
En la tabla "prestamos" haremos referencia al libro y al socio que lo solicita c
olocando un cdigo que los identifique. Veamos:
create table libros(
codigo int unsigned auto_increment,
titulo varchar(40) not null,
autor varchar(20) default 'Desconocido',
primary key (codigo)
);
create socios(
documento char(8) not null,
nombre varchar(30),
domicilio varchar(30),
primary key (numero)
);
create table prestamos(
documento char(8) not null,
codigolibro int unsigned,
fechaprestamo date not null,
fechadevolucion date,
primary key (codigolibro,fechaprestamo)
);
Al recuperar los datos de los prestamos:
select * from prestamos;
aparece el cdigo del libro pero no sabemos el nombre y tampoco el nombre del soci
o sino su documento. Para obtener los datos completos de cada prstamo, incluyendo
esos datos, necesitamos consultar las tres tablas.
Hacemos un "join" (unin):
select nombre,titulo,fechaprestamo
from prestamos as p
join socios as s
on s.documento=p.documento
join libros as l
on codigolibro=codigo;
Analicemos la consulta anterior. Indicamos el nombre de la tabla luego del "from
" ("prestamos"), unimos esa tabla con la tabla "socios" especificando con "on" e
l campo por el cual se combinarn: el campo "documento" de ambas tablas; luego deb
emos hacer coincidir los valores para la unin con la tabla "libros" enlazndolas po
r los campos "codigolibro" y "codigo" de "libros". Utilizamos alias para una sen
tencia ms sencilla y comprensible.
Note que especificamos a qu tabla pertenece el campos "documento" porque a ese no
mbre de campo lo tienen las tablas "prestamos" y "socios", esto es necesario par
a evitar confusiones y ambiguedades al momento de referenciar un campo. En este
ejemplo, si omitimos la referencia a las tablas al nombrar el campo "documento"
aparece un mensaje de error indicando que "documento" es ambiguo.
Para ver todos los prestamos, incluso los que no encuentran coincidencia en las
otras tablas, usamos:
select nombre,titulo,fechaprestamo
from prestamos as p
left join socios as s
on p.documento=s.documento
left join libros as l
on l.codigo=p.codigolibro;
Podemos ver aquellos prestamos con valor coincidente para "libros" pero para "so
cio" con y sin coincidencia:
select nombre,titulo,fechaprestamo
from prestamos as p
left join socios as s
on p.documento=s.documento
join libros as l
on p.codigolibro=l.codigo;
Problema :
Un video club que alquila pelculas en video guarda informacin de sus pelculas en al
quiler, sus
socios y los alquileres en 3 tablas llamadas "peliculas", "socios" y "alquileres
" respectivamente.
1- Elimine las tablas si existen.
2- Crelas con las siguientes estructuras:
create table peliculas (
codigo smallint unsigned auto_increment,
titulo varchar(30) not null,
actores varchar(40),
duracion tinyint unsigned,
primary key (codigo)
);
create table socios(
codigo smallint unsigned auto_increment,
documento char(8),
nombre varchar(30),
domicilio varchar(30),
primary key (codigo)
);

create table alquileres(
codigopelicula smallint unsigned not null,
codigosocio smallint unsigned not null,
fechaprestamo date not null,
fechadevolucion date,
primary key (codigopelicula,fechaprestamo)
);
3- Ingrese los siguientes registros para las 3 tablas.
insert into peliculas (titulo,actores,duracion)
values('Elsa y Fred','China Zorrilla',90);
insert into peliculas (titulo,actores,duracion)
values('Mision imposible','Tom Cruise',120);
insert into peliculas (titulo,actores,duracion)
values('Mision imposible 2','Tom Cruise',180);
insert into peliculas (titulo,actores,duracion)
values('Harry Potter y la piedra filosofal','Daniel H.',120);
insert into peliculas (titulo,actores,duracion)
values('Harry Potter y la camara secreta','Daniel H.',150);
insert into socios (documento,nombre)
values('22333444','Juan Lopez');
insert into socios (documento,nombre)
values('23333444','Diana Perez');
insert into socios (documento,nombre)
values('24333444','Luis Fuentes');
insert into alquileres (codigopelicula,codigosocio,fechaprestamo)
values(1,1,'2006-07-02');
insert into alquileres (codigopelicula,codigosocio,fechaprestamo)
values(2,1,'2006-07-02');
insert into alquileres (codigopelicula,codigosocio,fechaprestamo)
values(3,1,'2006-07-12');
insert into alquileres (codigopelicula,codigosocio,fechaprestamo)
values(1,2,'2006-08-02');
insert into alquileres (codigopelicula,codigosocio,fechaprestamo)
values(3,2,'2006-08-12');
insert into alquileres (codigopelicula,codigosocio,fechaprestamo)
values(4,2,'2006-08-02');
insert into alquileres (codigopelicula,codigosocio,fechaprestamo)
values(1,3,'2006-09-02');
insert into alquileres (codigopelicula,codigosocio,fechaprestamo)
values(2,3,'2006-08-02');
insert into alquileres (codigopelicula,codigosocio,fechaprestamo)
values(3,3,'2006-08-15');
insert into alquileres (codigopelicula,codigosocio,fechaprestamo)
values(4,3,'2006-08-22');
insert into alquileres (codigopelicula,codigosocio,fechaprestamo)
values(4,1,'2006-08-25');
insert into alquileres (codigopelicula,codigosocio,fechaprestamo)
values(1,3,'2006-08-25');
4- Muestre toda la informacin de los "alquileres" (nombre de la pelcula, nombre de
l socio, fecha
de prstamo y de devolucin):
select titulo,nombre,fechaprestamo,fechadevolucion from alquileres as a
join peliculas as p
on a.codigopelicula=p.codigo
join socios as s
on s.codigo=a.codigosocio;
5- Muestre la cantidad de veces que se alquil cada pelcula:
select p.titulo,count(*) from peliculas as p
join alquileres as a
on p.codigo=a.codigopelicula
group by p.titulo;
6- Muestre la cantidad de pelculas que alquil cada socio:
select s.nombre,count(a.codigopelicula) from socios as s
join alquileres as a
on s.codigo=a.codigosocio
group by s.nombre;
7- Muestre la cantidad de pelculas DISTINTAS que alquil cada socio:
select s.nombre,count(distinct a.codigopelicula) from socios as s
join alquileres as a
on s.codigo=a.codigosocio
group by s.nombre;
8- Muestre la cantidad de pelculas alquiladas por mes por cada socio ordenado por
mes:
select s.nombre,
monthname(a.fechaprestamo) as mes,
count(a.codigopelicula)
from socios as s
join alquileres as a
on s.codigo=a.codigosocio
group by s.nombre, mes
order by mes;

Segundo problema:
Un club de dicta clases de distintos deportes a sus socios. Guarda la informacin
de sus socios
en una tabla llamada "socios", los datos de los deportes en "deportes" y las ins
cipciones
en "incriptos".
1- Elimine las 3 tablas, si existen.
2- Cree las tablas:
create table socios(
documento char(8) not null,
nombre varchar(30) not null,
primary key(documento)
);
create table deportes(
codigo tinyint unsigned auto_increment,
nombre varchar(30),
primary key(codigo)
);
create table inscriptos(
documento char(8) not null,
codigodeporte tinyint unsigned,
ao year not null,
cuota char(1), /*'s' o 'n', si esta paga o no*/
primary key(documento,codigodeporte,ao)
);
3- Ingrese los siguientes registros:
insert into socios values('22333444','Juan Perez');
insert into socios values('23333444','Ana Garcia');
insert into socios values('24333444','Hector Fuentes');
insert into socios values('25333444','Marta Molina');
insert into deportes (nombre) values('tenis');
insert into deportes (nombre) values('natacion');
insert into deportes (nombre) values('basquet');
insert into deportes (nombre) values('voley');
insert into inscriptos values('22333444',1,'2005','s');
insert into inscriptos values('22333444',1,'2006','s');
insert into inscriptos values('22333444',2,'2005','s');
insert into inscriptos values('24333444',1,'2005','s');
insert into inscriptos values('24333444',2,'2006','s');
insert into inscriptos values('25333444',1,'2005','s');
insert into inscriptos values('25333444',1,'2006','s');
insert into inscriptos values('25333444',3,'2006','s');
4- Muestre el nombre del socio, el deporte en el cual se ha inscripto y el ao de
inscripcin
usando "join":
select s.nombre,d.nombre,i.ao
from inscriptos as i
join socios as s
on s.documento=i.documento
join deportes as d
on d.codigo=i.codigodeporte;
5- Muestre los nombres de todos los socios y el nombre de los deportes en los cu
ales se han
inscripto, incluso, si no se ha incripto en ninguno:
select s.nombre,d.nombre
from socios as s
left join inscriptos as i
on s.documento=i.documento
left join deportes as d
on d.codigo=i.codigodeporte;
6- Muestre todos los deportes y los nombres de los socios inscriptos, incluso pa
ra aquellos que no
tienen socios inscriptos:
select d.nombre,s.nombre
from deportes as d
left join inscriptos as i
on d.codigo=i.codigodeporte
left join socios as s
on s.documento=i.documento;
7- Muestre la cantidad de socios inscriptos en cada deporte:
select d.nombre,count(i.codigodeporte)
from deportes as d
left join inscriptos as i
on d.codigo=i.codigodeporte
left join socios as s
on s.documento=i.documento
group by d.nombre;
8- Muestre los distintos socios que se inscribieron en el ao "2006":
select distinct s.nombre
from inscriptos as i
join socios as s
on s.documento=i.documento
where ao='2006';
Tercer Problema:
B) Un instituto de enseanza guarda en una tabla llamada "carreras" los datos de l
as carreras que
dicta, en "materias" las materias de cada carrera y en "inscriptos" las inscripc
iones.
1- Elimine las 3 tablas, si existen:
drop table carreras, materias, inscriptos;
2- Cree las tablas con las siguientes estructuras:
create table carreras(
codigo tinyint unsigned auto_increment,
nombre varchar(30),
primary key(codigo)
);
create table materias(
codigo tinyint unsigned auto_increment,
codigocarrera tinyint unsigned,
nombre varchar(30),
profesor varchar(30),
primary key(codigo,codigocarrera)
);
create table inscriptos(
documento char(8) not null,
codigocarrera tinyint unsigned,
codigomateria tinyint unsigned,
ao year,
cuota char(1),/* si esta paga o no*/
primary key (documento,codigocarrera,codigomateria,ao)
);
3- Ingrese algunos registros:
insert into carreras values(1,'Analista de sistemas');
insert into carreras values(2,'Diseador web');
insert into materias values(1,1,'Programacion I','Alfredo Lopez');
insert into materias values(2,1,'Sistemas de datos I','Bernardo Garcia');
insert into materias values(3,1,'Ingles tecnico','Edit Torres');
insert into materias values(1,2,'Programacion basica','Alfredo Lopez');
insert into materias values(2,2,'Ingles I','Edit Torres');
insert into materias values(3,2,'Protocolos','Hector Juarez');
insert into inscriptos values('22333444',1,1,'2005','s');
insert into inscriptos values('22333444',1,2,'2005','s');
insert into inscriptos values('22333444',1,3,'2006','n');
insert into inscriptos values('23222222',1,1,'2005','s');
insert into inscriptos values('23222222',1,2,'2006','s');
insert into inscriptos values('24555666',1,1,'2005','s');
insert into inscriptos values('24555666',2,1,'2005','s');
insert into inscriptos values('25000999',1,1,'2005','s');
insert into inscriptos values('25000999',1,2,'2005','s');
insert into inscriptos values('25000999',2,1,'2006','n');
insert into inscriptos values('25000999',2,2,'2006','s');
4- Muestre el nombre de las materias, a qu carrera pertenecen y el nombre del pro
fesor que las
dicta ordenadas por carrera:
select c.nombre, m.nombre,m.profesor
from materias as m
join carreras as c
on c.codigo=m.codigocarrera
order by c.nombre;
5- Muestre el nombre de los profesores y la cantidad de materias que dicta cada
uno:
select m.profesor,count(*) as cantidad
from materias as m
group by m.profesor;
6- Muestre todos los datos de la tabla "inscriptos" (sin cdigos) incluyendo los n
ombres de las
materias y carreras ordenado por nombre de carrera y nombre de materia:
select i.documento,c.nombre,m.nombre,ao,cuota
from inscriptos as i
join carreras as c
on c.codigo=i.codigocarrera
join materias as m
on m.codigo=i.codigomateria and
m.codigocarrera=c.codigo
order by c.nombre,c.nombre;
Note que unimos "inscriptos" con "carreras" por el cdigo de la carrera, "inscript
os"
con "materias" por el cdigo de la materia y "carreras" con "materias" por el cdigo
de la carrera;
si olvidamos el ltimo enlace, se combinarn todos los cdigos de carreras con todos l
os cdigos de
materias.
7- Muestre la cantidad de alumnos que tiene cada profesor (hay profesores que di
ctan varias
materias en distintas carreras):
select m.profesor,count(*)
from inscriptos as i
join carreras as c
on c.codigo=i.codigocarrera
join materias as m
on m.codigo=i.codigomateria and
m.codigocarrera=c.codigo
group by m.profesor;
8- Muestre la cantidad de alumnos inscriptos en cada materia de cada carrera:
select c.nombre,m.nombre,count(i.codigomateria)
from carreras as c
join materias as m
on c.codigo=m.codigocarrera
left join inscriptos as i
on m.codigo=i.codigomateria and
c.codigo=i.codigocarrera
group by c.nombre,m.nombre;
Note que usamos "left join" para mostrar todas las materias, incluso para aquell
as en las cuales no
hay inscriptos.
9- Muestre el documento de los alumnos y la cantidad de materias por carrera en
las que se ha
inscripto cada uno de ellos:
select i.documento,c.nombre,
count(i.codigomateria) as materias
from carreras as c
join materias as m
on c.codigo=m.codigocarrera
join inscriptos as i
on m.codigo=i.codigomateria and
c.codigo=i.codigocarrera
group by i.documento,c.nombre;
10- Muestre la cantidad de alumnos distintos inscriptos en la institucin:
select count(distinct documento) from inscriptos;
11- Muestre la cantidad de alumnos que no pagaron la cuota, por carrera y materi
a:
select c.nombre,m.nombre,count(*)
from inscriptos as i
join carreras as c
on c.codigo=i.codigocarrera
join materias as m
on m.codigo=i.codigomateria and
m.codigocarrera=c.codigo
where i.cuota='n'
group by c.nombre,m.nombre;
<------------------------------------------------------------------>
71 - Funcin de control if con varias tablas.
Podemos emplear "if" y "case" en la misma sentencia que usamos un "join".
Por ejemplo, tenemos las tablas "libros" y "editoriales" y queremos saber si hay
libros de cada una de las editoriales:
select e.nombre,
if (count(l.codigoeditorial)>0,'Si','No') as hay
from editoriales as e
left join libros as l
on e.codigo=l.codigoeditorial
group by e.nombre;
Podemos obtener una salida similar usando "case" en lugar de "if":
select e.nombre,
case count(l.codigoeditorial)
when 0 then 'No'
else 'Si' end as 'Hay'
from editoriales as e
left join libros as l
on e.codigo=l.codigoeditorial
group by e.nombre;
Problema :
Un profesor guarda los promedios de sus alumnos de un curso en una tabla llamada
"alumnos" y las
notas de los mismos en la tabla "notas".
1- Elimine las tablas si existen.
2- Cree las tablas:
create table alumnos(
documento char(8) not null,
nombre varchar(30),
primary key(documento)
);
create table notas(
documento char(8) not null,
nota decimal(4,2) unsigned
);
3- Ingrese los siguientes registros:
insert into alumnos values('22333444','Juan Perez');
insert into alumnos values('23555666','Marina Herrero');
insert into alumnos values('24000333','Daniel Juarez');
insert into alumnos values('25222111','Hector Paz');
insert into notas values('22333444',7);
insert into notas values('23555666',8);
insert into notas values('24000333',3);
insert into notas values('25222111',7);
insert into notas values('22333444',7);
insert into notas values('23555666',9);
insert into notas values('24000333',4);
insert into notas values('22333444',6);
insert into notas values('23555666',10);
insert into notas values('24000333',3);
insert into notas values('25222111',9);
insert into notas values('23555666',10);
No todos los alumnos tienen la misma cantidad de notas porque algunos presentaro
n trabajos extras o
no asistieron a los examenes.
4- Muestre el documento del alumno, su nombre y el promedio; si el alumno tiene
un promedio menor a
4, muestre un mensaje "reprobado", si el promedio es mayor o igual a 4 y menor a
7,
muestre "regular", si el promedio es mayor a 7, muestre "promocionado", usando "
case":
select a.documento,a.nombre,avg(nota),
case when avg(nota)<4 then 'reprobado'
when avg(nota)>=4 and avg(nota)<7 then 'regular'
else 'promocionado' end as condicion
from alumnos as a
join notas as n
on a.documento=n.documento
group by n.documento;
5- Muestre el documento y nombre del alumno y con un "if" si el alumno est aproba
do o no:
select a.documento,a.nombre,
if (avg(nota)>=4,'si','no') as aprobado
from alumnos as a
join notas as n
on a.documento=n.documento
group by n.documento;
6- Muestre el documento, nombre del alumno y con un "case", si tiene 1 nota, 2 n
otas o ms de 2
notas:
select a.documento,a.nombre,
case count(*)
when 1 then '1 nota'
when 2 then '2 notas'
else 'mas de 2' end as 'cantidad de notas'
from alumnos as a
join notas as n
on a.documento=n.documento
group by n.documento
order by 'cantidad de notas';
<------------------------------------------------------------------>
72 - Variables de usuario.
Cuando buscamos un valor con las funciones de agrupamiento, por ejemplo "max()",
la consulta nos devuelve el mximo valor de un campo de una tabla, pero no nos mu
estra los valores de otros campos del mismo registro. Por ejemplo, queremos sabe
r todos los datos del libro con mayor precio de la tabla "libros" de una librera,
tipeamos:
select max(precio) from libros;
Para obtener todos los datos del libro podemos emplear una variable para almacen
ar el precio ms alto:
select @mayorprecio:=max(precio) from libros;
y luego mostrar todos los datos de dicho libro empleando la variable anterior:
select * from libros
where precio=@mayorprecio;
Es decir, guardamos en la variable el precio ms alto y luego, en otra sentencia,
mostramos los datos de todos los libros cuyo precio es igual al valor de la vari
able.
Las variables nos permiten almacenar un valor y recuperarlo ms adelante, de este
modo se pueden usar valores en otras sentencias.
Las variables de usuario son especficas de cada conexin, es decir, una variable de
finida por un cliente no puede ser vista ni usada por otros clientes y son liber
adas automticamente al abandonar la conexin.
Las variables de usuario comienzan con "@" (arroba) seguido del nombre (sin espa
cios), dicho nombre puede contener cualquier caracter.
Para almacenar un valor en una variable se coloca ":=" (operador de asignacin) en
tre la variable y el valor a asignar.
En el ejemplo, mostramos todos los datos del libro com precio ms alto, pero, si a
dems, necesitamos el nombre de la editorial podemos emplear un "join":
select l.titulo,l.autor,e.nombre
from libros as l
join editoriales as e
on l.codigoeditorial=e.codigo
where l.precio = @mayorprecio;
La utilidad de las variables consiste en que almacenan valores para utilizarlos
en otras consultas.
Por ejemplo, queremos ver todos los libros de la editorial que tenga el libro ms
caro. Debemos buscar el precio ms alto y almacenarlo en una variable, luego busca
r el nombre de la editorial del libro con el precio igual al valor de la variabl
e y guardarlo en otra variable, finalmente buscar todos los libros de esa editor
ial:
select @mayorprecio:=max(precio) from libros;
select @editorial:=e.nombre
from libros as l
join editoriales as e
on l.codigoeditorial=e.codigo
where precio=@mayorprecio;
select l.titulo,l.autor,e.nombre
from libros as l
join editoriales as e
on l.codigoeditorial=e.codigo
where e.nombre=@editorial;
Problema :
Un video club que alquila pelculas en video guarda informacin de sus pelculas en la

tabla "peliculas".
1- Elimine la tabla si existe.
2- Crela con la siguiente estructura:
create table peliculas (
codigo smallint unsigned auto_increment,
titulo varchar(30) not null,
actor varchar(30),
duracion tinyint unsigned,
primary key (codigo)
);
3- Ingrese los siguientes registros para las 3 tablas.
insert into peliculas (titulo,actor,duracion)
values('Elsa y Fred','China Zorrilla',90);
insert into peliculas (titulo,actor,duracion)
values('Mision imposible','Tom Cruise',120);
insert into peliculas (titulo,actor,duracion)
values('Mision imposible 2','Tom Cruise',180);
insert into peliculas (titulo,actor,duracion)
values('Harry Potter y la piedra filosofal','Daniel H.',120);
insert into peliculas (titulo,actor,duracion)
values('Harry Potter y la camara secreta','Daniel H.',150);
4- Guarde en dos variables el valor de duracin de la pelcula ms larga y el de la ms
corta:
select @mayorduracion:=max(duracion), @menorduracion:= min(duracion) from pelic
ulas;
5- Muestre todos los datos de ambas peliculas;
select * from peliculas
where duracion=@mayorduracion or
duracion=@menorduracion;
6- Guarde en una variable el nombre del actor de la pelcula de mayor duracin:
select @actor:=actor
from peliculas
where duracion=@mayorduracion;
7- Muestre todas las pelculas en las cuales trabaja el autor almacenado en la var
iable "@actor":
select * from peliculas
where actores=@actor;
<------------------------------------------------------------------>
73 - Crear tabla a partir de otra (create - insert)
Tenemos la tabla "libros" de una librera y queremos crear una tabla llamada "edit
oriales" que contenga los nombres de las editoriales.
La tabla "libros" tiene esta estructura:
-codigo: int unsigned auto_increment,
-titulo: varchar(40) not null,
-autor: varchar(30),
-editorial: varchar(20) not null,
-precio: decimal(5,2) unsigned,
-clave primaria: codigo.
La tabla "editoriales", que no existe, debe tener la siguiente estructura:
-nombre: nombre de la editorial.
La tabla libros contiene varios registros.
Para guardar en "editoriales" los nombres de las editoriales, podemos hacerlo en
3 pasos:
1 paso: crear la tabla "editoriales":
create table editoriales(
nombre varchar(20)
);
2 paso: realizar la consulta en la tabla "libros" para obtener los nombres de las
distintas editoriales:
select distinct editorial as nombre
from libros;
obteniendo una salida como la siguiente:
editorial
_________
Emece
Paidos
Planeta
3 paso: insertar los registros necesarios en la tabla "editoriales":
insert into editoriales (nombre) values('Emece');
insert into editoriales (nombre) values('Paidos');
insert into editoriales (nombre) values('Planeta');
Pero existe otra manera simplificando los pasos. Podemos crear la tabla "editori
ales" con los campos necesarios consultando la tabla "libros" y en el mismo mome
nto insertar la informacin:
create table editoriales
select distinct editorial as nombre
from libros;
La tabla "editoriales" se ha creado con el campo llamado "nombre" seleccionado d
el campo "editorial" de "libros".
Entonces, se realiza una consulta de la tabla "libros" y anteponiendo "create ta
ble ..." se ingresa el resultado de dicha consulta en la tabla "editoriales" al
momento de crearla.
Si seleccionamos todos los registros de la tabla "editoriales" aparece lo siguie
nte:
nombre
______
Emece
Paidos
Planeta
Si visualizamos la estructura de "editoriales" con "describe editoriales" vemos
que el campo "nombre" se cre con el mismo tipo y longitud del campo "editorial" d
e "libros".
Tambin podemos crear una tabla a partir de una consulta cargando los campos con l
os valores de otra tabla y una columna calculada. Veamos un ejemplo.
Tenemos la misma tabla "libros" y queremos crear una tabla llamada "librosporedi
torial" que contenga la cantidad de libros de cada editorial.
La tabla "cantidadporeditorial", que no est creada, debe tener la siguiente estru
ctura:
-nombre: nombre de la editorial,
-cantidad: cantidad de libros.
Podemos lograrlo en 3 pasos:
1 paso: crear la tabla "cantidadporeditorial":
create table editoriales(
nombre varchar(20),
cantidad smallint
);
2 paso: realizar la consulta en la tabla "libros" para obtener la cantidad de lib
ros de cada editorial agrupando por "editorial" y calculando la cantidad con "co
unt()":
select editorial,count(*)
from libros
group by editorial;
obteniendo una salida como la siguiente:
nombre cantidad
________________
Emece 3
Paidos 4
Planeta 2
3 paso: insertar los registros necesarios en la tabla "editoriales":
insert into cantidadporeditorial values('Emece',3);
insert into cantidadporeditorial values('Paidos',4);
insert into cantidadporeditorial values('Planeta',2);
Pero existe otra manera simplificando los pasos. Podemos crear la tabla "cantida
dporeditorial" con los campos necesarios consultando la tabla "libros" y en el m
ismo momento insertar la informacin:
create table cantidadporeditorial
select editorial as nombre,count(*) as cantidad
from libros
group by editorial;
La tabla "cantidadporeditorial" se ha creado con el campo llamado "nombre" selec
cionado del campo "editorial" de "libros" y con el campo "cantidad" con el valor
calculado con count() de la tabla "libros".
Entonces, se realiza una consulta de la tabla "libros" y anteponiendo "create ta
ble ..." se ingresa el resultado de dicha consulta en la tabla "cantidadporedito
rial" al momento de crearla.
Si seleccionamos todos los registros de la tabla "cantidadporeditorial" aparece
lo siguiente:
nombre cantidad
_______________________
Emece 3
Paidos 4
Planeta 2
Si visualizamos la estructura de "cantidadporeditorial" con "describe cantidadpo
reditorial", vemos que el campo "nombre" se cre con el mismo tipo y longitud del
campo "editorial" de "libros" y el campo "cantidad" se cre como "bigint".
Problema :
Un comercio guarda la informacin de sus ventas en una tabla llamada "facturas".
1- Elimine la tabla si existe.
2- Cree la tabla con la siguiente estructura:
create table facturas(
numero int(10) zerofill auto_increment,
numeroitem smallint unsigned not null,
descripcion varchar(30),
precioporunidad decimal(5,2) unsigned,
cantidad tinyint unsigned,
primary key (numero,numeroitem)
);
3- Ingrese algunos registros:
insert into facturas (numero,numeroitem,descripcion,precioporunidad,cantidad)
values(100,1,'escuadra 20 cm.',2.50,20);
insert into facturas (numero,numeroitem,descripcion,precioporunidad,cantidad)
values(100,2,'escuadra 50 cm.',5,30);
insert into facturas (numero,numeroitem,descripcion,precioporunidad,cantidad)
values(100,3,'goma lapiz-tinta',0.35,100);
insert into facturas (numero,numeroitem,descripcion,precioporunidad,cantidad)
values(102,1,'lapices coloresx6',4.40,50);
insert into facturas (numero,numeroitem,descripcion,precioporunidad,cantidad)
values(102,2,'lapices coloresx12',8,60);
insert into facturas (numero,numeroitem,descripcion,precioporunidad,cantidad)
values(255,1,'lapices coloresx24',12.35,100);
insert into facturas (numero,numeroitem,descripcion,precioporunidad,cantidad)
values(567,1,'compas plastico',12,50);
insert into facturas (numero,numeroitem,descripcion,precioporunidad,cantidad)
values(567,2,'compas metal',18.90,80);
4- Se quiere guardar la siguiente informacin en una tabla denominada "montofactur
as":
-numero: nmero de factura,
-total: total en dinero de todos los items de cada factura (precioporunidad x c
antidad).
5- Elimine la tabla "montofacturas" si existe.
6- Realice una consulta de la tabla "facturas", agrupando por "numero", en la cu
al aparezca el
nmero de factura y el monto total de todos sus items:
select numero,
sum(precioporunidad*cantidad) as total
from facturas
group by numero;
7- Cree la tabla "montofacturas" a partir de la consulta anterior:
create table montofacturas
select numero,
sum(precioporunidad*cantidad) as total
from facturas
group by numero;
8- Muestre todos los registros de la tabla "montofacturas".
9- Visualice la estructura de la nueva tabla creada.
Segundo problema:
A) Una empresa registra los datos de sus empleados en una tabla llamada "emplead
os".
1- Elimine la tabla "empleados" si existe.
2- Cree la tabla:
create table empleados(
documento char(8) not null,
nombre varchar(30) not null,
sexo char(1),
domicilio varchar(30),
fechaingreso date,
primary key(documento)
);
3- Ingrese algunos registros:
insert into empleados (documento,nombre,sexo,domicilio,fechaingreso)
values ('22333111','Juan Perez','m','Colon 123','1990-02-01');
insert into empleados (documento,nombre,sexo,domicilio,fechaingreso)
values ('25444444','Susana Morales','f','Avellaneda 345','1995-04-01');
insert into empleados (documento,nombre,sexo,domicilio,fechaingreso)
values ('20111222','Hector Pereyra','m','Caseros 987','1995-04-01');
insert into empleados (documento,nombre,sexo,domicilio,fechaingreso)
values ('30000222','Luis Luque','m','Urquiza 456','1980-09-01');
insert into empleados (documento,nombre,sexo,domicilio,fechaingreso)
values ('20555444','Maria Laura Torres','f','San Martin 1122','2000-05-15');
insert into empleados (documento,nombre,sexo,domicilio,fechaingreso)
values ('30000234','Alberto Soto','m','Peru 232','2003-08-15');
insert into empleados (documento,nombre,sexo,domicilio,fechaingreso)
values ('20125478','Ana Gomez','f','Sarmiento 975','2004-06-14');
insert into empleados (documento,nombre,sexo,domicilio,fechaingreso)
values ('24154269','Ofelia Garcia','f','Triunvirato 628','2004-09-23');
insert into empleados (documento,nombre,sexo,domicilio,fechaingreso)
values ('30154269','Oscar Mendez','m','Colon 1245','2004-06-23');
4- La empresa necesita almacenar en una tabla llamada "ingresos" la cantidad de
empleados que
ingresaron a la empresa por ao. Muestre la informacin desde la tabla "empleados":
select year(fechaingreso),count(*)
from empleados
group by year(fechaingreso);
5- Elimine la tabla "ingresos" si existe.
6- Cree la tabla "ingresos" consultando la tabla "empleados":
create table ingresos
select year(fechaingreso) as ao,
count(*) as cantidad
from empleados
group by year(fechaingreso);
7- Seleccione todos los registros y campos de la tabla "ingresos".
8- Vea la estructura de la tabla "ingresos".
Tercer Problema:
B) Un club dicta clases de distintos deportes a sus socios. Guarda la informacin
de las
inscripciones en una tabla denominada "inscriptos".
1- Elimine la tabla, si existe.
2- Cree la tabla:
create table inscriptos(
documento char(8) not null,
deporte varchar(20) not null,
ao year not null,
cuota char(1), /*'s' o 'n', si esta paga o no*/
primary key(documento,deporte,ao)
);
3- Ingrese los siguientes registros:
insert into inscriptos values('22333444','tenis','2005','s');
insert into inscriptos values('22333444','tenis','2006','s');
insert into inscriptos values('22333444','natacion','2005','s');
insert into inscriptos values('24333444','tenis','2005','s');
insert into inscriptos values('24333444','natacion','2006','s');
insert into inscriptos values('25333444','tenis','2005','s');
insert into inscriptos values('25333444','tenis','2006','s');
insert into inscriptos values('25333444','basquet','2006','s');
4- El club desea saber cuntos socios se han inscripto en cada deporte cada ao:
select deporte,ao,count(*)
from inscriptos
group by deporte,ao;
5- El club quiere almacenar esa informacin en una tabla. Elimine la
tabla "inscriptospordeporteporao", si existe.
6- Cree la tabla utilizando la consulta del punto 5:
create table inscriptospordeporteporao
select deporte,ao,count(*)
from inscriptos
group by deporte,ao;
7- Muestre todos los registros de la nueva tabla.
8- El club desea saber cuntas veces se ha inscripto una persona en algn deporte:
select documento,count(*)
from inscriptos
group by documento;
9- Elimine la tabla "cantidadinscripcionesporsocio" si existe.
10- Guarde la informacin anterior en una tabla llamada "cantidadinscripcionespors
ocio", crendola
a partir de la consulta del punto 8:
create table cantidadinscripcionesporsocio
select documento,count(*)
from inscriptos
group by documento;
Cuarto Problema:
C) Una academia de enseanza dicta distintos cursos de informtica. Los cursos se di
ctan por la
maana (de 8 a 12 hs.) o por la tarde (de 16 a 20 hs.), distintos das a la semana.
La academia
guarda los datos de los cursos en una tabla llamada "cursos" en la cual almacena
el cdigo del
curso, el tema, los das de la semana que se dicta, el horario, por la maana (AM) o
por la tarde
(PM), la cantidad de clases que incluye cada curso (clases), la fecha de inicio
y el costo del
curso.
1- Elimine la tabla si existe.
2- Cree la tabla:
create table cursos(
codigo tinyint unsigned auto_increment,
tema varchar(20) not null,
dias set ('lunes','martes','miercoles','jueves','viernes','sabado') not null,
horario enum ('AM','PM') not null,
clases tinyint unsigned,
fechainicio date,
costo decimal(5,2) unsigned,
primary key(codigo)
);

3- Ingrese los siguientes registros:
insert into cursos (tema, dias,horario,clases,fechainicio,costo)
values('PHP bsico','lunes,martes,miercoles','AM',18,'2006-08-07',200);
insert into cursos (tema, dias,horario,clases,fechainicio,costo)
values('PHP bsico','lunes,martes,miercoles','PM',18,'2006-08-14',200);
insert into cursos (tema, dias,horario,clases,fechainicio,costo)
values('PHP bsico','sabado','AM',18,'2006-08-05',280);
insert into cursos (tema, dias,horario,clases,fechainicio,costo)
values('PHP avanzado','martes,jueves','AM',20,'2006-08-01',350);
insert into cursos (tema, dias,horario,clases,fechainicio,costo)
values('JavaScript','lunes,martes,miercoles','PM',15,'2006-09-11',150);
insert into cursos (tema, dias,horario,clases,fechainicio,costo)
values('Paginas web','martes,jueves','PM',10,'2006-08-08',250);
insert into cursos (tema, dias,horario,clases,fechainicio,costo)
values('Paginas web','sabado','AM',10,'2006-08-12',280);
insert into cursos (tema, dias,horario,clases,fechainicio,costo)
values('Paginas web','lunes,viernes','AM',10,'2006-08-21',200);
insert into cursos (tema, dias,horario,clases,fechainicio,costo)
values('Paginas web','lunes,martes,miercoles,jueves,viernes','AM',10,'2006-09-
18',180);
insert into cursos (tema, dias,horario,clases,fechainicio,costo)
values('Paginas web','lunes,viernes','PM',10,'2006-09-25',280);
insert into cursos (tema, dias,horario,clases,fechainicio,costo)
values('JavaScript','lunes,martes,viernes,sabado','PM',12,'2006-09-18',150);
4- Muestre la cantidad de cursos por horario:
select horario,count(*)
from cursos
group by horario;
5- Elimine la tabla "cantidadcursosporhorario" si existe.
6- Guarde la informacin obtenida en el punto 4 en una tabla llamada "cantidadcurs
osporhorario"
creando la tabla a partir de aquella consulta:
create table cantidadcursosporhorario
select horario,count(*) as cantidad
from cursos
group by horario;
7- Vea todos los registros de la tabla creada anteriormente.
8- Visualice la estructura de la tabla "cantidadcursosporhorario".
9- Se quiere saber el promedio de clases por tema:
select tema,avg(clases)
from cursos
group by tema;
10- Elimine la tabla "clasesportema" si existe.
11- Cree la tabla "clasesportema" a partir de la consulta del punto 9:
create table clasesportema
select tema,avg(clases) as promedioclases
from cursos
group by tema;
12- Vea la estructura de la tabla creada anteriormente y realice una consulta mo
strando todos los
registros.
13- Muestre los distintos temas de las clases:
select distinct tema
from cursos;
14- Elimine la tabla "temas" si existe.
15- Cree la tabla "temas" a partir de la consulta del punto 12:
create table temas
select distinct tema
from cursos;
16- Vea todos los registros de la tabla creada anteriormente.
Quinto Problema:
D) Un profesor guarda en una tabla llamada "notas" las notas de los alumnos de u
n curso.
1- Elimine la tabla "notas" si existe.
2- Cree la tabla con la siguiente estructura:
create table notas(
documento char(8) not null,
nombre varchar(30),
nota decimal(4,2) unsigned
);
Algunos alumnos tienen ms notas que otros porque presentaron trabajos especiales.
3- Ingrese los siguientes registros:
insert into notas values('30333444','Juan Perez',8);
insert into notas values('30433444','Ana Maria Garcia',7.5);
insert into notas values('30533444','Marcelo Morales',3.5);
insert into notas values('30633444','Fabiola Juarez',4.5);
insert into notas values('30333444','Juan Perez',7.8);
insert into notas values('30433444','Ana Maria Garcia',6);
insert into notas values('30533444','Marcelo Morales',4.2);
insert into notas values('30633444','Fabiola Juarez',7);
insert into notas values('30333444','Juan Perez',9);
insert into notas values('30433444','Ana Maria Garcia',5.8);
insert into notas values('30633444','Fabiola Juarez',2);
insert into notas values('30333444','Juan Perez',10);
insert into notas values('30633444','Fabiola Juarez',6.7);
4- El profesor necesita generar una tabla llamada "promedios" que contenga el do
cumento del alumno y
el promedio de sus notas. Cree la tabla con los campos "documento" y "promedio"
realizando la
consulta necesaria a la tabla "notas":
create table promedios
select documento,nombre,avg(nota) as promedio
from notas
group by documento;
5- Vea los registros de "promedios".
6- Vea la estructura de la tabla "promedios".
7- Agrupe por documento y seleccione el documento y nombre de los alumnos aproba
dos (promedio mayor
o igual a 4):
select documento,nombre
from notas
group by documento
having avg(nota)>=4;
8- Elimine la tabla "aprobados" si existe.
9- Cree una tabla llamada "aprobados" donde guarde el resultado de la consulta a
nterior, es decir,
documento y nombre de los alumnos que pasan de curso por estar aprobados:
create table aprobados
select documento,nombre
from notas
group by documento
having avg(nota)>=4;
Sexto Problema:
E) Un banco tiene registrados las cuentas corrientes de sus clientes en una tabl
a llamada "cuentas".
1- Elimine la tabla, si existe.
2- Cree la tabla:
create table cuentas(
numero int(8) zerofill auto_increment,
documento char(8) not null,
nombre varchar(30),
saldo decimal(9,2),
primary key(numero)
);
3- Ingrese los siguientes registros:
insert into cuentas values(1234,'22333444','Juan Perez',2000.60);
insert into cuentas values(2566,'23333444','Maria Pereyra',5050);
insert into cuentas values(5987,'24333444','Marcos Torres',200);
insert into cuentas values(14434,'25333444','Ana Juarez',8000.60);
insert into cuentas values(28566,'23333444','Maria Pereyra',8050);
insert into cuentas values(35987,'24333444','Marcos Torres',2000);
4- Agrupe por documento y muestre el documento del cliente, en una columna llama
da "cantidad"
calcule la cantidad de cuentas de cada cliente y en otra columna llamada "total"
calcule la suma de
todas las cuentas de cada cliente:
select documento
count(*) as cantidad,
sum(saldo) as total
from cuentas
group by documento;
5- Elimine la tabla "cuentasporcliente", si existe.
6- Cree la tabla "cuentasporcliente" en la cual guarde el documento, la cantidad
de cuentas que
tiene en el banco y la suma de las mismas:
create table cuentasporcliente
select documento
count(*) as cantidad,
sum(saldo) as total
from cuentas
group by documento;
7- Vea los registros de "cuentasporcliente".
8-Vea la estructura de la tabla "cuentasporcliente".
Sptimo Problema:
F) Una pequea biblioteca de barrio registra los prstamos de sus libros en una tabl
a
llamada "prestamos".
1- Elimine la tabla, si existe.
2- Cree la tabla:
create table prestamos(
titulo varchar(40) not null,
documento char(8) not null,
fechaprestamo date not null,
fechadevolucion date,
primary key(titulo,fechaprestamo)
);
3- Ingrese algunos registros:
insert into prestamos
values('Manual de 1 grado','22333444','2006-07-10','2006-07-12');
insert into prestamos
values('Manual de 1 grado','22333444','2006-07-20','2006-07-21');
insert into prestamos (titulo,documento,fechaprestamo)
values('Manual de 1 grado','23333444','2006-07-25');
insert into prestamos (titulo,documento,fechaprestamo)
values('Alicia en el pais de las maravillas','23333444','2006-07-28');
insert into prestamos (titulo,documento,fechaprestamo)
values('El aleph','25333444','2006-08-10');
insert into prestamos
values('Manual de 2 grado','23333444','2006-07-28','2006-07-29');
4- Muestre los ttulos de los libros que no se han devuelto y la fecha de prstamo:
select titulo,fechaprestamo
from prestamos
where fechadevolucion is null;
5- Elimine la tabla "prestados" si existe.
6- Cree la tabla "prestados" e ingrese al momento de crearla el resultado de la
consulta del punto
4:
create table prestados
select titulo,fechaprestamo
from prestamos
where fechadevolucion is null;
7- Muestre todos los registros de la tabla "prestados".
8- Muestre el documento, la primera fecha de prstamo y cantidad de libros no devu
eltos de todos
los morosos:
select documento, min(fechaprestamo),count(*)
from prestamos
where fechadevolucion is null
group by documento;
9- Elimine la tabla "morosos" si existe.
10- Cree una tabla llamada "morosos" con los campos "documento", "desde" (fecha
de prstamo desde
la cual es moroso) y "cantidad" (cantidad de libros que debe) y guarde el result
ado de la consulta
del punto 8:
create table morosos
select documento,
min(fechaprestamo) as desde,
count(*) as cantidad
from prestamos
where fechadevolucion is null
group by documento;
Octavo Problema:
G) Un pequeo restaurante tiene almacenados los nombres, rubros y precios de sus c
omidas en una
tabla llamada "comidas".
1- Elimine la tabla si existe.
2- Cree la tabla con esta estructura:
create table comidas(
codigo tinyint unsigned auto_increment,
nombre varchar(30),
rubro enum ('entrada','principal','postre'),
precio decimal (5,2) unsigned,
primary key(codigo)
);
3- Ingrese algunos registros:
insert into comidas (nombre,rubro,precio)
values('fiambres',1,2.5);
insert into comidas (nombre,rubro,precio)
values('arroz',1,1.6);
insert into comidas (nombre,rubro,precio)
values('sopa',1,2.4);
insert into comidas (nombre,rubro,precio)
values('milanesa y fritas',2,3.4);
insert into comidas (nombre,rubro,precio)
values('cuarto de pollo',2,2.5);
insert into comidas (nombre,rubro,precio)
values('hamburguesa',2,2.8);
insert into comidas (nombre,rubro,precio)
values('flan',3,1);
insert into comidas (nombre,rubro,precio)
values('porcion de torta',3,2.1);
insert into comidas (nombre,rubro,precio)
values('gelatina',3,0.9);
4- Muestre todos los registros:
5- Realice un "cross join" combinando entrada, plato principal y postre:
select c1.nombre,c2.nombre,c3.nombre,
c1.precio+c2.precio+c3.precio as total
from comidas as c1
cross join comidas as c2
cross join comidas as c3
where c1.rubro=1 and
c2.rubro=2 and
c3.rubro=3;
6- Elimine la tabla "menues" si existe.
7- Cree la tabla "menues" para guardar el resultado de la consulta del punto 5:
create table menues
select c1.nombre as entrada,
c2.nombre as principal,
c3.nombre as postre,
c1.precio+c2.precio+c3.precio as total
from comidas as c1
cross join comidas as c2
cross join comidas as c3
where c1.rubro=1 and
c2.rubro=2 and
c3.rubro=3;
8- Visualice la estructura de la tabla "menues".
9- Vea todos los registros de la nueva tabla creada.
<------------------------------------------------------------------>
74 - Crear tabla a partir de otras (create - insert - join)
Tenemos las tablas "libros" y "editoriales" y queremos crear una tabla llamada "
cantidadporeditorial" que contenga la cantidad de libros de cada editorial.
La tabla "libros" tiene la siguiente estructura:
-codigo: int unsigned auto_increment,
-titulo: varchar(40) not null,
-autor: varchar(30),
-codigoeditorial: tinyint unsigned,
-precio: decimal(5,2) unsigned,
-clave primaria: codigo.
La tabla "editoriales" tiene esta estructura:
-codigo: tinyint unsigned auto_increment,
-nombre: varchar(20),
clave primaria: codigo.
Las tablas "libros" y "editoriales" contienen varios registros.
La tabla "cantidadporeditorial", que no existe, debe tener la siguiente estructu
ra:
-nombre: nombre de la editorial,
-cantidad: cantidad de libros.
Podemos guardar en la tabla "cantidadporeditorial" la cantidad de libros de cada
editorial en 3 pasos:
1 paso: crear la tabla "cantidadporeditorial":
create table cantidadporeditorial(
nombre varchar(20),
cantidad smallint
);
2 paso: realizar la consulta en la tabla "libros" y "editoriales", con un "join"
para obtener la cantidad de libros de cada editorial agrupando por el nombre de
la editorial y calculando la cantidad con "count()":
select e.nombre,count(*)
from libros as l
join editoriales as e
on l.codigoeditorial=e.codigo
group by e.nombre;
obteniendo una salida como la siguiente:
nombre cantidad
________________
Emece 3
Paidos 4
Planeta 2
3 paso: insertar los registros necesarios en la tabla "editoriales":
insert into editoriales values('Emece',3);
insert into editoriales values('Paidos',4);
insert into editoriales values('Planeta',2);
Pero existe otra manera simplificando los pasos. Podemos crear la tabla "cantida
dporeditorial" con los campos necesarios consultando la tabla "libros" y "editor
iales" y en el mismo momento insertar la informacin:
create table cantidadporeditorial
select e.nombre,count(*) as cantidad
from libros as l
join editoriales as e
on l.codigoeditorial=e.codigo
group by e.nombre;
La tabla "cantidadporeditorial" se ha creado con el campo llamado "nombre" selec
cionado del campo "nombre" de "editoriales" y con el campo "cantidad" con el val
or calculado con count() de la tabla "libros".
Entonces, se realiza una consulta de la tabla "libros" y "editoriales" (con un "
join") anteponiendo "create table ..." se ingresa el resultado de dicha consulta
en la tabla "cantidadporeditorial" al momento de crearla.
Si seleccionamos todos los registros de la tabla "cantidadporeditorial" aparece
lo siguiente:
nombre cantidad
_______________________
Emece 3
Paidos 4
Planeta 2
Si visualizamos la estructura de "cantidadporeditorial", vemos que el campo "nom
bre" se cre con el mismo tipo y longitud del campo "nombre" de "editoriales" y el
campo "cantidad" se cre como "bigint".
Problema :
Un club dicta clases de distintos deportes a sus socios. Guarda la informacin de
sus socios en
una tabla llamada "socios", los datos de los deportes en "deportes" y las inscip
ciones
en "inscriptos".
1- Elimine las 3 tablas, si existen.
2- Cree las tablas:
create table socios(
documento char(8) not null,
nombre varchar(30) not null,
primary key(documento)
);
create table deportes(
codigo tinyint unsigned auto_increment,
nombre varchar(30),
primary key(codigo)
);
create table inscriptos(
documento char(8) not null,
codigodeporte tinyint unsigned,
ao year not null,
cuota char(1), /*'s' o 'n', si esta paga o no*/
primary key(documento,codigodeporte,ao)
);
3- Ingrese los siguientes registros:
insert into socios values('22333444','Juan Perez');
insert into socios values('23333444','Ana Garcia');
insert into socios values('24333444','Hector Fuentes');
insert into socios values('25333444','Marta Molina');
insert into deportes (nombre) values('tenis');
insert into deportes (nombre) values('natacion');
insert into deportes (nombre) values('basquet');
insert into deportes (nombre) values('voley');
insert into inscriptos values('22333444',1,'2005','s');
insert into inscriptos values('22333444',1,'2006','s');
insert into inscriptos values('22333444',2,'2005','s');
insert into inscriptos values('24333444',1,'2005','s');
insert into inscriptos values('24333444',2,'2006','s');
insert into inscriptos values('25333444',1,'2005','s');
insert into inscriptos values('25333444',1,'2006','s');
insert into inscriptos values('25333444',3,'2006','s');
4- El club desea saber cuntos socios se han inscripto en cada deporte cada ao, con
siderando slo
los deportes que tienen inscripciones:
select d.nombre,i.ao,count(*)
from deportes as d
join inscriptos as i
on d.codigo=i.codigodeporte
join socios as s
on i.documento=s.documento
group by d.nombre,i.ao;
5- El club quiere almacenar esa informacin en una tabla. Elimine la
tabla "inscriptospordeporteporao" si existe.
6- Cree la tabla utilizando la sentencia del punto 4:
create table inscriptospordeporteporao
select d.nombre,i.ao,count(*)
from deportes as d
join inscriptos as i
on d.codigo=i.codigodeporte
join socios as s
on i.documento=s.documento
group by d.nombre,i.ao;
7- Muestre todos los registros de la nueva tabla.
8- El club desea saber cuntas veces se ha inscripto un socio en algn deporte:
select s.nombre,count(i.documento)
from socios as s
left join inscriptos as i
on s.documento=i.documento
left join deportes as d
on i.codigodeporte=d.codigo
group by s.nombre;
9- Elimine la tabla "sociosdeporte" si existe.
10- Guarde la informacin del punto 8 en una tabla, crendola a partir de esa consul
ta:
create table sociosdeporte
select s.nombre,count(i.documento) as inscripciones
from socios as s
left join inscriptos as i
on s.documento=i.documento
left join deportes as d
on i.codigodeporte=d.codigo
group by s.nombre;
Segundo problema:
A) Una academia de enseanza dicta distintos cursos de informtica. Los cursos se di
ctan por la
maana (de 8 a 12 hs.) o por la tarde (de 16 a 20 hs.), distintos das a la semana.
La academia
guarda los datos de los cursos en una tabla llamada "cursos" en la cual almacena
el cdigo del
curso, el tema, los das de la semana que se dicta, el horario, por la maana (AM) o
por la tarde
(PM), la cantidad de clases que incluye cada curso (clases), la fecha de inicio
y el costo del
curso. Otra tabla llamada "inscriptos" almacena las inscripciones a los distinto
s cursos.
1- Elimine las tablas si existen.
2- Cree las tablas:
create table cursos(
codigo tinyint unsigned auto_increment,
tema varchar(20) not null,
dias set ('lunes','martes','miercoles','jueves','viernes','sabado') not null,
horario enum ('AM','PM') not null,
clases tinyint unsigned,
fechainicio date,
costo decimal(5,2) unsigned,
primary key(codigo)
);

create table inscripciones(
documento char(8) not null,
codigocurso tinyint unsigned not null,
pago char(1), /*'s' si pag 'n' si no pag*/
primary key(documento,codigocurso)
);
3- Ingrese los siguientes registros:
insert into cursos (tema, dias,horario,clases,fechainicio,costo)
values('PHP bsico','lunes,martes,miercoles','AM',18,'2006-08-07',200);
insert into cursos (tema, dias,horario,clases,fechainicio,costo)
values('PHP bsico','lunes,martes,miercoles','PM',18,'2006-08-14',200);
insert into cursos (tema, dias,horario,clases,fechainicio,costo)
values('PHP bsico','sabado','AM',18,'2006-08-05',280);
insert into cursos (tema, dias,horario,clases,fechainicio,costo)
values('PHP avanzado','martes,jueves','AM',20,'2006-08-01',350);
insert into cursos (tema, dias,horario,clases,fechainicio,costo)
values('JavaScript','lunes,martes,miercoles','PM',15,'2006-09-11',150);
insert into cursos (tema, dias,horario,clases,fechainicio,costo)
values('Paginas web','martes,jueves','PM',10,'2006-08-08',250);
insert into cursos (tema, dias,horario,clases,fechainicio,costo)
values('Paginas web','sabado','AM',10,'2006-08-12',280);
insert into cursos (tema, dias,horario,clases,fechainicio,costo)
values('Paginas web','lunes,viernes','AM',10,'2006-08-21',200);
insert into cursos (tema, dias,horario,clases,fechainicio,costo)
values('Paginas web','lunes,martes,miercoles,jueves,viernes','AM',10,'2006-09-
18',180);
insert into cursos (tema, dias,horario,clases,fechainicio,costo)
values('Paginas web','lunes,viernes','PM',10,'2006-09-25',280);
insert into cursos (tema, dias,horario,clases,fechainicio,costo)
values('JavaScript','lunes,martes,viernes,sabado','PM',12,'2006-09-18',150);
insert into inscripciones values ('22333333',1,'s');
insert into inscripciones values ('22333333',5,'s');
insert into inscripciones values ('22333333',6,'n');
insert into inscripciones values ('23333444',4,'s');
insert into inscripciones values ('23333444',5,'s');
insert into inscripciones values ('23333444',7,'s');
insert into inscripciones values ('24333555',11,'s');
insert into inscripciones values ('25333666',3,'n');
insert into inscripciones values ('25333666',7,'n');
insert into inscripciones values ('26333777',1,'s');
insert into inscripciones values ('26333777',11,'s');
insert into inscripciones values ('26333777',10,'s');
4- Muestre la cantidad de inscriptos por tema:
select c.tema,count(i.documento)
from cursos as c
left join inscripciones as i
on c.codigo=i.codigocurso
group by c.tema;
5- Elimine la tabla "temas" si existe.
6- Guarde la informacin obtenida en el punto 5 en una tabla llamada "temas" crean
do la tabla a
partir de aquella consulta:
create table temas
select c.tema,count(i.documento)
from cursos as c
left join inscripciones as i
on c.codigo=i.codigocurso
group by c.tema;
7- Vea todos los registros de la tabla creada anteriormente.
8- Visualice la estructura de la tabla "temas".
9- Realice un "join" entre las tablas "cursos" e "inscripciones" mostrando el te
ma, la cantidad de
inscriptos y el monto recaudado (por tema del curso):
select c.tema,c.costo,count(i.codigocurso)as cantidad,
count(i.codigocurso)*c.costo as total
from cursos as c
join inscripciones as i
on c.codigo=i.codigocurso
where i.pago='s'
group by c.tema;
10- Elimine la tabla "recaudacion" si existe.
11- Cree la tabla "recaudacion" con el resultado de la consulta del punto 9:
create table recaudacion
select c.tema,c.costo,count(i.codigocurso)as cantidad,
count(i.codigocurso)*c.costo as total
from cursos as c
join inscripciones as i
on c.codigo=i.codigocurso
where i.pago='s'
group by c.tema;
12- Vea todos los registros de la tabla "recaudacion".
Tercer Problema:
B) Una pequea biblioteca de barrio registra los prstamos de sus libros en una tabl
a
llamada "prestamos" y los datos de sus libros en una tabla llamada "libros".
1- Elimine las tablas, si existen.
2- Cree las tablas:
create table libros(
codigo int unsigned auto_increment,
titulo varchar(40),
autor varchar (30),
editorial varchar (15),
primary key (codigo)
);
create table prestamos(
codigolibro int unsigned not null,
documento char(8) not null,
fechaprestamo date not null,
fechadevolucion date,
primary key(codigolibro,fechaprestamo)
);
3- Ingrese algunos registros para ambas tablas:
insert into libros values (15,'Manual de 1 grado','Moreno Luis','Emece');
insert into libros values (28,'Manual de 2 grado','Moreno Luis','Emece');
insert into libros values (30,'Alicia en el pais de las maravillas','Lewis Carr
oll','Planeta');
insert into libros values (35,'El aleph','Borges','Emece');
insert into libros values (45,'Aprenda PHP','Mario Molina','Planeta');
insert into prestamos
values(15,'22333444','2006-07-10','2006-07-12');
insert into prestamos
values(15,'22333444','2006-07-20','2006-07-21');
insert into prestamos (codigolibro,documento,fechaprestamo)
values(15,'23333444','2006-07-25');
insert into prestamos (codigolibro,documento,fechaprestamo)
values(30,'23333444','2006-07-28');
insert into prestamos (codigolibro,documento,fechaprestamo)
values(28,'25333444','2006-08-10');
insert into prestamos
values(45,'28333444','2006-08-10','2006-08-12');
insert into prestamos (codigolibro,documento,fechaprestamo)
values(45,'25333444','2006-09-10');
4- Muestre los ttulos de los libros prestados y no devueltos y en otra columna, s
i hace ms de un
mes que fue prestado o menos:
select l.titulo,
if (adddate(p.fechaprestamo,30)<current_date(),'si','no') as 'Mas de 1 mes'
from libros as l
join prestamos as p
on l.codigo=p.codigolibro
where p.fechadevolucion is null;
5- Elimine la tabla "prestados" si existe.
6- Guarde la informacin del punto 4 en la tabla "prestados" al momento de crearla
:
create table prestados
select l.titulo,
if (adddate(p.fechaprestamo,30)<current_date(),'si','no') as 'Mas de 1 mes'
from libros as l
join prestamos as p
on l.codigo=p.codigolibro
where p.fechadevolucion is null;
<------------------------------------------------------------------>
75 - Insertar datos en una tabla buscando un valor en otra (insert - select)
Trabajamos con las tablas "libros" y "editoriales" de una librera.
La tabla "libros" tiene la siguiente estructura:
-codigo: int unsigned auto_increment,
-titulo: varchar(40) not null,
-autor: varchar(30),
-codigoeditorial: tinyint unsigned,
-precio: decimal(5,2) unsigned,
-clave primaria: codigo.
La tabla "editoriales" tiene la siguiente estructura:
-codigo: tinyint unsigned auto_increment,
-nombre: varchar(20),
-domicilio: varchar(30),
-clave primaria: codigo.
Ambas tablas contienen registros. La tabla "editoriales" contiene los siguientes
registros:
1,Planeta,San Martin 222,
2,Emece,San Martin 590,
3,Paidos,Colon 245.
Queremos ingresar en "libros", el siguiente libro: Harry Potter y la piedra filo
sofal, J.K. Rowling, Emece, 45.90.
pero no recordamos el cdigo de la editorial "Emece".
Podemos lograrlo en 2 pasos:
1 paso: consultar en la tabla "editoriales" el cdigo de la editorial "Emece":
select codigo
from editoriales
where nombre='Emece';
nos devuelve el valor "2".
2 paso: ingresar el registro en "libros":
insert into libros (titulo,autor,codigoeditorial,precio)
values('Harry Potter y la piedra filosofal','J.K.Rowling',2,45.90);
O podemos realizar la consulta del cdigo de la editorial al momento de la insercin
:
insert into libros (titulo,autor,codigoeditorial,precio)
select 'Harry Potter y la camara secreta','J.K.Rowling',codigo,45.90
from editoriales
where nombre='Emece';
Entonces, para realizar una insercin y al mismo tiempo consultar un valor en otra
tabla, colocamos "insert into" junto al nombre de la tabla ("libros") y los cam
pos a insertar y luego un "select" en el cual disponemos todos los valores, exce
pto el valor que desconocemos, en su lugar colocamos el nombre del campo a consu
ltar ("codigo"), luego se contina con la consulta indicando la tabla de la cual e
xtraemos el cdigo ("editoriales") y la condicin, en la cual damos el "nombre" de l
a editorial para que localice el cdigo correspondiente.
El registro se cargar con el valor de cdigo de la editorial "Emece".
Si la consulta no devuelve ningn valor, porque buscamos el cdigo de una editorial
que no existe en la tabla "editoriales", aparece un mensaje indicando que no se
ingres ningn registro. Por ejemplo:
insert into libros (titulo,autor,codigoeditorial,precio)
select 'Cervantes y el quijote','Borges',codigo,35
from editoriales
where nombre='Plaza & Janes';
Hay que tener cuidado al establecer la condicin en la consulta, el "insert" ingre
sar tantos registros como filas retorne la consulta. Si la consulta devuelve 2 fi
las, se insertarn 2 filas en el "insert". Por ello, el valor de la condicin (o con
diciones), por el cual se busca, debe retornar un slo registro.
Veamos un ejemplo. Queremos ingresar el siguiente registro:
Harry Potter y la camara secreta, J.K. Rowling,54.
pero no recordamos el cdigo de la editorial ni su nombre, slo sabemos que su domic
ilio es en calle "San Martin". Si con un "select" localizamos el cdigo de todas l
as editoriales que tengan sede en "San Martin", el resultado retorna 2 filas, po
rque hay 2 editoriales en esa direccin ("Planeta" y "Emece"). Tipeeemos la senten
cia:
insert into libros (titulo,autor,codigoeditorial,precio)
select 'Harry Potter y la camara secreta','J.K. Rowling',codigo,54
from editoriales
where domicilio like 'San Martin%';
Se ingresarn 2 registros con los mismos datos, excepto el cdigo de la editorial.
Recuerde entonces, el valor de la condicin (condiciones), por el cual se busca el
dato desconocido en la consulta debe retornar un slo registro.
Tambin se pueden consultar valores de varias tablas incluyendo en el "select" un
"join". Veremos ejemplos en "Ejercicios propuestos".
Problema :
Un club de dicta clases de distintos deportes a sus socios. Guarda la informacin
de sus socios en
una tabla llamada "socios" y las inscripciones en "inscriptos".
1- Elimine las tablas, si existen.
2- Cree las tablas:
create table socios(
numero int unsigned auto_increment,
documento char(8) not null,
nombre varchar(30) not null,
domicilio varchar(30),
primary key(numero)
);
create table inscriptos(
numerosocio int unsigned,
deporte varchar(20),
ao year not null,
cuota char(1), /*'s' o 'n', si esta paga o no*/
primary key(numerosocio,deporte,ao)
);
3- Ingrese los siguientes registros:
insert into socios values(23,'22333444','Juan Perez','Colon 123');
insert into socios values(56,'23333444','Ana Garcia','Sarmiento 984');
insert into socios values(102,'24333444','Hector Fuentes','Sucre 293');
insert into socios values(150,'25333444','Agustin Perez','Avellaneda 1234');
insert into socios values(230,'26333444','Maria Perez','Urquiza 283');
insert into socios values(231,'29333444','Agustin Perez','Urquiza 283');
insert into inscriptos values(23,'tenis','2005','s');
insert into inscriptos values(23,'tenis','2006','s');
insert into inscriptos values(23,'natacion','2005','s');
insert into inscriptos values(102,'tenis','2005','s');
insert into inscriptos values(102,'natacion','2006','s');

4- El socio con documento "23333444" quiere inscribirse en "basquet" este ao, per
o no recuerda su
nmero de socio. Inscriba al socio en la tabla "inscriptos" buscando en la tabla "
socios" el nmero
de socio a partir del nmero de documento:
insert into inscriptos (numerosocio,deporte,ao,cuota)
select numero,'tenis','2006','s'
from socios
where documento='23333444';
5- Intente inscribir una persona cuyo nmero de documento no exista en la tabla "s
ocios":
insert into inscriptos (numerosocio,deporte,ao,cuota)
select numero,'tenis','2006','s'
from socios
where documento='30333444';
No se realiza la insercin porque no encuentra el documento en la tabla "socios".
6- La madre de los socios "Perez" quiere inscribir a su hijo "Agustn" en "basquet
" este ao, pero
no recuerda su nmero de socio ni su documento. Si se busca el nmero de socio a par
tir del nombre
("Agustin Perez"), la consulta retornar 2 registros, porque hay 2 socios llamados
"Agustin Perez".
Obtendremos como resultado, la inscripcin a "basquet" este ao, de ambos socios. Si
localizamos el
nmero de socio a partir del domicilio ("Urquiza 283"), tambin obtendremos 2 inscri
pciones, porque
hay 2 socios con ese domicilio. Ingrese la inscripcin del socio, localizando su nm
ero de socio
con el nombre y domicilio:
insert into inscriptos (numerosocio,deporte,ao,cuota)
select numero,'basquet','2006','n'
from socios
where nombre='Agustin Perez' and
domicilio='Urquiza 283';
7- La madre de los socios "Perez" quiere inscribir a ambos hijos "natacion" este
ao, pero no
recuerda sus nmeros de socio ni sus documentos. Inscriba a ambos localizando sus
nmeros de socio
con el domicilio:
insert into inscriptos (numerosocio,deporte,ao,cuota)
select numero,'natacion','2006','n'
from socios
where domicilio='Urquiza 283';
8- Vea si las inscripciones anteriores se cargaron:
select s.nombre,i.deporte,i.ao
from socios as s
join inscriptos as i
on s.numero=i.numerosocio;
Segundo problema:
A) Una biblioteca registra los prstamos de sus libros en una tabla llamada "prest
amos", los datos
de sus libros en una tabla llamada "libros" y los datos de sus socios en "socios
".
1- Elimine las tablas, si existen.
2- Cree las tablas:
create table libros(
codigo int unsigned auto_increment,
titulo varchar(40),
autor varchar (30),
editorial varchar (15),
primary key (codigo)
);
create table socios(
numero int unsigned auto_increment,
documento char(8) not null,
nombre varchar(30),
domicilio varchar(30),
primary key (numero)
);
create table prestamos(
codigolibro int unsigned not null,
numerosocio int not null,
fechaprestamo date not null,
fechadevolucion date,
primary key(codigolibro,fechaprestamo)
);
3- Ingrese algunos registros para las 3 tablas:
insert into socios values(20,'20222000','Juan Perez','Colon 123');
insert into socios values(31,'25222111','Juan Perez','Sucre 34');
insert into socios values(52,'25333222','Ana Maria Lopez','Avellaneda 235');
insert into socios values(82,'28333222','Luisa Duarte','San Martin 877');
insert into socios values(90,'29333222','Carlos Fuentes','Rivadavia 864');
insert into libros values (15,'Manual de 1 grado','Moreno Luis','Emece');
insert into libros values (28,'Manual de 2 grado','Moreno Luis','Emece');
insert into libros values (30,'Alicia en el pais de las maravillas','Lewis Carr
oll','Planeta');
insert into libros values (35,'El aleph','Borges','Emece');
insert into libros values (36,'Aprenda PHP','Molina Marcos','Planeta');
insert into libros values (40,'Cervantes y el quijote','Borges','Paidos');
insert into libros values (46,'Aprenda Java','Molina Marcos','Planeta');
insert into prestamos values(15,20,'2006-07-10','2006-07-12');
insert into prestamos values(15,31,'2006-07-12','2006-07-15');
insert into prestamos values(15,20,'2006-07-18',null);
insert into prestamos values(28,20,'2006-07-15',null);
insert into prestamos values(30,20,'2006-07-20',null);
insert into prestamos values(35,31,'2006-07-20','2006-07-22');
insert into prestamos values(36,90,'2006-07-25','2006-07-26');
4- El socio con nmero de documento "25333222" solicita en prstamos el libro con cdi
go 40. El
socio no recuerda su nmero de socio pero si su documento. Ingrese el prstamo ubica
ndo el nmero
de socio a partir del documento en "socios":
insert into prestamos (codigolibro,numerosocio,fechaprestamo)
select 40,numero,'2006-09-15'
from socios
where documento='25333222';
5- El socio llamado "Juan Perez" solicita el libro cdigo 35; no recuerda su nmero
de socio ni su
nmero de documento. Intente ingresar el registro localizando el nmero de socio a p
artir del
nombre:
insert into prestamos (codigolibro,numerosocio,fechaprestamo)
select 35,numero,'2006-09-16'
from socios
where nombre='Juan Perez';
Aparece un mensaje de error indicando que la clave se duplica; porque la consult
a retorna 2
registros (hay 2 socios con igual nombre), MySQL intenta insertar 2 registros ig
uales en todos los
valores excepto en el nmero de documento, pero no se pueden ingresar 2 registros
con el mismo
cdigo de libro en la misma fecha (clave primaria). Resuelva el problema, ingrese
el prstamo
colocando las condiciones necesarias para que la consulta retorne solamente una
fila:
insert into prestamos (codigolibro,numerosocio,fechaprestamo)
select 35,numero,'2006-09-16'
from socios
where nombre='Juan Perez' and
domicilio='Sucre 34';
6- Seleccione el documento y nombre de todos los morosos (una vez cada socio):
select distinct s.documento,s.nombre
from socios as s
join prestamos as p
on s.numero=p.numerosocio
where fechadevolucion is null;
7- La biblioteca necesita una tabla en la cual almacene el documento y nombre de
los socios
morosos. Elimine la tabla "morosos" si existe:
drop table if exist morosos;
8- Cree la tabla "morosos" a partir de la consulta realizada en el punto 6:
create table morosos
select distinct s.documento,s.nombre
from socios as s
join prestamos as p
on s.numero=p.numerosocio
where fechadevolucion is null;
9- Muestre los nmeros de socio, documento y nombre de todos los socios que no son
deudores,
empleando un "left join" entre las tablas "socios" y "morosos":
select s.numero,s.documento,s.nombre
from socios as s
left join morosos as m
on s.documento=m.documento
where m.documento is null;
10- El socio con documento "20222000" solicita el prstamo de un libro. El socio n
o recuerda su
nmero pero si su documento. Se desea realizar el prstamo slo si dicho socio no se e
ncuentra
en "morosos". Realice una consulta a la tabla "socios" y "morosos" que retorne l
os nmeros de socio
de aquellos socios que no adeudan libros y luego busque en dicho resultado el va
lor del nmero de
socio a partir del documento, si encuentra coincidencia, ingresar el registro, en
caso contrario
(la persona es un socio es deudor o no es socio), la insercin no se realiza:
insert into prestamos (codigolibro,numerosocio,fechaprestamo)
select 15,s.documento,'2006-07-28'
from socios as s
left join morosos as m
on s.documento=m.documento
where m.documento is null
and s.documento='20222000';
No se realiz la carga del prstamo porque no encontr el documento en el resultado de
la consulta.
11- El socio con documento "29333222" solicita el prstamo de un libro. El socio n
o recuerda su
nmero pero si su documento. Se desea realizar el prstamo slo si dicho socio no se e
ncuentra
en "morosos". Realice una consulta a la tabla "socios" y "morosos" que retorne l
os nmeros de socio
de aquellos socios que no adeudan libros y luego busque en dicho resultado el va
lor del nmero de
socio a partir del documento:
insert into prestamos (codigolibro,numerosocio,fechaprestamo)
select 36,s.numero,'2006-07-28'
from socios as s
left join morosos as m
on s.documento=m.documento
where m.documento is null
and s.documento='29333222';
La insercin se realiz porque el documento del socio buscado se encontr en la consul
ta de "no
morosos".
12- Coloque fecha de devolucin al libro con cdigo "36" prestado el da "2006-07-28":
update prestamos
set fechadevolucion='2006-07-29'
where codigolibro=36 and
fechaprestamo='2006-07-28';
13- Muestre el cdigo y nombre de todos los libros que no han sido devueltos:
select l.codigo,l.titulo
from libros as l
left join prestamos as p
on p.codigolibro=l.codigo
where p.fechaprestamo is not null and
fechadevolucion is null;
14- la biblioteca desea crear una tabla llamada "librosausentes" en la que guard
e el cdigo y
ttulo de los libros no devueltos. Elimine la tabla "librosausentes" si existe:
drop table if exists librosausentes;
15- Cree la tabla a partir de la consulta del punto 13:
create table librosausentes
select l.codigo,l.titulo
from libros as l
left join prestamos as p
on p.codigolibro=l.codigo
where p.fechaprestamo is not null and
fechadevolucion is null;
16- Realice un "left join" entre las tablas "libros" y "librosausentes" mostrand
o los cdigos y
ttulos de los libros presentes:
select l.codigo,l.titulo
from libros as l
left join librosausentes as la
on la.codigo=l.codigo
where la.codigo is null;
17- El socio nmero 82 quiere llevar el libro cdigo "35", ingrese el registro en "p
restamos" slo
si al buscar el cdigo en el resultado de la consulta anterior encuentra coinciden
cia, es decir, si
el libro est presente:
insert into prestamos (codigolibro,numerosocio,fechaprestamo)
select l.codigo,82,'2006-09-17'
from libros as l
left join librosausentes as la
on la.codigo=l.codigo
where la.codigo is null and
l.codigo=35;
No se realiza la insercin del registro porque el libro est prestado.
18- El mismo socio intenta llevar el libro con cdigo "36". Realice la misma consu
lta:
select l.codigo,82,'2006-09-17'
from libros as l
left join librosausentes as la
on la.codigo=l.codigo
where la.codigo is null and
l.codigo=36;
El registro se carg porque el libro est presente.
Tercer Problema:
B) Un instituto de enseanza guarda en una tabla llamada "carreras" los datos de l
as carreras que
dicta, en "materias" las materias de cada carrera y en "inscriptos" las inscripc
iones.
1- Elimine las 3 tablas, si existen.
2- Cree las tablas con las siguientes estructuras:
create table carreras(
codigo tinyint unsigned auto_increment,
nombre varchar(30),
primary key(codigo)
);
create table materias(
codigo tinyint unsigned auto_increment,
codigocarrera tinyint unsigned,
nombre varchar(30),
profesor varchar(30),
primary key(codigo,codigocarrera)
);
create table inscriptos(
documento char(8) not null,
codigocarrera tinyint unsigned,
codigomateria tinyint unsigned,
ao year,
cuota char(1),/* si esta paga o no*/
primary key (documento,codigocarrera,codigomateria,ao)
);
3- Ingrese algunos registros:
insert into carreras values(1,'Analista de sistemas');
insert into carreras values(2,'Diseador web');
insert into materias values(1,1,'Programacion I','Alfredo Lopez');
insert into materias values(2,1,'Sistemas de datos I','Bernardo Garcia');
insert into materias values(3,1,'Ingles tecnico','Edit Torres');
insert into materias values(1,2,'Programacion basica','Alfredo Lopez');
insert into materias values(2,2,'Ingles I','Edit Torres');
insert into materias values(3,2,'Protocolos','Hector Juarez');
insert into inscriptos values('22333444',1,1,'2005','s');
insert into inscriptos values('22333444',1,2,'2005','s');
insert into inscriptos values('22333444',1,3,'2006','n');
insert into inscriptos values('23222222',1,1,'2005','s');
insert into inscriptos values('23222222',1,2,'2006','s');
insert into inscriptos values('24555666',1,1,'2005','s');
insert into inscriptos values('24555666',2,1,'2005','s');
insert into inscriptos values('25000999',1,1,'2005','s');
insert into inscriptos values('25000999',1,2,'2005','s');
insert into inscriptos values('25000999',2,1,'2006','n');
insert into inscriptos values('25000999',2,2,'2006','s');
4- Muestre todos los datos de la tabla "inscriptos" (sin cdigos) incluyendo los n
ombres de las
materias y carreras:
select i.documento,c.nombre,m.nombre,ao,cuota
from inscriptos as i
join carreras as c
on c.codigo=i.codigocarrera
join materias as m
on m.codigo=i.codigomateria and
m.codigocarrera=c.codigo;
5- Se quiere inscribir un alumno en la materia "Programacion basica" de la carre
ra "Diseador web"
pero la secretaria no recuerda los cdigos de las mismas. Inscriba al alumno consu
ltando los
valores de las tablas "carreras" y "materias":
insert into inscriptos (documento,codigocarrera,codigomateria,ao,cuota)
select '30222333',c.codigo,m.codigo,'2006','s'
from carreras as c
join materias as m
on c.codigo=m.codigocarrera
where c.nombre='Diseador web' and
m.nombre='Programacion basica';
<------------------------------------------------------------------>
76 - Insertar registros con valores de otra tabla (insert - select)
Tenemos las tabla "libros" y "editoriales" creadas. La tabla "libros" contiene r
egistros; "editoriales", no.
La tabla "libros" tiene la siguiente estructura:
-codigo: int unsigned auto_increment,
-titulo: varchar(30),
-autor: varchar(30),
-editorial: varchar(20),
-precio: decimal(5,2) unsigned,
-clave primaria: codigo.
La tabla "editoriales" tiene la siguiente estructura:
-nombre: varchar(20).
Queremos insertar registros en la tabla "editoriales", los nombres de las distin
tas editoriales de las cuales tenemos libros.
Podemos lograrlo en 2 pasos, con varias sentencias:
1 paso: consultar los nombres de las distintas editoriales de "libros":
select distinct editorial
from libros;
obteniendo una salida como la siguiente:
editorial
_________
Emece
Paidos
Planeta
2 paso: insertar los registros uno a uno en la tabla "editoriales":
insert into editoriales (nombre) values('Emece');
insert into editoriales (nombre) values('Paidos');
insert into editoriales (nombre) values('Planeta');
O podemos lograrlo en un solo paso, realizando el "insert" y el "select" en una
misma sentencia:
insert into editoriales (nombre)
select distinct editorial from libros;
Entonces, se puede insertar registros en una tabla con la salida devuelta por un
a consulta; para ello escribimos la consulta y le anteponemos "insert into", el
nombre de la tabla en la cual ingresaremos los registros y los campos que se car
garn.
Tambin podemos crear una tabla llamada "cantidadporeditorial":
create table cantidadporeditorial(
nombre varchar(20),
cantidad smallint unsigned
);
e ingresar registros a partir de una consulta a la tabla "libros":
insert into cantidadporeditorial (nombre,cantidad)
select editorial,count(*) as cantidad
from libros
group by editorial;
Si los campos presentados entre parntesis son menos (o ms) que las columnas devuel
tas por la consulta, aparece un mensaje de error y la sentencia no se ejecuta.
Problema :
Un comercio guarda la informacin de sus ventas en una tabla llamada "facturas".
1- Elimine la tabla si existe.
2- Cree la tabla con la siguiente estructura:
create table facturas(
numero int(10) zerofill auto_increment,
numeroitem smallint unsigned not null,
descripcion varchar(30),
precioporunidad decimal(5,2) unsigned,
cantidad tinyint unsigned,
primary key (numero,numeroitem)
);
3- Ingrese algunos registros:
insert into facturas (numero,numeroitem,descripcion,precioporunidad,cantidad)
values(100,1,'escuadra 20 cm.',2.50,20);
insert into facturas (numero,numeroitem,descripcion,precioporunidad,cantidad)
values(100,2,'escuadra 50 cm.',5,30);
insert into facturas (numero,numeroitem,descripcion,precioporunidad,cantidad)
values(100,3,'goma lapiz-tinta',0.35,100);
insert into facturas (numero,numeroitem,descripcion,precioporunidad,cantidad)
values(102,1,'lapices coloresx6',4.40,50);
insert into facturas (numero,numeroitem,descripcion,precioporunidad,cantidad)
values(102,2,'lapices coloresx12',8,60);
insert into facturas (numero,numeroitem,descripcion,precioporunidad,cantidad)
values(255,1,'lapices coloresx24',12.35,100);
insert into facturas (numero,numeroitem,descripcion,precioporunidad,cantidad)
values(567,1,'compas plastico',12,50);
insert into facturas (numero,numeroitem,descripcion,precioporunidad,cantidad)
values(567,2,'compas metal',18.90,80);
4- Elimine la tabla "montofacturas" si existe.
5- Se quiere guardar en una tabla denominada "montofacturas" el nmero de factura
y el monto total
en dinero de todos los items de cada factura (precioporunidad x cantidad). Cree
la tabla con la
siguiente estructura:
create table montofacturas(
numero int(10) zerofill,
total decimal(9,2) unsigned,
primary key(numero)
);
6- Realice una consulta de la tabla "facturas", agrupando por "numero", en la cu
al aparezca el
nmero de factura y el monto total de todos sus items:
select numero,
sum(precioporunidad*cantidad) as total
from facturas
group by numero;
7- Ingrese el resultado de la consulta anterior en la tabla "montofacturas":
insert into montofacturas (numero,total)
select numero,
sum(precioporunidad*cantidad) as total
from facturas
group by numero;
8- Muestre todos los registros de la tabla "montofacturas".
Segundo problema:
A) Un club se dicta clases de distintos deportes a sus socios. Guarda la informa
cin de las
inscripciones en una tabla denominada "inscriptos".
1- Elimine la tabla, si existe.
2- Cree la tabla:
create table inscriptos(
documento char(8) not null,
deporte varchar(20) not null,
ao year not null,
cuota char(1), /*'s' o 'n', si esta paga o no*/
primary key(documento,deporte,ao)
);
3- Ingrese los siguientes registros:
insert into inscriptos values('22333444','tenis','2005','s');
insert into inscriptos values('22333444','tenis','2006','s');
insert into inscriptos values('22333444','natacion','2005','s');
insert into inscriptos values('24333444','tenis','2005','s');
insert into inscriptos values('24333444','natacion','2006','s');
insert into inscriptos values('25333444','tenis','2005','s');
insert into inscriptos values('25333444','tenis','2006','s');
insert into inscriptos values('25333444','basquet','2006','s');
4- El club desea saber cuntas personas se han inscripto en cada deporte cada ao:
select deporte,ao,count(*)
from inscriptos
group by deporte,ao;
5- El club quiere almacenar esa informacin en una tabla. Elimine la
tabla "inscriptospordeporteporao", si existe.
6- Cree la tabla:
create table inscriptospordeporteporao(
deporte varchar(20),
ao year,
cantidad smallint unsigned
);
7- Intente ingresar los registros colocando un campo menos en la lista de campos
:
insert into inscriptospordeporteporao (deporte,cantidad)
select deporte,ao,count(*)
from inscriptos
group by deporte,ao;
La sentencia no se ejecuta.
8- Intente ingresar los registros colocando los 3 campos de la nueva tabla y qui
tndole una columna
a la seleccin:
insert into inscriptospordeporteporao (deporte,ao,cantidad)
select deporte,ao
from inscriptos
group by deporte,ao;
La sentencia no se ejecuta.
9- Ingrese los registros a partir de la consulta del punto 4, correctamente:
insert into inscriptospordeporteporao (deporte,ao,cantidad)
select deporte,ao,count(*)
from inscriptos
group by deporte,ao;
10- Muestre todos los registros de la nueva tabla.
11- El club desea saber cuntas veces se ha inscripto una persona en algn deporte:
select documento,count(*)
from inscriptos
group by documento;
12- Elimine la tabla "inscripcionesporpersona" si existe.
13- Cree la tabla con la siguiente estructura:
create table inscripcionesporpersona(
documento char(8),
cantidad tinyint unsigned,
primary key(documento)
);
14- Guarde la informacin del punto 11 en la tabla recientemente creada:
insert into inscripcionesporpersona (documento,cantidad)
select documento,count(*)
from inscriptos
group by documento;
15- Vea los registros de la nueva tabla.
Tercer Problema:
B) Un profesor guarda en una tabla llamada "notas" las notas de los alumnos de u
n curso.
1- Elimine la tabla "notas" si existe.
2- Cree la tabla con la siguiente estructura:
create table notas(
documento char(8) not null,
nombre varchar(30),
nota decimal(4,2) unsigned
);
Algunos alumnos tienen ms notas que otros porque presentaron trabajos especiales.
3- Ingrese los siguientes registros:
insert into notas values('30333444','Juan Perez',8);
insert into notas values('30433444','Ana Maria Garcia',7.5);
insert into notas values('30533444','Marcelo Morales',3.5);
insert into notas values('30633444','Fabiola Juarez',4.5);
insert into notas values('30333444','Juan Perez',7.8);
insert into notas values('30433444','Ana Maria Garcia',6);
insert into notas values('30533444','Marcelo Morales',4.2);
insert into notas values('30633444','Fabiola Juarez',7);
insert into notas values('30333444','Juan Perez',9);
insert into notas values('30433444','Ana Maria Garcia',5.8);
insert into notas values('30633444','Fabiola Juarez',2);
insert into notas values('30333444','Juan Perez',10);
insert into notas values('30633444','Fabiola Juarez',6.7);
4- El profesor necesita una tabla llamada "promedios" que contenga el documento
y nombre del alumno
y el promedio de sus notas. Elimine la tabla "notas" si existe.
5- Cree la tabla con los campos "documento" y "promedio":
create table promedios (
documento char(8) not null,
nombre varchar(30),
promedio decimal(4,2),
primary key(documento)
);
6- Realice la consulta necesaria a la tabla "notas":
select documento,nombre,avg(nota) as promedio
from notas
group by documento;
7- Ingrese el resultado de la consulta anterior en la tabla "promedios":
insert into promedios (documento,nombre,promedio)
select documento,nombre,avg(nota)
from notas
group by documento;
8- Vea los registros de "promedios".
9- Agrupe por documento y seleccione el documento y nombre de los alumnos aproba
dos (promedio mayor
o gual a 4):
select documento,nombre
from notas
group by documento
having avg(nota)>=4;
10- Elimine la tabla "aprobados" si existe.
11- Cree una tabla llamada "aprobados" con la siguiente estructura:
create table aprobados(
numero tinyint unsigned auto_increment,
documento char(8),
nombre varchar(30),
primary key (numero)
);
12- Ingrese los registros resultado de la consulta del punto 9 en la tabla cread
a anteriormente:
insert into aprobados (documento,nombre)
select documento,nombre
from notas
group by documento
having avg(nota)>=4;
Note que en la lista de campos a cargar no se incluye el campo "numero".
13- Vea los registros recientemente cargados. Note que en el campo "numero" se c
arg
automticamente.
14- Muestre el documento y nombre del alumno y en una columna informe si el alum
no est aprobado
(promedio de notas mayor o igual a 4) o desaprobado (promedio menor a 4), emplea
ndo un "if" en una
consulta a la tabla "notas" :
select documento,nombre,
if (avg(nota)>4,'aprobado','desaprobado') as condicion
from notas
group by documento;
15- Elimine la tabla "condicion" si existe.
16- Cree la tabla "condicion" con la siguiente estructura:
create table condicion(
documento char(8) not null,
nombre varchar(30),
condicion varchar(15)
);
17- Ingrese registros en la tabla creada anteriormente a partir de la consulta d
el punto 14:
insert into condicion (documento,nombre,condicion)
select documento,nombre,
if (avg(nota)>4,'aprobado','desaprobado')
from notas
group by documento;
18- Vea todos los registros de la tabla "condicion".
Cuarto Problema:
C) Un banco tiene registrados las cuentas corrientes de sus clientes en una tabl
a llamada "cuentas".
1- Elimine la tabla, si existe.
2- Cree la tabla:
create table cuentas(
numero int(8) zerofill auto_increment,
documento char(8) not null,
nombre varchar(30),
saldo decimal(9,2),
primary key(numero)
);
3- Ingrese los siguientes registros:
insert into cuentas values(1234,'22333444','Juan Perez',2000.60);
insert into cuentas values(2566,'23333444','Maria Pereyra',5050);
insert into cuentas values(5987,'24333444','Marcos Torres',200);
insert into cuentas values(14434,'25333444','Ana Juarez',8000.60);
insert into cuentas values(28566,'23333444','Maria Pereyra',8050);
insert into cuentas values(35987,'24333444','Marcos Torres',2000);
4- Agrupe por documento y muestre el documento del cliente, en una columna llama
da "cantidad"
calcule la cantidad de cuentas de cada cliente y en otra columna llamada "total"
calcule la suma de
todas las cuentas de cada cliente:
select documento
count(*) as cantidad,
sum(saldo) as total
from cuentas
group by documento;
5- Elimine la tabla "cuentasporcliente", si existe.
6- Cree la tabla "cuentasporcliente" con la siguiente estructura:
create table cuentasporcliente(
numero int unsigned auto_increment,
documento char(8),
cantidad tinyint unsigned,
total decimal(9,2) unsigned,
primary key(numero)
);
7- Inserte el resultado de la consulta del punto 4 en la tabla creada anteriorme
nte:
insert into cuentasporcliente (documento,cantidad,total)
select documento,count(*),sum(saldo)
from cuentas
group by documento;
8- Vea los registros de "cuentasporcliente".
Quinto Problema:
D) Una agencia matrimonial almacena la informacin de sus clientes en una tabla ll
amada "clientes".
1- Elimine la tabla si existe:
2- Cree la tabla:
create table clientes(
nombre varchar(30),
domicilio varchar(30),
sexo char(1),
edad tinyint unsigned
);
3- Ingrese los siguientes registros:
insert into clientes (nombre,sexo,edad) values('Juan Perez','m',45);
insert into clientes (nombre,sexo,edad) values('Ana Lopez','f',50);
insert into clientes (nombre,sexo,edad) values('Federico Herrero','m',30);
insert into clientes (nombre,sexo,edad) values('Mariano Juarez','m',35);
insert into clientes (nombre,sexo,edad) values('Maria Torres','f',36);
insert into clientes (nombre,sexo,edad) values('Ines Duarte','f',55);
insert into clientes (nombre,sexo,edad) values('Alejandra Figueroa','f',40);
4- La agencia necesita la combinacin de todas las personas de sexo femenino con l
as de sexo
masculino. Adems, las edades de las posibles parejas no deben tener una diferenci
a superior a 10
aos. Use "cross join":
select f.nombre,f.edad,
m.nombre,m.edad
from clientes as f
cross join clientes as m
where f.sexo='f' and m.sexo='m' and
m.edad - f.edad between -10 and 10;
5- La agencia quiere organizar encuentros entre dichas parejas. Elimine la tabla
"encuentros" si
existe.
6- Cree la tabla "encuentros" con la siguiente estructura:
create table encuentros(
codigo tinyint unsigned auto_increment,
dama varchar(30),
edaddama tinyint unsigned,
caballero varchar(30),
edadcaballero tinyint unsigned,
fecha date,
primary key (codigo)
);
7- Inserte las parejas resultado de la consulta del punto 4:
insert into encuentros (dama,edaddama,caballero,edadcaballero)
select f.nombre,f.edad,m.nombre,m.edad
from clientes as f
cross join clientes as m
where f.sexo='f' and m.sexo='m' and
m.edad - f.edad between -10 and 10;
8- Vea la informacin que se almacen en "encuentros":
select * from encuentros;
Note que el cdigo se carg automticamente y en las fechas de encuentro contienen tod
as el
valor "null" para luego ser llenadas.
Sexto Problema:
E) Varios clubes de barrio se organizaron para realizar campeonatos entre ellos.
La tabla
llamada "equipos" guarda la informacion de los distintos equipos que jugarn.
1- Elimine la tabla, si existe.
2- Cree la tabla:
create table equipos(
codigo tinyint unsigned auto_increment,
nombre varchar(30),
domicilio varchar(30),
barrio varchar(20),
primary key(codigo)
);
3- Ingrese los siguientes registros:
insert into equipos values(1,'Los tigres','Sarmiento 234','Gral. Paz');
insert into equipos values(2,'Los leones','Colon 123','Centro');
insert into equipos values(3,'Campeones','Guemes 346','Pueyrredon');
insert into equipos values(4,'Cebollitas','Colon 1234','Alberdi');
4- Realice un "cross join" combinando los distintos equipos y sedes de encuentro
:
select e1.nombre,e2.nombre,e1.barrio as 'sede'
from equipos as e1
cross join equipos as e2
where e1.nombre<>e2.nombre;
5- Se necesita almacenar en una tabla los datos de la consulta anterior y una fe
cha de encuentro.
Elimine la tabla "encuentros" si existe.
6- Cree la tabla "encuentros" con la siguiente estructura:
create table encuentros(
codigo tinyint unsigned auto_increment,
equipo1 varchar(30),
equipo2 varchar(30),
lugarencuentro varchar(30),
barrioencuentro varchar(20),
fecha date,
primary key(codigo)
);
7- Ingrese los datos de la consulta del punto 4 en la tabla recientemente creada
:
insert into encuentros(equipo1,equipo2,lugarencuentro,barrioencuentro)
select e1.nombre,e2.nombre,e1.domicilio,e1.barrio
from equipos as e1
cross join equipos as e2
where e1.nombre<>e2.nombre;
8- Vea todos los registros de la tabla creada anteriormente.
Note que el cdigo se carg automticamente y las fechas de encuentro contienen "null"
para luego
ser llenadas.
<------------------------------------------------------------------>
77 - Insertar registros con valores de otra tabla (insert - select - join)
Tenemos las tabla "libros" y "editoriales", que contienen registros, y la tabla
"cantidadporeditorial", que no contiene registros.
La tabla "libros" tiene la siguiente estructura:
-codigo: int unsigned auto_increment,
-titulo: varchar(30),
-autor: varchar(30),
-codigoeditorial: tinyint unsigned,
-precio: decimal(5,2) unsigned,
-clave primaria: codigo.
La tabla "editoriales":
-codigo: tinyint unsigned auto_increment,
-nombre: varchar(20),
-clave primaria: codigo.
La tabla "cantidadporeditorial":
-nombre: varchar(20),
-cantidad: smallint unsigned.
Queremos insertar registros en la tabla "cantidadporeditorial", los nombres de l
as distintas editoriales de las cuales tenemos libros y la cantidad de libros de
cada una de ellas.
Podemos lograrlo en 2 pasos:
1 paso: consultar con un "join" los nombres de las distintas editoriales de "libr
os" y la cantidad:
select e.nombre,count(l.codigoeditorial)
from editoriales as e
left join libros as l
on e.codigo=l.codigoeditorial
group by e.nombre;
obteniendo una salida como la siguiente:
editorial cantidad
______________________
Emece 3
Paidos 1
Planeta 1
Plaza & Janes 0
2 paso: insertar los registros uno a uno en la tabla "cantidadporeditorial":
insert into cantidadporeditorial values('Emece',3);
insert into cantidadporeditorial values('Paidos',1);
insert into cantidadporeditorial values('Planeta',1);
insert into cantidadporeditorial values('Plaza & Janes',0);
O podemos lograrlo en un solo paso, realizando el "insert" y el "select" en una
misma sentencia:
insert into cantidadporeditorial
select e.nombre,count(l.codigoeditorial)
from editoriales as e
left join libros as l
on e.codigo=l.codigoeditorial
group by e.nombre;
Entonces, se puede insertar registros en una tabla con la salida devuelta por un
a consulta que incluya un "join" o un "left join"; para ello escribimos la consu
lta y le anteponemos "insert into", el nombre de la tabla en la cual ingresaremo
s los registros y los campos que se cargarn (si se ingresan todos los campos no e
s necesario listarlos).
Recuerde que la cantidad de columnas devueltas en la consulta debe ser la misma
que la cantidad de campos a cargar en el "insert".
Problema :
Un club de dicta clases de distintos deportes a sus socios. Guarda la informacin
de sus socios en
una tabla llamada "socios", la de los deportes que dicta en "deportes" y las ins
cripciones
en "inscriptos".
1- Elimine las 3 tablas, si existen.
2- Cree las tablas:
create table socios(
documento char(8),
nombre varchar(30),
domicilio varchar(30),
primary key(documento)
);

create table deportes(
codigo tinyint unsigned auto_increment,
nombre varchar(15),
profesor varchar(30),
primary key (codigo)
);
create table inscriptos(
documento char(8) not null,
codigodeporte varchar(20) not null,
ao year not null,
cuota char(1), /*'s' o 'n', si esta paga o no*/
primary key(documento,codigodeporte,ao)
);
3- Ingrese los siguientes registros para las tablas "socios", "deportes" e "insc
riptos":
insert into socios values('22333444','Juan Perez','Colon 123');
insert into socios values('23333444','Ana Lopez','Caseros 984');
insert into socios values('24333444','Marcelo Morales','Sucre 356');
insert into socios values('25333444','Susana Juarez','Sarmiento 723');
insert into deportes (nombre,profesor) values('tenis','Tadeo Torres');
insert into deportes (nombre,profesor) values('natacion','Natalia Nores');
insert into deportes (nombre,profesor) values('basquet','Bautista Pereyra');
insert into deportes (nombre,profesor) values('paddle','Bautista Pereyra');
insert into inscriptos values('22333444',1,'2005','s');
insert into inscriptos values('22333444',1,'2006','n');
insert into inscriptos values('22333444',2,'2005','s');
insert into inscriptos values('23333444',1,'2005','s');
insert into inscriptos values('23333444',2,'2006','s');
insert into inscriptos values('23333444',1,'2006','s');
insert into inscriptos values('24333444',1,'2006','s');
insert into inscriptos values('24333444',3,'2006','n');
4- Se desea saber la cantidad de alumnos inscriptos en cada deporte cada ao, sin
considerar los
deportes para los cuales no hay inscriptos:
select d.nombre,i.ao,count(i.codigodeporte) as cantidad
from deportes as d
join inscriptos as i
on d.codigo=i.codigodeporte
group by d.nombre,i.ao;
5- El club quiere almacenar esa informacin en una tabla llamada "inscriptospordep
orteporao".
Elimine la tabla, si existe.
6- Cree la tabla con la siguiente estructura:
create table inscriptospordeporteporao(
deporte varchar(15),
ao year,
cantidad tinyint unsigned
);
7- Ingrese registros en la tabla creada anteriormente, a partir de la consulta d
el punto 4:
insert into inscriptospordeporteporao
select d.nombre,i.ao,count(i.codigodeporte)
from deportes as d
join inscriptos as i
on d.codigo=i.codigodeporte
group by d.nombre,i.ao;
8- Muestre el nombre del socio, el nombre del deporte y el ao de inscripcin de tod
as las
inscripciones con cuota impaga:
select s.nombre as socio,d.nombre as deporte,i.ao
from socios as s
join inscriptos as i
on s.documento=i.documento
join deportes as d
on i.codigodeporte=d.codigo
where i.cuota='n';
9- Elimine la tabla "sociosdeudores" si existe.
10- Cree la tabla:
create table sociosdeudores(
socio varchar(30),
deporte varchar(15),
ao year
);
11- Intente ingresar en la tabla anteriormente creada los registros resultado de
la consulta del
punto 8, colocando los campos "socio" y "deporte" en la lista de campos a cargar
:
insert into sociosdeudores (socio,deporte)
select s.nombre,d.nombre,i.ao
from socios as s
join inscriptos as i
on s.documento=i.documento
join deportes as d
on i.codigodeporte=d.codigo
where i.cuota='n';
La sentencia no se ejecuta porque los campos listados son 2 y la consulta retorn
a 3 columnas.
12- Ingrese en la tabla anteriormente creada los registros resultado de la consu
lta del punto 8,
correctamente:
insert into sociosdeudores
select s.nombre,d.nombre,i.ao
from socios as s
join inscriptos as i
on s.documento=i.documento
join deportes as d
on i.codigodeporte=d.codigo
where i.cuota='n';
13- Vea los registros de "sociosdeudores".
14- Agrupe por nombre del profesor y deporte y cuente la cantidad de alumnos por
profesor y
deporte, considerando los deportes para los que no haya inscriptos:
select d.profesor,d.nombre,count(i.codigodeporte) as alumnos
from deportes as d
left join inscriptos as i
on i.codigodeporte=d.codigo
group by d.profesor,d.nombre;
15- Elimine la tabla "alumnosporprofesor" si existe.
16- Cree la tabla "alumnosporprofesor":
create table alumnosporprofesor(
profesor varchar(30),
deporte varchar(15),
cantidad tinyint unsigned
);
17- Ingrese en la tabla creada en el punto anterior con el resultado de la consu
lta del punto 14:
insert into alumnosporprofesor
select d.profesor,d.nombre,count(i.codigodeporte)
from deportes as d
left join inscriptos as i
on i.codigodeporte=d.codigo
group by d.profesor,d.nombre;
18- Muestre todos los registros de la nueva tabla.

Segundo problema:
A) Un profesor guarda en una tabla llamada "alumnos" los datos personales de sus
alumnos y en otra
tabla llamada "notas" las calificaciones de los mismos.
1- Elimine las tablas si existen.
2- Cree las tablas con las siguientes estructuras:
create table alumnos(
documento char(8),
nombre varchar(30),
domicilio varchar(30)
);

create table notas(
documento char(8) not null,
nota decimal(4,2) unsigned
);
Algunos alumnos tienen ms notas que otros porque presentaron trabajos especiales.
3- Ingrese los siguientes registros:
insert into alumnos (documento,nombre) values('22333444','Juan Perez');
insert into alumnos (documento,nombre) values('23333444','Marta Molina');
insert into alumnos (documento,nombre) values('24333444','Carlos Fuentes');
insert into alumnos (documento,nombre) values('25333444','Sandra Lopez');
insert into notas values('22333444',8);
insert into notas values('23333444',3);
insert into notas values('24333444',6);
insert into notas values('25333444',9);
insert into notas values('23333444',2);
insert into notas values('24333444',5);
insert into notas values('25333444',8);
insert into notas values('25333444',10);
4- El profesor necesita conocer el documento, el nombre del alumno y el promedio
de sus notas:
select a.documento,nombre,avg(n.nota) as promedio
from alumnos as a
join notas as n
on a.documento = n.documento
group by a.documento;
5- Elimine la tabla "promedios" si existe.
6- Cree la tabla "promedios" con la siguiente estructura:
create table promedios(
documento char(8),
nombre carchar(30),
promedio decimal(4,2) unsigned
);
7- Ingrese los registros resultado de la consulta del punto 4 en la tabla "prome
dios":
insert into promedios
select a.documento,nombre,avg(n.nota)
from alumnos as a
join notas as n
on a.documento = n.documento
group by a.documento;
8- Muestre el documento, nombre y promedio de los alumnos aprobados:
select a.documento,nombre,avg(n.nota) as promedio
from alumnos as a
join notas as n
on a.documento = n.documento
group by a.documento
having promedio>=4;
9- Elimine la tabla "aprobados" si existe.
10- Cree la tabla "aprobados" con esta estructura:
create table aprobados(
documento char(8),
nombre varchar(30),
promedio decimal(4,2) unsigned
);
11- Ingrese los registros resultado de la consulta del punto 8 en la tabla cread
a en el punto
anterior:
insert into aprobados
select a.documento,nombre,avg(n.nota) as promedio
from alumnos as a
join notas as n
on a.documento = n.documento
group by a.documento
having promedio>=4;
12- Muestre los registros de "aprobados".
Tercer Problema:
B) Un banco tiene registrados los datos de sus clientes en una tabla denominada
"clientes" y las
cuentas corrientes de los mismos en una tabla llamada "cuentas".
1- Elimine las tablas, si existen.
2- Cree las tablas:
create table clientes(
documento char(8),
nombre varchar(30),
domicilio varchar(30),
primary key(documento)
);
create table cuentas(
numero int(8) zerofill auto_increment,
documento char(8) not null,
saldo decimal(9,2),
primary key(numero)
);
3- Ingrese los siguientes registros:
insert into clientes (documento,nombre) values ('22333444','Juan Perez');
insert into clientes (documento,nombre) values ('23333444','Maria Pereyra');
insert into clientes (documento,nombre) values ('24333444','Marcos Torres');
insert into clientes (documento,nombre) values ('25333444','Ana Juarez');
insert into cuentas values(1234,'22333444',2000.60);
insert into cuentas values(2566,'23333444',5050);
insert into cuentas values(5987,'24333444',200);
insert into cuentas values(14434,'25333444',8000.60);
insert into cuentas values(28566,'23333444',8050);
insert into cuentas values(35987,'24333444',2000);
insert into cuentas values(35997,'24333444',2000);
4- Agrupe por documento y muestre el documento del cliente, su nombre, en una co
lumna
llamada "cantidad" calcule la cantidad de cuentas de cada cliente y en otra colu
mna llamada "total"
calcule la suma de todas las cuentas de cada cliente:
select cl.documento,nombre,
count(*) as cantidad,
sum(saldo) as total
from cuentas as cu
join clientes as cl
on cl.documento=cu.documento
group by cl.documento;
5- Elimine la tabla "cuentasporcliente", si existe.
6- Cree la tabla "cuentasporcliente" con la siguiente estructura:
create table cuentasporcliente(
numero int unsigned auto_increment,
documento char(8),
cantidad tinyint unsigned,
total decimal(9,2) unsigned,
primary key(numero)
);
7- Inserte el resultado de la consulta del punto 4 en la tabla creada anteriorme
nte:
insert into cuentasporcliente (documento,nombre,cantidad,total)
select cl.documento,nombre,
count(*) as cantidad,
sum(saldo)
from cuentas as cu
join clientes as cl
on cl.documento=cu.documento
group by cl.documento;
8- Vea los registros de "cuentasporcliente".
<------------------------------------------------------------------>
78 - Actualizar datos con valores de otra tabla (update)
Tenemos la tabla "libros" en la cual almacenamos los datos de los libros de nues
tra biblioteca y la tabla "editoriales" que almacena el nombre de las distintas
editoriales y sus cdigos.
La tabla "libros" tiene la siguiente estructura:
-codigo: int unsigned auto_increment,
-titulo: varchar(30),
-autor: varchar(30),
-codigoeditorial: tinyint unsigned,
-clave primaria: codigo.
La tabla "editoriales" tiene esta estructura:
-codigo: tinyint unsigned auto_increment,
-nombre: varchar(20),
-clave primaria: codigo.
Ambas tablas contienen registros.
Queremos unir los datos de ambas tablas en una sola: "libros", es decir, alterar
la tabla "libros" para que almacene el nombre de la editorial y eliminar la tab
la "editoriales".
En primer lugar debemos alterar la tabla "libros", vamos a agregarle un campo ll
amado "editorial" en el cual guardaremos el nombre de la editorial.
alter table libros add editorial varchar(20);
La tabla "libros" contiene un nuevo campo "editorial" con todos los registros co
n valor "null".
Ahora debemos actualizar los valores para ese campo.
Podemos hacerlo en 2 pasos:
1 paso: consultamos los cdigos de las editoriales:
select codigo,nombre
from editoriales;
obtenemos una salida similar a la siguiente:
codigo nombre
_____________
1 Planeta
2 Emece
3 Paidos
2 paso: comenzamos a actualizar el campo "editorial" de los registros de "libros"
uno a uno:
update libros set editorial='Planeta'
where codigoeditorial=1;
update libros set editorial='Emece'
where codigoeditorial=2;
update libros set editorial='Paidos'
where codigoeditorial=3;
... con cada editorial...
Luego, eliminamos el campo "codigoeditorial" de "libros" y la tabla "editoriales
".
Pero podemos simplificar la tarea actualizando el campo "editorial" de todos los
registros de la tabla "libros" al mismo tiempo que realizamos el "join" (paso 1
y 2 en una sola sentencia):
update libros
join editoriales
on libros.codigoeditorial=editoriales.codigo
set libros.editorial=editoriales.nombre;
Luego, eliminamos el campo "codigoeditorial" de "libros" con "alter table" y la
tabla "editoriales" con "drop table".
Entonces, se puede actualizar una tabla con valores de otra tabla. Se coloca "up
date" junto al nombre de la tabla a actualizar, luego se realiza el "join" y el
campo por el cual se enlazan las tablas y finalmente se especifica con "set" el
campo a actualizar y su nuevo valor, que es el campo de la otra tabla con la cua
l se enlaz.
Problema :
Una empresa tiene registrados sus clientes en una tabla llamada "clientes", tamb
in tiene una
tabla "provincias" donde registra los nombres de las provincias.
1- Elimine la tabla "clientes" y "provincias", si existen:
drop table if exists clientes, provincias;
2- Crelas con las siguientes estructuras:
create table clientes (
codigo int unsigned auto_increment,
nombre varchar(30) not null,
domicilio varchar(30),
ciudad varchar(20),
codigoprovincia tinyint unsigned,
telefono varchar(11),
primary key(codigo)
);
create table provincias(
codigo tinyint unsigned auto_increment,
nombre varchar(20),
primary key (codigo)
);
3- Ingrese algunos registros para ambas tablas:
insert into provincias (nombre) values('Cordoba');
insert into provincias (nombre) values('Santa Fe');
insert into provincias (nombre) values('Corrientes');
insert into provincias (nombre) values('Misiones');
insert into provincias (nombre) values('Salta');
insert into provincias (nombre) values('Buenos Aires');
insert into provincias (nombre) values('Neuquen');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Lopez Marcos', 'Colon 111', 'Crdoba',1,'null');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Perez Ana', 'San Martin 222', 'Cruz del Eje',1,'4578585');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Garcia Juan', 'Rivadavia 333', 'Villa Maria',1,'4578445');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Perez Luis', 'Sarmiento 444', 'Rosario',2,null);
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Pereyra Lucas', 'San Martin 555', 'Cruz del Eje',1,'4253685');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Gomez Ines', 'San Martin 666', 'Santa Fe',2,'0345252525');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Torres Fabiola', 'Alem 777', 'Villa del Rosario',1,'4554455');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Lopez Carlos', 'Irigoyen 888', 'Cruz del Eje',1,null);
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Ramos Betina', 'San Martin 999', 'Cordoba',1,'4223366');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Lopez Lucas', 'San Martin 1010', 'Posadas',4,'0457858745');
4- La empresa quiere eliminar la tabla "provincias" y almacenar el nombre de la
provincia de la
cual son oriundos sus clientes en la misma tabla "clientes".
5- Altere la tabla "clientes" para que se almacene en ella el nombre de la provi
ncia:
alter table clientes add provincia varchar(20);
6- Actualice el campo "provincia" de todos los registros de "clientes", con el v
alor del
campo "nombre" de la tabla "provincias" mediante un "join":
update clientes as c
join provincias as p
on c.codigoprovincia=p.codigo
set c.provincia=p.nombre;
7- Elimine el campo innecesario en "clientes" y la tabla "provincias".
Segundo problema:
A) Un club dicta clases de distintos deportes. En una tabla llamada "socios" gua
rda los datos de
sus socios y en una tabla denominada "inscriptos" almacena la informacin necesari
a para las
inscripciones de los socios a los distintos deportes.
1- Elimine las tablas si existen.
2- Cree las tablas:
create table socios(
documento char(8) not null,
nombre varchar(30),
domicilio varchar(30),
primary key(documento)
);
create table inscriptos(
documento char(8) not null,
deporte varchar(15) not null,
ao year,
matricula char(1), /*si esta paga ='s' sino 'n'*/
primary key(documento,deporte,ao)
);
3- Ingrese algunos registros para ambas tablas:
insert into socios values('22333444','Juan Perez','Colon 234');
insert into socios values('23333444','Maria Lopez','Sarmiento 465');
insert into socios values('24333444','Antonio Juarez','Caseros 980');
insert into inscriptos values ('22333444','natacion','2005','s');
insert into inscriptos values ('22333444','natacion','2006','n');
insert into inscriptos values ('23333444','natacion','2005','s');
insert into inscriptos values ('23333444','tenis','2006','s');
insert into inscriptos values ('23333444','natacion','2006','s');
insert into inscriptos values ('24333444','tenis','2006','n');
insert into inscriptos values ('24333444','basquet','2006','n');
4- El club quiere eliminar la tabla "socios" porque en adelante, para inscribirs
e en un deporte ya
no ser necesario ser socio. Se quiere almacenar el nombre y domicilio de quien se
inscribe en la
misma tabla en la cual se registran las inscripciones. Agregue los campos necesa
rios a la
tabla "inscriptos":
alter table inscriptos add nombre varchar(30), add domicilio varchar(30);
5- Actualice los nuevos campos realizando un "join" con la tabla "socios":
update socios as s
join inscriptos as i
on s.documento=i.documento
set i.nombre=s.nombre,
i.domicilio=s.domicilio;
6- Elimine la tabla "socios".
Tercer Problema:
B) Una empresa registra los datos personales de sus empleados en una tabla llama
da "empleados" y
las dependencias a las cuales pertenecen los mismos en una tabla denominada "dep
endencias".
1- Elimine las tablas "empleados" y "dependencias" si existen.
2- Cree las tablas:
create table empleados(
documento char(8) not null,
nombre varchar(30) not null,
domicilio varchar(30),
fechaingreso date,
primary key(documento)
);
create table dependencias(
documento char(8) not null,
seccion varchar(30),
sueldo decimal (6,2) unsigned,
primary key(documento)
);
3- Ingrese algunos registros:
insert into empleados values ('22333111','Juan Perez','Colon 123','1990-02-01')
;
insert into empleados values ('25444444','Susana Morales','Avellaneda 345','199
5-04-01');
insert into empleados values ('20111222','Hector Pereyra','Caseros 987','1995-0
4-01');
insert into empleados values ('30000222','Luis Luque','Urquiza 456','1980-09-01
');
insert into empleados values ('20555444','Laura Torres','San Martin 1122','2000
-05-15');
insert into empleados values ('30000234','Alberto Soto','Peru 232','2003-08-15'
);
insert into empleados values ('30154269','Oscar Mendez','Colon 1245','2004-06-2
3');
insert into dependencias values('22333111','Gerencia',2000);
insert into dependencias values ('25444444','Sistemas',1500);
insert into dependencias values ('20111222','Sistemas',1400);
insert into dependencias values ('30000222','Contadura',1400);
insert into dependencias values ('20555444','Secretara',1000);
insert into dependencias values ('30000234','Secretara',1000);
insert into dependencias values ('30154269','Relaciones pblicas',1100);
4- La empresa quiere eliminar la tabla "dependencias" y guardar la informacin que
la misma
contiene en la tabla "empleados". Agregue los campos necesarios a la tabla "empl
eados":
alter table empleados add seccion varchar(30) not null, add sueldo decimal(6,2)
unsigned;
5- Vea los registros de la tabla "empleados":
select *from empleados;
6- Actualice los nuevos campos realizando un "join" con la tabla "dependencias":
update empleados as e
join dependencias as d
on d.documento=e.documento
set e.seccion=d.seccion,
e.sueldo=d.sueldo;
7- Elimine la tabla "dependencias".
8- Visualice la nueva estructura de la tabla "empleados" y sus registros.
Cuarto Problema:
C) Un instituto de enseanza guarda en una tabla llamada "alumnos" los datos perso
nales de sus
alumnos.
1- Elimine la tabla "alumnos" si existe.
2- Cree la tabla con la siguiente estructura:
create table alumnos(
apellido varchar(20) not null,
nombre varchar(20),
documento char(8),
domicilio varchar(30),
primary key(documento)
);
3- Ingrese los siguientes registros:
insert into alumnos values('Perez','Luis','22333444','Colon 123');
insert into alumnos values('Lopez','Natalia','23333444','Caseros 980');
insert into alumnos values('Torres','Mariano','24333444','Bulnes 256');
insert into alumnos values('Garcia','Ana','25333444','Sucre 209');
insert into alumnos values('Perez','Antonio','26333444','Avellaneda 1083');
4- Se desea alterar la tabla "alumnos" para que guarde en un mismo campo el apel
lido y el nombre
del alumno.
update alumnos
set nombre=concat(apellido,' ',nombre);
5- Muestre todos los registros de la tabla "alumnos".
6- Elimine el campo "apellido".
<------------------------------------------------------------------>
79 - Actualizacin en cascada (update - join)
Tenemos la tabla "libros" en la cual almacenamos los datos de los libros de nues
tra biblioteca y la tabla "editoriales" que almacena el nombre de las distintas
editoriales y sus cdigos.
Las tablas tienen las siguientes estructuras:
create table libros(
codigo int unsigned auto_increment,
titulo varchar(30),
autor varchar(30),
codigoeditorial tinyint unsigned,
precio decimal(5,2) unsigned,
primary key(codigo)
);
create table editoriales(
codigo tinyint unsigned auto_increment,
nombre varchar(20),
primary key(codigo)
);
Ambas tablas contienen registros.
Queremos modificar el cdigo de la editorial "Emece" a "9" y tambin todos los "codi
goeditorial" de los libros de dicha editorial. Podemos hacerlo en 3 pasos:
1) buscar el cdigo de la editorial "Emece":
select * from editoriales
where nombre='Emece';
recordamos el valor devuelto (valor 2) o lo almacenamos en una variable;
2) actualizar el cdigo en la tabla "editoriales":
update editoriales
set codigo=9
where nombre='Emece';
3) y finalmente actualizar todos los libros de dicha editorial:
update libros
set codigoeditorial=9
where codigoeditorial=2;
O podemos hacerlo en una sola sentencia:
update libros as l
join editoriales as e
on l.codigoeditorial=e.codigo
set l.codigoeditorial=9, e.codigo=9
where e.nombre='Emece';
El cambio se realiz en ambas tablas.
Si modificamos algn dato de un registro que se encuentra en registros de otras ta
blas (generalmente campos que son clave ajena) debemos modificar tambin los regis
tros de otras tablas en los cuales se encuentre ese dato (generalmente clave pri
maria). Podemos realizar la actualizacin en cascada (es decir, en todos los regis
tros de todas las tablas que contengan el dato modificado) en una sola sentencia
, combinando "update" con "join" y seteando los campos involucrados de todas las
tablas.
Problema :
Una empresa tiene registrados sus clientes en una tabla llamada "clientes", tamb
in tiene una
tabla "provincias" donde registra los nombres de las provincias de las cuales so
n oriundos los
clientes.
1- Elimine la tabla "clientes" y "provincias", si existen:
drop table if exists clientes, provincias;
2- Crelas con las siguientes estructuras:
create table clientes (
codigo int unsigned auto_increment,
nombre varchar(30) not null,
domicilio varchar(30),
ciudad varchar(20),
codigoprovincia tinyint unsigned,
telefono varchar(11),
primary key(codigo)
);
create table provincias(
codigo tinyint unsigned auto_increment,
nombre varchar(20),
primary key (codigo)
);
3- Ingrese algunos registros para ambas tablas:
insert into provincias (nombre)
values('Cordoba');
insert into provincias (nombre)
values('Santa Fe');
insert into provincias (nombre)
values('Corrientes');
insert into provincias (nombre)
values('Misiones');
insert into provincias (nombre)
values('Salta');
insert into provincias (nombre)
values('Buenos Aires');
insert into provincias (nombre)
values('Neuquen');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Lopez Marcos', 'Colon 111', 'Crdoba',1,'null');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Perez Ana', 'San Martin 222', 'Cruz del Eje',1,'4578585');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Garcia Juan', 'Rivadavia 333', 'Villa Maria',1,'4578445');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Perez Luis', 'Sarmiento 444', 'Rosario',2,null);
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Pereyra Lucas', 'San Martin 555', 'Cruz del Eje',1,'4253685');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Gomez Ines', 'San Martin 666', 'Santa Fe',2,'0345252525');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Torres Fabiola', 'Alem 777', 'Villa del Rosario',1,'4554455');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Lopez Carlos', 'Irigoyen 888', 'Cruz del Eje',1,null);
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Ramos Betina', 'San Martin 999', 'Cordoba',1,'4223366');
insert into clientes (nombre,domicilio,ciudad,codigoProvincia,telefono)
values ('Lopez Lucas', 'San Martin 1010', 'Posadas',4,'0457858745');
4- Se quiere cambiar el cdigo correspondiente a la provincia "Cordoba" por "10" y
modificar todos
los cdigos de provincia de los clientes de "Cordoba" en una sola sentencia:
update clientes as c
join provincias as p
on c.codigoprovincia=p.codigo
set c.codigoprovincia=10, p.codigo=10
where p.nombre='Cordoba';
5- Verifique el cambio en ambas tablas:
select * from clientes;
select * from provincias;
Segundo problema:
Un profesor guarda los promedios de sus alumnos de un curso en una tabla llamada
"alumnos" y las
notas de los mismos en la tabla "notas".
1- Elimine las tablas si existen.
2- Cree las tablas:
create table alumnos(
documento char(8) not null,
nombre varchar(30),
primary key(documento)
);
create table notas(
documento char(8) not null,
nota decimal(4,2) unsigned
);
3- Ingrese los siguientes registros:
insert into alumnos values('22333444','Juan Perez');
insert into alumnos values('23555666','Marina Herrero');
insert into alumnos values('24000333','Daniel Juarez');
insert into alumnos values('25222111','Hector Paz');
insert into notas values('22333444',7);
insert into notas values('23555666',8);
insert into notas values('24000333',3);
insert into notas values('25222111',7);
insert into notas values('22333444',7);
insert into notas values('23555666',9);
insert into notas values('24000333',4);
insert into notas values('22333444',6);
insert into notas values('23555666',10);
insert into notas values('24000333',3);
insert into notas values('25222111',9);
insert into notas values('23555666',10);
4- El alumno "Juan Perez" registrado con documento "22333444" dice que su docume
nto ha sido
almacenado errneamente, en realidad es "22333445". Modifique el documento del alu
mno en "alumnos"
y "notas en una sola sentencia:
update alumnos as a
join notas as n
on a.documento=n.documento
set a.documento='22333445', n.documento='22333445'
where a.documento='22333444';
<------------------------------------------------------------------>
80 - Borrar registros consultando otras tablas (delete - join)
Tenemos la tabla "libros" en la cual almacenamos los datos de los libros de nues
tra biblioteca y la tabla "editoriales" que almacena el nombre de las distintas
editoriales y sus cdigos.
La tabla "libros" tiene la siguiente estructura:
-codigo: int unsigned auto_increment,
-titulo: varchar(30),
-autor: varchar(30),
-codigoeditorial: tinyint unsigned,
-clave primaria: codigo.
La tabla "editoriales" tiene esta estructura:
-codigo: tinyint unsigned auto_increment,
-nombre: varchar(20),
-clave primaria: codigo.
Ambas tablas contienen registros.
Queremos eliminar todos los libros de la editorial "Emece" pero no recordamos el
cdigo de dicha editorial.
Podemos hacerlo en 2 pasos:
1 paso: consultamos el cdigo de la editorial "Emece":
select codigo
from editoriales
where nombre='Emece';
recordamos el valor devuelto (valor 2) o lo almacenamos en una variable.
2 paso: borramos todos los libros con cdigo de editorial "2":
delete libros
where codigoeditorial=2;
O podemos realizar todo en un solo paso:
delete libros
from libros
join editoriales
on libros.codigoeditorial=editoriales.codigo
where editoriales.nombre='Emece';
Es decir, usamos "delete" junto al nombre de la tabla de la cual queremos elimin
ar registros, luego realizamos el "join" correspondiente nombrando las tablas in
volucradas y agregamos la condicin "where".
Problema :
Una empresa tiene registrados sus clientes en una tabla llamada "clientes", tamb
in tiene una
tabla "provincias" donde registra los nombres de las provincias.
1- Elimine la tabla "clientes" y "provincias", si existen:
drop table if exists clientes, provincias;
2- Crelas con las siguientes estructuras:
create table clientes (
codigo int unsigned auto_increment,
nombre varchar(30) not null,
domicilio varchar(30),
ciudad varchar(20),
codigoprovincia tinyint unsigned,
telefono varchar(11),
primary key(codigo)
);
create table provincias(
codigo tinyint unsigned auto_increment,
nombre varchar(20),
primary key (codigo)
);
3- Ingrese algunos registros para ambas tablas:
insert into provincias (nombre) values('Cordoba');
insert into provincias (nombre) values('Santa Fe');
insert into provincias (nombre) values('Corrientes');
insert into provincias (nombre) values('Misiones');
insert into provincias (nombre) values('Salta');
insert into provincias (nombre) values('Buenos Aires');
insert into provincias (nombre) values('Neuquen');
insert into clientes (nombre,domicilio,ciudad,codigoprovincia,telefono)
values ('Lopez Marcos', 'Colon 111', 'Crdoba',1,'null');
insert into clientes (nombre,domicilio,ciudad,codigoprovincia,telefono)
values ('Perez Ana', 'San Martin 222', 'Cruz del Eje',1,'4578585');
insert into clientes (nombre,domicilio,ciudad,codigoprovincia,telefono)
values ('Garcia Juan', 'Rivadavia 333', 'Villa Maria',1,'4578445');
insert into clientes (nombre,domicilio,ciudad,codigoprovincia,telefono)
values ('Perez Luis', 'Sarmiento 444', 'Rosario',2,null);
insert into clientes (nombre,domicilio,ciudad,codigoprovincia,telefono)
values ('Pereyra Lucas', 'San Martin 555', 'Cruz del Eje',1,'4253685');
insert into clientes (nombre,domicilio,ciudad,codigoprovincia,telefono)
values ('Gomez Ines', 'San Martin 666', 'Santa Fe',2,'0345252525');
insert into clientes (nombre,domicilio,ciudad,codigoprovincia,telefono)
values ('Torres Fabiola', 'Alem 777', 'Villa del Rosario',1,'4554455');
insert into clientes (nombre,domicilio,ciudad,codigoprovincia,telefono)
values ('Lopez Carlos', 'Irigoyen 888', 'Cruz del Eje',1,null);
insert into clientes (nombre,domicilio,ciudad,codigoprovincia,telefono)
values ('Ramos Betina', 'San Martin 999', 'Cordoba',1,'4223366');
insert into clientes (nombre,domicilio,ciudad,codigoprovincia,telefono)
values ('Lopez Lucas', 'San Martin 1010', 'Posadas',5,'0457858745');
4- Se quiere borrar de la tabla "clientes" todos los clientes de la provincia "S
anta Fe", pero no
se recuerda el cdigo de la provincia. Elimine dichos clientes consultando el cdigo
de provincia
en "provincias" en la misma sentencia:
delete clientes
from clientes
join provincias
on clientes.codigoprovincia=provincias.codigo
where provincias.nombre='Santa Fe';
5- Verifique la eliminacin.
Segundo problema:
Un instituto de enseanza guarda en una tabla llamada "carreras" los datos de las
carreras que
dicta, en "materias" las materias de cada carrera y en "inscriptos" las inscripc
iones.
1- Elimine las 3 tablas, si existen:
drop table if exists carreras, materias, inscriptos;
2- Cree las tablas con las siguientes estructuras:
create table carreras(
codigo tinyint unsigned auto_increment,
nombre varchar(30),
primary key(codigo)
);
create table materias(
codigo tinyint unsigned auto_increment,
codigocarrera tinyint unsigned,
nombre varchar(30),
profesor varchar(30),
primary key(codigo,codigocarrera)
);
create table inscriptos(
documento char(8) not null,
codigocarrera tinyint unsigned,
codigomateria tinyint unsigned,
ao year
);
3- Ingrese algunos registros:
insert into carreras values(1,'Analista de sistemas');
insert into carreras values(2,'Diseador web');
insert into materias values(1,1,'Programacion I','Alfredo Lopez');
insert into materias values(2,1,'Sistemas de datos I','Bernardo Garcia');
insert into materias values(3,1,'Ingles tecnico','Edit Torres');
insert into materias values(1,2,'Programacion basica','Alfredo Lopez');
insert into materias values(2,2,'Ingles I','Edit Torres');
insert into materias values(3,2,'Protocolos','Hector Juarez');
insert into inscriptos values('22333444',1,3,'2006');
insert into inscriptos values('23222222',1,2,'2006');
insert into inscriptos values('25000999',1,2,'2006');
insert into inscriptos values('25000999',2,1,'2006');
insert into inscriptos values('25000999',2,2,'2006');
4- La materia "Sistemas de datos I" no se va a dictar por cambios en el programa
. Elimine todas las
inscripciones a dicha materia de la tabla "inscriptos" consultando el cdigo en "m
aterias"
y "carreras":
delete inscriptos
from inscriptos as i
join materias as m
on i.codigomateria=m.codigo
join carreras as c
on i.codigocarrera=c.codigo and
c.codigo=m.codigocarrera
where m.nombre='Sistemas de datos I';
5- Verifique la eliminacin en "inscriptos".
6- Elimine la materia de la tabla "materias":
delete from materias
where nombre='Sistemas de datos I';
<------------------------------------------------------------------>
81 - Borrar registros buscando coincidencias en otras tablas (delete - join)
Tenemos la tabla "libros" en la cual almacenamos los datos de los libros de nues
tra biblioteca y la tabla "editoriales" que almacena el nombre de las distintas
editoriales y sus cdigos.
La tabla "libros" tiene la siguiente estructura:
-codigo: int unsigned auto_increment,
-titulo: varchar(30),
-autor: varchar(30),
-codigoeditorial: tinyint unsigned,
-clave primaria: codigo.
La tabla "editoriales" tiene esta estructura:
-codigo: tinyint unsigned auto_increment,
-nombre: varchar(20),
-clave primaria: codigo.
Ambas tablas contienen registros.
Queremos eliminar todos los libros cuyo cdigo de editorial no exista en la tabla
"editoriales".
Podemos hacerlo en 2 pasos:
1 paso: realizamos un left join para ver qu "codigoeditorial" en "libros" no exist
e en "editoriales":
select l.* from libros as l
left join editoriales as e
on l.codigoeditorial=e.codigo
where e.codigo is null;
recordamos el valor de los cdigos de libro devueltos (valor 5) o lo almacenamos e
n una variable.
2 paso: borramos todos los libros mostrados en la consulta anterior (uno solo, co
n cdigo 5):
delete libros
where codigo=5;
O podemos realizar la elimincin en el mismo momento que realizamos el "left join"
:
delete libros
FROM libros
left join editoriales
on libros.codigoeditorial=editoriales.codigo
where editoriales.codigo is null;
Es decir, usamos "delete" junto al nombre de la tabla de la cual queremos elimin
ar registros, luego realizamos el "left join" correspondiente nombrando las tabl
as involucradas y agregamos la condicin "where" para que seleccione solamente los
libros cuyo cdigo de editorial no se encuentre en "editoriales".
Ahora queremos eliminar todas las editoriales de las cuales no haya libros:
delete editoriales
from editoriales
left join libros
on libros.codigoeditorial=editoriales.codigo
where libros.codigo is null;
Problema :
Un club de dicta clases de distintos deportes a sus socios. Guarda la informacin
de los deportes
que dicta en una tabla llamada "deportes", los datos de los profesores en "profe
sores" y las
inscipciones en "inscriptos".
1- Elimine las tablas, si existen.
2- Cree las tablas:
create table deportes(
codigo tinyint unsigned auto_increment,
nombre varchar(20) not null,
profesor tinyint unsigned,
primary key(codigo)
);

create table profesores(
codigo tinyint unsigned auto_increment,
nombre varchar(30),
domicilio varchar(30),
primary key(codigo)
);
create table inscriptos(
numerosocio int unsigned,
deporte tinyint unsigned,
ao year not null,
cuota char(1), /*'s' o 'n', si esta paga o no*/
primary key(numerosocio,deporte,ao)
);
3- Ingrese los siguientes registros:
insert into profesores values(1,'Alfredo Perez','Sarmiento 984');
insert into profesores values(2,'Betina Molina','Sucre 356');
insert into profesores values(3,'Carlos Garcia','Urquiza 209');
insert into profesores values(4,'Daniel Morales','Salta 1234');
insert into deportes values(1,'tenis',1);
insert into deportes values(2,'natacion',2);
insert into deportes values(3,'basquet',3);
insert into deportes values(4,'futbol',1);
insert into inscriptos values(102,1,'2006','s');
insert into inscriptos values(102,2,'2006','s');
insert into inscriptos values(104,2,'2006','s');
insert into inscriptos values(104,3,'2006','s');
insert into inscriptos values(106,1,'2006','s');
insert into inscriptos values(109,2,'2006','s');
4- Se quiere eliminar de la tabla "deportes" aquellos deportes para los cuales n
o hay inscriptos:
delete deportes
from deportes as d
left join inscriptos as i
on d.codigo=i.deporte
where i.deporte is null;
5- se quiere eliminar de la tabla "profesores" a aquellos profesores que no dict
an ningn deporte,
es decir, que no estn en la tabla "deportes":
delete profesores
from profesores as p
left join deportes as d
on d.profesor=p.codigo
where d.profesor is null;

Segundo problema:
A) Un profesor guarda los datos de sus alumnos en una tabla llamada "alumnos" y
los alumnos
aprobados en la tabla "aprobados".
1- Elimine las tablas si existen:
drop table if exists alumnos, aprobados;
2- Cree las tablas:
create table alumnos(
legajo int(3) unsigned,
nombre varchar(30)
);

create table aprobados(
legajo int(3) unsigned,
promedio decimal(4,2) unsigned
);
3- Ingrese los siguientes registros:
insert into alumnos values(123,'Juan Perez');
insert into alumnos values(223,'Marta Molina');
insert into alumnos values(343,'Patricia Vargas');
insert into alumnos values(456,'Hector Fuentes');
insert into alumnos values(467,'Alfredo Lopez');
insert into alumnos values(678,'Carla Juarez');
insert into aprobados values(223,9.4);
insert into aprobados values(456,6);
insert into aprobados values(467,4.5);
insert into aprobados values(678,7.8);
4- Se quiere eliminar de la tabla "alumnos" todos aquellos alumnos que no se enc
uentran en la
tabla "aprobados":
delete alumnos
from alumnos as al
left join aprobados as ap
on al.legajo=ap.legajo
where ap.legajo is null;
Tercer Problema:
B) Una pequea biblioteca de barrio registra los datos de sus socios en la tabla "
socios" y en una
tabla "morosos" el documento del socio que adeuda libros y la fecha desde la cua
l es moroso.
1- Elimine las tablas, si existen.
2- Cree las tablas:
create table socios(
documento char(8),
nombre varchar(30),
domicilio varchar(30),
primary key(documento)
);

create table morosos(
documento char(8),
fecha date
);
3- Ingrese algunos registros:
insert into socios values(234,'Juan Lopez','Colon 345');
insert into socios values(345,'Ana Ferrero','Caseros 98');
insert into socios values(456,'Juan Perez','Urquiza 356');
insert into socios values(567,'Karina Torres','Peru 743');
insert into socios values(678,'Juan Lopez','Avellaneda 234');
insert into socios values(789,'Laura Juarez','Sarmiento 765');
insert into morosos values(345,'2006-08-10');
insert into morosos values(567,'2006-09-24');
insert into morosos values(789,'2006-10-06');
4- Se quiere borrar de la tabla "socios" los socios morosos:
delete socios
from socios as s
join morosos as m
on s.documento=m.documento;
<------------------------------------------------------------------>
82 - Borrar registros en cascada (delete - join)
Tenemos la tabla "libros" en la cual almacenamos los datos de los libros de nues
tra biblioteca y la tabla "editoriales" que almacena el nombre de las distintas
editoriales y sus cdigos.
La tabla "libros" tiene la siguiente estructura:
-codigo: int unsigned auto_increment,
-titulo: varchar(30),
-autor: varchar(30),
-codigoeditorial: tinyint unsigned,
-clave primaria: codigo.
La tabla "editoriales" tiene esta estructura:
-codigo: tinyint unsigned auto_increment,
-nombre: varchar(20),
-clave primaria: codigo.
Ambas tablas contienen registros.
La librera ya no trabaja con la editorial "Emece", entonces quiere eliminar dicha
editorial de la tabla "editoriales" y todos los libros de "libros" de esta edit
orial. Podemos hacerlo en 2 pasos:
1 paso: buscar el cdigo de la editorial "Emece" y almacenarlo en una variable:
select @valor:= codigo from editoriales
where nombre='Emece';
2 paso: eliminar dicha editorial de la tabla "editoriales":
delete editoriales
where codigo=@valor;
3 paso: eliminar todos los libros cuyo cdigo de editorial sea igual a la variable:
delete libros where codigoeditorial=@valor;
O podemos hacerlo en una sola consulta:
delete libros,editoriales
from libros
join editoriales
on libros.codigoeditorial=editoriales.codigo
where editoriales.nombre='Emece';
La sentencia anterior elimina de la tabla "editoriales" la editorial "Emece" y d
e la tabla "libros" todos los registros con cdigo de editorial correspondiente a
"Emece".
Es decir, podemos realizar la eliminacin de registros de varias tablas (en cascad
a) empleando "delete" junto al nombre de las tablas de las cuales queremos elimi
nar registros y luego del correspondiente "join" colocar la condicin "where" que
afecte a los registros a eliminar.
Problema :
Una clnica registra los pacientes en una tabla llamada "pacientes" y en otra tabl
a
denominada "obrassociales" almacena los datos de las obras sociales que atiende.
1- Elimine las tablas si existen.
2- Cree las tablas:
create table pacientes(
documento char(8),
nombre varchar(30),
domicilio varchar(30),
codigoobrasocial tinyint unsigned
);
create table obrassociales(
codigo tinyint unsigned auto_increment,
nombre varchar(15),
domicilio varchar(30),
primary key(codigo)
);
3- Ingrese algunos registros:
insert into obrassociales values (1,'PAMI','Colon 345');
insert into obrassociales values (2,'IPAM','Sucre 98');
insert into obrassociales values (3,'OSDOP','Avellaneda 267');
insert into pacientes values('22333444','Juan Lopez','Guemes 235',1);
insert into pacientes values('23444555','Analia Juarez','Avellaneda 367',1);
insert into pacientes values('24555666','Juan Lopez','Guemes 235',2);
insert into pacientes values('25666777','Jose Ferrero','Urquiza 312',3);
insert into pacientes values('26777888','Hhector Garcia','Caseros 411',3);
insert into pacientes values('27888999','Susana Duarte','Peru 211',3);
4- La clnica ya no atiende a pacientes de la obra social "PAMI". Se quiere elimin
ar de la
tabla "obrassociales" a dicha obra social y de la tabla "pacientes" a todos los
pacientes que
de "PAMI":
delete pacientes,obrassociales
from pacientes as p
join obrassociales as os
on p.codigoobrasocial=os.codigo
where os.nombre='PAMI';
5- Verifique las eliminaciones.
Segundo problema:
Un club de dicta clases de distintos deportes a sus socios. Guarda la informacin
de los deportes
que dicta en una tabla llamada "deportes", los datos de los profesores en "profe
sores" y las
inscipciones en "inscriptos".
1- Elimine las tablas, si existen.
2- Cree las tablas:
create table deportes(
codigo tinyint unsigned auto_increment,
nombre varchar(20) not null,
profesor tinyint unsigned,
primary key(codigo)
);

create table profesores(
codigo tinyint unsigned auto_increment,
nombre varchar(30),
domicilio varchar(30),
primary key(codigo)
);
create table inscriptos(
numerosocio int unsigned,
deporte tinyint unsigned,
ao year not null,
);
3- Ingrese los siguientes registros:
insert into profesores values(1,'Alfredo Perez','Sarmiento 984');
insert into profesores values(2,'Betina Molina','Sucre 356');
insert into profesores values(3,'Carlos Garcia','Urquiza 209');
insert into profesores values(4,'Daniel Morales','Salta 1234');
insert into deportes values(1,'tenis',1);
insert into deportes values(2,'natacion',2);
insert into deportes values(3,'basquet',3);
insert into deportes values(4,'futbol',1);
insert into inscriptos values(102,1,'2006');
insert into inscriptos values(102,2,'2006');
insert into inscriptos values(104,2,'2006');
insert into inscriptos values(104,3,'2006');
insert into inscriptos values(106,1,'2006');
insert into inscriptos values(109,2,'2006');
4- El club ha cancelado el deporte "tenis"; se quiere eliminar dicho deporte de
la tabla "deportes"
y las inscripciones a "tenis" de "inscriptos":
delete deportes,inscriptos
from deportes as d
join inscriptos as i
on d.codigo=i.deporte
where d.nombre='tenis';
5- Verifique las eliminaciones.
6- El profesor "Carlos Garca" renunci al club. Se quiere borrar a dicho profesor d
e la
tabla "profesores" y eliminar todos los deportes que dictaba "Carlos Garca", adems
, de todas las
inscripciones a todos los deportes que dictaba dicho profesor:
delete inscriptos,profesores,deportes
from inscriptos as i
join deportes as d
on d.codigo=i.deporte
join profesores as p
on d.profesor=p.codigo
where p.nombre='Carlos Garcia';
7- Verifique las eliminaciones en todas las tablas involucradas.
<------------------------------------------------------------------>
83 - Chequear y reparar tablas (check - repair)
Para chequear el estado de una tabla usamos "check table":
check table libros;
"check table" chequea si una o ms tablas tienen errores. Esta sentencia devuelve
la siguiente informacin: en la columna "Table" muestra el nombre de la tabla; en
"Op" muestra siempre "check"; en "Msg_type" muestra "status", "error", "info" o
"warning" y en "Msg_text" muestra un mensaje, generalmente es "OK".
Existen distintas opciones de chequeo de una tabla, si no se especifica, por def
ecto es "medium".
Los tipos de chequeo son:
- quick: no controla los enlaces incorrectos de los registros.
- fast: controla nicamente las tablas que no se han cerrado en forma correcta.
- changed: nicamente controla las tablas que se han cambiado desde el ltimo cheque
o o que no se cerraron correctamente.
- medium: controla los registros para verificar que los enlaces borrados estn bie
n.
- extended: realiza una bsqueda completa para todas las claves de cada registro.
Se pueden combinar las opciones de control, por ejemplo, realizamos un chequeo rp
ido de la tabla "libros" y verificamos si se cerr correctamente:
check table libros fast quick;
Para reparar una tabla corrupta usamos "repair table":
repair table libros;
"repair table" puede recuperar los datos de una tabla.
Devuelve la siguiente informacin: en la columna "Table" nuestra el nombre de la t
abla; en "Op" siempre muestra "repair"; en "Msg_type" muestra "status", "error",
"info" o "warning" y en "Msg_text" muestra un mensaje que genealmente es "OK".
<------------------------------------------------------------------>
84 - Encriptacin de datos (encode - decode)
Las siguientes funciones encriptan y desencriptan valores.
Si necesitamos almacenar un valor que no queremos que se conozca podemos encript
ar dicho valor, es decir, transformarlo a un cdigo que no pueda leerse.
Con "encode" se encripta una cadena. La funcin recibe 2 argumentos: el primero, l
a cadena a encriptar; el segundo, una cadena usada como contrasea para luego dese
ncriptar:
select encode('feliz','dia');
El resultado es una cadena binaria de la misma longitud que el primer argumento.
Con "decode" desencriptamos una cadena encriptada con "encode". Esta funcin recib
e 2 argumentos: el primero, la cadena a desencriptar; el segundo, la contrasea:
select decode('7','dia');
Si la cadena de contrasea es diferente a la ingresada al encriptar, el resultado
ser incorrecto.
Retomamos la tabla "usuarios" que constaba de 2 campos: nombre del usuario (varc
har de 30) y clave (varchar de 10).
Podemos ingresar registros encriptando la clave:
insert into usuarios values ('MarioPerez',encode('Marito','octubre'));
La forma ms segura es no transferir la contrasea a travs de la conexin, para ello po
demos almacenar la clave en una variable y luego insertar la clave encriptada:
select @clave:=encode('RealMadrid','ganador');
insert into usuarios values ('MariaGarcia',@clave);
Veamos los registros ingresados:
select * from usuarios;
Desencriptamos la clave del usuario "MarioPerez":
select decode(clave,'octubre') from usuarios
where nombre='MarioPerez';
Desencriptamos la clave del usuario "MariaGarcia":
select decode(clave,'ganador') from usuarios
where nombre='MariaGarcia';
<------------------------------------------------------------------>

S-ar putea să vă placă și