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