Art

Anuncio
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]
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
Descargar