Bases de Datos
Dinámica del Modelo Relacional
Lenguaje SQL
Temario
□ Lenguaje de Definición de Datos
□ CREATE TABLE
□ ALTER TABLE
□ DROP TABLE
□ Lenguaje de Modificación de Datos
□ INSERT
□ DELETE
□ UPDATE
□ SELECT
□ Consultas Simples
□ Operaciones de Conjuntos
□ Consultas Anidadas
□ Funciones de Agregación
Bibliografía
□ Fundamentos de Sistemas de Bases de Datos.
Elmasri – Navathe
Lenguaje de Definición de Datos: LDD
□ Creación de una tabla (CREATE TABLE)
CREATE TABLE NombreTabla
{(NombreColumna tipoDato [NOT NULL] [UNIQUE]
[DEFAULT opciónPredeterminada] [CHECK (condiciónBúsqueda) [,…]}
[PRIMARY KEY (listaDeColumnas), ]
{[UNIQUE (listaDeColumnas)] [,…]
{[FOREIGN KEY (listaColumnasClaveExterna)
REFERENCES NombreTablaPadre [(listaColumnasClaveCandidatas)]
[MATCH {PARTIAL | FULL}
[ON UPDATE acciónReferencial]
[ON DELETE acciónReferencial] [,…]}
{[CHECK (condiciónBúsqueda)] [,…] }
Tipos de Datos
Los tipos de datos predefinidos son:
□ CHARACTER □ FLOAT
□ CHARACTER VARYING □ REAL
□ CHARACTER LARGE OBJECT □ DOUBLE PRECISION
□ BINARY LARGE OBJECT □ BOOLEAN
□ NUMERIC □ DATE
□ DECIMAL □ TIME
□ SMALLINT □ TIMESTAMP
□ INTEGER □ INTERVAL
□ BIGINT
Lenguaje de Definición de Datos: LDD
□ Modificación de la definición de una tabla
(ALTER TABLE)
ALTER TABLE NombreTabla
[ADD [COLUMN] nombreColumna tipoDato [NOT NULL] [UNIQUE]
[DEFAULT opciónPredeterminada] [CHECK (condiciónBúsqueda)]]
[DROP [COLUMN] nombreColumna [RESTRICT | CASCADE]]
[ADD CONSTRAINT nombreRestricción] definiciónRestricciónTabla]
[DROP CONSTRAINT nombreRestricción [RESTRICT | CASCADE]]
[ALTER [COLUMN] SET DEFAULT opciónPredeterminada]
ALTER [COLUMN] DROP DEFAULT]
Lenguaje de Definición de Datos: LDD
□ Eliminación de una tabla (DROP TABLE)
DROP TABLE NombreTabla [RESTRICT | CASCADE]
Lenguaje de Modificación de Datos:
LMD
Actualizacion de una base de datos:
□ INSERT
□ DELETE
□ UPDATE
Lenguaje de Modificación de Datos:
LMD
□ INSERT
INSERT INTO nombreTabla (‘columna1’, ‘columna2’, … , ‘columnaN’)
VALUES (‘valor1’, ‘valor2’, … , ‘valorN’)
Lenguaje de Modificación de Datos:
LMD
□ DELETE
DELETE FROM nombreTabla
WHERE condición
Lenguaje de Modificación de Datos:
LMD
□ UPDATE
UPDATE nombreTabla
SET nombreColumna = expresión
WHERE condición
Lenguaje de Modificación de Datos -
LMD
□ SQL tiene una sentencia básica para consultar información
de la base de datos; la sentencia SELECT
□ No es lo mismo que la operación SELECCIÓN del álgebra
relacional
□ En SQL se puede tener una tabla que tenga dos o más tuplas
idénticas, no es un conjunto de tuplas es un multiconjunto o
bolsa.
□ Las relaciones en SQL pueden restringirse como conjuntos
especificando atributos PRIMARY KEY o UNIQUE, o usando la
opción DISTINCT en una consulta.
12
Consultas en SQL
□ Forma básica de la sentencia SELECT
SELECT
SELECT <listade
<lista deatributos>
atributos>
FROM
FROM <lista
<listade
detablas>
tablas>
WHERE <condición>
WHERE <condición>
□ <lista de atributos> es una lista de nombres de atributos
cuyos valores van a ser listados por la consulta
□ <lista de tablas> es una lista de nombres de relaciones
requeridas para procesar la consulta
□ <condición> es una expresión condicional (Booleana)
que identifica las tuplas a mostrar por la consulta
13
Consultas Simples
□ Listar la fecha de nacimiento y dirección del empleado cuyo
nombre es 'Josefa A. Esparza'.
SELECT
SELECTFECHAN, DIRECCION
FECHAN, DIRECCION
FROM
FROMEMPLEADO
EMPLEADO
WHERE
WHERENOMBREP=‘Josefa' ANDAND
NOMBREP=‘Josefa' INIC=‘A’
INIC=‘A’
AND
AND APELLIDO=‘Esparza’
APELLIDO=‘Esparza’
□ SELECT = PROYECCIÓN
□ FROM = PRODUCTO CARTESIANO
□ WHERE = SELECCIÓN
□ El resultado de la consulta puede contener tuplas duplicadas.
14
Consultas Simples
□ Listar el nombre y dirección de todos los empleados que
trabajan en el departamento ‘Investigación’.
SELECT
SELECT NOMBREP,
NOMBREP, APELLIDO,
APELLIDO, DIRECCION
DIRECCION
FROM EMPLEADO, DEPARTAMENTO
FROM EMPLEADO, DEPARTAMENTO
WHERE NOMBRED='Investigación' AND NUMEROD = ND
WHERE NOMBRED='Investigación' AND NUMEROD = ND
15
Consultas Simples
□ Para cada proyecto ubicado en ‘Sacramento', listar el número
de proyecto, el número de departamento y el apellido,
dirección y fecha de nacimiento del gerente.
SELECT
SELECT NUMEROP,
NUMEROP, NUMD,
NUMD, APELLIDO,
APELLIDO, FECHAN,
FECHAN, DIRECCION
DIRECCION
FROM PROYECTO, DEPARTAMENTO, EMPLEADO
FROM NUMD=NUMEROD
WHERE PROYECTO, DEPARTAMENTO, EMPLEADO
AND NSSSUPER=NSS
AND LUGARP='Sacramento‘
WHERE NUMD=NUMEROD AND NSSSUPER=NSS
AND LUGARP='Sacramento‘
16
Cláusula WHERE no especificada
□ Cuando falta la cláusula WHERE indica que no hay
condición; todas las tuplas son seleccionadas
□ Listar los NSS de todos los empleados
SELECT NSS
SELECT NSS
FROM EMPLEADO
FROM EMPLEADO
SELECT NSS,
SELECT NSS, NOMBRED
NOMBRED
FROM EMPLEADO,
FROM EMPLEADO, DEPARTAMENTO
DEPARTAMENTO
□ Es muy importante especificar una condición de unión entre
las relaciones para evitar relaciones resultado de gran
tamaño.
17
USO DE *
□ Para listar todos los atributos de las tuplas
seleccionadas se utiliza *
Ejemplos:
SELECT *
SELECT *
FROM EMPLEADO
FROM EMPLEADO
WHERE ND=5
WHERE ND=5
SELECT *
SELECT *
FROM EMPLEADO, DEPARTAMENTO
FROM EMPLEADO, DEPARTAMENTO
WHERE NOMBRED='Investigación' AND
WHERE NOMBRED='Investigación' AND
ND=NUMEROD
ND=NUMEROD
18
USO DE DISTINCT
□ SQL no trata las relaciones como conjuntos;
pueden aparecer tuplas duplicadas
□ Para eliminar tuplas duplicadas en un resultado, se
utiliza la palabra clave DISTINCT
SELECT SALARIO
SELECT
FROM SALARIO
EMPLEADO
FROM EMPLEADO
SELECT DISTINCT SALARIO
SELECTEMPLEADO
FROM DISTINCT SALARIO
FROM EMPLEADO
19
COMPARACIÓN DE SUBCADENAS
□ LIKE se utiliza para comparar partes de una
cadena de caracteres
□ Caracteres reservados:
□ '%‘ sustituye a un número arbitrario de caracteres
□ '_' sustituye a un solo carácter arbitrario
Obtener todos los empleados cuya dirección esté en
Houston
SELECT NOMBREP, APELLIDO
SELECT
FROM NOMBREP, APELLIDO
EMPLEADO
FROM
WHERE EMPLEADO
DIRECCION LIKE '%Houston,TX%’
WHERE DIRECCION LIKE '%Houston,TX%’
20
COMPARACIÓN DE SUBCADENAS
Encontrar todos los empleados que nacieron en la década de
1950.
Si el formato de fecha corresponde a DDMMAAAA, entonces el
7mo carácter debe ser “5”
SELECT
SELECT NOMBREP, APELLIDO
NOMBREP, APELLIDO
FROM EMPLEADO
FROM
WHERE EMPLEADO
FECHAN LIKE '______5_’
WHERE FECHAN LIKE '______5_’
21
OPERACIONES ARITMÉTICAS
□ Los operadores aritméticos estándar '+', '-'. '*', y '/'
(para suma, resta, multiplicación y división,
respectivamente) se pueden aplicar a valores
numéricos en una consulta
Mostrar los salarios resultantes si cada empleado que trabaja
en el proyecto ‘ProductoX’ recibe un aumento del 10%
SELECT NOMBREP,
SELECT APELLIDO,
NOMBREP, 1.1*SALARIO
APELLIDO, 1.1*SALARIO
FROM
FROM EMPLEADO, TRABAJA_EN,
EMPLEADO, TRABAJA_EN,PROYECTO
PROYECTO
WHERE
WHERE NSS=NSSE AND
NSS=NSSE NUMP=NUMEROP
AND NUMP=NUMEROPAND AND
NOMBREP='ProductoX’
NOMBREP='ProductoX’
22
ORDER BY
□ La cláusula ORDER BY permite ordenar las tuplas del
resultado de una consulta según los valores de uno
o más atributos.
Obtener una lista de empleados y de los proyectos en los que
trabajan, ordenados por departamento, y dentro de cada
departamento, alfabéticamente por apellido y nombre
SELECT
SELECTNOMBRED, APELLIDO,NOMBREP,
NOMBRED, APELLIDO, NOMBREP, NOMBREPR
NOMBREPR
FROM DEPARTAMENTO,
FROM DEPARTAMENTO, EMPLEADO,
EMPLEADO,TRABAJA_EN, PROYECTO
TRABAJA_EN, PROYECTO
WHERE NUMEROD=ND AND NSS=NSSE AND NUMP=NUMEROP
WHERE
ORDERNUMEROD=ND AND NSS=NSSE
BY NOMBRED, APELLIDO, NOMBREPAND NUMP=NUMEROP
ORDER BY NOMBRED, APELLIDO, NOMBREP
23
ORDER BY
□ El orden por defecto es ascendente
□ Se puede especificar con la palabra clave DESC si
se prefiere orden descendente; la palabra clave
ASC puede usarse para especificar explícitamente
orden ascendente.
SELECT
SELECTNOMBRED,
NOMBRED,APELLIDO,
APELLIDO,NOMBREP,
NOMBREP,NOMBREPR
NOMBREPR
FROM
FROM DEPARTAMENTO,
DEPARTAMENTO,EMPLEADO,
EMPLEADO,TRABAJA_EN,
TRABAJA_EN,PROYECTO
PROYECTO
WHERENUMEROD=ND
WHERE NUMEROD=NDAND
ANDNSS=NSSE
NSS=NSSEAND
ANDNUMP=NUMEROP
NUMP=NUMEROP
ORDERBY
ORDER BYNOMBRED
NOMBREDDESC,
DESC,APELLIDO
APELLIDOASC,
ASC,NOMBREP
NOMBREPASC
ASC
24
Seudónimos
□ Algunas consultas necesitan referirse a la misma relación dos
veces
□ En este caso, se usan seudónimos para nombrar a la relación
□ Para cada empleado, listar su nombre y el nombre de su
supervisor
SELECT SELECT
[Link], [Link],
[Link], [Link],[Link],
[Link], [Link] [Link]
FROM EMPLEADO
FROM EMPLEADOE ESS
WHERE [Link]=[Link]
WHERE [Link]=[Link]
25
Seudónimos
□ Los seudónimos también pueden usarse para cualquier
consulta por conveniencia
Se puede usar la palabra clave AS
SELECT [Link], [Link], [Link], [Link]
SELECT [Link], [Link], [Link], [Link]
FROM EMPLEADO AS E, EMPLEADO AS S
FROM WHERE
EMPLEADO AS E, [Link]=[Link]
EMPLEADO AS S
WHERE [Link]=[Link]
26
OPERACIONES DE CONJUNTOS
□ UNION
□ MINUS
□ INTERSECT
□ Las relaciones resultantes de estas operaciones son
conjuntos de tuplas
□ Son aplicables a relaciones compatibles; ambas
relaciones deben tener los mismos atributos y
aparecer en el mismo orden
27
OPERACIONES DE CONJUNTOS
□ Listar todos los números de proyecto, para aquellos proyectos
que involucren a empleados de apellido ‘Vizcarra' como
empleados o gerentes de departamento.
(SELECT
(SELECT NOMBREP
NOMBREP
FROM
FROM PROYECTO,
PROYECTO,DEPARTAMENTO,
DEPARTAMENTO,EMPLEADO
EMPLEADO
WHERE
WHERE NUMD=NUMEROD
NUMD=NUMERODAND ANDNSSSUPER=NSS
NSSSUPER=NSS AND
AND
APELLIDO='Vizcarra')
APELLIDO='Vizcarra')
UNION
UNION
(SELECT NOMBREP
(SELECT NOMBREP
FROM PROYECTO, TRABAJA_EN, EMPLEADO
FROM PROYECTO, TRABAJA_EN, EMPLEADO
WHERE NUMEROP=NUMP AND NSSE=NSS AND
WHERE NUMEROP=NUMP AND NSSE=NSS AND
APELLIDO='Vizcarra')
APELLIDO='Vizcarra')
28
ANIDADO DE CONSULTAS
□ Una consulta anidada, es una consulta SELECT completa
especificada dentro de la cláusula WHERE de otra consulta.
□ Listar los nombres y direcciones de todos los empleados que
trabajan en el departamento 'Investigación‘.
SELECT
SELECT NOMBREP,
NOMBREP,APELLIDO,
APELLIDO,DIRECCION
DIRECCION
FROM EMPLEADO
FROM ND
WHERE EMPLEADO
IN (SELECT NUMEROD
WHERE ND IN FROM
(SELECT DEPARTAMENTO
NUMEROD
WHERE NOMBRED='Investigación' )
FROM DEPARTAMENTO
WHERE NOMBRED='Investigación' )
29
CONSULTAS ANIDADAS CORRELACIONADAS
□ Si una condición en la cláusula WHERE de una consulta anidada
hace referencia a un atributo de una relación declarada en la
consulta exterior, se dice que las dos consultas están
correlacionadas.
□ La consulta anidada se evalúa una sola vez para cada tupla (o
combinación de tuplas) en la consulta exterior.
Listar el nombre de cada empleado que tiene un familiar en
relación de dependencia con el mismo nombre que el
empleado.
SELECT
[Link], [Link]
[Link], [Link]
FROM
FROM EMPLEADO AS E AS E
EMPLEADO
WHERE
[Link] [Link]
IN ( SELECT NSSE
IN (SELECT NSSE
FROM DEPENDIENTE
FROM DEPENDIENTE
WHERE NSSE=[Link]
WHERE ANDNSSE=[Link] AND
[Link]
= =
NOMBRE_DEPENDIENTE)
NOMBRE_DEPENDIENTE) 30
CONSULTAS ANIDADAS CORRELACIONADAS
□ Una consulta escrita con bloques
SELECT…FROM…WHERE anidados y que
emplee los operadores de comparación = o
IN siempre puede expresarse como una
consulta de un solo bloque:
SELECT [Link], [Link]
SELECT [Link], [Link]
FROM
FROMEMPLEADO E, DEPENDIENTE
EMPLEADO D D
E, DEPENDIENTE
WHERE [Link]=[Link] AND
WHERE [Link]=[Link] AND [Link] =
[Link]=D.NOMBRE_DEPENDIENTE
D.NOMBRE_DEPENDIENTE
31
FUNCIÓN EXISTS
□ EXISTS se usa para comprobar si el resultado de una
consulta anidada correlacionada está vacío (no
contiene tuplas)
SELECT NOMBREP, APELLIDO
SELECT FROM
NOMBREP,
EMPLEADOAPELLIDO
FROM
WHERE EMPLEADO
EXISTS (SELECT *
WHERE EXISTS (SELECT
FROM *
DEPENDIENTE
FROMNSS=NSSE
WHERE DEPENDIENTE
AND
WHERE = NSS=NSSE AND
NOMBREP
NOMBREP=NOMBRE_DEPENDIENTE)
NOMBRE_DEPENDIENTE)
32
FUNCIÓN EXISTS
Listar los nombres de empleados que no tienen
familiares en relación de dependencia.
SELECTNOMBREP,
SELECT NOMBREP, APELLIDO
APELLIDO
FROM EMPLEADO
FROM EMPLEADO
WHERE NOT EXISTS (SELECT *
WHERE NOT EXISTS (SELECT
FROM *DEPENDIENTE
FROM DEPENDIENTE
WHERE NSS=NSSE)
WHERE NSS=NSSE)
33
CONJUNTOS EXPLÍCITOS
□ Es posible usar un conjunto explícito de valores en
la cláusula WHERE, en vez de una consulta
anidada.
Obtener el número de seguro social de todos los
empleados que trabajan en los proyectos 1, 2 o 3.
SELECT DISTINCT
SELECT DISTINCTNSSE
NSSE
FROM TRABAJA_EN
FROM TRABAJA_EN
WHERE NUMP IN (1, 2, 3)
WHERE NUMP IN (1, 2, 3)
34
VALORES NULOS EN SQL
□ En SQL las consultas pueden comprobar si un valor es
NULL, ya sea que falte, no esté definido o no sea
aplicable.
□ SQL usa IS o IS NOT para comparar con NULL.
Obtener los nombres de todos los empleados que no
tienen supervisores.
SELECT
SELECTNOMBREP, APELLIDO
NOMBREP, APELLIDO
FROM
FROM EMPLEADO
EMPLEADO
WHERENSSSUPER
WHERE NSSSUPER IS NULL
IS NULL
Nota: Si se especifica una condición de unión, las tuplas con
valores NULL en los atributos de la condición no se incluyen en el
resultado.
35
FUNCIONES DE AGREGACIÓN
□ COUNT, SUM, MAX, MIN, y AVG
Encontrar el salario máximo, salario mínimo y el salario promedio
de todos los empleados.
SELECTMAX(SALARIO),
SELECT MAX(SALARIO),
MIN(SALARIO), AVG(SALARIO)
MIN(SALARIO), AVG(SALARIO)
FROM EMPLEADO
FROM EMPLEADO
36
FUNCIONES DE AGREGACIÓN
Encontrar el salario máximo, salario mínimo y el salario
promedio de todos los empleados del departamento
“Investigación”.
SELECT MAX(SALARIO), MIN(SALARIO), AVG(SALARIO)
FROM EMPLEADO, DEPARTAMENTO
WHERE
WHERE ND=NUMEROD AND
ND=NUMEROD AND
NOMBRED
NOMBRED ='Investigación'
='Investigación'
37
FUNCIONES DE AGREGACIÓN
Encontrar la cantidad total de empleados, y la cantidad de
empleados del departamento “Investigación”
SELECT COUNT
SELECT (*) (*)
COUNT
FROM
FROMEMPLEADO
EMPLEADO
SELECT
SELECT COUNT
COUNT (*) (*)
FROM
FROM EMPLEADO,
EMPLEADO, DEPARTAMENTO
DEPARTAMENTO
WHERE
WHERE ND=NUMEROD
ND=NUMEROD AND AND
NOMBRED='Investigación’
NOMBRED='Investigación’
38
AGRUPAMIENTOS
□ En muchos casos, se desea aplicar funciones de
agrupación a subgrupos de tuplas de una relación
□ GROUP BY- esta cláusula sirve para especificar los
atributos del agrupamiento
Para cada departmento, listar el número de
departmento, la cantidad de empleados y el salario
promedio del departamento.
SELECTND,ND,
SELECT COUNT
COUNT (*), (SALARIO)
(*), AVG AVG (SALARIO)
FROMEMPLEADO
FROM EMPLEADO
GROUPBYBYNDND
GROUP
39
AGRUPAMIENTOS
Para cada PROYECTO, listar el número, nombre y cantidad de
empleados que trabajan en el mismo.
SELECTNUMEROP,
SELECT NUMEROP, NOMBREP,
NOMBREP, COUNT
COUNT (*) (*)
FROM PROYECTO, TRABAJA_EN
FROM
WHEREPROYECTO, TRABAJA_EN
NUMEROP=NUMP
GROUPNUMEROP=NUMP
WHERE BY NUMEROP, NOMBREP
GROUP BY NUMEROP, NOMBREP
□ En este caso, el agrupamiento y la función de agregación son
aplicados después del producto de las dos relaciones
40
CLÁUSULA HAVING
□ La cláusula HAVING se usa para especificar una
condición sobre grupos (no sobre tuplas individuales)
Para cada proyecto en el que trabajen más de dos
empleados, obtener el número y el nombre del proyecto,
así como la cantidad de empleados que trabajan en él.
SELECT
SELECT NUMEROP,
NUMEROP,NOMBREP,
NOMBREP,COUNT(*)
COUNT(*)
FROM PROYECTO, TRABAJA_EN
FROM NUMEROP=NUMP
WHERE PROYECTO, TRABAJA_EN
GROUP
WHERE BY NUMEROP, NOMBREP
NUMEROP=NUMP
HAVING COUNT (*) > 2
GROUP BY NUMEROP, NOMBREP
HAVING COUNT (*) > 2
41
Resumen de cláusulas de
consultas SQL
□ Una consulta en SQL puede tener hasta seis
cláusulas, pero solo las primeras dos, SELECT y
FROM, son obligatorias. Las cláusulas se especifican
en el siguiente orden:
SELECT <lista de atributos>
FROM <lista de tablas>
[WHERE <condición>]
[GROUP BY <atributos de agrupamiento>]
[HAVING <condición de agrupamiento>]
[ORDER BY <lista de atributos>]
42