Upload
dinhquynh
View
222
Download
0
Embed Size (px)
Citation preview
Bases de Datos: Structured Query Language (SQL)
Franco Guidi Polanco Escuela de Ingeniería Industrial
Pontificia Universidad Católica de Valparaíso, Chile [email protected]
Franco Guidi Polanco 2
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 – Primera versión ANSI § 1989 – Llamado SQL-89 § 1992 – Llamado alternativamente SQL-92 o SQL-2 § 1999 – 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 3
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 4
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 5
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)
NRO_PED RUT_PROV
PEDIDO
Franco Guidi Polanco 6
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 7
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)
NRO_PED RUT_PROV
PEDIDO FECHA
Franco Guidi Polanco 8
DROP TABLE
v Permite eliminar una tabla.
DROP TABLE <nombre de tabla>
Ej.: DROP TABLE PEDIDO
NRO_PED RUT_PROV FECHA
PEDIDO
Franco Guidi Polanco 9
INSERT
v Agrega nuevos registros a una tabla.
INSERT INTO <tabla> [(<lista de campos>)] VALUES (<lista de valores>|<expresión select>)
NRO_PED RUT_PROV
100 15.333.222-1
115 50.251.366-9
120 17.322.568-2
PEDIDO
130 50.155.842-K
INSERT INTO PEDIDO (NRO_PED, RUT_PROV) VALUES (130, ’50.155.842-K’)
Franco Guidi Polanco 10
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>]
NRO_PED RUT_PROV
100 15.333.222-1
115 50.251.366-9
120 17.322.568-2
PEDIDO
115 60.155.842-K
UPDATE PEDIDO SET RUT_PROV=’60.155.842-K’ WHERE NRO_PED = 115
Franco Guidi Polanco 11
DELETE
v Elimina uno o más registros de una tabla.
DELETE FROM <tabla> [WHERE <condiciones lógicas>]
NRO_PED RUT_PROV
100 15.333.222-1
115 60.155.842-K
120 17.322.568-2
PEDIDO UPDATE PEDIDO WHERE NRO_PED = 115
Franco Guidi Polanco 12
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 13
Ejemplo
Ped# 1
Art# 685431-4
Cantidad
50
Ciudad Santiago
3 556546-3 10
Santiago
2 468624-8 500
Arica
1 878795-7 48
3 878795-7 12
Prov# 5645462-8 8545432-8 6353134-4
Art# 685431-4
Nombre_ articulo
Lápiz
556546-3 CD-ROM 468624-8 Agenda 878795-7 Tijeras
Ped# Fecha_ pedido Prov#
1 10/03/1999 5645462-8 3 11/03/1999 8545432-8 2 11/03/1999 6353134-4
Detalles
Pedidos
Artículos
Proveedores
Nombre YTF
MNO ZYZ
996589-0 Lápiz
Franco Guidi Polanco 14
Ejemplos SELECT (1): SELECT … FROM …
v Obtener todos los datos de todos los proveedores:
SELECT * FROM PROVEEDORES
Ciudad Santiago Santiago
Arica
Prov# 5645462-8 8545432-8 6353134-4
Nombre ABC MNO XYZ
Franco Guidi Polanco 15
Ejemplos SELECT (2): proyección
v Obtener Prov# y Nombre de todos los proveedores:
SELECT Prov#, Nombre FROM PROVEEDORES
Prov#
5645462-8 8545432-8 6353134-4
Nombre ABC MNO XYZ
Franco Guidi Polanco 16
Ejemplos SELECT (3)
v Obtener los códigos de todos los artículos:
SELECT ART# FROM ARTICULO
Art# 685431-4
556546-3 468624-8 878795-7
996589-0
Franco Guidi Polanco 17
Ejemplos SELECT (4): cláusula DISTINCT
v Obtener los códigos de los artículos solicitados:
SELECT ART# FROM DETALLES
SELECT DISTINCT ART# FROM DETALLES
Art# 685431-4
556546-3 468624-8 878795-7
878795-7
Art# 685431-4
556546-3 468624-8 878795-7
Franco Guidi Polanco 18
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’
Ciudad Santiago
Prov# 5645462-8
Nombre ABC
Santiago 8545432-8 MNO
Franco Guidi Polanco 19
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#
3 1
Franco Guidi Polanco 20
Ejemplos SELECT (7): ordenamiento
v Obtener los nombres de los proveedores en orden alfabético:
SELECT NOMBRE FROM PROVEEDORES ORDER BY NOMBRE
Nombre
YTF MNO ZYZ
Franco Guidi Polanco 21
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#
Ciudad Santiago Santiago
Arica
Prov# 5645462-8 8545432-8 6353134-4
Ped# 1 3 2
Nombre YTF
MNO ZYZ
Franco Guidi Polanco 22
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’
Ciudad Santiago
Franco Guidi Polanco 23
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# A.Art#
685431-4
468624-8 468624-8 468624-8
556546-3
685431-4
468624-8
556546-3
B.Art#
556546-3
878795-7
878795-7
685431-4
685431-4
996589-0
996589-0 996589-0
Franco Guidi Polanco 24
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 25
SELECT y funciones agregadas
v Contar los proveedores: SELECT COUNT(*) FROM PROVEEDORES
v Sumar
SELECT SUM( Cantidad ) FROM DETALLES WHERE ART#=‘878795-7’
Count(*) 3
Sum(Cantidad) 60
Franco Guidi Polanco 26
!
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 27
SELECT y funciones agregadas: regla
v Ejemplo
§ Situación válida:
§ Situación NO valida:
SELECT SUM( Cantidad ) FROM DETALLES WHERE ART#=‘878795-7’
SELECT Art#, SUM( Cantidad ) FROM DETALLES WHERE ART#=‘878795-7’
Franco Guidi Polanco 28
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)
Art# 468624-8
Franco Guidi Polanco 29
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# )
Art# 685431-4
Nombre_ articulo
Lápiz
Artículos
996589-0 Lápiz
Franco Guidi Polanco 30
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# )
Art# Nombre_ articulo
996589-0 Lápiz
Franco Guidi Polanco 31
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 32
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 Santiago
Arica
Count(*) 2 1
La función COUNT(*) es aplicada a cada línea agrupada.
Franco Guidi Polanco 33
!
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 34
Regla para el uso de SELECT … GROUP BY… (cont.)
v Ejemplos: § Situación válida:
§ Situación no válida:
SELECT Art#, SUM(Cantidad) FROM Detalles GROUP BY Art#
SELECT Art#, Ped#, SUM(Cantidad) FROM Detalles GROUP BY Art#
Franco Guidi Polanco 35
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
Art# 685431-4
Sum(Cantidad)
50 468624-8 500 878795-7 60
Franco Guidi Polanco 36
!
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 37
Regla para el uso de SELECT … GROUP BY … HAVING (cont.)
v Ejemplos: § Situación válida:
§ Situación no válida:
SELECT Art#, SUM(Cantidad) FROM Detalles GROUP BY Art# HAVING ART#=‘878795-7’ AND SUM(Cantidad)>=50
SELECT Art#, SUM(Cantidad) FROM Detalles GROUP BY Art# HAVING PED#=‘1’