Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Ejemplos SQL
Ejemplos SQL
EJEMPLOSPRCTICOSSQL
INTEGRIDADREFERENCIAL
create table Cliente( Dni VARCHAR(10), Nombre VARCHAR(10), Apellido p VARCHAR(10), ( ), PRIMARY KEY (Dni) )ENGINE=InnoDB; create table Pedidos( npedido INTEGER, fecha DATE, Cantidad DOUBLE, cliente_Dni VARCHAR(10), PRIMARY KEY (npedido), ( did ) FOREIGN KEY (cliente_Dni) REFERENCES Cliente(Dni)
) )ENGINE=InnoDB; ;
INSERT INTO Cliente VALUES ('7211545v','Carlos','Martinez Lopez'); INSERT INTO Pedidos VALUES ('122' ( 122 ,'2010/01/05' 2010/01/05 ,7, 7 '7211545v'); 7211545v );
TABLA: Cliente
TABLA: Pedidos
Esto es un ejemplo de intento de borrado de una tupla que tiene un campo que aparece como clave fornea en otra tabla. Por omision se aplica la condicin de restrict y no se puede borrar hasta que no borre la tupla de la tabla hija.
Esto es un ejemplo de intento de actualizacin de una tupla que tiene un campo que aparece como clave fornea en otra tabla. Por omision se aplica la condicin de restrict y no se puede actualizar.
create table Cliente( Dni VARCHAR(10), Nombre VARCHAR(10), Apellido VARCHAR(10), PRIMARY KEY (Dni) )ENGINE=InnoDB;
create table Pedidos( npedido INTEGER, fecha DATE, Cantidad DOUBLE, cliente Dni VARCHAR(10) cliente_Dni VARCHAR(10), PRIMARY KEY (npedido), FOREIGN KEY (cliente_Dni) REFERENCES Cliente(Dni) ON DELETE CASCADE ON UPDATE CASCADE )ENGINE=InnoDB;
INSERT INTO Cliente VALUES ('7211545v','Carlos','Martinez Lopez'); INSERT INTO Pedidos VALUES ('122','2010/01/05',7,'7211545v');
TABLA: Cliente
TABLA: Pedidos
Para p probar la restriccin ON UPDATE CASCADE actualizamos el valor de un DNI. El resultado debe de ser que se actualiza la tabla padre y la hija
Si ahora borramos una tupla de la tabla padre se borra la tupla correspondiente de la tabla hija.
create table Cliente( Dni VARCHAR(10), Nombre VARCHAR(10), Apellido VARCHAR(10), PRIMARY KEY (Dni) )ENGINE=InnoDB; create table Pedidos( npedido INTEGER, fecha DATE, Cantidad DOUBLE, cliente Dni VARCHAR(10) cliente_Dni VARCHAR(10), PRIMARY KEY (npedido), FOREIGN KEY (cliente_Dni) REFERENCES Cliente(Dni) ON DELETE RESTRICT ON UPDATE CASCADE
)ENGINE I )ENGINE=InnoDB; DB
INSERT INTO Cliente VALUES ('7211545v','Carlos','Martinez Lopez'); INSERT INTO Pedidos VALUES ('122','2010/01/05',7,'7211545v');
La restriccin ms adecuada en la mayora de los casos es evitar realizar borrados en cascada y sin embargo si actualizar en cascada
A diferencia del ejemplo de la Tablas2 ahora no se puede borrar una tupla de la tabla padre por la restriccin ON DELETE RESTRICT.
Ntese una cuestin que a veces es causa de confusin. Aunque es en la tabla hija donde se escribe la restriccin de la clave fornea fornea, es decir, que un atributo depende de la clave de otra tabla. Se puede borrar sin ningn problema una tupla de una tabla que contiene una clave fornea sin afectar a la tupla correspondiente de la tabla padre En la figura se ve el ejemplo de borrar una fila en la tabla de pedidos.
Como se ve en la figura la tabla de pedidos est vaca y la tabla de clientes est intacta. intacta
create table Cliente( Dni VARCHAR(10), Nombre VARCHAR(10), Apellido VARCHAR(10), PRIMARY KEY (Dni) )ENGINE=InnoDB;
create table Pedidos( npedido INTEGER, fecha DATE, Cantidad DOUBLE, cliente_Dni VARCHAR(10), PRIMARY KEY (npedido), ( p ), FOREIGN KEY (cliente_Dni) REFERENCES Cliente(Dni) ON DELETE RESTRICT ON UPDATE CASCADE )ENGINE=InnoDB;
INSERT INTO Cliente VALUES ('7211545v','Carlos','Martinez Lopez'); INSERT INTO P Pedidos did VALUES ('122' ('122','2010/01/05',7,'7211545v'); '2010/01/0 ' ' 211 4 ')
Aqu A mostramos t el l ejemplo j l de d intentar i t t incorporar i una fila fil nueva de d pedidos de un cliente que no existe en la tabla de clientes. Las reglas de integridad referencial nos lo impiden
Ahora si que podemos incorporar una tupla nueva de pedido con el cliente incorporado en la tabla de clientes
EJEMPLOSPRCTICOSSQL
MODIFICACINTABLAS
DROP SCHEMA IF EXISTS Tablas5; T bl 5 CREATE SCHEMA Tablas5; USE Tablas5; create table Cliente( Dni VARCHAR(10), Nombre VARCHAR(10), Apellido VARCHAR(10), PRIMARY KEY (Dni) )ENGINE=InnoDB;
create table Pedidos( npedido INTEGER, INTEGER fecha DATE, Cantidad DOUBLE, cliente_Dni VARCHAR(10), PRIMARY KEY (npedido), FOREIGN KEY (cliente_Dni) REFERENCES Cliente(Dni) ON DELETE RESTRICT ON UPDATE CASCADE
)ENGINE=InnoDB;
INSERT INTO Cliente VALUES ('7211545v','Carlos','Martinez Lopez'); INSERT INTO Pedidos VALUES ('122' ( 122 ,'2010/01/05' 2010/01/05 ,7, 7 '7211545v 7211545v'); );
Estamos tratando de borrar una tabla padre. Las restricciones de la BD no nos permite al tener asociada la tabla una clave ajena
La tabla hija pedidos se puede borrar sin problemas. Es donde se haya la clave ajena
EJEMPLOSPRCTICOSSQL
INSERCINDATOSENTABLAS
DROP SCHEMA IF EXISTS Tablas6; CREATE SCHEMA Tablas6; USE Tablas6; create table Cliente( Dni VARCHAR(10), Nombre VARCHAR(10), Apellido VARCHAR(40), PRIMARY KEY (Dni) )ENGINE=InnoDB; create table Pedidos( npedido INTEGER, fecha ec a DATE, , Cantidad DOUBLE, cliente_Dni VARCHAR(10), PRIMARY KEY (npedido), FOREIGN KEY (cliente_Dni) REFERENCES Cliente(Dni) ON DELETE RESTRICT ON UPDATE CASCADE )ENGINE=InnoDB; create table Personal( Dni VARCHAR(10), Nombre VARCHAR(10), Apellido VARCHAR(40), PRIMARY KEY (Dni) )ENGINE=InnoDB; INSERT INTO Cliente VALUES ('7211545v','Carlos','Martinez Lopez'); INSERT INTO Pedidos VALUES ('122','2010/01/05',7,'7211545v'); INSERT INTO Personal VALUES ('7211541v','Juan','Garzn Rodriguez'); INSERT INTO Personal VALUES ('7211542v','Antonio','Marina Esquivel'); INSERT INTO Personal VALUES ('7211543v' ( 7211543v ,'Cesar' Cesar ,'Bernal Bernal SanJose SanJose'); ); INSERT INTO Personal VALUES ('7211544v','Rodrigo','Alonso Vera'); INSERT INTO Personal VALUES ('7211546v','Maria','Lopez Gomez');
TABLA: Cliente
TABLA: Pedidos
TABLA: Personal
Con este comando que es un mezcla de INSERT INTO y SELECT conseguimos meter en la tabla cliente 5 tuplas
EJEMPLOSPRCTICOSSQL
ACTUALIZACINDATOSENTABLAS
DROP SCHEMA IF EXISTS Tablas7; CREATE SCHEMA Tablas7; USE Tablas7; create table Cliente( Dni VARCHAR(10), Nombre VARCHAR(10), Apellido VARCHAR(40), PRIMARY KEY (Dni) )ENGINE=InnoDB; create table Pedidos( npedido INTEGER, fecha ec a DATE, , Cantidad DOUBLE, cliente_Dni VARCHAR(10), PRIMARY KEY (npedido), FOREIGN KEY (cliente_Dni) REFERENCES Cliente(Dni) ON DELETE RESTRICT ON UPDATE CASCADE )ENGINE=InnoDB; create table Personal( Dni VARCHAR(10), Nombre VARCHAR(10), Apellido VARCHAR(40), PRIMARY KEY (Dni) )ENGINE=InnoDB; INSERT INTO Cliente VALUES ('7211545v','Carlos','Martinez Lopez'); INSERT INTO Pedidos VALUES ('122','2010/01/05',7,'7211545v'); INSERT INTO Cliente VALUES ('7211541v','Juan','Garzn Rodriguez'); INSERT INTO Cliente VALUES ('7211542v' ( 7211542v ,'Antonio' Antonio ,'Marina Marina Esquivel'); Esquivel ); INSERT INTO Cliente VALUES ('7211543v','Cesar','Bernal SanJose'); INSERT INTO Cliente VALUES ('7211544v','Maria','Alonso Vera'); INSERT INTO Cliente VALUES ('7211546v','Maria','Lopez Gomez');
Vamos a probar el comando actualizar de SQL. Para ello actualizamos todas las tuplas en la que aparece Maria
En este ejemplo vemos como es imposible actualizar los dos registros en los l que aparece en nombre b el l valor l Carmen C a un mismo i DNI ya que DNI tiene la restriccin de clave primaria
EJEMPLOSPRCTICOSSQL
CONSULTASBSICASCONSELECT
DROP SCHEMA IF EXISTS SELECT1; CREATE SCHEMA SELECT1; USE SELECT1; create table Informacin Informacin_Ventas( Ventas( Tienda VARCHAR(10), Ventas INTEGER, Fecha DATE ) )ENGINE=InnoDB; ;
create table Zona_Ventas( Regin g VARCHAR(10), ( ), Tienda VARCHAR(10) )ENGINE=InnoDB; INSERT INTO Informacin_Ventas VALUES ( ('Madrid',1500,'2010/01/05'); , , ); INSERT INTO Informacin_Ventas VALUES ('Sevilla',250,'2010/01/08'); INSERT INTO Informacin_Ventas VALUES ('Madrid',300,'2010/01/07'); INSERT INTO Informacin_Ventas VALUES ('Barcelona',700,'2010/01/08');
INSERT INTO Zona_Ventas VALUES ('Centro-Sur','Madrid'); INSERT INTO Zona_Ventas VALUES ('Centro-Sur','Sevilla'); INSERT INTO Zona_Ventas VALUES ( ('Noreste','Zaragoza'); , g ); INSERT INTO Zona_Ventas VALUES ('Noreste','Barcelona');
TABLA: Informacion_ventas
TABLA:Zona_Ventas
Tabla: Informacin_Ventas
Tabla: Informacin_Ventas
Seleccin Bsica: De esta forma eliminamos los duplicados que genera la consulta SELECT
Tabla: Informacin_Ventas
Seleccin Se ecc Co Condicional dco a S Simple: pe Tiendas cuyas ventas son mayores de 1000
DROP SCHEMA IF EXISTS SELECT2; CREATE SCHEMA SELECT2; USE SELECT2; create table Informacin_Ventas( Informacin Ventas( Tienda VARCHAR(10), Ventas INTEGER, Fecha DATE )ENGINE=InnoDB;
INSERT INTO Informacin_Ventas VALUES ('Madrid',1500,'2010/01/05'); INSERT INTO Informacin_Ventas Informacin Ventas VALUES ('Sevilla' ( Sevilla ,250, 250 '2010/01/08'); 2010/01/08 ); INSERT INTO Informacin_Ventas VALUES ('Cuenca',300,'2010/01/07'); INSERT INTO Informacin_Ventas VALUES ('Barcelona',700,'2010/01/08');
INSERT INTO Zona_Ventas Z V t VALUES ('Centro-Sur','Madrid'); ('C t S ' 'M d id') INSERT INTO Zona_Ventas VALUES ('Centro-Sur','Sevilla'); INSERT INTO Zona_Ventas VALUES ('Noreste','Zaragoza'); INSERT INTO Zona_Ventas VALUES ('Noreste','Barcelona');
Tabla: Informacin_Ventas
Seleccin Condicional Simple Compuesta: Tiendas cuyas ventas son mayores de 1000 las ventas estn comprendidas entre 275 y 500
Tabla: Informacin_Ventas
Seleccin Tuplas en Funcin de Valores (IN): Informacin completa de lasTiendas de Madrid y Sevilla
Tabla: Informacin_Ventas
create table Informacin_Ventas( Tienda VARCHAR(10), Ventas INTEGER, Fecha DATE )ENGINE=InnoDB;
create table Zona_Ventas( Regin VARCHAR(10), Ti d VARCHAR(10) Tienda )ENGINE=InnoDB; INSERT INTO Informacin_Ventas VALUES ('Madrid',1500,'2010/01/05'); INSERT INTO Informacin_Ventas _ VALUES ( ('Sevilla',250,'2010/01/08'); ) INSERT INTO Informacin_Ventas VALUES ('Cuenca',300,'2010/01/07'); INSERT INTO Informacin_Ventas VALUES ('Barcelona',1500,'2010/01/08');
INSERT INTO Zona_Ventas Zona Ventas VALUES ('Centro-Sur' ( Centro-Sur ,'Madrid'); Madrid ); INSERT INTO Zona_Ventas VALUES ('Centro-Sur','Sevilla'); INSERT INTO Zona_Ventas VALUES ('Noreste','Zaragoza'); INSERT INTO Zona_Ventas VALUES ('Noreste','Barcelona');
Tabla: Informacin_Ventas
Seleccin Ordenacin de Resultados (ORDER BY): Seleccin de Tiendas ordenadas por el volumen de ventas en Orden descendente
Tabla: Informacin_Ventas
Seleccin Ordenacin de Resultados (ORDER BY): En este ejemplo se clasifican las tuplas en primer lugar en orden descendente del campo Ventas y luego si hay tuplas del mismo valor por orden descentente de fecha
DROP SCHEMA IF EXISTS SELECT4; CREATE SCHEMA SELECT4; USE SELECT4; create table Informacin_Ventas( ( Tienda VARCHAR(10), Ventas INTEGER, Fecha DATE )ENGINE=InnoDB; create table Zona_Ventas( Regin VARCHAR(10), Tienda VARCHAR(10) )ENGINE=InnoDB;
INSERT INTO Informacin_Ventas VALUES ('Madrid',1500,'2010/01/05'); INSERT INTO Informacin_Ventas VALUES ('Sevilla',250,'2010/01/08'); INSERT INTO Informacin_Ventas VALUES ( ('Madrid',300,'2010/01/07'); , , ); INSERT INTO Informacin_Ventas VALUES ('Barcelona',700,'2010/01/08');
INSERT INTO Zona_Ventas VALUES ('Centro-Sur','Madrid'); INSERT INTO Zona_Ventas Zona Ventas VALUES ('Centro-Sur' ( Centro-Sur ,'Sevilla'); Sevilla ); INSERT INTO Zona_Ventas VALUES ('Noreste','Zaragoza'); INSERT INTO Zona_Ventas VALUES ('Noreste','Barcelona');
Tabla: Informacin_Ventas
S l Seleccin i Funciones F i Aritmticas: A it ti Seleccionar todas las tuplas de la tabla Informacin_Ventas ( que no existe (ya i t clausula l l when) h ) , obteniendo bt i d una relacion(una l i ( tabla). t bl ) Luego proyectamos por el campo Ventas y hacemos una operacin.
Tabla: Informacin_Ventas
Tabla: Informacin_Ventas
Tabla: Informacin_Ventas
Seleccin Funciones Aritmticas con Grupos: Ventas agrupadas por tiendas de las tiendas cuyas ventas Son superiores a 1500
Tabla: Informacin_Ventas
Seleccin con Grupos: Esta consulta no tendra mucho sentido ya en un grupo la fecha de cada tupla es diferente
La condicin que aplica HAVING tiene que ser un operador que abarque a todos los miembros del grupo. Si se refiere a un p que q puede p ser diferente en los miembros del grupo g p no funciona campo
Seleccin con Grupos: Suma de las ventas totales de las tiendas agrupadas por el nombre de Madrid
Seleccin Se ecc co con G Grupos: upos Mximo de ventas de las tiendas agrupadas por el nombre
EJEMPLOSPRCTICOSSQL
JOINNATURALCONSELECT
DROP SCHEMA IF EXISTS JOIN1; CREATE SCHEMA JOIN1; USE JOIN1; create table Informacin_Ventas( Tienda VARCHAR(10), V t INTEGER Ventas INTEGER, Fecha DATE )ENGINE=InnoDB; create table Zona_Ventas( Regin VARCHAR(10), Tienda VARCHAR(10) )ENGINE=InnoDB; INSERT INTO Informacin_Ventas I f i V VALUES VA UES ('Madrid',1500,'2010/01/05'); ('M d id' 1 00 '2010/01/0 ') INSERT INTO Informacin_Ventas VALUES ('Sevilla',250,'2010/01/08'); INSERT INTO Informacin_Ventas VALUES ('Madrid',300,'2010/01/07'); INSERT INTO Informacin_Ventas VALUES ('Barcelona',700,'2010/01/08');
INSERT INTO Zona_Ventas VALUES ('Centro-Sur','Madrid'); INSERT INTO Zona_Ventas VALUES ('Centro-Sur','Sevilla'); INSERT INTO Zona_Ventas VALUES ('Noreste','Zaragoza'); INSERT INTO Zona_Ventas VALUES ('Noreste','Barcelona');
EJEMPLOSPRCTICOSSQL
CONSULTASANIDADAS
TABLA:Zona_Ventas
TABLA: Informacion_ventas
Consulta join equivalente a anidada: Ventas de todas las tiendas de la regin Noreste
DROP SCHEMA IF EXISTS CASE1; CREATE SCHEMA CASE1; USE CASE1; create table Informacin_Ventas( Tienda VARCHAR(10), Ventas INTEGER, Fecha DATE )ENGINE=InnoDB; create table Zona_Ventas( Regin VARCHAR(10), Tienda VARCHAR(10) )ENGINE=InnoDB; INSERT INTO Informacin_Ventas VALUES ('Madrid',1500,'2010/01/05'); INSERT INTO Informacin_Ventas VALUES ('Sevilla',250,'2010/01/08'); INSERT INTO Informacin_Ventas VALUES ('Cuenca',300,'2010/01/07'); INSERT INTO Informacin_Ventas VALUES ('Barcelona',1500,'2010/01/08'); INSERT INTO Zona_Ventas VALUES ('Centro-Sur','Madrid'); INSERT INTO Zona_Ventas VALUES ('Centro-Sur','Sevilla'); INSERT INTO Zona_Ventas VALUES ('Noreste','Zaragoza'); INSERT INTO Zona_Ventas Z V VALUES ('N ('Noreste','Barcelona'); ' 'B l ')
create table Ventas_tienda( Tienda VARCHAR(10), Ventas INTEGER, Fecha DATE )ENGINE=InnoDB;
INSERT INTO Ventas_tienda VALUES ('Madrid',1500,'2010/01/05'); INSERT INTO Ventas_tienda VALUES ('Sevilla',250,'2010/01/08'); INSERT INTO Ventas_tienda VALUES ('Madrid',300,'2010/01/07'); INSERT INTO Ventas_tienda V i d VALUES VA UES ('B ('Barcelona',1500,'2010/01/08'); l ' 1 00 '2010/01/08')
INSERT INTO Ventas_Internet VALUES ('2010/01/07',250); INSERT INTO Ventas_Internet V t I t t VALUES ('2010/01/10',535); ('2010/01/10' 535) INSERT INTO Ventas_Internet VALUES ('2010/01/11',320); INSERT INTO Ventas_Internet VALUES ('2010/01/12',750);