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