Professional Documents
Culture Documents
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
1. Introduccin
?
?
?
Introduccin
?
Historia
?
?
?
?
?
?
2002 Pedro P. Alarcn
Introduccin
?
?
?
Introduccin
?
?
?
?
?
Literales
?
?
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
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)
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;
Clusula Distinct
?
SELECT codM
FROM trabajos;
Arganda
Arganda
Rivas
Arganda
Loeches
Rivas
Localidad
Arganda
Rivas
Loeches
Localidad
Localidad
Arganda
Rivas
Recuperacin Calificada
?
CodC
C01
C02
C04
Operador Between
?
?
PrecioHora
15000
11000
Operador Like
?
Nombre
Juan P rez
Carmen P rez
Operador IN
?
Nombre
Jos Snchez
Manuel Daz
Juan P rez
Luis Ortiz
Carmen P rez
Javier Mart n
Carmen P rez
Operador Is Null
?
?
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
ALL: todos
ANY: algunos
?
Operador Exists
?
Operaciones de Conjuntos
?
Operadores de conjuntos
?
?
Union
?
Intersect
Diferencia de conjuntos
Interseccin de conjuntos
Sintaxis
?
Unin de conjuntos
Operador Union
?
Operador Union
?
?
CodC
C03
C06
C02
C05
C06
C03
C03
CodC
C02
C03
C05
C06
10
Operador Except
?
Operador Except
?
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);
11
Operador Intersect
?
CodC
Operador Intersect
?
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);
CodC
CodC
12
Funciones Agregadas
?
COUNT (*)
?
?
AVG
?
?
SUM
?
?
MAX
MIN
Funciones Agregadas
?
?
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
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
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
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
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
15
Clusula Having
HAVING <condicion_de_grupo>
?
?
C01
C02
C03
C05
300
130
500
240
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;
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
Clusula Order By
?
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
17
?
?
texto
NuevoPrecio
Excavadora
17250
Hormigonera
11500
Volquete
12650
18
Consultas anidadas
Condicin de unin natural
Clusula JOIN
U.P.M.- E.U.I. Bases de Datos
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';
19
Consultas Anidadas
?
Posibilidades
?
?
?
?
?
?
operador In
operador Any
operador All
operador de comparacin
operador Exists
tupla
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'))
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);
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');
?
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';
Consultas Anidadas
?
Operador Exists
22
Consultas Anidadas
?
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)
23
Consultas Anidadas
?
Condicin de Join
?
24
Clusula Join
?
Sintaxis
?
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
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
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
Clusula Join
?
Right Join
SELECT nombre, codm, codp, fecha, tiempo
FROM conductores RIGHT JOIN trabajos
ON conductores.codC=trabajos.codC
WHERE localidad = Rivas;
nombre
codP
codM Tiempo
Juan Prez
Juan Prez
P02
P04
M01
M01
200
300
26
Clusula Join
?
Full Join
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
3. Operaciones de Actualizacin
?
Insercin de filas
?
27
Operaciones de Actualizacin
?
Insercin de filas
?
Operaciones de Actualizacin
?
Insercin de filas
?
28
Operaciones de Actualizacin
?
Modificacin de filas
UPDATE tabla
SET atributo = expresion | selectSQL | null | default
{, atributo = expresion | selectSQL | null | default}
[WHERE condicion];
?
?
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
29
Operaciones de Actualizacin
?
Eliminacin de filas
DELETE
FROM nombre_tabla
[WHERE condicion];
?
?
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)
30
donde:
?
?
?
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)] );
31
Integridad Referencial
?
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
?
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
?
32
Modificacin de tablas
?
Eliminacin de tablas
DROP TABLE nombre_tabla
Creacin de vistas
CREATE VIEW nombre_vista (lista_atributos)
AS (clausula_SELECT )
[WITH CHECK OPTION]
?
Eliminacin de vistas
DROP VIEW nombre_vista;
33
Creacin de ndices
CREATE [UNIQUE] INDEX nombre_indice
ON nombre_tabla (lista_atributos);
?
Concesin de privilegios
?
donde:
?
?
?
34
Revocacin de privilegios
Se utiliza para anular privilegios ya concedidos
a los usuarios
REVOKE <accesos>
FROM <nombre_usuario> TO <lista_de_tablas>
COMMIT WORK
?
ROLLBACK WORK
?
35
6. SQL Inmerso
?
Instrucciones
?
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.
?
SQL Inmerso
?
Cursores
?
Para abrirlo:
EXEC SQL OPEN <nombre_cursor>;
Para cerrarlo:
EXEC SQL CLOSE <nombre_cursor>;
36
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
Nombre
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