Este documento contiene varios ejemplos prácticos de SQL que muestran: 1) la creación de tablas y claves primarias y foráneas, 2) inserción, modificación y eliminación de datos, y 3) consultas básicas utilizando condiciones, ordenamiento y otros operadores. Se explican conceptos como integridad referencial, restricciones en actualizaciones y borrados, y modificación de estructuras de tablas.
6. Esto es un ejemplo de intento de borrado de una tupla que tiene un campo que
aparece como clave foránea en otra tabla. Por omision se aplica la condición
de restrict y no se puede borrar hasta que no borre la tupla de la tabla hija.
7. Esto es un ejemplo de intento de actualización de una tupla que tiene un campo que
aparece como clave foránea en otra tabla. Por omision se aplica la condición
de restrict y no se puede actualizar.
8. DROP SCHEMA IF EXISTS Tablas2;
CREATE SCHEMA Tablas2;
USE Tablas2;
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');
10. Para probar la restricción ON UPDATE CASCADE … actualizamos el valor
p
de un DNI. El resultado debe de ser que se actualiza la tabla padre y la hija
11. Se observa que se han actualizado las tablas padre e hija
12. Si ahora borramos una tupla de la tabla padre se borra la tupla
correspondiente de la tabla hija.
13. DROP SCHEMA IF EXISTS Tablas3;
CREATE SCHEMA Tablas3;
USE Tablas3;
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=InnoDB;
)ENGINE I DB
INSERT INTO Cliente VALUES ('7211545v','Carlos','Martinez Lopez');
INSERT INTO Pedidos VALUES ('122','2010/01/05',7,'7211545v');
14. La restricción más adecuada en la mayoría de los casos es
evitar realizar borrados en cascada y sin embargo si
actualizar en cascada
16. A diferencia del ejemplo de la Tablas2 ahora no se puede
borrar una tupla de la tabla padre por la restricción ON DELETE RESTRICT.
17. Nótese una cuestión que a veces es causa de confusión.
Aunque es en la tabla hija donde se escribe la restricción de la clave foránea
foránea,
es decir, que un atributo depende de la clave de otra tabla….
Se puede borrar sin ningún problema una tupla de una tabla que contiene
una clave foránea 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.
18. Como se ve en la figura la tabla de pedidos está vacía y
la tabla de clientes está intacta.
intacta
19. DROP SCHEMA IF EXISTS Tablas4;
CREATE SCHEMA Tablas4;
USE Tablas4;
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 did VALUES ('122' '2010/01/0 ' ' 211 4 ')
Pedidos ('122','2010/01/05',7,'7211545v');
20. Aquí
A í mostramos el ejemplo de intentar incorporar una fila nueva de
t l j l d i t t i fil d
pedidos de un cliente que no existe en la tabla de clientes. Las
reglas de integridad referencial nos lo impiden
33. 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 DATE,
ec a ,
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','Garzón Rodriguez');
INSERT INTO Personal VALUES ('7211542v','Antonio','Marina Esquivel');
INSERT INTO Personal VALUES ('7211543v','Cesar','Bernal SanJose );
( 7211543v Cesar Bernal SanJose');
INSERT INTO Personal VALUES ('7211544v','Rodrigo','Alonso Vera');
INSERT INTO Personal VALUES ('7211546v','Maria','Lopez Gomez');
38. 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 DATE,
ec a ,
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','Garzón Rodriguez');
INSERT INTO Cliente VALUES ('7211542v','Antonio','Marina Esquivel');
( 7211542v Antonio Marina 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');
39. Vamos a probar el comando actualizar de SQL.
Para ello actualizamos todas las tuplas en la que aparece Maria
40.
41. En este ejemplo vemos como es imposible actualizar los dos registros
en l que aparece en nombre el valor Carmen a un mismo DNI
los b l l C i
ya que DNI tiene la restricción de clave primaria
46. Tabla: Información_Ventas
Selección Básica:
De esta forma eliminamos los duplicados que genera la consulta SELECT
47. Tabla: Información_Ventas
Se ecc ó Condicional Simple:
Selección Co d c o a S p e
Tiendas cuyas ventas son mayores de 1000
48. DROP SCHEMA IF EXISTS SELECT2;
CREATE SCHEMA SELECT2;
USE SELECT2;
create table Información_Ventas(
Información Ventas(
Tienda VARCHAR(10),
Ventas INTEGER,
Fecha DATE
)ENGINE=InnoDB;
create table Zona_Ventas(
Región VARCHAR(10),
Tienda VARCHAR(10)
( )
)ENGINE=InnoDB;
INSERT INTO Información_Ventas VALUES ('Madrid',1500,'2010/01/05');
INSERT INTO Información_Ventas VALUES ('Sevilla',250,'2010/01/08');
Información Ventas ( Sevilla 250 2010/01/08 );
INSERT INTO Información_Ventas VALUES ('Cuenca',300,'2010/01/07');
INSERT INTO Información_Ventas VALUES ('Barcelona',700,'2010/01/08');
INSERT INTO Zona_Ventas VALUES ('Centro-Sur','Madrid');
Z V t ('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');
49. Tabla: Información_Ventas
Selección Condicional Simple Compuesta:
Tiendas cuyas ventas son mayores de 1000 ó las ventas están
comprendidas entre 275 y 500
50. Tabla: Información_Ventas
Selección Tuplas en Función de Valores (IN):
Información completa de lasTiendas de “Madrid” y “Sevilla”
51. Tabla: Información_Ventas
Selección Búsqueda de Patrones (LIKE):
Seleccion de tuplas que contengan un patrón
52. DROP SCHEMA IF EXISTS SELECT3;
O SC S SS C
CREATE SCHEMA SELECT3;
USE SELECT3;
create table Información_Ventas(
Tienda VARCHAR(10),
Ventas INTEGER,
Fecha DATE
)ENGINE=InnoDB;
create table Zona_Ventas(
Región VARCHAR(10),
Tienda
Ti d VARCHAR(10)
)ENGINE=InnoDB;
INSERT INTO Información_Ventas VALUES ('Madrid',1500,'2010/01/05');
INSERT INTO Información_Ventas VALUES (
_ ('Sevilla',250,'2010/01/08');
)
INSERT INTO Información_Ventas VALUES ('Cuenca',300,'2010/01/07');
INSERT INTO Información_Ventas VALUES ('Barcelona',1500,'2010/01/08');
INSERT INTO Zona_Ventas VALUES ('Centro-Sur','Madrid');
Zona Ventas ( 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');
53. Tabla: Información_Ventas
Selección Ordenación de Resultados (ORDER BY):
Selección de Tiendas ordenadas por el volumen de ventas en
Orden descendente
54. Tabla: Información_Ventas
Selección Ordenación 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
55. DROP SCHEMA IF EXISTS SELECT4;
CREATE SCHEMA SELECT4;
USE SELECT4;
create table Información_Ventas(
(
Tienda VARCHAR(10),
Ventas INTEGER,
Fecha DATE
)ENGINE=InnoDB;
create table Zona_Ventas(
Región VARCHAR(10),
Tienda VARCHAR(10)
)ENGINE=InnoDB;
INSERT INTO Información_Ventas VALUES ('Madrid',1500,'2010/01/05');
INSERT INTO Información_Ventas VALUES ('Sevilla',250,'2010/01/08');
INSERT INTO Información_Ventas VALUES ('Madrid',300,'2010/01/07');
( , , );
INSERT INTO Información_Ventas VALUES ('Barcelona',700,'2010/01/08');
INSERT INTO Zona_Ventas VALUES ('Centro-Sur','Madrid');
INSERT INTO Zona_Ventas VALUES ('Centro-Sur','Sevilla');
Zona Ventas ( Centro-Sur Sevilla );
INSERT INTO Zona_Ventas VALUES ('Noreste','Zaragoza');
INSERT INTO Zona_Ventas VALUES ('Noreste','Barcelona');
56. Tabla: Información_Ventas
Selección Funciones Aritméticas:
S l ió F i A it éti
Seleccionar todas las tuplas de la tabla “Información_Ventas’
(ya
( que no existe clausula when) , obteniendo una relacion(una tabla).
i t l l h ) bt i d l i ( t bl )
Luego proyectamos por el campo Ventas y hacemos una operación.
60. Tabla: Información_Ventas
Selección con Grupos:
Esta consulta no tendría mucho sentido ya en un grupo la fecha de
cada tupla es diferente
61. La condición que aplica HAVING tiene que ser un operador
que abarque a todos los miembros del grupo. Si se refiere a un
campo que puede ser diferente en los miembros del grupo no funciona
p q p g p
62. Tiendas y suma de ventas agrupadas por iguales valores de tienda y ventas
66. DROP SCHEMA IF EXISTS JOIN1;
CREATE SCHEMA JOIN1;
USE JOIN1;
create table Información_Ventas(
Tienda VARCHAR(10),
Ventas INTEGER,
V t INTEGER
Fecha DATE
)ENGINE=InnoDB;
create table Zona_Ventas(
Región VARCHAR(10),
Tienda VARCHAR(10)
)ENGINE=InnoDB;
INSERT INTO Información_Ventas VALUES ('Madrid',1500,'2010/01/05');
I f ió V VA UES ('M d id' 1 00 '2010/01/0 ')
INSERT INTO Información_Ventas VALUES ('Sevilla',250,'2010/01/08');
INSERT INTO Información_Ventas VALUES ('Madrid',300,'2010/01/07');
INSERT INTO Información_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');
73. DROP SCHEMA IF EXISTS CASE1;
CREATE SCHEMA CASE1;
USE CASE1;
create table Información_Ventas(
Tienda VARCHAR(10),
Ventas INTEGER,
Fecha DATE
)ENGINE=InnoDB;
create table Zona_Ventas(
Región VARCHAR(10),
Tienda VARCHAR(10)
)ENGINE=InnoDB;
INSERT INTO Información_Ventas VALUES ('Madrid',1500,'2010/01/05');
INSERT INTO Información_Ventas VALUES ('Sevilla',250,'2010/01/08');
INSERT INTO Información_Ventas VALUES ('Cuenca',300,'2010/01/07');
INSERT INTO Información_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 VALUES ('N
Z V ('Noreste','Barcelona');
' 'B l ')
75. DROP SCHEMA IF EXISTS UNION1;
CREATE SCHEMA UNION1;
USE UNION1;
create table Ventas_tienda(
Tienda VARCHAR(10),
Ventas INTEGER,
Fecha DATE
)ENGINE=InnoDB;
create table Ventas_Internet(
Fecha DATE,
Ventas INTEGER
)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 VALUES ('B
V i d VA UES ('Barcelona',1500,'2010/01/08');
l ' 1 00 '2010/01/08')
INSERT INTO Ventas_Internet VALUES ('2010/01/07',250);
INSERT INTO Ventas_Internet VALUES ('2010/01/10',535);
V t I t t ('2010/01/10' 535)
INSERT INTO Ventas_Internet VALUES ('2010/01/11',320);
INSERT INTO Ventas_Internet VALUES ('2010/01/12',750);