Introducción a SQL (SQL-92)
Introducción
SQL (Structured Query Language / Lenguaje de Consulta Estructurado) es un lenguaje declarativo de acceso a bases de datos relacionales que implementa un DML (Data Manipulation Language / Lenguaje de Manipulación de Datos) y un DDL (Data Definition Language / Lenguaje de definición de datos).
Algunas de sus características son el manejo del álgebra y el cálculo relacional. En la actualidad SQL es el estándar de facto de la inmensa mayoría de los SGBD comerciales.
ANSI lo estandarizó en 1986 (SQL-86 o SQL1) y lo adoptó ISO al año siguiente. En 1992 se lanza un nuevo estándar ampliado y revisado del SQL llamado SQL-92 o SQL2. Ha habido modificaciones posteriores al estándar (la última es del 2006) que recogen los disparadores (triggers), el uso conjunto con XML, las columnas autonuméricas… Además cada implementación comercial incluye modificaciones particulares. Sin embargo el soporte al estándar SQL-92 es general y muy amplio.
DML (Data Manipulation Language / Lenguaje de Manipulación de Datos)
CONSULTAS BÁSICAS
SELECT [TOP X [PERCENT]] [DISTINCT | DISTINCTROW | ALL] columna AS renombrado
FROM tablas
[WHERE condiciones_sobre_registros]
[ORDER BY columnaN [DESC | ASC]]
SELECT DISTINCT color AS colores
FROM piezas
WHERE (codigo > 10000)
AND (color LIKE ‘A%’)
ORDER BY color;— Muestra como ‘colores’ los distintos colores
— de las piezas con código >10000 que empiezan por A, ordenados
— alfabéticamente.
CONSULTAS DE DATOS AGREGADOS
SELECT XXX(columna1) [, columna2…]
FROM tablas
[WHERE condiciones_sobre_registros]
[GROUP BY columna2]
[HAVING condiciones_sobre_agrupaciones]
[ORDER BY columnaN [DESC | ASC]]XXX: Count, Avg, Max, Min, Sum…
SELECT tipo, Avg(precio) AS Precio_Medio
FROM piezas
WHERE precio <> 0
GROUP BY tipo
HAVING Precio_Medio > 10;— Muestra para cada tipo el precio medio, tomando para calcular
— la media los registros con precio y mostrando solo aquellos
— tipos cuyo precio medio es > 10
| a | b | +---+---+ | 2 | - | Sum(a + b) = 8 | 3 | 5 | Sum(a) + Sum(b) = 10 +---+---+
CONDICIONES
expresion1 (< | >= | = | <= | < | <>) expresion2 espresion IS [NOT] NULL expresion BETWEEN x AND y expresion LIKE '%#_%' [ESCAPE '#'] expresion IN (x, y, z) subconsulta condicion1 (AND | OR) condicion2
TABLAS
tabla1 [INNER | LEFT | RIGHT] JOIN tabla2 ON tabla1.columnaN = tabla2.columnaM
SELECT P.numero, P.fecha, C.nombre
FROM pedidos P INNER JOIN clientes C
ON P.cliente = C.codigo;-- Muestra numero y fecha de pedido y nombre del cliente
-- que ha realizado el pedido
--
-- es equivalente aSELECT P.numero, P.fecha, C.nombre
FROM pedidos P, clientes C
ON P.cliente = C.codigo;
OPERADORES CONJUNTISTAS
consulta1 [UNION [DISTINCT] | EXCEPT | INTERSEC] consulta2 (consulta1 y consulta2 son compatibles)
SELECT pais
FROM clientes
UNION
SELECT pais
FROM proveedores;-- Muestra una lista de paises de clientes y proveedores
SUBCONSULTAS
comparacion [ALL | ANY | SOME] consulta
expresion [NOT] IN consulta
[NOT] EXISTS consulta
[NOT] UNIQUE consulta(ANY y SOME son equivalentes)
SELECT dni, nombre
FROM empleados
WHERE salario >=
(SELECT Avg(salario)
FROM empleados);-- Muestra dni y nombre de los empleados que cobran
-- más que la media
SELECT dni, nombre
FROM empleados
WHERE salario > ALL
(SELECT salario
FROM empleados
WHERE nivel=1);-- Muestra dni y nombre de los empleados que cobran
-- más que todos los empleados de nivel 1 (individualmente)
SELECT dni, nombre
FROM comerciales
WHERE ciudad IN(SELECT DISTINCT ciudad
FROM clientes);-- Muestra dni y nombre de los comerciales que residen en
-- la misma ciudad que algún cliente
SELECT codigo, descripcion
FROM piezas P
WHERE NOT EXISTS(SELECT precio
FROM ofertas O
WHERE P.codigo = O.pieza)
AND codigo > 100;-- Muestra codigo y descripcion de las piezas con codigo > 100
-- para las que no existe ninguna oferta
SELECT codigo, descripcion
FROM piezas P
WHERE UNIQUE
(SELECT precio
FROM ofertas O
WHERE P.codigo = O.pieza);-- Muestra codigo y descripcion de las piezas
-- para las que existe una única oferta
MODIFICACIONES
INSERT INTO tabla [columnas]
VALUES (valores)INSERT INTO tabla [columnas]
consultaTRUNCATE TABLE tabla1 [, tabla2...]
DELETE FROM tabla
[WHERE condiciones]
-- Si se va a hacer un borrado incondicional
-- es más óptimo usar
TRUNCATEUPDATE tabla1 [,tabla2...]
SET columnaN = valorN
[, columnaM = valorM ]
WHERE condiciones_sobre_registros
UPDATE articulos A, nuevos_precios N
SET A.precio = N.precio
WHERE A.codigo = N.codigo-- Actualiza la tabla de artículos con nuevos precios de otra tabla.
TRANSACCIONES
COMMIT
ROLLBACK
DDL (Data Definition Language / Lenguaje de definición de datos)
CREATE SCHEMA [IF NOT EXISTS] [catalogo.]esquema
[AUTHORIZATION usuario]
elementosSET SCHEMA esquema
DROP SCHEMA [IF EXISTS] esquema
CREATE DOMAIN [IF NOT EXISTS] dominio [AS] tipo_dato
[DEFAULT valor]
[restricciones]
CREATE DOMAIN d_alta AS date
DEFAULT current_time;
ALTER DOMAIN dominio
{ SET DEFAULT valor |
DROP DEFAULT |
ADD restriccion |
DROP CONSTRAINT restriccion }DROP DOMAIN [IF EXISTS] dominio [RESTRICT | CASCADE]
CREATE TABLE [IF NOT EXISTS] tabla
columna1
[DEFAULT valor]
[restriccion_de_columna]
...
[restriccion_de_tabla]CREATE TABLE tabla AS consulta
CREATE TABLE Copia AS (
SELECT *
FROM Tabla_a_Copiar
);-- Se puede crear una tabla con el resultado de una consulta
[CONSTRAINT nombre_restriccion] -- No es obligatorio pero sí recomendable poner nombre
PRIMARY KEY (columnas) |
FOREIGN KEY (columnas) REFERENCES tabla_ref [columnas]
[ON UPDATE {NO ACTION | SET NULL | SET DEFAULT | CASCADE} ]
[ON DELETE {NO ACTION | SET NULL | SET DEFAULT | CASCADE} ]
UNIQUE (columnas) | -- Lo valores NULL NO se consideran valores igualesCHECK (expresion)
[INITIALLY DEFERRED | INITIALLY IMMEDIATE]
[NOT DEFERRABLE | DEFERRABLE]
CREATE TABLE alumnos (
codigo d_dni CONSTRAINT alumno_cp PRIMARY KEY
nombre VARCHAR(100) NOT NULL,
edad INTEGER
CONSTRAINT CHECK (VALUE>0 AND VALUE <120), universidad VARCHAR(3) NOT NULLCONSTRAINT alumno_ca_univ REFERENCES universidad
ON UPDATE CASCADE,
sexo CHAR(1)CONSTRAINT sexo_ck CHECK (sexo IN ('O', 'A'))
);
ALTER TABLE tabla ADD [COLUMN] definicion_de_columna | definicion_de_restriccion
ALTER TABLE tabla DROP [COLUMN] definicion_de_columna | definicion_de_restriccionALTER TABLE tabla ALTER [COLUMN] columna SET expresion
DROP TABLE [IF EXISTS] tabla1 [, tabla2...]
CREATE ASSERTION restriccion
CHECK condicion
[INITIALLY DEFERRED | INITIALLY IMMEDIATE]
[NOT DEFERRABLE | DEFERRABLE]
CREATE ASSERTION universidad_no_vacia
CHECK ((SELECT Count(1) FROM universidad)>0);
CREATE VIEW vista [(columnas)]
AS consulta
CREATE VIEW piezas_rojas
AS SELECT *
FROM piezas
WHERE color = 'rojo';
DROP VIEW vista