bases de datos: structured query language...

37
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]

Upload: dinhquynh

Post on 24-Sep-2018

222 views

Category:

Documents


0 download

TRANSCRIPT

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’