SQL BD Pedro -...
Transcript of SQL BD Pedro -...
1
Lenguaje SQL
Pedro Pablo Alarcón
Departamento de O.E.I.Escuela Universitaria de InformáticaUniversidad Politécnica de Madrid
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Lenguaje SQL
1. Introducción2. LMD- Operaciones de Recuperación3. LMD – Operaciones de Actualización4. Lenguaje de Definición de Datos5. Lenguaje de Control de Datos6. SQL Inmerso
2
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
1. Introducción? SQL (Structured Query Language)
? Lenguaje de Consulta Estructurado, para bases de datos relacionales
? Es mucho más que un lenguaje de consulta puesto que permite además funciones de definición y control de datos
? La estandarización ha sido crucial para su difusión? Prácticamente la mayoría de los sistemas relacionales
soportan las bases de SQL estándar y suelen incluir aportaciones propias
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Introducción? Historia
? 1974, IBM construye un prototipo de sistema relacional llamado SYSTEMR que incluía el lenguaje SEQUEL, posteriormente llamado SQL
? 1979, ORACLE aparece como primer gestor relacional comercial, incluyendo lenguaje SQL
? 1981, primera implementación de IBM con el sistema SQL/DS
? Desde 1983, fue el estándar de facto? 1986, aparece el primer estándar (SQL-86)? 1989, revisión del estándar anterior (SQL-89)? 1992, se publica el segundo estándar (SQL-2 o SQL-92)? 1999, aparece el tercer estándar (SQL-3 o SQL-99)
3
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Introducción? 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 mayúsculas o
minúsculas, salvo para los literales
? Cada cláusula o palabra puede aparecer en líneas diferentes, lo que no se puede hacer es separar una misma palabra
? Se puede utilizar la identación que se quiera? Una sentencia o comando SQL finaliza con la aparición del
símbolo “;” (no suele ser necesario para un único comando)
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Introducción? Escribir sentencias o comandos SQL
? Se utiliza una extensión de la notación BNF? Las palabras en mayúsculas representan palabras reservadas? Las palabras en minúsculas representan palabras definidas por
el usuario? El símbolo | indica una elección entre alternativas
? Las llaves representan elementos requeridos? Los corchetes representan elementos opcionales? Los ... Indican repetición opcional (0 ó más)
? Literales? Son constantes utilizadas en las sentencias SQL? Todos los literales no numéricos deben ir entrecomillados
4
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
2. Operaciones de Recuperación? Sintaxis de la sentencia
SELECT [DISTINCT | ALL] { * | expresion [AS alias] [,...] }FROM tabla [AS alias] [, ...][WHERE condicion][GROUP BY lista_de_atributos
[HAVING condición_de_grupo ]][ORDER BY lista_de_atributos [ASC/DESC] ];
? SELECT: indica que información se desea obtener? FROM: especifica las tablas en las que se encuentran los
atributos implicados en la consulta? WHERE: especifica la condición de búsqueda? GROUP BY: permite agrupar el resultado? HAVING: especifica una condición de grupo? ORDER BY: permite ordenar el resultado
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Operaciones de Consulta? Operadores
Los siguientes operadores se pueden utilizar para expresar condiciones de fila (cláusula WHERE) o de grupo (cláusula HAVING):? De comparación (<, <=, >, >=, <>, =)? Lógicos (AND, OR, NOT)? BETWEEN ... AND ...? LIKE? IN? IS NULL? Cuantificadores (ANY, SOME, ALL)? Existencial (EXISTS)
5
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Consultas sobre una tabla? Recuperación simple
» Obtener todos los datos de todos los proyectosSELECT codP, descrip, localidad, cliente, telefonoFROM proyectos;
ó:
SELECT *FROM proyectos;
* : equivale a todos los atributos de una tabla
» Obtener los códigos de máquina (CodM) para todas las máquinas utilizadas
SELECT DISTINCT codM
FROM trabajos;
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Cláusula Distinct? Elimina los valores duplicados del resultado
» Obtener las localidades de los conductoresSELECT codMFROM trabajos;
» Obtener las localidades de los conductoresSELECT DISTINCT codMFROM trabajos;
? Algunos gestores disponen de la cláusula TOP nSELECT DISTINCT TOP 2 codMFROM trabajos;
Localidad
ArgandaArgandaRivasArgandaLoechesRivas
Localidad
ArgandaRivasLoeches
Localidad
ArgandaRivas
6
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Recuperación Calificada? La cláusula Where contiene una condición simple
o compuesta mediante operadores lógicos.» Obtener los códigos de los conductores de Arganda
SELECT codCFROM conductoresWHERE localidad = 'Arganda';
? Los literales suelen ser sensibles a mayúsculas y minúsculas
ARGANDA <> Arganda <> arganda
» Obtener los códigos de los conductores de Arganda que tengan categoría inferior a 18
SELECT codCFROM conductoresWHERE localidad = 'Arganda' AND categ < 18;
CodC
C01 C02C04
CodC
C02
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Operador Between? Establece una comparación dentro de un intervalo? Se utiliza en valores numéricos o de fecha
» Obtener el nombre de las máquinas cuyo precio por hora estécomprendido entre 11000 y 15000 ptas
SELECT nombre, preciohoraFROM maquinasWHERE precio_hora BETWEEN 5000 AND 10000;
? También se puede utilizar NOT BETWEEN
Nombre PrecioHora
Excavadora 15000Volquete 11000
7
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Operador Like? Establece una comparación entre cadenas de
caracteres. Comodines:% : secuencia de cero o más caracteres (a veces se utiliza *)_ (subrayado): sustituye a un solo carácter (a veces se utiliza ?)
» Obtener los conductores que se apelliden ‘Pérez ’
SELECT nombreFROM conductoresWHERE nombre LIKE ‘%Pérez%’;
? También se puede utilizar NOT LIKE
NombreJuan P érezCarmen P érez
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
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 nombreFROM conductoresWHERE localidad IN ('Arganda','Rivas');
? También se puede utilizar NOT IN» Obtener nombres de conductores que no sean de Arganda
SELECT nombreFROM conductores
WHERE localidad NOT IN ('Arganda');
NombreJosé SánchezManuel DíazJuan P érezLuis OrtizCarmen P érez
NombreJuan Pérez
Javier Mart ínCarmen P érez
8
2002 © Pedro P. Alarcón 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
comparación, solo se puede comprobar si es o no nulo
» Obtener los partes de trabajo que no figuren con el tiempo empleado
SELECT codC,codM,codP,FechaFROM trabajosWHERE tiempo IS NULL;
? También se puede utilizar IS NOT NULL
CodC CodM CodP Fecha
C02 M03 P02 15/09/02C01 M02 P04 17/09/02C02 M03 P01 18/09/02
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Operadores All y Any? ALL: todos? ANY: algunos
? Van acompañados de un operador de comparación ? >ALL, >=ALL, <ALL, <=ALL, =ALL, <>ALL? >ANY, >= ANY, <ANY, <=ANY, =ANY, <>ANY
» Obtener proyectos que no sean de Arganda ni de RivasSELECT descrip, localidadFROM proyectosWHERE localidad <> ALL (‘Arganda’, ‘Rivas ’);
? <>ALL es equivalente a NOT IN
? El segundo operando suele ser una subconsulta
Descrip LocalidadTechado Loeches
9
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Operador Exists? Indica la existencia o no de un conjunto
» Obtener nombres de las máquinas que se han utilizado en el proyecto P03
SELECT nombreFROM maquinasWHERE EXISTS (SELECT *
FROM trabajosWHERE trabajos.codM = maquinas.codM
AND codP = 'P03');
? El operando suele ser una subconsulta
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Operaciones de Conjuntos? Operadores de conjuntos
? Los conjuntos deben ser union-compatible? Tipos
? Union? Unión de conjuntos
? Except (Minus en algunos gestores)? Diferencia de conjuntos
? Intersect? Intersección de conjuntos
? Sintaxis? SelectSQL { < union | intersect | except > [ all ] SelectSQL }
? La opción all elimina duplicados del resultado
10
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Operador Union? Unión de dos conjuntos que tiene que
estar definidos sobre los mismos dominios» Obtener los códigos de aquellos conductores que
residan en Rivas o tengan categoría inferior a 18SELECT codCFROM conductoresWHERE localidad = 'Rivas'UNIONSELECT codCFROM conductoresWHERE categ < 18;
CodC
C02C03 C05C06
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Operador Union? La cláusula ALL hace que no se eliminen duplicados? Pueden concatenarse varios en la misma sentencia
» Obtener los códigos de conductores que residan en Rivas o tengan categoría inferior a 15 o hayan manejado la máquina M01
SELECT codCFROM conductoresWHERE localidad = 'Rivas'UNION ALLSELECT codCFROM conductoresWHERE categ < 18UNION ALLSELECT codCFROM trabajosWHERE codM = ‘M01’;
Sin los ALL en las cláusulas UNION
CodC
C03 C06C02C05 C06C03C03 CodC
C02 C03C05C06
11
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Operador Except? Establece la diferencia de conjuntos, eliminado
las filas del primer operando que se encuentren en el segundo» Obtener los códigos de aquellos trabajadores que tengan
categoría inferior a 15 y no hayan trabajado con la máquina M03SELECT codCFROM conductoresWHERE categ < 18EXCEPTSELECT codCFROM trabajosWHERE codM = 'M03';
CodC
C06
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Operador Except? Algunos gestores no implementan este operador
? Alternativa» Obtener los códigos de aquellos trabajadores que tengan
categoría inferior a 15 y no hayan trabajado con la máquina M03
SELECT codCFROM conductoresWHERE categ < 18
AND codC NOT IN (SELECT codCFROM trabajos
WHERE codM = 'M03‘);
CodC
C06
12
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Operador Intersect? Realiza la intersección entre dos conjuntos,
obteniendo las filas comunes a ambos» Obtener los códigos de los conductores que hayan utilizado las
máquina M01 y la máquina M03SELECT codCFROM trabajosWHERE codM = 'M01'INTERSECTSELECT codCFROM trabajosWHERE codM = 'M03';
CodC
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Operador Intersect? Algunos gestores no implementan este operador
? Alternativa» Obtener los códigos de los conductores que hayan utilizado la
máquina M01 y la máquina M03SELECT codCFROM trabajosWHERE codM = 'M01'
AND codC IN (SELECT codCFROM trabajosWHERE codM = 'M03‘);
? Solución ErróneaSELECT codCFROM trabajosWHERE codM = 'M01‘ AND codM = 'M03‘);
CodC
CodC
13
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Funciones Agregadas? Funciones agregadas de ISO
? COUNT (*)? contador de tuplas (cuenta valores duplicados y nulos)? Con la cláusula Distinct no tiene en cuenta valores nulos ni
duplicados? AVG
? media aritmética de un atributo o una expresión num érica? puede utilizar la cláusula Distinct
? SUM? suma de atributos o expresiones num éricas? puede utilizar la cláusula Distinct
? MAX? valor m áximo de un atributo o expresión num érica
? MIN? valor m ínimo de un atributo o expresión numérica
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Funciones Agregadas? Devuelven un valor único, numérico? Solo pueden utilizarse en la cláusula Select o
en la cláusula Having No se pueden combinar , con columnas que devuelvan más de un valor, a menos que la consulta contenga una cláusula GROUP BY
? Count, Min y Max se pueden aplicar a atributos numéricos o no numéricos, pero Sum y Avgsolo se pueden aplicar a numéricos
? Salvo la función Count(*), las demás solo tienen en cuenta para su cálculo valores no-nulos
14
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Funciones Agregadas» Obtener el número total de proyectos en los que se está trabajando
SELECT COUNT(*)FROM trabajos;
» Obtener el número total de máquinas que se han utilizado en 'P02'SELECT COUNT (DISTINCT codM)FROM trabajosWHERE codP = 'P02';
» Obtener el precio medio por hora de las máquinas SELECT AVG(preciohora)FROM maquinas
12
3
13500
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Funciones Agregadas» Obtener el máximo para el nombre y el preciohora de las máquinas
SELECT max(nombre), max(preciohora)FROM maquinas;
» Obtener la máxima fecha, el mínimo tiempo y la suma y media del tiempo de la tabla trabajos
SELECT max(fecha), min(tiempo), sum(tiempo), avg(tiempo)FROM trabajos
» Contar el número de filas de la tabla trabajos, numero de valores de la columna tiempo, y número de valores distintos de dicha columna
SELECT count(*), count(tiempo), count(distinct tiempo)FROM maquinas
18/09/02 30 1260 140
Volquete 18000
12 9 8
15
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Cláusula Group ByGROUP BY <lista_de_atributos>
? Agrupa el resultado, devolviendo una única fila por grupo
? Los atributos que aparezcan en GROUP BY, deben aparecer en la cláusula SELECT
» Obtener por cada conductor que haya trabajado, el código de éste y la cantidad total de tiempo empleado
SELECT codC, SUM(tiempo)FROM trabajosGROUP BY codC;
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Cláusula Group By
CodC Tiempo
C02 100C03 200C05 150
C04 90C01 120C02 30C03 300 C02 nullC01 180 C05 90 C01 nullC02 null
C02 100C02 30
C02 nullC02 null
C03 200C03 300
C05 150C05 90
C04 90
C01 120C01 180
C01 null
C01 300C02 130C03 500C04 90C05 240
16
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Cláusula HavingHAVING <condicion_de_grupo>
? Siempre va acompañada de la cláusula GROUP BY? Especifica una condición de grupo» Obtener para los conductores que figuren cin más de un trabajo
realizado, la suma de tiempos trabajados
SELECT codC, SUM (tiempo)FROM trabajos
GROUP BY codCHAVING COUNT(*) > 1;
C01 300C02 130C03 500 C05 240
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Cláusula Having» Obtener para los conductores que hayan utilizado la misma
máquina más de una vez entre el 12/09/02 y el 18/09/02, el código de conductor, el código de máquina y el tiempo total empleado
SELECT codC, codM, SUM (tiempo)FROM trabajosWHERE fecha BETWEEN ‘12/09/02’ AND ‘18/09/94’GROUP BY codC , codMHAVING COUNT(*) > 1;
17
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Cláusula Having
C01 M02 120C01 M02 null
C02 M03 30C02 M03 nullC02 M03 null
C05 M03 90
C01 M02 120C02 M03 30
C01 M03 180
C03 M01 300
CodC CodM CodP Fecha Tiempo
C02 M03 P01 10/09/02 100C03 M01 P02 10/09/02 200C05 M03 P02 10/09/02 150C04 M03 P02 10/09/02 90C01 M02 P02 12/09/02 120C02 M03 P03 13/09/02 30C03 M01 P04 15/09/02 300 C02 M03 P02 15/09/02 nullC01 M03 P04 15/09/02 180 C05 M03 P04 15/09/02 90C01 M02 P04 17/09/02 nullC02 M03 P01 18/09/02 null
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Cláusula Order ByORDER 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 ordenación deben aparecer en SELECT
» Obtener los partes de trabajo correspondientes al proyecto 'P4' ordenados ascendentemente por conductor y máquina
SELECT *
FROM trabajosWHERE codP = 'P04'ORDER BY codP, codM;
CodC CodM CodP Fecha Tiempo
C01 M02 P04 17/09/02 nullC01 M03 P04 15/09/02 180C03 M01 P04 15/09/02 300 C05 M03 P04 15/09/02 90
18
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Alias de tablas y columnas? Para hacer el nombre de una columna más significativo
cuando se muestra? Abreviar un nombre de una tabla o de una columna que
se usa a menudo? Hacer más clara una instrucción complicada de SQL? Distinguir entre dos ocurrencias del mismo nombre de
columna o tabla en cualquier instrucción SELECT? Se indican
FROM tabla [[as] Alias]? En el SELECT para columnas
SELECT expresion [[as] Alias] [, ...]? En el FROM para tablas
FROM tabla [[as] Alias] [, ...]
? El alias de columna puede ir entre comillas para especificar un alias de mas de una palabra, pero el de tabla no
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Expresiones en la cláusula SELECT? No sólo se pueden seleccionar atributos, sino
expresiones en las que aparezcan atributos y/o constantes y operadores aritméticos
SELECT nombre, 'coste final:‘ As texto, (precio_hora*1.15) As NuevoPrecioFROM maquinas As m
WHERE m.preciohora < 18000;Nombre texto NuevoPrecio
Excavadora coste final por hora: 17250
Hormigonera coste final por hora: 11500
Volquete coste final por hora: 12650
19
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Consultas con más de una tabla? Operación algebraica de Unión Natural o Join
? Permite relacionar dos tablas para obtener información común
? 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) común entre las tablas participantes (por lo general, clave principal-clave foránea
? Alternativas en SQL? Consultas anidadas? Condición de unión natural? Cláusula JOIN
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Consultas con más de una tabla? Ejemplo
» Obtener nombres de trabajadores que han utilizado la máquina 'M2'SELECT nombreFROM conductoresWHERE codC IN (SELECT codC
FROM trabajosWHERE codM = 'M02');
SELECT nombreFROM conductores, trabajosWHERE conductores. codC = trabajos. codC AND codM = 'M02';
SELECT nombreFROM conductores INNER JOIN trabajos
ON conductores. codC = trabajos. codCWHERE codM = 'M02';
20
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Consultas Anidadas? Las consultas anidadas establecen una
comparación entre dos operandos? Posibilidades
? operador In? operador Any? operador All? operador de comparación? operador Exists? tupla
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Consultas Anidadas? Operador IN
» Obtener la descripción y cliente de aquellos proyectos en los que hayan trabajado máquinas con un precio hora superior a 12000 conducidas por conductores de Rivas
SELECT descrip, clienteFROM proyectosWHERE codp In (SELECT codP
FROM trabajosWHERE codM In (SELECT CodM
FROM maquinasWHERE preciohora > 12000)
AND codC In (SELECT codCFROM conductores
WHERE localidad = 'Rivas'))
21
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Consultas Anidadas? Operador Any
» Obtener los trabajadores con categoría inferior a la de algún trabajador de Arganda
SELECT nombreFROM conductores
WHERE categ < ANY (SELECT categFROM conductoresWHERE localidad = ‘Arganda’);
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Consultas Anidadas? Operador All
» Obtener conductores que no han participado en el proyecto 'P1'SELECT nombreFROM conductorWHERE codC <> ALL (SELECT codC
FROM trabajos
WHERE codP = 'P01');
? <>ALL es equivalente a NOT IN
22
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Consultas Anidadas? Operador de comparación
» Obtener de el conductor de Arganda que tenga la categoría más alta de entre los que sean de Arganda
SELECT nombreFROM conductores
WHERE categ = (SELECT MAX(categ) FROM conductoresWHERE localidad = 'Arganda')
AND localidad = 'Arganda';
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Consultas Anidadas? Operador Exists
» Encontrar todos los conductores que no tengan un homónimo
SELECT *FROM conductores CWHERE NOT EXISTS (SELECT *
FROM conductores C1WHERE C1.nombre = C.nombre
AND C1.localidad = C.localidadAND C1.categ <> C.categ)
23
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Consultas Anidadas? La comparación con la subconsulta anidada
puede incluir más de un atributo? Los atributos deben ir entre paréntesis separados
por comas? Ejemplo
SELECT *FROM conductores CWHERE (nombre,localidad) NOT IN (SELECT nombre,localidad
FROM conductores C1WHERE C1.categ <> C.categ)
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Consultas Anidadas? Alcance de “variables”
? Consulta incorrectaSELECT *FROM ConductoresWHERE codC IN (SELECT codC
FROM trabajos T1WHERE codM = ‘M02’)
OR codC IN (SELECT codCFROM trabajos T2WHERE T2.fecha = T1.fecha)
? La consulta es incorrecta porque T1 no es visible desde la segunda subconsulta
24
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Consultas Anidadas? Subconsultas en la cláusula Select y From» Obtener el nombre, localidad y categoría, junto con la categoría
máxima de todos los conductores, para los conductores de Loechesque tengan la máxima categoría de Loeches
SELECT nombre, localidad, categ, (SELECT MAX(categ) FROM conductores) As MaxCateg
FROM conductoresWHERE localidad = 'Loeches' AND
categ >= ALL (SELECT categFROM conductoresWHERE localidad = 'Loeches');
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Condición de Join? Se debe poner una condición de join en el Where, por cada
atributo común entre cada dos tablas relacionadas de las que figuren en la cláusula FROM
tabla1.atributoComun = tabla2.atributoComun
» Obtener para cada máquina utilizada, el código de máquina y el nombre
SELECT conductores.nombre AS cond, descrip,maquinas.nombre AS maq
FROM conductores, trabajos, proyectos, maquinasWHERE conductores.codc=trabajos.codC AND
trabajos.codp = proyectos.codP ANDtrabajos.codm = maquinas.codM ANDpreciohora > 14000 cond descrip maq
Juan Pérez Solado ExcavadoraJuan Pérez Techado Excavadora
25
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Cláusula Join? Sintaxis
FROM tabla { [tipoJoin] JOIN ON condicionJoin }? tipoJoin
? INNER? es la unión natural? solo se tienen en cuanta las filas con igualdad en los atributos
comunes? LEFT [OUTER]
? se tienen en cuenta todas las filas de la tabla izquierda? RIGHT [OUTER]
? se tienen en cuenta todas las filas de la tabla derecha? FULL [OUTER]
? se tienen en cuenta todas las filas de ambas tablas
? condicionJointabla1.atributoComun = tabla2.atributoComun
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Cláusula Join? Inner Join
» Obtener el nombre del conductor y tiempo empleado para aquellos trabajos realizados el 10/09/02
SELECT nombre, tiempoFROM conductores INNER JOIN trabajos ON
conductores.codC=trabajos.codCWHERE fecha = ’10/09/02’;
nombre Tiempo
Manuel Díaz 100Juan Pérez 200Luis Ortiz 90 Javier Mart ín 150
26
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Cláusula Join? Left Join
SELECT nombre, codm, codp, fecha, tiempoFROM conductores LEFT JOIN trabajos
ON conductores.codC=trabajos.codCWHERE localidad = ‘Rivas’;
nombre codP codM Tiempo
Juan Pérez P02 M01 200Juan Pérez P04 M01 300Carmen P érez NULL NULL NULL
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Cláusula Join? Right Join
SELECT nombre, codm, codp, fecha, tiempoFROM conductores RIGHT JOIN trabajos
ON conductores.codC=trabajos.codCWHERE localidad = ‘Rivas’;
nombre codP codM Tiempo
Juan Pérez P02 M01 200Juan Pérez P04 M01 300
27
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Cláusula Join? Full JoinSELECT nombre, codm, descrip,tiempoFROM conductores FULL JOIN trabajos ON conductores.codC =
trabajos.codCFULL JOIN proyectos ON trabajos.codP = proyectos.codP
WHERE conductores.localidad = ‘Rivas ’ OR proyectos.localidad = ‘Rivas ’;
nombre codM descrip Tiempo
José Sánchez M02 Solado 120Manuel Díaz M03 Solado nullJuan Pérez M01 Solado 200Juan Pérez M01 Techado 300Luis Ortiz M03 Solado 90Javier Mart ín M03 Solado 150Carmen P érez null null nullnull null Buhardilla null
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
3. Operaciones de Actualización? Inserción de filas
? Inserción de una filaINSERT INTO tabla [(listaAtributos)]VALUES (valor1, valor2,..., valorn);
? Inserción de varias filasINSERT INTO tabla [(listaAtributos)]( clausulaSELECT )
? La cláusula "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 NotNull, salvo que se haya especificado un valor por defecto con Default
28
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Operaciones de Actualización? Inserción de filas
? Inserción de una filaINSERT INTO TrabajosVALUES ('C02','M03','P01','10/09/02',100);
? Cuando no se conoce algún valor? se puede poner la palabra reservada null
INSERT INTO ConductoresVALUES ('C07',‘Jorge Gil',null,18);
? se puede omitir el valorINSERT INTO ConductoresVALUES ('C07', ‘Jorge Gil',,18);
? indicar valor solo para un subconjunto de los atributosINSERT INTO Conductores (codC,nombre,categ)VALUES ('C07', ‘Jorge Gil', 18);
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Operaciones de Actualización? Inserción de filas
? Inserción de varias filasINSERT INTO ConductoresArganda(SELECT *FROM ConductoresWHERE 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 variación de la estructura de la tabla en la que se basa la subconsulta
29
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Operaciones de Actualización? Modificación de filas
UPDATE tablaSET 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 expresión, o
el resultado de una subconsulta (que deberá ir entre paréntesis), o el valor null, o el valor por defecto definido en el atributo
? La modificación afectará a todas las filas que cumplan la condición, si se especifica ésta. Si no se especifica condición, la modificación afectará a todas las filas de la tabla
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Operaciones de Actualización? Modificación de filas
» Incrementar en un 15% el valor de categoría de los conductores de Rivas
UPDATE conductoresSET categ = categ * 1.15WHERE localidad = ‘Rivas’
» Sumar a la categoría de los conductores de Loeches, la categoría más alta de todos los conductores
UPDATE conductoresSET categ = categ + (SELECT distinct categ
FROM conductores WHERE categ = (SELECT max(categ)
FROM conductores))WHERE localidad = 'Loeches'
30
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Operaciones de Actualización? Eliminación de filas
DELETEFROM nombre_tabla[WHERE condicion];
? No se pueden eliminar partes de una fila? Si no aparece la cláusula "WHERE" se eliminarán
todas las filas de la tabla, no eliminándose la definición de ésta en el esquema
? El borrado de una fila puede provocar el borrado de filas de otras tablas, si hay definida una restricción de integridad referencial con opción Cascade
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Operaciones de Actualización? Eliminación de filas
» Eliminar el proyecto o proyectos de Felipe Sol
DELETE FROM proyectosWHERE cliente = ‘Felipe Sol’;? Si no se ha definido integridad referencial con la tabla
trabajos hay que dejar la BD consistenteDELETE FROM trabajos
WHERE codP NOT IN (SELECT codPFROM proyectos)
31
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
4. Lenguaje de Definición de Datos? Creación de tablas (estándar 86)
CREATE TABLE nombre_tabla(definición_atributo_1 [UNIQUE] [NOT NULL],(definición_atributo_2 [UNIQUE] [NOT NULL],.....................
(definición_atributo_n [UNIQUE] [NOT NULL]);
? donde:? definición_atributo = nombre_atributo tipo_dato (tamaño)? UNIQUE: no se permiten valores duplicados en la columna? NOT NULL: no se permiten valores nulos en la columna
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
? SQL2CREATE 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)] );
Lenguaje de Definición de Datos
32
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Lenguaje de Definición de Datos? ISO SQL data types
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Lenguaje de Definición de Datos? Integridad Referencial
? Todo valor de la clave foránea (tabla dependiente) debe figurar en la clave principal (tabla padre) de la que depende, o ser nulo
? Opciones? CASCADE
? Elimina cascada las filas de un atabla dependiente al eliminar una fila de la tabla padre
? SET NULL? Al eliminar una fila de la tabla padre deja con valor nulo la clave
foránea de las filas relacionadas de la tabla dependiente. Solo es válido para claves foráneas definidas como Not Null
? SET DEFAULT? Al eliminar una fila de la tabla padre deja con el valor por defecto la
clave foránea de las filas relacionadas de la tabla dependiente. Solo es válido para claves foráneas definidas con un valor por defecto
? NO ACTION? Impide la eliminación de la fila padre si tiene filas dependientes
relacionadas. Es la opci ón por defecto
33
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Lenguaje de Definición de Datos? Modificación de tablas
? Añadir un nuevo atributoALTER TABLE nombre_tablaADD definición_atributo;
? Modificar un atributo ya existenteALTER TABLE nombre_tablaMODIFY definicion_atributo
? Eliminación de tablasDROP TABLE nombre_tabla
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Lenguaje de Definición de Datos? Creación de vistas
CREATE VIEW nombre_vista (lista_atributos)AS (clausula_SELECT )[WITH CHECK OPTION]
? Las filas de la vista serán aquellas que resulten de ejecutar la consulta sobre la que está definida
? La cláusula With Chechk Option, comprueba que al actualizar la vista se cumplan las condiciones expresadas en la misma.
? Eliminación de vistasDROP VIEW nombre_vista;
34
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Lenguaje de Definición de Datos? Creación de índices
CREATE [UNIQUE] INDEX nombre_indiceON nombre_tabla (lista_atributos);
? Es el sistema el encargado de utilizar los índices, para optimizar el acceso a los datos
? El usuario sólo puede crear o eliminar índices, pero no indicar su utilización
? Eliminación de índicesDROP INDEX nombre_indice[ON nombre_tabla]
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
5. Lenguaje de Control de Datos? Seguridad de los datos
? Concesión de privilegios? Permite conceder a los usuarios el acceso completo o
restringido a las tablas de la base de datosGRANT <accesos> ON <lista_de_tablas>TO <lista_de_cesionarios>|PUBLIC[WITH GRANT OPTION];
donde:? 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
35
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Lenguaje de Control de Datos
? Revocación de privilegiosSe utiliza para anular privilegios ya concedidos a los usuarios
REVOKE <accesos>FROM <nombre_usuario> TO <lista_de_tablas>
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
Lenguaje de Control de Datos
? Integridad de los datos? COMMIT WORK
? Los cambios que se puedan estar realizando sobre la base de datos se hacen fijos únicamente al completar la transacción
? ROLLBACK WORK? Elimina todos los cambios que se hayan podido producir en
la base de datos desde la ejecución de la última instrucción COMMIT
? Si se produce un error de programa o un fallo hardware el sistema realiza un ROLLBACK automáticamente
36
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
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 instrucción SQL.
? deben aparecer en una sección de declaración en el programa principal. Esta sección comenzará con EXEC SQL BEGIN DECLARE y finalizará con EXEC SQL END DECLARE.
2002 © Pedro P. Alarcón U.P.M.-E.U.I. Bases de Datos
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>;
37
Base de Datos del Ejemplo
CodM Nombre PrecioHora
M01 Excavadora 15000M02 Hormigonera 10000M03 Volquete 11000M04 Apisonadora 18000
CodC Nombre Localidad Categ
C01 José Sánchez Arganda 18C02 Manuel Díaz Arganda 15C03 Juan Pérez Rivas 20C04 Luis Ortiz Arganda 18C05 Javier Mart ín Loeches 12C06 Carmen P érez Rivas 15
CodC CodM CodP Fecha Tiempo
C02 M03 P01 10/09/02 100C03 M01 P02 10/09/02 200C05 M03 P02 10/09/02 150C04 M03 P02 10/09/02 90C01 M02 P02 12/09/02 120C02 M03 P03 13/09/02 30C03 M01 P04 15/09/02 300 C02 M03 P02 15/09/02 nullC01 M03 P04 15/09/02 180 C05 M03 P04 15/09/02 90C01 M02 P04 17/09/02 nullC02 M03 P01 18/09/02 null
CodP Descrip Localidad Cliente Telefono
P01 Garaje Arganda Felipe Sol 600111111P02 Solado Rivas José Pérez 912222222P03 Garaje Arganda Rosa López 666999666P04 Techado Loeches José Pérez 913333333P05 Buhardilla Rivas Ana Botijo null
Conductores
MaquinasProyectos
Trabajos