SQL: Structured Query Language: O C Tub R E 2 0 2 3
SQL: Structured Query Language: O C Tub R E 2 0 2 3
O C TUB R E 2 0 2 3
Intalación de postgres
( id CHAR(9),
descripcion CHAR(20),
grado INTEGER);
TRUNCATE
DEFAULT
Aplicado sólo a las instrucciones INSERT
Sólo un DEFAULT por columna
Ejemplo:
ALTER TABLE alumno
MODIFY apellido_materno DEFAULT ‘DESCONOCIDO’;
Manipulación de Objetos
C O N SU LTAS, IN S E RC I Ó N , M O DI F I C AC I ÓN Y
E L I M IN AC IÓN D E TU P L A S .
Inserción de Datos
UPDATE nombre_tabla
SET atributo_1 = valor1,
...,
atributo_n = valorn;
UPDATE tabla
SET nombre_columna = expresión
FROM tablas fuente
WHERE condiciones de búsqueda;
Eliminación de Datos
DELETE
FROM nombre_tabla
FROM tablas fuente
WHERE condiciones de búsqueda;
Primer FROM indica qué tabla será modificada
Segundo FROM especifica los criterios que modificará el
DELETE
Subconsulta determina cuales filas serán eliminadas
Ejemplo de:
creación, inserción y eliminación
CREATE TABLE estudiante(
rut CHAR(9),
nombre CHAR(15),
telefono INTEGER(9));
INSERT INTO estudiante
VALUES ('15369751k','Juan Abarca',5895684);
Cada consulta debe tener una cláusula SELECT y otra FROM, pero la
cláusula WHERE es opcional.
Más detalle sobre sintaxis de las consultas en:
La lista en la clausula FROM contiene una lista de nombres de tablas y/o vistas.
Cada tabla puede estar seguida por el nombre de una variable que es útil para
identificar una tabla que aparece más de una vez en una consulta
La lista-selección en la clausula SELECT es una lista de nombres para los atributos
de las tablas en la lista FROM. Cada nombre puede ser precedido por una variable
que denota la tabla a la cual pertenece el atributo, e.g. E.edad
La condición en la clausula WHERE es una combinación booleana, i.e. usando los
conectores lógicos AND, OR, NOT de condiciones de la forma expresión o expresión
donde op es uno de los operadores <, >, <=, >=, =, <>. Por ejemplo
nombre=‘Juan’ o edad<=30
IDA
SELECT DISTINCT IDA
1
FROM NOTA; 3
Uso de DISTINCT
ID
10
Y la consulta 10
SELECT I.ID 11
11
FROM INSCRITOS I;
ID
SELECT DISTINCT I.ID 10
ROM INSCRITOS I; 11
Consultas Básicas
SQL también provee soporte para la unión, intersección y diferencia, tal como
lo hace el AR. Los comandos son, respectivamente,
o Union
o Intersects
o Except (en algunos sistemas se acepta MINUS)
Sintaxis
Consulta 1
<operador>
Consulta 2;
Consulta 1
UNION
Consulta 2
UNION
…
Consulta N;
Ejemplo
Esquema:
Empleado_partime(rut, nombre, edad, n°horas, salario)
Empleado_Full (rut, nombre, titulo, salario).
Es necesario conocer el nombre y rut de todos los empleados
SELECT E.nombre
FROM EST E
WHERE E.ciudad = 'concepcion'
UNION
SELECT E.nombre
FROM EST E
nombre
WHERE E.ciudad = 'chillan‘; pedro
luis
juan
domingo
Que produce el mismo resultado:
Intersect
Consulta 1
INTERSECT
Consulta 2
INTERSECT
…
Consulta N
Except
Consulta 1
EXCEPT
Consulta 2
Algunas consideraciones:
UNION, INTERSECT, EXCEPT se usan sobre dos tablas, estas deben ser union
compatibles, i.e., que tienen el mismo número de columnas y las columnas
tomadas en orden tienen el mismo dominio
Una consulta como la siguiente también es válida:
SELECT N.idn
FROM Navegantes N • Las tuplas repetidas producto de
WHERE N.rating = 10 una UNION son eliminadas, para
retenerlas se debe usar UNION ALL
UNION
• Lo mismo sucede para INTERSECT,
SELECT R.idn
donde para retener las tuplas
FROM Reservas R repetidas se usa INTERSECT ALL
WHERE R.idb = 104;
VISTAS
18.10.23
Vistas en SQL
Operadores:IN
IN: Forma una condición donde se sabe que valores exactos se deben
cumplir. Es decir verifica si un elemento esta en un conjunto dado, los
que pueden ser valores o el resultado de una consulta
SELECT columnas
FROM tablas
WHERE nombre_columna IN (valor1,.. , valorn);
SELECT N.nombre
FROM Navegantes N
WHERE N.idn NOT IN (SELECT R.idn
FROM Reservas R
WHERE R.idb NOT IN (SELECT B.idb
FROM Botes B
WHERE B.color = 'rojo'));
Más ejemplos de consultas anidadas:
Encontrar los nombres de los navegantes que reservaron un bote rojo
y un bote verde
SELECT N.nombre
FROM Navegantes N, Reservas R, Botes B
WHERE N.idn = R.idn
AND R.idb = B.idb
AND B.color = 'rojo‘
AND N.idn IN ( SELECT N2.idn
FROM Navegantes N2, Botes B2, Reservas R2
WHERE N2.idn = R2.idn
AND R2.idb = B2.idb
AND B.color='verde');
Qué computa esta consulta:
SELECT N.nombre
FROM Navegantes N, Reservas R, Botes B
WHERE N.idn=R.idn
AND R.idb=B.idb
AND B.color ='rojo‘
AND N.idn NOT IN( SELECT N2.idn
FROM Navegantes N2, Botes B2, Reservas R2
WHERE N2.idn=R2.idn
AND R2.idb=B2.idb
AND B.color='verde');
Operadores: EXISTS
EXISTS: se emplean para determinar si hay o no datos en una lista de
valores.
Puede emplearse con subconsultas correlacionadas para restringir el
resultado de una consulta exterior a los registros que cumplen la
subconsulta (consulta interior).
Operadores
SELECT columnas
FROM tablas
WHERE nombre_columna EXISTS (subconsulta);
Operadores: LIKE
LIKE: Permite hacer una búsqueda basada en un patrón. Un _
representa un carácter y % n-caracteres.
SELECT columnas
FROM tablas
WHERE nombre_columna LIKE (patron);
Ejemplo:
x >= ANY( <relation> )
significa que x no es la tupla mas pequeña en la
relación.
Nota: las tuplas deben tener un solo componente.
Operador ALL
SUM([DISTINCT] A): Entrega la suma de todos los valores (si se utiliza DISTINCT
valores únicos) que tiene la columna A.
MIN([DISTINCT] A): Entrega el valor mínimo de todos los valores que tiene la
columna A.
MAX([DISTINCT] A): Entrega el valor máximo de todos los valores que tiene la
columna A.
Encontrar el nombre y la edad del navegante mayor
o SELECT N.nombre, N.edad
FROM Navegantes N
WHERE N.edad = (SELECT MAX (N2.edad)
FROM Navegantes N2);
La siguiente no es una consulta legal en SQL:
o SELECT N.nombre, MAX(N.edad)
FROM Navegantes N;
Encontrar el número total de botes
o SELECT COUNT()
FROM Botes;
Encontrar número de nombres distintos de navegantes
o SELECT COUNT(DISTINCT N.nombre)
FROM Navegantes N;
Agrupamiento
Consulta con Agregación
Hasta ahora hemos aplicado agregación sobre todas las tuplas
También podemos aplicar agregación sobre grupos de tuplas
Encontrar la edad del navegante más joven por rating
o Una forma de resolverlo sería:
SELECT MIN(N.edad)
FROM Navegantes N
WHERE N.rating =i;
con i=1, 2, etc., tendríamos que escribir tantas consultas como ratings
existan en la relación, además tendríamos que saber de antemano cuantos
ratings existen
Ejemplo: Agrupando
Sells(bar, beer, price)
Encontrar el precio promedio para cada cerveza:
SELECT beer, AVG(price)
FROM Sells
GROUP BY beer;
Ejemplo: HAVING
Sells(bar, beer, price)
Beers(name, manf), find the average price of those beers that are either
served in at least three bars or are manufactured by Pete’s.
o EDAD > 20
OR
NOMBRE=Enrique es verdadero, porque NOMBRE=Enrique es verdad
o EDAD > 20
OR
NOMBRE=Pedro es desconocido porque la primera comparación es desconocido y la segunda
es falsa
idn & nombre & categoria & edad & ciudad & idn & idb & fecha
22 & Pedro & 7 & 45 & Concepcion & 22 & 102 & 10.11.00
23 & andres & 1 & 35 & Stgo & 23 & 102 & 10.11.00
33 & Loreto & 8 & 31 & Concepcion & 33 & 101 & 05.01.02
29 & Natalia & 7 & 40 & Stgo & null & null & null
30 & esteban & 4 & 50 & Talca & null & null & null
Outer Joins: Right outer join
Consideremos la siguiente instancia de BD:
Reservas idn & idb & fecha Botes idb & nombreb & color
23 & 102 & 10.11.00 101 & marino & azul
22 & 102 & 10.11.00 102 & inter-lagos & rojo
33 & 101 & 05.01.02 103 & clipper & verde
104 & inter-lagos & rojo
SELECT *
FROM Reservas NATURAL RIGHT OUTER JOIN Botes
idn & idb & fecha & idb & nombreb & color
23 & 102 & 10.11.00 & 102 & inter-lagos & rojo
22 & 102 & 10.11.00 & 102 & inter-lagos & rojo
33 & 101 & 05.01.02 & 101 & marino & azul
null & null & null & 103 & clipper & verde
null & null & null & 104 & inter-lagos & rojo
Outer Joins: Full outer join
SELECT *
Reservas FROM Reservas NATURAL FULL OUTER JOIN
idn &idb & fecha Botes
23 & 102 & 10.11.00
22 & 102 & 10.11.00
idn idb fecha idb nombreb color
33 & 101 & 05.01.02
23 102 10.11.00 102 inter-lagos rojo
33 & 106 & 06.01.02
22 102 10.11.00 102 inter-lagos rojo
33 101 05.01.02 101 marino azul
Ejemplo:
CREATE DOMAIN categoria_val INTEGER DEFAULT 1
CHECK (VALUE >= 1 AND VALUE <=10)
INTEGER es el tipo de dominio base para categoria_val
Base de Datos Activas:
Triggers o Disparadores
Lenguajes de Programación de
SGBD
Los SGBD proporcionan lenguajes de programación:
SQL Server: Transact Sql
Oracle: PL/SQL
Postgres: PL/pgSQL
Triggers
Un trigger es un bloque de un lenguaje de programación de un
SGBD asociado a una tabla, que se ejecuta cuando una
determinada instrucción de manipulación en SQL se va a
ejecutar sobre dicha tabla.
Insert, Update, Delete.
Triggers
Un trigger: procedimiento invocado automáticamente por el
SGBD en respuesta a una cambio específico en la BD.
Un trigger
• Evento: Un cambio en la BD que activa el trigger
DECLARE
-- variables locales
BEGIN
-- Sentencias
END <nombre_trigger>;
Sintaxis (Evento)
{BEFORE|AFTER}
{DELETE|INSERT|UPDATE [OF col1, col2, ..., colN]
[OR {DELETE|INSERT|UPDATE [OF col1, col2, ...,
colN]...]} ON <nombre_tabla>