You are on page 1of 37

Lenguaje SQL

Pedro Pablo Alarcn


Departamento de O.E.I.
Escuela Universitaria de Informtica
Universidad Politcnica de Madrid

Lenguaje SQL
1. Introduccin
2. LMD- Operaciones de Recuperacin
3. LMD Operaciones de Actualizacin
4. Lenguaje de Definicin de Datos
5. Lenguaje de Control de Datos
6. SQL Inmerso

2002 Pedro P. Alarcn

U.P.M.- E.U.I. Bases de Datos

1. Introduccin
?

SQL (Structured Query Language)


?

?
?

Lenguaje de Consulta Estructurado, para bases de


datos relacionales
Es mucho ms que un lenguaje de consulta puesto
que permite adems funciones de definicin y control
de datos
La estandarizacin ha sido crucial para su difusin
Prcticamente la mayora de los sistemas relacionales
soportan las bases de SQL estndar y suelen incluir
aportaciones propias

U.P.M.- E.U.I. Bases de Datos

2002 Pedro P. Alarcn

Introduccin
?

Historia
?

?
?
?
?
?
2002 Pedro P. Alarcn

1974, IBM construye un prototipo de sistema relacional


llamado SYSTEMR que inclua el lenguaje SEQUEL,
posteriormente llamado SQL
1979, ORACLE aparece como primer gestor relacional
comercial, incluyendo lenguaje SQL
1981, primera implementacin de IBM con el sistema
SQL/DS
Desde 1983, fue el estndar de facto
1986, aparece el primer estndar (SQL-86)
1989, revisin del estndar anterior (SQL-89)
1992, se publica el segundo estndar (SQL-2 o SQL-92)
1999, aparece el tercer estndar (SQL -3 o SQL -99)
U.P.M.- E.U.I. Bases de Datos

Introduccin
?

Escribir sentencias o comandos SQL


?

Las sentencias SQL tienen


?
?

Palabras reservadas, que forman parte del lenguaje


Palabras definidas por el usuario, tales como, nombres de bases
de datos, tablas, atributos, etc.

Total independencia al escribir las sentencias


?

En SQL es indiferente escribir las palabras en maysculas o


minsculas, salvo para los literales

Cada clusula o palabra puede aparecer en lneas diferentes, lo


que no se puede hacer es separar una misma palabra
Se puede utilizar la identacin que se quiera
Una sentencia o comando SQL finaliza con la aparicin del
smbolo ; (no suele ser necesario para un nico comando)

?
?

U.P.M.- E.U.I. Bases de Datos

2002 Pedro P. Alarcn

Introduccin
?

Escribir sentencias o comandos SQL


?

Se utiliza una extensin de la notacin BNF


?
?

?
?
?
?

Las llaves representan elementos requeridos


Los corchetes representan elementos opcionales
Los ... Indican repeticin opcional (0 ms)

Literales
?
?

2002 Pedro P. Alarcn

Las palabras en maysculas representan palabras reservadas


Las palabras en minsculas representan palabras definidas por
el usuario
El smbolo | indica una eleccin entre alternativas

Son constantes utilizadas en las sentencias SQL


Todos los literales no numricos deben ir entrecomillados
U.P.M.- E.U.I. Bases de Datos

2. Operaciones de Recuperacin
?

Sintaxis de la sentencia
SELECT [DISTINCT | ALL] { * | expresion [AS alias] [,...] }
FROM tabla [AS alias] [, ...]
[WHERE condicion]
[GROUP BY lista_de_atributos

?
?

?
?
?
?

[HAVING condicin_de_grupo ]]
[ORDER BY lista_de_atributos [ASC/DESC] ];
SELECT: indica que informacin se desea obtener
FROM: especifica las tablas en las que se encuentran los
atributos implicados en la consulta
WHERE: especifica la condicin de bsqueda
GROUP BY: permite agrupar el resultado
HAVING: especifica una condicin de grupo
ORDER BY: permite ordenar el resultado
U.P.M.- E.U.I. Bases de Datos

2002 Pedro P. Alarcn

Operaciones de Consulta
?

Operadores
Los siguientes operadores se pueden utilizar para
expresar condiciones de fila (clusula WHERE) o
de grupo (clusula HAVING):
? De comparacin (<, <=, >, >=, <>, =)
? Lgicos (AND, OR, NOT)
? BETWEEN ... AND ...
? LIKE
? IN
? IS NULL
? Cuantificadores (ANY, SOME, ALL)
? Existencial (EXISTS)

2002 Pedro P. Alarcn

U.P.M.- E.U.I. Bases de Datos

Consultas sobre una tabla


?

Recuperacin simple
Obtener todos los datos de todos los proyectos
SELECT codP, descrip, localidad, cliente, telefono
FROM proyectos;
:
SELECT *
FROM proyectos;
* : equivale a todos los atributos de una tabla
Obtener los cdigos de mquina (CodM) para todas las
mquinas utilizadas
SELECT DISTINCT codM
FROM trabajos;

2002 Pedro P. Alarcn

U.P.M.- E.U.I. Bases de Datos

Clusula Distinct
?

Elimina los valores duplicados del resultado


Obtener las localidades de los conductores

SELECT codM
FROM trabajos;

Obtener las localidades de los conductores

SELECT DISTINCT codM


FROM trabajos;
?

Arganda
Arganda
Rivas
Arganda
Loeches
Rivas
Localidad
Arganda
Rivas
Loeches

Algunos gestores disponen de la clusula TOP n


SELECT DISTINCT TOP 2 codM
FROM trabajos;

2002 Pedro P. Alarcn

Localidad

Localidad
Arganda
Rivas

U.P.M.- E.U.I. Bases de Datos

Recuperacin Calificada
?

La clusula Where contiene una condicin simple


o compuesta mediante operadores lgicos.
Obtener los cdigos de los conductores de Arganda
SELECT codC
FROM conductores
WHERE localidad = 'Arganda';
?

CodC
C01
C02
C04

Los literales suelen ser sensibles a maysculas y


minsculas
ARGANDA <> Arganda <> arganda

Obtener los cdigos de los conductores de Arganda


que tengan categora inferior a 18
CodC
SELECT codC
C02
FROM conductores
WHERE localidad = 'Arganda' AND categ < 18;

2002 Pedro P. Alarcn

U.P.M.- E.U.I. Bases de Datos

Operador Between
?
?

Establece una comparacin dentro de un intervalo


Se utiliza en valores numricos o de fecha
Obtener el nombre de las mquinas cuyo precio por hora est
comprendido entre 11000 y 15000 ptas
SELECT nombre, preciohora
FROM maquinas
WHERE precio_hora BETWEEN 5000 AND 10000;
Nombre
Excavadora
Volquete

2002 Pedro P. Alarcn

PrecioHora
15000
11000

Tambin se puede utilizar NOT BETWEEN


U.P.M.- E.U.I. Bases de Datos

Operador Like
?

Establece una comparacin entre cadenas de


caracteres. Comodines:
% : secuencia de cero o ms caracteres (a veces se utiliza *)
_ (subrayado): sustituye a un solo carcter (a veces se utiliza ?)
Obtener los conductores que se apelliden Prez
SELECT nombre
FROM conductores
WHERE nombre LIKE %Prez%;

Nombre
Juan P rez
Carmen P rez

Tambin se puede utilizar NOT LIKE

U.P.M.- E.U.I. Bases de Datos

2002 Pedro P. Alarcn

Operador IN
?

Comprueba la pertenencia de un valor a un


conjunto dado
Obtener los nombres de aquellos conductores que residen
en Arganda o en Rivas
SELECT nombre
FROM conductores
WHERE localidad IN ('Arganda','Rivas');
?

Nombre
Jos Snchez
Manuel Daz
Juan P rez
Luis Ortiz
Carmen P rez

Tambin se puede utilizar NOT IN


Obtener nombres de conductores que no sean de Arganda
SELECT nombre
FROM conductores
Nombre
Juan Prez
WHERE localidad NOT IN ('Arganda');

Javier Mart n
Carmen P rez

2002 Pedro P. Alarcn

U.P.M.- E.U.I. Bases de Datos

Operador Is Null
?
?

Comprueba si un valor determinado es nulo


Un valor nulo no participa en ninguna
comparacin, solo se puede comprobar si es o
no nulo
Obtener los partes de trabajo que no figuren con el tiempo

empleado
CodC CodM
SELECT codC,codM,codP,Fecha
C02 M03
FROM trabajos
C01 M02
C02 M03
WHERE tiempo IS NULL;
?

CodP

Fecha

P02
P04
P01

15/09/02
17/09/02
18/09/02

Tambin se puede utilizar IS NOT NULL


U.P.M.- E.U.I. Bases de Datos

2002 Pedro P. Alarcn

Operadores All y Any


?
?

ALL: todos
ANY: algunos
?

Van acompaados de un operador de comparacin


?
?

>ALL, >=ALL, <ALL, <=ALL, =ALL, <>ALL


>ANY, >= ANY, <ANY, <=ANY, =ANY, <>ANY

Obtener proyectos que no sean de Arganda ni de Rivas


SELECT descrip, localidad
Descrip Localidad
Techado
Loeches
FROM proyectos
WHERE localidad <> ALL (Arganda, Rivas );
?

2002 Pedro P. Alarcn

<>ALL es equivalente a NOT IN

El segundo operando suele ser una subconsulta


U.P.M.- E.U.I. Bases de Datos

Operador Exists
?

Indica la existencia o no de un conjunto


Obtener nombres de las mquinas que se han utilizado en
el proyecto P03
SELECT nombre
FROM maquinas
WHERE EXISTS (SELECT *
FROM trabajos
WHERE trabajos.codM = maquinas.codM
AND codP = 'P03');
?

El operando suele ser una subconsulta

U.P.M.- E.U.I. Bases de Datos

2002 Pedro P. Alarcn

Operaciones de Conjuntos
?

Operadores de conjuntos
?
?

Los conjuntos deben ser union-compatible


Tipos
?

Union
?

Except (Minus en algunos gestores)

Intersect

2002 Pedro P. Alarcn

Diferencia de conjuntos
Interseccin de conjuntos

Sintaxis
?

Unin de conjuntos

SelectSQL { < union | intersect | except > [ all ] SelectSQL }

La opcin all elimina duplicados del resultado


U.P.M.- E.U.I. Bases de Datos

Operador Union
?

Unin de dos conjuntos que tiene que


estar definidos sobre los mismos dominios
Obtener los cdigos de aquellos conductores que
residan en Rivas o tengan categora inferior a 18
SELECT codC
FROM conductores
CodC
WHERE localidad = 'Rivas'
C02
C03
UNION
C05
SELECT codC
C06
FROM conductores
WHERE categ < 18;

2002 Pedro P. Alarcn

U.P.M.- E.U.I. Bases de Datos

Operador Union
?
?

La clusula ALL hace que no se eliminen duplicados


Pueden concatenarse varios en la misma sentencia
Obtener los cdigos de conductores que residan en Rivas o tengan
categora inferior a 15 o hayan manejado la mquina M01
SELECT codC
FROM conductores
WHERE localidad = 'Rivas'
UNION ALL
SELECT codC
FROM conductores
WHERE categ < 18
UNION ALL
SELECT codC
FROM trabajos
WHERE codM = M01;

CodC
C03
C06
C02
C05
C06
C03
C03

Sin los ALL en las clusulas UNION

2002 Pedro P. Alarcn

CodC
C02
C03
C05
C06

U.P.M.- E.U.I. Bases de Datos

10

Operador Except
?

Establece la diferencia de conjuntos, eliminado


las filas del primer operando que se encuentren
en el segundo
Obtener los cdigos de aquellos trabajadores que tengan

categora inferior a 15 y no hayan trabajado con la mquina M03


SELECT codC
FROM conductores
WHERE categ < 18
CodC
EXCEPT
SELECT codC
C06
FROM trabajos
WHERE codM = 'M03';

U.P.M.- E.U.I. Bases de Datos

2002 Pedro P. Alarcn

Operador Except
?

Algunos gestores no implementan este operador


?

Alternativa
Obtener los cdigos de aquellos trabajadores que tengan
categora inferior a 15 y no hayan trabajado con la mquina
M03
SELECT codC
FROM conductores
CodC
WHERE categ < 18
C06
AND codC NOT IN (SELECT codC
FROM trabajos
WHERE codM = 'M03);

2002 Pedro P. Alarcn

U.P.M.- E.U.I. Bases de Datos

11

Operador Intersect
?

Realiza la interseccin entre dos conjuntos,


obteniendo las filas comunes a ambos
Obtener los cdigos de los conductores que hayan utilizado las
mquina M01 y la mquina M03
SELECT codC
FROM trabajos
WHERE codM = 'M01'
INTERSECT
SELECT codC
FROM trabajos
WHERE codM = 'M03';

CodC

U.P.M.- E.U.I. Bases de Datos

2002 Pedro P. Alarcn

Operador Intersect
?

Algunos gestores no implementan este operador


?

Alternativa
Obtener los cdigos de los conductores que hayan utilizado la
mquina M01 y la mquina M03
SELECT codC
FROM trabajos
WHERE codM = 'M01'
AND codC IN (SELECT codC
FROM trabajos
WHERE codM = 'M03);
?

Solucin Errnea
SELECT codC
FROM trabajos
WHERE codM = 'M01 AND codM = 'M03);

2002 Pedro P. Alarcn

CodC

CodC

U.P.M.- E.U.I. Bases de Datos

12

Funciones Agregadas
?

Funciones agregadas de ISO


?

COUNT (*)
?
?

AVG
?
?

media aritmtica de un atributo o una expresin num rica


puede utilizar la clusula Distinct

SUM
?
?

suma de atributos o expresiones num ricas


puede utilizar la clusula Distinct

MAX

MIN

2002 Pedro P. Alarcn

contador de tuplas (cuenta valores duplicados y nulos)


Con la clusula Distinct no tiene en cuenta valores nulos ni
duplicados

valor m ximo de un atributo o expresin num rica


valor m nimo de un atributo o expresin num rica
U.P.M.- E.U.I. Bases de Datos

Funciones Agregadas
?
?

2002 Pedro P. Alarcn

Devuelven un valor nico, numrico


Solo pueden utilizarse en la clusula Select o
en la clusula Having No se pueden combinar ,
con columnas que devuelvan m s de un valor,
a menos que la consulta contenga una clusula
GROUP BY
Count, Min y Max se pueden aplicar a atributos
numricos o no numricos, pero Sum y Avg
solo se pueden aplicar a numricos
Salvo la funcin Count(*), las dems solo tienen
en cuenta para su c lculo valores no-nulos
U.P.M.- E.U.I. Bases de Datos

13

Funciones Agregadas
Obtener el nmero total de proyectos en los que se est trabajando
SELECT COUNT(*)
12
FROM trabajos;
Obtener el nmero total de mquinas que se han utilizado en 'P02'
SELECT COUNT (DISTINCT codM)
3
FROM trabajos
WHERE codP = 'P02';
Obtener el precio medio por hora de las mquinas
SELECT AVG(preciohora)
13500
FROM maquinas

2002 Pedro P. Alarcn

U.P.M.- E.U.I. Bases de Datos

Funciones Agregadas
Obtener el mximo para el nombre y el preciohora de las mquinas
SELECT max(nombre), max(preciohora)
Volquete 18000
FROM maquinas;
Obtener la mxima fecha, el mnimo tiempo y la suma y media del
tiempo de la tabla trabajos
SELECT max(fecha), min(tiempo), sum(tiempo), avg(tiempo)
FROM trabajos
18/09/02

30

1260

140

Contar el nmero de filas de la tabla trabajos, numero de valores de


la columna tiempo, y nmero de valores distintos de dicha columna
SELECT count(*), count(tiempo), count(distinct tiempo)
FROM maquinas
12

2002 Pedro P. Alarcn

U.P.M.- E.U.I. Bases de Datos

14

Clusula Group By
?

GROUP BY <lista_de_atributos>
Agrupa el resultado, devolviendo una nica fila por
grupo
Los atributos que aparezcan en GROUP BY, deben
aparecer en la clusula SELECT

Obtener por cada conductor que haya trabajado, el cdigo


de ste y la cantidad total de tiempo empleado
SELECT codC, SUM(tiempo)
FROM trabajos
GROUP BY codC;

U.P.M.- E.U.I. Bases de Datos

2002 Pedro P. Alarcn

Clusula Group By
CodC Tiempo
C02
C03
C05

100
200
150

C04
C01
C02
C03
C02
C01
C05
C01
C02

90
120
30
300
null
180
90
null
null

2002 Pedro P. Alarcn

C02
C02

100
30

C02
C02

null
null

C03
C03

200
300

C05
C05

150
90

C04

90

C01
C01

120
180

C01

null

C01
C02
C03
C04
C05

300
130
500
90
240

U.P.M.- E.U.I. Bases de Datos

15

Clusula Having
HAVING <condicion_de_grupo>
?
?

Siempre va acompaada de la clusula GROUP BY


Especifica una condicin de grupo

Obtener para los conductores que figuren cin ms de un trabajo


realizado, la suma de tiempos trabajados
SELECT codC, SUM (tiempo)
FROM trabajos
GROUP BY codC
HAVING COUNT(*) > 1;

2002 Pedro P. Alarcn

C01
C02
C03
C05

300
130
500
240

U.P.M.- E.U.I. Bases de Datos

Clusula Having
Obtener para los conductores que hayan utilizado la misma
mquina ms de una vez entre el 12/09/02 y el 18/09/02, el
cdigo de conductor, el cdigo de mquina y el tiempo total
empleado
SELECT codC, codM, SUM (tiempo)
FROM trabajos
WHERE fecha BETWEEN 12/09/02 AND 18/09/94
GROUP BY codC , codM
HAVING COUNT(*) > 1;

2002 Pedro P. Alarcn

U.P.M.- E.U.I. Bases de Datos

16

Clusula Having
CodC CodM CodP
C02 M03
C03 M01
C05 M03
C04 M03
C01 M02
C02 M03
C03 M01
C02 M03
C01 M03
C05 M03
C01 M02
C02 M03

Fecha Tiempo

P01 10/09/02
P02 10/09/02
P02 10/09/02
P02 10/09/02
P02 12/09/02
P03 13/09/02
P04 15/09/02
P02 15/09/02
P04 15/09/02
P04 15/09/02
P04 17/09/02
P01 18/09/02

100
200
150
90
120
30
300
null
180
90
null
null

C01
C01

M02 120
M02 null

C01

M03 180

C02
C02
C02

M03
M03
M03

C03

M01 300

C05

M03

30
null
null

C01
C02

M02 120
M03
30

90

U.P.M.- E.U.I. Bases de Datos

2002 Pedro P. Alarcn

Clusula Order By
?

ORDER BY <lista_de_atributos> [ASC | DESC]


El resultado de la consulta se ordena en base a los
atributos que se indiquen en la lista
Los atributos de ordenacin deben aparecer en
SELECT

Obtener los partes de trabajo correspondientes al proyecto 'P4'


ordenados ascendentemente por conductor y mquina
SELECT *
CodC CodM CodP Fecha Tiempo
FROM trabajos
WHERE codP = 'P04'
ORDER BY codP, codM;

2002 Pedro P. Alarcn

C01
C01
C03
C05

M02
M03
M01
M03

P04
P04
P04
P04

17/09/02
15/09/02
15/09/02
15/09/02

null
180
300
90

U.P.M.- E.U.I. Bases de Datos

17

Alias de tablas y columnas


?

?
?

Para hacer el nombre de una columna ms significativo


cuando se muestra
Abreviar un nombre de una tabla o de una columna que
se usa a menudo
Hacer ms clara una instruccin complicada de SQL
Distinguir entre dos ocurrencias del mismo nombre de
columna o tabla en cualquier instruccin SELECT
Se indican
FROM tabla [[as] Alias]
?

En el SELECT para columnas

En el FROM para tablas

El alias de columna puede ir entre comillas para especificar un


alias de mas de una palabra, pero el de tabla no

SELECT expresion [[as] Alias] [, ...]


FROM tabla [[as] Alias] [, ...]

U.P.M.- E.U.I. Bases de Datos

2002 Pedro P. Alarcn

Expresiones en la clusula SELECT


?

No slo se pueden seleccionar atributos, sino

expresiones en las que aparezcan atributos y/o


constantes y operadores aritmticos
SELECT nombre, 'coste final: As texto, (precio_hora*1.15) As
NuevoPrecio
FROM maquinas As m
WHERE m.preciohora < 18000;
Nombre

2002 Pedro P. Alarcn

texto

NuevoPrecio

Excavadora

coste final por hora:

17250

Hormigonera

coste final por hora:

11500

Volquete

coste final por hora:

12650

U.P.M.- E.U.I. Bases de Datos

18

Consultas con ms de una tabla


?

Operacin algebraica de Unin Natural o Join


?

Permite relacionar dos tablas para obtener


informacin comn
Subconjunto del producto cartesiano de dos
tablas en las que se seleccionan las filas con el
mismo valor para los atributos comunes
Debe existir al menos un atributo (dominio) comn
entre las tablas participantes (por lo general, clave
principal-clave fornea
Alternativas en SQL
?
?
?

Consultas anidadas
Condicin de unin natural
Clusula JOIN
U.P.M.- E.U.I. Bases de Datos

2002 Pedro P. Alarcn

Consultas con ms de una tabla


?

Ejemplo
Obtener nombres de trabajadores que han utilizado la mquina 'M2'
SELECT nombre
FROM conductores
WHERE codC IN (SELECT codC
FROM trabajos
WHERE codM = 'M02');
SELECT nombre
FROM conductores, trabajos
WHERE conductores. codC = trabajos. codC AND codM = 'M02';
SELECT nombre
FROM conductores INNER JOIN trabajos
ON conductores. codC = trabajos. codC
WHERE codM = 'M02';

2002 Pedro P. Alarcn

U.P.M.- E.U.I. Bases de Datos

19

Consultas Anidadas
?

Las consultas anidadas establecen una


comparacin entre dos operandos
?

Posibilidades
?
?
?
?
?
?

operador In
operador Any
operador All
operador de comparacin
operador Exists
tupla

U.P.M.- E.U.I. Bases de Datos

2002 Pedro P. Alarcn

Consultas Anidadas
?

Operador IN
Obtener la descripcin y cliente de aquellos proyectos en los que
hayan trabajado mquinas con un precio hora superior a 12000
conducidas por conductores de Rivas
SELECT descrip, cliente
FROM proyectos
WHERE codp In (SELECT codP
FROM trabajos
WHERE codM In (SELECT CodM
FROM maquinas
WHERE preciohora > 12000)
AND codC In (SELECT codC
FROM conductores
WHERE localidad = 'Rivas'))

2002 Pedro P. Alarcn

U.P.M.- E.U.I. Bases de Datos

20

Consultas Anidadas
?

Operador Any
Obtener los trabajadores con categora inferior a la de algn
trabajador de Arganda
SELECT nombre
FROM conductores
WHERE categ < ANY (SELECT categ
FROM conductores
WHERE localidad = Arganda);

U.P.M.- E.U.I. Bases de Datos

2002 Pedro P. Alarcn

Consultas Anidadas
?

Operador All
Obtener conductores que no han participado en el proyecto 'P1'
SELECT nombre
FROM conductor
WHERE codC <> ALL (SELECT codC
FROM trabajos
WHERE codP = 'P01');
?

2002 Pedro P. Alarcn

<>ALL es equivalente a NOT IN

U.P.M.- E.U.I. Bases de Datos

21

Consultas Anidadas
?

Operador de comparacin
Obtener de el conductor de Arganda que tenga la categora ms
alta de entre los que sean de Arganda
SELECT nombre
FROM conductores
WHERE categ = (SELECT MAX(categ)
FROM conductores
WHERE localidad = 'Arganda')
AND localidad = 'Arganda';

2002 Pedro P. Alarcn

U.P.M.- E.U.I. Bases de Datos

Consultas Anidadas
?

Operador Exists

Encontrar todos los conductores que no tengan un homnimo


SELECT *
FROM conductores C
WHERE NOT EXISTS (SELECT *
FROM conductores C1
WHERE C1.nombre = C.nombre
AND C1.localidad = C.localidad
AND C1.categ <> C.categ)

2002 Pedro P. Alarcn

U.P.M.- E.U.I. Bases de Datos

22

Consultas Anidadas
?

La comparacin con la subconsulta anidada


puede incluir ms de un atributo
Los atributos deben ir entre parntesis separados
por comas
Ejemplo
SELECT *
FROM conductores C
WHERE (nombre,localidad) NOT IN (SELECT nombre,localidad
FROM conductores C1
WHERE C1.categ <> C.categ)

U.P.M.- E.U.I. Bases de Datos

2002 Pedro P. Alarcn

Consultas Anidadas
?

Alcance de variables
?

Consulta incorrecta
SELECT *
FROM Conductores
WHERE codC IN (SELECT codC
FROM trabajos T1
WHERE codM = M02)
OR codC IN (SELECT codC
FROM trabajos T2
WHERE T2.fecha = T1.fecha)

2002 Pedro P. Alarcn

La consulta es incorrecta porque T1 no es visible


desde la segunda subconsulta

U.P.M.- E.U.I. Bases de Datos

23

Consultas Anidadas
?

Subconsultas en la clusula Select y From

Obtener el nombre, localidad y categora, junto con la categora


mxima de todos los conductores, para los conductores de Loeches
que tengan la mxima categora de Loeches
SELECT nombre, localidad, categ,
(SELECT MAX(categ) FROM conductores) As MaxCateg
FROM conductores
WHERE localidad = 'Loeches' AND
categ >= ALL (SELECT categ
FROM conductores
WHERE localidad = 'Loeches');

U.P.M.- E.U.I. Bases de Datos

2002 Pedro P. Alarcn

Condicin de Join
?

Se debe poner una condicin de join en el Where, por cada


atributo comn entre cada dos tablas relacionadas de las
que figuren en la clusula FROM
tabla1.atributoComun = tabla2.atributoComun

Obtener para cada mquina utilizada, el cdigo de mquina y el


nombre
SELECT conductores.nombre AS cond, descrip,maquinas.nombre AS
maq
FROM conductores, trabajos, proyectos, maquinas
WHERE conductores.codc=trabajos.codC AND
trabajos.codp = proyectos.codP AND
trabajos.codm = maquinas.codM AND
preciohora > 14000
cond
descrip maq
Juan Prez Solado Excavadora
Juan Prez Techado Excavadora
2002 Pedro P. Alarcn

U.P.M.- E.U.I. Bases de Datos

24

Clusula Join
?

Sintaxis
?

FROM tabla { [tipoJoin] JOIN ON condicionJoin }


tipoJoin
?

INNER
?
?

LEFT [OUTER]

RIGHT [OUTER]

FULL [OUTER]

es la unin natural
solo se tienen en cuanta las filas con igualdad en los atributos
comunes
se tienen en cuenta todas las filas de la tabla izquierda
se tienen en cuenta todas las filas de la tabla derecha
se tienen en cuenta todas las filas de ambas tablas

condicionJoin
tabla1.atributoComun = tabla2.atributoComun
U.P.M.- E.U.I. Bases de Datos

2002 Pedro P. Alarcn

Clusula Join
?

Inner Join
Obtener el nombre del conductor y tiempo empleado para aquellos trabajos
realizados el 10/09/02
SELECT nombre, tiempo
FROM conductores INNER JOIN trabajos ON
conductores.codC=trabajos.codC
WHERE fecha = 10/09/02;
nombre

Tiempo

Manuel Daz 100


Juan Prez
200
Luis Ortiz
90
Javier Mart n 150

2002 Pedro P. Alarcn

U.P.M.- E.U.I. Bases de Datos

25

Clusula Join
?

Left Join
SELECT nombre, codm, codp, fecha, tiempo
FROM conductores LEFT JOIN trabajos
ON conductores.codC=trabajos.codC
WHERE localidad = Rivas;
nombre

codP

codM Tiempo

Juan Prez
P02
M01 200
Juan Prez
P04
M01 300
Carmen P rez NULL NULL NULL

U.P.M.- E.U.I. Bases de Datos

2002 Pedro P. Alarcn

Clusula Join
?

Right Join
SELECT nombre, codm, codp, fecha, tiempo
FROM conductores RIGHT JOIN trabajos
ON conductores.codC=trabajos.codC
WHERE localidad = Rivas;

2002 Pedro P. Alarcn

nombre

codP

codM Tiempo

Juan Prez
Juan Prez

P02
P04

M01
M01

200
300

U.P.M.- E.U.I. Bases de Datos

26

Clusula Join
?

Full Join

SELECT nombre, codm, descrip,tiempo


FROM conductores FULL JOIN trabajos ON conductores.codC =
trabajos.codC
FULL JOIN proyectos ON trabajos.codP = proyectos.codP
WHERE conductores.localidad = Rivas OR proyectos.localidad = Rivas ;
nombre

codM

Jos Snchez
Manuel Daz
Juan Prez
Juan Prez
Luis Ortiz
Javier Mart n
Carmen P rez
null

M02
M03
M01
M01
M03
M03
null
null

descrip Tiempo
Solado
Solado
Solado
Techado
Solado
Solado
null
Buhardilla

120
null
200
300
90
150
null
null

U.P.M.- E.U.I. Bases de Datos

2002 Pedro P. Alarcn

3. Operaciones de Actualizacin
?

Insercin de filas
?

Insercin de una fila


INSERT INTO tabla [(listaAtributos)]
VALUES (valor1, valor2,..., valorn);

Insercin de varias filas


INSERT INTO tabla [(listaAtributos)]
( clausulaSELECT )
?

2002 Pedro P. Alarcn

La clusula "SELECT" especifica una consulta cuyo resultado


(filas) se insertar en la tabla especificada
listaAtributos es opcional. Si se omite, se asume la lista de
atributos en el orden original de la sentencia Create Table
Cualquier columna que se omita debe estar definida como Not
Null, salvo que se haya especificado un valor por defecto con
Default
U.P.M.- E.U.I. Bases de Datos

27

Operaciones de Actualizacin
?

Insercin de filas
?

Insercin de una fila


INSERT INTO Trabajos
VALUES ('C02','M03','P01','10/09/02',100);
?

Cuando no se conoce algn valor


?

se puede poner la palabra reservada null


INSERT INTO Conductores
VALUES ('C07',Jorge Gil',null,18);

se puede omitir el valor


INSERT INTO Conductores
VALUES ('C07', Jorge Gil',,18);

indicar valor solo para un subconjunto de los atributos


INSERT INTO Conductores (codC,nombre,categ)
VALUES ('C07', Jorge Gil', 18);

U.P.M.- E.U.I. Bases de Datos

2002 Pedro P. Alarcn

Operaciones de Actualizacin
?

Insercin de filas
?

Insercin de varias filas


INSERT INTO ConductoresArganda
(SELECT *
FROM Conductores
WHERE localidad = Arganda);

Los valores obtenidos de la consulta deben


coincidir en dominio con los de la tabla
? En la subconsulta no conviene poner * si no la lista
de atributos, de forma que podamos hacer algo
independiente esta sentencia de la posible
variacin de la estructura de la tabla en la que se
basa la subconsulta
?

2002 Pedro P. Alarcn

U.P.M.- E.U.I. Bases de Datos

28

Operaciones de Actualizacin
?

Modificacin de filas
UPDATE tabla
SET atributo = expresion | selectSQL | null | default
{, atributo = expresion | selectSQL | null | default}
[WHERE condicion];
?
?

Tabla puede ser una tabla base o una vista actualizable


El valor que se asigne a un atributo puede ser una expresin, o
el resultado de una subconsulta (que deber ir entre parntesis),
o el valor null, o el valor por defecto definido en el atributo
La modificacin afectar a todas las filas que cumplan la
condicin, si se especifica sta. Si no se especifica condicin, la
modificacin afectar a todas las filas de la tabla

U.P.M.- E.U.I. Bases de Datos

2002 Pedro P. Alarcn

Operaciones de Actualizacin
?

Modificacin de filas
Incrementar en un 15% el valor de categora de los conductores
de Rivas
UPDATE conductores
SET categ = categ * 1.15
WHERE localidad = Rivas

Sumar a la categora de los conductores de Loeches, la


categora ms alta de todos los conductores
UPDATE conductores
SET categ = categ + (SELECT distinct categ
FROM conductores
WHERE categ = (SELECT max(categ)
FROM conductores))
WHERE localidad = 'Loeches'

2002 Pedro P. Alarcn

U.P.M.- E.U.I. Bases de Datos

29

Operaciones de Actualizacin
?

Eliminacin de filas
DELETE
FROM nombre_tabla
[WHERE condicion];
?
?

2002 Pedro P. Alarcn

No se pueden eliminar partes de una fila


Si no aparece la clusula "WHERE" se eliminarn
todas las filas de la tabla, no eliminndose la
definicin de sta en el esquema
El borrado de una fila puede provocar el borrado de
filas de otras tablas, si hay definida una restriccin
de integridad referencial con opcin Cascade
U.P.M.- E.U.I. Bases de Datos

Operaciones de Actualizacin
?

Eliminacin de filas
Eliminar el proyecto o proyectos de Felipe Sol
DELETE FROM proyectos
WHERE cliente = Felipe Sol;
? Si no se ha definido integridad referencial con la tabla
trabajos hay que dejar la BD consistente
DELETE FROM trabajos
WHERE codP NOT IN (SELECT codP
FROM proyectos)

2002 Pedro P. Alarcn

U.P.M.- E.U.I. Bases de Datos

30

4. Lenguaje de Definicin de Datos


?

Creacin de tablas (estndar 86)


CREATE TABLE nombre_tabla
(definicin_atributo_1 [UNIQUE] [NOT NULL],
(definicin_atributo_2 [UNIQUE] [NOT NULL],
.....................
(definicin_atributo_n [UNIQUE] [NOT NULL]);

donde:
?
?
?

2002 Pedro P. Alarcn

definicin_atributo = nombre_atributo tipo_dato (tamao)


UNIQUE: no se permiten valores duplicados en la columna
NOT NULL: no se permiten valores nulos en la columna

U.P.M.- E.U.I. Bases de Datos

Lenguaje de Definicin de Datos


?

SQL2
CREATE SCHEMA nombrebd AUTHORIZATION usuario;
CREATE DOMAIN nombre AS tipodato [DEFAULT valor]
[CHECK condicion];
CREATE TABLE [esquema.]nombre_tabla
(atributo tipodato | dominio [NOT NULL] [DEFAULT valor]
[CHECK condicion], ....
PRIMARY KEY (atributo ,...)
[UNIQUE (atributo ,...)]
[FOREIGN KEY (atributo) REFERENCES tabla (atributo )
[ON {DELETE|UPDATE} {SET NULL|SET DEFAULT|CASCADE|NO ACTION}]]
[CHECK (condicion)] );

2002 Pedro P. Alarcn

U.P.M.- E.U.I. Bases de Datos

31

Lenguaje de Definicin de Datos


?

ISO SQL data types

U.P.M.- E.U.I. Bases de Datos

2002 Pedro P. Alarcn

Lenguaje de Definicin de Datos


?

Integridad Referencial
?

Todo valor de la clave fornea (tabla dependiente) debe figurar en


la clave principal (tabla padre) de la que depende, o ser nulo
Opciones
?

CASCADE
?

SET NULL
?

Al eliminar una fila de la tabla padre deja con el valor por defecto la
clave fornea de las filas relacionadas de la tabla dependiente. Solo
es vlido para claves forneas definidas con un valor por defecto

NO ACTION
?

2002 Pedro P. Alarcn

Al eliminar una fila de la tabla padre deja con valor nulo la clave
fornea de las filas relacionadas de la tabla dependiente. Solo es
vlido para claves forneas definidas como Not Null

SET DEFAULT
?

Elimina cascada las filas de un atabla dependiente al eliminar


una fila de la tabla padre

Impide la eliminacin de la fila padre si tiene filas dependientes


relacionadas. Es la opci n por defecto
U.P.M.- E.U.I. Bases de Datos

32

Lenguaje de Definicin de Datos


?

Modificacin de tablas
?

Aadir un nuevo atributo


ALTER TABLE nombre_tabla
ADD definicin_atributo;

Modificar un atributo ya existente


ALTER TABLE nombre_tabla
MODIFY definicion_atributo

Eliminacin de tablas
DROP TABLE nombre_tabla

U.P.M.- E.U.I. Bases de Datos

2002 Pedro P. Alarcn

Lenguaje de Definicin de Datos


?

Creacin de vistas
CREATE VIEW nombre_vista (lista_atributos)
AS (clausula_SELECT )
[WITH CHECK OPTION]
?

Las filas de la vista sern aquellas que resulten de


ejecutar la consulta sobre la que est definida
La clusula With Chechk Option, comprueba que al
actualizar la vista se cumplan las condiciones
expresadas en la misma.

Eliminacin de vistas
DROP VIEW nombre_vista;

2002 Pedro P. Alarcn

U.P.M.- E.U.I. Bases de Datos

33

Lenguaje de Definicin de Datos


?

Creacin de ndices
CREATE [UNIQUE] INDEX nombre_indice
ON nombre_tabla (lista_atributos);
?

Es el sistema el encargado de utilizar los ndices,


para optimizar el acceso a los datos

El usuario slo puede crear o eliminar


ndices, pero no indicar su utilizacin
Eliminacin de ndices
?

DROP INDEX nombre_indice


[ON nombre_tabla]

U.P.M.- E.U.I. Bases de Datos

2002 Pedro P. Alarcn

5. Lenguaje de Control de Datos


?

Seguridad de los datos


?

Concesin de privilegios
?

Permite conceder a los usuarios el acceso completo o


restringido a las tablas de la base de datos
GRANT <accesos> ON <lista_de_tablas>
TO <lista_de_cesionarios>|PUBLIC
[WITH GRANT OPTION];

donde:
?
?
?

2002 Pedro P. Alarcn

accesos: ALL PRIVILEGES, SELECT, UPDATE, INSERT, DELETE


PUBLIC: se conceden los privilegios a todos los usuarios
WITH GRANT OPTION: se concede el privilegio de poder
otorgar privilegios a otros usuarios

U.P.M.- E.U.I. Bases de Datos

34

Lenguaje de Control de Datos


?

Revocacin de privilegios
Se utiliza para anular privilegios ya concedidos
a los usuarios
REVOKE <accesos>
FROM <nombre_usuario> TO <lista_de_tablas>

U.P.M.- E.U.I. Bases de Datos

2002 Pedro P. Alarcn

Lenguaje de Control de Datos


?

Integridad de los datos


?

COMMIT WORK
?

ROLLBACK WORK
?

2002 Pedro P. Alarcn

Los cambios que se puedan estar realizando sobre la base


de datos se hacen fijos nicamente al completar la
transaccin
Elimina todos los cambios que se hayan podido producir en
la base de datos desde la ejecucin de la ltima instruccin
COMMIT
Si se produce un error de programa o un fallo hardware el
sistema realiza un ROLLBACK automticamente

U.P.M.- E.U.I. Bases de Datos

35

6. SQL Inmerso
?

Instrucciones
?

Van precedidas de las palabras clave EXEC SQL

Variables principales
Las variables principales del programa, pueden
utilizarse para almacenar el resultado de una
consulta que devuelva una sola fila o bien pueden
utilizarse en la propia instruccin SQL.
? deben aparecer en una seccin de declaracin en
el programa principal. Esta seccin comenzar con
EXEC SQL BEGIN DECLARE y finalizar con
EXEC SQL END DECLARE.
?

U.P.M.- E.U.I. Bases de Datos

2002 Pedro P. Alarcn

SQL Inmerso
?

Cursores
?

Son ficheros virtuales de registros, en los que se


almacenan el resultado de una consulta
Se declaran de la siguiente forma:
EXEC SQL DECLARE <nombre_cursor> CURSOR FOR
<consulta_SQL>;

Para abrirlo:
EXEC SQL OPEN <nombre_cursor>;

La forma de leer un registro del cursor es:


EXEC SQL FETCH <nombre_cursor> INTO
<variables_principales>;

Para cerrarlo:
EXEC SQL CLOSE <nombre_cursor>;

2002 Pedro P. Alarcn

U.P.M.- E.U.I. Bases de Datos

36

Base de Datos del Ejemplo


Maquinas

Proyectos

CodM Nombre
CodP Descrip Localidad Cliente

Telefono

P01 Garaje
P02 Solado
P03 Garaje
P04 Techado
P05 Buhardilla

600111111
912222222
666999666
913333333
null

Arganda
Rivas
Arganda
Loeches
Rivas

Felipe Sol
Jos Prez
Rosa Lpez
Jos Prez
Ana Botijo

M01
M02
M03
M04

PrecioHora

Excavadora
Hormigonera
Volquete
Apisonadora

15000
10000
11000
18000

Trabajos

CodC CodM CodP


Conductores

CodC

Nombre

C01 Jos Snchez


C02 Manuel Daz
C03 Juan Prez
C04 Luis Ortiz
C05 Javier Mart n
C06 Carmen P rez

Localidad Categ
Arganda
Arganda
Rivas
Arganda
Loeches
Rivas

18
15
20
18
12
15

C02 M03
C03 M01
C05 M03
C04 M03
C01 M02
C02 M03
C03 M01
C02 M03
C01 M03
C05 M03
C01 M02
C02 M03

Fecha Tiempo

P01 10/09/02
P02 10/09/02
P02 10/09/02
P02 10/09/02
P02 12/09/02
P03 13/09/02
P04 15/09/02
P02 15/09/02
P04 15/09/02
P04 15/09/02
P04 17/09/02
P01 18/09/02

100
200
150
90
120
30
300
null
180
90
null
null

37

You might also like