Professional Documents
Culture Documents
Introduccin
En 1986, el ANSI (American National Standard Institute) defini
un estndar para SQL que en 1987 fue adoptado como estndar internacional por la ISO (International Organization for Standardization) Es un lenguaje orientado a la transformacin: transforma los datos de entrada en las salidas requeridas Tiene dos componentes principales:
Un lenguaje de definicin de datos (DDL, Data Definition
Language) para definir la estructura de la base de datos y controlar el acceso a los datos Un lenguaje de manipulacin de datos (DML, Data Manipulation Language) para extraer y actualizar los datos
2
SQL
IBBDD
Definicin de Datos
Identificadores y tipos de datos del estndar Operadores Especiales Restricciones de integridad Instrucciones de definicin Vistas, Procedimientos Almacenados y Triggers Control de acceso Ejemplo
SQL
IBBDD
subrayado (_) No pueden tener ms de 128 caracteres, deben comenzar con una letra y no pueden contener espacios
Tipos de datos y declaraciones:
Booleanos: BOOLEAN Caracteres: CHAR, VARCHAR Numricos exactos: SMALLINT, INT, DEC NUMERIC Numricos aproximados: REAL, DOUBLE PRECISION Fecha y hora: DATE, TIME, TIMESTAMP Intervalos (perodos ao-mes o da-hora): INTERVAL Objetos de gran tamao: CHARACTER LARGE OBJECT, BINARY LARGE OBJECT
IBBDD
SQL
Operadores Especiales
Operador
||
Significado
Concatena cadenas de caracteres
LOWER
UPPER CURRENT_DATE CURRENT_TIME EXTRACT
SQL
IBBDD
Restricciones de Integridad
Tipo
Datos requeridos Restricciones de dominio
Formato
NOT NULL CHECK (condicin)
Ejemplo
apellido VARCHAR NOT NULL sexo CHAR NOT NULL CHECK (sexo IN (M, F))
CREATE DOMAIN nombre [AS] tipo CREATE DOMAIN TipoSexo AS CHAR [DEFAULT DEFAULT M CHECK (VALUE IN (M, opcinPredet] [CHECK F)); cond] Para definir: DROP DOMAIN sexo TipoSexo NOT NULL nombre [RESTRICT | CASCADE]
SQL
IBBDD
Restricciones de Integridad
Tipo
Integridad de entidades
Formato
PRIMARY KEY UNIQUE
Ejemplo
PRIMARY KEY (dni) apellido VARCHAR(15) NOT NULL, nombre VARCHAR(15) NOT NULL, UNIQUE (apellido, nombre) Subclusulas: ON UPDATE opcin ON DELETE opcin Opcin: CASCADE|SET NULL|SET DEFAULT|NO ACTION Sirve para definir restricciones sobre reglas de negocio, por ejemplo para chequear que no se vendan ms unidades que las existentes de un producto
IBBDD
Integridad referencial
FOREIGN KEY (columna [,]) REFERENCES tabla [subclusula] CREATE ASSERTION nombre CHECK condicin
Restricciones generales
SQL
Instrucciones de Definicin
De base de datos: CREATE|DROP SCHEMA De dominios: CREATE|ALTER|DROP DOMAIN De tablas: CREATE|ALTER|DROP TABLE De vistas: CREATE|DROP VIEW
SQL
IBBDD
Vistas
CREATE [OR REPLACE] VIEW nombre_vista [(lista_columnas)] AS sentencia_select
SQL
IBBDD
Vistas
Son resultados dinmicos de una o ms operaciones sobre tablas
para producir otra tabla Una vista es una tabla virtual que se produce cuando es invocada Se utilizan para definir operaciones frecuentes en una base de datos y para modularizar operaciones complejas (igual que las asignaciones en AR) Pueden ser para actualizar tablas, con algunas restricciones:
10
No se puede eliminar filas duplicadas de los resultados Slo se puede usar nombres de columnas en la expresin de seleccin Debe haber slo una tabla origen No puede haber subconsultas sobre la tabla origen No puede haber funciones ni restricciones sobre grupos de filas
IBBDD
SQL
Procedimientos Almacenados
CREATE PROCEDURE nombre_procedimiento ([parmetro[,...]]) [COMMENT 'string'] cuerpo parmetro: [ IN | OUT | INOUT ] nombre_parmetro tipo tipo: Cualquier tipo de dato de SQL cuerpo: sentencia_SQL |BEGIN sentencia_SQL; END
11
SQL
IBBDD
Procedimientos Almacenados
Son procedimientos almacenados en la base de datos (stored
procedures) Para invocar un procedimiento almacenado se usa la sentencia CALL nombre_sp ([parmetro[,...]]) La lista de parmetros encerrada entre parntesis siempre debe estar presente. Si el procedimiento no tiene parmetros, se debe especificar una lista vaca (). Si no se especifica IN (de entrada), OUT (de salida) o INOUT (de entrada y salida) antes del nombre del parmetro, se asume por defecto IN.
12
SQL
IBBDD
13
SQL
IBBDD
Triggers
CREATE TRIGGER nombre_trigger tiempo_activacin tipo_operacin ON nombre_tabla FOR EACH ROW cuerpo tiempo_activacin: { BEFORE | AFTER } tipo_operacin: { INSERT | UPDATE | DELETE }
14
SQL
IBBDD
Triggers
Un trigger (disparador) es un mecanismo de control sobre una tabla, definido
en la base de datos con un nombre, que se activa cuando se ejecuta una operacin especfica sobre la tabla. No se puede definir triggers sobre vistas ni sobre tablas temporales. El tiempo de activacin determina que el cuerpo se ejecute antes (BEFORE) o despus (AFTER) de que cada fila de la tabla sea modificada. El tipo de operacin determina qu modificacin en las filas de la tabla activa al trigger. El cuerpo del trigger es la sentencia que se ejecuta cuando ste se activa. Para ejecutar ms de una sentencia, se debe usar la construccin BEGIN ... END. Las operaciones en cascada sobre claves forneas no activan triggers. Dentro del cuerpo del trigger, se puede referir a las columnas de la tabla asociada usando los alias OLD y NEW. OLD.nombre_columna refiere a una columna de una fila existente antes de que sea actualizada o borrada. NEW.nombre_columna refiere a la columna de una nueva fila a ser insertada o a una fila existente despus de ser actualizada.
IBBDD
15
SQL
Control de Acceso
Concesin de privilegios a otros usuarios
GRANT {listaPrivilegios | ALL PRIVILEGES} ON nombreObjeto TO {listaIdentificadoresAutorizacin | PUBLIC} [WITH GRANT OPTION]
Privilegios
SELECT, DELETE, USAGE INSERT|UPDATE|REFERENCES [(nombreColumna [,])]
Revocacin de privilegios
REVOKE [GRANT OPTION FOR] {listaPrivilegios | ALL PRIVILEGES} ON nombreObjeto FROM {listaIdentificadoresAutorizacin | PUBLIC} [RESTRICT | CASCADE}
16
SQL
IBBDD
Ejemplo
Factura(nroFac, fecha, fPago, dto) Producto(codProd, desc, existAct, existMin, pVAct) VentaProd(nroFac, codProd, cant, pvu) CREATE SCHEMA Facturacion; CREATE DOMAIN IdFactura AS NUMERIC(8); CREATE DOMAIN IdProducto AS CHAR(6); CREATE DOMAIN Precio AS DEC(6, 2);
17
SQL
IBBDD
Ejemplo
Factura(nroFac, fecha, fPago, dto) Producto(codProd, desc, existAct, existMin, pVAct) VentaProd(nroFac, codProd, cant, pvu)
CREATE TABLE Factura(
nroFac IdFactura fecha DATE fPago CHAR(2) NOT NULL, NOT NULL DEFAULT CURRENT_DATE, NOT NULL CHECK (fPago IN (CO, DE, CR, CH)),
dto
NUMERIC(3, 2)
18
SQL
IBBDD
Ejemplo
Factura(nroFac, fecha, fPago, dto) Producto(codProd, desc, existAct, existMin, pVAct) VentaProd(nroFac, codProd, cant, pvu)
CREATE TABLE Producto(
codProd desc existAct IdProducto VARCHAR(30) NUMERIC(4) NOT NULL, NOT NULL, NOT NULL,
existMin
pVAct
NUMERIC(4)
Precio
NOT NULL,
NOT NULL,
19
IBBDD
Ejemplo
Factura(nroFac, fecha, fPago, dto) Producto(codProd, desc, existAct, existMin, pVAct) VentaProd(nroFac, codProd, cant, pvu)
CREATE TABLE VentaProd( nroFac IdFactura NOT NULL, codProd IdProducto NOT NULL, cant SMALLINT NOT NULL, pvu Precio NOT NULL, PRIMARY KEY (nroFac, codProd), FOREIGN KEY (nroFac) REFERENCES Factura ON DELETE NO ACTION ON UPDATE NO ACTION, FOREIGN KEY (codProd) REFERENCES Producto ON DELETE NO ACTION ON UPDATE NO ACTION);
20
SQL
IBBDD
Ejemplo
Factura(nroFac, fecha, fPago, dto) Producto(codProd, desc, existAct, existMin, pVAct) VentaProd(nroFac, codProd, cant, pvu)
CREATE TRIGGER ActProdVta AFTER INSERT ON VentaProducto FOR EACH ROW UPDATE Producto SET existAct = existAct NEW.cant WHERE Producto.codProd = NEW.codProd
21
SQL
IBBDD
Ejemplo
Factura(nroFac, fecha, fPago, dto) Producto(codProd, desc, existAct, existMin, pVAct) VentaProd(nroFac, codProd, cant, pvu)
CREATE TRIGGER ActProdModVta AFTER UPDATE ON VentaProducto FOR EACH ROW BEGIN
IF NEW.codProd <> OLD.codProd THEN # cambi el producto vendido
UPDATE Producto SET existAct = existAct + OLD.cantWHERE Producto.codProd = OLD.codProd; UPDATE Producto SET existAct = existAct - NEW.cant WHERE Producto.codProd = NEW.codProd;
ELSE IF NEW.cant <> OLD.cant THEN # cambi cantidad del mismo producto vendido
UPDATE Producto SET existAct = existAct + OLD.cant NEW.cant WHERE Producto.codProd = OLD.codProd; END IF;
END IF;
END
22
SQL
IBBDD
Ejemplo
Factura(nroFac, fecha, fPago, dto) Producto(codProd, desc, existAct, existMin, pVAct) VentaProd(nroFac, codProd, cant, pvu)
CREATE TRIGGER ActProdAnulVta AFTER DELETE ON VentaProducto FOR EACH ROW UPDATE Producto SET existAct = existAct + OLD.cant WHERE Producto.codProd = OLD.codProd
23
SQL
IBBDD
Manipulacin de Datos
Instrucciones de manipulacin de datos: SELECT, INSERT, UPDATE y DELETE
24
SQL
IBBDD
Equivalencias con el AR
T1||T2 SELECT * FROM T1 NATURAL JOIN T2
(equicombinacin de tuplas de T1 y T2 sobre la foreign key de una que referencie a la primary key de la otra)
(equicombinacin de tablas sobre los campos que se especifiquen cuando se quieren igualar campos que no coincidan con la primary key de una y la foreign key de la otra)
SQL
IBBDD
Operaciones Unarias
Obtencin de tuplas de una nica tabla, con algunos o todos los atributos de la misma tabla
26
SQL
IBBDD
Operaciones Unarias
Factura(nroFac, fecha, fPago, dto) Producto(codProd, desc, existAct, existMin, pVAct) VentaProd(nroFac, codProd, cant, pvu)
Proyeccin o filtro de AR
SQL
27
SQL
IBBDD
Operaciones Unarias
Factura(nroFac, fecha, fPago, dto) Producto(codProd, desc, existAct, existMin, pVAct) VentaProd(nroFac, codProd, cant, pvu)
Seleccin o filtro de tuplas: AR
SQL
28
SQL
IBBDD
Operaciones Unarias
Factura(nroFac, fecha, fPago, dto) Producto(codProd, desc, existAct, existMin, pVAct) VentaProd(nroFac, codProd, cant, pvu)
Proyeccin y seleccin:
AR
SQL
29
SQL
IBBDD
30
SQL
IBBDD
Operaciones de Combinacin
Factura(nroFac, fecha, fPago, dto) Producto(codProd, desc, existAct, existMin, pVAct) VentaProd(nroFac, codProd, cant, pvu)
Combinacin de tablas: pares
AR
SQL
de codProd y la descripcin de productos distintos que tengan la misma descripcin y que no aparezcan invertidos
31
SELECT p1.codProd, p2.codProd, p1.desc FROM Producto p1, Producto p2 WHERE p1.desc=p2.desc AND p1.codProd<p2.codProd;
SQL
IBBDD
Operaciones de Combinacin
Factura(nroFac, fecha, fPago, dto) Producto(codProd, desc, existAct, existMin, pVAct) VentaProd(nroFac, codProd, cant, pvu)
Equicombinacin de tablas:
AR
nroFac, fecha de factura, codProd, desc y cant de productos vendidos en septiembre de 2011
32
SQL
33
SQL
IBBDD
codProd, desc (Producto) codProd, desc (Producto ||VentaProd ||1/9/11 fecha 30/9/11 Factura)
(SELECT codProd, desc FROM Producto) EXCEPT (SELECT codProd, desc FROM Factura NATURAL JOIN VentaProd NATURAL JOIN Producto WHERE EXTRACT(MONTH FROM fecha)=9 AND EXTRACT(YEAR FROM fecha)=2011);
SQL
Algunas versiones de SQL no soportan el operador EXCEPT, y otras usan MINUS en lugar de EXCEPT.
34
SQL
IBBDD
codProd, desc (Producto) codProd, desc (Producto ||VentaProd ||1/9/11 fecha 30/9/11 Factura)
SQL
CRT {(p.codProd, p.desc) | Producto(p) ( f, v) (Factura(f) VentaProd(v) v.nroFac=f.nroFac v.codProd=p.codProd 1/9/11 f.fecha 30/9/11)} SQL SELECT codProd, desc FROM Producto P WHERE NOT EXISTS (SELECT * FROM Factura NATURAL JOIN VentaProd V WHERE EXTRACT(MONTH FROM fecha)=9 AND EXTRACT(YEAR FROM fecha)=2011 AND V.codProd=P.codProd);
IBBDD
(SELECT codProd, desc FROM Producto) EXCEPT (SELECT codProd, desc FROM Factura NATURAL JOIN VentaProd NATURAL JOIN Producto WHERE EXTRACT(MONTH FROM fecha)=9 AND EXTRACT(YEAR FROM fecha)=2011);
35
SQL
36
SQL
IBBDD
descripcin de productos que se hayan vendido todos los das de septiembre de 2011 que hubo ventas
37
SQL
Actualizacin de Tablas
Producto(codProd, desc, existAct, existMin, pVAct)
Incorporar el producto (1235, pendorchos de 9 mm, 50, 10, 5.75):
INSER INTO Producto VALUES (1235, pendorchos de 9 mm, 50, 10, 5.75);
Eliminar el producto 893:
SQL
IBBDD
Ordenamiento de Resultados
Para ordenar las filas de la tabla resultado de una consulta,
SQL provee la clusula ORDER BY para la instruccin SELECT Se debe especificar seguida de la lista de nombres de columnas por las que se desea ordenar los resultados y el sentido de la ordenacin ASC|DESC Si se usa la clusula, debe ser siempre la ltima de la instruccin SELECT
39
SQL
IBBDD
40
SQL
IBBDD
Funciones de Agregacin
Operan sobre una nica columna de una tabla y devuelven un nico
valor Para eliminar valores duplicados antes de emplear la funcin se debe usar la palabra clave DISTINCT antes del nombre de la columna (no tiene efecto con las funciones MIN y MAX) Cuando se usan para toda una tabla, la clusula SELECT no puede contener ninguna otra columna que no sea resultado de una funcin
Funcin
COUNT SUM AVG MIN MAX
41
Retorno
Nmero de valores en una columna Suma de valores de la columna Promedio de valores de la columna Valor mnimo de la columna Valor mximo de la columna
IBBDD
SQL
Operaciones de Agregacin
Factura(nroFac, fecha, fPago, dto) Producto(codProd, desc, existAct, existMin, pVAct) VentaProd(nroFac, codProd, cant, pvu)
Calcular el monto total de
SELECT SUM(cant*pvu*(1dto)) as recaudado FROM VentaProd NATURAL JOIN Factura WHERE fecha = CURRENT_DATE AND fPago = CO;
42
SQL
IBBDD
agregacin pueden devolver valores para grupos de tuplas que tengan valores iguales en una lista de columnas La lista de columnas en las que cada grupo de tuplas tiene que tener el mismo valor se especifica en la clusula GROUP BY y cada elemento de la clusula SELECT debe tener un nico valor para cada grupo Todos los nombres de columnas contenidos en la lista SELECT excepto los que aparezcan en funciones de agregacin deben obligatoriamente aparecer en la clusula GROUP BY ( y no al revs) Cuando se usa la clusula GROUP BY, la clusula SELECT puede contener:
43
Nombres de columnas Funciones de agregacin para cada grupo de tuplas Constantes Expresiones que combinen algunos de los elementos anteriores
IBBDD
SQL
Operaciones de Agregacin
Factura(nroFac, fecha, fPago, dto) Producto(codProd, desc, existAct, existMin, pVAct) VentaProd(nroFac, codProd, cant, pvu)
Calcular el monto total de ventas
SELECT fecha, SUM(cant*pvu*(1-dto)) as totVentas FROM VentaProd NATURAL JOIN Factura WHERE fecha BETWEEN 1-9-11 and 30-9-11 GROUP BY fecha;
fecha BETWEEN 1-9-11 and 30-9-11 EXTRACT(MONTH FROM fecha)=9 AND EXTRACT(YEAR FROM fecha)=2011
44
SQL
IBBDD
Operaciones de Agregacin
Factura(nroFac, fecha, fPago, dto) Producto(codProd, desc, existAct, existMin, pVAct) VentaProd(nroFac, codProd, cant, pvu)
Informar codProd, desc,
existAct y cantidad de unidades vendidas en el mes de septiembre de 2011 en orden ascendente de codProd
SELECT codProd, desc, existAct, SUM(cant) as cantVendida FROM Factura NATURAL JOIN VentaProd NATURAL JOIN Producto WHERE fecha BETWEEN 1-911 and 30-9-11 GROUP BY codProd, desc, existAct ORDER BY codProd;
45
SQL
IBBDD
Operaciones de Agregacin
Factura(nroFac, fecha, fPago, dto) Producto(codProd, desc, existAct, existMin, pVAct) VentaProd(nroFac, codProd, cant, pvu) Informar de cada producto codProd, desc, existAct y cantidad de unidades vendidas en el mes de septiembre de 2011 en orden ascendente de codProd
46
(SELECT P.codProd, desc, existAct, SUM(cant) as cantVendida FROM Factura NATURAL JOIN VentaProd V NATURAL JOIN Producto P WHERE fecha BETWEEN 1-9-11 and 30-9-11 GROUP BY P.codProd, desc, existAct)
UNION
(SELECT codProd, desc, existAct, 0 as cantVendida FROM Producto P WHERE NOT EXISTS (SELECT * FROM Factura NATURAL JOIN VentaProd V WHERE P.codProd=V.codProd and fecha BETWEEN 1-9-11 and 30-9-11)) ORDER BY codProd;
SQL
IBBDD
restringir los grupos que aparecen en la tabla de resultados La funcin de bsqueda de la clusula HAVING debe incluir al menos una funcin de agregacin Cualquier consulta que pueda expresarse utilizando la clusula HAVING puede siempre reescribirse sin utilizarla La clusula HAVING filtra grupos, mientras que la clusula WHERE puede filtrar tuplas que integren los grupos (no se puede usar funciones de agregacin en la clusula WHERE)
47
SQL
IBBDD
Operaciones de Agregacin
Factura(nroFac, fecha, fPago, dto) Producto(codProd, desc, existAct, existMin, pVAct) VentaProd(nroFac, codProd, cant, pvu)
Listar las facturas con su monto
total del mes de septiembre de 2011 que superaron los 100 pesos
SELECT nroFac, fecha, fPago, dto, SUM(cant*pvu*(1-dto)) as montoFac FROM Factura NATURAL JOIN VentaProd WHERE fecha BETWEEN 1-911 and 30-9-11 GROUP BY nroFac, fecha, fPago, dto HAVING montoFac > 100;
48
SQL
IBBDD
Operaciones de Agregacin
Factura(nroFac, fecha, fPago, dto) Producto(codProd, desc, existAct, existMin, pVAct) VentaProd(nroFac, codProd, cant, pvu) Listar las facturas y la cantidad de productos distintos (lneas) de cada una del mes de septiembre de 2011 y de ms de 2 productos
SELECT nroFac, fecha, fPago, dto, COUNT(codProd) as cantProd FROM Factura NATURAL JOIN VentaProd WHERE fecha BETWEEN 1-911 and 30-9-11 GROUP BY nroFac, fecha, fPago, dto HAVING cantProd > 2;
49
SQL
IBBDD