Bases de Datos Geográficos

Documentos relacionados
Modulo I: Introducción Gestores de Bases De Datos

Temario. Índices simples Árboles B Hashing

SQL. Carlos A. Olarte BDI

LENGUAJE DE CONSULTA ESTRUCTURADO (SQL)

SINTAXIS DE SQL-92. <definición de esquema >::= CREATE SCHEMA <cláusula de nombre de esquema> [ <elemento de esquema>... ]

Insertar Datos en Tablas

Tema 4. SQL. Juan Ignacio Rodríguez de León

A.1. Definiciones de datos en SQL

1. Lenguaje de Definición de Datos. 2. Lenguaje de Manipulación de. Datos. M. C. Gustavo Alfonso Gutiérrez Carreón

Structured Query Language (SQL) Fundamentos de Bases de Datos InCo

ÍNDICE INTRODUCCIÓN...17

MANUAL BÁSICO DEL LENGUAJE SQL

Bases de Datos 2. Teórico

Bases de Datos: Structured Query Language (SQL)

Tema 7. Elaboración de consultas básicas de selección. Lenguajes de bases de datos. SQL básico 15/12/2011

Unidad. Lenguaje SQL. (Structured Query Language)

Computación Web (Curso 2015/2016)

1. DML. Las consultas multitabla

Consultas Complejas:

Introducción a las bases de datos.

Introducción SQL. Ges2ón y Modelación de Datos María Constanza Pabón

Base de Datos. Docente: Ing. Francisco Rodríguez BASE DATOS. Resultados. Internet. Requerimientos

SQL. Orígenes y Evolución

Capítulo 4. Realización de consultas

: COMPUTACIÓN E INFORMATICA : Ingeniería de Software Ingeniería de Redes y Comunicaciones : Administración de Bases de Datos I : T-INF127

MATERIAL INTRODUCTORIO ORACLE 11G

Bases de Datos SQL - Ejemplos

LENGUAJE SQL. En Mysql se utiliza un subconjunto de SQL (update, insert into, delete, select, truncate,etc).

SQL (DML) Carlos A. Olarte Gestión y Modelación de SQL Datos (DML)

UNIDAD 1.- PARTE 1 MANIPULACIÓN AVANZADA DE DATOS CON SQL. BASES DE DATOS PARA APLICACIONES. Xochitl Clemente Parra Armando Méndez Morales

Programación con SQL Aspecto teórico práctico básico

BASES DE DATOS TEMA 4. SQL. UN LENGUAJE DE CONSULTA COMERCIAL PARA BASES DE DATOS RELACIONALES Contenidos generales

Manipulación de datos en SQL

Bases de Datos Relacionales

Bases de Datos SQL 1 SQL. Jorge Pérez R. Universidad de Talca, II Semestre 2006

El Lenguaje SQL TEMA V. Grupo de Bas ses de Datos Avanzadas Univ. Carlo os III de Madrid. V.1 SQL como Lenguaje de Definición de Datos

Bases de datos: Lenguaje de consultas SQL

ÍNDICE PRIMERA PARTE... 17

SQL Server FEMEPA SQL Server 2000

SQL (Structured Query Language)

Curso Querying Microsoft SQL Server 2014 (20461)

TEMA 6: LENGUAJE DE DEFINICIÓN DE DATOS (LDD)

Características del lenguaje SQL

SENTENCIAS Y CONSULTAS EN SQL SERVER

Oracle Database: Introducción a SQL

ORACLE 10g. Descripción A QUIEN VA DIRIGIDO?

Unidad III: Lenguaje de manipulación de datos (DML) 3.1 Inserción, eliminación y modificación de registros

APÉNDICE SQL (Structures Query Language)

ÍNDICE. Introducción... Capítulo 1. Novedades de Access

SQL: Lenguaje de acceso a bases de datos

Access SQL: DDL y DML. Una empresa de Ingeniería precisa una base de datos para la gestión de sus proyectos.

Tema 33. El lenguaje SQL

Lenguaje SQL en ABAP IV 1-19

SQL (Structured Query Language)- DML

Lenguaje para descripción de datos

Consultas SQL INNER JOIN

Guía de ejercicios de SQL Prof. Mauricio E. Fernández N. Semestre Agosto-Diciembre de 2012

Consulta por Criterio y Expresión

SERVICIO NACIONAL DE APRENDIZAJE SENA

ÍNDICE. Introducción... XVII. Capítulo 1. Oracle 10g y el Grid Computing... 1

GESTORES GESTORES DE BASES DE DATOS

ÍNDICE INTRODUCCIÓN...13

Vistas en InformiX Sistemas de Bases de Datos II EMT CETP A/S Leonardo Carámbula

RESUMEN DEL LENGUAJE SQL

SQL Los fundamentos del lenguaje

EL LENGUAJE DE BASES DE DATOS SQL (DDL, DML, TRIGGERS Y STORE PROCEDURES)

Prácticas EDAT Curso 12/13

LENGUAJE DE MANIPULACIÓN DE DATOS

SQL: Lenguaje de acceso a bases de datos

LENGUAJE DE CONSULTA ESTRUCTURADO - SQL CONTENIDO

Ser capaces de realizar una consulta dentro de otra

2.4 Manipulación de datos

Tema 4. Lenguajes de consulta comerciales

Crear BD en. Isis Bonet Cruz, PhD

S.Q.L. (Lenguaje de Consulta Estructurada)

Ejemplo de gestión de datos con SQL

Concepto de vista. (con ciertas limitaciones). nivel físico) Una vista es una tabla virtual (no tiene una correspondencia a

BASES DE DATOS (IG18 Semipresencial) El Modelo Relacional Algebra Relacional y SQL

TEMA. Sistema de Gestión de Bases de Datos. Sistemas Avanzados de Recuperación de Información (SARI)

6- Combinación de tablas

MANUAL BÁSICO DEL LENGUAJE SQL

BASES DE DATOS. TEMA 7. SQL. EL LENGUAJE DE CONSULTA.

Sistemas de Datos Curso: Ernesto Chinkes. Subconsultas Stored Procedures - Triggers

Lenguaje de Consulta Estructurado S Q. Lenguaje de Consulta Estructurado. Wael Najjar /

2.5.- El lenguaje estándar SQL

PROGRAMANDO BASES DE DATOS PostgreSQL INTRODUCCIÓN INTRODUCCIÓN A LAS BASES DE DATOS (L1)

8 SQL SERVER 2008 RA-MA

Base de Datos LSI y PI Lic. Paola Daniela Budán Lic. Federico Rosenzvaig

Álvaro Herrera Modelamiento Avanzado de Datos con PostgreSQL

Ficheros y Bases de Datos Curso Primer Parcial. 7 de FEBRERO de Nombre:

Está basado en el álgebra y en el cálculo relacional.

Consulta y manipulación de datos. El lenguaje SQL

En este curso se presenta un análisis profundo de la base de datos MySQL para los sistemas operativos Windows y Linux.

VISUALIZACIÓN DE DATOS A PARTIR DE VARIAS TABLAS

Tema 4. Operadores y Expresiones

Objetivos y Temario CURSO MySQL 5

Transcripción:

Bases de Datos Geográficos SQL - Lenguaje de Bases de Datos Relacionales Instituto de Agrimensura - Facultad de Ingeniería Universidad de la República

Introducción El nombre SQL (Structured Query Language) significa Lenguaje de Consulta Estructurado. Es una especificación estándar de un lenguaje declarativo de acceso a bases de datos relacionales. El usuario sólo especifica lo que debe ser el resultado, dejando para el DBMS la optimización y las decisiones de cómo ejecutar la consulta. Lo implementan y respetan en mayor medida los DBMS relacionales. En la práctica hay muchas diferencias entre los distintos paquetes DBMS relacionales comerciales. Sin embargo, si el usuario sólo utiliza las funciones que forman parte del estándar, y si ambos sistemas relacionales soportan fielmente el estándar, la conversión entre los dos sistemas es mucho más sencilla. En este texto se trabaja con PostgreSQL que respeta fuertemente el estándar ANSI-SQL:2008.

Introducción Es un lenguaje de Bases de Datos global, por tanto brinda las operaciones para: Crear "esquemas" y tablas. Especificar las restricciones de integridad clave y referencial. Modificar esquemas, tablas y restricciones. Inserción, eliminación y actualización de datos. Especificar las consultas de recuperación de datos. Especificar aserciones (CREATE ASSERT), que son las restricciones más generales de la base de datos. Definir "triggers". Definir "vistas". Especificar controles de transacciones. Especificar controles de seguridad y autorización.

Crear Tablas CREATE TABLE Se utiliza para especificar una nueva relación (tabla), asignándole a esta última un nombre y sus atributos y restricciones iniciales. Primero se especifican los atributos. Nombre Un tipo de datos para especificar su dominio de valores. Los tipos estandar de SQL que soporta PostgreSQL son: int, smallint, real, double precision, char(n), varchar(n), date, time, timestamp, interval. Pero tiene además otros tipos de datos como el geométrico u otros definidos por el usuario. Restricciones de atributo, como NOT NULL Después de haber declarado los atributos, pueden especificarse con la sentencia CREATE TABLE las restricciones: Clave Integridad de entidad Integridad referencial (Foreign Key) Se puede modificar la especificación de la relación con el comando ALTER TABLE. Por ejemplo para definir restricciones después de creada la tabla. CREATE TABLE VENTA ( ); Id_Prod int NOT NULL, Id_Emp int NOT NULL, CONSTRAINT PK_VENTA PRIMARY KEY(Id_Prod, Id_Emp), CONSTRAINT FK_VEN_PROD FOREIGN KEY (Id_Prod) REFERENCES PRODUCTO(Id_Prod), CONSTRAINT FK_VEN_EMP FOREIGN KEY (Id_Emp) REFERENCES EMPLEADO(Id_Emp)

Crear Tablas

Modificar Datos INSERT En su formato más sencillo se utiliza para añadir una sola tupla a una relación. Permite especificar explícitamente los nombres de los atributos que se corresponden con los valores suministrados en el comando INSERT. INSERT INTO EMPLEADO (Id_Emp, Nombre, Direccion) VALUES (65439, 'Rita Ponce', 'Mercedes 232'); INSERT INTO EMPLEADO (Id_Emp, Nombre, Direccion) VALUES (7694, 'Luis Páez', 'J. E. Rodo 2456'); INSERT INTO PRODUCTO(Id_Prod, Descripcion, Precio) VALUES (26, 'Arroz', 29.90); INSERT INTO PRODUCTO(Id_Prod, Descripcion, Precio) VALUES (13, 'Harina', 45.99); INSERT INTO PRODUCTO(Id_Prod, Descripcion, Precio) VALUES (855, 'Aceite', 60.00); INSERT INTO VENTA(Id_Prod, Id_Emp) VALUES (26, 65439); INSERT INTO VENTA(Id_Prod, Id_Emp) VALUES (26, 7694); INSERT INTO VENTA(Id_Prod, Id_Emp) VALUES (13, 7694);

Modificar Datos DELETE Elimina tuplas de una relación. Incluye una cláusula WHERE, parecida a la que se utiliza en una consulta SQL, para seleccionar las tuplas que se van a eliminar. La ausencia de una cláusula WHERE significa que se borrarán todas las tuplas de la relación, o sea que la tabla permanece en la base de datos, pero vacía. DELETE FROM PRODUCTO WHERE Id_Prod=855; UPDATE Modificar los valores de atributo de una o más tuplas seleccionadas. Una cláusula WHERE en el comando UPDATE selecciona las tuplas de una relación que se van a modificar. Una cláusula SET adicional en el comando UPDATE especifica los atributos que se modificarán y sus nuevos valores. UPDATE PRODUCTO SET Precio=48.35 WHERE Id_Prod=13; DELETE FROM VENTA WHERE Id_Prod=26;

Distinción importante entre SQL y el modelo relacional formal Una tabla (relación) SQL no es un conjunto de tuplas. Porque permite que una tabla (relación) tenga dos o más tuplas idénticas en todos sus valores de atributo. Una relación SQL está restringida a ser un conjunto. Porque se ha declarado una restricción de clave o porque se ha utilizado la opción DISTINCT con la sentencia SELECT.

Una consulta SQL puede constar de hasta seis cláusulas que se especifican en el siguiente orden (las que aparecen entre corchetes son opcionales) SELECT <lista de atributos y funciones> FROM <lista de tablas> [WHERE <condición>] [GROUP BY <atributos de agrupamiento>] [HAVING <condición de agrupamiento>] [ORDER BY <lista de atributos>]; La cláusula SELECT lista los atributos y funciones que se recuperarán. La cláusula FROM especifica todas las relaciones (tablas) que se necesitan en la consulta, incluyendo las relaciones concatenadas, pero no las que están en las consultas anidades. La cláusula WHERE especifica las condiciones de selección de tuplas para esas relaciones, incluyendo, si es necesario, las condiciones de concatenación. GROUP BY especifica los atributos de agrupamiento. HAVING especifica una condición en los grupos que se están seleccionando, más que en las tuplas individuales. ORDER BY especifica un orden para la visualización del resultado de la consulta. Las funciones agregadas integradas COUNT, SUM, MIN, MAX y AVG se pueden utilizar en combinación con el agrupamiento (GROUP BY) aplicar a todas las tuplas seleccionadas en una consulta (sin una cláusula GROUP BY). Una forma de ver conceptualmente el orden en que se ejecuta una consulta a fin de formularla correctamente (el orden que realmente sigue el DBMS para evaluar una consulta depende de la implementación): Aplicando primero la cláusula FROM (para identificar todas las tablas implicadas en la consulta o para plasmar las tablas concatenadas). Seguida por la cláusula WHERE. Después GROUP BY y HAVING. Y el ORDER BY se aplica al final para ordenar el resultado de la consulta. En general, en SQL hay varias formas de especificar la misma consulta. El usuario puede elegir la técnica con la que se encuentra más cómodo a la hora de definir una consulta. Por ejemplo, muchas consultas pueden especificarse con condiciones de concatenación en la cláusula WHERE, o utilizando relaciones concatenadas en la cláusula FROM, o con alguna forma de consultas anidadas y el operador de comparación IN. El usuario se puede sentir confundido, al no saber la técnica que tiene que utilizar para especificar determinados tipos de consultas. El DBMS debe procesar la misma consulta de la misma forma, independientemente de cómo se haya especificado. En la práctica, esto es muy complejo, ya que cada DBMS tiene métodos distintos para procesar las consultas especificadas de formas diferentes. El DBMS tiene la responsabilidad de ejecutar la consulta eficazmente. Sin embargo, en la práctica, ayuda que el usuario sea consciente de cuáles son las estructuras de consulta que más cuesta procesar.

Las consultas que se muestran a partir de ahora en este documento se basan en la base de datos PEDIDOS. En la sección "SQL - Lenguaje de Bases de Datos Relacionales" se colgaron los documentos: Esquema Relacional de PEDIDOS, que muestra el esquema relacional que representa a la base de datos PEDIDOS. Script para crear PEDIDOS, tiene el script en SQL para crear la base de datos pedidos. En la sección "Material del Curso" se colgaron los tutoriales: Tutorial de PgAdmin III. Muestra los pasos para crear una base de datos, ejectar consultas y ejecutar scripts, utilizando la aplicación PgAdmin III. Tutorial de Instalación de PostGIS. Muestra la forma de utilizar PgAdmin III para: instalar PostgreSQL, instalar PostGIS, crear una base de datos geográficas y realizar análisis espaciales con PostGIS.

Estructura SELECT-FROM-WHERE de las consultas básicas de SQL La forma básica de la sentencia SELECT está formada por las cláusulas SELECT, FROM y WHERE y tiene la siguiente forma: SELECT <lista de atributos> FROM <lista de tablas> WHERE <condición>; <lista de atributos> es una lista de los atributos cuyos valores serán recuperados por la consulta. <lista de tablas> es una lista de las relaciones necesarias para procesar la consulta. <condición> es una expresión condicional (booleana) que identifica las tuplas que la consulta recuperará. Los operadores básicos para comparar lógicamente los valores de los atributos entre sí y con constantes literales son =, <, <=, >, >= y <> Consulta 0. Recuperar la fecha de nacimiento del empleado (o empleados) cuyo nombre sea JUAN ANDRADE SELECT FECHA_NAC FROM EMPLEADOS WHERE NOMBRE='JUAN' AND APELLIDO ='ANDRADE';

Nombres de atributo ambiguos, alias y variables de tupla En SQL el mismo nombre se puede utilizar para dos (o más) atributos, siempre y cuando los atributos se encuentren en relaciones diferentes. Colocar como prefijo el nombre de la relación al nombre del atributo, y separando los dos nombres con un punto. Consulta 1. Recuperar la descripción de los productos y el id de los productos, que tienen categoría 'COSMETICOS'. SELECT PRODUCTOS.DESCRIPCION, PRODUCTOS.PRODUCTOID FROM CATEGORIAS, PRODUCTOS WHERE CATEGORIAS.CATEGORIAID=PRODUCTOS.CATEGORIAID AND CATEGORIAS.NOMBRECAT='COSMETICOS'; Consulta 2. Por cada producto que tiene como proveedor a 'REVLON', mostrar la descripción, el id, y el nombre de la categoría. SELECT PRODUCTOS.DESCRIPCION, PRODUCTOS.PRODUCTOID, CATEGORIAS.NOMBRECAT FROM CATEGORIAS, PRODUCTOS, PROVEEDORES WHERE CATEGORIAS.CATEGORIAID=PRODUCTOS.CATEGORIAID AND PRODUCTOS.PROVEEDORID=PROVEEDORES.PROVEEDORID AND PROVEEDORES.NOMBREPROV='REVLON';

Nombres de atributo ambiguos, alias y variables de tupla Colocar un alias que puede seguir a la palabra clave AS, o puede seguir directamente al nombre de la relación. La ambigüedad también aparece en el caso de las consultas que se refieren dos veces a la misma relación, como en el siguiente ejemplo. Consulta 2B. Por cada producto que tiene como proveedor a 'REVLON', mostrar la descripción, el id, y el nombre de la categoría. SELECT PROD.DESCRIPCION, PROD.PRODUCTOID, CAT.NOMBRECAT FROM CATEGORIAS AS CAT, PRODUCTOS AS PROD, PROVEEDORES AS PROV WHERE CAT.CATEGORIAID=PROD.CATEGORIAID AND PROD.PROVEEDORID=PROV.PROVEEDORID AND PROV.NOMBREPROV='REVLON'; Consulta 3. Por cada empleado, recuperar el nombre y el primer apellido del empleado, y el nombre y el primer apellido de su "supervisor inmediato" (a quien reporta). SELECT E.NOMBRE, E.APELLIDO, S.NOMBRE, S.APELLIDO FROM EMPLEADOS E, EMPLEADOS S WHERE E.REPORTA_A=S.EMPLEADOID;

Cláusula WHERE no especificada y uso del asterisco (*) La ausencia de cláusula WHERE indica que no hay una condición de selección de tuplas, por tanto todas las tuplas de la relación especificada en la cláusula FROM se seleccionan para la consulta resultante. Consulta 4. Seleccionar el ID de todos los productos. SELECT P.IDPRODUCTOS FROM PRODUCTOS AS P; Para recuperar todos los valores de atributo de las tuplas seleccionadas podemos escribir un asterisco (*), que tiene el significado de todos los atributos. Consulta 4B. Recuperar todos los valores de atributo de todos los productos. SELECT * FROM PRODUCTOS; Si en la cláusula FROM se especifica más de una relación y no hay una cláusula WHERE, entonces se selecciona el PRODUCTO CRUZADO (todas las posibles combinaciones de tuplas) de esas relaciones. Consulta 5. Seleccionar todas las combinaciones de id de los productos e id de categorias en la base de datos. SELECT P.PRODUCTOID, C.CATEGORIAID FROM PRODUCTOS P, CATEGORIAS D;

Tablas como conjuntos en SQL SQL trata una tabla no como un conjunto, las tuplas duplicadas pueden aparecer más de una vez en una tabla. Pero una tabla SQL con una clave está restringida a ser un conjunto, ya que el valor de la clave debe ser distinto en cada tupla. SQL no elimina automáticamente las tuplas duplicadas en los resultados de las consultas. Si queremos eliminar las tuplas duplicadas del resultado de una consulta SQL, utilizamos la palabra clave DISTINCT en la cláusula SELECT. Consulta 6. Recuperar el precio de todos los productos. SELECT P.PRECIOUNIT FROM PRODUCTOS P; Consulta7. Recuperar los distintos valores de precio de los productos. SELECT DISTINCT P.PRECIOUNIT FROM PRODUCTOS P;

Tablas como conjuntos en SQL SQL ha incorporado operaciones de conjuntos: unión de conjuntos (UNION), diferencia de conjuntos (EXCEPT) e intersección de conjuntos (INTERSECT). Las tuplas duplicadas son eliminadas del resultado de la relación resultado de la operación. Como estas operaciones con conjuntos sólo se aplican a las relaciones compatibles, debemos asegurarnos de que las dos relaciones sobre las que apliquemos la operación tengan los mismos atributos y que éstos aparezcan en el mismo orden en las dos relaciones. SQL también dispone de las operaciones de conjunto seguidas por la palabra ALL (UNION ALL, EXCEPT ALL, INTERSECT ALL). Sus resultados son relaciones en los que los duplicados no se eliminan (multiconjuntos). Consulta 8. Recuperar el id y la descripción de todos los productos vendidos (estan en una orden) por los empleados VERONICA ARIAS y PABLO CELY. (SELECT DISTINCT P.DESCRIPCION, P.PRODUCTOID FROM PRODUCTOS P, ORDENES O, DETALLE_ORDENES D, EMPLEADOS E WHERE P.PRODUCTOID=D.PRODUCTOID AND O.ORDENID=D.ORDENID AND O.EMPLEADOID=E.EMPLEADOID AND E.NOMBRE='VERONICA' AND E.APELLIDO='ARIAS') UNION (SELECT DISTINCT P.DESCRIPCION, P.PRODUCTOID FROM PRODUCTOS P, ORDENES O, DETALLE_ORDENES D, EMPLEADOS E WHERE P.PRODUCTOID=D.PRODUCTOID AND O.ORDENID=D.ORDENID AND O.EMPLEADOID=E.EMPLEADOID AND E.NOMBRE='PABLO' AND E.APELLIDO='CELY');

Comparación de subcadenas y operadores aritméticos Comparación de partes de una cadena de caracteres mediante el operador de comparación LIKE. Las cadenas parciales se especifican mediante dos caracteres reservados: % sustituye una cantidad arbitraria de caracteres (de cero o más caracteres), y el guión de subrayado (_) reemplaza un solo carácter. En las cadenas es posible utilizar el operador de concatenación ( ) para añadir dos valores de cadena. Consulta 9. Recuperar id y el NOMBRECIA todos los clientes que tienen en el atributo NOMBRECIA la cadena SUPERMERCADO. SELECT C.CLIENTEID, C.NOMBRECIA FROM CLIENTES C WHERE C.NOMBRECIA LIKE '%SUPERMERCADO%'; Los operadores aritméticos estándar para la suma (+), la diferencia (-), la multiplicación (*) y la división (/) se pueden aplicar a valores o atributos numéricos con dominios numéricos. Consulta 10. Mostrar el id, la descripcion y el precio de los productos aumentados un 15%. Este ejemplo también muestra cómo podemos renombrar un atributo en el resultado de la consulta utilizando AS en la cláusula SELECT. SELECT P.PRODUCTOID, P.DESCRIPCION, P.PRECIOUNIT * 1.15 AS PRECIOAUMENTADO FROM PRODUCTOS P; En el caso de fechas, horas, marcas de tiempo e intervalos, los operadores suponen incrementar (+) o decrementar (-) una fecha, una hora o una marca de tiempo según un intervalo. Además, un valor de intervalo es el resultado de la diferencia entre dos valores de fecha, hora o marca de tiempo.

Comparación de subcadenas y operadores aritméticos Otro operador de comparación que se puede utilizar es BETWEEN. Consulta 11. Recuperar todos las productos que tienen precio entre 3.5 y 10. SELECT * FROM PRODUCTOS P WHERE P.PRECIOUNIT BETWEEN 3.5 AND 10; La condición (P.PRECIOUNIT BETWEEN 3.5 AND 10) es equivalente a la condición (P.PRECIOUNIT >= 3.5 AND P.PRECIOUNIT<=10) Los operadores aritméticos estándar para la suma (+), la diferencia (-), la multiplicación (*) y la división (/) se pueden aplicar a valores o atributos numéricos con dominios numéricos. Consulta 10. Mostrar el id, la descripcion y el precio de los productos aumentados un 15%. Este ejemplo también muestra cómo podemos renombrar un atributo en el resultado de la consulta utilizando AS en la cláusula SELECT. SELECT P.PRODUCTOID, P.DESCRIPCION, P.PRECIOUNIT * 1.15 AS PRECIOAUMENTADO FROM PRODUCTOS P;

Ordenación del resultado de una consulta SQL permite ordenar las tuplas del resultado de una consulta por los valores de uno o más atributos, utilizando la cláusula ORDER BY. El orden predeterminado es el ascendente. Con la palabra clave DESC podemos ver el resultado ordenado descendentemente. La palabra clave ASC permite especificar explícitamente el orden ascendente. Consulta 12. Por cada empleado, recuperar el nombre y el primer apellido del empleado, y el nombre y el primer apellido de su "supervisor inmediato" (a quien reporta); ordenados por apellido y nombre de supervisor en forma descendente, y por apellido y nombre de empleado en forma ascendete. SELECT E.NOMBRE, E.APELLIDO, S.NOMBRE, S.APELLIDO FROM EMPLEADOS E, EMPLEADOS S WHERE E.REPORTA_A=S.EMPLEADOID ORDER BY S.APELLIDO DESC, S.NOMBRE DESC, E.APELLIDO ASC, E.NOMBRE ASC;

Conjuntos explícitos y renombrado de atributos en SQL Es posible utilizar un conjunto explícito de valores en la cláusula WHERE, el conjunto debe ir entre paréntesis. Consulta 13 Recuperar los empleados que tienen como supervisores a los empleados con ID 1 (JUAN CRUZ) o 3 (VERONICA ARIAS). SELECT * FROM EMPLEADOS E WHERE E.REPORTA_A IN (1,3); En SQL, es posible renombrar cualquier atributo que aparezca en el resultado de una consulta añadiendo el calificador AS seguido por el nombre nuevo deseado. Consulta 12A muestra unos ligeros cambios respecto a Consulta 12, renombra los nombres de atributo resultantes como NombreDeEmpleado ApellidoDeEmpleado y NombreDeSupervidor ApellidoDeSupervisor. Los nombres nuevos aparecerán como cabeceras de columna en el resultado de la consulta. Consulta 12A. Por cada empleado, recuperar el nombre y el primer apellido del empleado, y el nombre y el primer apellido de su "supervisor inmediato" (a quien reporta); ordenados por apellido y nombre de supervisor en forma descendente, y por apellido y nombre de empleado en forma ascendete. SELECT E.NOMBRE AS NombreDeEmpleado, E.APELLIDO AS ApellidoDeEmpleado, S.NOMBRE AS NombreDeSupervisor, S.APELLIDO AS ApellidoDeSupervisor FROM EMPLEADOS E, EMPLEADOS S WHERE E.REPORTA_A=S.EMPLEADOID ORDER BY ApellidoDeSupervisor DESC, NombreDeSupervisor DESC, ApellidoDeEmpleado ASC, NombreDeEmpleado ASC;

Comparaciones con valores NULL y lógica de tres valores SQL utiliza NULL para representar la ausencia de un valor. Cuando en una comparación se ve implicado un NULL, se considera que el resultado es UNKNOWN, o desconocido. Por tanto SQL utiliza una lógica de tres valores con los valores TRUE, FALSE y UNKNOWN, en lugar de la lógica estándar de dos valores con TRUE o FALSE. SQL permite consultas que comprueban si el valor de un atributo es NULL. En lugar de utilizar = o <> para comparar el valor de un atributo con NULL, SQL utiliza IS o IS NOT. Consulta 14. Recuperar el nombre y el apellido de todos los empleados que no tienen supervisor. SELECT E.NOMBRE, E.APELLIDO FROM EMPLEADOS E WHERE E.REPORTA_A IS NULL;

Funciones agregadas en SQL SQL dispone de funciones que incorporan estos conceptos: COUNT, SUM, MAX, MIN y AVG. COUNT devuelve el número de tuplas o valores especificados en una consulta. Las funciones SUM, MAX, MIN y AVG se aplican a un conjunto o multiconjunto de valores numéricos y devuelven, respectivamente, la suma, el valor máximo, el valor mínimo y el promedio de esos valores. Estas funciones se pueden utilizar en la cláusula SELECT o en una cláusula HAVING. Las funciones MAX y MIN también se pueden utilizar con atributos que tienen dominios no numéricos si los valores del dominio tienen una ordenación total entre sí. Estas funciones también se utilizan en las condiciones de selección que implican consultas anidadas. Podemos especificar una consulta anidada correlacionada con una función agregada, y después utilizar la consulta anidada en la cláusula WHERE de una consulta externa. Consulta 15. Recuperar la suma de los precios de todos los productos, el precio más alto, el precio más bajo y el precio medio. SELECT SUM (P.PRECIOUNIT), MAX (P.PRECIOUNIT), MIN (P.PRECIOUNIT), AVG (P.PRECIOUNIT) FROM PRODUCTOS P; Consulta 16. Recuperar el número total de empleados. SELECT COUNT(*) FROM PRODUCTOS P; Consulta 17. Recuperar el número de precios de producto distintos almacenados en la base de datos. SELECT COUNT(DISTINCT P.PRECIOUNIT) FROM PRODUCTOS P;

Agrupamiento: las cláusulas GROUP BY y HAVING SQL permite aplicar las funciones agregadas a grupos de tuplas de una relación Cada grupo estará compuesto por las tuplas que tienen el mismo valor para algún(os) atributo(s), denominado(s) atributo(s) de agrupamiento. SQL tiene una cláusula GROUP BY que especifica los atributos de agrupamiento, que también deben aparecer en la cláusula SELECT, por lo que el valor resultante de aplicar la función de agregación a un grupo de tuplas aparece junto con el valor de los atributos de agrupamiento. Consulta 18. Por cada categoría de producto, recuperar el precio promedio por categoría. SELECT C.CATEGORIAID, C.NOMBRECAT, AVG(P.PRECIOUNIT) FROM CATEGORIAS C, PRODUCTOS P WHERE C.CATEGORIAID=P.CATEGORIAID GROUP BY C.CATEGORIAID, C.NOMBRECAT;

Agrupamiento: las cláusulas GROUP BY y HAVING El agrupamiento y las funciones se aplican después de la concatenación. A veces es necesario recuperar los valores de esas funciones sólo para aquellos grupos que satisfacen ciertas condiciones. SQL proporciona una cláusula HAVING, que puede aparecer en combinación con una cláusula GROUP BY, con este propósito. Mientras que las condiciones de selección de la cláusula WHERE limitan las tuplas a las que se aplican las funciones, la cláusula HAVING sirve para elegir grupos enteros. Consulta 19. Por cada categoría de producto con un precio promedio mayor a 2.25, recuperar el precio promedio por categoría. SELECT C.CATEGORIAID, C.NOMBRECAT, AVG(P.PRECIOUNIT) FROM CATEGORIAS C, PRODUCTOS P WHERE C.CATEGORIAID=P.CATEGORIAID GROUP BY C.CATEGORIAID, C.NOMBRECAT HAVING AVG(P.PRECIOUNIT)>2.25;

Tablas concatenadas en SQL y concatenaciones exteriores El concepto de tabla concatenada (o relación concatenada) se incorporó a SQL para poder especificar una tabla como resultado de una operación de concatenación en la cláusula FROM de una consulta. Esta estructura es más fácil que mezclar todas las condiciones de selección y concatenación en la cláusula WHERE. La cláusula FROM de Consulta 1A contiene una sola tabla concatenada. Los atributos de dicha tabla son todos los atributos de la primera tabla, CATEGORIAS, seguidos por todos los atributos de la segunda tabla, PRODUCTOS. Las opciones disponibles para especificar las tablas concatenadas en SQL son INNER JOIN (igual que JOIN), LEFT OUTER JOIN, RIGHT OUTER JOIN y FULL OUTER JOIN. Consulta 1. Recuperar la descripción de los productos y el id de los productos, que tienen categoría 'COSMETICOS'. SELECT P.DESCRIPCION, P.PRODUCTOID FROM CATEGORIAS C, PRODUCTOS P WHERE C.CATEGORIAID=P.CATEGORIAID AND C.NOMBRECAT='COSMETICOS'; Consulta 1A. La consulta 1 utilizando relación concatenada. SELECT P.DESCRIPCION, P.PRODUCTOID FROM (CATEGORIAS AS C JOIN PRODUCTOS AS P ON C.CATEGORIAID=P.CATEGORIAID) WHERE C.NOMBRECAT='COSMETICOS';

Consultas anidadas, tuplas y comparaciones conjunto/multiconjunto Las consultas se pueden formular mediante consultas anidadas, que son bloques select-from-where completos dentro de la cláusula WHERE de otra consulta. Esa otra consulta es la que se conoce como consulta externa. Se introduce el operador de comparación IN, que compara un valor v con un conjunto (o multiconjunto) de valores V y se evalúa como TRUE si v es uno de los elementos de V. Consultas anidadas correlacionadas Siempre que una condición de la cláusula WHERE de una consulta anidada se refiera a algún atributo de una relación declarada en la consulta exterior, se dice que las dos consultas son correlacionadas. La consulta anidada se evalúa una vez por cada tupla (o combinación de tuplas) en la consulta exterior. Las funciones EXISTS y UNIQUE en SQL La función EXISTS de SQL se utiliza para comprobar si el resultado de una consulta anidada correlacionada está vacío (no contiene tuplas) o no. El resultado de EXISTS es un valor booleano, TRUE o FALSE. EXISTS Y NOT EXISTS normalmente se utilizan en combinación con una consulta anidada correlacionada. Función UNIQUE(Q) Devuelve TRUE si no hay tuplas duplicadas en el resultado de la consulta Q; en caso contrario, devuelve FALSE. Se puede utilizar para probar si el resultado de una consulta anidada es un conjunto o un multiconjunto.