SQL - Sistemas Gestores de Bases de Datos
SQL - Sistemas Gestores de Bases de Datos
SQL - Sistemas Gestores de Bases de Datos
GESTORES DE
BASES DE DATOS
SQL
TEMA I
1.1.
INTRODUCCION
1.2.
LA INFORMACION Y SU ALMACENAMIENTO
1.2.1. Sistemas de informacin
1.2.2. Estructura bsica de almacenamiento: el archivo
1.2.3. Modos de acceso a los registros de un archivo
1.2.4. Organizaciones fsicas de archivos
1.2.5. Criterios de seleccin de organizaciones fsicas
1.2.6. Gestin de archivos en soportes
SQL
Pg.-3
Notas
Pg.-4
SQL
1.1
INTRODUCCION
Este manual pretende servir como manual para el mdulo profesional Sistemas
Gestores de Bases de Datos del ciclo formativo superior de Administracin de Sistemas
Informticos.
El posible lector puede ser un estudiante de Formacin Profesional, o un
interesado en iniciarse en bases de datos, con preferencia por el modelo relacional y el
lenguaje SQL.
En el manual se introduce la teora del modelo relacional, mediante un ejemplo
continuo, enlazar todos los captulos de cara a la realizacin de un proyecto final de
programacin.
Si bien hasta hace unos aos se han estado implantando sistemas informticos
con aplicaciones basadas en archivos dependientes del software y el hardware, la
tendencia actual persigue independizar la informacin de las aplicaciones y agrupar todos
los datos en una nica entidad llamada base de datos, de forma que distintos procesos,
en muchos casos de aplicaciones, e incluso, sistemas diferentes, utilicen y compartan la
misma informacin.
1.2.
LA INFORMACION Y SU ALMACENAMIENTO
1.2.1. Sistemas de informacin
SQL
Pg.-5
Nombre
NIF
APELLIDOS
NOMBRE
NACIMIENTO
Tipo de datos
Alfanumrico
Alfanumrico
Alfanumrico
Fecha
Longitud
10
20
15
8
..............................................................................................................
Las caractersticas ms importantes de los archivos son:
Pg.-6
SQL
SQL
Pg.-7
Pg.-8
Para acceder a un registro, hay que leer todos los que hay delante de
l, que de media son la mitad de los registros del archivo.
SQL
SQL
Pg.-9
Pg.-10
SQL
1000
997
5431
446
446
SQL
Pg.-11
Pg.-12
SQL
Puntero
Direccin
Cdigo
Nombre
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
7
1
8
10
9
2
11
3
5
4
6
12
15
13
14
17
16
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
100
110
120
130
140
160
200
210
250
300
360
400
500
550
600
700
999
B
F
H
J
I
K
A
C
E
D
G
L
N
O
M
Q
P
SQL
Pg.-13
DATOS LECTORES
Direccin
Cdigo
1
2
3
4
5
6
7
8
111
222
333
444
555
666
777
888
Nombre
Sexo
Juan
Rosa
Pedro
Ral
Carlos
Sofa
Ana
Ivn
V
M
V
V
V
M
M
V
Tipo
Infantil
Investigador
Colaborador
Infantil
Nomal
Trabajador
Infantil
Colaborador
NDICE VALOR
Direccin Valor-clave Puntero
1
2
3
4
5
6
7
V
M
Colaborador
Infantil
Investigador
Normal
Trabajador
1,3,4,5,6
2,6,7
3,8
1,4,7
2
5
6
NDICE NOMBRE
Nombre-Clave Puntero
Sexo
Tipo
1
3
Pg.-14
SQL
B = LR / (TA * VLS)
Donde:
NRV = nmero medio de registros utilizados en tiempo fijo.
NRT = nmero medio total de registros del archivo.
LR = la longitud en bytes de registro.
TA = el tiempo medio de acceso directo a un registro en segundos.
VLS = velocidad de lectura secuencial en bytes por segundo.
Si A < B, deber utilizarse la organizacin relativa y, en caso contrario,
organizacin secuencial.
1.2.6. Gestin de archivos en soportes
La gestin de archivos es una de las tareas principales de los sistemas
operativos. El trabajo es distinto segn el tipo de soporte que se utilice. Existen dos tipos
de soporte:
a) Secuenciales. Los datos se graban a continuacin de otros, de tal forma que
el acceso a un dato se hace pasando sobre todos los datos que le preceden
en el soporte. El ejemplo clsico es la cinta magntica.
b) Direccionables. El espacio de almacenamiento se divide en espacios
parciales direccionables individualmente, pudiendo acceder a un dato por la
direccin en que est almacenado, sin que sea necesario pasar por los datos
almacenados en direcciones fsicas anteriores. Ejemplos pueden ser los
disquetes, los discos duros, los CD-ROM, etc.
Actualmente, la informacin se almacena en soportes direccionables, dejando
los secuenciales para realizar grandes copias de seguridad. Por ello, se explica cmo se
distribuyen los archivos en discos.
El disco se divide en unidades mnimas de E/S llamadas clusters o bloques. A
cada archivo se le asignan bloques segn su organizacin y el mtodo de asignacin de
bloques que utilice el sistema operativo. Existen tres formas tericas de asignar bloques:
SQL
Pg.-15
Compactacin
Se conoce como compactacin la resolucin del problema de la fragmentacin
externa cuando el mtodo de bloques de disco es la contigua. Este proceso consiste en
reubicar todos los archivos, de forma que los bloques libres dispersos en el disco formen
un nico hueco.
La fragmentacin interna es un problema inherente a la distribucin del espacio
en bloques y radica en el espacio desaprovechado por los bytes libres que quedan en el
ltimo bloque de cada archivo.
Existen unos programas llamados compresores que, adems de utilizar tcnicas
que reducen el nmero de bytes que ocupa un archivo, unen un nmero indeterminado
de archivos en uno slo, reduciendo la fragmentacin interna a un bloque como mximo.
Por ejemplo, 100 archivos de 100 bytes de tamao distribuidos en bloques de 1.024
bytes desaprovecharan 92.400 bytes, mientras que comprimidos formaran un archivo de
10.000 bytes, que ocuparan 9 bloques completos, y el dcimo desaprovechara 784
bytes.
Pg.-16
SQL
CUESTIONES:
1. Explicar en qu consisten las fragmentaciones interna y externa.
2. Calcular la direccin que correspondera a la clave 5555 en un archivo con
organizacin relativa de 2.500 cubos utilizando los algoritmos de divisin,
plegamiento y centro del cuadrado.
3. Razonar si sera ms conveniente la organizacin secuencial o directa para un
archivo en el que mensualmente se utilizan 60.000 veces alguno de los 20.000
registros del archivo. Tener en cuenta que el registro ocupa 500 bytes, el tiempo
de acceso medio es de 10 milisegundos y la velocidad de lectura secuencial es de
16 Kbytes por segundo.
4. Completar la siguiente tabla marcando con una X las casillas en las que el
modo de acceso y la organizacin sean compatibles.
ACCESO
SECUENCIAL
ACCESO
DIRECTO
ACCESO
NDICE
POR
Organizacin
secuencial
Organizacin
relativa
Organizacin
indexada
5. Escribir un algoritmo en pseudocdigo que implemente la operacin de copia de
un archivo origen en otro destino utilizando operaciones bsicas.
6. Con el siguiente ejemplo de archivo de datos, dibujar cmo quedaran los ndices
para una organizacin invertida con claves de acceso en los campos Provincia e
Hijos.
NIF
APELLIDOS
DIRECCIN
PROVINCIA
HIJOS
11111111A
22222222B
33333333C
44444444D
55555555E
66666666F
77777777G
88888888H
99999999I
BBB CCC
DDD EEE
EEE EEE
AAA BBB
BBB DDD
JJJ AAA
AAA JJJ
RRR SSS
TTT BBB
C/ pisa, 1
C/ roma, 1
C/pars, 1
C/ Madrid, 3
C/ Mnaco,2
C/Pisa, 9
C/ Mnaco, 11
C/ Pars, 21
C/ Madrid, 10
Albacete
Madrid
Murcia
Toledo
Albacete
Toledo
Albacete
Madrid
Toledo
2
3
0
1
1
0
2
1
3
7. Con el archivo de datos anterior, crear un ndice de dos niveles con el primer
nivel dividido en cubos con capacidad para tres claves. El campo clave ser
apellidos.
SQL
Pg.-17
Pg.-18
SQL
TEMA II
2.1.SISTEMAS GESTORES DE BASES DE DATOS
2.1.1 Introduccin
2.1.2 Arquitectura de una base de datos
2.1.3 Sistemas gestores de bases de datos
2.1.4 Componentes
2.1.5Modelos de sistemas gestores de bases de datos
SQL
Pg.-19
Notas
Pg.-20
SQL
2.1.
SQL
Pg.-21
ESQUEMA CONCEPTUAL
EQUIPOS : EQ_ARB, EQ_NOM, EQ_DEL, .......
JUGADORES : JU_ARB, JU_NOM, JU_ALT, ....
PARTIDOS : EQ_LOCAL, EQ_VISIT, FECHA, ....
Reglas :
1. Un jugador slo pertence a un equipo.
2. Los equipos no juegan ms de un partido diario.
3. .....
ESQUEMA INTERNO
ARCHIV
Equipos
ORGANIZ.
Indexada
CLAVE
EQ_ARB
LONG.REG.
70
CAMPOS
EQ_ARB
EQ_NOM
EQ_DEL
..........
TIPO_DATOS
X(4)
X(15)
X(20)
Jugadores
Indexada
JU_ARB
100
JU_ARB
JU_NOM
JU_ALT.
........
X(4)
X(20)
9,99
Partidos
Indexada
EQ_LICAL+FECHA
50
EQ_LOCAL X(4)
EQ_VISIT.
X(4)
FECHA
......
DD/MM/AA
SQL
Los objetivos que debe cumplir una base de datos para ser lo ms rpida, eficaz
y polivalente son los siguientes:
Debe independizar los datos de las aplicaciones que los utilizan. Es lo que se
conoce como independencia fsica (se puede modificar el esquema fsico sin
que afecte a los superiores) e independencia lgica (si se modifica el
esquema conceptual no es necesario modificar los programas de aplicacin).
Conseguir que los datos repetidos innecesariamente en la base sean los
mnimos posibles (redundancia mnima de informacin).
Suministrar mecanismos de seguimiento de las operaciones realizadas en la
base de datos. Esto se consigue mediante procesos espas que mantienen
archivos en los que se almacena la fecha y hora de conexin de los
usuarios, las operaciones realizadas en cada sesin, los datos modificados,
etc.
Proporcionar versatilidad en las posibilidades de bsqueda de informacin
facilitando al usuario varios criterios.
Asegurar la proteccin de los datos contra accesos no autorizados o
malintencionados de los usuarios.
Controlar la integridad de la informacin en la base de datos. Para ello, debe
dar respuesta a posibles fallos de hardware, defectos en el cdigo de los
programas de aplicacin, actualizaciones incompletas, insercin de datos
incorrectos o no vlidos, etc.
Proporcionar mecanismos para realizar copias de seguridad de la
informacin.
Conseguir un tiempo de respuesta suficientemente pequeo para evitar que
el usuario se desespere. El tiempo respuesta se define como el tiempo que
SQL
Pg.-23
Instantes de tiempo
CAJAS DE SUPERMERCADO
Cliente caja 1
Cliente caja 2
T1
T2
T3
Pg.-24
SQL
CAJAS DE UN SUPERMERCADO
Instantes de tiempo
Cliente en caja 1
Cliente en caja 2
T1
T2
T3
T4
T5
T6
SQL
Pg.-25
CAJAS DE UN SUPERMERCADO
Instantes de tiempo
Cliente en caja 1
Cliente en caja 2
T1
T2
T3
2.1.4. Componentes
El SGBD est dividido en mdulos que llevan a cabo sus funciones asociadas.
Se compone del ncleo, lenguaje, utilidades y diccionario de datos.
1) Ncleo: Es el conjunto de programas que coordinan y controlan el
funcionamiento del SGBD. Son programas transparentes al usuario.
Pg.-26
SQL
Los SGBD son capaces de procesar peticiones del DML que se han formulado
desde programas escritos en otros lenguajes de programacin.
3) Utilidades: Son aplicaciones que facilitan el trabajo a los usuarios y
programadores. Tiene la caracterstica comn de tener un interfaz fcil de
entender. Se basan en mens que guan al usuario para conseguir el objetivo
final.
Asistentes
Generador de mens. Disea el interfaz de usuario de una
aplicacin.
Generador de informes. Presentan datos en pantalla o impresora con
un formato predefinido o fcil de definir sin conocer lenguajes de
base de datos ni de programacin.
Generador de formularios. Genera pantalla de dilogos que
presentan tems y permiten la introduccin de informacin; bien por
teclado, bien por botones.
Pg.-27
informacin especfica.
NOMBRE
Juan
Pedro
Rosa
TELEFONO
123456
232323
344444
TITULO
Aladdin
Pocahontas
El rey len
DAS
180
210
99
CDIGO
1111
1111
3333
8888
PAPEL
Genio
Pobre
India
Reina
.....
......
....
Pg.-28
DOCUMENTO
A
T
R
I
B
U
T
O
S
M
E
T
O
D
O
S
Cdigo:9(6)
Titulo : x(15)
Especialidad : x(15)
Departamento: x(15)
A
T
R
I
B
U
T
O
S
M
E
T
O
D
O
S
PERSONA
A
T
R
I
B
U
T
O
S
M
E
T
O
D
O
S
DNI : x(10)
Nombre: x(20)
Fecha_nacimi: fecha
@Edad: Fecha
A
T
R
I
B
U
T
O
S
Datos: PERSONA
NOTA 1,
NOTA 2,
NOTA3 : 99V99
@NOTA_FINAL:
99V99
SQL
M
E
T
O
D
O
S
Nombre: x(15)
Tema: DOCUMENTO
Alumno: INVESTIGADOR
Tutor: PERSONA
Fecha_inicio: Fecha
Fecha_final : Fecha
@Duracin: 9(3)
Pg.-29
CUESTIONES:
1. Enumerar las funciones de un SGBD.
2. Ejemplificar el problema de la concurrencia sin utilizar el empleado en la
descripcin de dicho problema.
3. Explicar la diferencia entre DML y DDL.
4. Representar grficamente como quedara la informacin en los modelos lgicos
de datos estudiados para una base de datos con los siguientes tipos de registros:
SOCIO: NIF, Nombre, Direccin
LIBRO: ISBN, Ttulo, Autor
PRSTAMO: NIF_socio, ISBN_libro, Fecha_prstamos y Fecha_devolucin.
Pg.-30
SQL
2.2.
EL MODELO ENTIDAD-RELACION
SQL
Pg.-31
Pg.-32
SQL
SQL
Pg.-33
Pg.-34
E
Dbil
SQL
E
Opcional
RELACIONES
R
E1
E2
M
R
ATRIBUTOS
a1
a2
an
a11
Simple
a12
a1n
a1
Compuesto
CLAVES
a1
a1
an
a1 primaria y simple
a2
an
E
a 1+
E1
E2
an
a2 primaria y compuesta
ai fornea de E1 en E2
a1 ai
SQL
Pg.-35
2.3.
Vista 1
....................................................................
Tabla 1
Tabla n
..............
Indice 1
...............
Indice i
..............
Indice 1
..........
Pg.-36
Vista N
Indice j
...............
SQL
..........................................
Archivo 1
Archivo n
BASE DE DATOS
De las tablas se derivan los siguientes conceptos:
En general, una tabla debe reunir los siguientes requisitos para ser consideradas
como una relacin:
Pg.-37
Vistas: Los conceptos que se han expuesto hasta el momento hacan referencia
al esquema conceptual del modelo relacional. Para describir el esquema externo se
utilizan las vistas. Una vista es una tabla que el usuario puede crear y manejar. Es una
tabla virtual que no tienen que corresponderse con ningn archivo del nivel interno. Las
tuplas que pertenecen a una vista se obtienen como resultado de consultas a las tablas del
nivel conceptual.
Las vistas pueden formarse eliminando atributos de una tabla, uniendo tablas
por atributos comunes y de ambas formas. Tambin pueden definirse a partir de otras
vistas. Al crearlas se deben de tener en cuenta las restricciones impuestas por el
administrador de la base de datos para cada usuario.
Usuario1
usuario2
Vista3
Nombre
Cuota
Vista1
Nombre
Vista 2
direccin
Poblacin
Tabla1
DNI
Tipo Cuota
Tabla2
Cod_postal Tipo
Cod_postal
Tabla3
Poblacin Provincia
Tipo
Cuota
SQL
EDAD
27
31
31
33
21
TELEFONO
1111
2222
3433
3232
3456
ASIGNATURAS
Nombre
Matem.
Idioma
FyQ
Lengua
Mtodo
Horas
5
3
5
4
5
Tipo
Obl
Opt
Obl
Opt
Opt
IMPARTE
Profesor
Juan
Jos
Luis
Asignatura
Matem.
Lengua
Idioma
SQL
Pg.-39
Pg.-40
Integrar todas las entidades en una nica. Esta nueva entidad contendr
todos los atributos de la entidad genrica, los de las subentidades y un
atributo discriminativo para distinguir a qu subentidad pertenecen las
tuplas. Los atributos de las subentidades son tratados como opcionales.
Todas las relaciones que tuvieran subentidades se mantienen ligadas a la
nueva entidad recin creada, reconsiderando la cardinalidad de cada
relacin. Esta alternativa presenta el inconveniente de generar demasiados
valores nulos en los atributos opcionales. Tambin ralentiza el proceso de
bsqueda al tener en cuenta todas las tuplas en vez de las que pertenecen a
la subentidad deseada. Su nica ventaja es que permite modelar todas las
jerarquas (totales o parciales y superpuestas o exclusivas).
Considerar cada subentidad como entidad. Para ello, se aaden los atributos
de la entidad genrica a la subentidad; y la clave primaria de la genrica pasa
SQL
Stock
compr
a
CLIENTE
Matrcula
NUEVO
COCHE
USADO
Marca
Modelo
Color
Pon
Nombre
EMPLEADO
ea
punt
o
Nombre
1
Pon
ea
punt
o
Marca
Modelo
Color
COCHE
Tipo
Matricula
Stock
M
compr
a
NIF
M
CLIENTE
SQL
Pg.-41
B)
Marca
Modelo
Color
Stock
COCHE
NUEVO
NIF
C)
Pon
ea
punt
1 o
EMPLEADO
Nombre
COCHE
Marca
Modelo
Color
Compr
a
Es
nuevo
1
CLIENTE
NIF
Es
usado
Matrcula
NUEVO
Marca
Modelo
Color
Stock
CLIENTE
Stock
Compra-usado
Compr
a
nuevo
M
COCHE
USADO
1
USADO
Pon
EMPLEADO
Nombre
ea
punt
o
No existe un criterio general para utilizar una alternativa u otra. En cada caso
hay que plantearse las ventajas e inconvenientes que plantea cada una. En
general, para tomar la decisin se debe tener en cuenta el tipo de jerarqua, los
atributos de la entidad genrica, a qu entidades afectan las operaciones a
realizar y la complejidad del esquema resultante.
b) Eliminar los atributos compuestos. El modelo relacional slo permite
representar atributo simples, por lo que deben convertirse los atributos
compuestos. Existen dos alternativas:
Pg.-42
SQL
CLIENTE
b)
DNI
Nombre
Direccin
CLIENTE
DNI Nombre
Direccin
SQL
Pg.-43
tabla.
Nombre
EMPLEADO
Empleado
Nombre Direccin
Direccin
1
DIRECTOR
Nombre_dire
Nombre_dirigido
DIRI
GE
Debe aclararse que siendo la relacin 1:M, es posible utilizar una nica relacin
con la clave primaria duplicada en los dos papeles. En este caso, el ejemplo se
transformara en la siguiente tabla:
EMPLEADO
Nombre_empleado Telfono
Nombre-director
DNI
Nombre
REALIZ
A
1
PROYECTO
Pg.-44
Num_proyecto
Denominacin
SQL
ESTUDIANTE
DNI
Nombre
Nm_proyecto
Denominacin
Nombre
PROYECTO
Nm_proyecto Denominacin
DNI
ESTUDIANTE
DNI
Nombre
PROYECTO
Nm_proyecto Denominacin
PROYECTO-DE-ESTUDIANTE
DNI
Nm_proyecto
-
Pg.-45
Cdigo
Nombre
1
SUMINISTR
A
Descuento
M
ISBN
LIBRO
Ttulo
Descuento
Pg.-46
SQL
ALUMNO
M
Nota_final
CURSA
M
Nom_asig
Horas
ASIGNATURA
Lo que quedara:
ALUMNO
DNI
Nom_alum
ASIGNATURA
Nom_asig
Horas
NOTA
DNI
Nom_asig Nota_final
d)
ALUMNO
Matricula
Pvp
Kms
COCHE
Forma_pago
CURSA
DNI_Emp
Nombre
ASIGNATURA
Direccin
Lo que quedara:
CLIENTE
DNI_CLI Telfono
COCHE
Matrcula
Pvp Km
EMPLEADO
DNI_Emp Nombre Direccin
VENTA
DNI_cli DNI_Emp Matrcula
SQL
Forma_pago
Pg.-47
Pg.-48
SQL
TEMA III
PANORAMICA GENERAL DE SQL
3..1
EL LENGUAJE SQL
3..2
OBJETIVOS DE SQL
3..3
3..4
3..5
3..6
3..7
ENTORNO DE TRABAJO
3..8
3..9
RESUMEN
3..10 EJERCICIOS
SQL
Pg.-49
Notas
Pg.-50
SQL
3.1.
EL LENGUAJE SQL
SQL
Pg.-51
3.2.
OBJETIVOS DE SQL
Pg.-52
SQL
3.3.
SQL
Pg.-53
Pg.-54
SQL
completo y consistente para crear una base de datos, gestionar su seguridad, actualizar
sus contenidos, recuperar los datos y compartirlos entre muchos usuarios concurrentes.
Definicin dinmica de datos
Utilizando SQL, la estructura de una base de datos puede ser modificada y
ampliada dinmicamente, incluso mientras los usuarios estn accediendo a los contenidos
de la base de datos. Este es un avance importante sobre los lenguajes de definicin de
datos estticos.
Arquitectura cliente/servidor
SQL es un vehculo natural para implementar aplicaciones utilizando una
arquitectura cliente/servidor distribuida.
3.4.
SQL
Pg.-55
Un usuario puede crear objetos particulares y permitir a otros trabajar con ellos.
En este caso, ser un usuario quien realice las tareas de administracin.
3.5.
Pg.-56
SQL
3.6.
El lenguaje SQL se utiliza para actuar sobre una base de datos de alguno de
estos modos:
a) De modo interactivo. Desde un terminal se establece una conversacin entre
el usuario y el programa gestor de la base de datos (SGBD). Es similar al
modo en que se mantiene un dilogo con un sistema operativo. Cualquier
orden SQL, sea DDL, DML u otra, puede introducirse por este mtodo, y
no hay restricciones en el orden entre ellas (pueden mezclarse consultas con
creaciones de tablas, por ejemplo). Responde al esquema de trabajo descrito
en la siguiente figura.
Intrprete de
Comandos
SGBD
Usuario
Base de datos
SQL
Pg.-57
SGBD
Base de datos
Sistema
operativ
o
Programa
de usuario
Ejecucin normal
3.7.
ENTORNO DE TRABAJO
Para el uso del lenguaje SQL es necesario un cierto entorno de trabajo. ste se
compone de varios elementos que se describen a continuacin. Un presunto usuario de
una base de datos bajo SQL debe disponer de:
a) Sistema operativo. La mquina en que el usuario realiza su trabajo se
denomina local. Lo usual es que una base de datos SQL se active sobre una
plataforma multiusuario con varios puestos de trabajo. El ordenador local
no suele tener instalado todo el SGBD, sino que estar distribuido entre
varias mquinas. Por tanto, el usuario deber tener acceso al sistema
operativo o red que se utilice.
b) Aplicacin para conexin con la base de datos. Una vez que el usuario se ha
conectado al sistema operativo, debe conectarse a la base de datos.
c) Acceso a la base de datos. Debe existir como usuario autorizado en la base
Pg.-58
SQL
de datos.
d) Utilidades. Se trata de programas diseados para realizar operaciones sobre
la base de datos. La utilidad ms bsica es un terminal de texto en el que
introducir rdenes SQL.
e) tiles de administracin del sistema. El ABD utilizar para su trabajo
algunas herramientas que estn vedadas al resto de usuarios, como
programas que evalen el rendimiento del sistema o aplicaciones para la
gestin de usuarios.
f) Compiladores. El usuario puede trabajar con SQL slo en modo
interpretado, para lo cual le basta con los tiles enumerados anteriormente.
Pero si desarrolla o simplemente utiliza un programa ya desarrollado por un
programador puede que necesite compilarlo.
3.8.
SQL
Pg.-59
local junto con un servidor de base de datos que almacena las bases de datos
compartidas. Las funciones del DBMS estn divididas en dos partes. Los frontales
(fronts-ends) de base de datos, tales como herramientas de consulta interactiva,
generadores de informe y programas de aplicacin, se ejecutan en la computadora
personal. El motor de soporte (back-end) de la base de datos que almacena y gestiona
los datos se ejecuta en el servidor. SQL se ha convertido en el lenguaje de base de datos
estndar para comunicacin entre las herramientas frontales y el motor soporte de esta
arquitectura.
En la arquitectura cliente/servidor, la consulta viaja a travs de la red hasta el
servidor de base de datos como una peticin SQL. El motor de base de datos el servidor
procesa la peticin y explora la base de datos, que tambin reside en el servidor. Cuando
se calcula el resultado, el motor de la base de datos enva de vuelta, a travs de la red,
una nica contestacin a la peticin inicial, y la aplicacin frontal la muestra en la
pantalla del PC.
La arquitectura cliente/servidor reduce el trfico de red y divide la carga de
trabajo de la base de datos. Las funciones ntimamente relacionadas con el usuario, tales
como el manejo de entradas y la visualizacin de datos, se concentran en el PC. Las
funciones de intenso procesamiento de datos, tales como la entrada/salida de archivos y
el procesamiento de consultas, se concentran en el servidor de la base de datos. Lo que
es ms importante, el lenguaje SQL proporciona un interfaz bien definido entre los
sistemas frontales y de soporte, comunicando las peticiones de acceso a la base de datos
de una manera eficiente.
Las implementaciones de SQL Server, Oracle, Informix e Ingres para LAN de
PC y SQLBase de Gupta Technologies utilizan este enfoque.
3.9.
RESUMEN
Pg.-60
SQL
SQL
Pg.-61
3.10. EJERCICIOS
1) Localizar al administrador de la base de datos que se tenga disponible.
Averiguar que tareas realiza durante las fases de puesta en marcha de una
base de datos y durante el mantenimiento posterior.
2) Poner ejemplos de tareas que puedan desarrollar sobre una base de datos un
usuario final y un programador.
3) De entre las operaciones sobre tablas ya conocidas, cules corresponden al
DML y cules DDL?
4) Poner ejemplos de usos de una base de datos en que convenga el uso
interpretado del lenguaje SQL y otros en que convenga el uso desde un
programa.
Pg.-62
SQL
TEMA IV
GRAMATICA DE SQL
4.1.
SENTENCIAS
4.2.
NOMBRES
4.3.
TIPOS DE DATOS
4.4.
CONSTANTES
4.5.
EXPRESIONES
4.6.
FUNCIONES INTERNAS
4.7.
RESUMEN
SQL
Pg.-63
Notas
Pg.-64
SQL
4.1. SENTENCIAS
El lenguaje SQL consta de unas treinta sentencias, que a continuacin se
resumen. Cada sentencia demanda una accin especfica por parte del DBMS, tal como
la creacin de una nueva tabla, la recuperacin de datos o la insercin de nuevos datos
en la base de datos.
Sentencia
Manipulacin de datos
SELECT
INSERT
DELETE
UPDATE
Descripcin
Recupera datos de la BD
Aade nuevas filas de datos de la BD
Suprime filas de la BD
Modifica datos existentes en la BD
Definicin de datos
CREATE TABLE
DROP TABLE
ALTER TABLE
CREATE VIEW
DROP VIEW
CREATE INDEX
DROP INDEX
CREATE SYNONUM
DROP SYNONUM
COMMENT
LABEL
Control de acceso
GRANT
REVOKE
Control de transacciones
COMMIT
ROLLBACK
SQL programtico
DECLARE
EXPLAIN
OPEN
FETCH
CLOSE
PREPARE
EXECUTE
DESCRIBE
SQL
Pg.-65
Todas las sentencias SQL tienen la misma forma bsica ilustrada en la siguiente
figura:
Verbo
Nombre de tabla
Clusulas
WHERE
Nombres de columna
Todas las sentencias SQL comienzan con un verbo, una palabra clave que
describe lo que la sentencia hace. CREATE, INSERT, DELETE y COMMIT son verbos
tpicos. La sentencia contina con una o ms clusulas. Una clusula puede especificar
los datos sobre los que debe actuar la sentencia, o proporcionar ms detalles acerca de lo
que la sentencia se supone que hace. Todas las clusulas comienzan tambin con una
palabra clave, tal como WHERE, FROM, INTO y HAVING. Algunas clusulas son
opcionales; otras son necesarias. La estructura y contenido especficos varan de una
clusula a otra. Muchas clusulas contienen nombres de tablas o columnas; algunas
pueden contener palabras claves adicionales, constantes o expresiones.Generalmente es
buena idea evitar palabras clave al nombrar tablas y columnas.
La siguiente tabla lista las palabras clave incluidas en el estndar SQL.
ADA
ALL
AND
ANY
AS
ASC
AUTHORIZATIO
N
AVG
BEGIN
BETWEEN
BY
C
CHAR
CHARACTER
CHECK
CLOSE
COBOL
COMMIT
CURRENT
CURSOR
DEC
DECIMAL
DECLARE
DEFAULT
DELETE
GO
GOTO
GRANT
GROUP
HAVING
IN
INDICATOR
OF
ON
OPEN
OPTION
OR
ORDER
PASCAL
SOME
SQL
SQLCODE
SQLERROR
SUM
TABLE
TO
DESC
DISTINCT
DOUBLE
END
ESCAPE
EXEC
EXISTS
FETCH
FLOAT
FOR
FOREIGN
INSERT
INT
IINTEGER
INTO
IS
KEY
LANGUAGE
LIKE
MAX
MIN
MODULE
PLI
PRESICION
PRIMARY
PRIVILEGES
PROCEDURE
PUBLIC
REAL
REFERENCES
ROLLBACK
SCHEMA
SECTION
UNION
UNIQUE
UPDATE
USER
VALUES
VIEW
WHENEVER
WHERE
WITH
WORK
A lo largo de todo este manual, las formas aceptables de una sentencia SQL se
ilustran mediante un diagrama sintctico, como el que se muestra en el siguiente grfico.
Pg.-66
SQL
4.2.
NOMBRES
SQL
Pg.-67
4.3.
TIPOS DE DATOS
Pg.-68
SQL
2) Nmeros decimales.
4) Cadenas de caracteres.
SQL
Pg.-69
VARCHAR(numero)
Cadenas de bits.
BIT (numero)
Pg.-70
SQL
SQL
Pg.-71
4.4.
CONSTANTES
-375
2000.00
+497500.8778
No se debe poner una coma entre los dgitos de una constante numrica, y no
todos los dialectos de SQL permiten el signo ms inicial, por lo que es mejor evitarlo.
Para los datos monetarios, la mayora de las implementaciones SQL utilizan simplemente
constantes enteras o decimales, aunque algunas permiten que la constante sea
especificada con un smbolo de moneda.
$0.75
$5000.00
$-567.89
-3.14159E1
2.5E-7
0.783926E21
La E se lee por diez elevado a, de modo que la primera constante es 1.5 por
diez elevado a tres, 1.500.
Pg.-72
SQL
Constantes de cadena
El estndar especifica que las constantes SQL de caracteres han de ir encerradas
entre comillas simples o dobles , como en los siguientes ejemplos:
Jones, John J. New York Oeste
Jones, John J. New York Oeste
3:30:25 PM
3:30:25 pm
3 PM
Constantes simblicas
Adems de las constantes suministradas por el usuario, el lenguaje SQL incluye
constantes simblicas especiales que devuelven valores de datos mantenidos por el
propio DBMS.
El estndar especifica solamente una nica constante simblica, pero la mayora
de los productos SQL proporcionan mucha ms. Las constantes simblicas que se
encuentran habitualmente en las implementaciones SQL estn listadas en la siguiente
tabla:
SQL
Pg.-73
Constante
USER
CURRENT_TIMESTAMP
Descripcin
El nombre de usuario bajo el cual se est accediendo
actualmente a la base de datos (DB2, SQL/DS, Oracle,
VAX, SQL, SQLBase y tambin especificado en el
estndar ANSI/ISO.
La fecha y hora actuales (DB2, SQL/DS).
4.5.
EXPRESIONES
y esta consulta lista las ciudades de las oficinas cuyas ventas son superiores a $50.000
por encima del objetivo:
SELECT CIUDAD
FROM OFICINAS
WHERE VENTAS > Objetivo + 50000.00
Pg.-74
SQL
4.6.
FUNCIONES INTERNAS
MAX (mximo)
MIN (mnimo)
AVG (media)
SUM (suma)
COUNT (total)
SQL
Pg.-75
Funcin
CAST (valor AS tipo_dato)
CONVERT (cadena USING conv)
CURRENT_TIMESTAMP ()
LOWER (cadena)
SUBSTRING (fuente,n , lon)
UPPER (cadena)
LEFT(cadena,lon)
LEN(cadena)
LTRIM(cadena)
RTRIM(cadena)
STR(cadena)
RIGHT(cadena, n elem)
Devuelve
El valor, convertido al tipo de dato
especificado (por ejemplo, una fecha
convertida a una cadena de caracteres)
Cadena convertida segn especifique la
funcin de conversin indicada
Fecha y hora actuales.
Convierte una cadena de tipo varchar a
minsculas.
Extrae de la cadena fuente una subcadena ,
comenzando en el carcter n-simo, con
una longitud lon
Convierte una cadena de tipo varchar a
maysculas.
Devuelve de la cadena una subcadena
comenzando por la izquierda y con una
longitud lon.
Devuelve la longitud de la cadena.
Quita los blancos de la izquierda en la
cadena.
Quita los blancos de la derecha en la
cadena.
Devuelve la cadena alineada a la derecha.
Devuelve el nmero de elementos de la
cadena que estn a la derecha.
RIGHT(CASA,2) = SA
ASCII(cadena)
4.7.
RESUMEN
Este captulo ha descrito los elementos bsicos del lenguaje SQL. La estructura
bsica del SQL se puede resumir tal como se expresa seguidamente:
Pg.-76
El lenguaje SQL incluye unas treinta sentencias, cada una formada por un
verbo y una o ms clusulas. Cada sentencia efecta una nica funcin
especfica.
Las bases de datos basadas en SQL pueden almacenar varios tipos de datos
entre los que se incluyen texto, enteros, nmeros, nmeros decimales,
nmeros de coma flotante y, generalmente, varios tipos ms especficos del
vendedor.
SQL
operadores
SQL
Pg.-77
Pg.-78
SQL
TEMA V
CREANDO BASES DE DATOS Y TABLAS
5.1.
5.2.
5.3.
5.4.
5.5.
CREACION DE BASES DE
ANALIZADOR DE CONSULTAS
5.6.
5.7.
5.8.
5.9.
DATOS
DESDE
EL
SQL
Pg.-79
Pg.-80
SQL
5.1.
5.2.
SQL
Pg.-81
Una de las formas que tiene SQL Server para proteger los datos es a travs de
registros de transacciones, bases de datos especiales que se utilizan para registrar la
actividad de un cliente.
REGISTRO DE TRANSACCIONES
Cuando se crea una base de datos, SQL Server crea automticamente un registro
de transacciones para ella. Este registro es un archivo especial en el que se guarda
toda la actividad relacionada con dicha base de datos. Siempre que un usuario
agregue, elimine o modifique la informacin de la base de datos, el registro de
transacciones tomar nota de la accin. Por defecto, estos registros tienen el mismo
nombre que la base de datos, pero utilizan la extensin .ldf, aunque a la hora de crear
la base de datos puede darle cualquier nombre.
El registro de transacciones proporciona cierto nivel de seguridad a los datos de
SQL Server. En caso de fallo, es posible aplicar las transacciones que se encuentran en
este archivo en otra copia de la base de datos. Por ejemplo, supongamos que se hace
una copia de seguridad de la base de datos de los clientes el lunes a las diez de la
maana. Si el dispositivo encargado del mantenimiento de la base de datos falla el
viernes a las cinco de la tarde, se pueden aplicar los registros de la semana a la copia
de la base de datos que se hizo el lunes, con lo que se recuperar el trabajo de la
semana.
Para protegerse de los fallos del hardware, el registro de transacciones se ha de
guardar en un dispositivo fisico distinto de aquel en el que se encuentra la base de
datos. Para obtener una proteccin mxima, conviene hacer un mirror (una copia) de
ambos dispositivos. Adems, tiene que hacer un backup de la base de datos principal
con cierta regularidad para que el tamao del registro de transacciones no se dispare.
Para mantener el archivo de registro, SQL Server escribe las ltimas acciones al
principio del fichero. Cuando se modifican los datos, SQL Server da los siguientes
pasos:
1. El cambio se guarda en el registro de transacciones.
2. Las pginas de datos modificadas se guardan en la memoria cach de
almacenamiento.
3. Se efectan los cambios en las pginas que se encuentran en la memoria
cach.
4. En el proceso de comprobacin se guardan los cambios en el disco.
El proceso de comprobacin es un procedimiento interno de SQL Server que
escribe todos los cambios de la memoria cach en el disco duro en el que se encuentra
la base de datos. Si lo desea, se puede ejecutar manualmente CHECKPOINT en
Transact_SQL para obligar a que se efecte el proceso de comprobacin.
Pg.-82
SQL
5.3.
Tres son los trminos relacionados con SQL Server con los que hay que
familiarizarse:
-
Pginas.
Extensiones.
Ficheros.
5.4.
Para hacer pruebas con estas sentencias SELECT utilizaremos una herramienta,
que viene dentro del paquete de SQL Server y que se llama analizador de consultas.
Para poner en marcha el analizador de consultas deberemos acudir al men
Inicio de Windows NT 4, seleccionar Programas, marcar SQL Server y dentro de l
SQL
Pg.-83
analizador de consultas.
Nos mostrar la pantalla de conexin al servidor de SQL Server.
Seleccionaremos el nombre del ordenador Server donde se encuentra instalado el
programa SQL Server. Si se encuentra en la maquina donde nos encontramos entonces
se puede seleccionar local. Nos pedir el nombre de usuario y contrasea con la que se
har la autentificacin, usaremos las mismas que tiene Windows NT en su base de datos
del Dominio.
Tras ello aparecer la ventana principal de analizador de consultas. Se muestra
una ventana donde pone Query e introduciremos la instruccin en lenguaje SQL
(concretamente Transact SQl, que es el dialecto de Microsoft SQL Server).
Por defecto nos aparecer conectada a Master, aunque podemos seleccionar
cualquier otra base de datos de nuestro servidor.
Tenemos dos formas de seleccionar la base de datos sobre la que queremos
lanzar consultas.
Una de ellas, la ms fcil, es desplegar el combo que contiene las bases de datos
disponibles y que se encuentran marcado como DB encima de las pestaas de consulta.
La segunda, la ms curiosa, consiste en enviar una consulta USE con el nombre
de la base de datos. Por ejemplo USE PUBS.
Tras escribir USE PUBS pulsaremos con el ratn la flecha de ejecucin de la
instruccin, o bien pulsaremos la combinacin de teclas F5.
Veremos cmo automticamente queda seleccionada la pestaa Results con la
siguiente frase: comandos completados con xito indica que se ha ejecutado
correctamente.
En la ventana puede volver a escribirse otra instruccin SQL. Pueden escribirse
varias instrucciones SQL de forma consecutiva y ejecutarlas simultneamente al pulsar la
tecla F5.
Como saber quin est conectado al sistema
SQL Server dispone de instrucciones de administracin, las cules siguen el
principio de Codd de que la configuracin de la propia base de datos debe ser accesible
mediante consultas SQL.
Dado que estas consultas implican conocer las tablas de sistema y que stas
pueden variar dependiendo de la versin de SQL Server, Microsoft proporciona una serie
de procedimientos almacenados o Stored Procedures que realizan por nosotros estas
Pg.-84
SQL
consultas.
Los procedimientos almacenados que proporciona Microsoft comienzan
siempre por sp_.
En este caso, para conocer los usuarios conectados a nuestro sistema,
utilizaremos la consulta sp_who.
De hecho lo que estamos obteniendo son los procesos que estn vivos dentro de
SQL Server, no slo los usuarios reales. La informacin que nos aporta es :
Id de proceso,
Estado del proceso,
Nombre del registro de usuario,
Nombre del Host,
Nombre de la base de datos que el usuario usa,
Comando SQL Server recien ejecutado.
Cmo obtener el listado de las tablas de la base de datos
Para obtener el listado de las tablas tambin disponemos de otra stored
procedure que se llama sp_tables:
Cmo obtener la descripcin de los campos de una tabla
Para obtener la descripcin de los campos de una tabla utilizaremos el
procedimiento almacenado llamado sp_columns seguido del nombre de la tabla que
queremos ver. Por ejemplo:
Sp_columns authors
5.5.
Para crear una base de datos, hay que estar conectado como administrador del sistema
SA' (o tener el permiso de utilizar CREATE DATABASE), y estar en la base de datos
de sistema master.
El objeto DATABASE debe crearse en primer lugar. Una base de datos contiene todos
los dems objetos.
- El catlogo de base de datos (18 tablas de sistema).
- Los objetos de usuario (tablas, valores por defecto, vistas, reglas, desencadenadores,
procedimientos).
- Los ndices, los tipos de datos, las restricciones de integridad.
- El registro de transacciones.
SQL
Pg.-85
SINTAXIS :
CREATE DATABASE nombre [ON [PRIMARY]
[( [NAME = nombrelgico,]
FILENAME = 'nombreFisico'
[, SIZE = tamao]
[ , MAXSIZE = { tamMax l UNLIMITED } ]
[, FILEGROWTH = valorIncremento] ) [,...]]
[ LOG 0N { <archivo> } ]
[ FOR LOAD | FOR ATTACH ]
NAME
MAXSIZE
FOR LOAD Para crear una base que ser recuperada a partir de una copia de
seguridad.
FOR ATTACH Para crear una base utilizando archivos ya creados. Esta peticin es til
cuando la base se crea con ms de 16 archivos.
Ejemplo:
Pg.-86
SQL
5.6.
SQL
Pg.-87
MODIFY FILE
( NAME=GESCOM_DATA,
SIZE=7MB)
5.7.
5.8.
5.9.
No se puede borrar una base de datos cuando est siendo utilizada por otro
usuario.
No se puede borrar la base de datos Model, ya que sta es la que se toma
como patrn para la creacin de nuevas bases de datos.
No se puede borrar la base de datos master, ya que se toma como base de
datos principal de SQL Server.
No se puede borrar la base de datos tempdb, ya que es el lugar donde se
almacenan temporalmente algunos datos de sistema necesarios para el
funcionamiento del SQL Server.
Pg.-88
SQL
sp_helpdb
Proporciona informacin sobre todas las bases de datos o sobre la base de datos
que suministremos como parmetro, mostrando el tamao en MB, el usuario propietario
de la base de datos, el nmero identificador de la base de datos, el status y la fecha de
creacin.
sp_spaceused
Muestra el espacio consumido y el espacio disponible de la base de datos en
uso.
Sp_rename
Permite modificar el nombre de cualquier objeto definido como tablas, columnas,
indices o tipos definidos por el usuario. No puede cambiar los nombres de la mayora de
objetos del sistema y, de los que puede cambiar, nicamente tendr acceso a aqullos de
los que sea propietario. La sintaxis es :
Sp_rename {nombre_objeto} [, nombre_nuevo] [, tipo_objeto]
El parmetro tipo_objeto permite especificar exactamente qu objeto se est
renombrando en los casos en los que una columna de una tabla tiene el mismo nombre
que un ndice de otra tabla.
Sp_rename pedidos, pedidos2000
La informacin sobre las vistas y los procedimientos se actualiza automticamente en la
tabla del sistema sysobjects cuando se modifica su nombre. Cuando se renombra una
restriccin PRIMARY KEY o UNIQUE, se actualiza tods los ndices asociados. Si se
cambia el nombre de un indice asociado a una clave principal (PRIMARY KEY), Esta
tambin se renombrar.
SQL
Pg.-89
Pg.-90
SQL
OBJETIVO MONEY,
VENTAS MONEY NOT NULL)
Define la Tabla PEDIDOS y sus columnas.
CREATE TABLE PEDIDOS
(NUM_PEDIDO INTEGER NOT NULL,
FECHA_PEDIDO DATETIME NOT NULL,
CLIE INTEGER NOT NULL,
REP INTEGER,
FAB CHAR (3) NOT NULL,
PRODUCTO CHAR (5) NOT NULL,
CANT INTEGER NOT NULL,
IMPORTE MONEY NOT NULL)
El estndar especifica que una columna puede contener valores NULL a menos
que especficamente se declare NOT NULL.
Valores por omisin (DEFAULT)
Define la Tabla OFICINAS con valores por omisin
CREATE TABLE OFICINAS
(OFICINA INTEGER NOT NULL,
CIUDAD VARCHAR (15) NOT NULL,
REGION VARCHAR (10) NOT NULL DEFAULT 'Este',
DIR INTEGER DEFAULT 106,
OBJETIVO MONEY DEFAULT NULL,
VENTAS MONEY NOT NULL DEFAULT 0.00)
Pg.-91
valor de clave primaria sea nico en cada fila de la tabla. Adems, la definicin de
columna para todas las columnas que forman la clave primaria debe especificar que la
columna es NOT NULL.
La clusula FOREIGN KEY especifica una clave ajena en la tabla y la relacin
que crea con otra tabla (padre) de la base de datos. La clusula especifica:
La columna o columnas que forman la clave ajena, todas las cules son
columnas de la tabla que est siendo creada.
La tabla que es referenciada por la clave ajena. Esta es la tabla padre en la
relacin; la tabla que est siendo definida es la hija.
Un nombre opcional para la relacin. El nombre no se utiliza en ninguna
sentencia SQL, pero puede aparecer en mensajes de error y es necesaria si
se desea poder suprimir la clave ajena posteriormente.
Cmo debe tratar el DBMS un valor NULL en una o ms columnas de la
clave ajena, cuando la compare con las filas de la tabla padre.
Una restriccin de comprobacin opcional que restrinja los datos de la tabla
para que sus filas encuentren una condicin de bsqueda especificada.
CONSTRAINT
Es una palabra clave que indica el principio de la definicin de una
restriccin PRIMARY KEY, UNIQUE, FOREIGN KEY o CHECK. Las
restricciones son propiedades especiales que exigen la integridad de los datos y
Pg.-92
SQL
SQL
Pg.-93
(columnaRef[,...n])
Es una columna o lista de columnas de la tabla a la que hace referencia la
restriccin FOREIGN KEY.
CHECK
Es una restriccin que exige la integridad del dominio al limitar los
valores posibles que se pueden escribir en una o varias columnas.
NOT FOR REPLICATION
Palabras clave que se utilizan para impedir que se exija la restriccin
CHECK durante el proceso de distribucin utilizado por la duplicacin. La
clusula NOT FOR REPLICATION significa que la restriccin se fuerza en las
modificaciones de los usuarios, pero no en el proceso de duplicacin.
La restriccin NOT FOR REPLICATION CHECK se aplica tanto a la
imagen anterior como posterior de un registro actualizado para impedir que se
agreguen o eliminen registros del intervalo duplicado. Se comprueban todos los
borrados e inserciones; si stos se encuentran en el intervalo duplicado, se
rechazan.
Cuando esta restriccin se utiliza con una columna de identidad, SQL
Server permite que la tabla no tenga que reinicializar los valores de columna de
identidad cuando un usuario de duplicacin la actualiza.
expresinLgica
Es una expresin lgica que devuelve TRUE o FALSE.
columna
Es una columna o lista de columnas, entre parntesis, que se utiliza en
las restricciones de tabla para indicar las columnas que se estn utilizando en la
definicin de la restriccin.
Es un marcador de posicin que indica que el elemento anterior se puede repetir
Pg.-94
SQL
n veces.
He aqu una sentencia CREATE TABLE ampliada para la Tabla PEDIDOS, que
incluye la definicin de su clave primaria y de las tres claves ajenas que contiene:
CREATE TABLE PEDIDOS1
(NUM_PEDIDO INTEGER NOT NULL CONSTRAINT clave PRIMARY KEY,
FECHA_PEDIDO DATETIME NOT NULL,
CLIE VARCHAR(4) NOT NULL CONSTRAINT PEDIDOPOR FOREIGN KEY
REFERENCES CLIENTES,
REP VARCHAR(3),
FAB VARCHAR (3) NOT NULL,
PRODUCTO VARCHAR (5) NOT NULL,
CANT INTEGER NOT NULL,
IMPORTE MONEY NOT NULL,
CONSTRAINT TOMADOPOR FOREIGN KEY (REP)
REFERENCES REPVENTAS (NUM_EMPL),
CONSTRAINT ESPOR FOREIGN KEY (FAB, PRODUCTO)
REFERENCES PRODUCTOS (ID_FAB,ID_PRODUCTO))
La figura muestra las tres relaciones creadas por esta sentencia y los nombres
que se les asigna . En general es buena idea asignar un nombre de relacin, ya que ayuda
a clarificar la relacin creada por la clave ajena. Por ejemplo, cada pedido fue remitido
por el cliente cuyo nmero aparece en la columna CLIE de la Tabla PEDIDOS. La
relacin creada por esta columna ha recibido el nombre de PEDIDOPOR.
Cuando el DBMS procesa la sentencia CREATE TABLE, compara cada
definicin de clave ajena con la definicin de la tabla referenciada. El DBMS se asegura
que la clave ajena y la clave primaria de la tabla referenciada concuerdan en el nmero de
columnas que contienen y en sus tipos de datos. La tabla referenciada debe estar ya
definida en la base de datos para que esta comparacin tenga xito.
SQL
Pg.-95
Tabla CLIENTES
Tabla REPVENTAS
NUM_CLIE
NUM_CLIE
EMPRESA
PEDIDOPOR
Tabla PRODUCTOS
NOMBRE
ID_FAB
ID_PRODUCTO
ACI
TOMADOPOR
41004
DESCRIPCION
Art. Tipo 4
ESPOR
tabla PEDIDOS
NUM_PEDIDO
FECHA_PEDIDO
CLIE
REP
FAB
PRODUCTO
CANT
IMPORTE
112963
12/17/1989
2103
105
ACI
41004
28
$3,276.00
Ejemplo:
Supongamos que queremos crear una tabla llamada CATEGORA cuya clave principal
es cod_cat.
Create table CATEGORA
(cod_cat varchar(2) NOT NULL,
Etiqueta varchar(30) NULL,
CONSTRAINT pk_categ PRIMARY KEY CLUSTERED (cod_cat))
Ejemplo:
Se pretende que las columnas Designacin y Precio debe ser nica en la tabla
ARTICULOS:
Create table ARTICULOS
(NUM_ART varchar(2) PRIMARY KEY,
DESIGNACIN_art varchar(3),
precio integer,
constraint pk_desig UNIQUE NONCLUSTERED,
constraint pk_precio UNIQUE NONCLUSTERED)
La propiedad identity
Esta propiedad puede ser asignada a una columna numrica (entera, tinyint, smallint, int,
decimal(p,0) o numeric(p,0)), en la creacin o en la modificacin de la tabla y permite
que el sistema genere valores para esta columna. Los valores sern generados en la
creacin de la lnea, sucesivamente y partiendo del valor inicial especifiado (por defecto
1) y aumentando o disminuyendo lnea tras lnea en un incremento (por defecto 1).
Slo puede haber una columna IDENTITY por tabla
Pg.-96
SQL
Pg.-97
Cada uno de estos cambios, y algunos otros, pueden ser realizados con la
sentencia ALTER TABLE. Al igual que con la sentencia DROP TABLE, ALTER TABLE
se utilizar normalmente sobre tablas propias. Con el permiso adecuado, sin embargo, se
puede especificar un nombre de tabla cualificado y alterar la definicin de la tabla de
otro usuario. La sentencia ALTER TABLE puede:
ADD definicin-de-columna
ALTER nombre-de-columna
DEFAULT valor
DROP DEFAULT
DROP nombre-de-columna
CASCADE
RESTRICT
ADD CONSTRAINT
Pg.-98
SQL
definicin-clave-primaria
definicin-clave-ajena
.. .definicin-unicidad
... .restriccin-comprobacin
Cada una de las clusulas de la sentencia ALTER TABLE puede aparecer slo
una vez en la sentencia. Se puede aadir una columna y definir una clave ajena en una
nica sentencia ALTER TABLE, pero deben utilizarse dos sentencias ALTER TABLE
para aadir dos columnas.
Aadir una columna.
El uso ms comn de la sentencia ALTER TABLE es aadir una columna a una
tabla existente. La clusula de definicin de columna en la sentencia ALTER TABLE es
prcticamente idntica a la de la sentencia CREATE TABLE y funciona del mismo modo.
La nueva columna se aade al final de las definiciones de la columna de la tabla y aparece
como la columna ms a la derecha en consultas posteriores. El DBMS asume
normalmente un valor NULL para la columna recin aadida en todas las filas existentes
de la tabla . Si la columna se declara NOT NULL con un valor por omisin , el DBMS
supone que el valor por omisin es el del tipo de datos de la columna. Observa que no
puede declararse simplemente la nueva columna NOT NULL, ya que el DBMS asumira
valores NULL para la columna en las filas existentes, violando inmediatamente la
restriccin.
Aade un nombre de contacto y un nmero telefnico a la Tabla CLIENTES.
ALTER TABLE CLIENTES
ADD NOMBRE_CONTACTO VARCHAR (30)
ALTER TABLE CLIENTES
ADD TELEF_CONTACTO CHAR (10)
Aade una columna de nivel inventario mnimo a la Tabla PRODUCTOS.
ALTER TABLE PRODUCTOS
ADD CANT_MIN INTEGER NOT NULL WITH DEFAULT
Modificacin de claves primaria y ajena.
El otro uso habitual para la sentencia ALTER TABLE es cambiar o aadir
definiciones de clave primaria y clave ajena a una tabla.
Las clusulas que aaden definiciones de claves primaria y ajena son
exactamente las mismas que las de la sentencia CREATE TABLE y funcionan del mismo
SQL
Pg.-99
modo. Slo se puede eliminar una clave ajena si la relacin que crea tuvo asignado un
nombre originalmente. Si la relacin no tiene nombre, no hay manera de especificarla en
la sentencia ALTER TABLE. En este caso no se puede suprimir la clave ajena a menos
que se elimine y vuelva a crear la tabla utilizando el procedimiento descrito para suprimir
una columna.
Haz de la columna REGION en la Tabla OFICINAS una clave ajena para la Tabla
REGIONES recin creada, cuya clave primaria es el nombre regin.
ALTER TABLE OFICINAS
ADD CONSTRAINT ENREGION FOREIGN KEY (REGION)
REFERENCES REGIONES (REGION)
Nombre de campo clave en
la tabla REGIONES.
He aqu un ejemplo de una sentencia ALTER TABLE que modifica una clave primaria, la
clave ajena correspondiente a la clave primaria original debe ser suprimida, puesto que ya
no es una clave ajena para la tabla alterada:
-
En cada caso, la nueva fila se aade para mantener la base de datos como un
modelo preciso del mundo real. La unidad de datos ms pequea que puede aadirse a
una base de datos relacional es una fila. En general, un DBMS basado en SQL
proporciona tres maneras de aadir nuevas filas de datos a una base de datos:
Pg.-100
Una sentencia INSERT de una fila aade una nica nueva fila de datos a
una tabla.
Una sentencia INSERT multifila extrae filas de datos de otra parte de la
base de datos y las aade a una tabla. Se utiliza habitualmente en
SQL
Henry Jacobsen
36
111
Director de ventas
Atlanta (nmero de oficina 13)
25 de julio de 1990
An no asignada
$0.00
SQL
Pg.-101
constante
NULL
nombre-de-columna
,
,
Incluir a Henry Jacobsen como nuevo vendedor.
INSERT INTO
REPVENTAS (NOMBRE, EDAD, NUM_EMPL, VENTAS, TITULO, CONTRATO, OFICINA_REP)
VALUES (Henry Jacobsen, 36, 111, 0.00, Dir Ventas, 25-JUL-90, 13)
1 fila insertada.
La sentencia INSERT construye una fila de datos que se corresponde con la
estructura en columnas de la tabla, la rellena con los datos de la clusula VALUES y
luego aade la nueva fila a la tabla. Las filas de una tabla no estn ordenadas, por lo que
no existe la nocin de insertar la fila al comienzo o al final o entre dos filas de la
tabla. Despus de ejecutar la sentencia INSERT, la nueva fila es simplemente una parte
de la tabla. Una consulta posterior de la tabla REPVENTAS incluir la nueva fila, pero
puede aparecer en cualquier punto entre las filas del resultado de la consulta.
Supongamos que el Sr. Jacobsen recibe ahora su primer pedido, de InterCorp,
un nuevo cliente que tiene asignado el nmero de cliente 2.126. El pedido es para 20
Widgets ACI-41004, por un precio total de $2.340, y le ha sido asignado el nmero de
pedidos 113.069. He aqu las sentencias INSERT que aaden el nuevo cliente y el pedido
a la base de datos:
Inserta un nuevo cliente y nuevo pedido para el Sr. Jacobsen.
INSERT INTO
CLIENTES (EMPRESA, NUM_CLIE, LIMITE_CREDITO, REP_CLIE)
VALUES (InterCorp, 2126, 15000.00,111)
1 fila insertada.
INSERT INTO
PEDIDOS (IMPORTE, FAB, PRODUCTO, CANT, FECHA_PEDIDO,
NUM_PEDIDO, CLIE, REP)
VALUES (2340.00, ACI, 41004, 20,GETDATE(), 113069, 2126, 111)
1 fila insertada.
Pg.-102
SQL
Como muestra este ejemplo, la sentencia INSERT puede ser larga si hay muchas
columnas de datos, pero su formato sigue siendo muy sencillo. La segunda sentencia
INSERT utiliza la constante de sistema GETDATE() en la clusula VALUES, haciendo
que se inserte la fecha actual como fecha de pedido.
En la prctica, sin embargo, los datos referentes a un nuevo cliente, un nuevo
pedido o un nuevo vendedor son caso siempre aadidos a una base de datos mediante un
programa de entrada orientado a formularios. Cuando la entrada de datos est completa,
el programa inserta la nueva fila de datos utilizando SQL programado. Sin embargo,
independientemente de que se utilice SQL programado o interactivo, la sentencia
INSERT es la misma.
El propsito de la lista de columnas en la sentencia INSERT es hacer
corresponder los valores de datos en la clusula VALUES con las columnas que van a
recibirlos. La lista de valores y la lista de columnas deben contener el mismo nmero de
elementos y el tipo de dato de cada valor debe ser compatible con el tipo de dato de la
columna correspondiente, o en caso contrario se producir un error.
Insercin de valores NULL.
Cuando SQL inserta una nueva fila de datos en una tabla, automticamente
asigna un valor NULL a cualquier columna cuyo nombre falte en la lista de columnas de
la sentencia INSERT. En esta sentencia INSERT, que aade al Sr. Jacobsen a la Tabla
REPVENTAS, las columnas CUOTA y DIRECTOR estn omitidas:
INSERT INTO
REPVENTAS (NOMBRE, EDAD, NUM_EMPL, VENTAS, TITULO, CONTRATO, OFICINA_REP)
VALUES (Henry Jacobsen, 36, 111, 0.00, Dir Ventas, 25-JUL-90, 13)
Como resultado, la fila recin aadida tiene un valor NULL, en las columnas
CUOTA y DIRECTOR. Puede hacer ms explcita la asignacin del valor NULL
incluyendo las columnas en la lista y especificando la palabra clave NULL en los valores.
Insercin de todas las columnas.
Por conveniencia, SQL permite omitir la lista de columnas de la sentencia
INSERT. Cuando se omite la lista de columnas, SQL genera automticamente una lista
formada por todas las columnas de la tabla, una secuencia de izquierda a derecha. Esta es
la misma secuencia de columnas generadas por SQL cuando se utiliza una consulta
SELECT. Utilizando esta forma abreviada, la sentencia INSERT anterior podra
escribirse de la siguiente forma:
INSERT INTO REOVENTAS
VALUES (111, Henry Jacobsen, 36, 13, Dir Ventas, 25-JUL-90, NULL, NULL, 0.00)
SQL
Pg.-103
consulta
nombre-de-columna
,
Pg.-104
SQL
FAB
PRODUCTO
CANT
6 filas insertadas.
En una base de datos de grandes dimensiones, esta sentencia INSERT puede
tardar un buen rato en ejecutarse, ya que implica una consulta de tres tablas. Cuando la
sentencia se complete, los datos de la Tabla GRANPEDIDOS contendrn informacin
duplicada de otras tablas. Adems, la Tabla GRANPEDIDOS no se mantendr,
automticamente actualizada cuando se aadan nuevos pedidos a la base de datos, por lo
que sus datos pueden quedar rpidamente obsoletos. Cada uno de estos factores parece
desventaja. Sin embargo, las consultas de anlisis subsiguientes que utiliza una tabla
como sta pueden expresarse de forma muy sencilla.
El estndar SQL especifica varias restricciones lgicas sobre la consulta que
aparece dentro de la sentencia INSERT multifila:
Pg.-105
La sentencia DELETE
La sentencia DELETE elimina filas seleccionadas de datos de una nica tabla.
La clusula FROM especifica la tabla destino que contiene las filas. La clusula WHERE
especifica qu filas de la tabla van a ser suprimidas.
DELETE FROM nombre-de tabla
WHERE condicin de bsqueda
Elimina a Henry Jacobsen de la base de datos.
DELETE FROM REPVENTAS
WHERE NOMBRE = Henry Jacobsem
1 fila suprimida.
La clusula WHERE de este ejemplo identifica una sola fila de la Tabla
REPVENTAS, que SQL elimina de la tabla.
Elimina todos los pedidos de InterCorp (nmero de cliente 2.126).
DELETE FROM PEDIDOS
WHERE CLIE = 2126
2 filas suprimidas.
En este caso, la clusula WHERE selecciona varias filas de la Tabla PEDIDOS y
Pg.-106
SQL
SQL elimina todas las filas seleccionadas de la tabla. Conceptualmente, SQL aplica la
clusula WHERE a cada una de las filas de la Tabla PEDIDOS, suprimiendo aqullas
para las cuales la condicin de bsqueda produce un resultado TRUE y manteniendo
aqullas para las cuales la condicin de bsqueda produce un resultado FALSE o NULL.
Suprime todos los pedidos remitidos antes del 15 de noviembre de 1989.
DELETE FROM PEDIDOS
WHERE FECHA_PEDIDO < 15-NOV-89
5 filas suprimidas.
Suprime todas las filas correspondientes a los clientes atendidos por Bill Adams, Mary
Jones o Dan Roberts (nmeros de empleados 105, 109 y 101).
DELETE FROM REPVENTAS
WHERE CONTRATO < 01-JUL-88
AND CUOTA IS NULL
0 filas suprimidas
Supresin de todas las filas
La clusula WHERE en una sentencia DELETE es opcional, pero casi siempre
est presente. Si se omite la clusula WHERE de una sentencia DELETE, se suprimen
todas las filas de la tabla destino, como en este ejemplo:
Suprime todos los pedidos.
DELETE FROM PEDIDOS
30 filas suprimidas.
Aunque esta sentencia DELETE produce una tabla vaca, no borra la Tabla
PEDIDOS de la base de datos. La definicin de la Tabla PEDIDOS y sus columnas
siguen estando almacenadas en la base de datos. La tabla an existe y nuevas filas
pueden ser insertadas en la Tabla PEDIDOS con la sentencia INSERT. Para eliminar la
definicin de la tabla de la base de datos, debe utilizarse la sentencia DROP TABLE.
Debido al dao potencial que puede producir una sentencia DELETE como
sta, es importante especificar siempre una condicin de bsqueda y tener cuidado de
que se seleccionan realmente filas que se desean. Cuando se utiliza SQL interactivo, es
buena idea utilizar primero la clusula WHERE en una sentencia SELECT para visualizar
las filas seleccionadas, asegurarse de que son las que realmente se desea suprimir y slo
entonces utilizar la clusula WHERE en una sentencia DELETE.
DELETE con subconsulta.
Las sentencias DELETE con condiciones de bsqueda simples, como las de los
ejemplos anteriores, seleccionan las filas a suprimir basndose nicamente en los propios
contenidos de las filas. A veces, la seleccin de las filas debe efectuarse en base a datos
SQL
Pg.-107
NUM_PEDIDO
IMPORTE
112979
113065
112993
113048
$15,000.00
$ 2,130.00
$ 1,896.00
$ 3,750.00
4 filas suprimidas.
La consulta halla el nmero de empleado de Sue Smith y la clusula WHERE
selecciona entonces los pedidos tratados por ese nmero de empleado.
Pg.-108
La sentencia UPDATE
La sentencia UPDATE modifica los valores de una o ms columnas en las filas
seleccionadas de una tabla nica. La tabla destino a actualizar se indica en la sentencia y
es necesario disponer de permiso para actualizar la tabla as como cada una de las
columnas individuales que sern modificadas. La clusula WHERE selecciona las filas de
la tabla a modificar. La clusula SET especifica qu columnas se van a actualizar y
calcula los nuevos valores.
SQL
Pg.-109
nombre-de-columna = expresin
,
WHERE condicin-de-bsqueda
Pg.-110
SQL
poder calcular con los valores de la fila que actualmente est en actualizacin en la tabla
destino. No pueden incluirse funciones de columna ni subconsulta.
Actualizacin de todas las filas.
La clusula WHERE en la sentencia UPDATE es opcional. Si se omite la
clusula WHERE, entonces se actualizan todas las filas de la tabla destino, como en este
ejemplo:
Eleva todas las cuota un 5%.
UPDATE REPVENTAS
SET CUOTA = 1.05 * CUOTA
10 filas actualizadas.
UPDATE con subconsulta.
Al igual que con la sentencia DELETE, las subconsultas pueden jugar un papel
importante en la sentencia UPDATE ya que permiten seleccionar las filas a actualizar en
base a informacin contenida en otras tablas. He aqu varios ejemplos de sentencias
UPDATE que utilizan subconsultas:
Eleva en $5.000 el lmite de crdito de cualquier cliente que haya remitido una orden de
ms de $25.000.
UPDATE CLIENTES
SET LIMITE_CREDITO = LIMITE_CREDITO + 5000.00
WHERE NUM_CLIE IN (SELECT DISTINCT CLIE
FROM PEDIDOS
WHERE IMPORTE > 25000.00)
4 filas actualizadas.
Reasigna todos los clientes atendidos por vendedores cuyas ventas son menores al 80
por 100 de sus cuotas.
SQL
Pg.-111
UPDATE CLIENTES
SET REP_CLIE = 105
WHERE REP_CLIE IN (SELECT NUM_EMPLP
FROM REPVENTAS
WHERE VENTAS < (0.8 * CUOTA))
2 filas actualizadas.
Las subconsultas en la clusula WHERE de la sentencia UPDATE pueden
anidarse a cualquier nivel y pueden contener referencias externas a la tabla destino de la
sentencia UPDATE.
La tabla destino no puede aparecer en la clusula FROM de ninguna
subconsulta a ningn nivel de anidacin.
Cualquier referencia a la tabla destino en las subconsultas son por tanto
referencias externas a la fila de la tabla destino que actualmente est siendo comprobada
por las clusulas WHERE de la sentencia UPDATE.
5.16. RESUMEN
Pg.-112
La sentencia INSERT de una fila aade una fila de datos a una tabla. Los
valores para la nueva fila se especifican en la sentencia como constantes.
La sentencia INSERT multifila aade cero o ms filas a una tabla. Los
valores para las nuevas filas provienen de una consulta, especificada como
parte de la sentencia INSERT.
La sentencia DELETE suprime cero o ms filas de datos de una tabla. Las
filas a suprimir son especificadas mediante una condicin de bsqueda.
La sentencia UPDATE modifica los valores de una o ms columnas en cero
o ms filas de una tabla. Las filas a actualizar son especificadas mediante
una condicin de bsqueda.
A diferencia de la sentencia SELECT, que puede operar sobre mltiples
tablas, las sentencias INSERT, DELETE y UPDATE funcionan solamente
sobre una nica tabla cada vez.
SQL
5.17 EJERCICIOS
1) EJERCICIO:
Se trata de una sencilla base de datos relacional para una pequea empresa de
distribucin. La base de datos almacena la informacin necesaria para implementar una
pequea aplicacin de procesamiento de pedidos.
Hay una tabla separada de datos para cada clase diferente de entidad. Las
peticiones de base de datos que se hace utilizando el lenguaje SQL se corresponde con
actividades del mundo real, tales como emisin, cancelacin y cambio de pedidos por
parte de los clientes, contratacin y despido de vendedores, etc.
a) Crear la base de datos.
b) Crear las 4 tablas.
c) Insertar datos en todas las tablas.
Tabla OFICINAS
OFICINA
22
11
12
13
21
CIUDAD
Denver
New York
Chicago
Atlanta
Los Angeles
REGION
Oeste
Este
Este
Este
Oeste
OBJETIVO
$300,000.00
$575,000.00
$800,000.00
$350,000.00
$725,000.00
VENTAS
$186,042.00
$692,637.00
$735,042.00
$367.911.00
$835,915.00
Tabla PEDIDOS
NUM_PE
DIDO
112961
113012
112989
113051
112968
113036
113045
112963
113013
113058
112997
FECHA_P
EDIDO
17-DIC-89
1-ENE-90
03-ENE-90
10-FEB-90
12-OCT-89
30-ENE-90
02-FEB-90
17-DIC-89
14-ENE-90
23-FEB-90
08-ENE-90
CLIE
REP
FAB
2117
2111
2101
2118
2102
2107
2112
2103
2118
2108
2124
106
105
106
108
101
110
108
105
108
109
107
REI
ACI
FEA
QSA
ACI
ACI
REI
ACI
BIC
FEA
BIC
SQL
PRODUC
TO
A244L
41003
114
XK47
41004
4100Z
A244L
41004
41003
112
41003
CANT
IMPORTE
7
35
6
4
34
9
10
28
1
10
1
$31,500.00
$3,745.00
$1,458.00
$1,420.00
$3,978.00
$22,500.00
$45,000.00
$3,276.00
$652.00
$1,480.00
$652.00
Pg.-113
112983
113024
113062
112979
113027
113007
113069
113034
112992
112975
113055
113048
112993
113065
113003
113049
112987
113057
113042
27-DIC-89
20-ENE-90
24-FEB-90
12-OCT-89
22-ENE-90
08-ENE-90
2103
2114
2124
2114
2103
2112
2109
2107
2118
2111
2108
2120
2106
2106
2108
2118
2103
2111
2113
02-MAR-90
29-ENE-90
04-NOV-89
12-OCT-89
15-FEB-90
10-FEB-90
04-ENE-89
27-FEB-90
25-ENE-90
10-FEB-90
31-DIC-89
18-FEB-90
02-FEB-90
105
108
107
102
105
108
107
110
108
103
101
102
102
102
109
108
105
103
101
ACI
QSA
FEA
ACI
ACI
IMM
IMM
REI
ACI
REI
ACI
IMM
REI
QSA
IMM
QSA
ACI
ACI
REI
41004
XK47
114
4100Z
41002
773C
775C
A245C
41002
A244G
4100X
779C
A245C
XK47
779C
XK47
4100Y
4100X
A244R
6
20
10
6
54
3
22
8
10
6
6
2
24
6
3
2
11
24
5
$702.00
$7,100.00
$2,430.00
$15,000.00
$4,104.00
$2,925.00
$1,350.00
$632.00
$760.00
$2,100.00
$150,.00
$3,750.00
$1,896.00
$2,130.00
$5,625.00
$776.00
$27,500.00
$600.00
$22,500.00
Tabla CLIENTES
NUM_CLIE
2111
2102
2103
2123
2107
2115
2101
2112
2121
2114
2124
2108
2117
2122
2120
2106
2119
2118
2113
2109
2105
EMPRESA
JCP inc.
First Corp.
Acme Mfg.
Carter & Sons
Ace International
Smithson Corp.
Jones Mfg.
Zetacorp
QMA Assoc.
Orion Corp.
Peter Brothers
Holm & Landis
J.P. Sinclair
Three-Way Lines
Rico Enterprises
Fred Lewis Corp.
Solomon Inc.
Midwest Systems
Ian & Schmidt
Chen Associates
AAA Investments
REP_CLIE
103
101
105
102
110
101
106
108
103
102
107
109
106
105
102
102
109
108
104
107
101
LIMITE-CREDITO
$50,000.00
$65,000.00
$50,000.00
$40,000.00
$35,000.00
$20,000.00
$65,000.00
$50,000.00
$45,000.00
$20,000.00
$40,000.00
$55,000.00
$35,000.00
$30,000.00
$50,000.00
$65,000.00
$25,000.00
$60,000.00
$20,000.00
$25,000.00
$45,000.00
Tabla REPVENTAS
NUM_EM
PL
105
109
102
106
Pg.-114
NOMBRE
EDAD
Bill Adams
Mary Jones
Sue Smith
Sam Clark
37
31
48
52
OFICINA_
REP
13
11
21
11
TITULO
Rep. ventas
Rep. ventas
Rep. ventas
Vp ventas
SQL
CONTRAT
O
1-ENE-88
12-OCT-9
10-DIC-86
14-JUN-88
DIRECTO
R
104
106
108
NULL
CUOTA
VENTAS
$350,000.00
$300,000.00
$350,000.00
$275,000.00
$367,911.00
$392,725.00
$474,050.00
$299,912.00
104
101
110
108
103
107
Bob Smith
Dan Roberts
Tom Snyder
Larry Fitch
Paul Cruz
Nancy
Angelli
33
45
41
62
29
49
12
12
NULL
21
12
22
Dir ventas
Rep. Ventas
Rep. Ventas
Dir ventas
Rep. Ventas
Rep. Ventas
19-MAY-87
20-OCT-86
13-ENE-90
12-OCT-89
01-MAR-87
14-NOV-87
106
104
101
106
104
108
$200,000.00
$300,000.00
NULL
$350,000.00
$275,000.00
$300,000.00
$142,594.00
$305,673.00
$75,985.00
$361,865.00
$286,775.00
$186,042.00
TABLA PRODUCTOS
ID_FAB
REI
ACI
QSA
BIC
IMM
ACI
ACI
BIC
IMM
QSA
REI
FEA
IMM
BIC
ACI
IMM
ACI
QSA
ACI
REI
IMM
ACI
FEA
IMM
REI
ID_PRODUCTO
2A45C
4100Y
XK47
41672
779C
4103
41004
41003
887P
XK48
2A44L
112
887H
41089
41001
775C
410Z
XK48A
41002
2A44R
773C
4100X
114
887X
2A44G
DESCRIPCIN
UNION TRINQUETE
DESMONTADOR
REDUCTOR
PLACA
ABRAZADERA 90
ARTICULO TIPO3
ARTICULO TIPO 4
TIRADOR
PERNO ABRAZADERA
REDUCTOR
BISAGRA IZQUIDA
CUBIERTA
SOPORTE ABRAZADERA
RETEN
ARTICULO TIPO 1
ABRAZADERA 500
MONTADOR
REDUCTOR
ARTICULO TIPO 2
BISAGRA DERECH
ABRAZADERA 300
AJUSTADOR
BANCADA MOTOR
RETN ABRAZADERA
PASADOR BISAGRA
SQL
PRECIO
79
2750
355
180
1875
107
117
652
250
134
4500
148
54
225
55
1425
2500
117
76
4500
975
25
243
475
350
EXISTENCIAS
210
25
38
0
9
207
139
3
24
203
12
115
223
78
277
5
28
37
167
12
28
37
15
32
14
Pg.-115
TEMA VI
CONSULTAS SIMPLES
6.1.
CLAUSULA SELECT
6.2.
CLAUSULA FROM
6.3.
RESULTADOS DE CONSULTAS
6.4.
CLAUSULA WHERE
6.5.
COMNDICIONES DE BUSQUEDA
6.5.1.
6.5.2.
6.5.3.
6.5.4.
6.5.5.
6.5.6.
Test de comparacin
Test de rango
Test de pertenencia a conjunto
Test de correspondencia con patrn
Test de valor nulo
Condiciones de bsqueda compuestas
6.6.
COLUMNAS CALCULADAS
6.7.
6.8.
6.9.
Pg.-116
SQL
DE
LOS
RESULTADOS
DE
UNA
SQL
Pg.-117
6.1.
CLAUSULA SELECT
La clusula SELECT que empieza cada sentencia SELECT especifica los tems
de datos a recuperar por la consulta. Los tems se especifican generalmente mediante una
lista de seleccin, una lista de tems de seleccin separados por comas. Cada tem de
seleccin de la lista genera una nica columna de resultados de consulta, en orden de
izquierda a derecha. Un tem de seleccin puede ser:
SELECT item1, item2,...
6.2.
CLAUSULA FROM
6.3.
RESULTADOS DE CONSULTAS
El resultado de una consulta SQL es siempre una tabla de datos, semejante a las
tablas de la base de datos. Si se escribe una sentencia SELECT utilizando SQL
interactivo, el DBMS visualizar los resultados de la consulta en forma tabular sobre la
pantalla de la computadora.
Pg.-118
SQL
OFICINA_REP
13
11
21
11
12
12
NULL
21
12
22
CONTRATO
12-FEB-88
12-OCT-89
10-DIC-86
14-JUN-88
19-MAY-87
20-OCT-86
13-ENE-90
12-OCT-89
01-MAR-87
14-NOV-88
Las consultas SQL ms sencillas solicitan columnas de datos de una nica tabla
en la base de datos.
Lista de la poblacin, regin y ventas de cada oficina.
SELECT CIUDAD, REGION, VENTAS
FROM OFICINAS
CIUDAD
Denver
New York
Chicago
Atlanta
Los Angeles
REGION
Oeste
Este
Este
VENTAS
$186,042.00
$692,637.00
$735,042.00
$367,911.00
$835,915.00
Este
Oeste
La sentencio SELECT para consultas sencillas como sta slo incluye las dos
clusulas imprescindibles. Las clusula SELECT designa a las columnas solicitadas; la
clusula FROM designa a la tabla que las contiene.
SQL
Pg.-119
CIUDAD
Denver
New York
Chicago
Atlanta
Los Angeles
REGION
Oeste
Este
Este
Este
Oeste
OBJETIVO
$300,000.00
$575,000.00
$800,000.00
$350,000.00
$725,000.00
VENTAS
$186,042.00
$692,637.00
$735,042.00
$350,000.00
$835,915.00
Resultados de la consulta
CIUDAD
Denver
New York
Chicago
Atlanta
Los Angeles
6.4.
REGION
Oeste
Este
Este
Este
Oeste
VENTAS
$186,042.00
$692,637.00
$735,042.00
$350,000.00
$835,915.00
CLAUSULA WHERE
Las consultas SQL que recuperan todas las filas de una tabla son tiles para
inspeccin y elaboracin de informes sobre la base de datos, pero para poco ms.
Generalmente se desear seleccionar solamente parte de las filas de una tabla, y slo
incluirn esas filas en los resultados. La clusula WHERE se emplea para especificar las
filas que se desean recuperar. He aqu algunos ejemplos de consultas simples que utilizan
la clusula WHERE:
Muestra las oficinas en donde las ventas exceden del objetivo.
SELECT CIUDAD, VENTAS, OBJETIVO
FROM OFICINAS
WHERE VENTAS > OBJETIVO
Pg.-120
SQL
CIUDAD
New York
Atlanta
Los Angeles
VENTAS
$692,637.00
$367,911.00
$835,915.00
OBJETIVO
$575,000.00
$350,000.00
$725,000.00
VENTAS
$367,911.00
$305,673.00
$286,775.00
SQL
Pg.-121
NOMBRE
Bill Adams
Mary Jones
Sue Smith
Sam Clark
Bob Smith
Dan Roberts
DIRECTO
R
104
106
108
NULL
106
104
NOMBRE
VENTAS
DIRECTOR =
104
TRUE
DIRECTOR = 106
FALSE
DIRECTOR =
NULL
Desconocido
6.5.
CONDICIONES DE BUSQUEDA
Pg.-122
SQL
SQL
Pg.-123
LIMITE_CREDITO
$35,000.00
Pg.-124
SQL
SQL
Pg.-125
NUM_PEDIDO
112961
112968
112963
112983
112979
112992
112975
112987
FECHA_PEDIDO
17-DIC-89
12-OCT-89
17-DIC-89
27-DIC-89
12-OCT-89
04-NOV-89
12-OCT-89
31-DIC-89
FAB
REI
ACI
ACI
ACI
ACI
ACI
REI
ACI
PRODUCTO
IMPORTE
A244L
$31,500.00
41004
$ 3,978.00
41004
$ 3,276.00
41004
$ 702.00
41002
$15,000.00
41002
$ 760.00
A244G
$ 2,100.00
4100Y
$27,500.00
El test BETWEEN incluye los puntos extremos del rango, por lo que los
pedidos remitidos el 1 de octubre o el 31 de diciembre se incluyen en los resultados de la
consulta.
La versin negada del test de rango (NOT BETWEEN) comprueba los valores
que caen fuera del rango, como en este ejemplo:
Lista los vendedores cuyas ventas no estn entre el 80 y el 120 por 100 de su cuota:
SELECT NOMBRE, VENTAS, CUOTA
FROM REPVENTAS
WHERE VENTAS NOT BETWEEN (0.8 * CUOTA) AND (1.2 * CUOTA)
NOMBRE
Mary Jones
Sue Smith
Bob Smith
Nancy Angelli
VENTAS
$392,725.00
$474,050.00
$142,594.00
$186,042.00
CUOTA
$300,000.00
$350,000.00
$200,000.00
$300,000.00
Pg.-126
SQL
CUOTA
$350,000.00
$300,000.00
$275,000.00
$300,000.00
VENTAS
$367,911.00
$392,725.00
$299,912.00
$186,042.00
SQL
Pg.-127
Pg.-128
SQL
SQL
Pg.-129
Pg.-130
SQL
Halla los vendedores que estn por debajo de la cuota o con ventas inferiores a
$300.000.
SELECT NOMBRE, CUOTA, VENTAS
FROM REPVENTAS
WHERE VENTAS < CUOTA
OR VENTAS < 300000.00
Tambin se puede utilizar la palabra clave AND para combinar dos condiciones
de bsqueda que deban ser ciertas simultneamente:
SELECT NOMBRE, CUOTA, VENTAS
FROM REPVENTAS
WHERE VENTAS < CUOTA
AND VENTAS < 300000.00
Finalmente, se puede utilizar la palabra clave NOT para seleccionar filas en
donde la condicin de bsqueda es falsa:
Halla todos los vendedores que estn por debajo de la cuota, pero cuyas ventas no son
inferiores a $150.000.
SELECT NOMBRE, CUOTA, VENTAS
FROM REPVENTAS
WHERE VENTAS < CUOTA
AND NOT VENTAS < 150000.00
Utilizando las palabras clave AND, OR y NOT y los parntesis para agrupar los
criterios de bsqueda, se pueden construir criterios de bsqueda muy complejos.
Cuando se combinan ms de dos condiciones de bsqueda con AND, OR y
NOT, el estndar especifica que NOT tiene la precedencia ms alta, seguido de AND y
por ltimo OR. Para asegurar la portabilidad, es siempre una buena idea utilizar
parntesis y suprimir cualquier posible ambigedad.
6.6.
COLUMNAS CALCULADAS
SQL
Pg.-131
REGION
Oeste
Este
Este
(VENTAS-OBJETIVOS)
-$113,958.00
$117,637.00
-$64,958.00
$17,911.00
$110,915.00
Este
Oeste
Para procesar la consulta, SQL examina las oficinas, generando una fila de
resultados por cada fila de la Tabla OFICINAS. Las dos primeras columnas de resultados
provienen directamente de la Tabla OFICINAS. La tercera columna de los resultados se
calcula, fila a fila, utilizando los valores de datos de la fila actual de la Tabla OFICINAS.
Muchos productos SQL disponen de operaciones aritmticas adicionales,
operaciones de cadenas de caracteres y funciones internas que pueden ser utilizadas en
expresiones SQL. Estas pueden aparecer en expresiones de la lista de seleccin.
Lista el nombre, el mes y el ao de contrato para cada vendedor.
SELECT NOMBRE, MONTH(CONTRATO), YEAR(CONTRATO)
FROM REPVENTAS
Tambin se pueden utilizar constantes SQL por s mismas como tems en una
lista de seleccin. Esto puede ser til para producir resultados que sean ms fciles de
leer e interpretar.
Lista las ventas para cada ciudad.
SELECT CIUDAD, tiene ventas de, VENTAS
FROM OFICINAS
Pg.-132
SQL
CIUDAD
Denver
New York
Chicago
Atlanta
Los Angeles
TIENE VENTAS DE
tiene ventas de
tiene ventas de
tiene ventas de
tiene ventas de
tiene ventas de
VENTAS
$186,042.00
$692,637.00
$735,042.00
$367,911.00
$835,915.00
Los resultados de la consulta parecen consistir en una frase distinta por cada
oficina, pero realmente es una tabla de tres columnas. Las columnas primera y tercera
contienen valores procedentes de la Tabla OFICINAS. La columna siempre contiene la
misma cadena de texto de quince caracteres.
6.7.
6.8.
SQL
Pg.-133
6.9.
Al igual que las filas de una tabla en la base de datos, las filas de los resultados
de una consulta no estn dispuestas en ningn orden particular. Se puede pedir a SQL
que ordene los resultados de una consulta incluyendo la clusula ORDER BY en la
sentencia SELECT. La clusula ORDER BY consta de las palabras claves ORDER BY,
seguidas de una lista de especificaciones de ordenacin separadas por comas. Por
Pg.-134
SQL
ejemplo, los resultados de esta consulta estn ordenados en dos columnas, REGION y
CIUDAD.
Muestra las ventas de cada oficina, ordenadas en orden alfabtico por regin y dentro de
cada regin por ciudad.
SELECT CIUDAD, REGION, VENTAS
FROM OFICINAS
ORDER BY REGION, CIUDAD
La primera especificacin de ordenacin (REGION) es la clave de la ordenacin
mayor, las que le sigan (CIUDAD, en este caso) son progresivamente claves de
ordenacin menores, utilizadas para desempatar cuando dos filas de resultados tienen
los mismos valores para las claves mayores. Utilizando la clusula ORDER BY se puede
solicitar la ordenacin en secuencia ascendente o descendente, y se puede ordenar con
respecto a cualquier elemento en la lista de seleccin de la consulta.
Por omisin, SQL ordena los datos en secuencia ascendente. Para solicitar
ordenacin en secuencia descendente, se incluye la palabra clave DESC en la
especificacin de ordenacin, como en este ejemplo:
Lista las oficinas, clasificadas en orden descendente de ventas, de modo que las oficinas
con mayores aparezcan en primer lugar.
SELECT CIUDAD, REGION, VENTAS
FROM OFICINAS
ORDER BY VENTAS DESC
CIUDAD
Los Angeles
Chicago
New York
Atlanta
Denver
REGION
Oeste
Este
Este
VENTAS
$835,915.00
$735,042.00
$692,637.00
$367,911.00
$186,042.00
Este
Oeste
SQL
Pg.-135
FROM OFICINAS
ORDER BY 3 DESC
Estos resultados estn ordenados por la tercera columna, que es la diferencia
calculada entre VENTAS y OBJETIVO para cada oficina.
Pg.-136
SQL
6.11. COMBINACION
CONSULTA
DE
LOS
RESULTADOS
DE
UNA
Pg.-137
Lista todos los productos en donde el precio del producto exceda de $2.000 o en donde
ms de $30.0000 del producto hayan sido incluidos en un solo pedido.
SELECT ID_FAB, ID_PRODUCTO
FROM PRODUCTOS
WHERE PRECIO >2000.00
UNION
SELECT DISTINCT FAB, PRODUCTO
FROM PEDIDOS
WHERE IMPORTE >30000.00
ACI
REI
ACI
4100Y
A244L
4100Z
REI
IMM
REI
REI
A244R
775C
A244L
A244R
Pg.-138
SQL
4100Y
4100Z
775C
A244L
A244R
Uniones mltiples *.
La operacin UNION puede ser utilizada repetidamente para combinar tres o
ms conjuntos de resultados. La unin de la TABLA B y la TABLA C en la figura
produce una nica tabla combinada. Esta tabla se combina luego con la TABLA A en otra
operacin UNION. La consulta de la figura se escribe de este modo:
SELECT *
FROM A
UNION (SELECT *
FROM B
UNION
SELECT *
FROM C)
Tabla B
Bill
Sue
Julia
Harry
Tabla C
Mary
George
Bill
Harry
UNION
Tabla A
Bill
Mary
George
Fred
Bill
Sue
Julia
Harry
Mary
George
UNION
Resultados
de la consulta
Bill
Mary
George
Fred
Sue
Julia
Harry
SQL
Pg.-139
(A UNION C) UNION B
Sin embargo, si las uniones implican una mezcla de UNION y UNION ALL, el
orden de la evaluacin si importa. Si esta expresin:
A UNION ALL B UNION C
Se interpreta como:
A UNION ALL (B UNION C)
Entonces se producen diez filas de resultados (seis de la UNION interna, ms cuatro filas
de la TABLA A). Sin embargo, si se interpreta como obtendr 7 filas de resultado (quita
los repetidos):
(A UNION ALL B) UNION C
Pg.-140
SQL
SUM(CUOTA)
$2,700,000.00
SUM(VENTAS)
$2,893,352.00
MAX(CUOTA)
$350,000.00
Pg.-141
Pg.-142
SQL
4
Obsrvese que la funcin COUNT() ignora los valores de los datos de la
columna; simplemente cuenta cuntos datos hay. En consecuencia, no importa realmente
qu columna se especifica como argumento de la funcin COUNT().
SQL permite una funcin de columna especial COUNT(*) que cuenta filas en
lugar de valores de datos. He aqu la misma consulta, reescrita una vez ms para utilizar
la funcin COUNT (*):
SELECT COUNT(*)
FROM PEDIDOS
WHERE IMPORTE > 25000.00
COUNT (*)
4
Si se piensa en la funcin COUNT(*) como en una funcin cuenta filas, la
consulta resulta ms fcil de leer. En la prctica, se utiliza casi siempre la funcin
COUNT(*) en lugar de la funcin COUNT() para contar filas.
Valores NULL y funciones de columna
Las funciones de columna SUM(), AVG(), MIN(), MAX() y COUNT() aceptan
cada una de ellas una columna de valores de datos como argumento y producen un
nico valor como resultado. Qu sucede si uno o ms de los valores de la columna es un
valor NULL? El estndar SQL ANSI/ISO especifica que los valores NULL de la
columna sean ignorados por las funciones de la columna.
Esta consulta muestra como la funcin de columna COUNT() ignora los valores
NULL de una columna:
SELECT COUNT(*), COUNT (VENTAS), COUNT(CUOTA)
FROM REPVENTAS
COUNT(*)
10
COUNT(VENTAS)
10
COUNT(CUOTA)
9
La tabla REPVENTAS contiene diez filas, por lo que COUNT(*) devuelve una
cuenta de diez. La columna VENTAS contiene diez valores no NULL, por lo que la
funcin COUNT(VENTAS) tambin devuelve una cuenta de diez. La columna CUOTA
es NULL para el vendedor ms reciente. LA funcin COUNT(CUOTA) ignora este valor
NULL y devuelve una cuenta de nueve. Debido a estas anomalas, la funcin COUNT(*)
es utilizada casi siempre en lugar de la funcin COUNT(), a menos que especficamente,
se desee excluir del total los valores NULL de una columna particular.
Ignorar los valores NULL tiene poco impacto en las funciones de columna
MIN() y MAX().
SQL
Pg.-143
SUM(CUOTA)
(SUM(VENTAS) SUM(CUOTA))
$2,700,000.00
$193,532.00
SUM (VENTAS$117,547.00
Si todos los datos de una columna son NULL, las funciones de columna
SUM(), AVG(), MIN(), y MAX() devuelven un valor NULL; la funcin
COUNT() devuelve un valor de cero.
Si no hay datos en la columna (es decir, la columna est vaca), las funciones
de columna SUM(), AVG(), MIN() y MAX() devuelven un valor cero.
La funcin COUNT(*) cuenta filas, y no depende de la presencia o ausencia
de valores NULL en la columna.
SQL
la lista de seleccin para eliminar las filas duplicadas del resultado de la consulta.
Tambin se puede pedir a SQL que elimine valores duplicados de una columna antes de
aplicarle una funcin de columna. Para eliminar valores duplicados, la palabra clave
DISTINCT se incluye delante del argumento de la funcin de columna, inmediatamente
despus del parntesis abierto.
Cuntos ttulos diferentes tienen los vendedores?
SELECT COUNT (DISTINCT TITULO)
FROM REPVENTAS
COUNT (DISTINCT TITULO)
3
SQL
Pg.-145
REP
101
102
103
105
106
107
108
110
AVG(IMPORTE)
$8,876.00
$5,694.00
$1,350.00
$7,685.40
$16,479.00
$11,477.33
$3,552.50
$11,566.00
Pg.-146
CLIE
2102
2108
2113
SUM(IMPORTE)
$3,978.00
$ 150.00
$22,500.00
SQL
102
102
102
103
105
105
2106
2114
2120
2111
2103
2111
$4,026.00
$15,000.00
$3,750.00
$2,750.00
$35,582.00
$3,745.00
Las ordenes de agrupacin deben agruparse por los campos que no son
funciones de columna en la lista de campos.
La clusula COMPUTE calcula subtotales y sub-subtotales como se muestra en
este ejemplo:
Calcula los pedidos totales para cada cliente de cada vendedor, ordenados por vendedor,
y dentro de cada vendedor por cliente.
SELECT REP, CLIE, IMPORTE
FROM PEDIDOS
ORDER BY REP, CLIE
COMPUTE SUM(IMPORTE) BY REP, CLIE
COMPUTE SUM(IMPORTE), AVG(IMPORTE) BY REP
REP
101
CLIE
2102
IMPORTE
$3,978.00
sum
-------
101
2108
sum
-------
101
2113
sum
------sum
------avg
-------
102
102
2106
2106
sum
-------
-----------$3,978.00
$150.00
-----------$150.00
$22,500.00
-----------$22,500.00
-----------$26,628.00
-----------$8,876.00
$2,130.00
$1,896.00
-----------$4,026.00
SQL
Pg.-147
102
2114
$15,000.00
sum
-------
102
2120
sum
------sum
------avg
-------
-----------$15,000.00
$3,750.00
-----------$3,750.00
-----------$22,776.00
-----------$5,694.00
Una constante
Una funcin de columna
Una columna de agrupacin, que por definicin tiene el mismo valor en
todas las filas del grupo
Una expresin que afecte a combinaciones de los anteriores
Pg.-148
SQL
PELO
Castao
NULL
NULL
NULL
NULL
Castao
Castao
Castao
Castao
Castao
Rubio
Rubio
OJOS
Azules
Azules
Azules
NULL
NULL
NULL
NULL
NULL
NULL
Negros
Azules
Azules
AVG(IMPORTE)
$7,865.40
$16,479.00
$11,477.33
$8,376.14
Pg.-149
consulta.
Las condiciones de bsqueda que se pueden especificar en la clusula HAVING
son las mismas de la clusula WHERE.
Por cada oficina con dos o ms personas, calcular la cuota total y las ventas totales para
todos los vendedores que trabajan en la oficina.
SELECT CIUDAD, SUM(CUOTA), SUM(REPVENTAS.VENTAS)
FROM OFICINAS, REPVENTAS
WHERE OFICINA = OFICINA_REP
GROUP BY CIUDAD
hay una oficina por ciudad
HAVING COUNT(*) >= 2
CIUDAD
Chicago
Los Angeles
New York
SUM(CUOTA)
$775,000.00
$700,000.00
$575,000.00
SUM(REPVENTAS.VENTAS)
$735,042.00
$835,915.00
$692,637.00
PRECIO
$355.00
$25.00
$243.00
$4,500.00
$1,425.00
EXISTENCIAS
38
37
15
12
5
SQL
SUM(CANT)
32
30
16
15
22
Para procesar esta consulta, SQL efecta conceptualmente los siguientes pasos:
1. Compone las Tablas PRODUCTOS y PEDIDOS para obtener la
descripcin, precio y existencias de cada producto pedido.
2. Agrupa las filas resultantes por fabricante e id de producto.
3. Elimina los grupos en donde la cantidad pedida es menor al 75% de las
existencias.
4. Calcula la cantidad total pedida para cada grupo.
5. Genera una fila resumen de resultados por cada grupo.
6. Ordena los resultados para que los productos con el mayor valor de
existencias aparezcan en primer lugar.
Restricciones en condiciones de bsqueda de grupos
La clusula HAVING se utiliza para incluir o excluir grupos de filas de los
resultados de la consulta, por lo que la condicin de bsqueda que especifica debe ser
aplicable al grupo en su totalidad en lugar de a filas individuales. Esto significa que un
elemento que aparezca dentro de la condicin de bsqueda en una clusula HAVING
puede ser:
Una constante
Una funcin de columna, que produzca un nico valor resumen de las filas
del grupo
Una columna de agrupacin, que por definicin tiene el mismo valor en
todas las filas del grupo
Una expresin que afecte a combinaciones de los anteriores
SQL
Pg.-151
SELECT
ALL
DISTINCT
FROM
tem seleccionado
,
*
especificacin-de-tabla
,
columna-de-agrupacin
,
HAVING condicin-de-bsqueda
ORDER BY
Pg.-152
especificacin-de-ordenacin
,
La clusula WHERE dice a SQL que incluya slo ciertas filas de datos en
SQL
6.14. RESUMEN
SQL
Pg.-153
conjunto.
6.15. EJERCICIOS
1. Muestra el nombre, las ventas y la cuota del empleado nmero 105.
2. Lista las oficinas cuyas ventas estn por debajo del 80 por 100 del objetivo.
Mostrar la ciudad, ventas y el objetivo.
3. Lista las oficinas no dirigidas por el empleado nmero 108. Mostrar la
ciudad y n de empleado.
4. Hallar los pedidos cuyo importe es superior a 20.000 e inferior a 29.999.
Mostrar el nmero de pedido e importe.
5. Hallar los pedidos remitidos un jueves en enero de 1990. Mostrar el nmero
de pedido, fecha de pedido e importe.
6. Hallar todos los pedidos obtenidos por cuatro vendedores especficos (elegir
4 que ya tengis). Mostrar el nmero de pedido, representante e importe.
7. Buscar el nombre de las empresas cuyo nombre empiezan en Smiths,
acaba la palabra en n y en el centro hay una letra desconocida. Por detrs,
el nombre puede tener: Corp o Inc.
8. Hallar todos los nombres de vendedores que cumplan alguna de las 3
siguientes opciones:
A. Trabajan en Denver, New York o Chicago.
B. No tienen director y fueron contratados a partir de Junio de
1988.
C. Sus ventas estn por encima de la cuota, pero tienen ventas de
Pg.-154
SQL
600.000 o menos.
9. Por cada producto mostrar el Identificador del producto, su descripcin, el
inventario (existencias por el precio).
10. Mostrar cada vendedor con su cuota elevada en un 3 por 100 de sus ventas
anuales. Adems, mostrar el nombre de vendedor y su cuota actual.
11. Listar las oficinas, clasificadas en orden alfabtico por regin, y dentro de
cada regin por orden descendente de rendimiento de ventas (ventas menos
objetivo). Por cada oficina se mostrar la ciudad, regin y el rendimiento de
ventas.
12. Calcular el rendimiento de la cuota promedio de los vendedores. Dar la
orden pertinente.
13. Calcular el importe medio de los pedidos realizados por el cliente Acme
Mfg.
14. Dar la orden que calcule el mejor rendimiento de ventas de todos los
vendedores.
15. Listar el rango de cuotas asignadas en cada oficina. Mostrar la oficina, el
rango superior e inferior.
16. Mostrar el nmero de vendedores asignados en cada oficina.
17. Mostrar los diferentes clientes que son atendidos por cada vendedor.
SQL
Pg.-155
TEMA VII
CONSULTAS MULTIPLES
7.1
7.4.
7.5.
OTRAS EQUICOMPOSICIONES
7.6
7.7 CONSIDERACIONES
MULTITABLA
DE
SQL
PARA
7.8.
Pg.-156
SQL
CONSULTAS
7.9.
7.10 RESUMEN
7.11. EJERCICIOS
SQL
Pg.-157
7.1.
Existe, sin embargo, un enlace entre estas dos tablas. En cada fila de la Tabla
PEDIDOS, la columna CLIE contiene el nmero del cliente que orden el pedido, el cual
se corresponde con el valor en la columna NUM_CLIE de una de las filas de la Tabla
CLIENTES. Evidentemente, la sentencia SELECT que gestiona la peticin debe utilizar
de algn modo este enlace entre tablas para generar sus resultados.
Antes de examinar la sentencia SELECT correspondiente a la consulta, es
instructivo imaginar cmo podramos gestionar manualmente la peticin, utilizando lpiz
y papel.
1. Comenzar escribiendo los nombres de las cuatro columnas para los
resultados de la consulta. Luego pasar a la Tabla PEDIDOS y comenzar con
el primer pedido.
2. Recorrer la fila para hallar el nmero de pedido (112.961) y el importe
($31,500.00) y copiar ambos valores en la primera fila de resultados de la
consulta.
Pg.-158
SQL
SQL
Pg.-159
bsqueda, sta restringe las filas que aparecen en los resultados de la consulta. Puesto
que sta es una consulta de dos tablas, la condicin de bsqueda restringe las parejas de
filas que generan los resultados. Realmente captura el espritu de la correspondencia
manual de las columnas muy bien, diciendo:
Genera resultados slo para los pares de filas en los que el nmero de clientes
(CLIE) en la Tabla PEDIDOS coincide con el nmero de cliente (NUM_CLIE) en la
Tabla CLIENTES.
La sentencia SELECT no dice nada acerca de cmo SQL debera ejecutar la
consulta. No hay mencin de comenzar con los pedidos o comenzar con los clientes.
En lugar de ello, la consulta dice a SQL qu resultados deberan aparecer, y deja a SQL
que decida cmo generarlos.
Consultas padre/hijo
Las consultas multitabla ms comunes implican a dos tablas que tienen una
relacin natural padre/hijo. La consulta referente a pedidos y clientes de la seccin
precedente es un ejemplo de tal tipo de consulta. Cada pedido (hijo) tiene un cliente
asociado (padre), y cada cliente (padre) puede tener muchos pedidos asociados (hijos).
Los pares de filas que generan los resultados de la consulta son combinaciones de fila
pdre/hijo.
Se puede recordar que las claves ajenas y las claves primarias crean relaciones
padre/hijo en una base de datos SQL. La tabla que contiene la clave ajena es el hijo en la
relacin; la tabla con la clave primaria es el padre. Para ejercitar la relacin padre/hijo en
una consulta debe especificarse una condicin de bsqueda que compare la clave ajena y
la clave primaria. Lista cada uno de los vendedores y la ciudad y regin en donde
trabajan.
SELECT NOMBRE, CIUDAD, REGION
FROM REPVENTAS, OFICINAS
WHERE OFICINA_REP = OFICINA
NOMBRE
Mary Jones
Sam Clark
Bob Smith
Paul Cruz
Dan Roberts
Bill Adams
Sue Smith
Larry Fitch
Nancy Angelli
CIUDAD
New York
New York
Chicago
Chicago
Chicago
Atlanta
Los Angeles
Los Angeles
Denver
Tabla OFICINAS
OFICIN
CIUDAD
A
22
Denver
Pg.-160
REGION
Este
Este
Este
Este
Este
Este
Oeste
Oeste
Oeste
REGION
OBJETIVO
VENTAS
Oeste
$300,000.00
$186,042.0
SQL
11
New York
Este
$575,000.00
12
Chicago
Este
$800,000.00
13
Atlanta
Este
$350,000.00
21
Los Angeles
Oeste
$725,000.00
Tabla REPVENTAS
NUM_EMP
NOMBRE
L
105
Bill Adams
109
Mary Jones
102
Sue Smith
106
Sam Clark
104
Bob Smith
101
Dan Roberts
110
Tom Snyder
108
Larry Fitch
103
Paul Cruz
107
Nancy Angelli
ED OFIC
_REP
37
13
31
11
48
21
52
11
33
12
45
12
41 NULL
62
21
29
12
49
22
TITULO
0
$692,637.0
0
$735,042.0
0
$350,000.0
0
$835,915.0
0
Resultados de la consulta
NOMBR CIUDAD REGION
E
Rep Ventas
Rep Ventas
Rep Ventas
VP Ventas
Dir Ventas
Rep Ventas
Rep Ventas
Dir Ventas
Rep Ventas
Rep Ventas
NOMBRE
Bob Smith
Bill Adams
Sam Clark
Larry Fitch
Larry Fitch
TITULO
Dir Ventas
Rep Ventas
VP Ventas
Dir Ventas
Dir Ventas
La Tabla OFICINAS (hijo) contiene DIR, una clave ajena para la Tabla
REPVENTAS (padre). Esta relacin se utiliza para hallar la fila REPVENTAS correcta
para cada vendedor, de modo que puedan incluirse el nombre y el ttulo correctos del
director en los resultados de la consulta.
SQL
Pg.-161
NOMBRE
Bob Smith
TITULO
Dir Ventas
Con la condicin de bsqueda adicional, las filas que aparecen en los resultados
estn an ms restringidas. El primer test (DIR = NUM_EMPL) selecciona solamente
pares de filas OFICINAS y REPVENTAS que tienen la adecuada relacin padre/hijo; el
segundo test selecciona adicionalmente slo aquellos pares de filas en donde la oficina
est por encima del objetivo.
7.3.
Pg.-162
IMPORTE
$4,104.00
$760.00
$3,745.00
$3,978.00
DESCRIPCION
Artculo Tipo 2
Artculo Tipo 2
Artculo Tipo 3
Artculo Tipo 4
SQL
112963
112983
113055
113057
$3,276.00
$702.00
$150.00
$600.00
Artculo Tipo 4
Artculo Tipo 4
Ajustador
Ajustador
7.4.
SQL puede combinar datos de tres o ms tablas utilizando las mismas tcnicas
bsicas utilizadas para las consultas de dos tablas. He aqu un sencillo ejemplo de una
composicin con tres tablas:
Lista los pedidos superiores a $25.000, incluyendo el nombre del vendedor que tom el
pedido y el nombre del cliente que lo solicit.
SELECT NUM_PEDIDO, IMPORTE, EMPRESA, NOMBRE
FROM PEDIDOS, CLIENTES, REPVENTAS
WHERE CLIE = NUM_CLIE
AND REP = NUM_EMPL
AND IMPORTE > 25000.00
NUM_PEDIDO
112987
113069
113045
112961
IMPORTE
$27,500.00
$31,350.00
$45,000.00
$31,500.00
EMPRESA
Acme Mfg.
Chen Associates
Zetacorp
J. P. Sinclair
NOMBRE
Bill Adams
Nancy Angelli
Larry Fitch
Sam Clark
Esta consulta utiliza dos claves de la Tabla PEDIDOS. La columna CLIE es una
clave ajena para la Tabla CLIENTES, que enlaza cada pedido con el cliente que lo
remiti. La columna REP es una clave ajena para la Tabla REPVENTAS, que liga cada
pedido con el vendedor que lo acept.
Tabla CLIENTES
Tabla REPVENTAS
NUM_CLIE
EMPRESA
REP_CLIE
2111
2102
2103
.
.
JCP inc.
First Corp.
Acme Mfg.
.
.
103
101
105
.
.
LIMITE-CREDITO
$50,000.00
$65,000.00
$50,000.00
.
.
NUM_E
MPL
105
109
102
.
.
NOMBRE
ED
OFIC_REP
Bill Adams
Mary Jones
Sue Smith
.
.
37
31
48
.
.
13
11
21
.
.
Tabla PEDIDOS
NUM_PEDIDO
112961
FECHA_PED
12/17/1989
CLIE
2117
REP
106
DIR
REI
...
...
SQL
IMPORTE
$31,500.00
Pg.-163
113012
112989
.
.
01/11/1990
01/03/1990
.
.
2111
2101
.
.
105
106
.
.
ACI
FEA
.
.
...
...
...
...
$3,745.00
$1,458.00
.
.
Resultados de la consulta
NUM_PEDIDO
IMPORTE
EMPRESA
NOMBRE
7.5.
OTRAS EQUICOMPOSICIONES
IMPORTE
$3,978.00
$15,000.00
$2,100.00
$3,978.00
$15,000.00
$2,100.00
FECHA_PEDIDO
12-OCT-89
12-OCT-89
12-OCT-89
12-OCT-89
12-OCT-89
12-OCT-89
NOMBRE
Mary Jones
Mary Jones
Mary Jones
Larry Fitch
Larry Fitch
Larry Fitch
Los resultados de esta consulta provienen de los pares de filas de las Tablas
PEDIDOS y REPVENTAS, en donde el valor en la columna FECH_PEDIDO coincide
con el valor en la columna CONTRATO para el vendedor. Ninguna de estas columnas es
una clave ajena o una clave primaria, y la relacin entre los pares de filas es ciertamente
una relacin extraa, la nica cosa que los pedidos y vendedores correspondientes tienen
en comn es que resultan tener las mismas fechas.
Tabla REPVENTAS
NUM_EMP
NOMBRE
L
105
Bill Adams
109
Mary Jones
102
Sue Smith
106
Sam Clark
104
Bob Smith
Pg.-164
...
...
...
...
...
...
CONTRAT
O
02/12/1988
10/12/1989
12/10/1986
06/14/1988
05/19/1987
SQL
NUM_PEDID
O
113051
112968
113036
113062
112979
FECHA_P
EDIDO
02/10/1990
10/12/1989
01/30/1990
02/24/1990
10/12/1989
CLIE
2118
2102
2107
2124
2114
101
110
108
103
107
Dan Roberts
Tom Snyder
Larry Fitch
Paul Cruz
Nancy Angelli
...
...
...
...
...
10/20/1986
01/13/1990
10/12/1989
03/01/1987
11/14/1989
113027
112992
112975
113055
.
01/22/1990
11/04/1989
10/12/1989
02/15/1990
.
2103
2118
2111
2108
.
Las columnas de emparejamiento como las de este ejemplo generan una relacin
de muchos a muchos entre las dos tablas. Puede haber muchos pedidos que compartan
una nica fecha de contrato del vendedor, y ms de un vendedor puede haber sido
contratado en la fecha de pedidos diferentes (112.968, 112.975 y 112.979) fueron
recibidos el 12 de octubre de 1989, y dos vendedores diferentes (Larry Fitch y Mary
Jones) fueron contratados el mismo da. Los tres pedidos y los dos vendedores producen
seis filas de resultados de la consulta.
Esta relacin de muchos a muchos es diferente de la relacin de uno a muchos
creada por columnas de emparejamiento clave primaria/clave ajena. La situacin puede
resumirse del siguiente modo:
Estas dos situaciones diferentes no tienen nada que evr con cmo se escriba la
sentencia SELECT que expresa la composicin.
7.6.
CUOTA
$350,000.00
$350,000.00
$350,000.00
CIUDAD
Denver
Denver
Denver
OBJETIVO
$300,000.00
$300,000.00
$300,000.00
Como en todas las consultas de dos tablas, cada fila de resultados proviene de
un par de filas, en este caso de las Tablas REPVENTAS y OFICINAS. La condicin de
bsqueda:
SQL
Pg.-165
7.7. CONSIDERACIONES
MULTITABLA
SQL
PARA
CONSULTAS
Pg.-166
SQL
SQL
Pg.-167
Pg.-168
La clusula FROM identifica todas las tablas que contribuyen con datos a
los resultados de la consulta. Las columnas referenciadas en la sentencia
SELECT deben provenir de una de las tablas designadas en la clusula
FROM.
La clusula FROM determina la marca que se utiliza para identificar la tabla
en referencias de columna cualificadas dentro de la sentencia SELECT. Si se
especifica un alias, ste pasa a ser la marca de la tabla; en caso contrario se
SQL
SQL
Pg.-169
consulta funcionara:
Lista los nombres de los vendedores y sus directores.
SELECT EMPS.NOMBRE, DIRS.NOMBRE
FROM EMPS, DIRS
WHERE EMPS.DIRECTOR = DIRS.NUM_EMPL
Puesto que las columnas de las dos tablas tienen nombres idnticos, todas las
referencias de columnas estn cualificadas.
SQL utiliza exactamente esta estrategia de tabla duplicada imaginaria para
componer una tabla consigo misma. En lugar de duplicar realmente el contenido de la
tabla. SQL simplemente permite referirse a ella mediante un nombre diferente, llamado
un alias de tabla. He aqu la misma consulta, escrita utilizando los alias EMPS y DIRS
para la Tabla REPVENTAS.
Lista los nombres de los vendedores y sus directores.
SELECT EMPS.NOMBRE, DIRS.NOMBRE
FROM REPVENTAS EMPS, REPVENTAS DIRS
WHERE EMPS.DIRECTOR = DIRS.NUM_EMPL
EMPS.NOMBRE
Tom Snyder
Bill Adams
Dan Roberts
Paul Cruz
Mary Jones
Bob Smith
Larry Fitch
Sue Smith
Nancy Angelli
DIRS.NOMBRE
Dan Roberts
Bob Smith
Bob Smith
Bob Smith
Sam Clark
Sam Clark
Sam Clark
Larry Fitch
Larry Fitch
Pg.-170
SQL
7.8.
PRODUCT
O
NOMBRE
Sam
James
CIUDAD
Chicago
Dallas
SQL
Pg.-171
Pg.-172
SQL
EMPRESA
Acme Mfg.
Acme Mfg.
Acme Mfg.
Acme Mfg.
NUM_PEDIDO
112963
112983
112987
113027
IMPORTE
$3,276.00
$702.00
$27,500.00
$4,104.00
7.9.
OFICINA_REP
13
11
21
11
12
12
NULL
21
12
SQL
Pg.-173
Nancy Angelli
22
CIUDAD
New York
New York
Chicago
Chicago
Chicago
Atlanta
Los Angeles
Los Angeles
Denver
Pg.-174
CIUDAD
NULL
New York
New York
Chicago
Chicago
Chicago
Atlanta
Los Angeles
Los Angeles
Denver
SQL
COMPOSICIO
N
INTERNA
Filas sin emparejar
Tabla CHICOS
NOMBRE CIUDAD
John
Boston
Henry
Boston
George
NULL
Sam
Chicago
James
Dallas
Filas sin
emparejar
La Tabla CHICAS lista cinco chicas y las ciudades en donde viven; la Tabla
CHICOS lista cinco chicos y las ciudades en donde viven. Para encontrar las parejas
chico/chica que viven en la misma ciudad, se podra utilizar esta consulta, que forma la
composicin interna de las dos tablas:
Lista los chicos y chicas que viven en la misma ciudad.
SELECT *
FROM CHICAS, CHICOS
WHERE CHICAS.CIUDAD = CHICOS.CIUDAD
La composicin interna produce cuatro filas de resultados de la consulta.
Obsrvese que dos de las chicas (Anne y Nancy) y dos de los chicos (James y George)
no estn presentados en los resultados. Estas filas no pueden emparejarse con ninguna
fila de la otra tabla, por tanto faltan en los resultados de la composicin interna. Dos de
las filas sin emparejar (Anne y James) tienen valores vlidos en sus columnas CIUDAD,
pero no coinciden con ninguna de las ciudades de la tabla opuesta. Las otras dos filas sin
emparejar (Nancy y George) tienen valores NULL en sus columnas CIUDAD, y por las
reglas de gestin de NULL, en SQL, el valor NULL no coincide con ningn otro valor
(ni siquiera con otro valor NULL).
Supngase que se desea listar los pares chico/chica que comparten las mismas
ciudades, incluyendo los chicos y chicas desemparejados. La composicin externa de las
Tablas CHICAS y CHICOS produce exactamente este resultado. He aqu la sentencia
SQL
Pg.-175
CHICAS.CIUDAD
Boston
Boston
Chicago
Chicago
Denver
NULL
NULL
NULL
CHICOS.NOMBRE
John
Henry
Sam
Sam
NULL
NULL
James
GEORGE
CHICOS.CIUDAD
Boston
Boston
Chicago
Chicago
NULL
NULL
NULL
NULL
Pg.-176
CHICAS.CIUDAD
Boston
Boston
Chicago
Chicago
CHICOS.NOMBRE
John
Henry
Sam
Sam
SQL
CHICOS.CIUDAD
Boston
Boston
Chicago
Chicago
Anne
Nancy
Denver
NULL
NULL
NULL
NULL
NULL
CHICAS.CIUDAD
Boston
Boston
Chicago
Chicago
NULL
NULL
CHICOS.NOMBRE
John
Henry
Sam
Sam
James
George
CHICOS.CIUDAD
Boston
Boston
Chicago
Chicago
Dallas
NULL
Esta consulta tambin produce seis filas de resultados, mostrando los pares
chico/chica coincidentes y los chicos no coincidentes. Esta vez las chicas desemparejadas
faltan en el resultado. Este tipo de SELECT es una composicin externa derecha.
En la prctica, las composiciones externa izquierda y derecha son ms tiles que
la composicin externa total, especialmente en composiciones que afectan a
emparejamientos clave ajena/clave primaria. En tal composicin, la columna de clave
ajena puede contener valores NULL, produciendo filas no emparejadas de la tabla hijo
(la tabla que contiene la clave ajena). Una composicin externa simtrica incluir estas
filas hijo no emparejadas en los resultados de la consulta, sin incluir adems las filas
padre no emparejadas.
SQL
Pg.-177
7.10. RESUMEN
Este captulo describe cmo gestiona SQL las consultas que combinan los datos
de dos o ms tablas:
En una consulta multitabla, las tablas que contienen los datos son
designadas en la clusula FROM.
Cada fila de resultados es una combinacin de datos procedentes de una
nica fila en cada una de las tablas, y es la nica fila que extrae sus datos de
esa combinacin particular.
Las consultas multitabla ms habituales utilizan las relaciones padre/hijo
creadas por las claves primarias y claves ajenas.
En general, las composiciones pueden construirse comparando cualquier
par(es) de columnas de las dos tablas compuestas, utilizando un test de
desigualdad o cualquier otro test de comparacin.
Una composicin puede ser considerada como el producto de dos tablas del
cual se han suprimido algunas de las filas.
Una tabla puede componerse consigo misma; las autocomposiciones
requieren el uso de alias.
Las composiciones externas amplan la composicin estndar (interna)
reteniendo las filas no emparejadas de las tablas compuestas en los
resultados de la consulta.
7.11. EJERCICIOS
1. Lista los pedidos superiores a 25.000, mostrando el nombre del cliente que
remiti el pedido y el nombre del vendedor asignado a ese cliente, nmero
de pedido e importe.
Pg.-178
SQL
TEMA VIII
SUBCONSULTAS
8.1.
INTRODUCCION
8.2.
8.3.
8.4.
RESUMEN
8.5.
8.6.
EJERCICIOS
SQL
Pg.-179
Notas
Pg.-180
SQL
8.1.
INTRODUCCION
Utilizacin de subconsultas
Una subconsulta es una consulta que aparece dentro de la clusula WHERE o
HAVING de otra sentencia SQL. Las subconsultas proporcionan un modo eficaz y
natural de gestionar peticiones de consultas que se expresan en trminos de los
resultados de otras consultas. He aqu un ejemplo de tal tipo de peticin.
Lista las oficinas en donde el objetivo de ventas de la oficina exceden a la suma
de las cuotas de los vendedores individuales.
La peticin solicita una lista de oficinas de la Tabla OFICINAS, en donde el
valor de la columna OBJETIVO satisface cierta condicin. Parece razonable que la
sentencia SELECT que expresa la consulta debera ser semejante a sta:
SELECT CIUDAD
FROM OFICINAS
WHERE OBJETIVO > ???
El valor ??? necesita ser sustituido, y debera ser igual a la suma de las
cuotas de los vendedores asignados a la oficina de cuestin. Cmo se puede especificar
ese valor en la consulta? Se sabe que la suma de las cuotas para una oficina especfica
(digamos, la oficina nmero 21) puede ser obtenida con esta consulta:
SELECT SUM(CUOTA)
FROM REPVENTAS
WHERE OFICINA_REP = 21
Pero cmo se pueden poner los resultados de esta consulta en la consulta
primera sustituyendo a los signos de interrogacin? Parecera razonable comenzar con la
primera consulta y reemplazar los ??? con la segunda consulta. Del modo siguiente:
SQL
Pg.-181
SELECT CIUDAD
FROM OFICINAS
WHERE OBJETIVO > (SELECT SUM(CUOTA)
FROM REPVENTAS
WHERE OFICINA_REP = OFICINA)
De hecho, sta es una consulta SQL correctamente construida. Por cada oficina,
la consulta interna (la subconsulta) calcula la suma de las cuotas para los vendedores
que trabajan en esa oficina. La consulta externa (la consulta principal) compara el
objetivo de la oficina con el total calculado y decide si aadir la oficina a los resultados
de la consulta principal. Trabajando conjuntamente, la consulta principal y la subconsulta
expresan la peticin original y recuperan los datos solicitados de la base de datos.
Las subconsultas SQL aparecen siempre como parte de la clusula WHERE o la
clusula HAVING. En la clusula WHERE, ayudan a seleccionar las filas individuales
que aparecen en los resultados de la consulta. En la clusula HAVING, ayudan a
seleccionar los grupos de filas que aparecen en los resultados de la consulta.
Como es una subconsulta:
8.2.
Una subconsulta debe producir una nica columna de datos como resultado.
Esto significa que una subconsulta siempre tiene un nico elemento de
seleccin en su clusula SELECT.
La clusula ORDER BY no puede ser especificada en una subconsulta. Los
resultados de la subconsulta se utilizan internamente por parte de la consulta
principal y nunca son visibles al usuario, por lo que tiene poco sentido
ordenarlas de algn modo.
Una subconsulta no puede ser la UNION de varias sentencia SELECT
diferentes; slo se permite una nica sentencia SELECT.
Los nombres de columna que aparecen en una subconsulta pueden referirse
a columnas de tablas de la consulta principal.
SQL
Subconsulta
...
...
11
New York
...
12
Chicago
...
13
Atlanta
...
21
Los Angeles
...
OBJETIV
O
$300,000.0
0
$575,000.0
0
$800,000.0
0
$350,000.0
0
$725,000.0
0
Tabla REPVENTAS
SELECT
SUM(CUOTA)
WHERE
OFICINA_REP =
22
>
?
Tabla REPVENTAS
SELECT
SUM(CUOTA)
WHERE
OFICINA_REP =
21
>
?
SQL
Pg.-183
Pg.-184
SQL
8.2.2.1. Test de comparacin subconsulta (=, <>, <, <=, >, >=)
El test de comparacin subconsulta es una forma modificada del test de
comparacin simple. Compara el valor de una expresin producido por una subconsulta,
y devuelve un resultado TRUE si la comparacin es cierta. Este test se utiliza para
comparar un valor de la fila que est siendo examinada con un valor nico producido por
una subconsulta, como en este ejemplo:
Lista los vendedores cuyas cuotas son iguales o superiores al objetivo de la oficina
de ventas de Atlanta.
SELECT NOMBRE
FROM REPVENTAS
WHERE CUOTA >= (SELECT OBJETIVO
FROM OFICINAS
WHERE CIUDAD = Atlanta)
La subconsulta del ejemplo recupera el objetivo de ventas de la oficina de
Atlanta. El valor se utiliza entonces para seleccionar los vendedores cuyas cuotas son
superiores o iguales al objetivo.
El test de comparacin subconsulta ofrece los mismos seis operadores de
comparacin (=, <>, <, <=, >, >=) disponibles con el test de comparacin simple. La
subconsulta especificada en este test debe producir una nica fila de resultados. Si la
subconsulta produce mltiples filas, la comparacin no tiene sentido y SQL informa de
una condicin de error. Si la subconsulta no produce filas o produce un valor NULL, el
test de comparacin devuelve NULL.
Lista todos los productos del fabricante ACI para los cuales las existencias superan a las
existencias del producto ACI-41004.
SELECT DESCRIPCION, EXISTENCIAS
FROM PRODUCTOS
WHERE ID_FAB = ACI
AND EXISTENCIAS > (SELECT EXISTENCIAS
FROM PRODUCTOS
WHERE ID_FAB = ACI
AND ID_PRODUCTO = 41004)
DESCRIPCION
Artculo Tipo 3
Artculo Tipo 1
Artculo Tipo 2
EXISTENCIAS
207
277
167
SQL
Pg.-185
composicin:
A < (subconsulta)
Est permitida, pero esta comparacin:
(subconsulta) > A
no est permitida.
8.2.2.2. Test de pertenencia a conjunto (IN)
El test de pertenencia a conjunto subconsulta (IN) es una forma
modificada del test de pertenencia a conjunto simple. Compara un nico valor de datos
con una columna de valores producida por una subconsulta y devuelve un resultado
TRUE si el valor coincide con uno de los valores de la columna.
Lista los vendedores que no trabajan en oficinas dirigidas por Larry Fitch (empleado
108).
SELECT NOMBRE
FROM REPVENTAS
WHERE OFICINA_REP NOT IN (SELECT OFICINA
FROM OFICINAS
WHERE DIR = 108)
NOMBRE
Bill Adams
Mary Jones
Sam Clark
Bob Smith
Dan Roberts
Paul Cruz
expresin-de-test
IN
subconsulta
NOT
La subconsulta produce una columna de valores, y la clusula WHERE de
la consulta principal, comprueba si un valor de una fila de la consulta principal coincide
con uno de los valores de la columna.
8.2.2.3. Test de existencia (EXISTS)
El test de existencia (EXISTS) comprueba si una subconsulta produce
Pg.-186
SQL
alguna fila de resultados. No hay test de comparacin simple que se asemeja al test de
existencia; solamente se utiliza con subconsultas.
He aqu un ejemplo de una peticin que se puede expresar sencillamente
utilizando un test de existencia:
Lista los productos para los cuales se ha recibido un pedido de $25.000
o ms. La peticin podra ser fcilmente expresada tambin de esta forma:
Lista los productos para los cuales existe al menos un pedido en la Tabla
PEDIDOS a) que se refiere al producto en cuestin y b) que tiene un importe de al
menos $25.000.
La sentencia SELECT utilizada para recuperar la lista solicitada de
productos se asemeja a la peticin as expresada:
SELECT DISTINCT DESCRIPCION
FROM PRODUCTOS
WHERE EXISTS (SELECT NUM_PEDIDO
FROM PEDIDOS
WHERE PRODUCTO = ID_PRODUCTO
AND FAB = ID_FAB
AND IMPORTE >= 25,000.00)
DESCRIPCION
500-1b Brace
Left Hinge
Right Hinge
Widget Remover
Conceptualmente, SQL procesa esta consulta recorriendo la Tabla
PRODUCTOS y efectuando la subconsulta para cada producto. La subconsulta produce
para una columna que contiene los nmeros de pedidos de aquellos pedidos del producto
actual que superan $25,000.00. Si hay alguno de tales pedidos (es decir, si la columna
no est vaca), el test EXISTS es TRUE. Si la subconsulta no produce filas, el test
EXISTS es FALSE. El test EXISTS no puede producir un valor NULL.
Se puede invertir la lgica del test EXISTS utilizando la forma NOT
EXISTS. En este caso, el test es TRUE si la subconsulta no produce filas, y FALSE en
caso contrario.
Se puede observar, que la condicin de bsqueda EXISTS no utiliza
realmente los resultados de la subconsulta. Simplemente comprueba si la bsqueda
produce algn resultado. Por esta razn, SQL suaviza la regla de que las subconsultas
deben devolver una nica columna de datos, y permite utilizar la forma SELECT * en la
subconsulta de un test EXISTS. La subconsulta podra por tanto haber sido escrita:
Lista los productos para los cuales se ha recibido un pedido de $25.000 o ms.
SQL
Pg.-187
SELECT DESCRIPCION
FROM PRODUCTOS
WHERE EXISTS (SELECT *
FROM PEDIDOS
WHERE PRODUCTO = ID_PRODUCTO
AND FAB = ID_FAB
AND IMPORTE >= 25000.00)
En la prctica, la subconsulta en un test EXISTS se escribe siempre utilizando la
notacin SELECT *.
Obsrvese que la subconsulta incluye una referencia externa a una columna de la tabla de
la consulta principal. En la prctica, la subconsulta de un test EXISTS siempre contienen
una referencia externa que enlaza la subconsulta a la fila que actualmente est siendo
examinada por la consulta principal.
8.2.2.4. Test cuantificados (ANY y ALL)
La versin subconsulta del test IN comprueba si un valor de dato es igual
a algn valor en una columna de los resultados de la subconsulta. SQL proporciona dos
test cuantificados, ANY y ALL, que extienden esta nocin a otros operadores de
comparacin, tales como mayor que (>) y menor que (<). Ambos tests comparan un
valor de dato con la columna de valores producidos por una subconsulta.
expresin-de-test
=
<>
<
<=
>
>=
ANY
ALL
subconsulta
El Test ANY *. El test ANY se utiliza conjuntamente con uno de los seis
operadores de comparacin SQL (=, <>, <, <=, >, >=) para comparar un nico valor de
test con una columna de valores producidos por una subconsulta. Para efectuar el test,
SQL utiliza el operador de comparacin especificado para comparar el valor de test con
cada valor de datos de la columna, uno cada vez.
Si alguna de las comparaciones individuales producen un resultado
TRUE, el test ANY devuelve un resultado TRUE.
Lista los vendedores que han aceptado un pedido que represente ms del 10 por 100 de
su cuota.
SELECT NOMBRE
FROM REPVENTAS
WHERE (0.1 * CUOTA) < ANY (SELECT IMPORTE
Pg.-188
SQL
FROM PEDIDOS
WHERE REP = NUM_EMPL)
NOMBRE
Sam Clark
Larry Fitch
Nancy Angelli
Conceptualmente, la consulta principal examina cada fila de la Tabla
REPVENTAS, una a una. La subconsulta encuentra todos los pedidos aceptados por el
vendedor actual y devuelve una columna que contiene el importe de esos pedidos. La
clusula WHERE de la consulta principal calcula entonces el diez por ciento de la cuota
del vendedor actual y la utiliza como valor del test, comparndolo con todos los
importes de pedidos producidos por la subconsulta. Si hay algn importe que exceda al
valor de test calculado, el test < ANY devuelve TRUE y el vendedor queda incluido en
los resultados de la consulta. Si no, el vendedor no se incluye en los result6ados de la
consulta.
Si la subconsulta produce una columna vaca de resultados, el test
ANY devuelve FALSE.
SQL
Pg.-189
FROM OFICINAS)
La subconsulta:
SELECT DIR
FROM OFICINAS
Produce obviamente los nmeros de empleados que son directores, y por tanto la
consulta parece decir;
Halla los vendedores que no son directores de ninguna oficina.
Pero esto no es lo que la consulta dice. Lo que dice en realidad es:
Halla cada uno de los vendedores que, para alguna oficina, no es el director de esa
oficina.
Naturalmente para cualquier vendedor, es posible hallar alguna oficina en
donde ese vendedor no es el director. Los resultados de la consulta incluiran a todos los
vendedores, y por tanto fallara en responder a la cuestin que le fue propuesta. La
consulta correcta es:
Pg.-190
SQL
OBJETIVO
$300,000.00
$575,000.00
$350,000.00
Los errores sutiles que pueden ocurrir con el test ANY cuando se combina
con el operador de comparacin desigualdad (<>) tambin ocurren con el test ALL.
Como con el test ANY, el test ALL siempre puede convertirse a un test EXISTS
equivalente mediante el traslado de la comparacin al interior de la subconsulta.
8.3.
Pg.-191
AVG(IMPORTE)
$15,000.00
$22,500.00
8.4.
RESUMEN
Pg.-192
8.5.
La clusula FROM especifica las tablas fuente que contribuyen con datos a
los resultados de la consulta. Todos los nombres de columna en el cuerpo de
l sentencia SELECT deben identificar sin ambigedad a una columna de una
tabla fuente en una consulta externa.
La clusula WHERE, si est presente, selecciona combinaciones
individuales de filas procedentes de las tablas fuente que participan en los
resultados de la consulta. Las subconsultas en la clusula WHERE se
evalan para cada fila individual.
La clusula GROUP BY, si est presente, agrupa las filas individuales
seleccionadas por la clusula WHERE en grupos de filas.
La clusula HAVING, si est presente, selecciona grupos de filas que
participan en los resultados de la consulta. Las subconsultas de la clusula
HAVING se evalan para cada grupo de filas.
La clusula SELECT determina qu valores de datos aparecen realmente
como columnas en los resultados finales.
SQL
Pg.-193
8.6.
EJERCICIOS
1. Lista todos los clientes atendidos por Bill Adams.
2. Lista los vendedores que trabajan en oficinas que superen su objetivo.
3. Lista los oficinas en donde haya un vendedor cuya cuota represente ms del
55 por 100 del objetivo de la oficina.
4. Lista los nombres y edades de los vendedores que tienen cuotas por encima
del promedio (de cuotas).
5. Lista los clientes cuyos vendedores estn asignados a oficinas de la regin
de ventas Este.
6. Lista los vendedores que tienen ms de 40 aos y que dirigen a un vendedor
cuyas ventas estn por encima de la cuota.
Pg.-194
SQL
SQL
Pg.-195
TEMA IX
VISTAS
9.1.
INTRODUCCION
9.2.
9.3.
9.7.
RESUMEN
Pg.-196
SQL
Notas
SQL
Pg.-197
9.1.
INTRODUCCION
Las vistas permiten acomodar el aspecto de una base de datos de modo que
diferentes usuarios la vean desde diferentes perspectivas.
Las vistas permiten restringir acceso a los datos, permitiendo que diferentes
usuarios slo vean ciertas filas o ciertas columnas de una tabla.
Las vistas simplifican el acceso a la base de datos mediante la presentacin
de la estructura de los datos almacenados del modo que sea ms natural a
cada usuario.
Qu es una vista?
Una vista es una tabla virtual en la base de datos cuyos contenidos estn
definidos por una consulta. Para el usuario de la base de datos, la vista aparece igual que
una tabla real, con un conjunto de columnas designadas y filas de datos. Pero a diferencia
de una tabla real, una vista no existe en la base de datos como conjunto almacenado de
valores. En su lugar, las filas y columnas de datos visibles a travs de la vista son los
resultados producidos por la consulta que define la vista. SQL crea la ilusin de la vista
dndole a sta un nombre semejante a un nombre de tabla y almacenando la definicin de
la vista en la base de datos.
Cmo maneja el DBMS las vistas
Cuando el DBMS encuentra una referencia a una vista en una sentencia SQL,
determina la definicin de la vista almacenada en la base de datos.
Para vistas sencillas, el DBMS puede construir cada fila de las vistas sobre la
marcha, extrayendo los datos para la fila de las tablas fuente. Para vistas ms complejas,
el DBMS debe materializar realmente la vista; es decir, el DBMS debe llevar a cabo
efectivamente la consulta que define la vista y almacenar sus resultados en una temporal.
El DBMS confirma las peticiones de acceso a la vista a partir de esta tabla temporal y
descarta la tabla cuando ya no es necesaria.
Pg.-198
SQL
9.2.
La sentencia CREATE VIEW se utiliza para crear una vista. La sentencia asigna
un nombre a la vista y especifica la consulta que define la vista. Para crear la vista con
xito es preciso tener permiso para acceder a todas las tablas referenciadas en la
consulta. Solamente se especifican los nombres de las columnas; el tipo de datos, la
longitud y las otras caractersticas de cada columna se deducen de la definicin de las
columnas en las tablas fuente. Si la lista de nombres de columnas se omite de la sentencia
CREATE VIEW, cada columna de la vista adopta el nombre de la columna
correspondiente de la consulta. La lista de nombres de columnas debe ser especificada si
la consulta incluye columnas calculadas o si produce dos columnas con nombres
idnticos.
SQL
Pg.-199
Aunque todas las vistas se crean del mismo modo en la prctica se utilizan
diferentes tipos de vistas para propsitos diferentes.
9.2.1. Vistas horizontales
Un uso comn de las vistas es restringir el acceso de un usuario a las filas
seleccionadas de una tabla. Por ejemplo, puede ser deseable que un director de ventas
solamente vea filas de REPVENTAS correspondientes a los vendedores de la regin
propia del director. Para lograr esto, se pueden definir dos vistas, del modo siguiente:
Crea una vista que muestre a los vendedores de la regin Este.
CREATE VIEW REPESTE AS
SELECT *
FROM REPVENTAS
WHERE OFICINA_REP IN (11, 12, 13)
Ahora se puede dar a cada director de ventas permiso para acceder a la vista
REPESTE negndoles el permiso para acceder a la propia Tabla REPVENTAS.
Una vista horizontal divide horizontalmente la tabla fuente para crear la vista.
Todas las columnas de la tabla fuente participan en la vista, pero slo algunas de sus filas
son visibles a travs de la vista. Las vistas horizontales son adecuadas cuando la tabla
fuente contiene datos que relacionan a varias organizaciones o usuarios. Proporcionan
una tabla privada para cada usuario, compuesta nicamente de las filas necesarias para
ese usuario.
Define una vista que contiene nicamente las oficinas de la regin Este.
CREATE VIEW OFICINASESTE AS
SELECT *
FROM OFICINAS
WHERE REGION = Este
Define una vista para Sue Smith (empleada nmero 102) que contiene solamente los
pedidos remitidos por clientes asignados a ella.
CREATE VIEW PEDIDOSSUE AS
SELECT *
FROM PEDIDOS
WHERE CLIE IN (SELECT NUM_CLIE
FROM CLIENTES
WHERE NUM_CLIE = 2102)
En cada uno de estos ejemplos, la vista se deriva de una nica tabla fuente. La
vista se define mediante una consulta SELECT * y por tanto tiene exactamente las
Pg.-200
SQL
mismas columnas que la tabla fuente. La clusula WHERE determina qu filas de la tabla
fuente son visibles en la vista.
9.2.2. Vistas verticales
Otro uso habitual de las vistas es restringir el acceso de un usuario a slo ciertas
columnas de una tabla. Por ejemplo, en nuestra base de datos, el departamento de
procesamiento de pedidos puede necesitar acceder al nmero de empleado, su nombre y
la asignacin de oficina. Sin embargo, no hay necesidad de que el personal de
procesamiento de pedidos vea las ventas actuales del vendedor o su cuota. Esta vista
selectiva de la Tabla REPVENTAS puede ser construida con la vista siguiente:
Crea una vista mostrando informacin seleccionada de cada vendedor.
CREATE VIEW INFOREP AS
SELECT NUM_EMPL, NOMBRE, OFICINA_REP
FROM REPVENTAS
Dando al personal de procesamiento de pedidos acceso a esta vista y
denegndole acceso a la propia Tabla REPVENTAS, el acceso a datos de cuotas y
ventas especficoa se restringe efectivamente.
Una vista como INFOREP se denomina con frecuencia vista vertical. Una vista
vertical divide la tabla fuente verticalmente para crear la vista. Las vistas verticales
suelen encontrarse all donde los datos almacenados en una tabla son utilizados por
varios usuarios o grupos de usuarios. Proporcionan una tabla privada a cada usuario,
compuesta nicamente de las columnas necesarias a ese usuario.
Define una vista de la Tabla OFICINAS para el personal de procesamiento de pedidos
que incluye la ciudad, el nmero de oficina y regin.
CREATE VIEW INFOOFICINA AS
SELECT OFICINA, CIUDAD, REGION
FROM OFICINAS
En cada uno de estos ejemplos, la vista se deriva de una tabla fuente nica. La
lista de seleccin en la definicin de la vista determina qu columnas de la tabla fuente
son visibles en la lista. Puesto que se trata de vistas verticales, cada fila de la tabla fuente
est representada en la vista y la definicin no incluye una clusula WHERE.
SQL
Pg.-201
Define una vista que contiene el nmero de cliente, el nombre de empresa y el lmite de
crdito de todos los clientes asignados a Bill Adams (empleado nmero 105)
CREATE VIEW CLIEBILL AS
SELECT NUM_CLIE, EMPRESA, LIMITE_CREDITO
FROM CLIENTES
WHERE REP_CLIE = 105
Los datos visibles a travs de esta vista son un subconjunto fila/columna de la
Tabla CLIENTES. Slo las columnas explcitamente designadas en la lista de seleccin
de la vista y las filas que satisfacen la condicin de bsqueda son visibles a travs de la
vista.
9.2.4. Vistas agrupadas
La consulta especificada en una definicin de vista puede incluir una clusula
GROUP BY. Este tipo de vista se denomina vista agrupada, ya que los datos visibles a
travs de ella son el resultado de una consulta agrupada. Las vistas agrupadas efectan la
misma funcin que las consultas agrupadas; agrupan filas relacionadas de datos y
producen una fila de resultados de consulta para cada grupo, resumiendo los datos de
ese grupo.
Define una vista que contiene datos de pedidos sumarios para cada vendedor.
CREATE VIEW PED_POR_REP (QUIEN, CUANTOS, TOTAL, INF, SUP, MEDIO) AS
SELECT REP, COUNT(*), SUM(IMPORTE), MIN(IMPORTE), MAX(IMPORTE),
AVG(IMPORTE)
FROM PEDIDOS
GROUP BY REP
SQL
SQL
Pg.-203
Pg.-204
SQL
9.3.
SQL
Pg.-205
No existe una correspondencia una a una entre las filas de estas vistas y las filas
de la Tabla PEDIDOS subyacente, por lo cual no tiene sentido hablar de insertar,
suprimir o actualizar filas de esta vista. La vista PED_POR_REP no es actualizable; es
una vista de slo lectura.
La vista REPESTE y la vista PED_POR_REP son dos ejemplos extremos en
trminos de la complejidad de sus definiciones. Hay vistas ms complejas que REPESTE
donde sigue teniendo sentido actualizar la vista, y hay vistas menos complejas que
PED_POR_REP en donde las actualizaciones no tienen sentido. De hecho, determinar
qu vistas y cules pueden ser actualizadas no ha sido un importante problema de
investigacin en base de datos relacional a lo largo de los aos.
Una vista puede ser actualizada si la consulta que la define satisface todas estas
restricciones:
Pg.-206
SQL
Para que una vista sea actualizable, el DBMS debe ser capaz de relacionar
cualquier fila de la vista con su fila fuente en la tabla fuente. Anlogamente, el DBMS
debe ser capaz de relacionar cada columna individual a actualizar con su columna fuente
en la tabla fuente.
Si la vista satisface esta comprobacin, es posible definir operaciones INSERT,
DELETE y UPDATE significativas para la vista en trminos de la(s) tabla(s) fuente.
SQL
Pg.-207
Pg.-208
SQL
NOMBRE
Bill Adams
Mary Jones
Sue Smith
Sam Clark
Bob Smith
Dan Roberts
Tom Snyder
Larry Fitch
Paul Cruz
Nancy Angelli
Fred Roberts
OFICINA_REP
13
11
21
11
21
12
NULL
21
12
22
21
SQL
Pg.-209
9.6.
Debido a que las vistas se comportan como tablas, y una vista no puede tener el
mismo nombre que una tabla, muchos productos DBMS utilizan la sentencia DROP
TABLE para eliminar vistas. Otras implementaciones SQL proporcionan la sentencia
DROP VIEW:
9.7.
RESUMEN
Pg.-210
Una vista es una tabla virtual definida mediante una consulta. La vista
`parece contener filas y columnas de datos, al igual que una tabla real,
pero los datos visibles a travs de la vista son, de hecho, los resultados de la
consulta.
Una vista puede ser un subconjunto simple fila/columna de una nica tabla,
puede sumarizar una tabla (una vista agrupada) o puede extraer sus datos de
dos o ms tablas (una vista compuesta).
Una vista puede ser referenciada como una tabla real en una sentencia
SELECT, INSERT, DELETE o UPDATE. Sin embargo, las vistas ms
complejas no pueden ser actualizadas; son vistas de slo lectura.
Las vistas suelen utilizarse para simplificar la estructura aparente de una
base de datos, para simplificar consultas y para proteger ciertas filas y/o
columnas frente a acceso no autorizado.
SQL