Structured Query Language (SQL): Introducción Bases de Datos: Structured Query Language (SQL) Franco Guidi Polanco Escuela de Ingeniería Industrial Pontificia Universidad Católica de Valparaíso, Chile fguidi@ucv.cl Originalmente era el lenguaje de interrogación del DBMS relacional System R (IBM) en la segunda mitad de los años 70. Posteriormente adoptado por otros sistemas Luego transformado en estándar: 1986 Primera versión ANSI 1989 Llamado SQL-89 1992 Llamado alternativamente SQL-92 o SQL-2 1999 Llamado alternativamente SQL-99 o SQL-3 SQL contiene la funcionalidad tanto de un DDL (Data Definition Language), como de un DML (Data Manipulation Language). Revisión: 15 de Mayo de 2005 Franco Guidi Polanco 2 Dominios de datos más comúnmente utilizados en SQL Caracteres: tipo CHAR CHAR(largo) Tipos numéricos exactos: SMALLINT INTEGER NUMERIC NUMERIC [(Precisión [, escala ] ) ] Números en punto flotante FLOAT Fecha: tipo DATE Instrucciones en SQL SQL como DDL: Crear tablas (CREATE TABLE) Modificar estructura de tablas (ALTER TABLE) Eliminar tablas (DROP TABLE) SQL como DML: Insertar nuevas tuplas (INSERT) Actualizar contenidos de tuplas (UPDATE) Eliminar tuplas (DELETE) Seleccionar tuplas (SELECT) Franco Guidi Polanco 3 Franco Guidi Polanco 4
CREATE TABLE Permite crear una nueva tabla CREATE TABLE <nombre de tabla> (<nombre de campo> <tipo> [(<tamaño>)] <restricción>,...otros campos) Los valores posibles para <tipo> dependen del DBMS utilizado (ej.: integer, char, date). El <tamaño> es usado solo en ciertos tipos de datos (ej.: char). Ej.: CREATE TABLE INTEGER NOT NULL, CHAR(10) NOT NULL) CREATE TABLE Algunas restricciones son: NULL o NOT NULL UNIQUE. Indica que no pueden existir dos filas con el mismo valor para este campo. PRIMARY KEY. Indica que el campo es clave primaria. Solo se usa si la clave se compone de 1 campo, si no, se usa PRIMARY KEY (campo, campo,...) después de las definiciones de campos. DEFAULT. Inserta un valor por omisión cuando el registro se crea sin un valor para el campo (ej.: COSTO INTEGER DEFAULT = 1). FOREIGN KEY. Indica que el campo es clave foránea. Funciona igual que PRIMARY KEY, pero va seguido de: REFERENCES <nombre de tabla> (<nombre de campo>), que indica la tabla y campos referenciados. Franco Guidi Polanco 5 Franco Guidi Polanco 6 ALTER TABLE Permite modificar la estructura de un tabla. ALTER TABLE <nombre de tabla> ADD DROP MODIFY (especificación de campo(s)...) DROP TABLE Permite eliminar una tabla. DROP TABLE <nombre de tabla> La especificación de campos se hace igual que en el caso de CREATE TABLE Ej.: ALTER TABLE ADD (FECHA DATE NOT NULL) FECHA Ej.: DROP TABLE FECHA Franco Guidi Polanco 7 Franco Guidi Polanco 8
INSERT Agrega nuevos registros a una tabla. INSERT INTO <tabla> [(<lista de campos>)] VALUES (<lista de valores> <expresión select>) INSERT INTO (, ) VALUES (130, 50.155.842-K ) 130 100 115 120 50.155.842-K 15.333.222-1 50.251.366-9 17.322.568-2 UPDATE Modifica los valores de uno o más campos de un conjunto de registros de una tabla. UPDATE <tabla> SET <lista de asignaciones> [WHERE <condiciones lógicas>] UPDATE SET = 60.155.842-K WHERE = 115 115 60.155.842-K 100 115 120 15.333.222-1 50.251.366-9 17.322.568-2 Franco Guidi Polanco 9 Franco Guidi Polanco 10 DELETE Elimina uno o más registros de una tabla. DELETE FROM <tabla> [WHERE <condiciones lógicas>] SELECT Permite efectuar consultas sobre la BD SELECT [DISTINCT] <lista de campos> FROM <lista de tablas> [WHERE <condiciones lógicas>] [ORDER BY <lista de campos>] [GROUP BY <lista de campos>] Se pueden usar ciertas funciones agregadas : UPDATE WHERE = 115 100 115 15.333.222-1 60.155.842-K SUM AVG MIN MAX COUNT 120 17.322.568-2 Franco Guidi Polanco 11 Franco Guidi Polanco 12
Ejemplo Ejemplos SELECT (1): SELECT FROM Pedidos Ped# Fecha_ pedido Proveedores Obtener todos los datos de todos los proveedores: 1 10/03/1999 5645462-8 2 11/03/1999 6353134-4 3 11/03/1999 8545432-8 5645462-8 6353134-4 8545432-8 YTF ZYZ MNO Arica SELECT * Detalles Artículos Ped# Cantidad _ articulo 1 50 1 48 2 500 Lápiz Tijeras Agenda 5645462-8 6353134-4 8545432-8 ABC XYZ MNO Arica 3 10 3 12 CD-ROM 996589-0 Lápiz Franco Guidi Polanco 13 Franco Guidi Polanco 14 Ejemplos SELECT (2): proyección Obtener y de todos los proveedores: SELECT, Ejemplos SELECT (3) Obtener los códigos de todos los artículos: SELECT ART# FROM ARTICULO 5645462-8 6353134-4 8545432-8 ABC XYZ MNO 996589-0 Franco Guidi Polanco 15 Franco Guidi Polanco 16
Ejemplos SELECT (4): cláusula DISTINCT Ejemplos SELECT (5): selección de tuplas Obtener los códigos de los artículos solicitados: SELECT ART# SELECT DISTINCT ART# Obtener toda la información de los proveedores de : SELECT * WHERE PROVEEDORES.CIUDAD = SELECT * WHERE CIUDAD = 5645462-8 ABC 8545432-8 MNO Franco Guidi Polanco 17 Franco Guidi Polanco 18 Ejemplos SELECT (6) Obtener los códigos de pedidos por cantidades comprendidas entre 10 y 48: SELECT DISTINCT PED# WHERE CANTIDAD >= 10 AND CANTIDAD <= 48 Ejemplos SELECT (7): ordenamiento Obtener los nombres de los proveedores en orden alfabético: SELECT NOMBRE ORDER BY NOMBRE Ped# 1 3 MNO YTF ZYZ Franco Guidi Polanco 19 Franco Guidi Polanco 20
Ejemplos SELECT (8): join Obtener los códigos de pedidos con los datos de los proveedores a los que estos van dirigidos: Ejemplos SELECT (9) Obtener las ciudades de los proveedores que han entregado lápices: SELECT PED#, PROV#, NOMBRE, CIUDAD FROM S, PROVEEDORES WHERE S.PROV# = PROVEEDORES.PROV# Ped# SELECT DISTINCT CIUDAD FROM ARTICULOS, DETALLES, S, PROVEEDORES WHERE ARTICULOS.ART# = DETALLES.ART# AND DETALLES.PED# = S.PED# AND S.PROV# = PROVEEDORES.PROV# AND ARTICULOS.NOMBREARTICULO = Lápiz 1 5645462-8 YTF 2 6353134-4 ZYZ Arica 3 8545432-8 MNO Franco Guidi Polanco 21 Franco Guidi Polanco 22 Ejemplos SELECT (10): redenominación Encontrar todos las parejas distintas de códigos artículos : SELECT A.ART#, B.ART# FROM ARTICULOS A, ARTICULOS B WHERE A.ART# < B.ART# A. B. 996589-0 996589-0 996589-0 SELECT y funciones agregadas Si en la instrucción SELECT no hay un GROUP BY (visto más adelante), las funciones agregadas operan sobre todas las tuplas Funciones agregadas: COUNT(): cuenta tuplas MIN(): obtiene el menor valor para un campo MAX(): obtiene el mayor valor para un campo SUM(): suma los valores de un campo AVG(): calcula el promedio de valores de un campo STDEV(): calcula la d.e. de valores de un campo VARIANCE(): calcula la varianza de valores de un campo Franco Guidi Polanco 23 Franco Guidi Polanco 24
SELECT y funciones agregadas Contar los proveedores: SELECT COUNT(*) Sumar SELECT SUM( Cantidad ) WHERE ART#= Count(*) 3 Sum(Cantidad) 60 SELECT y funciones agregadas: regla Regla para el uso de funciones agregadas: Si una instrucción SELECT no contiene la cláusula GROUP BY, y si la cláusula SELECT contiene una o más funciones agregadas, todos los identificadores de columna especificados en la cláusula SELECT deben estar contenidos en una función agregada.! Franco Guidi Polanco 25 Franco Guidi Polanco 26 SELECT y funciones agregadas: regla Ejemplo Situación válida: SELECT SUM( Cantidad ) WHERE ART#= Situación NO valida: SELECT, SUM( Cantidad ) WHERE ART#= Interrogaciones anidadas Se utiliza una expresión SELECT como parte de la cláusula where. Por ejemplo: obtener el código de los artículos que hayan sido pedidos en la mayor cantidad: SELECT ART# WHERE CANTIDAD = (SELECT MAX(CANTIDAD) ) Franco Guidi Polanco 27 Franco Guidi Polanco 28
Interrogaciones anidadas: cláusula EXISTS / NOT EXISTS Permite generar condiciones basadas en la existencia o inexistencia de tuplas. Ejemplo: encontrar los artículos que tienen el mismo nombre (pero código diferente) : SELECT * FROM ARTICULOS A1 WHERE EXISTS (SELECT * Artículos FROM ARTICULOS A2 WHERE A1.NOMBRE_ARTICULO = A2.NOMBRE_ARTICULO AND A1.ART# <> A2.ART# ) _ articulo Lápiz 996589-0 Lápiz Interrogaciones anidadas: cláusula EXISTS / NOT EXISTS Mostrar los datos de los artículos que no han sido pedidos: SELECT * FROM ARTICULOS WHERE NOT EXISTS (SELECT * WHERE ARTICULOS.ART# = DETALLES.ART# ) _ articulo 996589-0 Lápiz Franco Guidi Polanco 29 Franco Guidi Polanco 30 Interrogaciones con agrupamiento: SELECT GROUP BY GROUP BY: permite agrupar tuplas sobre la base de similitudes. Ejemplo: Encontrar las ciudades de los proveedores SELECT CIUDAD GROUP BY CIUDAD Arica Interrogaciones con agrupamiento: SELECT GROUP BY GROUP BY es útil con funciones agregadas. Ejemplo: encontrar la cantidad de proveedores de cada ciudad: SELECT CIUDAD, COUNT(*) GROUP BY CIUDAD Arica Count(*) 2 1 La función COUNT(*) es aplicada a cada línea agrupada. Franco Guidi Polanco 31 Franco Guidi Polanco 32
Regla para el uso de SELECT GROUP BY Regla para el uso de la cláusula GROUP BY: Si una instrucción SELECT contiene la cláusula GROUP BY, todos los identificadores de columna especificados en la cláusula SELECT deben estar contenidos en una función agregada o en la lista de columnas presentes en la cláusula GROUP BY (o en ambas).! Regla para el uso de SELECT GROUP BY (cont.) Ejemplos: Situación válida: Situación no válida: SELECT, SUM(Cantidad) FROM Detalles GROUP BY SELECT, Ped#, SUM(Cantidad) FROM Detalles GROUP BY Franco Guidi Polanco 33 Franco Guidi Polanco 34 Interrogaciones con agrupamiento: SELECT GROUP BY HAVING HAVING se usa con GROUP BY, para establecer una condición de filtro sobre tuplas agregadas. Ejemplo: Encontrar los códigos de artículo y las cantidades para los cuales se haya pedido en total 50 o más unidades. SELECT, SUM(Cantidad) FROM Detalles GROUP BY HAVING SUM(Cantidad)>=50 Sum(Cantidad) 50 60 500 Regla para el uso de SELECT GROUP BY HAVING Regla para el uso de la cáusula HAVING: Todos los identificadores de columnas especificados en la cláusula HAVING deben estar contenidos en! una función agregada o en la lista de columnas especificadas en la cláusula GROUP BY. Franco Guidi Polanco 35 Franco Guidi Polanco 36
Regla para el uso de SELECT GROUP BY HAVING (cont.) Ejemplos: Situación válida: SELECT, SUM(Cantidad) FROM Detalles GROUP BY HAVING ART#= AND SUM(Cantidad)>=50 Situación no válida: SELECT, SUM(Cantidad) FROM Detalles GROUP BY HAVING PED#= 1 Franco Guidi Polanco 37