consultas

Anuncio
SQL:2003 - Consultas
Fragmento del original:
SISTEMAS DE BASES DE DATOS BASADOS EN OBJETOS
Asignatura: Sistemas de Información, Tema 2
José Ramón Ríos Viqueira
Curso 2005-2006
Curso 2005/2006
J.R.R.V. – SI – Sistemas de bases de datos objeto-relacionales
1
CONSULTAS
 Tipos complejos: ROW, ARRAY, MULTISET
CREATE TABLE departamento (
id_dep INTEGER PRIMARY KEY,
nombre VARCHAR(50),
direccion ROW(calle VARHCAR(100), num INTEGER, loc VARCHAR(10),
presupuesto DECIMAL(12, 2),
);
CREATE TABLE empleado (
id_emp INTEGER PRIMARY KEY,
nombre VARCHAR(50),
direccion ROW(calle VARHCAR(100), num INTEGER, loc VARCHAR(10),
salario DECIMAL(9, 2),
hijos VARCHAR(50) ARRAY,
cursos ROW(nombre VARCHAR(50), nota DECIMAL(3, 1)) MULTISET
dep INTEGER,
FOREING KEY dep REFERENCES departamento(id_dep)
);
Curso 2005/2006
J.R.R.V. – SI – Sistemas de bases de datos objeto-relacionales
2
CONSULTAS
 Tipos complejos: ROW, ARRAY, MULTISET
 Desanidar tipos colección
Obtener una lista con los hijos de cada empleado
SELECT e.nombre, h.hijo
FROM empleado AS e, UNNEST (e.hijos) AS h(hijo)
Obtener para cada empleado de Santiago la nota media en los cursos
que aprobó
SELECT e.nombre, AVG(c.nota)
FROM empleado AS e, UNNEST (e.cursos) AS c(nota)
WHERE e.direccion.loc = 'Santiago' and c.nota >= 5
GROUP BY e.nombre
Curso 2005/2006
J.R.R.V. – SI – Sistemas de bases de datos objeto-relacionales
3
CONSULTAS
 Tipos complejos: ROW, ARRAY, MULTISET
 Anidar tipos colección
Obtener un informe en el que para cada departamento cuyo presupuesto
sea mayor que la suma de los sueldos de sus empleados se indique:
• Nombre del departamento,
• Presupuesto del departamento,
• Relación de empleados con el nombre, salario y número de hijos
de cada empleado
• Suma del salario de todos sus empleados
SELECT d.nombre, d.presupuesto,
MULTISET(SELECT e2.nombre, e2.salario, count(h.hijo) AS Hijos
FROM empleado AS e2, UNNEST (e2.hijos) AS h(hijo)
WHERE d.id_dep = e2.dep
GROUP BY e2.nombre, e2.salario),
SUM(e.salario) AS SalarioTotal
FROM departamento AS d, empleado AS e WHERE e.id_dep=e.dep
GROUP BY d.nombre, d.presupuesto
HAVING d.presupuesto > SUM(e.salario)
Curso 2005/2006
J.R.R.V. – SI – Sistemas de bases de datos objeto-relacionales
4
CONSULTAS
 Uso de tipos estructurados: métodos y funciones
CREATE TYPE punto
UNDER geo (
x FLOAT, y FLOAT)
INSTANTIABLE NOT FINAL;
CREATE TYPE linea UNDER geo(
coords punto ARRAY)
INSTANTIABLE NOT FINAL
INSTANCE METHOD longitud() RETURNS FLOAT;
CREATE FUNCTION distancia (g1 geo, g2 geo) RETURNS FLOAT
BEGIN ... END
CARRETERAS
cod_carrt propietario Estado Trazado
Malo
Estatal
N-651
L1
Bueno
Estatal
A-9 F
L2
cp-0804 Provincial Regular
L3
064-001 Municipal Bueno
L4
CENTROS_SALUD
id_cs
nombre
1
Viñas
2
San Cide
camas posicion
0
P1
10
P2
Valores de tipo Punto
Valores de tipo Linea
Curso 2005/2006
J.R.R.V. – SI – Sistemas de bases de datos objeto-relacionales
5
CONSULTAS
 Uso de tipos estructurados: métodos y funciones
Longitud total de carreteras municipales en mal estado
SELECT sum(trazado.longitud)
FROM carreteras
WHERE propietario = 'Municipal' and estado = 'Malo'
Número total de camas de los centros de salud que se
encuentran a menos de 1 km de un tramo de carretera con
longitud mayor de 2 km y estado bueno
SELECT sum(camas)
FROM carreteras AS c, centros_salud AS cs
WHERE c.estado = 'bueno' and c.longitud < 2000
and distancia(c.trazado, cs.posicion) < 1000
Curso 2005/2006
J.R.R.V. – SI – Sistemas de bases de datos objeto-relacionales
6
CONSULTAS
 Uso de tipos estructurados: Herencia
1, 'Tambre'
CREATE TABLE rios AS (
id_rio INTEGER PRIMARY KEY,
nombre VARHCAR(50),
geom geo)
2, 'Tambre'
Para cada río, devolver la longitud total de
las partes que son de tipo línea
SELECT nombre, SUM(TREAT(geom AS linea).longitud)
FROM rios
WHERE geom IS OF (linea)
GROUP BY nombre
3, 'Tambre'
Curso 2005/2006
J.R.R.V. – SI – Sistemas de bases de datos objeto-relacionales
7
CONSULTAS
 Referencias
CREATE TYPE Empleado AS (
nombre VARCHAR (50),
salario_base DECIMAL (9, 2),
complementos DECIMAL(9, 2),
dep REF(Departamento))
NOT FINAL
REF IS SYSTEM GENERATED
INSTANCE METHOD salario()
RETURNS DECIMAL(9, 2);
CREATE TABLE Empleados
OF Empleado
(REF IS oid SYSTEM GENERATED,
dept WITH OPTIONS SCOPE Departamentos);
CREATE TYPE Departamento AS (
nombre VARCHAR (50),
dir DIRECCION,
emps REF(Empleado) MULTISET,
director REF(Empleado))
NOT FINAL
REF IS SYSTEM GENERATED;
CREATE TABLE Departamentos
OF Departamento
(REF IS oid SYSTEM GENERATED,
emps WITH OPTIONS SCOPE Empleados,
director WITH OPTIONS SCOPE Empleados);
Curso 2005/2006
J.R.R.V. – SI – Sistemas de bases de datos objeto-relacionales
8
CONSULTAS
 Referencias
 Dereferenciación de atributos
Para cada departamento de santiago, obtén su nombre y el nombre
de sus empleados
SELECT e.nombre, e.dept->nombre
FROM Empleados e
WHERE e.dep->dir.loc = 'Santiago'
SELECT e.nombre, DEREF(e.dept).nombre
FROM Empleados e
WHERE DEREF(e.dept).dir.loc = 'Santiago'
SELECT e.nombre, (SELECT d.nombre FROM departamentos d WHERE d.oid = e.dep)
FROM Empleados e
WHERE (SELECT dir.loc FROM departamentos d WHERE d.oid = e.dep) = 'Santiago'
SELECT e.nombre, d.nombre
FROM Empleados e LEFT JOIN Departamentos d ON (e.dep = d.oid)
WHERE d.dir = 'Santiago'
Curso 2005/2006
J.R.R.V. – SI – Sistemas de bases de datos objeto-relacionales
9
CONSULTAS
 Referencias
 Dereferenciación de métodos
Para cada departamento obtener la suma de los salarios de sus
empleados
SELECT d.nombre, SUM(e.ptr->salario)
FROM Departamentos d, UNNEST(d.emps) AS e(ptr)
GROUP BY d.nombre
 Los métodos no se puede aplicar directamente a las tuplas
Nombre y salario de cada empleado
SELECT e.nombre, e.salario
FROM Empleados e
ERROR: e no es de tipo empleado,
ya que tiene un atributo oid
SELECT e.nombre, DEREF(e.oid).salario
FROM Empleados e
Curso 2005/2006
CORRECTO
J.R.R.V. – SI – Sistemas de bases de datos objeto-relacionales
10
CONSULTAS
 Herencia de tipos
CREATE TYPE rectangulo AS (
x1 FLOAT, y1 FLOAT, x2 FLOAT, y2 FLOAT)
NOT FINAL
INSTANCE METHOD area() RETURNS FLOAT;
CREATE TABLE rectangulos AS (
id_rect INTEGER PRIMARY KEY,
rec rectangulo)
CREATE TYPE cuadrado
UNDER rectangulo (tamano FLOAT)
NOT FINAL
OVERRIDING METHOD area() RETURNS FLOAT;
Obten el área de cada cuadrado de la tabla rectángulos
SELECT r.id_rect, r.rec.area
FROM rectangulos
WHERE r.rec IS OF (cuadrado)
Curso 2005/2006
J.R.R.V. – SI – Sistemas de bases de datos objeto-relacionales
11
CONSULTAS
 Herencia de tablas
 Una selección en una supertabla, devuelve los atributos de
esa supertabla para todas las tuplas de esa supertabla y de
todas sus subtablas.
CREATE TABLE EMPLEADOS OF empleado
(REF IS id_emp SYSTEM GENERATED,
dep WITH OPTIONS SCOPE DEPARTAMENTOS);
CREATE TABLE ADMINISTRADORES OF administrador
UNDER EMPLEADOS;
CREATE TABLE PROGRAMADORES OF programador
UNDER EMPLEADOS
(proys WITH OPTIONS SCOPE PROYECTOS);
Selecciona todos los empleados, de cualquier tipo
SELECT *
FROM Empleados
Selecciona el nombre y el lenguaje que domina cada programador
SELECT p.nombre, p.lenguaje
FROM Programadores
Curso 2005/2006
J.R.R.V. – SI – Sistemas de bases de datos objeto-relacionales
12
CONSULTAS
 Herencia de tablas
 Selección de las túplas de un sólo tipo
ONLY
•
Selecciona todos los empleados, que no son ni
programadores ni administradores
SELECT *
FROM ONLY (Empleados)
SELECT *
FROM Empleados
WHERE DEREF(oid) IS OF (Empleado)
Curso 2005/2006
J.R.R.V. – SI – Sistemas de bases de datos objeto-relacionales
13
CONSULTAS
 Definición de vistas
 Posibilidad de definir vistas con tipo
 Definición de jerarquías de vistas
 Las referencias entre tablas base pueden transformarse en
referencias entre vistas
Vistas para el departamento de ventas
Tipos
CREATE TYPE empVentas AS (
nombre VARCHAR(50),
salario DECIMAL(6, 2)) NOT FINAL;
CREATE TYPE admVentas UNDER empVentas (
sistema VARCHAR(20)) NOT FINAL;
CREATE TYPE progVentas
UNDER empVentas (
lenguaje VARCHAR(20),
proys REF(proyecto) MULTISET
) NOT FINAL;
CREATE TYPE proyVentas AS (
duracion INTEGER,
presup DECIMAL(9, 2),
progs REF(programador) MULTISET) NOT FINAL;
Curso 2005/2006
J.R.R.V. – SI – Sistemas de bases de datos objeto-relacionales
14
CONSULTAS
Vistas para el departamento de ventas
Vistas
CREATE VIEW vistaEmpVentas
OF empVentas
REF IS oid SYSTEM GENERATED
AS (SELECT nombre, salario
FROM ONLY (Empleados)
WHERE dep->nombre = 'Ventas');
CREATE VIEW vistaProgVentas
OF progVentas UNDER vistaEmpVentas
(proys WITH OPTIONS SCOPE vistaProyVentas)
AS (SELECT lenguaje, proys
FROM ONLY(Programadores)
WHERE dep->nombre = 'Ventas');
CREATE VIEW vistaAdmVentas
OF admVentas UNDER vistaEmpVentas
AS (SELECT sistema
FROM ONLY(Administradores)
WHERE dep->nombre = 'Ventas');
CREATE VIEW vistaProyVentas OF proyVentas
REF IS oid SYSTEM GENERATED
(progs WITH OPTIONS SCOPE vistaProgVentas)
AS (SELECT duracion, presup, progs
FROM Proyectos
WHERE dep->nombre = 'Ventas');
Curso 2005/2006
J.R.R.V. – SI – Sistemas de bases de datos objeto-relacionales
15
Documentos relacionados
Descargar