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
Originalmente era el lenguaje de interrogación del DBMS
relacional SystemR(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
Dominios de datos más comúnmente utilizados en SQL
Instrucciones 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
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
2
4
CREATE TABLE
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 PEDIDO
NRO_PED INTEGER NOT NULL,
RUT_PROV CHAR(10) NOT NULL)
PEDIDO
NRO_PED
RUT_PROV
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
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 PEDIDO ADD
(FECHA DATE NOT NULL)
PEDIDO
NRO_PED
RUT_PROV
FECHA
PEDIDO
NRO_PED
RUT_PROV
FECHA
Ej.:
DROP TABLE PEDIDO
Franco Guidi Polanco
7
Franco Guidi Polanco
6
8
INSERT
UPDATE
Agrega nuevos registros a una tabla.
INSERT INTO <tabla>
[(<lista de campos>)]
VALUES (<lista de valores>|<expresión select>)
INSERT INTO PEDIDO
(NRO_PED, RUT_PROV)
VALUES (130, ’50.155.842-K’)
PEDIDO
NRO_PED
100
115
120
RUT_PROV
15.333.222-1
50.251.366-9
17.322.568-2
130
50.155.842-K
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
PEDIDO
NRO_PED
100
RUT_PROV
15.333.222-1
115
60.155.842-K
115
120
50.251.366-9
17.322.568-2
Franco Guidi Polanco
9
Franco Guidi Polanco
DELETE
SELECT
Elimina uno o más registros de una tabla.
DELETE FROM <tabla>
[WHERE <condiciones lógicas>]
UPDATE PEDIDO
WHERE NRO_PED = 115
PEDIDO
NRO_PED
100
115
120
RUT_PROV
15.333.222-1
60.155.842-K
17.322.568-2
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
11
Franco Guidi Polanco
10
12
Ejemplo
Pedidos
Ped#
Fecha_
pedido
Prov#
1
2
3
10/03/1999 5645462-8
11/03/1999 6353134-4
11/03/1999 8545432-8
Detalles
Ped#
Art#
Cantidad
1
1
2
3
3
685431-4
878795-7
468624-8
556546-3
878795-7
50
48
500
10
12
Proveedores
Prov#
Nombre
Ciudad
5645462-8
6353134-4
8545432-8
YTF
ZYZ
MNO
Santiago
Arica
Santiago
Artículos
Art#
685431-4
878795-7
468624-8
556546-3
996589-0
Nombre_
articulo
Lápiz
Tijeras
Agenda
CD-ROM
Lápiz
Ejemplos SELECT (1): SELECT … FROM …
Obtener todos los datos de todos los
proveedores:
SELECT * FROM PROVEEDORES
Prov#
Nombre
Ciudad
5645462-8
6353134-4
8545432-8
ABC
XYZ
MNO
Santiago
Arica
Santiago
Franco Guidi Polanco
13
Franco Guidi Polanco
Ejemplos SELECT (2): proyección
Ejemplos SELECT (3)
Obtener Prov#y Nombrede todos los
proveedores:
Obtener los códigos de todos los artículos:
SELECT Prov#, Nombre
FROM PROVEEDORES
Prov#
Nombre
5645462-8
6353134-4
8545432-8
ABC
XYZ
MNO
SELECT ART#
FROM ARTICULO
Art#
685431-4
878795-7
468624-8
556546-3
996589-0
Franco Guidi Polanco
15
Franco Guidi Polanco
14
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#
FROM DETALLES
SELECT DISTINCT ART#
FROM DETALLES
Art#
685431-4
878795-7
468624-8
556546-3
878795-7
Art#
685431-4
878795-7
468624-8
556546-3
Obtener toda la información de los proveedores de
Santiago:
SELECT *
FROM PROVEEDORES
WHERE PROVEEDORES.CIUDAD =‘Santiago’
SELECT *
FROM PROVEEDORES
WHERE CIUDAD =‘Santiago’
Prov#
Nombre
Ciudad
5645462-8
8545432-8
ABC
MNO
Santiago
Santiago
Franco Guidi Polanco
17
Franco Guidi Polanco
18
Ejemplos SELECT (6)
Ejemplos SELECT (7): ordenamiento
Obtener los códigos de pedidos por cantidades
comprendidas entre 10 y 48:
Obtener los nombres de los proveedores en orden
alfabético:
SELECT DISTINCT PED#
FROM DETALLES
WHERE CANTIDAD >= 10
AND CANTIDAD <= 48
SELECT NOMBRE
FROM PROVEEDORES
ORDER BY NOMBRE
Ped#
1
3
Nombre
MNO
YTF
ZYZ
Franco Guidi Polanco
19
Franco Guidi Polanco
20
Ejemplos SELECT (8): join
Ejemplos SELECT (9)
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#
Ped#
Prov#
Nombre
Ciudad
1
2
3
5645462-8
6353134-4
8545432-8
YTF
ZYZ
MNO
Santiago
Arica
Santiago
Obtener las ciudades de los proveedores que han
Ciudad
Santiago
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
21
Franco Guidi Polanco
22
Ejemplos SELECT (10): redenominación
SELECT y funciones agregadas
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#
B.Art#
685431-4
685431-4
468624-8
468624-8
468624-8
468624-8
556546-3
556546-3
878795-7
996589-0
556546-3
685431-4
878795-7
996589-0
685431-4
996589-0
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
SELECT y funciones agregadas: regla
Contar los proveedores:
SELECT COUNT(*)
FROM PROVEEDORES
Sumar
SELECT SUM( Cantidad )
FROM DETALLES
WHERE ART#=‘878795-7’
Count(*)
3
Sum(Cantidad)
60
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
Interrogaciones anidadas
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’
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#
FROM DETALLES
WHERE CANTIDAD =
(SELECT MAX(CANTIDAD)
FROM DETALLES)
Art#
468624-8
Franco Guidi Polanco
27
Franco Guidi Polanco
28
Interrogaciones anidadas: cláusula EXISTS / NOT EXISTS
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 *
FROM ARTICULOS A2
WHERE A1.NOMBRE_ARTICULO =
A2.NOMBRE_ART
Comentarios de: Bases de Datos: Structured Query Language (SQL) (0)
No hay comentarios