(For Dummies (Computer - Tech) ) Taylor A.G.-SQL For Dummies-Wiley (2013) ES
(For Dummies (Computer - Tech) ) Taylor A.G.-SQL For Dummies-Wiley (2013) ES
com
SQL
8va edición
Ninguna parte de esta publicación puede reproducirse, almacenarse en un sistema de recuperación ni transmitirse
de ninguna forma ni por ningún medio, electrónico, mecánico, fotocopia, grabación, escaneo o de otro tipo, excepto
según lo permitido en las Secciones 107 o 108 de la Ley de Derechos de Autor de los Estados Unidos de 1976. Actuar,
sin el permiso previo por escrito del Editor. Las solicitudes de permiso al editor deben dirigirse al Departamento de
Permisos, John Wiley & Sons, Inc., 111 River Street, Hoboken, NJ 07030, (201) 748-6011, fax (201) 748-6008 o en línea
en[Link]
Marcas registradas:Wiley, For Dummies, el logotipo de Dummies Man, [Link], Making Everything Easier y la imagen
comercial relacionada son marcas comerciales o marcas comerciales registradas de John Wiley & Sons, Inc. y no se puede
utilizar sin permiso por escrito. Todas las demás marcas comerciales son propiedad de sus respectivos dueños. John Wiley &
Sons, Inc. no está asociado con ningún producto o proveedor mencionado en este libro.
Para obtener información general sobre nuestros otros productos y servicios, comuníquese con nuestro Departamento de
Atención al Cliente dentro de los EE. UU. al 877-762-2974, fuera de los EE. UU. al 317-572-3993 o por fax al 317-572-4002. Para
soporte técnico, [Link]/techsupport.
Wiley publica en una variedad de formatos impresos y electrónicos y mediante impresión bajo demanda. Es posible que parte
del material incluido en las versiones impresas estándar de este libro no esté incluido en libros electrónicos o en impresión
bajo demanda. Si este libro hace referencia a medios como un CD o DVD que no están incluidos en la versión que compró,
puede descargar este material en[Link] obtener más información sobre los productos Wiley,
[Link].
Uso de una herramienta RAD para crear una base de datos simple ......................... .. 82
Decidir qué rastrear................................................ ........................ 82
Creando una tabla de base de datos ................................................ ................. 83
Modificar la estructura de la tabla ................................................ ................. 90
Creando un índice ................................................. ................................ 92
Eliminar una tabla................................................. ........................................ 94
Construyendo POWER con DDL de SQL................................................. ................... 95
Usando SQL con Microsoft Access ................................................. ......... 95
Creando una tabla ................................................. ........................................ 97
Creando un índice ................................................. ................................ 101
Modificar la estructura de la tabla ................................................ ................ 102
Eliminar una tabla................................................. ................................ 102
Eliminar un índice ................................................. ................................ 103
Consideraciones de portabilidad ................................................ ........................ 103
Tabla de contenido viii
Este libro no le dice cómo diseñar una base de datos (lo hago enDesarrollo de bases
de datos para principiantes,también publicado por Wiley). Aquí asumo que usted u
otra persona ya ha creado un diseño válido. Luego ilustro cómo implementar ese
diseño usando SQL. Si sospecha que no tiene un buen diseño de base de datos,
entonces, por supuesto, corrija su diseño antes de intentar construir la base de
datos. Cuanto antes detectes y corrijas los problemas en un proyecto de desarrollo,
más económicas serán las correcciones.
2 SQL para principiantes, octava edición
Preste atención a la información marcada por este icono; es posible que la necesite más
adelante.
Hacer caso a los consejos que señala este icono puede salvarle de un gran dolor. Ignóralo bajo
tu responsabilidad.
Este icono le alerta de la presencia de detalles técnicos que son interesantes pero no
absolutamente esenciales para comprender el tema que se está discutiendo.
En este capítulo
▶ Organizar la información
▶ Definición de “base de datos” en términos digitales
▶ Descifrando DBMS
▶ Observando la evolución de los modelos de bases de datos.
▶ Definiendo “relacionalbase de datos” (¿te identificas?)
▶ Considerando los desafíos del diseño de bases de datos
Existen varios tipos de bases de datos, cada una de las cuales se adhiere a un modelo diferente de cómo
se organizan los datos en la base de datos.
SQL fue desarrollado originalmente para operar con datos en bases de datos que siguen el modelo
[Link], el estándar internacional SQL ha incorporado parte de lamodelo de objeto,
dando como resultado estructuras híbridas llamadas bases de datos relacionales de objetos. En este
capítulo, analizo el almacenamiento de datos, dedico una sección a cómo se compara el modelo
relacional con otros modelos importantes y doy un vistazo a las características importantes de las
bases de datos relacionales.
Sin embargo, antes de hablar de SQL, quiero precisar lo que quiero decir con el términobase de [Link]
significado ha cambiado, del mismo modo que las computadoras han cambiado la forma en que las personas
registran y mantienen la información.
6 Parte I: Introducción a SQL
✓ El almacenamiento de datos tiene que ser rápido y sencillo porque es probable que lo haga con
frecuencia.
Las bases de datos informáticas más modernas cumplen estos cuatro criterios. Si almacena
más de una docena de elementos de datos, probablemente desee almacenarlos en una base
de datos.
Capítulo 1: Fundamentos de bases de datos relacionales 7
¿Que es una base de datos?
El términobase de datosÚltimamente se ha dejado de utilizar, perdiendo gran parte de su significado
original. Para algunas personas, una base de datos es cualquier colección de elementos de datos (guías
telefónicas, listas de lavandería, rollos de pergamino... lo que sea). Otras personas definen el término de
manera más estricta.
En este libro defino unabase de datoscomo una colección de registros integrados que
se describen a sí mismos. Y sí, eso implica tecnología informática, completa con
lenguajes de programación como SQL.
Una base de datos se compone de datos [Link] metadatos son los datos que
describen la estructura de los datos dentro de una base de datos. Si sabe cómo están
organizados sus datos, podrá recuperarlos. Debido a que la base de datos contiene una
descripción de su propia estructura, [Link] base de datos esintegrado porque
incluye no sólo elementos de datos sino también las relaciones entre elementos de datos.
Debido a que un sistema de archivos planos (que se describe más adelante en este capítulo) no tiene
metadatos, las aplicaciones escritas para trabajar con archivos planos deben contener el equivalente de los
metadatos como parte del programa de aplicación.
✓ Abase de datos personalestá diseñado para ser utilizado por una sola persona en una sola
computadora. Una base de datos de este tipo suele tener una estructura bastante simple y un
tamaño relativamente pequeño.
8 Parte I: Introducción a SQL
✓ Unbase de datos empresarialpuede ser enorme. Las bases de datos empresariales pueden
modelar el flujo de información crítica de grandes organizaciones enteras.
Estos días,nubees una palabra de moda que se utiliza incesantemente en los círculos
tecnológicos. Al igual que las cosas blancas e hinchadas en el cielo, tiene bordes confusos y
parece flotar en algún lugar ahí fuera. En realidad, es una colección de recursos informáticos a
los que se puede acceder a través de un navegador, ya sea a través de Internet o en una
intranet privada. Lo que distingue los recursos informáticos en la nube de recursos
informáticos similares en un centro de datos físico es el hecho de que se puede acceder a los
recursos a través de un navegador en lugar de un programa de aplicación que accede
directamente a esos recursos.
Figura 1-1:
Un bloque
diagrama de
un DBMS-
basado
información
sistema.
Archivos planos
En lo que respecta a los datos estructurados, el archivo plano es tan simple como parece. No,
un archivo plano no es una carpeta aplastada debajo de una pila de [Link] planos Se
llaman así porque tienen una estructura mínima. Si fueran edificios, apenas sobresaldrían del
suelo. Un archivo plano es simplemente una colección de
10 Parte I: Introducción a SQL
registros de datos, uno tras otro, en un formato específico (los datos, todos los datos y nada
más que los datos); en efecto, una lista. En términos informáticos, un archivo plano es simple.
Debido a que el archivo no almacena información estructural (metadatos), su sobrecarga
(cosas en el archivo que no son datos pero que ocupan espacio de almacenamiento) es
mínima.
Supongamos que desea realizar un seguimiento de los nombres y direcciones de los clientes
de su empresa en un sistema de archivos plano. El sistema puede tener una estructura
similar a esta:
Como puede ver, el archivo no contiene más que datos. Cada campo tiene una longitud fija (la
Nombrecampo, por ejemplo, siempre tiene exactamente 15 caracteres) y ninguna estructura
separa un campo de otro. La persona que creó la base de datos asignó las posiciones y
longitudes de los campos. Cualquier programa que utilice este archivo debe “saber” cómo se
asignó cada campo, porque esa información no está contenida en la base de datos misma.
Una sobrecarga tan baja significa que operar con archivos planos puede ser muy rápido. Sin
embargo, el lado negativo es que los programas de aplicación deben incluir una lógica que manipule
los datos del archivo a un nivel muy detallado. La aplicación debe saber exactamente dónde y cómo
el archivo almacena sus datos. Por tanto, para sistemas pequeños, los archivos planos funcionan
bien. Sin embargo, cuanto más grande es un sistema, más engorroso se vuelve un sistema de
archivos planos.
El uso de una base de datos en lugar de un sistema de archivos planos elimina la duplicación de
esfuerzos. Aunque los archivos de bases de datos en sí pueden tener más gastos generales, las
aplicaciones pueden ser más portátiles en varias plataformas de hardware y sistemas
operativos. Una base de datos también facilita la escritura de programas de aplicación porque
el programador no necesita conocer los detalles físicos de dónde y cómo se almacenan los
datos.
La razón por la que las bases de datos eliminan la duplicación de esfuerzos es porque el
DBMS maneja los detalles de manipulación de datos. Las aplicaciones escritas para operar
en archivos planos deben incluir esos detalles en el código de la aplicación. Si varias
aplicaciones acceden a los mismos datos de archivo plano, todas estas aplicaciones deben
incluir (de forma redundante) ese código de manipulación de datos. Sin embargo, si está
utilizando un DBMS, no es necesario que incluya dicho código en las aplicaciones.
Capítulo 1: Fundamentos de bases de datos relacionales 11
Claramente, si una aplicación basada en archivos planos incluye código de manipulación de datos que
se ejecuta sólo en un sistema operativo (SO) en particular, migrar la aplicación a un sistema operativo
diferente es un dolor de cabeza a punto de suceder. Tienes que cambiar todo el código específico del
sistema operativo, y eso es sólo para empezar. Migrar una aplicación similar basada en DBMS a otro
sistema operativo es mucho más sencillo: menos pasos complicados y menos consumo de aspirina.
Algunos años más tarde, el Dr. E. F. Codd de IBM desarrolló elrelacionalmodelo, que
presentaba una redundancia mínima y una estructura fácilmente comprensible. El
lenguaje SQL fue desarrollado para operar en bases de datos relacionales. Las bases de
datos relacionales finalmente enviaron las bases de datos jerárquicas y de red al
basurero de la historia.
Un nuevo fenómeno es la aparición de las llamadas bases de datos NoSQL, que carecen
de la estructura de las bases de datos relacionales y no utilizan el lenguaje SQL. No cubro
las bases de datos NoSQL en este libro.
modelo relacional
El Dr. Codd formuló por primera vez el modelo de base de datos relacional en 1970, y este
modelo comenzó a aparecer en productos aproximadamente una década después.
Irónicamente, IBM no entregó el primer DBMS relacional. Esa distinción fue para una pequeña
empresa nueva, que llamó a su producto Oracle.
Las bases de datos relacionales han reemplazado casi por completo a los tipos de bases de
datos anteriores. Esto se debe en gran medida a que puede cambiar la estructura de una base
de datos relacional sin tener que cambiar o modificar aplicaciones basadas en estructuras
antiguas. Supongamos, por ejemplo, que agrega una o más columnas nuevas a una tabla de
base de datos. No necesita cambiar ninguna aplicación escrita previamente que procese esa
tabla, a menos, por supuesto, que modifique una o más de las columnas que esas aplicaciones
deben usar.
12 Parte I: Introducción a SQL
Por supuesto, si elimina una columna que una aplicación existente debe usar, experimentará
problemas sin importar el modelo de base de datos que siga. Una de las formas más rápidas
de hacer que una aplicación de base de datos falle es pedirle que recupere un tipo de datos
que su base de datos no contiene.
Arelaciónes una matriz bidimensional de filas y columnas, que contiene entradas con un
solo valor y sin filas duplicadas. Cada celda de la matriz solo puede tener un valor y no
pueden haber dos filas idénticas. Si esto es un poco difícil de imaginar, aquí hay un
ejemplo que lo ubicará en el estadio correcto. . . .
Figura 1-2:
Una mesa
demostración
del jugador
ofensivo
Estadísticas.
Cada columna de una tabla de base de datos incorpora un único atributo de la tabla,
como esa tarjeta de béisbol. El significado de la columna es el mismo para todas las filas
de la tabla. Una tabla puede, por ejemplo, contener los nombres, direcciones y números
de teléfono de todos los clientes de una organización. Cada fila de la tabla (también
llamadaregistro,o untupla) contiene los datos de un solo cliente. Cada columna contiene
un soloatributo—como número de cliente, nombre del cliente, calle del cliente, ciudad
del cliente, estado del cliente, código postal del cliente o número de teléfono del cliente.
La figura 1-3 muestra algunas de las filas y columnas de dicha tabla.
Elrelacionesen este modelo de base de datos corresponden amesasen cualquier base de datos
basada en el modelo. Intenta decir eso diez veces más rápido.
Figura 1-3:
Cada
base de datos
la fila contiene
un expediente;
cada
base de datos
columna
sostiene un
soltero
atributo.
14 Parte I: Introducción a SQL
Disfruta la vista
Una de mis vistas favoritas es la del valle de Yosemite desde la boca del túnel
Wawona, en una tarde de primavera. Una luz dorada baña la pura fachada de
El Capitán, Half Dome brilla en la distancia y Bridal Veil Falls forma una
cascada plateada de agua cristalina, mientras tenues nubes tejen un tapiz en
el cielo. Las bases de datos también tienen vistas, aunque no sean tan
pintorescas. La belleza de las vistas de bases de datos es su gran utilidad
cuando trabaja con sus datos.
Las tablas pueden contener muchas columnas y filas. A veces todos esos datos te
interesan y otras no. Es posible que solo le interesen algunas columnas de una tabla, o
quizás desee ver solo filas que cumplan una determinada condición. Algunas columnas
de una tabla y algunas otras columnas de una tabla relacionada pueden interesarle.
Para eliminar datos que no son relevantes para sus necesidades actuales, puede crear
unvista—un subconjunto de una base de datos que una aplicación puede procesar.
Puede contener partes de una o más tablas.
Digamos, por ejemplo, que está trabajando con una base de datos que tiene
una tabla CLIENTE y una tabla FACTURA. La tabla CLIENTE tiene las columnas
ID de cliente, nombre, apellido, calle, ciudad, estado, código postal,y Teléfono.
La tabla FACTURA tiene las columnasNúmero de factura, ID de cliente, Fecha,
Venta total, Total remitido,yForma de pago.
Un gerente de ventas nacional quiere ver una pantalla que contiene solo el
nombre, apellido y número de teléfono del cliente. Crear desde la tabla
CLIENTE una vista que contenga solo elNombre Apellido,y TeléfonoLas
columnas permiten al administrador ver lo que necesita sin tener que ver
todos los datos no deseados en las otras columnas. La figura 1-4 muestra la
derivación de la opinión del gerente de ventas nacional.
Es posible que el gerente de una sucursal desee consultar los nombres y números de teléfono
de todos los clientes cuyos códigos postales se encuentran entre 90000 y 93999 (sur y centro de
California). Una vista que impone una restricción a las filas que recupera, así como a las
columnas que muestra, hace el trabajo. La Figura 1-5 muestra las fuentes de las columnas en la
vista del gerente de sucursal.
Capítulo 1: Fundamentos de bases de datos relacionales 15
Figura 1-4:
Las ventas
del gerente
ver deriva
desde el
CLIENTE
mesa.
Figura 1-5:
La rama
hombre-
vista de edad
incluye
solo cer-
tain filas
desde el
CLIENTE
mesa.
dieciséis Parte I: Introducción a SQL
Es posible que el administrador de cuentas por pagar desee ver los nombres de los
clientes en la tabla CLIENTE yFecha, TotalVenta, TotalRemitido,y Forma de pagode
la tabla FACTURA, dondeTotalRemitidoes menos queVenta [Link] último sería el
caso si aún no se ha realizado el pago total. Esta necesidad requiere una visión que
se base en ambas tablas. La Figura 1-6 muestra los datos que fluyen hacia la vista
del administrador de cuentas por pagar desde las tablas CLIENTE y FACTURA.
Las vistas son útiles porque le permiten extraer y formatear datos de bases de
datos sin alterar físicamente los datos almacenados. También protegen los datos
que ustednoquieren mostrar, porque no lo contienen. El Capítulo 6 ilustra cómo
crear una vista utilizando SQL.
Figura 1-6:
El
cuentas-
pagadero
del gerente
ver sorteos
de dos
mesas.
esquemas
La estructura de una base de datos completa es suesquema,ovisión conceptual.A esta
estructura a veces también se le llamavista lógica completade la base de datos. El esquema
son metadatos y, como tales, son parte de la base de datos. Los metadatos en sí, que
describen la estructura de la base de datos, se almacenan en tablas que son como las tablas
que almacenan los datos normales. Incluso los metadatos son datos; esa es la belleza de esto.
Dominios
Un atributo de una relación (es decir, una columna de una tabla) puede asumir un
número finito de valores. El conjunto de todos estos valores es eldominiodel atributo.
Digamos, por ejemplo, que usted es un concesionario de automóviles que maneja el cupé
deportivo Curarri GT 4000 recientemente presentado. Realiza un seguimiento de los
automóviles que tiene en stock en una tabla de base de datos a la que denomina INVENTARIO.
Usted nombra una de las columnas de la [Link],que mantiene el color exterior de cada
coche. El GT 4000 viene en sólo cuatro colores: carmesí intenso, negro medianoche, blanco
copo de nieve y gris metálico. Esos cuatro colores son el dominio de laColor atributo.
Restricciones
Restriccionesson un componente importante, aunque a menudo pasado por alto, de una base de
datos. Las restricciones son reglas que determinan qué valores pueden asumir los atributos de la
tabla.
Al aplicar restricciones estrictas a una columna, puede evitar que las personas ingresen datos
no válidos en esa columna. Por supuesto, cada valor que esté legítimamente en el dominio de
la columna debe satisfacer todas las restricciones de la columna. Como mencioné en la sección
anterior, el dominio de una columna es el conjunto de todos los valores que la columna puede
contener. Una restricción es una restricción sobre lo que puede contener una columna. Las
características de una columna de la tabla, más las restricciones que se aplican a esa columna,
determinan el dominio de la columna.
En el ejemplo del concesionario de automóviles, puede restringir la base de datos para que
acepte solo esos cuatro valores (mencionados en la sección anterior) en elColor columna. Si
un operador de entrada de datos intenta introducir en elColorcolumna un valor de, por
ejemplo,bosque verde,el sistema se niega a aceptar la entrada. La entrada de datos no
puede continuar hasta que el operador ingrese un valor válido en elColorcampo.
Quizás se pregunte qué sucede cuando Curarri AutoWerks decide ofrecer una versión verde
bosque del GT 4000 como opción a mitad de año. La respuesta es (redoble de tambores, por
favor) seguridad laboral para los programadores de mantenimiento de bases de datos.
18 Parte I: Introducción a SQL
Este tipo de cosas sucede todo el tiempo y requiere actualizaciones de la estructura de la base
de datos. Sólo las personas que saben cómo modificar la estructura de la base de datos (como
usted) podrán evitar un problema importante.
No voy a explicar toda esa jerga en este libro (aunque abordaré algunos de estos
términos más adelante). Baste decir que el modelo relacional clásico no encaja bien con
muchas de estas características. Como resultado, se han desarrollado sistemas de
gestión de bases de datos basados en el modelo de objetos. Sin embargo, la idea nunca
despegó. Aunque los lenguajes de programación orientados a objetos se han vuelto muy
populares, las bases de datos orientadas a objetos no.
En este libro, describo el estándar internacional ISO/IEC SQL. (Si tiene curiosidad, IEC significa
Comisión Electrotécnica Internacional, pero a nadie realmente le importa. ¿Cuántas personas
saben lo que significan las letras del acrónimo LASER?) El sistema descrito por el estándar ISO/
IEC SQL es principalmente un sistema relacional. modelo de base de datos. También incluyo las
extensiones orientadas a objetos del estándar que se introdujeron en SQL:1999 y las
extensiones adicionales incluidas en versiones posteriores. Las características orientadas a
objetos del nuevo estándar permiten a los desarrolladores aplicar bases de datos SQL a
problemas que son demasiado complejos para abordarlos con el paradigma más antiguo,
puramente relacional. Los proveedores de sistemas DBMS están incorporando en sus
productos las características orientadas a objetos del estándar ISO. Algunas de estas
características han estado presentes durante años, pero otras aún no se han incluido.
Decida cuántos detalles necesita ahora y cuántos puede necesitar en el futuro, y luego
proporcione exactamente ese nivel de detalle en su diseño (ni más ni menos). Pero no se
sorprenda si eventualmente tiene que ajustar el diseño para satisfacer las necesidades
cambiantes del mundo real.
Los sistemas de gestión de bases de datos actuales, completos con atractivas interfaces
gráficas de usuario y herramientas de diseño intuitivas, pueden dar al aspirante a diseñador de
bases de datos una falsa sensación de seguridad. Estos sistemas hacen que el diseño de una
base de datos parezca comparable a crear una hoja de cálculo o realizar alguna otra tarea
relativamente sencilla. No hubo tanta suerte. El diseño de bases de datos es difícil. Si lo hace
incorrectamente, no sólo es probable que su base de datos sufra un rendimiento deficiente,
sino que también puede volverse gradualmente más corrupta a medida que pasa el tiempo. A
menudo, el problema no aparece hasta que se dedica un gran esfuerzo a la entrada de datos.
Cuando sabes que tienes un problema, ya es grave. En muchos casos, la única solución es
rediseñar completamente la base de datos y volver a ingresar todos los datos. La ventaja es
que cuando termine la segunda versión de la misma base de datos, se dará cuenta de cuánto
mejor comprende el diseño de bases de datos.
20 Parte I: Introducción a SQL
Capitulo 2
Fundamentos de SQL
En este capítulo
▶ Entendiendo SQL
▶ Aclarando conceptos erróneos sobre SQL
▶ Echando un vistazo a los diferentes estándares SQL
▶ Familiarizarse con los comandos SQL estándar y las palabras reservadas
▶ Representar números, caracteres, fechas, horas y otros tipos de datos.
▶ Explorando valores nulos y restricciones
▶ Poner SQL a trabajar en un sistema cliente/servidor
▶ Considerando SQL en una red
SQL, por otro lado, esno [Link] resolver un problema usando SQL, simplemente
dígale a SQLquéquieres (como si estuvieras hablando con el genio de Aladdin) en lugar de
decirle al sistemacómo llegartu lo que quieras. La base de datos
22 Parte I: Introducción a SQL
Para ilustrar lo que quiero decir con "dígale al sistema lo que quiere", suponga que
tiene una tabla EMPLEADO de la que desea recuperar las filas que corresponden a
todos sus altos cargos. Desea definir una persona mayor como cualquier persona
mayor de 40 años o cualquier persona que gane más de $100,000 por año. Puede
realizar la recuperación deseada utilizando la siguiente consulta:
Esta declaración recupera todas las filas de la tabla EMPLEADO donde el valor en el
Edadcolumna es mayor que 40 o el valor en elSalariola columna es mayor que
100.000. En SQL, no es necesario especificar cómo se recupera la información. El
motor de la base de datos examina la base de datos y decide por sí mismo cómo
cumplir con su solicitud. Sólo necesita especificar qué datos desea recuperar.
AconsultaEs una pregunta que le haces a la base de datos. Si alguno de los datos de la base de
datos satisface las condiciones de su consulta, SQL recupera esos datos.
El trabajo de IBM con bases de datos relacionales y SQL era bien conocido en la industria
incluso antes de que IBM introdujera su producto de base de datos relacional SQL/DS (RDBMS)
en 1981. En ese momento, Relational Software, Inc. (ahora Oracle Corporation) ya había
lanzado su primer RDBMS. . Estos primeros productos inmediatamente establecieron el
estándar para una nueva clase de sistemas de gestión de bases de datos. Incorporaron SQL,
que se convirtió en el estándar de facto para los sublenguajes de datos. Los proveedores de
otros sistemas de gestión de bases de datos relacionales lanzaron sus propias versiones de
SQL. Normalmente, estas otras implementaciones contenían todas las funciones principales de
los productos IBM, ampliadas de manera que aprovechaban las fortalezas particulares de su
propio producto RDBMS. Como resultado, aunque casi todos los proveedores utilizaban algún
tipo de SQL, la compatibilidad entre plataformas era deficiente.
La versión completa más reciente del estándar SQL es SQL:2011 (ISO/IEC 9075-X:2011). En este
libro, describo SQL como SQL:2011 define el lenguaje. Cada implementación SQL específica
difiere del estándar hasta cierto punto. Debido a que el estándar SQL completo es integral, es
poco probable que las implementaciones disponibles actualmente lo admitan por completo. Sin
embargo, los proveedores de DBMS están trabajando para admitir un subconjunto central del
lenguaje SQL estándar. La norma ISO/IEC completa está disponible para su compra enhttp://
[Link],pero probablemente no quiera comprarlo a menos que tenga la intención de
crear su propio sistema de gestión de bases de datos estándar ISO/IEC SQL. El estándar es
altamentetécnico y prácticamente incomprensible para cualquiera que no sea un experto en
lenguajes informáticos.
Declaraciones SQL
El lenguaje de comandos SQL consta de un número limitado de declaraciones que
realizan tres funciones de manejo de datos: algunas definen datos, algunas manipulan
datos y otras controlan los datos. Cubro las declaraciones de definición de datos y
declaraciones de manipulación de datos en los Capítulos 4 al 12; Detallo las
declaraciones de control de datos en los Capítulos 13 y 14.
Para cumplir con SQL:2011, una implementación debe incluir un conjunto básico de
características principales. También puede incluir extensiones al conjunto principal (que
también describe la especificación SQL:2011). La Tabla 2-1 enumera las declaraciones SQL:2011
principales y extendidas. Es una gran lista. Si eres uno de esos programadores a los que les
encanta probar nuevas capacidades, alégrate.
PREPARAR
GENERADOR
ALTERAR TABLA DESCONECTAR INSERTAR
COLOCAR
GRUPO
CREAR TIPO EJECUTAR INMEDIATAMENTE INICIAR TRANSACCIÓN
CREAR VISTA BUSCAR ACTUALIZAR
DESASIGNAR
DESCRIPTOR
26 Parte I: Introducción a SQL
Palabras reservadas
Además de las declaraciones, hay otras palabras que tienen un significado especial
dentro de SQL. Estas palabras, junto con las declaraciones, están reservadas para usos
específicos, por lo que no puede utilizarlas como nombres de variables ni de ninguna
otra forma que difiera de su uso previsto. Puede ver fácilmente por qué a las tablas,
columnas y variables no se les deben dar nombres que aparecen en la lista de palabras
reservadas. Imagínense la confusión que causaría una afirmación como la siguiente:
'Nuff dijo. En el Apéndice A aparece una lista completa de palabras reservadas de SQL.
Tipos de datos
Dependiendo de sus historiales, diferentes implementaciones de SQL admiten una
variedad de tipos de datos. La especificación SQL reconoce siete tipos generales
predefinidos:
✓ Numéricos
✓ Binario
✓ Instrumentos de cuerda
✓ booleanos
✓ Fechas y horas
✓ Intervalos
✓ XML
Dentro de cada uno de estos tipos generales puede haber varios subtipos (números exactos,
números aproximados, cadenas de caracteres, cadenas de bits, cadenas de objetos grandes).
Además de los tipos integrados predefinidos, SQL admite tipos de colección, tipos
construidos y tipos definidos por el usuario, todo lo cual analizaré más adelante en este
capítulo.
Si utiliza una implementación de SQL que admita tipos de datos que no se describen en
la especificación SQL, puede mantener su base de datos más portátil evitando estos tipos
de datos no descritos. Antes de decidir crear y utilizar un tipo de datos definido por el
usuario, asegúrese de que cualquier DBMS al que desee migrar en el futuro también
admita tipos definidos por el usuario.
Capítulo 2: Fundamentos de SQL 27
numeros exactos
Como probablemente puedas adivinar por el nombre, elnumérico exactoLos tipos de datos le
permiten expresar exactamente el valor de un número. Cinco tipos de datos entran en esta
categoría:
✓ ENTERO
✓ PEQUEÑO
✓ EMPEZANDO
✓ NUMÉRICO
✓ DECIMAL
Si está definiendo una columna de tabla de base de datos para contener datos enteros
y sabe que el rango de valores en la columna no excederá la precisión de PEQUEÑO
datos sobre su implementación, asigne a la columna elPEQUEÑO tipo en lugar del
ENTEROtipo. Esta asignación puede permitir que su DBMS conserve espacio de
almacenamiento.
Digamos, por ejemplo, que elNUMÉRICOLa precisión predeterminada del tipo de datos para su
implementación de SQL es 12 y la escala predeterminada es 6. Si especifica que una columna
de base de datos tenga unNUMÉRICOtipo de datos, la columna puede contener números hasta
999.999,999999. Si, por el contrario, especifica un tipo de datos deNUMÉRICO (10)para una
columna, esa columna solo puede contener números con un valor máximo de 9.999,999999. El
parámetro (10)especifica el número máximo de dígitos posibles en el número. Si especifica un
tipo de datos deNUMÉRICO (10,2) para una columna, esa columna puede contener números
con un valor máximo de 99.999.999,99. En este caso, es posible que aún tengas diez dígitos en
total, pero solo dos de esos dígitos pueden estar a la derecha del punto decimal.
NUMÉRICOLos datos se utilizan para valores como 595,72. Ese valor tiene una precisión
de 5 (el número total de dígitos) y una escala de 2 (el número de dígitos a la derecha del
punto decimal). Un tipo de datos deNUMÉRICO (5,2)es apropiado para tales números.
Números aproximados
Algunas cantidades tienen un rango tan grande de valores posibles (muchos órdenes de
magnitud) que una computadora con un tamaño de registro determinado no puede
representar todos los valores exactamente. (Ejemplos detamaños de registroson 32 bits, 64
bits y 128 bits). Por lo general, en tales casos, la exactitud no es necesaria y una aproximación
cercana es aceptable. SQL define tres aproximadosNUMÉRICOtipos de datos para manejar
este tipo de datos:REAL, DOBLE PRECISIÓN,yFLOTAR (como se detalla en las siguientes tres
subsecciones).
ElFLOTAREl tipo de datos es más útil si cree que algún día podrá migrar su base de
datos a una plataforma de hardware con tamaños de registro diferentes a los
disponibles en su plataforma actual. Al utilizar elFLOTARtipo de datos, puede
especificar una precisión, por ejemplo,FLOTADOR (5).Si su hardware admite la
precisión especificada con su circuito de precisión simple, entonces su sistema
actual utiliza aritmética de precisión simple. Si, después de migrar su base de datos,
la precisión especificada requiere aritmética de doble precisión, entonces el sistema
usosaritmética de doble precisión.
Cadenas de caracteres
Las bases de datos almacenan muchos tipos de datos, incluidas imágenes gráficas, sonidos y
animaciones. Espero que los olores vengan después. ¿Te imaginas una imagen tridimensional en
color de 1920 x 1080 y 24 bits de una porción grande de pizza de pepperoni en tu pantalla, mientras
una muestra de olor tomada en DiFilippi's Pizza Grotto se reproduce a través de tu tarjeta súper
multimedia? Una configuración de este tipo puede resultar frustrante, al menos hasta que pueda
permitirse el lujo de agregar también datos de sabor a su sistema. Lamentablemente, puede esperar
mucho tiempo antes de que el olor y el sabor se conviertan en tipos de datos SQL estándar. Hoy en
día, los tipos de datos que se utilizan con más frecuencia (después de laNUMÉRICOLos tipos, por
supuesto, son tipos de cadenas de caracteres.
Capítulo 2: Fundamentos de SQL 31
Tienes tres tipos principales dePERSONAJEdatos:
✓ CARACTER NACIONAL
✓ CARÁCTER NACIONAL VARIABLE
✓ GRAN OBJETO DE CARÁCTER NACIONAL
tipo de datos del lado del cliente llamadolocalizador de CLOBse utiliza para manipular elCLOB
datos. Es un parámetro cuyo valor identifica un objeto de cadena de caracteres grande.
Apredicadoes una afirmación que puede ser lógicamente Verdadera o lógicamente Falsa.
Puede especificar el juego de caracteres al definir una columna de la tabla. Si lo desea, cada
columna puede utilizar un juego de caracteres diferente. El siguiente ejemplo de una declaración
de creación de tabla utiliza varios conjuntos de caracteres:
cadenas binarias
ElBINARIOLos tipos de datos de cadena se introdujeron en SQL:2008. Teniendo en cuenta que
los datos binarios han sido fundamentales para las computadoras digitales desde la
computadora Atanasoff-Berry de la década de 1930, este reconocimiento de la importancia de
los datos binarios parece un poco tarde en llegar a SQL. (Supongo que más vale tarde que
nunca). Hay tres tipos binarios diferentes,BINARIO, BINARIO VARIABLE,y OBJETO BINARIO
GRANDE.
Capítulo 2: Fundamentos de SQL 33
Por un lado, no puedes usar unGOTAen unCLAVE PRIMARIA, CLAVE EXTRANJERA,o ÚNICO
predicado. Además, noGOTASe permiten s en comparaciones distintas de las de igualdad o
[Link] archivos son grandes, por lo que las aplicaciones generalmente no
transfieren datos [Link] hacia o desde una base de datos. En su lugar, utilizan un tipo
de datos especial del lado del cliente llamadolocalizador de BLOBpara manipular elGOTA
datos. El localizador es un parámetro cuyo valor identifica un objeto binario grande.
booleanos
ElBOOLEANOEl tipo de datos consta de los distintos valores de [Link], así
[Link] se compara un valor booleano Verdadero o Falso con un NULOo Valor
de verdad desconocido, el resultado tendrá el valor Desconocido.
Fechas y horas
El estándar SQL define cinco tipos de datos que tratan con fechas y horas; ellos se llamantipos de
datos de fecha y hora,o simplementefechas y [Link] una superposición considerable entre
estos tipos de datos, por lo que es posible que algunas implementaciones que encuentre no admitan
los cinco.
34 Parte I: Introducción a SQL
Las implementaciones que no admiten completamente los cinco tipos de datos para
fechas y horas pueden tener problemas con las bases de datos que intenta migrar desde
otra implementación. Si tiene problemas con una migración, verifique las
implementaciones de origen y destino para ver cómo representan las fechas y horas.
Intervalos
ElintervaloLos tipos de datos se relacionan estrechamente con los tipos de datos de fecha y
hora. Un intervalo es la diferencia entre dos valores de fecha y hora. En muchas aplicaciones
que tratan con fechas, horas o ambas, a veces es necesario determinar el intervalo entre dos
fechas o dos horas.
tipo XML
XML es un acrónimo de eXtensible Markup Language, que define un conjunto de reglas
para agregar marcado a los datos. El marcado estructura los datos de una manera que
transmite lo que significan. XML permite compartir datos entre plataformas muy
diferentes.
36 Parte I: Introducción a SQL
ElXMLEl tipo de datos tiene una estructura de árbol, por lo que un nodo raíz puede tener
nodos secundarios, los cuales, a su vez, pueden tener sus propios hijos. Introducido por
primera vez en SQL:2003, elXMLEl tipo se desarrolló en SQL/XML:2005 y se amplió aún
más en SQL:2008. La edición de 2005 definió cinco subtipos parametrizados, conservando
el original [Link]. Los valores XML pueden existir como instancias de dos o
incluso más tipos, porque algunos de los subtipos son subtipos de otros subtipos. (Tal vez
debería llamarlos subsubtipos, o incluso subsubtipos. Afortunadamente, SQL:2008
definió una forma estándar de referirse a los subtipos).
Figura 2-1:
La rela-
relaciones
del XML
subtipos.
La siguiente lista es un resumen de los tipos XML con los que debería estar
familiarizado. No te asustes si te parece griego (o peor aún, lineal A). Doy una
explicación más detallada de estos tipos en el Capítulo 18. He organizado la lista
para comenzar con los tipos más básicos y terminar con los más complicados:
tipos de fila
ElFILAEl tipo de datos se introdujo con SQL:1999. No es tan fácil de entender y,
como programador SQL principiante o intermedio, es posible que nunca lo utilices.
Después de todo, la gente se las arregló sin problemas entre 1986 y 1999.
Una cosa destacable sobre elFILAtipo de datos es que viola las reglas de normalización que E. F.
Codd declaró en los primeros días de la teoría de bases de datos relacionales. (Hablo más
sobre esas reglas en el Capítulo 5.) Una de las características definitorias de la primera forma
normal es que un campo en una fila de la tabla no puede tener múltiples valores. Un campo
puede contener uno y sólo un valor. sin embargo, elFILAEl tipo de datos le permite declarar
que una fila completa de datos estará contenida dentro de un solo campo en una sola fila de
una tabla; en otras palabras, una fila anidada dentro de una fila.
Elformas normales,articuladas por primera vez por el Dr. Codd, son características definitorias
de las bases de datos relacionales. Inclusión de laFILAtype en el estándar SQL fue el primer
intento de ampliar SQL más allá del modelo relacional puro.
Una vez definido, el nuevoFILAEl tipo se puede utilizar en una definición de tabla:
Tipos de colección
Después de que SQL rompió la camisa de fuerza relacional con SQL:1999, los tipos de
datos que violan la primera forma normal se hicieron posibles. Se hizo posible que un
campo contuviera una colección completa de objetos en lugar de solo uno. El
FORMACIÓN El tipo se introdujo en SQL:1999, y elMULTICONJUNTOEl tipo se introdujo
en SQL:2003.
Dos colecciones pueden compararse entre sí sólo si ambas son del mismo tipo, ya sea
FORMACIÓNoMULTICONJUNTO,y si sus tipos de elementos son comparables. Debido a que las
matrices tienen un orden de elementos definido, se pueden comparar los elementos
correspondientes de las matrices. Los conjuntos múltiples no tienen un orden de elementos
definido, pero puede compararlos si (a) existe una enumeración para cada conjunto múltiple
que se compara y (b) las enumeraciones se pueden emparejar.
tipo de matriz
ElFORMACIÓNEl tipo de datos viola la primera forma normal (1NF), pero de una manera
diferente a la forma en que elFILAEl tipo viola 1NF. ElFORMACIÓNtipo, un tipo de colección, no
es un tipo distinto en el mismo sentido quePERSONAJEyNUMÉRICOson tipos de datos distintos.
UnFORMACIÓNtype simplemente permite que uno de los otros tipos tenga múltiples valores
dentro de un solo campo de una tabla. Por ejemplo, supongamos que su organización necesita
poder comunicarse con los clientes ya sea que estén en el trabajo, en casa o de viaje. Quiere
mantener varios números de teléfono para ellos. Puedes hacer esto declarando elTeléfono
atributo como una matriz, como se muestra en el siguiente código:
ElMATRIZ [3]La notación le permite almacenar hasta tres números de teléfono en la tabla
CLIENTE. Los tres números de teléfono representan un ejemplo de grupo repetitivo.
Grupos repetidosson un no-no según la teoría clásica de bases de datos relacionales,
pero este es uno de varios ejemplos de casos en los que SQL:1999 rompió las reglas.
Cuando el Dr. Codd especificó por primera vez las reglas de normalización, intercambió
flexibilidad funcional por integridad de datos. SQL: 1999 tomó
40 Parte I: Introducción a SQL
La mayor complejidad estructural podría traducirse en una integridad de los datos comprometida si
no es plenamente consciente de todos los efectos de las acciones que realiza en su base de datos. Las
matrices están ordenadas, en el sentido de que cada elemento de una matriz está asociado con
exactamente unoposición ordinal en la matriz.
Si una matriz tiene una cardinalidad menor que el máximo declarado, las celdas no
utilizadas de la matriz se consideran inexistentes. No se considera que contengan
valores nulos; simplemente no están ahí en absoluto.
Puede acceder a elementos individuales en una matriz encerrando sus subíndices entre
corchetes. Si tiene una matriz llamada Teléfono, entonces Teléfono [3] se referiría al
tercer elemento de la matriz Teléfono.
tipo MULTICONJUNTO
Aconjunto múltipleEs una colección desordenada. No se puede hacer referencia a elementos específicos
del conjunto múltiple; normalmente eso se debe a que a esos elementos no se les asignan posiciones
ordinales específicas en el conjunto múltiple.
Capítulo 2: Fundamentos de SQL 41
tipos de referencia
ÁRBITROLos tipos no son parte del SQL central. Esto significa que un DBMS puede afirmar
que cumple con el estándar SQL sin implementarÁRBITROtipos en absoluto. ElÁRBITROtype
no es un tipo de datos distinto en el sentido de quePERSONAJEy NUMÉRICOson. En cambio,
es unpunteroa un elemento de datos, un tipo de fila o un tipo de datos abstracto que reside
en una fila de una tabla (un sitio). Eliminar la referencia al puntero puede recuperar el valor
almacenado en el sitio de destino.
Si estás confundido, no te preocupes, porque no estás solo. Utilizando elÁRBITRO tipos requiere un
conocimiento práctico de los principios de la programación orientada a objetos (OOP). Este libro se
abstiene de adentrarse demasiado en las turbias aguas de la programación orientada a objetos. De
hecho, porque elÁRBITROLos tipos no forman parte del núcleo de SQL, es posible que sea mejor que
no los utilice. Si desea la máxima portabilidad entre plataformas DBMS, limítese al SQL central.
Tipos definidos por el usuario(UDT) representan otro ejemplo de características que llegaron
en SQL:1999 y que provienen del mundo de la programación orientada a objetos. Como
programador de SQL, ya no está restringido a los tipos de datos definidos en la especificación
SQL. Puede definir sus propios tipos de datos, utilizando los principios de los tipos de datos
abstractos (ADT) que se encuentran en lenguajes de programación orientados a objetos como
C++.
Uno de los beneficios más importantes de los UDT es el hecho de que puede usarlos para
eliminar eldesajuste de impedanciaentre SQL y el lenguaje anfitrión que "envuelve" el SQL. Un
problema de larga data con SQL ha sido el hecho de que los tipos de datos predefinidos de SQL
no coinciden con los tipos de datos de los lenguajes anfitriones en los que están integradas las
declaraciones SQL. Ahora, con los UDT, un programador de bases de datos puede crear tipos
de datos dentro de SQL que coincidan con los tipos de datos del lenguaje anfitrión.
Un UDT tiene atributos y métodos que están encapsulados dentro del UDT. El
mundo exterior puede ver las definiciones de atributos y los resultados de los
métodos, pero las implementaciones específicas de los métodos están ocultas a la
vista. El acceso a los atributos y métodos de un UDT se puede restringir aún más
especificando que son públicos, privados o protegidos:
✓ PúblicoLos atributos o métodos están disponibles para todos los usuarios de un UDT.
De esto se desprende que un UDT en SQL se comporta de forma muy parecida a una clase en un
lenguaje de programación orientado a objetos. Existen dos formas de tipos definidos por el
usuario: tipos distintos y tipos estructurados.
Tipos distintos
Tipos distintosson la más simple de las dos formas de tipos definidos por el usuario. La
característica que define a un tipo distinto es que se expresa como un único tipo de
datos. Se construye a partir de uno de los tipos de datos predefinidos, llamadotipo de
fuente. Varios tipos distintos que se basan en un único tipo de fuente son distintos
entre sí; por tanto, no son directamente comparables. Por ejemplo, puede utilizar tipos
distintos para distinguir entre diferentes monedas. Considere la siguiente definición de
tipo:
Esta definición crea un nuevo tipo de datos para dólares estadounidenses (Dólar
estadounidense),basado en lo predefinidoDECIMALtipo de datos. Puede crear otro tipo distinto
de manera similar:
);
tipos estructurados
La segunda forma de tipo definido por el usuario (el tipo estructurado) se expresa como
una lista de definiciones de atributos y métodos en lugar de basarse en un único tipo de
fuente predefinido.
Constructores
Mutadores y observadores
Cuando crea un UDT estructurado, el DBMS crea automáticamente una función mutadora
y una función observadora. Amutador,cuando se invoca, cambia el valor de un atributo
de un tipo estructurado. Unobservadorla función es lo opuesto a una función mutadora;
su trabajo es recuperar el valor de un atributo de un tipo estructurado. Puede incluir
funciones de observador enSELECCIONARdeclaraciones para recuperar valores de una
base de datos.
Subtipos y supertipos
Puede existir una relación jerárquica entre dos tipos estructurados. Por
ejemplo, un tipo llamadoMúsicaCDudttiene un subtipo llamadoRockCDudty
otro subtipo llamadoClásicaCDudt. MúsicaCDudtes el supertipo de esos dos
[Link] unsubtipo adecuadodeMúsicaCDudtsi no hay subtipo de
MúsicaCDudtese es un supertipo [Link] tiene un subtipo
llamadoHeavyMetalCDudt, HeavyMetalCDudtTambién es un subtipo de
músicaCDudt,pero no es un subtipo adecuado deMúsicaCDudt.
Costo DECIMALES(9,2),
Precio sugerido DECIMALES(9,2)
/* Permitir subtipos */ NOT
FINAL ;
Ahora que tiene los tipos, puede crear tablas que los utilicen. He aquí un
ejemplo:
COMENZAR
Es posible que su implementación de SQL no admita todos los tipos de datos que
describo en esta sección. Además, su implementación puede admitir tipos de datos no
estándar que no describo aquí. (Su kilometraje puede variar, etc. Ya conoce el
procedimiento).
Valores nulos
Si un campo de base de datos contiene un elemento de datos, ese campo tiene un valor específico. Se dice
que un campo que no contiene un elemento de datos tiene unvalor [Link] eso en mente
Tanto un cero numérico como un carácter en blanco son valores definidos. Un valor nulo
indica que el valor de un campo no está definido: su valor no se conoce.
Existen varias situaciones en las que un campo puede tener un valor nulo. La siguiente
lista describe algunas de estas situaciones y ofrece un ejemplo de cada una:
Un campo puede tener un valor nulo por muchos motivos diferentes. No saque
conclusiones apresuradas sobre lo que significa un valor nulo en particular.
Restricciones
Restriccionesson restricciones que se aplican a los datos que alguien puede ingresar en una tabla de
base de datos. Es posible que sepa, por ejemplo, que las entradas de una columna numérica concreta
deben estar dentro de un rango determinado. Si alguien hace una entrada
Capítulo 2: Fundamentos de SQL 47
que queda fuera de ese rango, entonces esa entrada debe ser un error. Aplicar
una restricción de rango a la columna evita que ocurra este tipo de error.
Si recupera datos utilizando SQL en un sistema cliente/servidor, solo los datos que desea viajan
a través del canal de comunicación desde el servidor al cliente. Por el contrario, un sistema
simple de intercambio de recursos, con una inteligencia mínima en el servidor, debe enviar
enormes bloques de datos a través del canal para brindarle la pequeña porción de datos que
desea. Este tipo de transmisión masiva puede ralentizar considerablemente las operaciones. La
arquitectura cliente/servidor complementa las características de SQL para proporcionar un
buen rendimiento a un costo moderado en redes pequeñas, medianas y grandes.
El servidor
A menos que reciba una solicitud de un cliente, el servidor no hace nada; simplemente se queda ahí
y espera. Sin embargo, si varios clientes requieren servicio al mismo tiempo, los servidores deben
responder rápidamente. Los servidores generalmente difieren del cliente.
48 Parte I: Introducción a SQL
que es el servidor
Elservidor(corto paraservidor de base de datos) es la parte de un sistema cliente/servidor
que contiene la base de datos. El servidor también contiene el software del servidor, la
parte de un sistema de gestión de bases de datos que interpreta los comandos que llegan
de los clientes y los traduce en operaciones en la base de datos. El software del servidor
también formatea los resultados de las solicitudes de recuperación y los envía al cliente
solicitante.
El cliente
ElclienteParte de un sistema cliente/servidor consta de un componente de
hardware y un componente de software. El componente de hardware es la
computadora cliente y su interfaz con la red de área local. Este hardware de cliente
puede ser muy similar (o incluso idéntico) al hardware del servidor. El software es
el componente distintivo del cliente.
cual es el cliente
El trabajo principal del cliente es proporcionar una interfaz de usuario. En lo que respecta al
usuario, la máquina clienteesla computadora y la interfaz de usuarioesla aplicación. Es posible
que el usuario ni siquiera se dé cuenta de que el proceso implica un servidor. El servidor suele
estar fuera de la vista, a menudo en otra habitación. Aparte de la
Capítulo 2: Fundamentos de SQL 49
interfaz de usuario, el cliente también contiene el programa de aplicación y la parte
cliente del DBMS. El programa de aplicación realiza la tarea específica que usted requiere
(por ejemplo, en cuentas por cobrar o registro de pedidos). La parte cliente del DBMS
ejecuta los comandos del programa de aplicación e intercambia datos y comandos de
manipulación de datos SQL con la parte servidor del DBMS.
✓ La parte del cliente del sistema (navegador) es de bajo costo o incluso gratuita.
Las principales desventajas de realizar manipulaciones de bases de datos a través de Internet tienen
que ver con la seguridad y la integridad de los datos:
✓ Las tablas de bases de datos que residen en diferentes servidores pueden quedar
desincronizadas.
50 Parte I: Introducción a SQL
Las extensiones de cliente y servidor diseñadas para abordar estas preocupaciones hacen de
Internet un lugar viable para aplicaciones de bases de datos de producción. La arquitectura de
una intranet es similar a la de Internet, pero la seguridad es una preocupación menor. Debido
a que la organización que mantiene la intranet tiene control físico sobre todas las máquinas
cliente, así como sobre los servidores y la red que conecta estos componentes, una intranet
está mucho menos expuesta a los esfuerzos de piratas informáticos malintencionados. Sin
embargo, los errores de entrada de datos y la desincronización de la base de datos siguen
siendo motivo de preocupación.
Capítulo 3
En este capítulo
▶ Creando bases de datos
▶ Manipulación de datos
▶ Proteger bases de datos
✓ El lenguaje de definición de datos (DDL):La parte de SQL que utiliza para crear
(definir completamente) una base de datos, modificar su estructura y destruirla
cuando ya no la necesite.
La propia base de datos contiene catálogos. A veces se hace referencia a la base de datos como
[Link] a mencionar los grupos más adelante en este capítulo, en la sección sobre pedidos
por catálogo.
Bueno no. No exactamente. De hecho, esa es una receta para el desastre. Muchos
proyectos de desarrollo de bases de datos fracasan desde el principio cuando la
emoción y el entusiasmo superan la planificación cuidadosa. Incluso si tienes una idea
clara de cómo estructurar tu base de datos,escribir todo en papelantes de tocar el
teclado.
Aquí es donde el desarrollo de bases de datos tiene cierta semejanza con una partida de
ajedrez. En medio de una partida de ajedrez complicada y competitiva, es posible que veas lo
que parece una buena jugada. La necesidad de dar ese paso puede ser abrumadora. Sin
embargo, es muy probable que te hayas perdido algo. Los grandes maestros aconsejan a los
jugadores más nuevos (sólo en parte en broma) que se queden cruzados de brazos. Si sentarse
sobre las manos le impide hacer un movimiento imprudente, que así sea: siéntese sobre las
manos. Si estudias la posición un poco más,
Capítulo 3: Los componentes de SQL 53
Podrías encontrar un movimiento aún mejor, o incluso podrías ver un contraataque brillante
que tu oponente pueda realizar. Lanzarse a crear una base de datos sin suficiente previsión
puede llevar a una estructura de base de datos que, en el mejor de los casos, no sea óptima.
En el peor de los casos, podría ser desastroso, una invitación abierta a la corrupción de datos.
Sentarse sobre las manos probablemente no ayude, perovoluntadayúdelo a tomar un lápiz
en una de esas manos y comenzar a mapear su plan de base de datos en papel. Para obtener
ayuda para decidir qué incluir en su plan, consulte mi libro Desarrollo de bases de datos para
principiantes,que cubre la planificación en profundidad.
✓ Asegúrese de que cada tabla de la base de datos tenga al menos una columna
en común con (al menos) otra tabla de la base de datos. Estas columnas
compartidas sirven como vínculos lógicos que le permiten relacionar la
información de una tabla con la información correspondiente de otra tabla.
✓ Pon cada mesa entercera forma normal(3NF) o mejor para garantizar la prevención de
anomalías de inserción, eliminación y actualización. (Hablo de la normalización de bases
de datos en el Capítulo 5.)
Después de completar el diseño en papel y verificar que esté bien, estará listo para
transferir el diseño a la computadora. Puedes hacer este poco de magia escribiendo
SQLCREARdeclaraciones. Lo más probable es que utilice la interfaz gráfica de
usuario (GUI) de su DBMS para crear los elementos de su diseño. Si utiliza una GUI,
su DBMS convertirá su entrada "bajo las sábanas" en SQL.
Creando tablas
Una tabla de base de datos se parece mucho a una tabla de hoja de cálculo: una matriz
bidimensional formada por filas y columnas. Puedes crear una tabla usando SQL. CREAR
MESAdominio. Dentro del comando, especifica el nombre y el tipo de datos de cada
columna.
Después de crear una tabla, puede comenzar a cargarla con datos. (La carga
de datos es una función DML, no DDL). Si los requisitos cambian, puede
cambiar la estructura de una tabla utilizando elALTERAR TABLAdominio. Si una
tabla deja de ser útil o se vuelve obsoleta, puedes eliminarla con elGOTA
dominio. Las diversas formas de laCREARyALTERARcomandos, junto con el
GOTA comando, cree el DDL de SQL.
54 Parte I: Introducción a SQL
Suponga que es diseñador de bases de datos y no quiere que las tablas de su base de datos se
conviertan en guacamole a medida que realiza actualizaciones con el tiempo. Decide estructurar las
tablas de su base de datos de acuerdo con la mejor forma normalizada para poder mantener la
integridad de los datos.
Normalización,Un extenso campo de estudio por derecho propio, es una forma de estructurar
tablas de bases de datos para que las actualizaciones no introduzcan anomalías. Cada tabla
que crea contiene columnas que corresponden a atributos que están estrechamente
vinculados entre sí.
Puede, por ejemplo, crear una tabla CLIENTE con los atributos [Link] de
Cliente, [Link], [Link], [Link], [Link],
[Link], CLIENTE. Código postal,[Link]é[Link] estos atributos
están más estrechamente relacionados con la entidad del cliente que con cualquier
otra entidad en una base de datos que pueda contener muchas tablas. Estos
atributos contienen toda la información relativamente permanente del cliente que
su organización mantiene archivada.
La Figura 3-1 muestra una parte de la tabla CLIENTE con algunos datos de muestra.
Figura 3-1:
Utilizar el
CREAR
TABLA com-
mando a
crear esto
CLIENTE
mesa.
Avistaes una mesa virtual. En la mayoría de las implementaciones, una vista no tiene existencia
física independiente. La definición de la vista existe sólo en los metadatos de la base de datos,
pero los datos provienen de la tabla o tablas de las que deriva la vista. Los datos de la vista no
se duplican físicamente en ningún otro lugar del almacenamiento en disco en línea. Algunas
vistas constan de columnas y filas específicas de una sola tabla. Otros, conocidos comovistas
de varias mesas,dibujar de dos o más mesas.
Figura 3-2:
tu derivas
el NH_
vista PERSONALIZADA
desde el
CLIENTE
mesa.
Este código es correcto, pero un poco prolijo. Puede realizar la misma tarea
escribiendo menos si su implementación de SQL supone que todas las referencias
de tablas son las mismas que las del archivoDEcláusula. Si su sistema hace esa
suposición predeterminada razonable, puede reducir la declaración a las
siguientes líneas:
Aunque la segunda versión es más fácil de escribir y leer, es más vulnerable a las
interrupciones causadas porALTERAR TABLAcomandos. Tal interrupción no es un
problema para este caso simple, que no tieneUNIRSE,pero vistas conUNIRSELos s son
más sólidos cuando utilizan nombres completos. yo cubroUNIRSEs en el Capítulo 11.
La base de datos de esta tienda de artículos deportivos contiene cuatro tablas: CLIENTE,
PRODUCTO, FACTURA e INVOICE_LINE. Las tablas están estructuradas como se muestra en la
Tabla 3-1.
Capítulo 3: Los componentes de SQL 57
Observe que algunas de las columnas de la Tabla 3-1 contienen la restricciónNO NULO.
Estas columnas son las claves principales de sus respectivas tablas o columnas que
usted decidadebecontener un valor. La clave principal de una tabla debe identificar de
forma única cada fila. Para hacer eso, la clave principal debe contener un valor no nulo
en cada fila. (Hablo de las claves en detalle en el Capítulo 5.)
58 Parte I: Introducción a SQL
Figura 3-3:
Un deporte-
bienes
historias
base de datos
estructura.
La tabla CLIENTE se vincula a la tabla FACTURA por el común Identificación del cliente
columna. La tabla INVOICE se vincula a la tabla INVOICE_LINE por el comúnNúmero
de facturacolumna. La tabla PRODUCTO se vincula a la tabla INVOICE_LINE por el
comúnID del Productocolumna. Estos enlaces son los que hacen de esta base de
datos unarelacionalbase de datos.
Figura 3-4:
Creando
un multi-
vista de tabla
mediante el uso
Uniones.
Es posible crear una vista de varias tablas con una única declaración SQL. Sin embargo,
si cree que una o todas las declaraciones anteriores son complejas, imagine cuán
compleja sería una sola declaración que cumpliera todas sus funciones. Tiendo a preferir
la simplicidad a la complejidad, por eso, siempre que es posible, elijo la forma más
sencilla de realizar una función, incluso si no es la más "eficiente".
Capítulo 3: Los componentes de SQL 61
Una base de datos también tiene unesquema fisico—que representa la disposición física
de los datos y sus elementos asociados (como índices) en los dispositivos de
almacenamiento del sistema. Cuando menciono "el esquema" de una base de datos, me
refiero al esquema lógico, no al esquema físico.
En un sistema donde pueden coexistir varios proyectos no relacionados, puede asignar todas
las tablas relacionadas a un esquema. Puede recopilar otros grupos de tablas en sus propios
esquemas.
CATALOG_NAME.SCHEMA_NAME.TABLE_NAME
62 Parte I: Introducción a SQL
Como los catálogos se identifican por su nombre, puede tener varios catálogos en una
base de datos. Cada catálogo puede tener varios esquemas y cada esquema puede
tener varias tablas. Por supuesto, cada tabla puede tener varias columnas y filas. Las
relaciones jerárquicas se muestran en la Figura 3-5.
Figura 3-5:
La hier-
archico
estructura
de un típico
datos SQL-
base.
✓ CREAR:Utilice las diversas formas de esta declaración para construir las estructuras
esenciales de la base de datos.
CREAR
Puedes aplicar el SQLCREARdeclaración a una gran cantidad de objetos SQL, incluidos
esquemas, dominios, tablas y vistas. Al utilizar elCREAR ESQUEMA declaración, no sólo
puede crear un esquema, sino también identificar a su propietario y especificar un juego
de caracteres predeterminado. Aquí hay un ejemplo de tal declaración:
ALTERAR
Después de crear una tabla, no necesariamente estarás atrapado en esa tabla exacta
para siempre. A medida que utiliza la mesa, puede descubrir que no es todo lo que
necesita. Puedes usar elALTERAR TABLAdeclaración para cambiar la tabla agregando,
cambiando o eliminando una columna en la tabla. Además de las tablas, también
puedesALTERARcolumnas y dominios.
64 Parte I: Introducción a SQL
GOTA
Eliminar una tabla de un esquema de base de datos es fácil. Sólo usa unTABLA DE CAÍDA <
nombre de la tabla>declaración. Borra todos los datos de la tabla, así como los metadatos
que definen la tabla en el diccionario de datos. Es casi como si la mesa nunca hubiera
existido. También puedes utilizar elGOTAdeclaración para deshacerse de cualquier cosa
que haya sido creada por unCREARdeclaración.
GOTAno funcionará si rompe la integridad referencial. Más adelante en este capítulo analizo la
integridad referencial.
Si una declaración DML incluye múltiples expresiones, cláusulas, predicados (más sobre
ellos más adelante en este capítulo) o subconsultas, comprender lo que esa declaración
intenta hacer puede ser un desafío. Después de lidiar con algunas de estas afirmaciones,
incluso puede considerar cambiar a una línea de trabajo más sencilla, como la cirugía
cerebral o la electrodinámica cuántica. Afortunadamente, una acción tan drástica no es
necesaria. Puede comprender sentencias SQL complejas dividiéndolas en sus
componentes básicos y analizándolas fragmento a fragmento.
Expresiones de valor
Puedes usarexpresiones de valorcombinar dos o más valores. Existen varios tipos de
expresiones de valor, correspondientes a los diferentes tipos de datos:
Capítulo 3: Los componentes de SQL sesenta y cinco
✓ Numérico
✓ Cadena
✓ Fecha y hora
✓ Intervalo
✓ Booleano
✓ Usuario definido
✓ Fila
✓ Recopilación
Los tipos booleano, definido por el usuario, fila y colección se introdujeron con SQL:1999.
Es posible que algunas implementaciones no las admitan todas todavía. Si desea utilizar
estos tipos de datos, asegúrese de que su implementación incluya los que desea utilizar.
12 – 7
15/3 - 4
6* (8+2)
Los valores en estos ejemplos sonliterales numé[Link] valores también pueden ser nombres de
columnas, parámetros, variables del lenguaje principal o subconsultas, siempre que esos nombres de
columnas, parámetros, variables del lenguaje principal o subconsultas se evalúen como un valor
numérico. Los siguientes son algunos ejemplos:
Los dos puntos en el último ejemplo indican que el siguiente término (meses)es un
parámetro o una variable del lenguaje principal.
Expresión Resultado
Una biblioteca puede utilizar dicha expresión para determinar cuándo enviar un aviso
de retraso. El siguiente ejemplo especifica una hora en lugar de una fecha:
ElEN LOCALLas palabras clave indican que la hora se refiere a la zona horaria local.
Si esta fuera una condición para la recuperación de filas de una tabla de estudiantes, solo se
recuperarían las filas que contienen los registros de los estudiantes del último año. Para
recuperar los registros de todos los no mayores, puede utilizar lo siguiente:
Para recuperar cada fila que tiene un valor nulo en elCLASEcolumna, uso
Describo los tipos de datos definidos por el usuario en el Capítulo 2. Si es necesario, puede definir sus
propios tipos de datos en lugar de tener que conformarse con los proporcionados por SQL “stock”.
Las expresiones que incorporan elementos de datos de un tipo definido por el usuario deben
evaluarse como un elemento del mismo tipo.
Esta es una fila en una tabla de profesores que muestra el nombre, el rango y el año de contratación de un miembro
de la facultad.
Predicados
Predicadosson equivalentes SQL de proposiciones lógicas. La siguiente
afirmación es un ejemplo de proposición:
En el ejemplo anterior, solo las dos primeras entradas de la Tabla 3-3 (Clase = MAYORyClase
<> SÉNIOR)tener [Link] DE SEGUNDO AÑOse considera mayor queSÉNIOR
porqueENTONCESviene despuésSEen la secuencia de clasificación predeterminada, que
clasifica en orden alfabético ascendente. Sin embargo, esta interpretación probablemente
no sea la que usted desea.
Capítulo 3: Los componentes de SQL 69
Conectivos lógicos
Conectivos lógicosLe permitirá construir predicados complejos a partir de predicados simples.
Digamos, por ejemplo, que desea identificar niños prodigio en una base de datos de
estudiantes de secundaria. Dos proposiciones que podrían identificar a estos estudiantes
podrían leerse como sigue:
Puedes usar el conectivo ló[Link] crear un predicado compuesto que aísle los
registros de estudiantes que desee, como en el siguiente ejemplo:
Si usas elYconectivo, ambos predicados componentes deben ser verdaderos para que el
predicado compuesto sea verdadero. Utilizar elOconectivo cuando desea que el
predicado compuesto se evalúe como verdadero si cualquiera de los predicados
componentes es [Link] el tercer conectivo lógico. Estrictamente hablando,NO
no conecta dos predicados, sino que invierte el valor de verdad del predicado único al
que lo aplica. Tomemos, por ejemplo, la siguiente expresión:
NO (Clase = SENIOR)
Establecer funciones
A veces, la información que desea extraer de una tabla no se relaciona con filas
individuales sino con conjuntos de filas. SQL proporciona cincocolocar(oagregar)
funcionespara hacer frente a este tipo de situaciones. Estas funciones sonCUENTA,
MÁXIMO, MIN, SUMA,[Link] función realiza una acción que extrae datos de
un conjunto de filas en lugar de una sola fila.
CONTAR
ElCONTARLa función devuelve el número de filas de la tabla especificada. Para contar el
número de personas mayores precoces en mi base de datos de ejemplo de escuela secundaria,
utilice la siguiente declaración:
MÁXIMO
Esta declaración devuelve todos los estudiantes cuyas edades son iguales a la edad
máxima. Es decir, si la edad del estudiante mayor es 23 años, esta declaración devuelve
el nombre, apellido y la edad de todos los estudiantes que tienen 23 años.
MÍNIMO
Esta consulta devuelve todos los estudiantes cuya edad es igual a la edad del estudiante más
joven.
SUMA
ElSUMALa función suma los valores de una columna especificada. La columna debe ser uno de
los tipos de datos numéricos y el valor de la suma debe estar dentro del rango de ese tipo. Por
lo tanto, si la columna es del tipoPEQUEÑO,la suma no debe ser mayor que el límite superior de
laPEQUEÑOtipo de datos. En la base de datos minorista de este capítulo, la tabla FACTURA
contiene un registro de todas las ventas. Para encontrar el valor total en dólares de todas las
ventas registradas en la base de datos, utilice elSUMAfuncionar de la siguiente manera:
AVG
ElAVGLa función devuelve el promedio de todos los valores de la columna
especificada. Al igual que elSUMAfunción,AVGse aplica sólo a columnas con un
Capítulo 3: Los componentes de SQL 71
tipo de datos numéricos. Para encontrar el valor de la venta promedio, considerando todas las
transacciones en la base de datos, use elAVGfuncionar así:
Los nulos no tienen valor, por lo que si alguna de las filas delVenta totalLa columna
contiene valores nulos, esas filas se ignoran en el cálculo del valor de la venta
promedio.
Subconsultas
Subconsultas,Como puede ver en la sección "Establecer funciones" anteriormente en este
capítulo, son consultas dentro de una consulta. En cualquier lugar donde pueda usar una
expresión en una declaración SQL, también puede usar una subconsulta. Las subconsultas
son herramientas poderosas para relacionar información de una tabla con información de
otra tabla; puedes incrustar (onido) una consulta en una tabla, dentro de una consulta en otra
tabla. Al anidar una subconsulta dentro de otra, permite el acceso a información de dos o más
tablas para generar un resultado final. Cuando utiliza las subconsultas correctamente, puede
recuperar casi cualquier información que desee de una base de datos. No se preocupe por
cuántos niveles de subconsultas admite su base de datos. Cuando comience a crear
subconsultas anidadas, se quedará sin comprender lo que está haciendo mucho antes de que
su base de datos se quede sin niveles de subconsultas que admite.
Actas
Su base de datos es más vulnerable a sufrir daños mientras usted u otra persona la modifica. Incluso
en un sistema de usuario único, realizar un cambio puede resultar peligroso para una base de datos.
Si se produce una falla de software o hardware mientras el cambio está en progreso, una base de
datos puede quedar en un estado indeterminado que se encuentra en algún lugar entre donde
estaba antes de que comenzara la operación de cambio y donde estaría si la operación de cambio se
completara exitosamente.
72 Parte I: Introducción a SQL
SQL protege su base de datos restringiendo las operaciones que pueden cambiar la base de
datos para que puedan ocurrir solo dentro de las transacciones. Durante una transacción, SQL
registra cada operación realizada con los datos en un archivo de registro. Si algo interrumpe la
transacción antes delCOMPROMETERSEdeclaración finaliza la transacción, puede restaurar el
sistema a su estado original emitiendo unRETROCEDER declaración. ElRETROCEDERprocesa el
registro de transacciones a la inversa, deshaciendo todas las acciones que tuvieron lugar en la
transacción. Después de revertir la base de datos a su estado antes de que comenzara la
transacción, puede solucionar lo que haya causado el problema e intentar la transacción
nuevamente.
Al poner todas las operaciones que afectan a la base de datos en transacciones, puede
aislar las acciones de un usuario de las de otro. Este aislamiento es fundamental si
desea asegurarse de que los resultados que obtenga de la base de datos sean
precisos.
Puede surgir otro problema si Donna escribe en un registro y luego David lee ese
registro. Si Donna revierte su transacción, David no se da cuenta de la reversión y
basa sus acciones en el valor que leyó, que no refleja el valor que hay en la base de
datos después de la reversión. Esto suena como la trama de un episodio deAmo a
Lucy—es una buena comedia pero una pésima gestión de datos.
Capítulo 3: Los componentes de SQL 73
Usuarios y privilegios
Otra amenaza importante para la integridad de los datos son los propios usuarios. Algunas
personas no deberían tener acceso a los datos. Otros deberían tener sólo acceso restringido a
algunos de los datos pero ningún acceso al resto. Algunos (pista:nomuchísimos) deberían tener
acceso ilimitado a todo lo que hay en la base de datos. Necesita un sistema para clasificar
usuarios y asignar privilegios de acceso a los usuarios en diferentes categorías.
✓ Mesas
✓ columnas
✓ Puntos de vista
✓ Dominios
✓ Conjuntos de caracteres
✓ colaciones
✓ Traducciones
Si una tabla de una base de datos contiene como clave externa una columna que es una
clave principal en otra tabla de la base de datos, puede agregar una restricción a la
primera tabla para que haga referencia a la segunda tabla. (El Capítulo 5 describe
74 Parte I: Introducción a SQL
claves externas.) Cuando una tabla hace referencia a otra, un usuario de la primera
tabla puede deducir información sobre el contenido de la segunda. Como propietario
de la segunda mesa, es posible que desee evitar este tipo de espionaje. El REFERENCIAS
DE SUBVENCIÓNLa declaración te da ese poder. La siguiente sección analiza el
problema de una referencia renegada y cómo laREFERENCIAS DE SUBVENCIÓN
declaración lo impide. Al utilizar elUSO DE CONCESIONESdeclaración, puede controlar
quién puede usar (o incluso ver) el contenido de un dominio, juego de caracteres,
intercalación o traducción. (Cubro las disposiciones de seguridad en el Capítulo 14.)
La Tabla 3-4 resume las sentencias SQL que se utilizan para otorgar y revocar
privilegios.
CONCEDER SELECCIONAR
EN EL CLIENTE
AL ADMINISTRADOR_VENTAS;
El ejemplo anterior permite que una persona (el gerente de ventas) vea la
tabla CLIENTE.
El siguiente ejemplo permite a cualquier persona con acceso al sistema ver la lista de precios
minoristas:
CONCEDER SELECCIONAR
EN RETAIL_PRICE_LIST
AL PÚBLICO;
ACTUALIZACIÓN DE LA SUBVENCIÓN
EN RETAIL_PRICE_LIST
AL ADMINISTRADOR_VENTAS;
El siguiente ejemplo permite al gerente de ventas agregar nuevas filas a la lista de precios
minoristas:
INSERCIÓN DE SUBVENCIÓN
EN RETAIL_PRICE_LIST
AL ADMINISTRADOR_VENTAS;
Ahora, gracias a este último ejemplo, el gerente de ventas también puede eliminar filas
no deseadas de la tabla:
CONCEDER ELIMINAR
EN RETAIL_PRICE_LIST
AL GERENTE DE VENTAS;
Una base de datos relacional correctamente diseñada tieneintegridad referencial,lo que significa que
los datos de una tabla de la base de datos son coherentes con los datos de todas las demás tablas.
Para garantizar la integridad referencial, los diseñadores de bases de datos aplican restricciones a las
tablas que restringen los datos que los usuarios pueden ingresar en las tablas. Pero aquí está la
desventaja de esa protección: si tiene una base de datos con restricciones de integridad referencial,
un usuario posiblemente pueda crear una nueva tabla que utilice una columna de una tabla
confidencial como clave externa. Esa columna sirve entonces como enlace a través del cual alguien
posiblemente pueda robar información confidencial. Ups.
Digamos, por ejemplo, que es un famoso analista bursátil de Wall Street. Mucha gente
cree en la precisión de sus selecciones de acciones, por lo que cada vez que recomienda
una acción a sus suscriptores, mucha gente la compra y su valor aumenta. Mantiene su
análisis en una base de datos, que contiene una tabla llamadaCUATRO [Link]
principales recomendaciones para su próximo boletín se encuentran en esa tabla.
Naturalmente, usted restringe el acceso aCUATRO ESTRELLASpara que esa noticia no se
filtre al público inversor antes de que sus suscriptores de pago reciban el boletín.
Sin embargo, sigues siendo vulnerable si alguien más puede crear una nueva tabla que utilice el
campo de nombre de acción deCUATRO ESTRELLAScomo clave externa, como se muestra en el
siguiente ejemplo de comando:
El hacker ahora puede intentar insertar en la tabla el nombre de cada acción de la Bolsa
de Nueva York, la Bolsa de Valores de Estados Unidos y el NASDAQ. Las inserciones que
tienen éxito le dicen al hacker qué acciones coinciden con las acciones que usted nombra
en su tabla confidencial. El hacker no tarda mucho en extraer su lista completa de
acciones.
Claramente estoy exagerando aquí. Nunca otorgarías ningún tipo de acceso a una tabla
crítica a una persona que no sea de confianza, ¿verdad? No si te diste cuenta de lo que
estabas haciendo. Sin embargo, los hackers actuales no sólo son inteligentes
técnicamente. También son maestros deIngeniería social,el arte de engañar a las
personas para que hagan lo que normalmente no harían. Aumente la alerta máxima
cada vez que alguien mencione algo relacionado con su información confidencial.
Capítulo 3: Los componentes de SQL 77
Evite otorgar privilegios a personas que puedan abusar de ellos. Es cierto que la gente
no viene con garantías impresas en la frente. Pero si no le prestarías tu coche nuevo a
una persona para un viaje largo, probablemente no deberías concederle la REFERENCIAS
privilegio en una mesa importante.
El ejemplo anterior ofrece una buena razón para mantener un control cuidadoso de
laREFERENCIASprivilegio. Aquí hay otras dos razones por las que debería mantener
un control cuidadoso deREFERENCIAS:
ACTUALIZACIÓN DE LA SUBVENCIÓN
EN RETAIL_PRICE_LIST
A SALES_MANAGER CON OPCIÓN DE CONCESIÓN;
En este capítulo
▶ Usar RAD para crear, cambiar y eliminar una tabla de base de datos
▶ Usar SQL para crear, cambiar y eliminar una tabla de base de datos
▶ Migrar su base de datos a otro DBMS
En este capítulo, lo guiaré a través del proceso de uso de una herramienta RAD para crear,
modificar y eliminar una tabla simple, y luego analizo cómo crear, alterar y eliminar la
misma tabla usando SQL.
✓ Nombre de pila
✓ Apellido
✓ DIRECCIÓN
✓ Ciudad
✓ Estado o Provincia
Capítulo 4: Creación y mantenimiento de una estructura de base de datos simple 83
✓ Código Postal
✓ Teléfono
✓ Negocios o caridad
Decide colocar todos los elementos enumerados en una única tabla de base de datos;
no necesitas algo elaborado.
Figura 4-1:
El
microsoft
Acceso
apertura
pantalla.
Su hoja de datos de Access está lista para que usted comience a ingresar datos en la Tabla 1,
la primera tabla de su base de datos, como se muestra en la Figura 4-2. Puede cambiar el
nombre de la tabla por algo más significativo más adelante. Access le da a su nueva base de
datos el nombre predeterminadoBase de datos1 (oBase de datos31si ya creó 30 bases de
datos y no se molestó en darles nombres significativos). Es mejor darle a la base de datos un
nombre significativo desde el principio para evitar confusiones.
Figura 4-2:
El
Ficha de datos
ver en el
Acceso
desarrollo
ambiente.
Ese es el método de empezar desde cero, pero tiene varias formas diferentes de crear
una tabla de base de datos de Access. El siguiente usa la vista Diseño.
1. Con Access abierto en la vista Hoja de datos (la opción predeterminada), haga clic en la
pestaña Inicio en la cinta y luego haga clic en Ver debajo del icono en la esquina superior
izquierda de la ventana. Elija Vista de diseño en el menú desplegable.
Cuando elige Vista Diseño, aparece un cuadro de diálogo que le pide que ingrese un
nombre de tabla.
Traducido del inglés al español - [Link]
Figura 4-3:
El diseño
inicio de la vista-
pantalla de inicio.
Observe que la ventana está dividida en áreas funcionales. Dos de ellos son
especialmente útiles para crear tablas de bases de datos:
• Panel Propiedades de campo:En esta área para definir campos de base de datos, el
cursor parpadea en la columna Nombre de campo de la primera fila. Access sugiere que
especifique una clave principal aquí, asígnele un nombreIDENTIFICACIÓN, y dale el
Número automáticotipo de datos.
Figura 4-4:
Usando un
descriptivo
nombre del campo
para definir el
Clave primaria.
Como suele ser el caso, las suposiciones que hace Access están bien para lo
que desea hacer. Si alguna de las suposiciones es incorrecta, puede anularla
ingresando nuevos valores.
5. Especifique el resto de campos que desea que tenga esta tabla.
La Figura 4-5 muestra la vista Diseño después de haber ingresado alNombre de pilacampo.
Capítulo 4: Creación y mantenimiento de una estructura de base de datos simple 87
Figura 4-5:
La mesa-
creación
ventana
después
Nombre de pila
ha sido
definido.
Para obtener un resumen de por qué es una buena idea, consulte la barra lateral
adjunta, "Pensar en el futuro al diseñar su mesa".
88 Parte II: Uso de SQL para crear bases de datos
Figura 4-6:
La mesa-
creación
ventana
después
Apellido
ha sido
definido.
Capítulo 4: Creación y mantenimiento de una estructura de base de datos simple 89
Figura 4-7:
La mesa-
creación
ventana
después de todo
definido.
Como puede ver en la Figura 4-7, el campo para empresas o organizaciones benéficas
(Negocios o Caridad)no está indexado. No tiene sentido indexar un campo que sólo
tiene dos entradas posibles; la indexación no reduce la selección lo suficiente como
para que valga la pena.
90 Parte II: Uso de SQL para crear bases de datos
Si está creando una base de datos para su propio uso, las deficiencias en su estructura
inevitablemente se hacen [Link]ésusted crea la estructura (probablemente sea una
cláusula de la Ley de Murphy). Por ejemplo, supongamos que comienza a recibir propuestas de
otros países y necesita agregar unPaíscolumna. O tiene una base de datos antigua que no
incluía direcciones de correo electrónico: es hora de actualizarla. En esta sección, le muestro
cómo usar Access para modificar una tabla. Otras herramientas RAD tienen capacidades
comparables y funcionan de manera similar.
Si llega un momento en el que necesita actualizar las tablas de su base de datos, tómese un
momento para evaluar todos los campos que están utilizando. Por ejemplo, también puedes
agregar un segundoDIRECCIÓNcampo para personas con direcciones complejas y unPaís
campo para propuestas de otros países.
Aunque es bastante fácil actualizar las tablas de la base de datos, debes evitar hacerlo
siempre que sea posible. Es probable que cualquier aplicación que dependa de la
antigua estructura de la base de datos se rompa y deberá repararse. Si tiene muchas
aplicaciones, esta tarea podría ser una tarea importante. Trate de anticipar ampliaciones
que podrían ser necesarias en el futuro y tome medidas para ello. Que lleva
Capítulo 4: Creación y mantenimiento de una estructura de base de datos simple 91
Por lo general, es preferible realizar un poco de sobrecarga adicional en la base de datos que
actualizar una gran cantidad de aplicaciones escritas hace varios años. Probablemente hace mucho
que no se sabe cómo funcionan y es posible que, en esencia, no se puedan solucionar.
Para insertar nuevas filas y acomodar cambios, abra la tabla y siga estos
pasos:
Aparece una fila en blanco encima de la posición del cursor y empuja hacia abajo todas las filas
existentes, como se muestra en la Figura 4-8.
Figura 4-8:
La mesa-
creación
ventana
después de abrir-
subiendo
espacio para
un segundo
DIRECCIÓN
línea.
Figura 4-9:
Tu revisado
definición de tabla
ción debería
parece similar
a esto.
Creando un índice
En cualquier base de datos, necesita una forma rápida de acceder a los registros
de interés. (Esto nunca es más cierto que cuando gana la lotería: la cantidad de
propuestas de inversión y caridad que recibe fácilmente podría llegar a miles).
Digamos, por ejemplo, que desea ver todas las propuestas de personas que dicen
ser su hermano. . Suponiendo que ninguno de tus hermanos haya cambiado su
apellido por motivos teatrales o profesionales, puedes aislar estas ofertas basando
tu recuperación en el contenido delApellidocampo, como se muestra en la
siguiente consulta SQL ad hoc:
Es posible que esa estrategia no funcione para las propuestas hechas por medios hermanos y
cuñados, por lo que es necesario mirar en un campo diferente, como se muestra en el siguiente
ejemplo:
SQL escanea la tabla fila por fila, buscando entradas que satisfagan lasDÓNDE condición
de la cláusula. Si la tabla POWER es grande (decenas de miles de registros), es posible
que termine esperando un rato. Puedes acelerar las cosas aplicandoíndices a la tabla
POTENCIA. (Uníndicees una tabla de punteros. Cada fila del índice apunta a una fila
correspondiente en la tabla de datos).
Puede definir un índice para todas las diferentes formas en que desee acceder a sus
datos. Si agrega, cambia o elimina filas en la tabla de datos, no necesita volver a ordenar
la tabla; solo necesita actualizar los índices. Puede actualizar un índice mucho más rápido
de lo que puede ordenar una tabla. Después de establecer un índice con el orden
deseado, puede utilizar ese índice para acceder a las filas de la tabla de datos casi
instantáneamente.
Porque elNúmero de propuestaEl campo es único y breve; utilizar ese campo es la forma más
rápida de acceder a un registro individual. Esas cualidades lo convierten en un candidato ideal
para una clave primaria. Y como las claves primarias suelen ser la forma más rápida de acceder
a los datos,la clave principal de todas y cada una de las tablas siempre debe estar indexada;
Acceda a las claves primarias de los índices automáticamente. Sin embargo, para utilizar este
campo, debe conocer elNúmero de propuestadel registro que deseas. Es posible que desee
crear índices adicionales basados en otros campos, comoApellido, Código Postal,oCómo
[Link] una tabla en la que indexaApellido,después de una búsqueda se encuentra la
primera fila que contiene unApellidodeMarx,la búsqueda los ha encontrado a todos. Las claves
de índice para todos losmarxLas filas se almacenan una tras otra. puedes recuperarChico,
Groucho, Harpo, Zeppo,ycarloscasi tan rápido como se pueden obtener los datoschicosolo.
Los índices añaden una sobrecarga a su sistema, lo que ralentiza las operaciones. Debe
equilibrar esta desaceleración con la velocidad que obtiene al acceder a los registros a través
de un índice.
✓ Siempre es una buena idea indexar los campos que utiliza con frecuencia para acceder a los
registros. Puede acceder rápidamente a los registros sin demasiada latencia.
La eficacia de un índice varía de una implementación a otra. Si migra una base de datos
de una plataforma a otra, es posible que los índices que ofrecieron el mejor rendimiento
en el primer sistema no funcionen mejor en la nueva plataforma. De hecho, el
rendimiento puede ser peor que si no hubiera indexado la base de datos en absoluto.
Pruebe varios esquemas de indexación para ver cuál le brinda la
94 Parte II: Uso de SQL para crear bases de datos
mejor rendimiento general y optimice sus índices para que ni la velocidad de recuperación ni la
velocidad de actualización se vean afectadas por la migración.
Para crear índices para la tabla POWER, simplemente seleccione Sí para Indexado en el panel
Propiedades de campo de la ventana de creación de tablas.
Access hace dos trucos útiles automáticamente: crea un índice para Código Postal (
porque ese campo se usa a menudo para recuperaciones)yindexa la clave principal.
(Ah, progreso. Me encanta).
Después de crear todos sus índices, no olvide guardar la nueva estructura de la tabla
antes de cerrarla.
Si utiliza una herramienta RAD que no sea Microsoft Access, la información de esta
sección no se aplica a usted. Sin embargo, el proceso general es bastante similar.
Seren realidadseguro de lo que estás haciendo. Cuando haces clic en Eliminar, esa tabla y todo el
trabajo que pusiste en ella desaparecerán.
Figura 4-10:
Seleccionar
Eliminar a
eliminar un
mesa.
Capítulo 4: Creación y mantenimiento de una estructura de base de datos simple 95
Si Access elimina una tabla, también elimina todas las tablas subsidiarias, incluidos los
índices que pueda tener la tabla.
En las siguientes secciones, uso SQL para crear la misma tabla que antes y luego hago las
mismas operaciones de alteración y eliminación que hice con la herramienta RAD en la
primera parte de este capítulo.
1. Abra su base de datos y haga clic en la pestaña CREAR para mostrar la cinta en la
parte superior de la ventana.
3. Seleccione la tabla POTENCIA. Haga clic en el botón Agregar y luego haga clic en el botón Cerrar
para cerrar el cuadro de diálogo.
Aparece una imagen de la tabla POWER y sus atributos en la parte superior del
área de trabajo y debajo aparece una cuadrícula de Consulta por ejemplo
(QBE). Access espera que usted ingrese una consulta ahora usando la
cuadrícula QBE. (Tú podríahágalo, claro, pero no le dirá nada sobre cómo usar
SQL en el entorno de Access).
96 Parte II: Uso de SQL para crear bases de datos
Figura 4-11:
La consulta
pantalla con
FUERZA
mesa
seleccionado.
Figura 4-12:
Los datos-
vistas base
disponible en
Modo de consulta.
5. Haga clic en Vista SQL para mostrar la pestaña Objeto de vista SQL.
Como muestra la Figura 4-13, la pestaña Objeto de vista SQL ha asumido (muy
racionalmente) que desea recuperar cierta información de la tabla POWER,
por lo que ha escrito la primera parte para usted. No sabe exactamente lo que
desea recuperar, por lo que muestra solo la parte en la que se siente seguro.
Capítulo 4: Creación y mantenimiento de una estructura de base de datos simple 97
Figura 4-13:
El objeto
pestaña en SQL
vista.
SELECCIONAR
DEL PODER ;
6. Complete un asterisco (*) en el área en blanco de la primera línea y agregue un
DÓNDEcláusula después de laDElínea.
ingrese si creó la tabla con una herramienta RAD. La diferencia es que la herramienta RAD le
ayuda proporcionándole una interfaz visual, en forma de un cuadro de diálogo de creación de
tablas (o algún esqueleto de entrada de datos similar), y evitando que introduzca nombres,
tipos o tamaños de campos no válidos.
SQL no te brinda tanta ayuda. Debes saber lo que estás haciendo desde el principio;
resolver las cosas a lo largo del camino puede conducir a resultados de base de datos
menos que deseables. Debes ingresar todo elCREAR MESAdeclaración antes de que SQL
siquiera la mire, y mucho menos le dé alguna indicación de si cometió errores en la
declaración.
En el SQL estándar ISO/IEC, la declaración que crea una tabla de seguimiento de propuestas
(idéntica a la creada anteriormente en este capítulo) utiliza la siguiente sintaxis:
En Access 2013, crear objetos de base de datos, como tablas, es un poco más complicado. No puedes
simplemente escribir unCREARdeclaración (como la que se acaba de proporcionar) en la pestaña
Objeto de vista SQL. Esto se debe a que la pestaña Objeto de vista SQL sólo está disponible como
herramienta de consulta; debe realizar algunas acciones adicionales para informar a Access que está a
punto de ingresar una consulta de definición de datos en lugar de una consulta normal que solicita
información de la base de datos. Una complicación adicional: dado que la creación de tablas es una
acción que posiblemente podría comprometer la seguridad de la base de datos, no está permitida de
forma predeterminada. Debe decirle a Access que se trata de una base de datos confiable antes de
que acepte una consulta de definición de datos.
1. Haga clic en la pestaña Crear en la cinta para mostrar los iconos de la funcionalidad
de creación.
Figura 4-14:
Datos-
definición
consulta a
crear un
mesa.
100 Parte II: Uso de SQL para crear bases de datos
7. Después de hacer clic en la pestaña Diseño de la cinta, haga clic en el icono Ejecutar del signo de
exclamación rojo.
Figura 4-15:
He aquí el
POWERSQL
mesa.
10. Haga clic en el botón Configuración del Centro de confianza cuando aparezca.
12. Haga clic para regresar al lugar donde puede ejecutar la consulta de
definición de datos que crea la tabla POWERSQL.
13. Ejecute la consulta.
Ser competente en SQL tiene beneficios a largo plazo porque durará mucho tiempo. Es
probable que el esfuerzo que ponga para convertirse en un experto en una herramienta de
desarrollo en particular genere un menor retorno de la inversión. No importa cuán maravillosa
pueda ser la última herramienta RAD, será reemplazada por tecnología más nueva dentro de
tres a cinco años. Si puedes recuperar tu inversión en la herramienta en ese tiempo, ¡genial!
Úselo. De lo contrario, sería prudente seguir con lo probado y verdadero. Capacite a su gente
en SQL y su inversión en capacitación dará sus frutos durante un período mucho más largo.
Creando un índice
Los índices son una parte importante de cualquier base de datos relacional. Sirven como
indicadores de las tablas que contienen los datos de interés. Al utilizar un índice, puede ir
directamente a un registro en particular sin tener que escanear la tabla secuencialmente, un
registro a la vez, para encontrarlo. Para tablas realmente grandes, los índices son una
necesidad; sin índices, es posible que tengas que esperarañosen lugar de segundos para
obtener un resultado. (Bueno, está bien, tal vez en realidad no esperarías añ[Link] embargo,
algunas recuperaciones pueden tardar ese tiempo si las dejas seguir ejecutándose. A menos
que no tenga nada mejor que hacer con el tiempo de su computadora, probablemente sea
mejor cancelar la recuperación y prescindir del resultado. La vida continua.)
Aunque dos proveedores pueden usar las mismas palabras para el comando (CREAR ÍNDICE),la
forma en que opera el comando puede no ser la misma. Es probable que encuentre bastantes
cláusulas que dependen de la implementación. Estudie detenidamente la documentación de su
DBMS para determinar cómo utilizar ese DBMS en particular para crear índices.
102 Parte II: Uso de SQL para crear bases de datos
Para agregar un segundo campo de dirección a la tabla POWERSQL, use el siguiente comando
DDL:
No es necesario ser un gurú de SQL para descifrar este código. Incluso los supuestos
analfabetos informáticos probablemente puedan resolver esto. El comando modifica una tabla
denominada POWERSQL agregando una columna a la tabla. La columna se llama Dirección 2,es
delCARBONIZARSEtipo de datos y tiene 30 caracteres de longitud. Este ejemplo demuestra con
qué facilidad puede cambiar la estructura de las tablas de la base de datos utilizando
comandos SQL DDL.
SQL estándar proporciona esta declaración para agregar una columna a una tabla y le
permite eliminar una columna existente de manera similar, como en el siguiente código:
¿Qué podría ser más sencillo? Si ustedGOTAuna tabla, borras todos sus datos y
metadatos. No queda ningún vestigio de la mesa. Esto funciona muy bien la mayor parte
del tiempo. La única vez que no es así es si otra tabla en la base de datos hace referencia
a la que está intentando eliminar. Esto se llama unrestricción de integridad referencial.
En tal caso, SQL generará un mensaje de error en lugar de eliminar la tabla.
Capítulo 4: Creación y mantenimiento de una estructura de base de datos simple 103
Eliminar un índice
Si elimina una tabla emitiendo unMESA PLEGABLEcomando, también elimina cualquier
índice asociado con esa tabla. A veces, sin embargo, es posible que desee conservar una
tabla pero eliminarle un índice. El estándar SQL no define un ÍNDICE DE CAÍDAcomando,
pero la mayoría de las implementaciones incluyen ese comando de todos modos. Este
comando resulta útil si su sistema se ralentiza y descubre que sus tablas no están
indexadas de manera óptima. Corregir un problema de índice puede mejorar
drásticamente el rendimiento, lo que hará las delicias de los usuarios que se han
acostumbrado a tiempos de respuesta que recuerdan a verter melaza en un día frío en
Vermont.
Consideraciones de portabilidad
Cualquier implementación de SQL que probablemente utilice puede tener extensiones que le
brinden capacidades que el estándar SQL no cubre. Algunas de estas características pueden
aparecer en la próxima versión del estándar SQL. Otros son exclusivos de una implementación
particular y probablemente estén destinados a permanecer así.
A menudo, las extensiones facilitan la creación de una aplicación que satisfaga sus
necesidades y se sentirá tentado a utilizarlas. Usar las extensiones puede ser su
mejor opción, pero tenga en cuenta las desventajas: si alguna vez desea migrar su
aplicación a otra implementación de SQL, es posible que deba reescribir aquellas
secciones en las que utilizó extensiones que su nuevo entorno no admite.
Cuanto más sepa sobre las implementaciones existentes y las tendencias de desarrollo,
mejores decisiones tomará. Piense en la probabilidad de dicha migración en el futuro y
también en si la extensión que está considerando es exclusiva de su implementación o
está bastante extendida. Dejar de usar una extensión puede ser mejor a largo plazo,
incluso si su uso podría ahorrarle algo de tiempo ahora. Por otro lado, es posible que no
encuentre ningún motivo para no utilizar la extensión. Tu llamada.
104 Parte II: Uso de SQL para crear bases de datos
Capítulo 5
En este capítulo
▶ Decidir qué incluir en una base de datos
▶ Determinar relaciones entre elementos de datos
▶ Vincular tablas relacionadas con claves
▶ Diseño para la integridad de los datos
I En este capítulo, le mostraré un ejemplo de cómo diseñar una base de datos de tablas
múltiples. El primer paso para diseñar cualquier base de datos es identificar qué
incluir y qué no incluir. Los siguientes pasos implican decidir cómo se relacionan entre sí
los elementos incluidos y luego configurar las tablas en consecuencia. También hablo de
cómo utilizarllaves,que le permiten acceder a registros e índices individuales
rápidamente.
Una base de datos debe hacer más que simplemente contener sus datos. También debe
proteger los datos para que no se corrompan. En la última parte de este capítulo, analizo cómo
proteger la integridad de sus [Link]ónes uno de los métodos clave que puede
utilizar para proteger la integridad de una base de datos. Analizo las diversas formas normales
y señalo los tipos de problemas que resuelve la normalización.
Las siguientes secciones analizan estos pasos en detalle, así como también algunos otros
problemas técnicos que surgen durante el diseño de la base de datos.
Puede resultarle útil reunir un equipo diverso de personas que, de una forma u otra, estén
familiarizadas con el sistema que está modelando. Estas personas pueden intercambiar ideas
y responder a las ideas de los demás. Trabajando juntos, probablemente desarrollarán un
conjunto de objetos importantes más completo y preciso que si lo hicieran por su cuenta.
Si espera encontrar un conjunto de reglas que le ayuden a identificar qué objetos deberían
ser tablas y cuáles atributos del sistema pertenecen a qué tablas, piénselo de nuevo: es
posible que tenga algunas razones para asignar un objeto en particular.
Capítulo 5: Creación de una base de datos relacional multitabla 107
atributo a una tabla y otras razones para asignarel mismo atributoa otra
mesa. Debes basar tu juicio en dos objetivos:
Al decidir cómo estructurar las tablas de la base de datos, involucre a los futuros usuarios de la
base de datos, así como a las personas que tomarán decisiones basadas en la información de
la base de datos. Si se le ocurre lo que cree que es una estructura razonable, pero no es
consistente con la forma en que las personas usarán la información, su sistema será, en el
mejor de los casos, frustrante de usar e incluso podría producir información incorrecta, lo cual
es aún peor. . ¡No dejes que esto suceda! Esfuércese mucho en decidir cómo estructurar sus
tablas.
Eche un vistazo a un ejemplo para demostrar el proceso de pensamiento necesario para crear
una base de datos de tablas múltiples. Suponga que acaba de establecer VetLab, un
laboratorio de microbiología clínica que analiza muestras biológicas enviadas por veterinarios.
Desea realizar un seguimiento de varias cosas, incluidas las siguientes:
✓ Clientela
✓ Resultados
Cada una de estas entidades tiene atributos asociados. Cada cliente tiene un nombre,
una dirección y otra información de contacto. Cada prueba tiene un nombre y un cargo
estándar. Cada empleado tiene información de contacto, así como una clasificación
laboral y una tarifa salarial. Para cada pedido, necesita saber quién lo solicitó, cuándo se
solicitó y qué prueba se solicitó. Para cada resultado de prueba, necesita saber el
resultado de la prueba, si los resultados fueron preliminares o finales y el número de
orden de la prueba.
Dirección 1
Dirección 2
Ciudad
Estado
Código Postal
Teléfono
Fax
Persona de contacto
Cargo estándar
EMPLEADO Nombre de empleado
Dirección 1
Dirección 2
Ciudad
Estado
Código Postal
Teléfono de casa
Extensión de oficina
Fecha de contratación
Clasificación de Trabajo
Por hora/Salario/Comisión
PEDIDOS Número de orden
Prueba ordenada
Vendedor responsable
Fecha de orden
Número de orden
Resultado
Fecha reportada
Preliminar/Final
Capítulo 5: Creación de una base de datos relacional multitabla109
Puede crear las tablas definidas en la Tabla 5-1 utilizando una herramienta de desarrollo
rápido de aplicaciones (RAD) o utilizando el lenguaje de definición de datos (DDL) de SQL,
como se muestra en el siguiente código:
Estas tablas se relacionan entre sí mediante los atributos (columnas) que comparten, como se
describe en la siguiente lista:
Si desea que una tabla sirva como parte integral de una base de datos relacional,
vincule esa tabla al menos a otra tabla de la base de datos, utilizando una columna
común. La Figura 5-1 ilustra las relaciones entre las tablas.
Figura 5-1:
Laboratorio Veterinario
base de datos
mesas y
Enlaces.
✓ Cada pedido lo toma un, y solo uno, empleado (o vendedor), pero cada
vendedor puede (y, espera, así lo haga) tomar múltiples pedidos.
✓ Cada orden puede producir varios resultados de prueba preliminares y un
resultado final, pero cada resultado está asociado con una y sólo una orden.
Como puedes ver en el código, el atributo que vincula una tabla con otra puede tener
un nombre diferente en cada tabla. Sin embargo, ambos atributos deben tener tipos
de datos coincidentes. En este punto, no he incluido ninguna restricción de integridad
referencial, con el fin de evitar darle demasiadas ideas a la vez. Abordo la integridad
referencial más adelante en este capítulo, después de haber sentado las bases para
comprenderla.
Las personas que se comunican en inglés americano estándar no son las únicas que utilizan
bases de datos relacionales. Otros idiomas, incluso algunos que utilizan otros conjuntos de
caracteres, funcionan igual de bien. Incluso si sus datos están en inglés, algunas aplicaciones
pueden requerir un juego de caracteres especializado. SQL le permite especificar el juego de
caracteres que desea utilizar. De hecho, puedes utilizar un juego de caracteres diferente para
cada columna de una tabla si es necesario. Esta flexibilidad generalmente no está disponible
en lenguajes distintos de SQL.
A veces codifica datos en una base de datos en un conjunto de caracteres pero desea
procesar los datos en otro conjunto de caracteres. Quizás tenga datos en el juego de
caracteres alemán (por ejemplo), pero su impresora no admite caracteres alemanes que
no estén incluidos en el juego de caracteres ASCII. SQL permitetraducciónde cadenas de
caracteres de un juego de caracteres a otro. Una traducción puede convertir un carácter
en dos, como cuando una ü alemana se convierte en [Link], o cambie los caracteres en
minúscula a mayúsculas. Incluso puedes traducir un alfabeto a otro (por ejemplo, hebreo
a ASCII).
Allavees un atributo (o combinación de atributos) que identifica de forma única una fila
en una tabla. Para acceder a una fila en una base de datos, debe tener alguna forma de
distinguir esa fila de todas las demás. Como las claves deben ser únicas, proporcionan
dicho mecanismo de acceso.
Además, una clave nunca debe contener un valor nulo. Si utiliza claves nulas, es posible
que no pueda distinguir entre dos filas que contienen un campo de clave nula.
En el ejemplo del laboratorio veterinario, puede designar las columnas apropiadas como
claves. En la tabla CLIENTE,Nombre del clientees una buena clave. Esta clave puede distinguir
a cada cliente individual de todos los demás clientes. Por lo tanto, ingresar un valor en esta
columna es obligatorio para cada fila de la [Link] de la prueba yNombre de empleado
hacer buenas claves para las tablas PRUEBAS y EMPLEADOS. Número de ordenyNúmero de
resultadohacer buenas claves para las tablas PEDIDOS y RESULTADOS. Asegúrese de ingresar
un valor único para cada fila.
Claves primarias
AClave primariaes una columna o combinación de columnas en una tabla con valores que
identifican de forma única las filas de la tabla. Para incorporar la idea de claves en la base de
datos VetLab, puede especificar la clave principal de una tabla como
Capítulo 5: Creación de una base de datos relacional multitabla113
tu creas la tabla. En el siguiente ejemplo, una sola columna es suficiente (suponiendo
que todos los clientes de VetLab tengan nombres únicos):
);
Aunque la mayoría de los DBMS le permiten crear una tabla sin una clave principal, todas las
tablas de una base de datos deben tener una. Teniendo esto en cuenta, reemplace elNO
NULOrestricción en todas sus tablas. En mi ejemplo, las tablas PRUEBAS, EMPLEADO,
PEDIDOS y RESULTADOS deben tener elCLAVE PRIMARIArestricción, como en el siguiente
ejemplo:
A veces, ninguna columna de una tabla puede garantizar la unicidad. En tales casos, puede
utilizar unclave compuesta—una combinación de columnas que garantizan la singularidad
cuando se usan juntas. Imaginemos que algunos de los clientes de VetLab son cadenas que
tienen oficinas en varias [Link] del clienteNo es suficiente distinguir entre dos
sucursales de un mismo cliente. Para manejar esta situación, puede definir una clave
compuesta de la siguiente manera:
Como alternativa al uso de una clave compuesta para identificar de forma única un registro,
puede dejar que su DBMS asigne una automáticamente, como lo hace Access al sugerir que el
primer campo en una nueva tabla se llame ID y sea del tipo Autonumeración. Una clave así no
tiene significado en sí misma. Su único propósito es ser un identificador único.
Llaves extranjeras
Aclave externaes una columna o grupo de columnas en una tabla que corresponde o hace
referencia a una clave principal en otra tabla de la base de datos. Una clave externa no tiene
que ser única, pero debe identificar de forma única las columnas de la tabla particular a las
que hace referencia la clave.
Si elNombre del clienteLa columna es la clave principal en la tabla CLIENTE (por ejemplo),
cada fila en la tabla CLIENTE debe tener un valor único en el Nombre del clientecolumna.
Nombre del clientees una clave externa en la tabla PEDIDOS. Esta clave externa
corresponde a la clave principal de la tabla CLIENTE, pero la clave no tiene que ser única
en la tabla PEDIDOS. De hecho, esperas que la clave externano esúnico; Si cada uno de
sus clientes le diera solo un pedido y luego nunca volviera a realizarlo, cerraría el negocio
con bastante rapidez. Espera que muchas filas de la tabla PEDIDOS se correspondan con
cada fila de la tabla CLIENTE, lo que indica que casi todos sus clientes son clientes
habituales.
En este ejemplo, las claves externas en la tabla PEDIDOS vinculan esa tabla con las
claves primarias de las tablas CLIENTE, PRUEBAS y EMPLEADO.
¿Qué es un índice?
Los datos generalmente aparecen en una tabla en el orden en que ingresó originalmente la
información. Es posible que ese orden no tenga nada que ver con el orden en el que
posteriormente desea procesar los datos. Digamos, por ejemplo, que desea procesar su tabla
CLIENTE enNombre del clienteorden. La computadora primero debe ordenar la tabla en
Nombre del clienteorden. Ordenar los datos de esta manera lleva tiempo. Cuanto más grande
sea la tabla, más tardará la clasificación. ¿Qué pasa si tienes una tabla con 100.000 filas? ¿O una
tabla con un millón de filas? En algunas aplicaciones, estos tamaños de mesa no son raros. Los
mejores algoritmos de clasificación tendrían que realizar unos 20 millones de comparaciones y
millones de intercambios para poner la tabla en el orden deseado. Incluso si estás usando una
computadora muy rápida, es posible que no quieras esperar tanto.
Los índices pueden suponer un gran ahorro de tiempo. Uníndicees una subsidiaria omesa
de apoyo que va junto con una tabla de datos. Para cada fila de la tabla de datos, tiene una
fila correspondiente en la tabla de índice. El orden de las filas en la tabla de índice es
diferente.
La tabla 5-2 es un pequeño ejemplo de una tabla de datos para el laboratorio veterinario.
Clínica
Camino
Centro Paddock
avenida
Instituto de Delfines 1002 Unidad Marina Key West Florida
Veterinario de crédito
Granja
116 Parte II: Uso de SQL para crear bases de datos
Aquí las filas no están en orden alfabético porNombre del [Link] hecho, no
están en ningún orden útil. Las filas están simplemente en el orden en que
alguien ingresó los datos.
El índice contiene el campo que forma la base del índice (en este caso, Nombre del
cliente)y un puntero a la tabla de datos. El puntero en cada fila del índice proporciona
el número de fila de la fila correspondiente en la tabla de datos.
Supongamos que tiene una tabla que contiene 1.000.000 de registros (norte=1.000.000),
y procesar cada registro lleva un milisegundo (una milésima de segundo).
Capítulo 5: Creación de una base de datos relacional multitabla 117
Si tiene un índice, procesar la tabla completa toma solo 1000 segundos (menos de
17 minutos). Sin un índice, es necesario recorrer la tabla aproximadamente
1.000.000×20 veces para lograr el mismo resultado. Este proceso tardaría 20.000
segundos, más de cinco horas y media. Creo que estarán de acuerdo en que la
diferencia entre 17 minutos y cinco horas y media es sustancial. Éste es sólo un
ejemplo de la diferencia que hace la indexación en el procesamiento de registros.
Mantener un índice
Después de crear un índice, debe mantenerlo. Afortunadamente, no tiene que
pensar demasiado en el mantenimiento: su DBMS mantiene sus índices
automáticamente, actualizándolos cada vez que actualiza las tablas de datos
correspondientes. Este proceso lleva algo de tiempo extra, pero vale la pena.
Cuando crea un índice y su DBMS lo mantiene, el índice siempre está disponible
para acelerar el procesamiento de datos, sin importar cuántas veces necesite
consultarlo.
El mejor momento para crear un índice es al mismo tiempo que creas su tabla de
datos correspondiente. Si crea el índice temprano y el DBMS comienza a mantenerlo
al mismo tiempo, no necesita sufrir la molestia de crear el índice más adelante; toda
la operación se lleva a cabo en una única y larga sesión. Intente anticipar todas las
formas en que desee acceder a sus datos y luego cree un í[Link] cada
posibilidad.
Es posible que necesites compilar algo como un informe mensual o trimestral que
requiera los datos en un orden extraño que normalmente no necesitas. Cree un índice
justo antes de ejecutar ese informe periódico, ejecute el informe y luego elimine el
índice para que el DBMS no tenga la carga de mantener el índice durante el largo
período entre informes.
118 Parte II: Uso de SQL para crear bases de datos
Las bases de datos pueden experimentar varios tipos de integridad claramente diferentes y
una serie de problemas que pueden afectar la integridad. En las siguientes secciones, analizo
tres tipos de integridad:entidad, dominio,[Link]én analizo algunos de los
problemas que pueden amenazar la integridad de la base de datos.
Integridad de la entidad
Cada tabla de una base de datos corresponde a una entidad en el mundo real. Esa entidad
puede ser física o conceptual, pero en cierto sentido, la existencia de la entidad es
independiente de la base de datos. una mesa tieneintegridad de la entidadsi la tabla es
totalmente consistente con la entidad que modela. Para tener integridad de entidad, una tabla
debe tener una clave principal que identifique de forma única cada fila de la tabla. Sin una
clave principal, no puede estar seguro de que la fila recuperada sea la que desea.
);
ÚNICO (NombreCliente) );
Surgen problemas de integridad del dominio si agrega nuevos datos a una tabla utilizando el
INSERTARdeclaración o laACTUALIZARdeclaración. Puede especificar un dominio para una
columna utilizando unCREAR DOMINIOdeclaración antes de usar esa columna en unCREAR
MESAdeclaración, como se muestra en el siguiente ejemplo, que crea una tabla para los
equipos de béisbol de las grandes ligas:
Integridad referencial
Incluso si cada tabla en su sistema tiene integridad de entidad e integridad de dominio, aún
puede tener un problema debido a inconsistencias en la forma en que una tabla se relaciona
con otra. En la mayoría de las bases de datos de tablas múltiples bien diseñadas, cada tabla
contiene al menos una columna que hace referencia a una columna de otra tabla de la base de
datos. Estas referencias son importantes para mantener la integridad general de la base de
datos. Sin embargo, las mismas referencias posibilitan anomalías en las actualizaciones.
Actualizar anomalíasson problemas que pueden ocurrir después de actualizar los datos en una
fila de una tabla de base de datos. Las siguientes secciones analizan un ejemplo típico y
sugieren cómo abordarlo.
Generalmente, la clave principal de la tabla principal es una columna (o grupo de columnas) que
aparece en la tabla secundaria. Dentro de la tabla secundaria, esa misma columna (o grupo) es una
clave externa. Sin embargo, tenga en cuenta que una clave externa no tiene por qué ser única.
Capítulo 5: Creación de una base de datos relacional multitabla 121
Las anomalías de actualización surgen de varias maneras entre las tablas principal y
secundaria. Un cliente se muda, por ejemplo, y deseas eliminar su información de tu
base de datos. Si ella ya realizó algunos pedidos (que usted registró en la tabla
PEDIDOS), eliminarla de la tabla CLIENTE podría presentar un problema. Tendría
registros en la tabla PEDIDOS (secundaria) para los cuales no tiene registros
correspondientes en la tabla CLIENTE (principal). Pueden surgir problemas similares si
agrega un registro a una tabla secundaria sin realizar la adición correspondiente a la
tabla principal.
Las claves foráneas correspondientes en todas las tablas secundarias deben reflejar cualquier cambio en
la clave principal de una fila en una tabla principal; de lo contrario, se producirá una anomalía de
actualización.
);
);
Es posible que no desee realizar una eliminación en cascada. En su lugar, es posible que desee
cambiar la clave externa de la tabla secundaria a unaNULOvalor. Considere la siguiente variante del
ejemplo anterior:
También puede mantener los datos inconsistentes fuera de una base de datos utilizando uno de estos
métodos:
✓ Negarse a permitir una adición a una tabla secundaria hasta que exista una fila
correspondiente en su tabla [Link] rechaza permitir filas en una tabla
secundaria sin una fila correspondiente en una tabla principal, evita la aparición de filas
"huérfanas" en la tabla secundaria. Este rechazo ayuda a mantener la coherencia entre
las tablas.
Ahora todo lo que tienes que hacer es agregar la información del cumpleaños a cada fila
de la tabla y podrás seguir festejando. (Por cierto,dónde¿Dijiste que trabajas?)
124 Parte II: Uso de SQL para crear bases de datos
Los documentos fuente o archivos de datos que utiliza para completar su base de datos
pueden contener datos incorrectos. Estos datos pueden ser una versión corrupta de los datos
correctos o pueden no ser los datos que desea. Averificación de rangole indica si los datos
tienen integridad de dominio. Este tipo de verificación detecta algunos problemas, pero no
todos. (Por ejemplo, los valores de campo incorrectos que están dentro del rango aceptable,
pero que aún son incorrectos, no se identifican como problemas).
Sus datos de origen pueden ser correctos, pero el operador de entrada de datos puede transcribirlos
incorrectamente. Este tipo de error puede provocar el mismo tipo de problemas que los datos de
entrada incorrectos. Algunas de las soluciones también son las mismas. Las comprobaciones de
alcance ayudan, pero no son infalibles. Otra solución es que un segundo operador valide de forma
independiente todos los datos. Este enfoque es costoso porque la validación independiente requiere
el doble de personas y el doble de tiempo. Pero en algunos casos en los que la integridad de los datos
es fundamental, el esfuerzo y el gasto adicionales pueden resultar valiosos.
Falla mecánica
Si experimenta una falla mecánica, como una falla del disco, los datos de la tabla pueden
destruirse. Unas buenas copias de seguridad son su principal defensa contra este
problema.
Capítulo 5: Creación de una base de datos relacional multitabla 125
Malicia
Considere la posibilidad de que alguien puedadesearpara corromper sus datos. Su primera línea de
defensa contra la corrupción intencional es negar el acceso a la base de datos a cualquier persona
que pueda tener intenciones maliciosas y restringir a los usuarios autorizados para que puedan
acceder solo a los datos que necesitan. Su segunda defensa es mantener copias de seguridad de los
datos en un lugar seguro. Vuelva a evaluar periódicamente las características de seguridad de su
instalación. Ser un poco paranoico no hace daño.
Redundancia de datos
Redundancia de datos—los mismos elementos de datos que surgen en múltiples lugares es un gran
problema con el modelo de base de datos jerárquico, pero el problema también puede afectar a las
bases de datos relacionales. Esta redundancia no sólo desperdicia espacio de almacenamiento y
ralentiza el procesamiento, sino que también puede provocar una corrupción grave de los datos. Si
almacena el mismo elemento de datos en dos tablas diferentes de una base de datos, el elemento de
una de esas tablas puede cambiar mientras que el elemento correspondiente de la otra tabla sigue
siendo el mismo. Esta situación genera una discrepancia y es posible que no tenga forma de
determinar qué versión es la correcta. Ésa es una buena razón para mantener la redundancia de
datos al mínimo.
Aunque es necesaria una cierta cantidad de redundancia para que la clave principal de
una tabla sirva como clave externa en otra, debe intentar evitar la repetición de
cualquier elemento de datos más allá de eso.
Después de eliminar la mayor parte de la redundancia del diseño de una base de datos, es
posible que descubra que el rendimiento ahora es inaceptable. Los operadores suelen utilizar
intencionadamente un poco de redundancia para acelerar el procesamiento. En la base de
datos de VetLab, por ejemplo, la tabla PEDIDOS contiene solo el nombre del cliente para
identificar el origen de cada pedido. Si preparas un pedido, debes unir la tabla PEDIDOS con la
tabla CLIENTE para obtener la dirección del cliente. Si esta unión de tablas hace que el
programa que imprime los pedidos se ejecute demasiado lento, puede decidir almacenar la
dirección del cliente de forma redundante en la tabla PEDIDOS así como en la tabla CLIENTE.
Entonces, al menos, podrá imprimir los pedidos más rápido, pero a costa de ralentizar y
complicar cualquier actualización de la dirección del cliente.
Una práctica común es diseñar inicialmente una base de datos con poca redundancia y con
altos grados de normalización y luego, después de descubrir que las aplicaciones importantes
se ejecutan con lentitud, agregar selectivamente redundancia y desnormalizar. La palabra
clave aquí [Link] redundancia que vuelva a agregar debe tener un propósito
específico y, debido a que es muy consciente tanto de la redundancia como del peligro que
representa, debe tomar las medidas adecuadas para garantizar que la redundancia no cause
más problemas de los que resuelve. (Para obtener más información, avance un poco a la
sección "Normalización de la base de datos").
126 Parte II: Uso de SQL para crear bases de datos
Restricciones
Anteriormente en este capítulo, hablé de las restricciones como mecanismos para garantizar
que los datos que se ingresan en una columna de la tabla caigan dentro del dominio de esa
columna. Arestricciónes una regla de aplicación que el DBMS aplica. Después de definir una
base de datos, puede incluir restricciones (comoNO NULO)en una definición de tabla. El DBMS
se asegura de que usted nunca pueda realizar ninguna transacción que viole una restricción.
Restricciones de columna
);
Capítulo 5: Creación de una base de datos relacional multitabla127
La declaración aplica la restricció[Link] NULOhaciaNombre del clientecolumna,
especificando queNombre del clienteno puede asumir un valor nulo.ÚNICOes otra
restricción que puede aplicar a una columna. Esta restricción especifica que cada valor
de la columna debe ser único. ElCONTROLARLa restricción es particularmente útil porque
puede tomar cualquier expresión válida como argumento. Considere el siguiente
ejemplo:
El cargo estándar de VetLab por una prueba siempre debe ser mayor o igual a
cero. Y ninguna de las pruebas estándar cuesta más de 200 dólares. El CONTROLAR
La cláusula se niega a aceptar cualquier entrada que quede fuera del rango. 0 <=
Carga estándar <= [Link] forma de expresar la misma restricción es la siguiente:
restricciones de tabla
ElCLAVE PRIMARIALa restricción especifica que la columna a la que se aplica es una
clave principal. Esta restricción se aplica a toda la tabla y es equivalente a una
combinación de lasNO NULOyÚNICOrestricciones de columna. Puede especificar
esta restricción en unCREARdeclaración, como se muestra en el siguiente ejemplo:
);
restrinja su tabla PROSPECT para incluir solo prospectos de EE. UU., pero no desea que esta
carga masiva se interrumpa cada vez que alcance uno de los récords canadienses. (Los códigos
postales canadienses incluyen letras además de números, pero los códigos postales de EE. UU.
solo contienen números). Puede optar por no aplicar una restricción aCódigo Postalhasta que
se complete la carga masiva y luego podrá restaurar la aplicación de restricciones más
adelante.
Afirmaciones
Unafirmaciónespecifica una restricción para más de una tabla. El siguiente ejemplo
utiliza una condición de búsqueda extraída de dos tablas para crear una aserción:
Capítulo 5: Creación de una base de datos relacional multitabla 129
CREAR ASERCIÓN
VERIFICAR (NO EXISTE (SELECCIONAR * DE PEDIDOS, RESULTADOS)
DONDE PEDIDOS.Número de pedido = RESULTADOS.Número de pedido
Y [Link] > [Link])) ;
Esta afirmación garantiza que los resultados de la prueba no se informen antes de solicitar la
prueba.
Para ilustrar cómo pueden ocurrir anomalías de modificación, considere la tabla que se
muestra en la Figura 5-2.
130 Parte II: Uso de SQL para crear bases de datos
Figura 5-2:
Estas VENTAS
mesa
lleva a
modificación
anomalías.
Puede utilizar la misma tabla para ilustrar una anomalía de inserción. Por ejemplo,
supongamos que desea agregar desodorante en barra a su línea de productos a un precio
de $2. No puede agregar estos datos a la tabla VENTAS hasta que un cliente compre
desodorante en barra.
El problema con la tabla VENTAS en la figura es que esta tabla trata más de una
cosa: cubre no solo qué productos compran los clientes, sino también cuánto
cuestan los productos. Para eliminar las anomalías, debe dividir la tabla VENTAS en
dos tablas, cada una de las cuales trata solo un tema o idea, como se muestra en la
Figura 5-3.
Figura 5-3:
Dividiendo el
tabla de VENTAS
En dos
mesas.
Ahora puede eliminar la fila del cliente 1001 de CUST_PURCH sin perder el hecho de que el
detergente para ropa cuesta $12. (El costo del detergente para ropa ahora se almacena en
PROD_PRICE). También puedes agregar desodorante en barra a PROD_PRICE
independientemente de que alguien haya comprado el producto o no. La información de
compra se almacena en otro lugar, en la tabla CUST_PURCH.
El proceso de dividir una tabla en varias tablas, cada una de las cuales tiene un solo
tema, se llamanormalizació[Link] posible que una operación de normalización que
resuelva un problema no afecte a otros problemas. Es posible que tengas que realizar
varias operaciones de normalización sucesivas para reducir cada tabla resultante a un
único tema. Cada tabla de la base de datos debe abordar un tema principal, y sólo uno.
A veces (como probablemente habrás adivinado) determinar que una tabla en realidad
Tratar dos o más temas puede resultar difícil.
Puedes clasificar las tablas según los tipos de anomalías de modificación a las que están
sujetas. En un artículo de 1970, E. F. Codd, el primero en describir el modelo relacional,
identificó tres fuentes de anomalías de modificación y definió la primera, segunda y
[Link] normales(1NF, 2NF, 3NF) como remedios para esos tipos de anomalías. En
los años siguientes, Codd y otros descubrieron tipos adicionales de anomalías y
especificaron nuevas formas normales para abordarlas. La forma normal de Boyce-Codd
(BCNF), la cuarta forma normal (4NF) y la quinta forma normal (5NF) ofrecieron cada una
un mayor grado de protección contra anomalías de modificación. Sin embargo, no fue
hasta 1981 que un artículo escrito por Ronald Fagin describió la forma normal de clave de
dominio o DK/NF (que ocupa una sección completa más adelante en este capítulo). El uso
de esta última forma normal le permitegarantizarque una tabla esté libre de anomalías
de modificación.
Las formas normales sonanidadoen el sentido de que una tabla que está en 2NF es automáticamente
tambiénen 1NF. De manera similar, una tabla en 3NF está automáticamente en 2NF, y así sucesivamente.
Para la mayoría de las aplicaciones prácticas, colocar una base de datos en 3NF es suficiente para garantizar
un alto grado de integridad. Para estar absolutamente seguro de su integridad, usted
132 Parte II: Uso de SQL para crear bases de datos
debe poner la base de datos en DK/NF; Para obtener más información sobre por qué, pase a la
sección "Forma normal de clave de dominio (DK/NF)".
Después de normalizar una base de datos tanto como sea posible, es posible que desee
realizar desnormalizaciones seleccionadas para mejorar el rendimiento. Si lo hace, tenga en
cuenta los tipos de anomalías que ahora pueden ser posibles.
Una tabla (relación) en primera forma normal es inmune a algunos tipos de anomalías de
modificación, pero aún está sujeta a otras. La tabla SALES que se muestra en la Figura 5-2 está
en su primera forma normal y, como se analizó anteriormente, la tabla está sujeta a anomalías
de eliminación e inserción. La primera forma normal puede resultar útil en algunas aplicaciones
pero poco fiable en otras.
Cada tabla en primera forma normal debe tener una clave primaria única. Esa clave puede
constar de una o más de una columna. Una clave que consta de más de una columna se llama
clave [Link] estar en la segunda forma normal (2NF), todos los atributos (columnas)
que no son clave deben depender de la clave completa. Por lo tanto, toda relación que esté en
1NF con una única clave de atributo está automáticamente en segunda forma normal. Si una
relación tiene una clave compuesta, todos los atributos que no son clave deben depender de
todos los componentes de la clave. Si tiene una tabla donde algunos atributos no clave no
dependen de todos los componentes de la clave, divida la tabla en dos o más tablas para que,
en cada una de las tablas nuevas, todos los atributos no clave dependan de todos los
componentes. de la clave primaria.
¿Suena confuso? Mire un ejemplo para aclarar las cosas. Considere una tabla como la
tabla VENTAS de la Figura 5-2. En lugar de registrar solo una compra para cada cliente,
agrega una fila cada vez que un cliente compra un artículo por primera vez. Una
diferencia adicional es que los clientes de vuelos chárter (aquellos conIdentificación del
clientevalores de 1001 a 1007) obtienen un descuento sobre el precio normal. La Figura
5-4 muestra algunas de las filas de esta tabla.
Figura 5-4:
En el
VENTAS_
PISTA
mesa, la
Cliente_
identificación y
Producto
columnas
constituir un
compuesto
llave.
134 Parte II: Uso de SQL para crear bases de datos
En la Figura 5-4,Identificación del clienteno identifica de forma única una fila. En dos filas,
Identificación del clientees 1001. En otras dos filas,Identificación del clientees 1010. La
combinación de losIdentificación del clientecolumna y elProductoLa columna identifica de
forma única una fila. Estas dos columnas juntas son una clave compuesta.
Si no fuera por el hecho de que algunos clientes califican para un descuento y otros no,
la tabla no estaría en la segunda forma normal, porquePrecio (un atributo que no es
clave) dependería sólo de parte de la clave (Producto). Debido a que algunos clientes
califican para un descuento,Preciodepende de ambos Identificación del clientey
Producto,y la tabla está en segunda forma normal.
Mire nuevamente la tabla VENTAS en la Figura 5-2, que sabe que está en primera forma
normal. Siempre que restrinja las entradas para permitir solo una fila para cada Identificación
del cliente,tiene una clave primaria de un solo atributo y la tabla está en la segunda forma
normal. Sin embargo, la tabla todavía está sujeta a anomalías. ¿Qué pasa si el cliente 1010 no
está satisfecho con el blanqueador con cloro, por ejemplo, y devuelve el artículo para obtener
un reembolso? Quiere eliminar la tercera fila de la tabla, que registra el hecho de que el cliente
1010 compró blanqueador con cloro. Tienes un problema: si eliminas esa fila, también pierdes
el hecho de que el blanqueador con cloro tiene un precio de $4. Esta situación es un ejemplo
de dependencia transitiva. Preciodepende deProducto,que, a su vez, depende de la clave
primaria Identificación del cliente.
Dividir la tabla VENTAS en dos tablas resuelve el problema de dependencia transitiva. Las
dos tablas que se muestran en la Figura 5-3, CUST_PURCH y PROD_PRICE, forman una
base de datos que está en tercera forma normal.
Una relación está enforma normal de clave de dominio (DK/NF)si cada restricción de la
relación es una consecuencia lógica de la definición de claves y dominios. ArestricciónEn esta
definición se encuentra cualquier regla que sea lo suficientemente precisa como para que
puedas evaluar si es cierta o no. Allavees un identificador único de una fila en una tabla. A
dominioes el conjunto de valores permitidos de un atributo.
Mire nuevamente la base de datos en la Figura 5-2, que está en 1NF, para ver qué debe
hacer para poner esa base de datos en DK/NF.
Para hacer cumplir la Restricción 3 (queIdentificación del clientedebe ser un número entero
mayor que 1000), simplemente puede definir el dominio paraIdentificación del clientepara
incorporar esta restricción. Eso hace que la restricción sea una consecuencia lógica del dominio
de laIdentificación del [Link] deIdentificación del cliente, y
Identificación del clientees una clave, por lo que no tienes ningún problema con la Restricción
1, que es una consecuencia lógica de la definición de la clave. Restricción 2esun problema.
Preciodepende de (es una consecuencia lógica de)Producto,yProducto no es una clave. La
solución es dividir la tabla VENTAS en dos tablas. Una mesa utilizaIdentificación del cliente
como clave, y los demás usosProductocomo clave. Esta configuración es la que tiene en la
Figura 5-3. La base de datos de la Figura 5-3, además de estar en 3NF, también está en DK/NF.
Diseñe sus bases de datos para que estén en DK/NF si es posible. Si puede hacer eso, aplicar
restricciones de clave y dominio hará que se cumplan todas las restricciones y no será posible
que se produzcan anomalías de modificación. Si la estructura de una base de datos está
diseñada de una manera que le impide colocarla en DK/NF, entonces debe crear las
restricciones en el programa de aplicación que utiliza la base de datos. La base de datos en sí
no garantiza que se cumplan las restricciones.
forma anormal
Como en la vida, también ocurre en las bases de datos: a veces, ser anormal vale la pena. Puedes
dejarte llevar por la normalización e ir demasiado lejos. Puedes dividir una base de datos
136 Parte II: Uso de SQL para crear bases de datos
en tantas tablas que todo se vuelve difícil de manejar e ineficiente. El rendimiento puede
caer en picado. A menudo, la estructura óptima de su base de datos está algo
desnormalizada. De hecho, las bases de datos prácticas (las realmente grandes, al
menos) casi nunca están normalizadas hasta DK/NF. Sin embargo, desea normalizar las
bases de datos que diseña tanto como sea posible para eliminar la posibilidad de
corrupción de datos que resulte de anomalías de modificación.
✓ Tiempo de seguimiento
✓ Valores de procesamiento
✓ Consultas de construcción
En este capítulo
▶ Tratar con datos
▶ Recuperar los datos que desea de una tabla
▶ Mostrar solo información seleccionada de una o más tablas
▶ Actualización de la información en tablas y vistas.
▶ Agregar una nueva fila a una tabla
▶ Cambiar algunos o todos los datos en una fila de la tabla
▶ Eliminar una fila de la tabla
C Los capítulos 3 y 4 revelan que crear una estructura sólida de base de datos es
fundamental para mantener la integridad de los datos. Sin embargo, lo que realmente
le interesa son los datos en sí, no su estructura. En un momento dado, probablemente desee
hacer una de cuatro cosas con los datos: agregarlos a las tablas, recuperarlos y mostrarlos,
cambiarlos o eliminarlos de las tablas.
Recuperando datos
La tarea de manipulación de datos que realizan los usuarios con mayor frecuencia es recuperar
información seleccionada de una base de datos. Es posible que desee recuperar el contenido.
140 Parte III: Almacenamiento y recuperación de datos
de una fila entre miles en una tabla. Es posible que desee recuperar todas las filas que
cumplan una condición o una combinación de condiciones. Es posible que incluso desees
recuperar todas las filas de la tabla. Una declaración SQL particular, laSELECCIONAR
declaración, realiza todas estas tareas por usted.
El uso más simple delSELECCIONARLa declaración es recuperar todos los datos en todas las
filas de una tabla especificada. Para hacerlo, utilice la siguiente sintaxis:
Esta declaración devuelve los nombres y números de teléfono de todos los clientes
activos que viven en New Hampshire. ElYpalabra clave significa que para que una fila
califique para su recuperación, esa fila debe cumplir ambas condiciones:Estado = 'NH' y
Estado = 'Activo'.
Capítulo 6: Manipulación de datos de bases de datos 141
Usando SQLSELECCIONARLas declaraciones no son la En algunos casos, las herramientas propietarias no pueden
única forma de recuperar datos de una base de datos. Si expresar todo lo que usted puede expresar mediante SQL. Si
está interactuando con su base de datos a través de un necesita realizar una operación que la herramienta propietaria
DBMS, este sistema probablemente ya tenga no puede manejar, es posible que necesite utilizar SQL. Por lo
herramientas patentadas para manipular datos. Puede tanto, familiarizarse con SQL es una buena idea, incluso si
utilizar estas herramientas (muchas de las cuales son utiliza una herramienta propietaria la mayor parte del tiempo.
bastante intuitivas) para agregar, eliminar, cambiar o Para realizar con éxito una operación que es demasiado
consultar su base de datos. compleja para su herramienta patentada, necesita una
comprensión clara de cómo funciona SQL y qué puede hacer.
Muchas interfaces DBMS le ofrecen la opción de
utilizar sus herramientas patentadas o SQL. En
Creando vistas
La estructura de una base de datos diseñada según principios sólidos, incluida la
normalización adecuada (consulte el Capítulo 5), maximiza la integridad de los datos. Sin
embargo, esta estructura a menudo no es la mejor manera de observar los datos. Varias
aplicaciones pueden utilizar los mismos datos, pero cada aplicación puede tener un énfasis
diferente. Una de las características más poderosas de SQL es su capacidad para mostrar
vistas de los datos que están estructuradas de manera diferente a cómo las tablas de la base
de datos almacenan los datos. Las tablas que utiliza como fuentes para columnas y filas en
una vista son lasmesas [Link] Capítulo 3 analiza las vistas como parte del lenguaje de
definición de datos (DDL); Esta sección analiza las vistas en el contexto de la recuperación y
manipulación de datos.
Puede manipular una vista del mismo modo que puede manipular una tabla real. La
diferencia es que los datos de una vista no tienen una existencia independiente. La vista
deriva sus datos de la tabla o tablas de las que extrae las columnas de la vista. Cada
aplicación puede tener sus propias vistas únicas de los mismos datos.
Considere la base de datos VetLab que describo en el Capítulo 5. Esa base de datos contiene
cinco tablas: CLIENTE, PRUEBAS, EMPLEADO, PEDIDOS y RESULTADOS. Supongamos que el
gerente nacional de marketing quiere ver de qué estados provienen los pedidos de la
empresa. Parte de esta información se encuentra en el CLIENTE.
142 Parte III: Almacenamiento y recuperación de datos
mesa; algunas mentiras en la tabla PEDIDOS. Supongamos que el oficial de control de calidad
quiere comparar la fecha del pedido de una prueba con la fecha en la que llegó el resultado
final de la prueba. Esta comparación requiere algunos datos de la tabla PEDIDOS y algunos
de la tabla RESULTADOS. Para satisfacer necesidades como éstas, puedes crear vistas que te
proporcionen exactamente los datos que deseas en cada caso.
De tablas
Para el director de marketing, puede crear la vista que se muestra en la Figura 6-1.
Figura 6-1:
El
PEDIDOS_
POR_ESTADO
vista para el
marketing
gerente.
Tenga en cuenta que le puse el prefijoNombre del clientecon la tabla que lo contiene, pero no
hice eso porEstadoyNúmero de [Link] es porqueEstadoaparece sólo en la tabla CLIENTE y
Número de ordenAparece sólo en la tabla PEDIDOS, por lo que no hay ambigüedad. Sin
embargo,Nombre del clienteaparece tanto en CLIENTE como en PEDIDOS, por lo que se
necesita el identificador adicional.
No necesita esta declaración si los nombres son los mismos que los nombres de las columnas
correspondientes en las tablas fuente. El ejemplo de la siguiente sección muestra una situación
[Link] VISTAdeclaración, excepto que los nombres de las columnas de la vista están
implícitos en lugar de indicados explícitamente.
Figura 6-2:
El
INFORMES
_Vista LAG
Para el
calidad-
control
oficial.
Figura 6-3:
La vista
creado
mostrar
cumpleaños dis-
cuenta.
Puede crear una vista basada en varias tablas, como se muestra en los ejemplos
anteriores, o puede crear una vista basada en una sola tabla. Si no necesita algunas de
las columnas o filas de una tabla, cree una vista para eliminarlas
Capítulo 6: Manipulación de datos de bases de datos 145
elementos de la vista y luego tratar con la vista en lugar de la tabla original. Este
enfoque garantiza que los usuarios vean sólo las partes de la tabla que son relevantes
para la tarea en cuestión.
Otra razón para crear una vista es brindar seguridad a sus tablas subyacentes. Es posible que
desee que algunas columnas de sus tablas estén disponibles para su inspección y, al mismo
tiempo, ocultar otras. Puede crear una vista que incluya solo aquellas columnas que desea
que estén disponibles y luego otorgar un acceso amplio a esa vista mientras restringe el
acceso a las tablas desde las que dibuja la vista. (El Capítulo 14 explora la seguridad de la base
de datos y describe cómo otorgar y revocar privilegios de acceso a datos).
Actualizando vistas
Después de crear una tabla, esa tabla es automáticamente capaz de acomodar inserciones,
actualizaciones y eliminaciones. Las vistas no necesariamente exhiben la misma capacidad. Si
actualiza una vista, en realidad está actualizando su tabla subyacente. A continuación se
detallan algunos problemas potenciales que puede encontrar al actualizar las vistas:
✓ Algunas vistas pueden extraer componentes de dos o más [Link] actualiza dicha
vista, es posible que las tablas subyacentes no se actualicen correctamente.
Tenga en cuenta la siguiente regla siempre que considere actualizar vistas: no puede actualizar
una columna en una vista a menos que corresponda a una columna en una tabla base
subyacente.
146 Parte III: Almacenamiento y recuperación de datos
✓ Aún no compilado en ningún formato digital:Si sus datos aún no están en formato
digital, probablemente alguien tendrá que ingresarlos manualmente, un registro a la vez.
También puede ingresar datos utilizando escáneres ópticos y sistemas de reconocimiento
de voz, pero el uso de dichos dispositivos para ingresar datos es relativamente raro.
Las siguientes secciones abordan la adición de datos a una tabla cuando existe en cada una
de estas tres formas. Dependiendo de la forma actual de los datos, es posible que pueda
transferirlos a su base de datos en una sola operación o que necesite ingresar los datos un
registro a la vez. Cada registro de datos que ingresa corresponde a una sola fila en una tabla
de base de datos.
otro. (El operador de entrada de datos puede no sufrir demasiado, pero el desarrollador de la
aplicación debe volver al final de la curva de aprendizaje cada vez que cambia de herramienta
de desarrollo.) Otro posible problema con la entrada de datos basada en formularios es que
algunas implementaciones pueden no permitir una gama completa de comprobaciones de
validez de los datos que introduce.
La mejor manera de mantener un alto nivel de integridad de los datos en una base de datos es
mantener los datos incorrectos fuera de la base de datos. Puede evitar la entrada de algunos datos
incorrectos aplicando restricciones a los campos de un formulario de entrada de datos. Este enfoque
le permite asegurarse de que la base de datos acepte solo valores de datos del tipo correcto y dentro
de un rango predefinido. Estas restricciones no pueden evitar todos los errores posibles, pero pueden
detectar algunos errores.
Si ingresa los datos de una sola fila en una tabla de base de datos, elINSERTAREl
comando utiliza la siguiente sintaxis:
Como lo indican los corchetes ([ ]), la lista de nombres de columnas es opcional. El orden
predeterminado de la lista de columnas es el orden de las columnas de la tabla. Si pones
elVALORESEn el mismo orden que las columnas de la tabla, estos elementos van en las
columnas correctas, ya sea que especifique esas columnas explícitamente o no. Si desea
especificar elVALORESen algún orden distinto al orden de las columnas de la tabla, debe
enumerar los nombres de las columnas en el mismo orden que la lista de valores de la
[Link]áusula.
Por supuesto, si lo desea, también puede mantener los datos de estas columnas en variables. El
INSERTARLa declaración funciona igual de bien ya sea que use variables o una copia explícita de
los datos mismos para formar los argumentos de laVALORESpalabra clave.
La entrada automática de datos es factible, por ejemplo, si los datos existen en formato
electrónico porque alguien ya los ha introducido manualmente. Si es así, no hay razón
para repetir la historia. Transferir datos de un archivo de datos a otro es una tarea que
una computadora puede realizar con una mínima participación humana. Si conoce las
características de los datos de origen y la forma deseada de la tabla de destino, una
computadora puede (en principio) realizar la transferencia de datos automáticamente.
Capítulo 6: Manipulación de datos de bases de datos 149
Lo primero que debe hacer es esperar y rezar para que los datos que desea estén en un
formato ampliamente utilizado. Si los datos están en un formato popular, es muy probable que
encuentre una utilidad de conversión de formato que pueda traducir los datos a uno o másotro
formatos populares. Su entorno de desarrollo probablemente pueda importar al menos uno de
estos formatos; si eresen realidadAfortunadamente, su entorno de desarrollo puede manejar el
formato de datos actual directamente. En ordenadores personales, los formatos Access, xBASE
y MySQL son los más utilizados. Si los datos que desea están en uno de estos formatos, la
conversión debería ser fácil. Si el formato de los datos es menos común, es posible que deba
realizar una conversión en dos pasos.
Si los datos están en un formato antiguo, propietario o obsoleto, como último recurso,
puede recurrir a un servicio profesional de traducción de datos. Estas empresas se
especializan en traducir datos informáticos de un formato a otro. Manejan cientos de
formatos, de la mayoría de los cuales nadie ha oído hablar. Entregue a uno de estos
servicios una cinta o disco que contenga los datos en su formato original y obtendrá los
mismos datos traducidos al formato que especifique.
Suponga que tiene dos tablas, PROSPECTO y CLIENTE, y desea enumerar a todos los que
viven en el estado de Maine y que aparecen en cualquiera de las tablas. Puede crear una
tabla de resultados virtual que contenga la información deseada; solo usa el siguiente
comando:
Otra forma de copiar datos de una tabla de una base de datos a otra es anidar una
SELECCIONARdeclaración dentro de unINSERTARdeclaración. Este método
(conocido como subseleccionary detallado en el Capítulo 12) no crea una tabla
virtual; en cambio, duplica los datos seleccionados. Puede tomar todas las filas de la
tabla CLIENTE, por ejemplo, e insertarlas en la tabla PROSPECT. Por supuesto, esto
sólo funciona si las estructuras de las tablas CLIENTE y PROSPECTO son idénticas. Si
desea colocar sólo aquellos clientes que viven en Maine en la tabla PROSPECT, una
simpleSELECCIONARcon una condición en elDÓNDELa cláusula funciona, como se
muestra en el siguiente ejemplo:
INSERTAR EN EL PROSPECTO
SELECCIONAR * DEL CLIENTE
DONDE Estado = 'YO';
Aunque esta operación crea datos redundantes (ahora está almacenando datos del cliente
tanto en la tabla PROSPECT como en la tabla CLIENTE), es posible que desee realizarla de todos
modos para mejorar el rendimiento de las recuperaciones. ¡Cuidado con la redundancia, sin
embargo! Para mantener la coherencia de los datos, asegúrese de no insertar, actualizar o
eliminar filas en una tabla sin insertar, actualizar o eliminar.
Capítulo 6: Manipulación de datos de bases de datos 151
eliminando las filas correspondientes en la otra tabla. Otro problema potencial es la posibilidad
de que elINSERTARLa declaración podría generar claves primarias duplicadas. Si incluso un
prospecto preexistente tiene una clave primaria deID de prospectoque coincide con la clave
primaria correspondiente (Identificación del cliente)de un cliente que está intentando insertar
en la tabla PROSPECT, la operación de inserción fallará. Si ambas tablas tienen claves primarias
autoincrementales, no querrás que comiencen con el mismo número. Asegúrate de que los dos
bloques de números estén muy separados uno del otro.
ACTUALIZAR nombre_tabla
SET columna_1 = expresión_1, columna_2 = expresión_2,. . . ,
columna_n = expresión_n
[DONDE predicados] ;
ElDÓNDELa cláusula es opcional. Esta cláusula especifica las filas que está actualizando. Si
no usas unDÓNDEcláusula, se actualizan todas las filas de la tabla. El COLOCARLa cláusula
especifica los nuevos valores para las columnas que está cambiando.
Las listas de clientes cambian ocasionalmente: a medida que las personas se mudan,
cambian sus números de teléfono, etc. Supongamos que Abe Abelson se muda de
Springfield a Kankakee. Puede actualizar su registro en la tabla utilizando lo siguiente
ACTUALIZARdeclaración:
ACTUALIZAR CLIENTE
Ciudad SET = ‘Kankakee’, Teléfono = ‘666-6666’
DONDE Nombre = 'Abe Abelson';
Puede utilizar una declaración similar para actualizar varias filas. Supongamos que Philo está
experimentando un crecimiento poblacional explosivo y ahora requiere su propio código de área.
Puede cambiar todas las filas de los clientes que viven en Philo usando un soloACTUALIZAR
declaración, de la siguiente manera:
ACTUALIZAR CLIENTE
ESTABLECER código de área = '(619)'
DONDE Ciudad = 'Filón';
Actualizar todas las filas de una tabla es incluso más fácil que actualizar sólo algunas de las
filas. No es necesario utilizar unDÓNDEcláusula para restringir la declaración. Imagine que
la ciudad de Rantoul ha adquirido una gran influencia política y ahora ha anexado no sólo
Kankakee, Decatur y Philo, sino también todas las ciudades y pueblos de la base de datos.
Puede actualizar todas las filas utilizando una sola declaración, de la siguiente manera:
ACTUALIZAR CLIENTE
ESTABLECER ciudad = 'Rantoul';
Por ejemplo, suponga que es mayorista y su base de datos incluye una tabla VENDOR
que contiene los nombres de todos los fabricantes a los que compra productos. También
tienes una tabla de PRODUCTOS que contiene los nombres de todos los productos que
vendes y los precios que cobras por ellos. La tabla VENDOR tiene [Link] de
proveedor, nombre de proveedor, calle, ciudad, estado, [Link] tabla PRODUCTO
tieneID de producto, Nombre de producto, ID de proveedor, yPrecio de venta.
ACTUALIZAR PRODUCTO
SET Precio de oferta = (Precio de oferta * 1.1)
DÓNDE ENTRA EL ID del proveedor
(SELECCIONE ID de proveedor DEL PROVEEDOR
WHERE VendorName = 'Cumulonimbus Corporation');
154 Parte III: Almacenamiento y recuperación de datos
Transferencia de datos
Además de utilizar elINSERTARyACTUALIZARdeclaraciones, puede agregar datos a una
tabla o vista utilizando elUNIRdeclaración. PuedeUNIRdatos de una tabla o vista de
origen a una tabla o vista de destino. ElUNIRPuede insertar nuevas filas en la tabla de
destino o actualizar las filas [Link] una forma conveniente de tomar datos
que ya existen en algún lugar de una base de datos y copiarlos en una nueva ubicación.
SELECCIONAR * DE BONIFICACIÓN ;
FUSIONARSE EN BONIFICACIÓN
USANDO EMPLEADO
ON ([Link] = [Link]) CUANDO
NO COINCIDE ENTONCES INSERTAR
([Link] del empleado, [Link])
VALORES ([Link], 50);
Los registros de personas en la tabla EMPLEADO que no coinciden con los registros
de personas que ya están en la tabla BONUS ahora se insertan en la tabla BONUS.
Ahora una consulta de la tabla BONUS da el siguiente resultado:
SELECCIONAR * DE BONIFICACIÓN ;
Los primeros cuatro registros, que fueron creados con elINSERTARdeclaración, están en
orden alfabético por nombre del empleado. El resto de los registros, añadidos por elUNIR
declaración, aparecen en cualquier orden en que fueron enumerados en la tabla
EMPLEADO.
ElUNIRLa declaración es una adición relativamente nueva a SQL y es posible que aún no sea
compatible con algunos productos DBMS. Aún más nueva es una capacidad adicional de UNIR
agregado en SQL: 2011, lo que paradójicamente le permite eliminar registros con unUNIR
declaración.
FUSIONARSE EN BONIFICACIÓN
USANDO EMPLEADO
ON ([Link] del empleado = [Link] del empleado)
CUANDO COINCIDA, ELIMINAR CUANDO
NO COINCIDA, LUEGO INSERTAR
([Link] del empleado, [Link])
VALORES ([Link], 50);
156 Parte III: Almacenamiento y recuperación de datos
El resultado es
SELECCIONE * DE BONIFICACIÓN;
Suponiendo que solo tiene un cliente llamado David Taylor, esta declaración
constituye la eliminación prevista. Si tienes dos o más clientes que comparten el
nombre David Taylor (que, después de todo, es un nombre bastante común en los
países de habla inglesa), puedes agregar más condiciones alDÓNDE cláusula (como
CALLEoTELÉFONOoIDENTIFICACIÓN DEL CLIENTE)para asegurarse de eliminar solo el
cliente que desea eliminar. Si no agregas unDÓNDE cláusula, todos los clientes
llamados David Taylor serán eliminados.
Capítulo 7
En este capítulo
▶ Definición de tiempos y periodos
▶ Seguimiento de lo que sucedió en momentos específicos
▶ Proporcionar un seguimiento de auditoría de los cambios en los datos.
B Antes de SQL:2011, el estándar ISO/IEC SQL no tenía ningún mecanismo para tratar
datos que fueran válidos en un momento pero no válidos en otro. Cualquier aplicación
que requiera mantener un registro de auditoría necesita esa capacidad. Esto significa que la
carga de realizar un seguimiento de lo que era cierto en un momento determinado recae en el
programador de la aplicación y no en la base de datos. Esto suena como una receta para
aplicaciones complicadas, con un presupuesto excesivo, tardías y plagadas de errores.
Se agregó una nueva sintaxis a SQL:2011 que permite el manejo de datos temporales sin
alterar la forma en que se maneja el código para datos no temporales. Esta es una gran
ventaja para cualquiera que quiera agregar capacidad temporal a una base de datos SQL
existente.
¿Qué quiero decir con el términodatos temporales? El estándar ISO/IEC SQL:2011 no utiliza ese
término en absoluto, pero se utiliza comúnmente en la comunidad de bases de datos. En SQL:2011,
los datos temporales son cualquier dato con uno o más períodos de tiempo asociados durante los
cuales esos datos se consideran efectivos o válidos a lo largo de alguna dimensión de tiempo. En
términos sencillos, eso significa que con la capacidad de datos temporales, puede determinar
cuándo un elemento de datos en particular es verdadero.
Comprensión de tiempos y
períodos en SQL: 2011
Aunque las versiones del estándar SQL anteriores a SQL:2011 preveíanFECHA, HORA, MARCA
DE TIEMPO,yINTERVALOtipos de datos, no abordaron la idea de unperíodode tiempo con una
hora de inicio definida y una hora de finalización definida. Una forma de abordar esta
necesidad es definir una nuevaPERÍODOtipo de datos. SQL:2011, sin embargo, no hace esto.
Introducir un nuevo tipo de datos en SQL en esta última etapa de su desarrollo causaría
estragos en el ecosistema que se ha creado en torno a SQL. Se requeriría una cirugía mayor en
prácticamente todos los productos de bases de datos existentes para agregar un nuevo tipo de
datos.
APERÍODOestá determinada por dos columnas: una columna inicial y una columna final. Estas
columnas son convencionales, al igual que las columnas de los tipos de datos de fecha existentes,
cada una con su propio nombre exclusivo. Como se mencionó anteriormente, una definición de
período es un componente de tabla con nombre. Ocupa el mismo espacio de nombres que los
nombres de las columnas, por lo que no debe duplicar ningún nombre de columna existente.
SQL sigue un modelo cerrado-abierto para períodos, lo que significa que un período incluye la hora de
inicio pero no la hora de finalización. Para cualquier fila de la tabla, la hora de finalización de un
período debe ser mayor que su hora de inicio. Esta es una restricción impuesta por el DBMS.
Hay dos dimensiones del tiempo que son importantes cuando se trata de datos
temporales:
✓ Tiempo validoEs el periodo de tiempo durante el cual una fila de una tabla refleja correctamente
la realidad.
No es necesario que el tiempo válido y el tiempo de transacción para una fila de una tabla sean
iguales. Por ejemplo, en una base de datos empresarial que registra el período durante el cual un
contrato está en vigor, la información sobre el contrato puede insertarse (y probablemente se
inserta) antes de la hora de inicio del contrato.
Capítulo 7: Manejo de datos temporales 159
En SQL:2011, se pueden crear y mantener tablas separadas para acomodar los dos tipos
diferentes de tiempo, o una única tabla bitemporal (que se analiza más adelante en este
capítulo) puede servir para este propósito. La información sobre el tiempo de la transacción se
mantiene en tablas versionadas por el sistema, que contienen el período de tiempo del sistema,
indicado por la palabra claveHORA DEL [Link] otra parte, la información de tiempo válida
se mantiene en tablas que contienen un período de tiempo de aplicación. Puede darle al
período de solicitud el nombre que desee, siempre que el nombre no se haya utilizado ya para
otra cosa. Se le permite definir como máximo un período de tiempo del sistema y un período de
tiempo de la aplicación.
Aunque el soporte de datos temporales en SQL se introduce por primera vez en SQL:2011, la
gente ha tenido que lidiar con datos temporales mucho antes de que las construcciones
temporales de SQL:2011 se incluyeran en cualquier producto de base de datos. Por lo general,
esto se hacía definiendo dos columnas de la tabla, una para la fecha y hora de inicio y la otra
para la fecha y hora de finalización. El hecho de que SQL:2011 no defina una nuevaPERÍODO
tipo de datos, sino que utiliza definiciones de períodos como metadatos, significa que las tablas
existentes con dichas columnas de inicio y fin se pueden actualizar fácilmente para incorporar
la nueva capacidad. La lógica para proporcionar información sobre el período se puede eliminar
de los programas de aplicación existentes, simplificándolos, acelerándolos y haciéndolos más
confiables.
La fecha y hora de inicio (Inicio Empezaren el ejemplo) se incluye en el período, pero la fecha
y hora de finalización (Empezaren el ejemplo) no lo es. Esto se conoce como semántica
cerrada-abierta.
160 Parte III: Almacenamiento y recuperación de datos
No he especificado una clave principal todavía, porque es un poco más complicado cuando se
trata de datos temporales. Me ocuparé de eso más adelante en este capítulo.
Por ahora, coloque algunos datos en esta tabla y vea cómo se ve:
INSERTAR EN empleado_atpt
VALORES (12345, FECHA '2011-01-01', FECHA '9999-12-31',
'Ventas');
Tabla 7-1 La tabla de tiempos del período de solicitud contiene una fila
ACTUALIZAR empleado_atpt
PARA UNA PORCIÓN DEL EmpPeriod
DESDE LA FECHA '2012-03-15'
A LA FECHA '2012-07-15'
SET EmpDept = 'Ingeniería'
DONDE EmpID = 12345;
Después de la actualización, la tabla ahora tiene tres filas, como se muestra en la Tabla 7-2.
Si puede insertar datos nuevos en una tabla y actualizar los datos existentes en la tabla, será
mejor que también pueda eliminar datos de la tabla. Sin embargo, eliminar datos de una tabla
de período de tiempo de aplicación puede ser un poco más complicado que simplemente
eliminar filas de una tabla normal y no temporal. Como ejemplo, supongamos que el
empleado 12345, en lugar de ser transferido al departamento de Ingeniería el 15 de marzo de
2012, deja la empresa en esa fecha y es recontratado el 15 de julio del mismo año.
Inicialmente, la tabla del período de tiempo de solicitud tendrá una fila, como se muestra en
la Tabla 7-3.
ELIMINAR empleado_atpt
PARA UNA PORCIÓN DEL EmpPeriod
DESDE LA FECHA '2012-03-15'
A LA FECHA '2012-07-15'
DONDE EmpID = 12345;
La tabla ahora refleja los períodos de tiempo durante los cuales la empleada 12345
estuvo empleada por la empresa y muestra el intervalo durante el cual no estuvo
empleada por la empresa.
Es posible que haya notado algo desconcertante en las tablas que se muestran en esta sección. En
una tabla ordinaria y atemporal que enumere a los empleados de una organización, el
162 Parte III: Almacenamiento y recuperación de datos
El número de identificación del empleado es suficiente para servir como clave principal de la tabla porque
identifica de forma única a cada empleado. Sin embargo, una tabla de empleados durante el período de
tiempo de solicitud puede contener varias filas para un solo empleado. El número de identificación del
empleado, por sí solo, ya no se puede utilizar como clave principal de la tabla. Los datos temporales deben
agregarse a la mezcla.
Se garantiza que las dos filas de la tabla serán únicas mediante la inclusión de Inicio Empezary
Empezaren la clave principal, pero observe que los dos períodos de tiempo se superponen.
Parece que el empleado 12345 es miembro tanto del departamento de Ventas como del
departamento de Ingeniería desde el 15 de marzo de 2012 hasta el 15 de julio de 2012. En
algunas organizaciones, esto puede ser posible, pero agrega complicaciones y podría
provocar corrupción de datos. Hacer cumplir una restricción que diga que un empleado puede
ser miembro de un solo departamento a la vez es quizás lo que la mayoría de las
organizaciones querrían hacer. Puede agregar dicha restricción a una tabla con unALTERAR
TABLAdeclaración como la siguiente:
Hay una mejor manera de hacer las cosas que crear una tabla primero y agregar su
restricción de clave principal más tarde; en su lugar, puede incluir la restricción de clave
principal en la tabla [Link]ón. Podría parecerse a lo siguiente:
Capítulo 7: Manejo de datos temporales 163
Ahora está prohibido superponer filas. Mientras estaba en eso, agreguéNO NULO restricciones
a todos los elementos de la clave primaria. Un valor nulo en cualquiera de esos campos sería
una fuente de errores en el futuro. Normalmente, el DBMS se encargará de esto, pero ¿por qué
correr riesgos?
En el ejemplo de este capítulo, tiene una tabla de períodos de tiempo de solicitud de empleado
y una tabla de períodos de tiempo de solicitud de departamento. Existe una relación de uno a
muchos entre la tabla de departamentos y la tabla de empleados, porque un departamento
puede tener varios empleados, pero cada empleado pertenece a uno y solo un departamento.
Esto significa que debe colocar una clave externa en la tabla de empleados que haga referencia
a la clave principal de la tabla de departamentos. Con esto en mente, cree nuevamente la tabla
de empleados, esta vez usando una tabla más [Link]ón y cree una tabla de
departamentos de manera similar:
Una cosa que quizás desee hacer es enumerar todas las personas que actualmente están
empleadas por la organización. Incluso antes de SQL:2011, podías hacerlo con una
declaración similar a la siguiente:
SELECCIONAR *
DE empleado_atpt
DONDE EmpStart <= CURRENT_DATE()
Y EmpEnd > FECHA ACTUAL();
SELECCIONAR *
DE empleado_atpt
DONDE EmpPeriod CONTIENE CURRENT_DATE();
También puede recuperar empleados que estuvieron empleados durante un período de tiempo
específico, así:
SELECCIONAR *
DE empleado_atpt
DONDE EmpPeriod SE SUPERPONDE
PERIODO (FECHA ('2012-01-01'), FECHA ('2012-09-16'));
✓ El sistema, más que el usuario, mantiene las horas de inicio y finalización de los
períodos de las filas.
Las filas originales que han sido sujetas a una operación de actualización o eliminación
permanecen en la tabla y en adelante se denominaránFilas históricas. Los usuarios no
pueden modificar el contenido de las filas históricas o los períodos asociados con
cualquiera de las filas. Sólo el sistema, no el usuario, puede actualizar los períodos de las
filas en una tabla versionada por el sistema. Esto se hace actualizando las columnas de la
tabla que no son de período o como resultado de la eliminación de filas.
Las tablas versionadas por el sistema se distinguen de las tablas de períodos de tiempo
de aplicación por un par de diferencias en elCREARdeclaraciones que los crean:
✓ Mientras que en una tabla de período de tiempo de aplicación el usuario puede darle cualquier
nombre al período, en una tabla versionada por el sistema, el nombre del período debe ser HORA
DEL SISTEMA.
Para ilustrar el uso de tablas versionadas por el sistema, sigo usando ejemplos de
empleados y departamentos. Puede crear una tabla versionada por el sistema con el
siguiente código:
Una fila en una tabla versionada por el sistema se considera una fila del sistema actual si
la hora actual está contenida en el período de hora del sistema. De lo contrario, se
considera una fila histórica del sistema.
Las tablas con versiones del sistema son similares a las tablas de períodos de tiempo de aplicación en muchos
aspectos, pero también existen diferencias. Aquí hay algunos:
✓ Los usuarios no pueden asignar ni cambiar los valores en las columnas Sys_Start y
Sys_End. Estos valores son asignados y modificados automáticamente por el DBMS. Esta
situación está determinada por las palabras [Link] SIEMPRE.
✓ Cuando utiliza la operación INSERT para agregar algo a una tabla versionada por el
sistema, el valor en la columna Sys_Start se establece automáticamente en la marca
de tiempo de la transacción, que está asociada con cada transacción. El valor
asignado a la columna Sys_End es el valor más alto del tipo de datos de esa
columna.
Una declaración de actualización en una tabla versionada por el sistema primero inserta una
copia de la fila anterior, con su hora de finalización del sistema establecida en la marca de
tiempo de la transacción. Esto indica que la fila dejó de estar actual en esa marca de tiempo. A
continuación, el DBMS realiza la actualización y cambia simultáneamente la hora de inicio del
período del sistema a la marca de tiempo de la transacción. Ahora la fila actualizada es la fila
actual del sistema a partir de la marca de tiempo de la transacció[Link] activadores
para las filas en cuestión se activarán, peroINSERTARLos activadores no se activarán aunque se
inserten filas históricas como parte de esta operación. Si se pregunta qué son los
desencadenantes, se tratan ampliamente en el Capítulo 22.
ABORRARLa operación en una tabla versionada por el sistema en realidad no elimina las filas
especificadas. En su lugar, cambia la hora de finalización del período de tiempo del sistema
de esas filas a la marca de tiempo del sistema. Esto indica que esas filas dejaron de estar
vigentes a partir de la marca de tiempo de la transacción. Ahora esas disputas son parte del
sistema histórico y no del sistema actual. Cuando realizas unBORRAR operación, cualquier
BORRARSe activarán los activadores para las filas afectadas.
Si agrega una restricción de clave principal a una tabla versionada por el sistema existente
con unaALTERARdeclaración, debido a que se aplica solo a las filas actuales, no es
necesario incluir información del período en la declaración. Por ejemplo:
Como solo se ven afectadas las filas actuales, no es necesario incluir las columnas
de inicio y fin del período.
Esta declaración devuelve todas las filas cuya hora de inicio es igual o anterior al valor de la
marca de tiempo y cuya hora de finalización es posterior al valor de la marca de tiempo.
Para encontrar lo que fue cierto durante un período de tiempo, puede utilizar una declaración
similar, con una nueva sintaxis adecuada. He aquí un ejemplo:
Esta recuperación incluirá todas las filas que comienzan en la primera marca de tiempo,
hasta peronoincluida la segunda marca de tiempo. Alternativamente, puedes usar esto:
Si una consulta en una tabla versionada por el sistema no incluye una especificación de
marca de tiempo, el caso predeterminado es devolver solo las filas actuales del sistema. Este
caso se codificaría de forma similar a la siguiente:
Si desea recuperar todas las filas de una tabla versionada por el sistema, tanto históricas
como actuales, puede hacerlo con la siguiente sintaxis:
Hay varios casos en los que podría ser necesaria una tabla bitemporal. Supongamos, por
ejemplo, que uno de sus empleados traslada su residencia a través de la frontera estatal de
Oregón a Washington. Debe tener en cuenta el hecho de que su retención del impuesto
estatal sobre la renta debe cambiar a partir de la fecha oficial de la mudanza. Sin embargo, es
poco probable que el cambio en la base de datos se realice exactamente ese mismo día. Es
necesario registrar ambos tiempos, y una tabla bitemporal puede realizar ese registro muy
bien. El período de tiempo versionado por el sistema registra cuándo la base de datos
conoció el cambio y el período de tiempo de la aplicación registra cuándo la medida entró en
vigor legalmente. Aquí hay un código de ejemplo para crear una tabla de este tipo:
Las tablas bitemporales sirven tanto para las tablas con versiones del sistema como para las tablas de
tiempos de aplicación. El usuario proporciona valores para las columnas de inicio y finalización del
período de tiempo de la aplicación. UnINSERTARLa operación en dicha tabla establece
automáticamente el valor del período de tiempo del sistema en la marca de tiempo de la transacción.
El valor de la columna de fin del período de tiempo del sistema se establece automáticamente en el
valor más alto permitido para el tipo de datos de esa columna.
Una consulta realizada en una tabla bitemporal puede especificar un período de tiempo de
aplicación, un período versionado por el sistema o ambos. Aquí hay un ejemplo del caso
"ambos":
SELECCIONAR ID emp
DESDE empleado_bt PARA EL TIEMPO DEL SISTEMA A PARTIR DE
MARCA DE TIEMPO '2013-07-15 [Link]'
DONDE EmpID = 314159 Y
EmpPeriod CONTIENE FECHA '2013-06-20 [Link]';
Capítulo 8
Especificación de valores
En este capítulo
▶ Uso de variables para eliminar la codificación redundante
▶ Extraer información frecuentemente requerida de un campo de tabla de base de datos
▶ Combinar valores simples para formar expresiones complejas
Valores
SQL reconoce varios tipos de valores:
✓ Valores de fila
✓ Valores literales
✓ variables
✓ variables especiales
✓ Referencias de columna
172 Parte III: Almacenamiento y recuperación de datos
Valores de fila
Los valores más visibles en una base de datos son la [Link] de [Link] son los
valores que contiene cada fila de una tabla de base de datos. Un valor de fila
normalmente se compone de varios componentes porque cada columna de una fila
contiene un valor. Acampoes la intersección de una sola columna con una sola fila. Un
campo contiene unescalar,oatómico,valor. Un valor escalar o atómico tiene un solo
componente.
Valores literales
En SQL, una variable o una constante pueden representar unavalor.Lógicamente, el
valor de unvariablepuede cambiar de vez en cuando, pero el valor de unconstante
nunca cambia. Un tipo importante de constante es lavalor literal. La representación
es en sí misma el valor.
Así como SQL tiene muchos tipos de datos, también tiene muchos tipos de literales. La Tabla 8-1
muestra algunos ejemplos de literales de los distintos tipos de datos.
Observe que las comillas simples encierran los literales de los tipos no numéricos. Estas marcas
ayudan a evitar confusiones; Sin embargo, también pueden causar problemas, como puede ver
en la Tabla 8-1.
Capítulo 8: Especificación de valores 173
EMPEZANDO 8589934592
ENTERO 186282
PEQUEÑO 186
NUMÉRICO 186282.42
DECIMAL 186282.42
REAL 6.02257E23
PRECISIÓN DOBLE 3.1415926535897E00
FLOTAR 6.02257E23
PERSONAJE(15) 'GRECIA '
Nota:Entre las comillas anteriores hay un total de quince caracteres y espacios.
VARCHAR (CARACTER VARIABLE) 'leptón'
CARÁCTER NACIONAL(15) 'ΕΛΛΑΣ '1
Nota:Entre las comillas anteriores hay un total de quince caracteres y espacios.
CARÁCTER NACIONAL VARIABLE(15) 'λεπτον'2
CARÁCTER OBJETO GRANDE(512) (CLOB(512)) (Una cadena de caracteres muy
larga)
BINARIO(4) '0100110001110000
1111000111001010’
VARBINARIO(4) (VARIACIÓN BINARIA(4)) '0100110001110000'
OBJETO BINARIO GRANDE(512) (BLOB(512)) (Una cadena muy larga
de unos y ceros)
'2013-02-25-
13.03.16.000000’
HORA CON ZONA HORARIA(4) HORA '13.41.32.
5000-08.00’
MARCA DE TIEMPO CON ZONA HORARIA (0) MARCA DE TIEMPO '2013-02-
2513.03.16.0000+
02.00’
DÍA DE INTERVALO INTERVALO '7' DÍA
1Este término es la palabra que utilizan los griegos para nombrar a su propio país en su propio idioma. (El equivalente en
inglés es Hellas).
¿Qué pasa si un literal es una cadena de caracteres que a su vez contiene una frase
entre comillas simples? En ese caso, debe escribir dos comillas simples para mostrar
que una de las comillas que está escribiendo es parte de la cadena de caracteres y
no un indicador del final de la cadena. Escribirías 'Atmósfera terrestre',por ejemplo,
para representar el carácter literal 'Atmósfera terrestre'.
variables
Aunque poder manipular literales y otros tipos de constantes mientras se trabaja
con una base de datos le brinda un gran poder, tener variables también es útil. En
muchos casos, necesitaría trabajar mucho más si no tuviera variables. Avariable,por
cierto, es una cantidad que tiene un valor que puede cambiar. Mire el siguiente
ejemplo para ver por qué las variables son valiosas.
Suponga que es un minorista que tiene varias clases de clientes. Les ofrece a sus
clientes de gran volumen el mejor precio, a sus clientes de volumen medio el
siguiente mejor precio y a sus clientes de bajo volumen el precio más alto. Quiere
indexar todos los precios al costo de sus bienes. Para su producto F-35, decide
cobrar a sus clientes de gran volumen (Clase C) 1,4 veces el costo de los bienes.
Usted cobra a sus clientes de volumen medio (Clase B) 1,5 veces el costo de los
bienes y a sus clientes de volumen bajo (Clase A) 1,6 veces el costo de los bienes.
Almacena el costo de los bienes y los precios que cobras en una tabla llamada
PRECIOS. Para implementar su nueva estructura de precios, emita los siguientes
comandos SQL:
ACTUALIZAR PRECIOS
Precio SET = Costo * 1.4
DONDE Producto = 'F-35'
Y Clase = 'C';
ACTUALIZAR PRECIOS
Precio SET = Costo * 1.5
DONDE Producto = 'F-35'
Y Clase = 'B';
ACTUALIZAR PRECIOS
Precio SET = Costo * 1.6
DONDE Producto = 'F-35'
Y Clase = 'A';
Este código está bien y satisface sus necesidades, por ahora. Pero si una competencia agresiva
comienza a consumir su participación de mercado, es posible que deba reducir sus márgenes
para seguir siendo competitivo. Para cambiar sus márgenes, debe ingresar un código similar a
este:
Capítulo 8: Especificación de valores 175
ACTUALIZAR PRECIOS
Precio SET = Costo * 1,25
DONDE Producto = 'F-35'
Y Clase = 'C';
ACTUALIZAR PRECIOS
Precio SET = Costo * 1,35
DONDE Producto = 'F-35'
Y Clase = 'B';
ACTUALIZAR PRECIOS
Precio SET = Costo * 1,45
DONDE Producto = 'F-35'
Y Clase = 'A';
ACTUALIZAR PRECIOS
Precio SET = Costo * :multiplicadorC
DONDE Producto = 'F-35'
Y Clase = 'C';
ACTUALIZAR PRECIOS
Precio SET = Costo * :multiplicadorB
DONDE Producto = 'F-35'
Y Clase = 'B';
ACTUALIZAR PRECIOS
Precio SET = Costo * :multiplicadorA
DONDE Producto = 'F-35'
Y Clase = 'A';
Ahora, siempre que las condiciones del mercado te obliguen a cambiar tus precios,
solo necesitarás cambiar los valores de las variables:multiplicadorC, :multiplicadorB,
y :multiplicador [Link] variables son parámetros que pasan al código SQL, que
luego utiliza las variables para calcular nuevos precios.
SQL incorporadosignifica que las sentencias SQL están integradas en el código de una
aplicación escrita en un lenguaje anfitrión. Alternativamente, puede utilizar el lenguaje del
módulo SQL para crear un módulo completo de código SQL. Luego, la aplicación del idioma
anfitrión llama al módulo. Cualquiera de los métodos puede brindarle las capacidades que
desea. El enfoque que utilice depende de su implementación de SQL.
176 Parte III: Almacenamiento y recuperación de datos
variables especiales
Si un usuario en una máquina cliente se conecta a una base de datos en un servidor, esta
conexión establece unasesió[Link] el usuario se conecta a varias bases de datos, se
considera la sesión asociada a la conexión más [Link]ón actual; sesiones
anterioresson [Link] define variosvariables especialesque son valiosos
en sistemas multiusuario. Estas variables realizan un seguimiento de los diferentes
usuarios. Aquí hay una lista de las variables especiales:
Referencias de columna
Cada columna contiene un valor para cada fila de una tabla. Las declaraciones SQL a menudo hacen
referencia a dichos valores. Una referencia de columna totalmente calificada consta de
Capítulo 8: Especificación de valores 177
nombre de la tabla, un punto y luego el nombre de la columna (por ejemplo,
PRECIOS. Producto).Considere la siguiente afirmación:
SELECCIONAR [Link]
DE PRECIOS
DONDE [Link] = 'F-35';
Debido a que solo tiene sentido hacer referencia a columnas en la tabla actual,
generalmente no es necesario utilizar referencias de columnas completas. La
siguiente afirmación, por ejemplo, es equivalente a la anterior:
SELECCIONAR Costo
DE PRECIOS
DONDE Producto = 'F-35';
A veces es posible que esté tratando con más de una tabla, por ejemplo, cuando dos tablas
de una base de datos contienen una o más columnas con el mismo nombre. En tal caso,
debe calificar completamente las referencias de columna para esas columnas para
garantizar que obtenga la columna que desea.
Por ejemplo, suponga que su empresa mantiene instalaciones tanto en Kingston como en
Jefferson y mantiene registros de empleados separados para cada sitio. Usted nombra la
tabla de empleados de KingstonEMP_KINGSTON,y nombras la tabla de empleados de
JeffersonEMP_JEFFERSON.Quiere una lista de empleados que trabajan en ambos sitios,
por lo que necesita encontrar los empleados cuyos nombres aparecen en ambas tablas.
La siguienteSELECCIONARLa declaración te da lo que quieres:
Expresiones de valor
Una expresión puede ser simple o compleja. La expresión puede contener valores literales,
nombres de columnas, parámetros, variables del lenguaje principal, subconsultas, conectivos
lógicos y operadores aritméticos. Independientemente de su complejidad, una expresión
debe reducirse a un valor único.
178 Parte III: Almacenamiento y recuperación de datos
Por esta razón, las expresiones SQL se conocen comúnmente comoexpresiones de valor.
Es posible combinar varias expresiones de valor en una sola expresión, siempre que las
expresiones de valor del componente se reduzcan a valores que tengan tipos de datos
compatibles.
Expresión produce
'Maní' || 'Jalea' 'quebradiza' || ' ' || 'Cacahuete'
'frijoles' PRIMER_NOMBRE || ' ' || 'Frijolitos confitados'
APELLIDO_NOMBRE B'1100111' || 'Joe Smith'
B'01010011' '110011101010011'
'' || 'Espárragos' 'Espárragos'
‘Espárragos’ || '' 'Espárragos'
'Como' || '' || ‘par’ || '' || 'agus' 'Espárragos'
Como muestra la tabla, si concatena una cadena con una cadena de longitud cero, el
resultado es el mismo que el de la cadena original.
179
Capítulo 8: Especificación de valores
✓ – 27
✓ 49 + 83
✓ 5 * (12 – 3)
✓ PROTEÍNA + GRASA + CARBOHIDRATO
✓ PIES/5280
✓ COSTO * :multiplicadorA
Los horarios se mantienen en hora universal coordinada (UTC), conocida en el Reino Unido como
hora media de Greenwich, pero puede especificar un desplazamiento para que la hora sea correcta
para cualquier zona horaria en particular. Para la zona horaria local de su sistema, puede utilizar la
sintaxis simple que se proporciona en el siguiente ejemplo:
Esta expresión define la hora local como la zona horaria de Portland, Oregón, que
es ocho horas más temprana que la de Greenwich, Inglaterra.
El ejemplo que sigue se aproxima al número total de meses que una madre de cinco
hijos ha estado embarazada (¡suponiendo que actualmente no esté esperando el
número seis!):
Los intervalos pueden ser tanto negativos como positivos y pueden consistir en cualquier expresión
de valor o combinación de expresiones de valor que se evalúen como un intervalo.
Funciones
Afunciónes una operación simple (bueno, no más que moderadamente compleja) que
los comandos SQL habituales no realizan pero que aparece con frecuencia en la práctica.
SQL proporciona funciones que realizan tareas que el código de la aplicación en el
lenguaje anfitrión (en el que incrusta sus declaraciones SQL) necesitaría realizar de otro
modo. SQL tiene dos categorías principales de funciones:colocar(o agregar)funcionesy
funciones de valor.
Para ilustrar el uso de las funciones establecidas, considere la Tabla 8-2, una lista de información nutricional
para 100 gramos de alimentos seleccionados.
Tabla 8-2(continuado)
Alimento calorías Proteína Gordo Carbohidrato
(gramos) (gramos) (gramos)
Una tabla de base de datos llamada FOODS almacena la información de la Tabla 8-2. Los campos
en blanco contienen el [Link] funciones establecidasCUENTA, PROMEDIO, MÁX, MIN,y
SUMAPuede brindarle datos importantes sobre los datos de esta tabla.
CONTAR
ElCONTARLa función le dice cuántas filas hay en la tabla o cuántas filas de la
tabla cumplen ciertas condiciones. El uso más simple de esta función es el
siguiente:
Esta función produce un resultado de 15, porque cuenta todas las filas de la tabla
ALIMENTOS. La siguiente declaración produce el mismo resultado:
Porque elcaloríasLa columna en cada fila de la tabla tiene una entrada, el recuento es
el mismo. Sin embargo, si una columna contiene valores nulos, la función no cuenta las
filas correspondientes a esos valores nulos.
Un campo en una tabla de base de datos puede contener un valor nulo por diversos
motivos. Una razón común es que se desconoce el valor real (o no se conoce).todavía
conocido). O el valor puede ser conocido pero aún no ingresado. A veces, si se sabe que
un valor es cero, el operador de entrada de datos no se molesta en introducir nada en
un campo, dejando ese campo como nulo. Esta no es una buena práctica porque cero es
un valor definido y puede incluirlo en los cálculos. Nulo esnoun valor definido y SQL no
incluye valores nulos en los cálculos.
Capítulo 8: Especificación de valores 183
También puedes utilizar elCONTARfunción, en combinación conDISTINTO,para
determinar cuántos valores distintos existen en una columna. Considere la siguiente
afirmación:
La respuesta que arroja esta afirmación es 12. Puedes ver que una porción de 100 gramos
de espárragos tiene el mismo contenido de grasa que 100 gramos de plátanos (0,2 gramos)
y que una porción de 100 gramos de habas tiene el mismo contenido de grasa que 100
gramos de gominolas (0,5 gramos). Por lo tanto, la tabla tiene un total de sólo 12 valores de
grasa distintos.
AVG
ElAVGLa función calcula y devuelve el promedio de los valores en la columna
especificada. Por supuesto, puedes utilizar elAVGfuncionan solo en columnas que
contienen datos numéricos, como en el siguiente ejemplo:
El valor medio de grasa desciende a 10,32 gramos por 100 gramos de alimento.
MÁXIMO
MÍNIMO
SUMA
ElSUMALa función devuelve la suma de todos los valores encontrados en la columna
especificada. La siguiente declaración arroja 3924, que es el contenido calórico total de
los 15 alimentos:
Funciones de valor
Varias operaciones se aplican en una variedad de contextos. Debido a que necesita utilizar
estas operaciones con tanta frecuencia, tiene sentido incorporarlas a SQL como funciones de
valor. El SQL estándar ISO/IEC ofrece relativamente pocas funciones de valor en comparación
con implementaciones específicas de sistemas de administración de bases de datos como
Access, Oracle o SQL Server, pero las pocas que tiene el SQL estándar son probablemente las
que usará con más frecuencia. SQL utiliza los siguientes cuatro tipos de funciones de valor:
✓ SUBCADE
✓ SUBCADE SIMILAR
✓ SUBSTRING_REGEX
✓ TRADUCIR_REGEX
✓ CUBRIR
✓ SUPERIOR
✓ MÁS BAJO
✓ RECORTAR
✓ TRADUCIR
✓ CONVERTIR
Traducido del inglés al español - [Link]
SUBCADE
Utilizar elSUBCADEFunción para extraer una subcadena de una cadena fuente. La
subcadena extraída es del mismo tipo que la cadena de origen. Si la cadena fuente es
unaCARÁCTER VARIABLEcadena, por ejemplo, la subcadena también es una CARÁCTER
VARIABLEcadena. A continuación se muestra la sintaxis delSUBCADE función:
Todas las funciones de valor son similares en el sentido de que estas funciones
pueden operar en expresiones que evalúan valores así como en los propios valores
literales.
Debes tener cuidado con un par de cosas si usas elSUBCADEfunción. Asegúrese de que
la subcadena que especifique realmente se encuentre dentro de la cadena de origen. Si
solicita una subcadena que comience en (digamos) el carácter ocho pero la cadena de
origen tiene solo cuatro caracteres, obtendrá un resultado nulo. Por lo tanto, debe tener
alguna idea de la forma de sus datos antes de especificar una función de subcadena.
Tampoco desea especificar una longitud de subcadena negativa, porque el final de una
cadena no puede preceder al principio.
SELECCIONAR * DE ALIMENTOS
DONDE SUBSTRING (Comida DE 8 PARA 7) = 'blanco';
SUBCADE SIMILAR
La función de subcadena de expresión regular es una función triádica (lo que significa que
opera con tres parámetros). Los tres parámetros son una cadena de caracteres de origen, una
cadena de patrón y un carácter de escape. Luego utiliza la coincidencia de patrones (basada en
expresiones regulares basadas en POSIX) para extraer y devolver una cadena de resultado de la
cadena de caracteres de origen.
Se utilizan dos instancias del carácter de escape, cada una seguida del carácter de
comillas dobles, para dividir la cadena del patrón en tres partes. He aquí un
ejemplo:
Entonces
SUBCADE S SIMILAR A R ;
devuelve un resultado que es la pieza intermedia de la cadena del patrón, 'Siete'en este
caso.
SUBSTRING_REGEX
SUBSTRING_REGEXbusca en una cadena un patrón de expresión regular
XQuery y devuelve una aparición de la subcadena coincidente.
Según el estándar internacional ISO/IEC JTC 1/SC 32, la sintaxis de una expresión
regular de subcadena es la siguiente:
<posición inicial>es un valor numérico exacto opcional con escala 0, que indica la
posición del carácter en la que iniciar la búsqueda. (El valor predeterminado es 1.)
<ocurrencia de expresiones regulares>es un valor numérico exacto opcional con escala 0, que indica
qué ocurrencia de coincidencia se desea. (El valor predeterminado es 1.)
<grupo de captura de expresiones regulares>es un valor numérico exacto opcional con escala 0 que
indica qué grupo de captura de una coincidencia se desea. (El valor predeterminado es 0, lo que
indica toda la ocurrencia).
TRADUCIR_REGEX
TRADUCIR_REGEXbusca en una cadena un patrón de expresión regular de XQuery y
devuelve la cadena con una o todas las apariciones de la expresión regular de
XQuery reemplazada por una cadena de reemplazo de XQuery.
Según el estándar internacional ISO/IEC JTC 1/SC 32, la sintaxis de una transliteración de
expresiones regulares es la siguiente:
| TODO
188 Parte III: Almacenamiento y recuperación de datos
dónde:
TRANSLATE_REGEX ('i' IN 'Bill se sentó.' CON 'a') = 'Ball dad se sentó. ' TRANSLATE_REGEX ('i'
IN 'Bill se sentó'. CON 'a' OCURRENCIA TODAS) = 'Papá se sentó'.
TRANSLATE_REGEX ('i' IN 'Bill se sentó' CON 'a' OCCURRENCE 2) = 'Bill papá se sentó'
TRANSLATE_REGEX ('i' IN 'Bill se sentó' CON 'a' DE 5) = 'Bill papá se sentó' .'
CUBRIR
CUBRIRreemplaza una subcadena determinada de una cadena (especificada por una posición
inicial numérica determinada y una longitud determinada) con una cadena de reemplazo.
Cuando la longitud especificada para la subcadena es cero, no se elimina nada de la cadena
original, pero la cadena de reemplazo se inserta en la cadena original, comenzando en la
posición inicial especificada.
SUPERIOR
MÁS BAJO
ElMÁS BAJOLa función value convierte una cadena de caracteres en caracteres completamente en
minúsculas, como en los ejemplos de la siguiente tabla.
ElMÁS BAJOLa función no afecta una cadena que ya está escrita exclusivamente en
minúsculas.
RECORTAR
Utilizar elRECORTARfunción para recortar los espacios en blanco iniciales o finales (u otros caracteres)
de una cadena de caracteres. Los siguientes ejemplos muestran cómo utilizarRECORTAR.
El carácter de recorte predeterminado es el espacio en blanco, por lo que la siguiente sintaxis también es legal:
TRADUCIR y CONVERTIR
ElTRADUCIRyCONVERTIRLas funciones toman una cadena fuente en un juego de caracteres y
transforman la cadena original en una cadena en otro juego de caracteres. Algunos ejemplos
pueden ser del inglés al kanji o del hebreo al francés. Las funciones de conversión que
especifican estas transformaciones son específicas de la implementación. Consulte la
documentación de su implementación para obtener más detalles.
Si traducir de un idioma a otro fuera tan fácil como invocar un SQL TRADUCIR
función, eso sería genial. Desafortunadamente, no es tan fácil. TodoTRADUCIRLo
que hace es traducir un carácter del primer conjunto de caracteres al carácter
correspondiente del segundo conjunto de caracteres. La función puede, por
ejemplo, traducir 'Ελλασ' a '[Link] no puede traducir 'Ελλασ' a 'Grecia'.
190 Parte III: Almacenamiento y recuperación de datos
POSICIÓN
POSICIÓNbusca una cadena de destino especificada dentro de una cadena de origen
especificada y devuelve la posición del carácter donde comienza la cadena de destino. Para una
cadena de caracteres, la sintaxis tiene este aspecto:
Tanto para cadenas de caracteres como para cadenas binarias, si la función no encuentra la
cadena de destino, elPOSICIÓNLa función devuelve un valor cero. Además, para ambos tipos de
cadena, si la cadena de destino tiene una longitud cero (como en el último ejemplo de
caracteres), laPOSICIÓNLa función siempre devuelve un valor de uno. Si algún operando de la
función tiene un valor nulo, el resultado es un valor nulo.
OCURRENCIAS_REGEX
OCURRENCIAS_REGEXes una función numérica que devuelve el número de
coincidencias de una expresión regular en una cadena. La sintaxis es la siguiente:
POSICIÓN_REGEX
POSICIÓN_REGEXes una función numérica que devuelve la posición del inicio de una
coincidencia, o uno más el final de una coincidencia, para una expresión regular en una
cadena. Aquí está la sintaxis:
EXTRACTO
CHARACTER_LENGTH
ElCHARACTER_LENGTHLa función devuelve el número de caracteres en una cadena
de caracteres. La siguiente declaración, por ejemplo, devuelve 16:
OCTET_LENGTH
En música, un conjunto vocal formado por ocho cantantes se llamaocteto. Normalmente, las
partes que representa el conjunto son primera y segunda soprano, primera y segunda
contralto, primer y segundo tenor y primer y segundo bajo. En terminología informática, un
conjunto de ocho bits de datos se denomina [Link] palabrabytees inteligente porque el
término se relaciona claramente conpocopero implica algo más grande que un bit. Un bonito
juego de palabras, pero (desafortunadamente) nada en la palabrabyteTransmite el concepto
de "octava". Tomando prestado el término musical, se hace posible una descripción más
adecuada de una colección de ocho bits.
Capítulo 8: Especificación de valores 193
Prácticamente todas las computadoras modernas utilizan ocho bits para representar un
único carácter alfanumérico. Los conjuntos de caracteres más complejos (como el chino)
requieren 16 bits para representar un solo carácter. ElOCTET_LENGTHLa función cuenta y
devuelve el número de octetos (bytes) en una cadena. Si la cadena es una cadena de bits,
OCTET_LENGTHdevuelve el número de octetos necesarios para contener ese número de
bits. Si la cadena es una cadena de caracteres en inglés (con un octeto por carácter), la
función devuelve el número de caracteres de la cadena. Si la cadena es una cadena de
caracteres chinos, la función devuelve un número que es el doble de caracteres chinos. La
siguiente cadena es un ejemplo:
CARDINALIDAD
CardinalidadSe ocupa de colecciones de elementos como matrices o conjuntos
múltiples, donde cada elemento es un valor de algún tipo de datos. La cardinalidad
de una colección es el número de elementos que contiene. Un uso del
CARDINALIDADLa función podría ser esta:
CARDINALIDAD (TeamRoster)
Esta función devolvería 12, por ejemplo, si hubiera 12 miembros del equipo en la [Link] del
equipo,una columna en la tabla TEAMS puede ser una matriz o un conjunto múltiple. Un
formaciónes una colección ordenada de elementos, y unconjunto múltiplees una colección
desordenada de elementos. Para una plantilla de equipo, que cambia con frecuencia, el
multiset tiene más sentido.
ARRAY_MAX_CARDINALIDAD
ElCARDINALIDADLa función devuelve el número de elementos de la matriz o
conjunto múltiple que especifique. Lo que no te dice es la cardinalidad máxima
que se asignó a esa matriz. Hay ocasiones en las que quizás quieras saber eso.
194 Parte III: Almacenamiento y recuperación de datos
TRIM_ARRAY
Mientras que elRECORTARLa función recorta el primer o último carácter de una cadena, el
TRIM_ARRAYLa función recorta los últimos elementos de una matriz.
Para recortar los últimos tres elementos de laLista del equipomatriz, utilice la siguiente
sintaxis:
abdominales
ABS (-273)
MODIFICACIÓN
MODO (3,2)
LN
ElLNLa función devuelve el logaritmo natural de una expresión de valor numérico.
LN (9)
Aquí esta función devuelve algo así como 2.197224577. El número de dígitos más
allá del punto decimal depende de la implementación de SQL.
Exp
ElExpfunción eleva la base de los logaritmos naturalesmia la potencia
especificada por una expresión de valor numérico.
EXP (2)
Aquí la función devuelve algo así como 7,389056. El número de dígitos más
allá del punto decimal depende de la implementación de SQL.
195
Capítulo 8: Especificación de valores
FUERZA
ElFUERZALa función eleva el valor de la primera expresión de valor numérico a la
potencia de la segunda expresión de valor numérico.
PODER (2,8)
CUADRADO
CUADRADO (4)
PISO
ElPISOLa función trunca la expresión del valor numérico al número entero más
grande que no sea mayor que la expresión.
PISO (3.141592)
TECHO o TECHO
ElFORTIFICAR TECHOoTECHOLa función aumenta la expresión del valor numérico al
número entero más pequeño no menor que la expresión.
CEIL (3.141592)
WIDTH_BUCKET
ElWIDTH_BUCKETfunción, utilizada enprocesamiento de solicitudes en línea(OLAP),
es una función de cuatro argumentos, que devuelve un número entero entre 0
(cero) y el valor del cuarto argumento más 1 (uno). Asigna el primer argumento a un
partición de ancho equivalentedel rango de números entre el segundo y tercer
argumento. Los valores fuera de este rango se asignan a 0 (cero) o al valor del
cuarto argumento más 1 (uno).
Por ejemplo:
SQL incluye tres funciones que devuelven información sobre la fecha actual, la hora
actual o [Link] ACTUALdevuelve la fecha actual;TIEMPO ACTUALdevuelve la
hora actual; yFECHA Y HORA ACTUALdevuelve (¡sorpresa!) tanto la fecha actual
como la hora [Link] ACTUALno requiere argumentos, peroTIEMPO ACTUALy
FECHA Y HORA ACTUALambos toman un solo argumento. El argumento especifica
la precisión de la parte de "segundos" del valor de tiempo que devuelve la función.
(Los tipos de datos de fecha y hora y el concepto de precisión se describen en el
Capítulo 2).
La siguiente tabla ofrece algunos ejemplos de estas funciones de valor de fecha y hora.
En algunas aplicaciones, es posible que desee aprovechar funciones que operan con
datos de tipo carácter; para hacerlo, convierta fechas, horas o marcas de tiempo en
cadenas de caracteres. Puede realizar dicha conversión de tipo utilizando el ELENCO
expresión, que describo en el Capítulo 9.
El resultado es
En este capítulo
▶ Usando las expresiones condicionales CASE
▶ Convertir un elemento de datos de un tipo de datos a otro
▶ Ahorrar tiempo de entrada de datos mediante el uso de expresiones de valor de fila
Si la condición que sigue a laSILa palabra clave se evalúa como Verdadero, el bloque de
comandos que sigue alENTONCESse ejecuta la palabra clave. Si la condición no se evalúa como
Verdadera, el bloque de comandos después delDEMÁSse ejecuta la palabra clave. El
TERMINARA SILa palabra clave señala el final de la estructura. Esta estructura es excelente para
cualquier decisión que vaya de dos maneras. La estructura no funciona tan bien para
decisiones que pueden tener más de dos resultados posibles.
Los lenguajes más completos tienen unaCASODeclaración que maneja situaciones en las
que es posible que desee realizar más de dos tareas basadas en más de dos valores
posibles de una condición.
ElCASOLa expresión busca en una tabla, una fila a la vez, tomando el valor de un resultado
específico siempre que una de una lista de condiciones sea Verdadera. Si la primera condición
no se cumple para una fila, se prueba la segunda condición y, si es Verdadera, el resultado
especificado se proporciona a la expresión, y así sucesivamente hasta que se procesen todas
las condiciones. Si no se encuentra ninguna coincidencia, la expresión toma un valor NULL. El
procesamiento luego pasa a la siguiente fila.
✓ Utilice la expresión con condiciones de bú[Link] filas en una tabla donde las
condiciones especificadas son verdaderas. SiCASOencuentra que una condición de búsqueda
es Verdadera para una fila de la tabla, la declaración que contiene elCASO La expresión realiza
un cambio específico en esa fila.
CASO
CUANDO condición1 ENTONCES resultado1
CUANDO condición2 ENTONCES resultado2
...
CUANDO condiciónnorteENTONCES resultadonorte
OTRO resultadoX
FIN
ACTUALIZAR ALIMENTOS
ESTABLECER CLASIFICACIÓN = CASO
CUANDO LA GRASA < 1
ENTONCES “muy bajo en grasa”
CUANDO GRASA < 5
ENTONCES “bajo en grasas”
CUANDO LA GRASA < 20
ENTONCES 'grasa moderada'
CUANDO LA GRASA < 50
ENTONCES “alto en grasas”
ELSE 'ciudad de infarto'
FIN ;
La tabla 8-2 del Capítulo 8 muestra el contenido de grasa de 100 gramos de ciertos alimentos. Una tabla
de base de datos que contenga esta información puede contener unCLASIFICACIÓNcolumna que ofrece
una evaluación rápida del significado del contenido de grasa. Si ejecutas el
200 Parte III: Almacenamiento y recuperación de datos
Considere un caso que determina la compensación de los vendedores. Las empresas que
compensan a sus vendedores mediante comisiones directas a menudo pagan a sus nuevos
empleados dándoles unadibujarcontra las comisiones futuras que se espera que ganen. En el
siguiente ejemplo, los nuevos vendedores reciben un sorteo contra comisión; el sorteo se
elimina gradualmente a medida que aumentan sus comisiones:
ACTUALIZAR VENTAS_COMP
SET COMP = COMISIÓN + CASO
CUANDO LA COMISIÓN> DIBUJAR
ENTONCES 0
CUANDO LA COMISIÓN < DIBUJAR
ENTONCES DIBUJA
FIN ;
Toda laENTONCESexpresiones en unCASOLa expresión debe ser del mismo tipo: toda
numérica, toda de caracteres o toda de fecha. El resultado de laCASOLa expresión también es
del mismo tipo.
CASOvalor_prueba
CUANDO valor1 ENTONCES resultado1
CUANDO valor2 ENTONCES
resultado2. . .
Capítulo 9: Uso de expresiones de valores SQL avanzadas 201
Para comprender cómo funciona la forma de valor, considere un caso en el que tenga
una tabla que contenga los nombres y rangos de varios oficiales militares. Desea
enumerar los nombres precedidos por la abreviatura correcta para cada rango. La
siguiente declaración hace el trabajo:
Capitán medianoche
Columna. Lijadoras
Gen. Washington
comandante Desastre
Nimitz
Chester Nimitz fue almirante de la Armada de los Estados Unidos durante la Segunda Guerra
Mundial. Debido a que su rango no figura en elCASOexpresión, laDEMÁSLa cláusula no le da
un título.
Para poner otro ejemplo, supongamos que el Capitán Midnight obtiene un ascenso
a mayor y desea actualizar la base de datos de OFICIALES en consecuencia.
Supongamos que la variableoficial_apellidocontiene el valor 'Medianoche'y que la
variablenuevo_rankcontiene un número entero (4)que corresponde al nuevo rango
de Midnight, según la siguiente tabla.
202 Parte III: Almacenamiento y recuperación de datos
nuevo_rank Rango
1 general
2 coronel
3 teniente coronel
4 importante
5 capitán
6 Primer teniente
7 alférez
8 NULO
ACTUALIZACIÓN OFICIALES
ESTABLECER RANGO = CASO: nuevo_rank
CUANDO 1 ENTONCES 'general'
CUANDO 2 ENTONCES 'coronel'
CUANDO 3 ENTONCES 'teniente coronel'
CUANDO 4 ENTONCES 'mayor' CUANDO 5
ENTONCES 'capitán' CUANDO 6 ENTONCES
'primer teniente' CUANDO 7 ENTONCES 'segundo
teniente' CUANDO 8 ENTONCES NULO
FIN
DONDE APELLIDO_NOMBRE =: oficial_apellido;
CASO
CUANDOvalor_prueba=valor1 ENTONCES resultado1
CUANDOvalor_prueba=valor2 ENTONCES resultado2
...
CUANDOvalor_prueba=valornorteENTONCES resultadonorte
OTRO resultadoX
FIN
Las tablas de la base de datos tienen valores definidos en campos que contienen
contenidos conocidos. Normalmente, si se desconoce el valor de un campo, el campo
contiene el valor nulo. En SQL, puedes usar unCASOexpresión para cambiar el
contenido de un campo de tabla de un valor definido a un valor nulo. El valor nulo indica
que ya no conoce el valor del campo. Considere el siguiente ejemplo.
Imagine que es propietario de una pequeña aerolínea que ofrece vuelos entre el sur de
California y el estado de Washington. Hasta hace poco, algunos de sus vuelos hacían escala en
el Aeropuerto Internacional de San José para repostar antes de continuar.
Desafortunadamente, acaba de perder su derecho a volar a San José. A partir de ahora,
deberás realizar tu parada para repostar en el Aeropuerto Internacional de San Francisco o en
el Aeropuerto Internacional de Oakland. En este punto, no sabe qué vuelos hacen escala en
qué aeropuerto, pero sí sabe que ninguno de los vuelos hace escala en San José. Tiene una
base de datos de VUELOS que contiene información importante sobre sus rutas y ahora desea
actualizar la base de datos para eliminar todas las referencias a San José. El siguiente ejemplo
muestra una forma de hacer esto:
ACTUALIZAR VUELO
SET RefuelStop = CASO
CUANDO RefuelStop = 'San José'
ENTONCES NULO
ELSE RepostarParada
FIN ;
Debido a que surgen con frecuencia ocasiones como esta, en las que desea
reemplazar un valor conocido con un valor nulo, SQL ofrece una notación
abreviada para realizar esta tarea. El ejemplo anterior, expresado de esta forma
abreviada, se ve así:
ACTUALIZAR VUELO
SET RefuelStop = NULLIF(RefuelStop, 'San José');
Puede traducir esta expresión al inglés como "Actualice la tabla FLIGHT configurando el
RepostarParadacolumna a nula si el valor existente deRepostarParada es 'San Jose'.De lo
contrario, no hagas ningún cambio”.
NULLIFEs aún más útil si está convirtiendo datos que acumuló originalmente para
usarlos con un programa escrito en un lenguaje de programación estándar como C++ o
Java. Los lenguajes de programación estándar no tienen valores nulos, por lo que una
práctica común es utilizar valores especiales para representar el concepto de "no
conocido" o "no aplicable". Un numérico -1puede representar un valor desconocido para
SALARIO,por ejemplo, y una cadena de caracteres “***” puede representar un valor
desconocido o no aplicable paraCÓDIGO DE [Link] quieres representar estos
204 Parte III: Almacenamiento y recuperación de datos
estados no conocidos y no aplicables en una base de datos compatible con SQL mediante el uso de
valores nulos, debe convertir los valores especiales a valores nulos. El siguiente ejemplo realiza esta
conversión para una tabla de empleados, en la que se desconocen algunos valores salariales:
ACTUALIZAR EMP
SET Salario = CASO Salario
CUANDO -1 ENTONCES
NULL MÁS Salario
FIN ;
ACTUALIZAR EMP
SET Salario = NULLIF(Salario, -1);
CASO
CUANDO el valor1 NO ES NULO
ENTONCES valor1
CUANDO el valor2 NO ES NULO
ENTONCES valor2
...
CUANDO valornorteNO ES NULO
ENTONCES valornorte
DEMÁS NULO
FIN
Es posible que desee comparar una columna de un tipo en una tabla con una columna de
un tipo diferente en una tabla diferente. Por ejemplo, podría almacenar fechas como
datos de caracteres en una tabla y como datos de fechas en otra tabla. Incluso si ambas
columnas contienen el mismo tipo de información (fechas, por ejemplo), el hecho de que
los tipos sean diferentes puede impedirle realizar la comparación.
En los primeros estándares SQL, SQL-86 y SQL-89, la incompatibilidad de tipos planteaba un
gran problema. SQL-92, sin embargo, introdujo una solución fácil de usar en el ELENCO
expresión.
Puede convertir un elemento de cualquier tipo de carácter a cualquier otro tipo (como
numérico o de fecha) siempre que el valor del elemento tenga la forma de un literal del nuevo
tipo. Por el contrario, puede convertir un elemento de cualquier tipo a cualquiera de los tipos
de caracteres, siempre que el valor del elemento tenga la forma de un literal del tipo original.
206 Parte III: Almacenamiento y recuperación de datos
✓ Cualquier tipo numérico a cualquier otro tipo numérico. Si se convierte a un tipo con
menor precisión fraccionaria, el sistema redondea o trunca el resultado.
Suponga que desea utilizar FORTRAN o Pascal para acceder a tablas con DECIMALES(5,3)
columnas, y no desea que se produzcan imprecisiones al convertir esos valores alREALtipo de
datos utilizado por FORTRAN y Pascal. Puede realizar esta tarea utilizandoELENCOpara mover
los datos hacia y desde variables del lenguaje principal de cadena de caracteres. Recupera un
salario numérico de 198,37 como CARACTERÍSTICA(10)valor de '0000198.37’.Luego, si deseas
actualizar ese salario a 203,74, puedes colocar ese valor en unCARACTERÍSTICA(10)como '
0000203.74’.Primero usasELENCOpara cambiar el SQLDECIMALES(5,3)tipo de datos al
CARACTERÍSTICA(10) escriba para el empleado cuyo número de identificación está
almacenando en la variable del lenguaje principal :emp_id_var,como sigue:
ACTUALIZAR EMP
SET Salario = CAST(:salary_var AS DECIMAL(5,3))
DONDE EmpID = :emp_id_var ;
La idea general es queELENCOes más valioso para convertir entre tipos de host y
la base de datos en lugar de convertir dentro de la base de datos.
El capítulo 6 cubre cómo utilizar elINSERTARdeclaración para agregar una nueva fila a una
tabla existente. Para hacerlo, la declaración utiliza una expresión de valor de fila. Considere el
siguiente ejemplo:
En este ejemplo, ('Queso, cheddar’, 398, 25, 32.2, 2.1)es una expresión de valor de fila. Si
utiliza una expresión de valor de fila en unINSERTARdeclaración de esta manera, puede
contener valores nulos y predeterminados. (Avalor por defectoes el valor que asume
una columna de la tabla si no especifica ningún otro valor). La siguiente línea, por
ejemplo, es una expresión de valor de fila legal:
Puede agregar varias filas a una tabla colocando varias expresiones de valor de fila en el
VALOREScláusula, de la siguiente manera:
Puede utilizar expresiones de valor de fila para evitar tener que ingresar
comparaciones manualmente. Supongamos que tienes dos tablas de valores
nutricionales, una compilada en inglés y otra en español. Desea encontrar aquellas
filas en la tabla en idioma inglés que corresponden exactamente a las filas en la
tabla en idioma español. Sin una expresión de valor de fila, es posible que necesite
formular algo como el siguiente ejemplo:
SELECCIONAR * DE ALIMENTOS
DONDE [Link] = [Link]
Y [Link] = [Link] Y
[Link] = [Link]
Y [Link] = [Link] ;
Capítulo 9: Uso de expresiones de valores SQL avanzadas 209
Las expresiones de valor de fila le permiten codificar la misma lógica, de la siguiente manera:
SELECCIONAR * DE ALIMENTOS
DONDE ([Link]ÍAS, [Link]ÍNA, [Link],
[Link])
=
([Link], [Link], [Link],
[Link]) ;
En este capítulo
▶ Especificación de las tablas con las que desea trabajar
▶ Separar filas de interés del resto
▶ Edificio efectivoDÓNDEclausulas
▶ Manejo de valores nulos
▶ Construyendo expresiones compuestas con conectivos lógicos.
▶ Agrupación de resultados de consultas por columna
SQL le permite utilizar algunas características de los datos para determinar si una fila de
la tabla en particular es de su interés. ElSELECCIONAR, BORRAR, yACTUALIZAR
declaraciones transmiten a la base de datosmotor(la parte del DBMS que interactúa
directamente con los datos), qué filas seleccionar, eliminar o actualizar. Agrega cláusulas
modificatorias alSELECCIONAR, BORRAR,yACTUALIZARdeclaraciones para refinar la
búsqueda según sus especificaciones.
Cláusulas modificatorias
Las cláusulas modificadoras disponibles en SQL sonDE, DONDE, TENER, AGRUPAR POR, y
ORDENAR [Link] cláusula le dice al motor de base de datos en qué tabla o tablas
operar. ElDÓNDEyTENIENDOLas cláusulas especifican una característica de datos que
determina si se incluye o no una fila particular en la operación actual. ElAGRUPAR PORy
ORDENAR PORLas cláusulas especifican cómo mostrar las filas recuperadas. La Tabla 10-1
proporciona un resumen.
212 Parte III: Almacenamiento y recuperación de datos
AGRUPAR POR Separa filas en grupos según los valores de las columnas
de agrupación
ORDENAR POR Ordena los resultados de cláusulas anteriores para producir el resultado final.
SELECCIONARlista_columnas
DElista_tabla
[DÓNDEcondición_búsqueda]
[AGRUPAR PORcolumna_agrupación]
[TENIENDOcondición_búsqueda]
[ORDENAR POR condición_pedido];
✓ ElDÓNDELa cláusula es un filtro que pasa las filas que cumplen con la condición de
búsqueda y rechaza las filas que no cumplen con la condición.
✓ ElORDENAR PORLa cláusula ordena lo que queda después de que todas las cláusulas
anteriores procesen la tabla.
Como indican los corchetes ([ ]), elDONDE, AGRUPAR POR, TENER,y ORDENAR
PORLas cláusulas son opcionales.
SQL evalúa estas cláusulas en el ordenDE, DÓNDE, AGRUPAR POR, TENER, y finalmente
[Link] cláusulas funcionan como una tubería: cada cláusula recibe el resultado
de la cláusula anterior y produce un resultado para la siguiente cláusula. En notación
funcional, este orden de evaluación aparece de la siguiente manera:
SELECCIONAR(TENIENDO(GRUPO POR(DONDE(DESDE...))))
Capítulo 10: Centrándose en los datos que desea 213
ORDENAR PORopera despuésSELECCIONAR,lo que explica por quéORDENAR PORsólo puede hacer
referencia a columnas en [Link] PORNo puedo hacer referencia a otras
columnas en elDEmesas).
DE Cláusulas
ElDELa cláusula es fácil de entender si especifica solo una tabla, como en el
siguiente ejemplo:
SELECCIONAR * DE VENTAS ;
Esta declaración devuelve todos los datos en todas las filas de cada columna de la tabla
VENTAS. Sin embargo, puede especificar más de una tabla en unDEcláusula. Considere el
siguiente ejemplo:
SELECCIONAR *
DEL CLIENTE, VENTAS;
Esta declaración forma una tabla virtual que combina los datos de la tabla CLIENTE
con los datos de la tabla VENTAS. (Para obtener más información sobre las tablas
virtuales, consulte el Capítulo 6). Cada fila de la tabla CLIENTE se combina con cada
fila de la tabla VENTAS para formar la nueva tabla. La nueva tabla virtual que forma
esta combinación contiene el número de filas de la tabla CLIENTE multiplicado por el
número de filas de la tabla VENTAS. Si la tabla CLIENTE tiene 10 filas y la tabla
VENTAS tiene 100, entonces la nueva tabla virtual tiene 1000 filas.
DÓNDE Cláusulas
Yo uso elDÓNDEcláusula muchas veces a lo largo de este libro sin explicarla
realmente porque su significado y uso son obvios: Una declaración realiza
214 Parte III: Almacenamiento y recuperación de datos
SELECCIONARlista_columnas
DEnombre de la tabla
DÓNDEcondición;
ACTUALIZARnombre de la tabla
SET columna =
1
valor, columna
1
= valor,
2
..., columna
2
= valor DONDE
condición;
norte norte
✓ Predicados de comparación
✓ ENTRE
✓ EN [NO EN]
✓ ME GUSTA [NO ME GUSTA]
✓ NULO
✓ TODOS, ALGUNOS, CUALQUIER
✓ EXISTE
Capítulo 10: Centrándose en los datos que desea 215
✓ ÚNICO
✓ SUPERPOSICIONES
✓ FÓSFORO
✓ SIMILAR
✓ DISTINTO
Predicados de comparación
Los ejemplos de la sección anterior muestran usos típicos de predicados de
comparación en los que se compara un valor con otro. Para cada fila en la que la
comparación se evalúa como un valor Verdadero, ese valor satisface el DÓNDE
cláusula, y la operación (SELECCIONAR, ACTUALIZAR, BORRAR,o lo que sea) se
ejecuta en esa fila. Filas que la comparación evalúaFALSOse omiten. Considere la
siguiente declaración SQL:
SELECCIONAR * DE ALIMENTOS
DONDE Calorías <219;
Esta declaración muestra todas las filas de la tabla ALIMENTOS que tienen un
valor inferior a 219 en elcaloríascolumna.
Comparación Símbolo
Igual =
No es igual <>
Menos que <
Menor o igual <=
Mas grande que >
Mayor que o igual >=
ENTRE
A veces desea seleccionar una fila si el valor de una columna se encuentra dentro de un rango
específico. Una forma de realizar esta selección es mediante predicados de comparación. Por
ejemplo, puedes formular unaDÓNDEcláusula para seleccionar todas las filas en
216 Parte III: Almacenamiento y recuperación de datos
la tabla ALIMENTOS que tienen un valor en elcaloríascolumna mayor que 100 y menor que
300, de la siguiente manera:
Esta comparación no incluye alimentos con un recuento de calorías de exactamente 100 o 300,
solo aquellos valores que caenentreestos dos números. Para incluir los puntos finales (en este
caso, 100 y 300), puedes escribir la declaración de la siguiente manera:
Otra forma de especificar un rango que incluya los puntos finales es utilizar un
ENTREpredicado de la siguiente manera:
Sin embargo, una cláusula que usted pueda pensar que es equivalente al ejemplo anterior
devuelve el resultado opuesto, Falso:
EN y NO EN
ElENyNO ENLos predicados tratan de si los valores especificados (como OR, WA e ID)
están contenidos dentro de un conjunto particular de valores (como los estados de los
Estados Unidos). Por ejemplo, es posible que tenga una tabla que enumere los
proveedores de un producto básico que su empresa compra periódicamente. Quiere
saber los números de teléfono de los proveedores ubicados en el noroeste del Pacífico.
Puede encontrar estos números utilizando predicados de comparación, como los que
se muestran en el siguiente ejemplo:
También puedes utilizar elENpredicado para realizar la misma tarea, de la siguiente manera:
ElNO ENLa versión de este predicado funciona de la misma manera. Supongamos que tiene
ubicaciones en California, Arizona y Nuevo México y, para evitar pagar impuestos sobre las ventas,
desea considerar la posibilidad de utilizar proveedores ubicados en cualquier lugar excepto en esos
estados. Utilice la siguiente construcción:
Utilizando elENLa palabra clave de esta manera le ahorra tener que escribir un poco, aunque
(francamente) eso no es una gran ventaja. Puede hacer el mismo trabajo utilizando predicados de
comparación como se muestra en el primer ejemplo de esta sección.
Es posible que tenga otra buena razón para utilizar elENpredicado en lugar de predicados de
comparación, incluso si se utilizaENno ahorra mucho tipeo: su DBMS probablemente
implemente los dos métodos de manera diferente, y uno de los métodos puede ser
significativamente más rápido que el otro en su sistema. Es posible que desee realizar una
comparación de desempeño entre las dos formas de expresar la inclusión en (o
218 Parte III: Almacenamiento y recuperación de datos
exclusión de) un grupo y luego utilizar la técnica que produzca el resultado más rápido.
Un DBMS con un buen optimizador probablemente elegirá el método más eficiente,
independientemente del predicado que utilice.
ElENLa palabra clave también es valiosa en otra área. SiENes parte de una subconsulta, la
palabra clave le permite extraer información de dos tablas para obtener resultados que no
puede obtener de una sola tabla. Cubro las subconsultas en detalle en el Capítulo 12, pero
aquí hay un ejemplo que muestra cómo una subconsulta usa elEN palabra clave.
Suponga que desea mostrar los nombres de todos los clientes que compraron el producto F-35
en los últimos 30 días. Los nombres de los clientes están en la tabla CLIENTE y los datos de las
transacciones de ventas están en la tabla TRANSACT. Puede utilizar la siguiente consulta:
ME GUSTA Y NO ME GUSTA
Puedes usar elCOMOpredicado para comparar dos cadenas de caracteres para una
coincidencia parcial. Las coincidencias parciales son valiosas si no conoce la forma exacta de
la cadena que está buscando. También puede utilizar coincidencias parciales para recuperar
varias filas que contengan cadenas similares en una de las columnas de la tabla.
Para identificar coincidencias parciales, SQL utiliza dos caracteres comodín. El signo de
porcentaje (%) puede representar cualquier cadena de caracteres que tenga cero o más
caracteres. El guión bajo (_) representa cualquier carácter individual. La Tabla 10-3 proporciona
algunos ejemplos que muestran cómo utilizarCOMO.
Capítulo 10: Centrándose en los datos que desea 219
interno
internacional
Internet
pasantes
grifos
tipi
Consejos
Tapas
Tipo
ElDIFERENTE Apredicado recupera todas las filas que no satisfacen una coincidencia
parcial, incluidos uno o más caracteres comodín, como en el siguiente ejemplo:
Este ejemplo devuelve todas las filas de la tabla cuyo número de teléfono
comienza con algo distinto de 503.
Es posible que desee buscar una cadena que incluya un signo de porcentaje o un guión
bajo real. En ese caso, desea que SQL interprete el signo de porcentaje como un signo de
porcentaje y no como un carácter comodín. Puede realizar dicha búsqueda escribiendo
un carácter de escape justo antes del carácter que desea que SQL tome literalmente.
Puede elegir cualquier carácter como carácter de escape siempre que ese carácter no
aparezca en la cadena que está probando, como se muestra en el siguiente ejemplo:
SELECCIONAR Cotización
DE BARLETTS
DONDE Cita COMO '20#%'
ESCAPAR '#' ;
220 Parte III: Almacenamiento y recuperación de datos
20%
SIMILAR
SQL: 1999 agregó elSIMILARpredicado, que ofrece una manera más poderosa de
encontrar coincidencias parciales que elCOMOpredicado proporciona. Con elSIMILAR
predicado, puede comparar una cadena de caracteres con una expresión regular. Por
ejemplo, supongamos que está buscando elSistema operativocolumna de una tabla de
compatibilidad de software para buscar compatibilidad con Microsoft Windows. Podrías
construir unDÓNDEcláusula como la siguiente:
Este predicado recupera todas las filas que contienen cualquiera de los sistemas operativos de
Microsoft especificados.
NULO
ElNULOEl predicado busca todas las filas donde el valor de la columna seleccionada es
nulo. En la tabla ALIMENTOS del Capítulo 8, varias filas tienen valores nulos en el
Carbohidratocolumna. Puede recuperar sus nombres utilizando una declaración como
la siguiente:
SELECCIONAR (Comida)
DE ALIMENTOS
DONDE Carbohidrato ES NULO;
SELECCIONAR (Comida)
DE ALIMENTOS
DONDE Carbohidrato NO ES NULO;
Esta consulta devuelve todas las filas de la tabla excepto las cuatro que devuelve la
consulta anterior.
Hace miles de años, el filósofo griego Aristóteles formuló un sistema de lógica que se convirtió
en la base de gran parte del pensamiento occidental. La esencia de esta lógica es comenzar con
un conjunto de premisas que sabemos que son verdaderas, aplicar operaciones válidas a estas
premisas y, de ese modo, llegar a nuevas verdades. Un ejemplo de este procedimiento es el
siguiente:
Otro ejemplo:
A modo de presentar un tercer ejemplo, permítanme exponer la misma idea lógica del
segundo ejemplo de una manera ligeramente diferente:
Si algunos griegos son mujeres y todas las mujeres son humanas, entonces algunos griegos son
humanos.
La Liga Americana permite que un bateador designado (DH) (que no está obligado a jugar en
una posición defensiva) batee en lugar de cualquiera de los nueve jugadores que juegan a la
defensiva. La Liga Nacional no permite bateadores designados, pero sí permite bateadores
emergentes. Cuando el bateador emergente entra al juego por el lanzador, el lanzador no
puede jugar por el resto del juego. Por lo general, el bateador designado batea por el lanzador,
porque los lanzadores son notoriamente malos bateadores. Los lanzadores deben dedicar
tanto tiempo y esfuerzo a perfeccionar su lanzamiento que no tienen tanto tiempo para
practicar el bateo como los demás jugadores.
Suponga que tiene la teoría de que, en promedio, los lanzadores abridores de la Liga
Americana lanzan juegos más completos que los lanzadores abridores de la Liga Nacional. Esta
idea se basa en su observación de que los bateadores designados permiten que los lanzadores
de la Liga Americana que lanzan con fuerza y batean débilmente sigan lanzando mientras
sean efectivos, incluso en un juego cerrado. Debido a que un bateador designado ya está
bateando por estos lanzadores, su mal bateo no es un problema. En la Liga Nacional, sin
embargo, en circunstancias cotidianas el lanzador iría al bate. Cuando estaban perdiendo en las
últimas entradas, la mayoría de los managers pedían un bateador emergente para batear por
el lanzador, juzgando que conseguir un hit en esta situación es más importante que mantener
a un lanzador efectivo en el juego. Para probar su teoría, formula la siguiente consulta:
La subconsulta (la internaSELECCIONAR)devuelve una lista que muestra, para cada lanzador
de la Liga Nacional, el número de juegos completos que lanzó. La consulta externa devuelve el
nombre y apellido de todos los jugadores de la Liga Americana que lanzaron más juegos
completos queTODOde los jugadores de la Liga Nacional. La consulta completa devuelve los
nombres de los lanzadores de la Liga Americana que lanzaron más juegos completos que el
lanzador que lanzó la mayor cantidad de juegos completos en la Liga Nacional.
EXISTE
Puedes usar elEXISTEpredicado junto con una subconsulta para determinar si
la subconsulta devuelve alguna fila. Si la subconsulta devuelve al menos una
fila, ese resultado satisface laEXISTEcondición y se ejecuta la consulta externa.
Considere el siguiente ejemplo:
La subconsulta del ejemplo anterior devuelve una fila por cada cliente que
ha realizado al menos una compra. La consulta externa devuelve el nombre
y apellido de los clientes que realizaron las compras que registra la tabla
SALES.
Por cada fila de la tabla VENTAS que contenga unIdentificación del clienteeso es
igual a unIdentificación del clienteen la tabla CLIENTE, esta declaración muestra el
Nombre de pilayApellidocolumnas de la tabla CLIENTE. Por lo tanto, para cada
venta en la tabla VENTAS, el extracto muestra el nombre del cliente que realizó la
compra.
ÚNICO
Como lo haces con elEXISTEpredicado, se utiliza elÚNICOpredicado con una
subconsulta. Aunque elEXISTEEl predicado se evalúa como Verdadero solo si la
subconsulta devuelve al menos una fila, elÚNICOEl predicado se evalúa como Verdadero
solo si no hay dos filas devueltas por la subconsulta que sean idénticas. En otras
palabras, elÚNICOEl predicado se evalúa como Verdadero solo si todas las filas que
devuelve su subconsulta son únicas. Considere el siguiente ejemplo:
Esta declaración recupera los nombres de todos los clientes nuevos para quienes la tabla
SALES registra solo una venta. Como un valor nulo es un valor desconocido, dos valores
nulos no se consideran iguales entre sí; cuando elÚNICOLa palabra clave se aplica a una
tabla de resultados que contiene sólo dos filas nulas, laÚNICOEl predicado se evalúa
como Verdadero.
DISTINTO
ElDISTINTOEl predicado es similar alÚNICOpredicado, excepto en la forma en que trata
los nulos. Si todos los valores en una tabla de resultados sonÚNICO,entonces ellos
también sonDISTINTOde cada uno. Sin embargo, a diferencia del resultado para el
ÚNICO predicado, si elDISTINTOLa palabra clave se aplica a una tabla de resultados que
contiene sólo dos filas nulas, laDISTINTOEl predicado se evalúa como Falso. Dos valores
nulos sonnoSe consideran distintos entre sí, al mismo tiempo que se consideran únicos.
Esta extraña situación parece contradictoria, pero tiene una razón. En algunas
situaciones, es posible que desee tratar dos valores nulos como diferentes entre sí,
en cuyo caso, utilice elÚNICOpredicado. Cuando desee tratar los dos valores nulos
como si fueran iguales, utilice elDISTINTOpredicado.
226 Parte III: Almacenamiento y recuperación de datos
SUPERPOSICIONES
Este primer ejemplo devuelve True porque las 3:30 son menos de una hora después de las 2:55.
Este ejemplo devuelve True porque hay una superposición de un minuto entre los
dos intervalos.
Este ejemplo devuelve False porque aunque los dos intervalos son contiguos,
no se superponen.
FÓSFORO
En el Capítulo 5, analizo la integridad referencial, que implica mantener la coherencia en una
base de datos de tablas múltiples. Puede perder integridad agregando una fila a una tabla
secundaria que no tiene una fila correspondiente en la tabla principal de la secundaria. Puede
causar problemas similares eliminando una fila de una tabla principal si las filas
correspondientes a esa fila existen en una tabla secundaria.
Suponga que su empresa tiene una tabla CLIENTE que realiza un seguimiento de
todos sus clientes y una tabla VENTAS que registra todas las transacciones de ventas.
No desea agregar una fila a VENTAS hasta que ingrese el cliente que realiza la
Capítulo 10: Centrándose en los datos que desea 227
compra en la tabla CLIENTE. Tampoco desea eliminar un cliente de la tabla
CLIENTE si ese cliente realizó compras que existen en la tabla VENTAS.
Antes de realizar una inserción o eliminación, es posible que desee verificar la fila
candidata para asegurarse de que insertar o eliminar esa fila no cause problemas de
integridad. ElFÓSFOROEl predicado puede realizar tal verificación.
Digamos que tiene una tabla CLIENTE y una tabla [Link]ón del clientees la clave
principal de la tabla CLIENTE y actúa como clave externa en la tabla VENTAS. Cada fila de la
tabla CLIENTE debe tener un nombre ú[Link]ón del clienteeso no es nulo.
Identificación del clienteno es único en la tabla VENTAS, porque los clientes habituales compran
más de una vez. Esta situación está bien; no amenaza la integridad porqueIdentificación del
clientees una clave externa en lugar de una clave primaria en esa tabla.
Si elFÓSFOROEl predicado devuelve un valor Verdadero, la base de datos contiene una venta
del F-35 el 18 de diciembre de 2012 a este [Link]ón del [Link] el
producto defectuoso y reembolsar el dinero al cliente. (Nota:Si algún valor en el primer
argumento delFÓSFOROpredicado son nulos, siempre se devuelve un valor Verdadero.)
ElÚNICO, SIMPLE, PARCIAL,yLLENOLas opciones se relacionan con reglas que entran en juego si la
expresión del valor de la filaRtiene una o más columnas que son nulas. (Para obtener más información
sobre el uso de expresiones de valor de fila, consulte el Capítulo 9.) Las reglas para laFÓSFOROEl
predicado es una copia de las correspondientes reglas de integridad referencial.
Si los miembros del par clave externa/clave primaria constan de una sola columna,
la situación es bastante sencilla. Sin embargo, las dos claves pueden constar de
varias columnas. ElDptoNoEl valor, por ejemplo, puede ser único sólo dentro de un
Ubicación;por lo tanto, para identificar de forma única unDEPARTAMENTOfila, debe
especificar tanto unUbicacióny [Link] las oficinas de Boston y Tampa tienen
un departamento 123, debe identificar los departamentos como ("Bostón", "123")y ('
Tampa’, ‘123’).En este caso, la tabla EMPLEADO necesita dos columnas para
identificar unDEPARTAMENTOLlame a esas columnasEmpLocy [Link] un
empleado trabaja en el departamento 123 en Boston, elEmpLoc yEmpDeptoNolos
valores son 'Bostón'y '123'.Y la declaración de clave externa en la tabla EMPLEADO
se ve así:
A continuación se muestran escenarios que ilustran las reglas para tratar con valores nulos y la
FÓSFOROpredicado:
✓ Los valores son de una forma u [Link] ninguno de los valores de EmpLocy
EmpDeptoNoson nulas (o ambas son nulas), entonces las reglas de integridad
referencial son las mismas que para las claves de una sola columna con valores que son
nulos o no nulos.
Conectivos Lógicos
A menudo (como muestran varios ejemplos anteriores) aplicar una condición en una
consulta no es suficiente para devolver las filas que desea de una tabla. En algunos casos,
las filas deben cumplir dos o más condiciones. En otros casos, si una fila cumple
cualquiera de dos o más condiciones, califica para su recuperación. En otras ocasiones,
desea recuperar sólo filas que no satisfacen una condición específica. Para satisfacer
estas necesidades, SQL ofrece los conectores lógicosY, O,yNO.
Y
Si varias condiciones deben ser verdaderas antes de poder recuperar una fila, utilice la
opción Yconectivo lógico. Considere el siguiente ejemplo:
Sólo las filas que registran ventas realizadas durante la semana del 14 de diciembre cumplen
ambas condiciones. La consulta devuelve sólo estas filas.
Note que elYEl conectivo es estrictamente lógico. Esta restricción a veces puede
resultar confusa porque la gente suele utilizar la palabraycon un significado más
vago. Supongamos, por ejemplo, que su jefe le dice: "Me gustaría recuperar los
datos de ventas de Ferguson y Ford". Dijo "Ferguson y Ford", por lo que puede
escribir la siguiente consulta SQL:
SELECCIONAR *
DE VENTAS
DONDE Vendedor = 'Ferguson'
AND Vendedor = 'Ford';
SELECCIONAR *
DE VENTAS
DONDE Vendedor EN ('Ferguson', 'Ford');
La primera consulta no devolverá nada, porque ninguna de las ventas en la tabla SALES
fue realizada porambosFerguson y Ford. La segunda consulta devolverá la información
de todas las ventas realizadas porcualquieraFergusonoFord, que probablemente era lo
que quería el jefe.
O
Si cualquiera de dos o más condiciones debe ser Verdadera para calificar una fila para
su recuperación, use elOconectivo lógico, como en el siguiente ejemplo:
Esta consulta recupera todas las ventas de Ford, independientemente de su tamaño, así como todas las
ventas de más de $200, independientemente de quién realizó las ventas.
232 Parte III: Almacenamiento y recuperación de datos
NO
ElNOEl conectivo niega una condición. Si la condición normalmente devuelve un valor
Verdadero, sumandoNOhace que la misma condición devuelva un valor Falso. Si una
condición normalmente devuelve un valor Falso, sumandoNOhace que la condición
devuelva un valor Verdadero. Considere el siguiente ejemplo:
Esta consulta devuelve filas para todas las transacciones de ventas completadas por vendedores
distintos de Ford.
cuando usasY, O,oNO,A veces el alcance del conectivo no está claro. Para
estar seguro, use paréntesis para asegurarse de que SQL aplique el conectivo
al predicado que desea. En el ejemplo anterior, elNOEl conectivo se aplica a
todo el predicado (Vendedor = 'Ford').
Cláusulas GROUP BY
A veces, en lugar de recuperar registros individuales, desea saber algo sobre un grupo
de registros. ElAGRUPAR PORLa cláusula es la herramienta que necesitas.
Este resultado le da una idea de qué tan bien les está yendo a sus vendedores porque se
trata de muy pocas ventas totales. Sin embargo, en la vida real, una empresa tendría
muchas más ventas y no sería tan fácil saber si se están cumpliendo los objetivos de
ventas. Para hacer el análisis real, puedes combinar losAGRUPAR PORcláusula con uno
de losagregarfunciones (también llamadasestablecer funciones) para obtener una
imagen cuantitativa del desempeño de las ventas. Por ejemplo, puede ver qué vendedor
vende más artículos rentables de alto precio utilizando el promedio (promedio)funcionar
de la siguiente manera:
Figura 10-1:
Un resultado
establecido para
recuperación de
ventas de
01/12/2012 a
07/12/2012.
Figura 10-2:
Promedio
ventas para
cada
vendedor.
Bennett también tiene las ventas totales más altas, lo que es consistente con tener el
promedio de ventas más alto.
234 Parte III: Almacenamiento y recuperación de datos
Figura 10-3:
Ventas totales
para cada
vendedor.
TENER Cláusulas
Puede analizar más los datos agrupados utilizando elTENIENDOcláusula. El TENIENDOcláusula
es un filtro que actúa de manera similar a unDÓNDEcláusula, pero en grupos de filas en lugar
de filas individuales. Para ilustrar la función delTENIENDO cláusula, supongamos que el
gerente de ventas considera que Bennett es único en su clase. Su desempeño distorsiona los
datos generales para los demás vendedores. (Ajá, un destructor de curvas). Puede excluir las
ventas de Bennett de los datos agrupados utilizando unTENIENDOcláusula de la siguiente
manera:
Figura 10-4:
Ventas totales
para todos
vendedores
excepto
Bennet.
Capítulo 10: Centrándose en los datos que desea 235
Para ilustrar este punto, considere los datos de la tabla VENTAS. La tabla
VENTAS contiene columnas paraNúmero de factura, Fecha de venta,
Vendedor,y Venta [Link] utiliza el siguiente ejemplo, verá todos los datos en
la tabla VENTAS, pero en un orden arbitrario:
SELECCIONAR * DE VENTAS ;
En una implementación, este puede ser el orden en que insertó las filas en la tabla; en otra
implementación, el orden puede ser el de las actualizaciones más recientes. El orden también
puede cambiar inesperadamente si alguien reorganiza físicamente la base de datos. Ésa es
una de las razones por las que suele ser una buena idea especificar el orden en el que desea
que aparezcan las filas. Es posible que, por ejemplo, desee ver las filas ordenadas porFecha de
ventacomo esto:
Este ejemplo devuelve todas las filas de la tabla VENTAS en orden porFecha de venta.
En este ejemplo primero se ordenan las ventas porFecha de venta;entonces para cadaFecha de
venta,ordena las ventas porFactura [Link] no confunda ese ejemplo con la siguiente
consulta:
Esta consulta primero ordena las ventas porFACTURA [Link] para cada uno diferente
Factura no,la consulta ordena las ventas porFecha de [Link] esto no
produzca el resultado que desea, porque es poco probable que existan varias fechas de
venta para un único número de factura.
236 Parte III: Almacenamiento y recuperación de datos
Este ejemplo primero ordena porvendedory luego porFecha de [Link]és de observar los
datos en ese orden, es posible que desee invertirlos, de la siguiente manera:
Este ejemplo ordena las filas primero porFecha de ventay luego porVendedor.
Todos estos ejemplos de orden están en orden ascendente (ASC)orden, que es el orden de
clasificación predeterminado. El últimoSELECCIONARmuestra primero las ventas anteriores y, dentro
de una fecha determinada, muestra las ventas de "Adamsantes 'Panadero'.Si prefieres descender (
DESC)orden, puede especificar este orden para una o más de las columnas de orden, de la siguiente
manera:
SELECCIONAR * DE VENTAS
ORDEN POR Fecha de venta DESC, Vendedor ASC;
Este ejemplo especifica un orden descendente para las fechas de venta, mostrando
primero las ventas más recientes, y un orden ascendente para los vendedores,
colocándolos en orden alfabético. Eso debería darle una mejor idea de cómo se
compara el desempeño de Bennett con el de los demás vendedores.
FETCH limitado
Siempre que se cambia el estándar ISO/IEC SQL, generalmente es para ampliar las
capacidades del lenguaje. Ésto es una cosa buena. Sin embargo, a veces cuando se
realiza un cambio de este tipo no se pueden anticipar todas las posibles
consecuencias. Esto sucedió con la adición de limitadoBUSCARcapacidad en SQL:2008.
Eso se ve bien. Quiere ver quiénes son sus tres principales vendedores en términos de
aquellos que venden principalmente productos de alto precio. Sin embargo, hay un
Capítulo 10: Centrándose en los datos que desea 237
pequeño problema con esto. ¿Qué pasa si tres personas están empatadas con la misma venta
total promedio, por debajo de los dos mejores vendedores? Sólo uno de esos tres será
devuelto. ¿Cuál? Es indeterminado.
La indeterminación es intolerable para cualquier persona que se precie de bases de datos, por lo que
esta situación se corrigió en SQL:2011. Se agregó nueva sintaxis para incluir vínculos, de esta manera:
Ahora el resultado está completamente determinado: si hay un empate, obtienes todas las
filas empatadas. Como antes, si dejas fuera elCON LAZOSmodificador, el resultado es
indeterminado.
Es concebible que pueda haber un problema con los empates cuando se trata de
porcentajes, tal como ocurre con un simple número de registros, por lo que elCON LAZOSLa
sintaxis también se puede utilizar aquí. Puedes incluir ataduras o no, dependiendo de lo que
quieras en cada situación en particular.
En segundo lugar, supongamos que no quiere los tres primeros o el diez por ciento
superior, sino el segundo tres o el segundo diez por ciento. Quizás desee saltar
directamente a algún punto profundo del conjunto de resultados. SQL:2011 también
cubre esta situación. El código sería similar a este:
ElCOMPENSARLa palabra clave indica cuántas filas se deben omitir antes de recuperarlas. La
palabra clave NEXT especifica que las filas que se recuperarán son las que siguen
inmediatamente al desplazamiento. Ahora los vendedores con el cuarto, quinto y sexto
238 Parte III: Almacenamiento y recuperación de datos
Se devuelve el total de venta promedio más alto. Como puedes ver, sin elCON
LAZOSsintaxis, todavía existe un problema de indeterminación. Si el tercer, cuarto y
quinto vendedor están empatados, es indeterminado cuáles dos se incluirán en
este segundo lote y cuál habrá sido incluido en el primer lote.
Quizás sea mejor evitar el uso de la capacidad FETCH limitada. Es muy probable que
produzca resultados engañosos.
Una función de ventana calcula un valor para una fila R, basándose en las filas en el marco
de la ventana de R.
Por ejemplo, suponga que tiene una tabla VENTAS que tiene las columnas CustID,
InvoiceNo y TotalSale. Es posible que su gerente de ventas quiera saber cuáles fueron
las ventas totales a cada cliente en un rango específico de números de factura. Puede
obtener lo que quiere con el siguiente código SQL:
ElENCIMALa cláusula determina cómo se dividen las filas de la consulta antes de ser
procesadas, en este caso por elSUMAfunción. Se asigna una partición a cada cliente.
Dentro de cada partición habrá una lista de números de factura, y asociado a cada
uno de ellos estará la suma de todos losVenta total valores en el rango especificado
de filas, para cada cliente.
Si hay, por ejemplo, 11 empleados, cada cubo se llena con dos excepto el
primer cubo, que se llena con tres. El primer grupo contendrá a los tres
empleados mejor pagados y el quinto grupo contendrá a los dos empleados
peor pagados.
Supongamos, por ejemplo, que tiene una tabla que registra las ventas totales de cada
día del año actual. Una cosa que quizás quieras saber es cómo se comparan las ventas
de hoy con las de ayer. Podrías hacer esto con elRETRASOfunción, de la siguiente
manera:
Para cada fila enTotales diarios,esta consulta devolvería una fila que enumera la cifra de ventas
totales de esa fila y la cifra de ventas totales del día anterior. El desplazamiento predeterminado es 1,
por lo que se devuelve el resultado del día anterior en lugar de cualquier otro.
Para comparar las ventas del día actual con las de la semana anterior, puede utilizar lo
siguiente:
Las primeras siete filas en el marco de una ventana no tendrán un predecesor que sea una
semana mayor. La respuesta predeterminada a esta situación es devolver un resultado nulo
[Link] prefiere algún otro resultado a un resultado nulo, por ejemplo cero,
puede especificar lo que desea que se devuelva en esta situación en lugar del valor nulo
predeterminado, por ejemplo, 0 (cero), como se muestra aquí:
✓ Se forma el marco de ventana asociado con la fila actual. Incluye las diez
filas anteriores y las diez siguientes.
✓ Venta totalse evalúa en cada fila del marco de la ventana.
✓ IGNORAR NULLSse especifica, por lo que cualquier fila que contenga un valor nulo
para Venta totalse omiten.
✓ A partir del primer valor restante después de la exclusión de las filas que
contienen un valor nulo para TotalSale, avance dos filas (adelante porque
DESDE PRIMEROfue especificado).
Si no desea omitir filas que tienen un valor nulo paraVenta total,especificar RESPETO
NULOSen vez deIGNORAR NULLS.ElNTH_VALUELa función funciona de manera similar si
especificaDESDE LA ULTIMAen lugar deDESDE PRIMERO,excepto que en lugar de contar
hacia adelante desde el primer registro en el marco de la ventana, se cuenta hacia atrás
desde el último registro en el marco de la ventana. El número que especifica el número
de filas a contar sigue siendo positivo, aunque esté contando hacia atrás en lugar de
hacia adelante.
La ventana abarca las 100 filas que preceden a la fila actual, que corresponden
a las 100 ventas inmediatamente anteriores al momento actual. Cada vez que
se evalúa una fila donde el valor dePrecio de ventaes menor que el precio más
reciente, se suma 1 a la suma. El resultado final es un número que indica el
número de ventas de las cien anteriores que se realizaron a un precio inferior
al precio actual.
He aquí un ejemplo:
En este capítulo
▶ Combinando tablas con estructuras similares
▶ Combinando mesas con diferentes estructuras.
▶ Derivar datos significativos de múltiples tablas
Debido a que los datos de una base de datos relacional se distribuyen en varias tablas,
una consulta normalmente extrae datos de más de una tabla. SQL tiene operadores que
combinan datos de múltiples fuentes en una única tabla de resultados. Estos son los
UNIÓN, INTERSECCIÓN,yEXCEPTOoperadores, así como una familia de UNIRSE
operadores. Cada operador combina datos de varias tablas de forma diferente.
UNIÓN
ElUNIÓNoperador es la implementación SQL del operador de unión del álgebra
relacional. ElUNIÓNEl operador le permite extraer información de dos o más
tablas que tienen la misma [Link] estructuramedio
Cuando se cumplen estos criterios, las tablas secompatible con la unión:La unión de las dos
tablas devuelve todas las filas que aparecen en cualquiera de las tablas y elimina duplicados.
244 Parte III: Almacenamiento y recuperación de datos
Supongamos que crea una base de datos de estadísticas de béisbol (como la del Capítulo 12).
Contiene dos tablas compatibles con sindicatos denominadas AMERICAN y NATIONAL.
Ambas tablas tienen tres columnas y las columnas correspondientes son todas del mismo
tipo. De hecho, las columnas correspondientes tienen nombres de columna idénticos
(aunque esta condición no es necesaria para la compatibilidad de la unión).
NACIONAL enumera los nombres de los jugadores y la cantidad de juegos completos lanzados
por los lanzadores de la Liga Nacional. AMERICAN enumera la misma información sobre los
lanzadores de la Liga Americana. ElUNIÓNde las dos tablas le brinda una tabla de resultados
virtual que contiene todas las filas de la primera tabla más todas las filas de la segunda tabla.
Para este ejemplo, puse sólo unas pocas filas en cada tabla para ilustrar la operación:
SELECCIONAR * DE NACIONAL ;
Nombre de pila Apellido Juegos Completos
--------- -------- -------------
Sal maglia 11
Don Newcombe 9
Arenoso Koufax 13
Don Drysdale 12
SELECCIONAR * DE AMERICANO ;
SELECCIONAR * DE UNIÓN
NACIONAL
SELECCIONAR * DE AMERICANO ;
Refiriéndose al ejemplo, supongamos que “Bullet” Bob Turley hubiera sido canjeado a
mitad de temporada de los Yankees de Nueva York en la Liga Americana a los Dodgers
de Brooklyn en la Liga Nacional. Ahora supongamos que durante la temporada lanzó
ocho juegos completos para cada equipo. Lo ordinario UNIÓNque se muestra en el
ejemplo descarta una de las dos líneas que contienen los datos de Turley. Aunque
pareció lanzar sólo 8 juegos completos en la temporada, en realidad lanzó la notable
cantidad de 16 juegos completos. La siguiente consulta le proporciona los hechos
reales:
SELECCIONAR * DE NACIONAL
UNIÓN TODOS
SELECCIONAR * DE AMERICANO ;
A veces puedes formar unUNIÓNde dos tablas incluso si no son compatibles con la
unión. Si las columnas que desea en su tabla de resultados están presentesy
compatiblesEn ambas tablas, puedes realizar unaUNIÓN CORRESPONDIENTEoperación.
Solo se consideran las columnas especificadas y son las únicas columnas que se
muestran en la tabla de resultados.
La operación CORRESPONDIENTE
Los estadísticos del béisbol mantienen estadísticas diferentes sobre los lanzadores que
sobre los jardineros. En ambos casos, nombres, apellidos, publicaciones, errores y
246 Parte III: Almacenamiento y recuperación de datos
Se registran los porcentajes de fildeo. Los jardineros, por supuesto, no tienen un récord de
victorias o derrotas, un récord de salvamentos ni otras estadísticas que se refieren únicamente
al lanzamiento. Todavía puedes realizar unUNIÓNque toma datos de la tabla OUTFIELDER y de
la tabla LANZADOR para brindarle información general sobre la habilidad defensiva:
SELECCIONAR *
DEL JARDINERO
UNIÓN CORRESPONDIENTE
(Nombre, Apellido, Salidas, Errores, Porcentaje de campo)
SELECCIONAR *
DEL LANZADOR ;
Cada nombre de columna en la lista que sigue alCORRESPONDIENTELa palabra clave debe ser
un nombre que exista en ambas tablas unidas. Si omite esta lista de nombres, se utiliza una
lista implícita de todos los nombres que aparecen en ambas tablas. Pero esta lista implícita de
nombres puede cambiar cuando se agregan nuevas columnas a una o ambas tablas. Por lo
tanto, es mejor enumerar explícitamente los nombres de las columnas que si los omite.
INTERSECARSE
ElUNIÓNLa operación produce una tabla de resultados que contiene todas las filas que
aparecen encualquierde las tablas fuente. Si desea solo filas que aparecen entodolas
tablas fuente, puede utilizar elINTERSECARSEoperación, que es la implementación SQL de
la operación de intersección del álgebra relacional. yo ilustroINTERSECARSE regresando al
mundo de fantasía en el que Bob Turley fue traspasado a los Dodgers a mitad de
temporada:
SELECCIONAR * DE NACIONAL;
Nombre de pila Apellido Juegos Completos
--------- -------- -------------
Sal maglia 11
Don Newcombe 9
Arenoso Koufax 13
Don Drysdale 12
Beto Turley 8
Capítulo 11: Uso de operadores relacionales 247
SELECCIONE * DE AMERICANO;
NOMBRE DE PILA APELLIDO JUEGOS_COMPLETOS
---------- --------- --------------
Persona blanca Vado 12
Don larson 10
Beto Turley 8
allie reynolds 14
Sólo las filas que aparecen en todas las tablas de origen aparecen en elINTERSECARSEtabla de
resultados de la operación:
SELECCIONAR *
DE NACIONAL
INTERSECARSE
SELECCIONAR *
DE AMERICANO;
La tabla de resultados le dice que Bob Turley fue el único lanzador que lanzó la misma
cantidad de juegos completos en ambas ligas (una distinción bastante oscura para el
viejo Bullet Bob).Nota:Como fue el caso deUNIÓN, INTERSECCIÓN DISTINTAproduce el
mismo resultado que elINTERSECARSEOperador utilizado solo. En este ejemplo, sólo una
de las filas idénticas que presentaBob Turleyes regresado.
SELECCIONAR *
DE NACIONAL
INTERSECTAR TODOS
SELECCIONAR *
DE AMERICANO;
Consideremos otro ejemplo: un municipio realiza un seguimiento de los teléfonos móviles que llevan
los agentes de policía, los bomberos, los barrenderos y otros empleados de la ciudad. Una tabla de
base de datos llamada PHONES contiene datos de todos los teléfonos activos.
248 Parte III: Almacenamiento y recuperación de datos
usar. Otra tabla denominada OUT, con idéntica estructura, contiene datos de todos los
teléfonos que han sido puestos fuera de servicio. Nunca deberían existir teléfonos en
ambas tablas. Con unINTERSECARSEoperación, puede probar para ver si se ha
producido una duplicación no deseada:
SELECCIONAR *
DESDE TELÉFONOS
INTERSECCIÓN CORRESPONDIENTE (PhoneID)
SELECCIONAR *
DESDE FUERA ;
Si esta operación le proporciona una tabla de resultados que contiene alguna fila, sabrá que
tiene un problema. Deberías investigar cualquierID de teléfonoentradas que aparecen en la
tabla de resultados. El teléfono correspondiente está activo o fuera de servicio; no pueden ser
ambas cosas. Después de detectar el problema, puede realizar unaBORRAR operación en una
de las dos tablas para restaurar la integridad de la base de datos.
EXCEPTO
ElUNIÓNLa operación actúa sobre dos tablas de origen y devuelve todas las filas que
aparecen en cualquiera de las tablas. ElINTERSECARSELa operación devuelve todas las filas
que aparecen tanto en la primera como en la segunda tabla. En contraste, elEXCEPTO (o
EXCEPTO DISTINTO)La operación devuelve todas las filas que aparecen en la primera tabla
pero quenoTambién aparecen en la segunda tabla.
SELECCIONAR *
DESDE FUERA
EXCEPTO CORRESPONDIENTE (PhoneID)
SELECCIONAR *
DESDE TELÉFONOS;
Esta consulta devuelve todas las filas de la tabla OUT cuyasID de teléfonotampoco está
presente en la tabla PHONES.
Capítulo 11: Uso de operadores relacionales 249
SQL admite varios tipos de combinaciones. El mejor para elegir en una situación
determinada depende del resultado que intentas lograr. Las siguientes secciones
le brindan los detalles.
Unión básica
Cualquier consulta de varias tablas es un tipo de unión. Las tablas de origen están unidas en
el sentido de que la tabla de resultados incluye información extraída de todas las tablas de
origen. La unión más simple es una de dos [Link] no tieneDÓNDE
Calificadores de cláusula: cada fila de la primera tabla se une a cada fila de la segunda tabla.
La tabla de resultados es el producto cartesiano de las dos tablas fuente. El número de filas de
la tabla de resultados es igual al número de filas de la primera tabla de origen multiplicado
por el número de filas de la segunda tabla de origen.
Por ejemplo, imagina que eres el director de personal de una empresa y que parte de tu
trabajo es mantener los registros de los empleados. La mayoría de los datos de los empleados,
como la dirección particular y el número de teléfono, no son particularmente confidenciales.
Pero algunos datos, como el salario actual, deberían estar disponibles sólo para el personal
autorizado. Para mantener la seguridad de la información confidencial, manténgala en una
tabla separada protegida con contraseña. Considere el siguiente par de tablas:
EMPLEADO COMPENSACIÓN
-------- ------------
EmpID Emplear
FNombre Salario
LNombre Prima
Ciudad
Teléfono
SELECCIONAR *
DEL EMPLEADO, COMPENSACIÓN ;
Cuando se intenta obtener información útil de una base de datos de varias tablas, el
producto cartesiano producido por una unión básica es casinuncalo que quieres,
pero ya casisiempreel primer paso hacia lo que quieres. Aplicando restricciones a la
UNIRSEcon unDÓNDEcláusula, puede filtrar las filas no deseadas. La siguiente
sección explica cómo filtrar las cosas que no necesita ver.
Capítulo 11: Uso de operadores relacionales 251
unión equivalente
La unión más común que utiliza elDÓNDEEl filtro de cláusula es el equi-join. Un unión equies
una unión básica con unDÓNDEcláusula que contiene una condición que especifica que el valor
de una columna de la primera tabla debe ser igual al valor de la columna correspondiente de la
segunda tabla. La aplicación de una combinación equivalente a las tablas de ejemplo de la
sección anterior produce un resultado más significativo:
SELECCIONAR *
DEL EMPLEADO, COMPENSACIÓN
DONDE [Link] = COMPENSACIÓ[Link];
SELECCIONAR EMPLEADO.*,COMPENSACIÓ[Link],COMPENSACIÓ[Link]ón
DEL EMPLEADO, COMPENSACIÓN
DONDE [Link] = COMPENSACIÓ[Link];
Esta tabla le dice lo que quiere saber pero no lo sobrecarga con datos superfluos. Sin embargo,
la consulta es algo tediosa de escribir. Para evitar ambigüedades, puede calificar los nombres
de las columnas con los nombres de las tablas de donde provienen. Escribir los nombres de las
tablas repetidamente proporciona un buen ejercicio para los dedos, pero no tiene ningún otro
beneficio.
252 Parte III: Almacenamiento y recuperación de datos
Incluso si pudiera mezclar la forma larga de los nombres de las tablas con alias, no
querría hacerlo, porque hacerlo crea una gran confusión. Considere el siguiente
ejemplo:
SQL le permite unir más de dos tablas. El número máximo varía de una
implementación a otra. La sintaxis es análoga al caso de dos tablas; así es
como se ve:
Esta declaración realiza una combinación equivalente en tres tablas, extrayendo datos de las filas
correspondientes de cada una para producir una tabla de resultados que muestra los nombres de
los vendedores, la cantidad de ventas de las que son responsables y su compensación. El director de
ventas puede comprobar rápidamente si la remuneración está en consonancia con la producción.
Capítulo 11: Uso de operadores relacionales 253
Almacenar las ventas del año hasta la fecha de un vendedor en una tabla YTD_SALES separada
garantiza un mejor rendimiento de la computadora y confiabilidad de los datos que mantener esos
datos en la tabla EMPLOYEE. Los datos de la tabla EMPLEADO son relativamente estáticos. El nombre,
la dirección y el número de teléfono de una persona no cambian con mucha frecuencia. Por el
contrario, las ventas del año hasta la fecha cambian con frecuencia (eso espera). Debido a que la tabla
YTD_SALES tiene menos columnas que la tabla EMPLOYEE, es posible que pueda actualizarla más
rápidamente. Si, durante la actualización de los totales de ventas, no toca la tabla EMPLEADO,
disminuye el riesgo de modificar accidentalmente la información del empleado que debería
permanecer igual.
unión cruzada
UNIÓN CRUZADAes la palabra clave para la unión básica sinDÓNDEcláusula. Por
lo tanto
SELECCIONAR *
DEL EMPLEADO, COMPENSACIÓN ;
SELECCIONAR *
DE LA COMPENSACIÓN CRUZADA DE EMPLEADOS;
unión natural
Elunión naturales un caso especial de unión equi. En elDÓNDEcláusula de una unión equi,
una columna de una tabla fuente se compara con una columna de una segunda tabla
fuente para determinar la igualdad. Las dos columnas deben ser del mismo tipo y longitud
y deben tener el mismo nombre. De hecho, en una unión natural, todas las columnas de
una tabla que tienen los mismos nombres, tipos y longitudes que las columnas
correspondientes de la segunda tabla se comparan para comprobar su igualdad.
Unión condición
Acondición unirsees como una unión equi, excepto que la condición que se está
probando no tiene que ser una igualdad (aunque puede serlo). Puede ser cualquier
predicado bien formado. Si se cumple la condición, la fila correspondiente pasa a formar
parte de la tabla de resultados. La sintaxis es un poco diferente de lo que ha visto hasta
ahora: la condición está contenida en unENcláusula en lugar de en unaDÓNDEcláusula.
Digamos que un estadístico del béisbol quiere saber qué lanzadores de la Liga Nacional han
lanzado la misma cantidad de juegos completos que uno o más lanzadores de la Liga
Americana. Esta pregunta es un trabajo para una equi-join, que también se puede expresar con
la sintaxis de condición-join:
SELECCIONAR *
DE NACIONAL ÚNETE A AMERICANO
EN [Link] = [Link];
Elunión de nombre de columnaEs como una unión natural, pero es más flexible. En una combinación
natural, todas las columnas de la tabla de origen que tienen el mismo nombre se comparan entre sí
para determinar la igualdad. Con la combinación de nombre de columna, usted selecciona qué
columnas del mismo nombre comparar. Puede elegirlos todos si lo desea, haciendo que la unión del
nombre de la columna (efectivamente) sea una unión natural. O puede elegir menos de todas las
columnas del mismo nombre. De esta manera, tiene un alto grado de control sobre qué filas de
productos cruzados califican para ser colocadas en su tabla de resultados.
Supongamos que es un fabricante de juegos de ajedrez y tiene una tabla de inventario que realiza
un seguimiento de sus existencias de piezas blancas y otra que realiza un seguimiento de las piezas
negras. Las tablas contienen datos como sigue:
Capítulo 11: Uso de operadores relacionales 255
BLANCO NEGRO
----- -----
Pieza Quant Madera Pedazo Madera cuantitativa
-------------- ----- ---------
Rey 502 Roble Rey 502 ébano
Reina 398 Roble Reina 397 ébano
Torre 1020 Roble Torre 1020 ébano
obispo 985 Roble obispo 985 ébano
Caballero 950 Roble Caballero 950 ébano
Empeñar 431 Roble Empeñar 453 ébano
Para cada tipo de pieza, la cantidad de piezas blancas debe coincidir con la cantidad de piezas
negras. Si no coinciden, algunas piezas de ajedrez se perderán o serán robadas y será
necesario reforzar las medidas de seguridad.
Una combinación natural compara todas las columnas con el mismo nombre para determinar
la igualdad. En este caso, se genera una tabla de resultados sin filas porque no hay filas en el
MADERA columna de la tabla BLANCA coincide con cualquier fila de laMADERAcolumna de la
tabla NEGRA. Esta tabla de resultados no le ayuda a determinar si falta alguna mercancía. En su
lugar, haga una combinación de nombre de columna que excluya elMADERAcolumna de
consideración. Puede tomar la siguiente forma:
SELECCIONAR *
DEL BLANCO ÚNETE AL NEGRO
USANDO (Pieza, Cuant.) ;
La tabla de resultados muestra solo las filas para las cuales el número de piezas blancas en
stock es igual al número de piezas negras:
La persona astuta puede deducir que la Reina y el Peón faltan en la lista, lo que
indica una escasez en algún lugar para esos tipos de piezas.
Unir internamente
A estas alturas, probablemente ya te habrás dado cuenta de que las uniones son bastante
esotéricas y que se necesita un nivel poco común de discernimiento espiritual para abordarlas
adecuadamente. Es posible que incluso hayas oído hablar del misteriosounir internamentey
especuló que probablemente representa el núcleo o esencia de las operaciones relacionales.
Bueno, ¡ja! La broma es tuya: no hay nada misterioso en las uniones internas.
256 Parte III: Almacenamiento y recuperación de datos
De hecho, todas las uniones cubiertas hasta ahora en este capítulo son uniones internas. Podría haber
formulado la combinación de nombre de columna en el último ejemplo como una combinación interna
usando la siguiente sintaxis:
SELECCIONAR *
DESDE BLANCO UNIÓN INTERIOR NEGRO
USANDO (Pieza, Cuant.) ;
El resultado es el mismo.
La unión interna se denomina así para distinguirla de la unión externa. Una combinación
interna descarta todas las filas de la tabla de resultados que no tienen filas correspondientes
en ambas tablas de origen. Una unión externa conserva filas no coincidentes. Esa es la
diferencia. No hay nada metafísico en ello.
unión externa
Cuando unes dos tablas, la primera (llámala la de la izquierda) puede tener filas que no
tienen contrapartes coincidentes en la segunda tabla (la de la derecha). Por el contrario,
la tabla de la derecha puede tener filas que no tienen contrapartes coincidentes en la
tabla de la izquierda. Si realiza una combinación interna en esas tablas, todas las filas no
coincidentes se excluyen de la salida. uniones exteriores,sin embargo, no excluya las filas
no coincidentes. Las uniones externas vienen en tres tipos: la unión exterior izquierda, la
unión exterior derecha y la unión exterior completa.
En una consulta que incluye una combinación, la tabla de la izquierda es la que precede a la palabra
claveUNIRSE,y la tabla de la derecha es la que le sigue. Elizquierda combinación externa conserva las
filas no coincidentes de la tabla de la izquierda pero descarta las filas no coincidentes de la tabla de
la derecha.
Para comprender las uniones externas, considere una base de datos corporativa que mantenga
registros de los empleados, departamentos y ubicaciones de la empresa. Las tablas 11-1, 11-2 y
11-3 contienen los datos de ejemplo de la base de datos.
1 Bostón
3 tampa
5 chicago
Capítulo 11: Uso de operadores relacionales 257
21 1 Ventas
24 1 Administración
27 5 Reparar
29 5 Existencias
61 24 Iglesia
63 27 mccoy
Ahora suponga que desea ver todos los datos de todos los empleados, incluidos el departamento y la
ubicación. Obtienes esto con una unión equivalente:
SELECCIONAR *
DESDE LA UBICACIÓN L, DEPARTAMENTO D,
EMPLEADO E DONDE [Link] = [Link]
AND [Link] = [Link] ;
Esta tabla de resultados proporciona todos los datos de todos los empleados, incluida la ubicación y
el departamento. La equi-unión funciona porque cada empleado tiene una ubicación y un
departamento.
A continuación, supongamos que desea los datos sobre las ubicaciones, con los datos relacionados
del departamento y de los empleados. Este es un problema diferente porque puede existir una
ubicación sin departamentos asociados. Para obtener lo que desea, debe utilizar una combinación
externa, como en el siguiente ejemplo:
SELECCIONAR *
DESDE LA UBICACIÓN L UNIÓN EXTERIOR IZQUIERDA AL DEPARTAMENTO D
ENCENDIDO ([Link] = [Link])
IZQUIERDA EXTERIOR UNIRSE AL EMPLEADO E
ENCENDIDO ([Link] = [Link]);
258 Parte III: Almacenamiento y recuperación de datos
Esta combinación extrae datos de tres tablas. Primero, la tabla UBICACIÓN se une a la tabla
DEPTO. Luego, el conjunto de resultados se une a la tabla EMPLEADO. Filas de la tabla a la
izquierda delIZQUIERDA COMBINACIÓN EXTERNALos operadores que no tienen una fila
correspondiente en la tabla de la derecha se incluyen en el resultado. Por tanto, en la primera
unión se incluyen todas las ubicaciones, incluso si no existe ningún departamento asociado a
ellas. En la segunda unión, se incluyen todos los departamentos, incluso si no existe ningún
empleado asociado a ellos. El resultado es el siguiente:
Las dos primeras filas son iguales a las dos filas de resultados del ejemplo anterior.
La tercera fila (3 Tampa)tiene valores nulos en las columnas de departamento y
empleado porque no hay departamentos definidos para Tampa y no hay
empleados destinados allí. La cuarta y quinta filas (5Chicagoy1 Boston)contener
datos sobre elExistenciasy elVentasdepartamentos, pero elEmpleado las columnas
de estas filas contienen valores nulos porque estos dos departamentos no tienen
empleados. Esta unión externa le dice todo lo que le dijo la unión equi, más lo
siguiente:
SELECCIONAR *
DESDE LA UBICACIÓN L UNIÓN EXTERIOR IZQUIERDA AL DEPARTAMENTO D
ENCENDIDO ([Link] = [Link])
IZQUIERDA EXTERIOR UNIRSE AL EMPLEADO E
ENCENDIDO ([Link] = [Link])
ORDEN POR [Link], [Link], [Link];
Apuesto a que descubriste cómo se comporta la unión externa correcta. ¡Bien! Elunión exterior
derechaconserva filas no coincidentes de la tabla derecha pero descarta las no coincidentes
Capítulo 11: Uso de operadores relacionales 259
filas de la tabla de la izquierda. Puede usarlo en las mismas tablas y obtener el mismo
resultado invirtiendo el orden en que presenta las tablas en la combinación:
SELECCIONAR *
DEL EMPLEADO E EXTERIOR DERECHO UNIRSE AL DEPARTAMENTO D
ENCENDIDO ([Link] = [Link])
UBICACIÓN DE UNIÓN EXTERIOR DERECHA L
ON ([Link]ón = [Link]ón);
En esta formulación, la primera combinación produce una tabla que contiene todos los
departamentos, tengan o no un empleado asociado. La segunda combinación produce
una tabla que contiene todas las ubicaciones, tengan o no un departamento asociado.
SELECCIONAR *
DESDE LA UBICACIÓN L UNIÓN EXTERIOR COMPLETA DEL DEPARTAMENTO D
ON ([Link] = [Link]) UNIÓN
EXTERNA COMPLETA EMPLEADO E
ENCENDIDO ([Link] = [Link]);
Puede abreviar el idioma de unión externa completa comoÚNETE COMPLETOporque (esto puede
sonar inquietantemente familiar) no existe tal cosa como un completointernounirse.
unirse a la unión
A diferencia de los otros tipos de unión, elunirse al sindicatono intenta hacer coincidir
una fila de la tabla fuente izquierda con ninguna fila en la tabla fuente derecha.
260 Parte III: Almacenamiento y recuperación de datos
Crea una nueva tabla virtual que contiene la unión de todas las columnas de ambas
tablas fuente. En la tabla de resultados virtual, las columnas que provienen de la tabla
fuente izquierda contienen todas las filas que estaban en la tabla fuente izquierda. Para
esas filas, todas las columnas que provienen de la tabla fuente correcta tienen el valor
nulo. De manera similar, las columnas que provienen de la tabla fuente derecha
contienen todas las filas que estaban en la tabla fuente derecha. Para esas filas, todas
las columnas que provienen de la tabla fuente izquierda tienen el valor nulo. Por lo
tanto, la tabla resultante de una unión contiene todas las columnas de ambas tablas de
origen, y el número de filas que contiene es la suma del número de filas de las dos
tablas de origen.
Suponga que trabaja para una empresa que diseña y construye cohetes experimentales.
Tienes varios proyectos en marcha. También cuenta con varios ingenieros de diseño que
tienen habilidades en múltiples áreas. Como gerente, usted quiere saber qué empleados,
con qué habilidades, han trabajado en qué proyectos. Actualmente, estos datos se
encuentran dispersos entre la tabla EMPLEADO, la tabla PROYECTOS y la tabla
HABILIDADES.
La tabla EMPLEADO tiene una fila para cada empleado; la tabla PROYECTOS y la
tabla HABILIDADES tienen cero o más filas.
Las tablas 11-4, 11-5 y 11-6 muestran datos de ejemplo en las tres tablas.
1 Ferguson
2 escarcha
3 Toyón
Capítulo 11: Uso de operadores relacionales 261
Estructura X-63 1
Estructura X-64 1
Orientación X-63 2
Orientación X-64 2
Telemetría X-63 3
Telemetría X-64 3
Habilidad EmpID
Diseño mecanico 1
Carga aerodinámica 1
Diseño analógico 2
Diseño de giroscopio 2
Diseño digital 3
Diseño RF 3
Ahora suponga que, como gerente, desea ver toda la información sobre todos los
empleados. Decide aplicar una combinación equivalente a las tablas EMPLEADO,
PROYECTOS y HABILIDADES:
SELECCIONAR *
DEL EMPLEADO E, PROYECTOS P, HABILIDADES S
DONDE [Link] = [Link]
Y [Link] = [Link] ;
Puede expresar esta misma operación como una unión interna utilizando la siguiente
sintaxis:
SELECCIONAR *
DEL EMPLEADO E PROYECTOS DE UNIÓN INTERNA P
ON ([Link] = [Link])
HABILIDADES DE UNIÓN INTERNA S
ON ([Link] = [Link]);
262 Parte III: Almacenamiento y recuperación de datos
Diseño
2 escarcha 2 Orientación X-63 2 Giroscopio
Diseño
2 escarcha 2 Orientación X-64 2 Cosa análoga
Diseño
2 escarcha 2 Orientación X-64 2 Giroscopio
Diseño
3 Toyón 3 Telemetría X-63 3 Diseño digital
3 Toyón 3 Telemetría X-63 3 Diseño RF
3 Toyón 3 Telemetría X-64 3 Diseño digital
3 Toyón 3 Telemetría X-64 3 Diseño RF
SELECCIONAR *
DEL SINDICATO DE EMPLEADOS E ÚNASE A PROYECTOS P
UNIÓN ÚNETE A HABILIDADES S ;
Observe que la unión sindical no tieneENcláusula. No filtra los datos, por lo queEN La cláusula
no es necesaria. Esta afirmación produce el resultado que se muestra en la tabla 11-8.
Capítulo 11: Uso de operadores relacionales 263
Diseño
NULO NULO NULO NULO 2 Giroscopio
Diseño
3 Toyón NULO NULO NULO NULO
NULO NULO 3 Telemetría X-63 NULO NULO
NULO NULO 3 Telemetría X-64 NULO NULO
NULO NULO NULO NULO 3 Digital
Diseño
NULO NULO NULO NULO 3 Diseño RF
Cada tabla se ha extendido hacia la derecha o hacia la izquierda con valores nulos, y esas
filas extendidas con valores nulos se han unido. El orden de las filas es arbitrario y
depende de la implementación. Ahora puedes manipular los datos para ponerlos en una
forma más útil.
Observe que la tabla tiene tres columnas de ID, dos de las cuales son nulas en cualquier
fila. Puede mejorar la visualización fusionando las columnas de ID. Como señalo en el
Capítulo 9, elJUNTARSELa expresión toma el valor del primer valor no nulo en una lista
de valores. En el presente caso, toma el valor del único valor no nulo en una lista de
columnas:
ElDELa cláusula es la misma que en el ejemplo anterior, pero ahora las tres EMP_IDLas columnas
se fusionan en una sola columna llamadaIDENTIFICACIÓ[Link]én estás ordenando el resultado
porIDENTIFICACIÓ[Link] tabla 11-9 muestra el resultado.
Cada fila de este resultado tiene datos sobre un proyecto o una habilidad, pero no ambos.
Cuando lees el resultado, primero debes determinar qué tipo de información hay en cada fila
(proyecto o habilidad). Si elNombre del proyectoLa columna tiene un valor no nulo, la fila
nombra un proyecto en el que ha trabajado el empleado. Si elHabilidad La columna no es nula,
la fila nombra una de las habilidades del empleado.
La tabla de resultados ahora presenta una descripción muy legible de la experiencia en el proyecto y
las habilidades de todos los empleados en la tabla EMPLEADO.
EN versus DONDE
La función delENyDÓNDEcláusulas en los distintos tipos de uniones es
potencialmente confusa. Estos datos pueden ayudarle a mantener las cosas claras:
✓ ElENLa cláusula es parte de las uniones interna, izquierda, derecha y completa. La unión
cruzada y la unión sindical no tienenENcláusula porque ninguno de ellos realiza ningún
filtrado de los datos.
En este capítulo
▶ Extraer datos de varias tablas con una única declaración SQL
▶ Comparar un valor de una tabla con un conjunto de valores de otra tabla
▶ Usar la instrucción SELECT para comparar un valor de una tabla con un valor único de
otra tabla
▶ Comparar un valor de una tabla con todos los valores correspondientes en otra tabla
▶ Realizar consultas que correlacionen filas en una tabla con filas correspondientes en otra tabla
oh Una de las mejores formas de proteger la integridad de sus datos es evitar anomalías
de modificación (consulte el Capítulo 5 para conocer los detalles sangrientos de ellas)
normalizando su base de [Link]ónImplica dividir una única tabla en varias tablas,
cada una de las cuales tiene un único tema. No desea que la información del producto esté en
la misma tabla que la información del cliente, por ejemplo, incluso si los clientes han comprado
productos.
Si normaliza una base de datos correctamente, los datos se encuentran dispersos en varias
tablas. La mayoría de las consultas que desee realizar deben extraer datos de dos o más
tablas. Una forma de hacerlo es utilizar un operador de unión o uno de los otros operadores
relacionales (UNIÓN, INTERSECCIÓN,oEXCEPTO).Los operadores relacionales toman
información de varias tablas y la combinan en un único conjunto de resultados. Diferentes
operadores combinan los datos de diferentes maneras.
Otra forma de extraer datos de dos o más tablas es utilizar una consulta anidada. En SQL, un
consulta anidadaes aquel en el que una declaración adjunta externa contiene una subconsulta.
Esa subconsulta puede servir como una declaración adjunta para una subconsulta de nivel
inferior que está anidada dentro de ella. No existen límites teóricos para la cantidad de niveles
de anidamiento que puede tener una consulta anidada, pero sí enfrenta algunos límites
prácticos que dependen de su implementación de SQL.
Una subconsulta puede operar en una tabla distinta de la tabla en la que opera la
declaración adjunta, por lo que las consultas anidadas le brindan otra forma de extraer
información de varias tablas.
Por ejemplo, suponga que desea consultar su base de datos corporativa para encontrar todos
los gerentes de departamento que tengan más de 50 años. Con las uniones que analizo en el
Capítulo 11, puede utilizar una consulta como esta:
Des el alias de la tabla DEPT, ymies el alias de la tabla EMPLOYEE. La tabla EMPLEADO tiene una
IDENTIFICACIÓNcolumna que es la clave principal, y la tabla DEPT tiene una columna
ManagerID que es laIDENTIFICACIÓNValor del empleado que es el gerente del departamento.
Una combinación simple (la lista de tablas en elDE cláusula) empareja las tablas relacionadas, y
unaDÓNDELa cláusula filtra todas las filas excepto aquellas que cumplen con los criterios.
Tenga en cuenta que elSELECCIONARLa lista de parámetros de la declaración incluye el
DepartamentoyNombrecolumnas de la tabla DEPT y laNombre yEdadcolumnas de la tabla
EMPLEADO.
Esta consulta tiene dos nuevos elementos: elEXISTEpalabra clave y elSELECCIONAR *en el
DÓNDEcláusula del [Link] interiorSELECCIONARes una subconsulta (o
subseleccionar), y elEXISTELa palabra clave es una de varias herramientas para usar con una
subconsulta que se describe en este capítulo.
SELECCIONARlista_columnas
DEmesa
DONDE expresión EN (subconsulta);
La expresión en elDÓNDELa cláusula se evalúa como un valor. Si ese valor esEN la lista devuelta por la
subconsulta, luego elDÓNDELa cláusula devuelve un valor Verdadero. Las columnas especificadas de
la fila de la tabla que se está procesando se agregan a la tabla de resultados. La subconsulta puede
hacer referencia a la misma tabla a la que hace referencia la consulta externa o puede hacer
referencia a una tabla diferente.
En el siguiente ejemplo, utilizo la base de datos de Zetec para demostrar este tipo de
consulta. Supongamos que hay escasez de monitores de computadora en la industria
informática, de modo que cuando se quede sin monitores, ya no pueda entregar
productos que los incluyan. Quiere saber qué productos se ven afectados. Mirando
agradecido a su propio monitor, ingrese la siguiente consulta:
SELECCIONAR modelo
DESDE COMP_USED
DONDE COMPID EN
(SELECCIONE CompID
DEL COMPONENTE
DONDE CompType = 'Monitor');
SQL procesa primero la consulta más interna, por lo que procesa la tabla COMPONENTE
y devuelve el valor deIDcomppara cada fila dondeTipo Compes 'Monitor'.El resultado es
una lista de losIDENTIFICACIÓNnúmeros de todos los monitores. La consulta externa
luego compara el valor deIDcompen cada fila de la tabla COMP_USED contra la lista. Si
la comparación tiene éxito, el valor de laModelo La columna para esa fila se agrega al
[Link]'s tabla de resultados. El resultado es una lista de todos los
modelos de productos que incluyen un monitor. El siguiente ejemplo muestra lo que
sucede cuando ejecuta la consulta:
Modelo
-----
CX3000
Capítulo 12: Profundizando con consultas anidadas 271
CX3010
CX3020
MB3030
MX3020
MX3030
Ahora sabes qué productos pronto estarán agotados. Es hora de acudir a la fuerza de ventas y
decirles que disminuyan la velocidad en la promoción de estos productos.
Cuando se utiliza esta forma de consulta anidada, la subconsulta debe especificar una sola
columna y el tipo de datos de esa columna debe coincidir con el tipo de datos del argumento
que precede alENpalabra clave.
SELECCIONAR modelo
DESDE COMP_USED
DONDE CompID NO ESTÁ
(SELECCIONE CompID
DEL COMPONENTE
DONDE CompType = 'Monitor')) ;
Modelo
-----
PX3040
PB3050
PX3040
PB3050
272 Parte III: Almacenamiento y recuperación de datos
Modelo
-----
PX3040
PB3050
Para ilustrar un caso en el que una subconsulta devuelve un valor único, observe otra parte de
la base de datos de Zetec Corporation. Contiene una tabla CLIENTE que contiene información
sobre las empresas que compran productos Zetec. También contiene una tabla CONTACTO que
contiene datos personales sobre personas de cada una de las organizaciones de clientes de
Zetec. Las tablas están estructuradas como se muestra en las Tablas 12-4 y 12-5.
Capítulo 12: Profundizando con consultas anidadas 273
SELECCIONAR *
DE CONTACTO
DONDE ID de cliente =
(SELECCIONE ID de cliente
DEL CLIENTE
DONDE Empresa = ‘Ventas Olímpicas’);
En este ejemplo, asumo que la tabla CLIENTE tiene solo una fila con unCompañía
valor de 'Ventas Olímpicas”.ElCREAR MESAdeclaración para CLIENTE especifica un
ÚNICOrestricción paraCompañía,y esta declaración garantiza que la subconsulta del
ejemplo anterior devuelva un valor único (o ningún valor). Sin embargo, las
subconsultas como la de este ejemplo se usan comúnmente en columnas que no
están especificadas comoÚ[Link] tales casos, debe confiar en el conocimiento
previo del contenido de la base de datos para creer que la columna no tiene
duplicados.
Si no existe ningún cliente con ese nombre de empresa, la subconsulta se trata como si fuera
nula y la comparación se convierte [Link] este caso, elDÓNDELa cláusula no
devuelve ninguna fila (porque solo devuelve filas con la condición Verdadero y filtra filas con
la condición Falso o desconocido). Esto probablemente sucedería, por ejemplo, si alguien
escribiera mal la palabraCompañíacomo 'Ventas Olímpicas’.
Aunque el operador igual (=) es el más común, puedes utilizar cualquiera de los
otros cinco operadores de comparación en una estructura similar. Para cada fila de
la tabla especificada en la declaración adjuntaDEcláusula, el valor único devuelto
por la subconsulta se compara con la expresión en la declaración adjuntaDÓNDE
cláusula. Si la comparación da un valor Verdadero, se agrega una fila a la tabla de
resultados.
Puede garantizar que una subconsulta devolverá un valor único si incluye una función
agregada en [Link] agregadassiempre devuelve un único valor. (Las funciones
agregadas se describen en el Capítulo 3.) Por supuesto, esta forma de devolver un valor
único es útil sólo si desea el resultado de una función agregada.
En el estándar SQL original, una comparación sólo podía tener una subconsulta y tenía que
estar en el lado derecho de la comparación. SQL:1999 permitió que uno o ambos operandos de
la comparación fueran subconsultas, y las versiones posteriores de SQL conservan esa
expansión de capacidad.
Verá cómo estos cuantificadores afectan una comparación al observar la base de datos completa de
los juegos de los lanzadores de béisbol del Capítulo 11, que se enumera a continuación.
El contenido de las dos tablas viene dado por las dos consultas siguientes:
SELECCIONAR * DE NACIONAL
SELECCIONAR * DE AMERICANO
276 Parte III: Almacenamiento y recuperación de datos
La presunción es que los lanzadores con más juegos completos deberían estar en la Liga
Americana debido a la presencia de bateadores designados en esa liga. Una forma de verificar
esta presunción es crear una consulta que devuelva todos los lanzadores de la Liga Americana
que han lanzado más juegos completos que todos los lanzadores de la Liga Nacional. La
consulta se puede formular de la siguiente manera:
SELECCIONAR *
DE AMERICANO
DONDE CompleteGames > TODO
(SELECCIONE CompleteGames DE NACIONAL);
Este es el resultado:
¿Qué pasa si su presunción inicial era incorrecta? ¿Qué pasaría si el líder de las Grandes
Ligas en juegos completos fuera un lanzador de la Liga Nacional, a pesar de que la Liga
Nacional no tiene un bateador designado? Si ese fuera el caso, la consulta
SELECCIONAR *
DE AMERICANO
DONDE CompleteGames > TODO
(SELECCIONE CompleteGames DE NACIONAL);
devolvería una advertencia de que ninguna fila satisface las condiciones de la consulta, lo que
significa que ningún lanzador de la Liga Americana ha lanzado más juegos completos que el
lanzador que ha lanzado la mayor cantidad de juegos completos en la Liga Nacional.
Capítulo 12: Profundizando con consultas anidadas 277
EXISTE
Suponga que es vendedor de Zetec Corporation y desea llamar a sus personas de
contacto principal en todas las organizaciones de clientes de Zetec en California.
Pruebe la siguiente consulta:
SELECCIONAR *
DE CONTACTO
DONDE EXISTE
(SELECCIONAR *
DEL CLIENTE
DONDE EstadoCust = 'CA'
Y [Link] = [Link]) ;
NO EXISTE
En el ejemplo anterior, el vendedor de Zetec quiere saber los nombres y números
de las personas de contacto de todos los clientes en California. Imagine que un
segundo vendedor es responsable de todo Estados Unidos excepto California.
Puede recuperar sus personas de contacto usandoNO EXISTEen una consulta
similar a la anterior:
SELECCIONAR *
DE CONTACTO
DONDE NO EXISTE
(SELECCIONAR *
DEL CLIENTE
DONDE EstadoCust = 'CA'
Y [Link] = [Link]) ;
Cada fila de CONTACT para la cual la subconsulta no devuelve una fila se agrega a
la tabla de resultados.
SELECCIONAR *
DE CONTACTO
DÓNDE ENTRA 'CA'
(SELECCIONE Estado del Cliente
DEL CLIENTE
DONDE [Link] = [Link]);
La declaración se evalúa para cada registro en la tabla CONTACTO. Si, para ese registro,
elID de clientenúmeros en CONTACTO y CLIENTE coinciden, entonces el valor de
[Link] compara con 'CALIFORNIA'.El resultado de la subconsulta es una
lista que contiene, como máximo, un elemento. Si ese elemento es 'CALIFORNIA',el
DÓNDESe cumple la cláusula de la declaración adjunta y se agrega una fila a la tabla de
resultados de la consulta.
Zetec paga bonificaciones a sus vendedores en función de su volumen total de ventas mensuales.
Cuanto mayor sea el volumen, mayor será el porcentaje de bonificación. La lista de porcentajes de
bonificación se mantiene en la tabla BONUSRATE:
Si las ventas mensuales de una persona están entre $100.000,00 y $249.999,99, la bonificación
es del 0,3 por ciento de las ventas.
TRANSMASTER
-----------
Columna Tipo Restricciones
------ ---- -----------
TransID ENTERO CLAVE PRIMARIA
ID de cliente ENTERO CLAVE EXTERNA
EmpID ENTERO CLAVE EXTERNA
280 Parte III: Almacenamiento y recuperación de datos
TransDate FECHA
Importe neto NUMÉRICO
Transporte NUMÉRICO
Impuesto NUMÉRICO
Total de la factura NUMÉRICO
Los bonos de ventas se basan en la suma de losImporte netocampo para todas las transacciones de
una persona en el mes. Puede encontrar la tasa de bonificación de cualquier persona con una
subconsulta correlacionada que utiliza operadores de comparación:
SELECCIONAR BonoPct
DE BONIFICACIÓN
DONDE Cantidad mínima <=
(SELECCIONAR SUMA (Monto Neto)
DE TRANSMASTER
DONDE EmpID = 133) Y
MaxAmount >=
(SELECCIONAR SUMA (Monto Neto)
DE TRANSMASTER
DONDE EmpID = 133);
Esta consulta es interesante porque contiene dos subconsultas, haciendo uso del
conectivo ló[Link] subconsultas utilizan elSUMAoperador agregado, que devuelve
un valor único: las ventas mensuales totales del empleado número 133. Ese valor luego
se compara con elCantidad mínimay el Cantidad máximacolumnas en la tabla
BONUSRATE, lo que produce la tasa de bonificación para ese empleado.
SELECCIONAR BonoPct
DE BONIFICACIÓN
DONDE Cantidad mínima <=
(SELECCIONAR SUMA (Monto Neto)
DE TRANSMASTER
DONDE EmpID =
(SELECCIONE EmpID
DEL EMPLEADO
DONDE EmplName = 'Ataúd'))
Y Cantidad Máxima >=
(SELECCIONAR SUMA (Monto Neto)
DE TRANSMASTER
DONDE EmpID =
(SELECCIONE EmpID
DEL EMPLEADO
DONDE EmplName = 'Ataúd'));
Este ejemplo utiliza subconsultas anidadas dentro de subconsultas que, a su vez, están
anidadas dentro de una consulta adjunta para llegar a la tasa de bonificación para el empleado
llamado Coffin. Esta estructura funciona sólo si sabes con seguridad que el
Capítulo 12: Profundizando con consultas anidadas 281
La empresa tiene un, y sólo uno, empleado cuyo apellido es Coffin. Si sabe que
más de un empleado tiene el mismo apellido, puede agregar términos alDÓNDE
cláusula de la subconsulta más interna hasta que esté seguro de que solo está
seleccionada una fila de la tabla EMPLEADO.
SELECCIONE [Link]
DE TRANSMASTER TM1
GRUPO POR [Link]
TENER MAX ([Link]) >= TODOS
(SELECCIONE 2 * PROMEDIO ([Link])
DE TRANSMASTER TM2
DONDE [Link] <> [Link]);
Esta consulta utiliza dos alias para la misma tabla, lo que le permite recuperar el EmpIDNúmero de
todos los vendedores que tuvieron una venta de al menos el doble de la venta promedio de todos los
demás vendedores. La consulta funciona de la siguiente manera:
2. ElTENIENDOLa cláusula filtra estos grupos. Para cada grupo, calcula el MÁXIMO
delImporte netocolumna para las filas de ese grupo.
3. La consulta interna evalúa el doble del [Link] netode todas las
filas de TRANSMASTER cuyoEmpIDes diferente delEmpIDdel grupo actual de
la consulta externa.
En la última línea, debes hacer referencia a dos [Link], por lo
que utiliza diferentes alias para TRANSMASTER en elDEcláusulas de las consultas
externas e internas.
Por ejemplo, Zetec acaba de cerrar un acuerdo de compra por volumen con Olympic Sales y
quiere otorgarle a Olympic un crédito retroactivo del 10 por ciento por todas sus compras en
el último mes. Puedes dar este crédito con unACTUALIZARdeclaración:
ACTUALIZAR TRANSMASTER
SET Monto Neto = Monto Neto * 0.9
DONDE Fecha de venta> (Fecha actual – 30) DÍA Y ID de cliente =
(SELECCIONE ID de cliente
DEL CLIENTE
DONDE Empresa = ‘Ventas Olímpicas’);
ACTUALIZAR TRANSMASTERTM
SET Monto Neto = Monto Neto * 0.9
DONDE Importe Neto>
(SELECCIONE ÚltimosMesesMax
DEL CLIENTE C
DONDE [Link] = [Link]);
Una subconsulta en unACTUALIZARLa declaración también puede hacer referencia a la tabla que se
está actualizando. Supongamos que Zetec quiere dar un crédito del 10 por ciento a los clientes cuyas
compras hayan excedido los $10,000:
ELIMINAR DE TRANSMASTER
DONDE ID de cliente =
(SELECCIONE ID de cliente
DEL CLIENTE
DONDE Empresa = ‘Ventas Olímpicas’);
Esta consulta elimina todas las filas de TRANSMASTER que tienenID cliente 37,así como
cualquier otro cliente con compras superiores a $10,000. Todas las referencias a
TRANSMASTER en la subconsulta denotan el contenido de TRANSMASTER antes de
cualquier eliminación por parte de la declaración actual. Entonces, incluso cuando
eliminas la última fila de TRANSMASTER paraID cliente 37,la subconsulta se evalúa en la
tabla TRANSMASTER original y devuelve11000.
Cuando actualiza, elimina o inserta registros de una base de datos, corre el riesgo de que los
datos de una tabla sean inconsistentes con otras tablas de la base de datos. Tal inconsistencia
se llamaanomalía de modificación,discutido en el Capítulo 5. Si elimina registros
TRANSMASTER y una tabla TRANSDETAIL depende de TRANSMASTER,
284 Parte III: Almacenamiento y recuperación de datos
Una forma de ver una operación de cambio de datos es imaginar una tabla antes de
cambiarla con unBORRAR, INSERTAR,oACTUALIZARoperación. Puede llamar a la tabla
antes del cambio la tabla anterior y a la tabla después del cambio, la nueva tabla. Durante
la operación de cambio de datos, se crean tablas auxiliares, llamadastablas delta, son
creados. ABORRARLa operación crea una tabla delta antigua, que contiene las filas que se
eliminarán. UnINSERTARLa operación crea una nueva tabla delta, que contiene las filas
que se insertarán. UnACTUALIZARLa operación crearía una tabla delta nueva y antigua, la
antigua para las filas que se reemplazan y la nueva para las filas que las reemplazan.
SELECCIONAR [Link]
DE LA TABLA ANTIGUA (ELIMINAR DEL Producto
DONDE ProductID ENTRE 1000 Y 1399)
COMO Mesa antigua;
De manera similar, puede recuperar una lista de la nueva tabla delta usando elNUEVA
MESApalabras clave, que muestra los números de ID de producto de las filas insertadas
por unINSERTARoperación o actualizado por unACTUALIZARoperación. porque un
ACTUALIZARLa operación creó una tabla delta antigua y una tabla delta nueva, puede
recuperar el contenido de una o ambas mediante DML canalizado.
Traducido del inglés al español - [Link]
Capítulo 13
Consultas recursivas
En este capítulo
▶ Comprender el procesamiento recursivo
▶ Definición de consultas recursivas
▶ Encontrar formas de utilizar consultas recursivas
oh Una de las principales críticas a SQL, hasta SQL-92 inclusive, fue su incapacidad para
implementarprocesamiento [Link] problemas importantes que son difíciles
de resolver por otros medios ceden fácilmente a soluciones recursivas. Las extensiones
incluidas en SQL:1999 permiten consultas recursivas, lo que amplía enormemente el poder del
lenguaje. Si su implementación de SQL incluye extensiones de recursividad, puede resolver
eficientemente una gran clase nueva de problemas. Sin embargo, debido a que la recursividad
no es parte del núcleo de SQL, muchas implementaciones disponibles actualmente no la
incluyen.
¿Qué es la recursividad?
La recursividad es una característica que existe desde hace años en lenguajes de
programación como Logo, LISP y C++. En estos idiomas, puede definir unfunción(un
conjunto de uno o más comandos) que realiza una operación específica. El programa
principal invoca la función emitiendo un comando llamadoLlamada de funció[Link] la
función se llama a sí misma como parte de su operación, tiene la forma más simple de
recursividad.
segmento de línea)
giro_izquierda(90)
espiral(segmento + 1)
};
espiral(2)Dibuja una línea de dos unidades de largo hacia el lado izquierdo de la pantalla.
Figura 13-1:
Consecuencia de
vocación
espiral(1).
Capítulo 13: Consultas recursivas 287
segmento de línea)
giro_izquierda(90)
espiral2(segmento + 1)
}
};
Figura 13-2:
Descendente
a través de
recursivo
llamadas, y
luego sube-
haciendo una copia de seguridad
para terminar.
Cada vez que una función se llama a sí misma, te aleja un nivel más del programa
principal que fue el punto de partida de la operación. Para que el programa principal
continúe, la iteración más profunda debe devolver el control a la iteración que lo
llamó. Esa iteración tendrá que hacer lo mismo, regresando al programa principal
que realizó la primera llamada a la función recursiva.
Figura 13-3:
Ruta
mapa para
vannevar
Aerolíneas.
290 Parte III: Almacenamiento y recuperación de datos
Para comenzar con su plan de vacaciones, cree una tabla de base de datos para FLIGHT usando
SQL de la siguiente manera:
Una vez creada la tabla, puede completarla con los datos que se muestran en la Tabla 13-1.
Ups. Esta consulta devuelve un valor nulo; Vannevar no ofrece vuelos de salida
desde Champaign. (Siete consultas hasta ahora. ¿Aún estás inquieto?)
Vannevar tampoco ofrece un vuelo desde Daytona Beach, por lo que si vas allí, te quedas
atrapado, lo que puede no ser una dificultad si es la semana de vacaciones de primavera. (Por
supuesto, si dedica una semana a realizar consultas individuales para saber adónde ir a
continuación, es posible que tenga un dolor de cabeza peor que el de una semana de fiesta). O
podría quedarse atrapado en Champaign, en cuyo caso , podrías inscribirte en la Universidad
de Illinois y tomar algunos cursos de bases de datos.
Por supuesto, este método (eventualmente) responderá a la pregunta: "¿A qué ciudades se
puede llegar desde Portland?" Pero ejecutar una consulta tras otra, haciendo que cada una
dependa de los resultados de una consulta anterior, es complicado, requiere mucho tiempo y
es inquietante.
CON RECURSIVO
REACHABLEFROM (Origen, Destino)
AS (SELECCIONAR Origen, Destino
DESDE EL VUELO
UNIÓN
SELECCIONAR [Link], [Link]
DESDE ALCANZABLEDESDE entrada, VUELO
salida DONDE [Link] = [Link]
)
SELECCIONAR * DESDE ALCANZABLE DESDE
DONDE Fuente = 'Portland';
Como mencioné anteriormente, la recursividad no es parte del núcleo de SQL y, por lo tanto, es posible que algunas
implementaciones no la incluyan.
Fuente Destino
portland condado de Orange
portland charlotte
portland Playa de Daytona
portland charlotte
portland Playa de Daytona
Imagine una aerolínea del mundo real con muchas más ciudades en su mapa de
rutas. Cuantos más destinos posibles estén disponibles, mayor será la ventaja de
utilizar el método recursivo.
¿Qué hace que esta consulta sea recursiva? El hecho de que estés definiendo REACHABLEFROM
en términos de sí mismo. La parte recursiva de la definición es la [Link]
declaración, la que está justo después deUNIÓ[Link] es una tabla temporal que
se llena de datos progresivamente a medida que avanza la recursividad. El procesamiento
continúa hasta que se hayan agregado todos los destinos posibles a REACHABLEFROM. Se
eliminan los duplicados, porque elUNIÓN El operador no agrega duplicados a la tabla de
resultados. Una vez que la recursión ha terminado de ejecutarse, REACHABLEFROM contiene
todas las ciudades a las que se puede llegar desde cualquier ciudad inicial. El tercero y último.
SELECCIONARLa declaración devuelve solo aquellas ciudades de destino a las que puede llegar
desde Portland. Buen viaje.
Hacer un seguimiento de todas las partes puede resultar difícil en una base de
datos relacional que no utiliza la recursividad. La recursión le permite comenzar con
la máquina completa y recorrer cualquier camino para llegar a la parte más
pequeña. ¿Quieres conocer las especificaciones del tornillo de sujeción que sujeta la
pinza al electrodo negativo de la batería auxiliar? ElCON RECURSIVOLa estructura le
da a SQL la capacidad de abordar un problema tan complicado.
Control de operaciones
En este capítulo
▶ Controlar el acceso a las tablas de la base de datos
▶ Decidir quién tiene acceso a qué
▶ Conceder privilegios de acceso
▶ Quitar privilegios de acceso
▶ Derrotar intentos de acceso no autorizado
▶ Transmisión del poder de conceder privilegios
La persona a cargo de una base de datos puede determinar quién tiene acceso a ella y puede
establecer los niveles de acceso de los usuarios, otorgando o revocando acceso a aspectos del
sistema. El administrador del sistema puede incluso otorgar o revocar el derecho a otorgar y revocar
privilegios de acceso. Si las usa correctamente, las herramientas de seguridad que proporciona SQL
son poderosos protectores de datos importantes. Si se usan incorrectamente, estas mismas
herramientas pueden entorpecer los esfuerzos de los usuarios legítimos en un gran nudo de trámites
burocráticos cuando simplemente intentan hacer su trabajo.
Debido a que las bases de datos a menudo contienen información confidencial que no debería
estar disponible para todos, SQL proporciona diferentes niveles de acceso, desde completo
hasta ninguno, con varios niveles intermedios. Al controlar qué operaciones puede realizar
cada usuario autorizado, el administrador de la base de datos puede poner a disposición todos
los datos que los usuarios necesitan para realizar su trabajo, pero restringir el acceso a partes
de la base de datos que no todos deberían ver o cambiar.
298 Parte IV: Control de operaciones
✓ Definición de nuevos tipos de datos:Usted trata con nombres de tipos definidos por el usuario
con elBAJOpalabra clave.
arruina fácilmente su base de datos y destruye miles de horas de trabajo. Los DBA deben
pensar clara y cuidadosamente sobre las consecuencias de cada acción que realizan.
El DBA no sólo tiene todos los derechos sobre la base de datos, sino que también controla los
derechos que tienen otros usuarios. Por lo tanto, las personas de gran confianza pueden
acceder a más funciones (y, tal vez, a más tablas) que la mayoría de los usuarios.
Si no cambia la contraseña, cualquier persona que lea el manualTambién puede iniciar sesión con
privilegios completos de [Link]és de cambiar la contraseña, solo las personas que conozcan la
nueva contraseña podrán iniciar sesión como DBA. Le sugiero que comparta la nueva contraseña de
DBA solo con un pequeño número de personas de gran confianza. Después de todo, la caída de un
meteorito podría impactarte mañana; podrías ganar la lotería; o puede dejar de estar disponible para
la empresa de alguna otra manera. Tus compañeros deben poder continuar en tu ausencia.
Cualquiera que conozca el nombre de usuario y la contraseña del DBA se convierte en DBA después
de utilizar esa información para acceder al sistema.
Si tiene privilegios de DBA, inicie sesión como DBA solo si necesita realizar una tarea específica que
requiera privilegios de DBA. Después de terminar, cierre sesión. Para el trabajo de rutina, inicie sesión
utilizando su ID de inicio de sesión y contraseña personales. Este enfoque puede evitar que usted
cometa errores que tengan graves consecuencias para las tablas de otros usuarios (así como para las
suyas propias).
Otra clase de usuario privilegiado, junto con el DBA, es elpropietario del objeto de base de
[Link] tablas y vistas, por ejemplo, sonobjetos de base de [Link] usuario que cree
dicho objeto puede especificar su propietario. El propietario de una mesa disfruta de todos los
privilegios posibles asociados con esa mesa, incluido el privilegio de otorgar acceso a la mesa a
otras personas. Como puede basar vistas en tablas subyacentes, alguien que no sea el
propietario de una tabla puede crear una vista basada en esa tabla. Sin embargo, el
propietario de la vista sólo recibe los privilegios que tiene para la tabla subyacente. En pocas
palabras: un usuario no puede eludir la protección en la tabla de otro usuario simplemente
creando una vista basada en esa tabla.
300 Parte IV: Control de operaciones
El público
En términos de red, "el público" está formado por todos los usuarios que no son usuarios
especialmente privilegiados (es decir, DBA o propietarios de objetos) y a quienes un usuario
privilegiado no ha concedido específicamente derechos de acceso. Si un usuario privilegiado otorga
ciertos derechos de acceso aPÚBLICO,entonces todos los que puedan acceder al sistema obtienen
esos derechos.
Figura 14-1:
El acceso-
privilegio
jerarquía.
CONCEDERlista de privilegios
ENobjeto
ALista de usuarios
[CON OPCIÓN DE JERARQUÍA] [CON
OPCIÓN DE SUBVENCIÓN]
[CONCEDIDO POR el otorgante] ;
301
Capítulo 14: Proporcionar seguridad a la base de datos
SELECCIONAR
| BORRAR
| INSERTAR [(nombre-columna[,nombre-columna]...)] |
ACTUALIZAR [(nombre-columna[,nombre-columna]...)]
| REFERENCIAS [(nombre-columna[,nombre-columna]...)] |
USO
| BAJO
| DESENCADENAR
| EJECUTAR
La sintaxis anterior considera que una vista es una tabla. ElSELECCIONAR, BORRAR, INSERTAR,
ACTUALIZAR, DISPARAR,yREFERENCIASLos privilegios se aplican sólo a tablas y vistas. ElUSOEl
privilegio se aplica a dominios, juegos de caracteres, intercalaciones y traducciones. ElBAJOEl
privilegio se aplica sólo a los tipos, y elEJECUTAR El privilegio se aplica sólo a las rutinas. Las
siguientes secciones ofrecen ejemplos de las diversas formas en que puede utilizar el
CONCEDERdeclaración y los resultados de esos usos.
Roles
Anombre de usuarioes un tipo de identificador de autorización, pero no es el único.
Identifica a una persona (o un programa) autorizada para realizar una o más
302 Parte IV: Control de operaciones
funciones en una base de datos. En una organización grande con muchos usuarios,
otorgar privilegios a cada empleado individual puede resultar tedioso y llevar mucho
tiempo. SQL aborda este problema introduciendo la noción de roles.
Una vez que haya creado un rol, puede asignar personas al rol con elCONCEDER
declaración, similar a la siguiente:
Puede otorgar privilegios a una función exactamente de la misma manera que otorga
privilegios a los usuarios, con una excepción: no discutirá ni se quejará.
Insertando datos
Para otorgarle a un rol el privilegio de agregar datos a una tabla, siga este ejemplo:
INSERCIÓN DE SUBVENCIÓN
EN EL CLIENTE
AL vendedor;
Este privilegio permite a cualquier empleado del departamento de ventas agregar nuevos
registros de clientes a la tabla CLIENTE.
mirando datos
Para permitir que las personas vean los datos de una tabla, utilice el siguiente ejemplo:
CONCEDER SELECCIONAR
SOBRE EL PRODUCTO
AL PÚBLICO ;
Capítulo 14: Proporcionar seguridad a la base de datos 303
Este privilegio permite a cualquier persona con acceso al sistema (PÚBLICO)para ver
el contenido de la tabla PRODUCTO.
Esta afirmación puede ser peligrosa. Las columnas de la tabla PRODUCTO pueden contener
información que no todos deberían ver, comoCoste de [Link] proporcionar acceso a la
mayor parte de la información y al mismo tiempo retener el acceso a información confidencial,
defina una vista en la tabla que no incluya las columnas confidenciales. Entonces concede
SELECCIONARprivilegios en la vista en lugar de en la tabla subyacente. El siguiente ejemplo
muestra la sintaxis de este procedimiento:
El gerente de ventas puede ajustar la tasa de bonificación que reciben los vendedores por las ventas
(laBonoPctcolumna), basado en cambios en las condiciones del mercado. Sin embargo, el gerente de
ventas no puede modificar los valores en elCantidad mínimay Cantidad máximacolumnas que definen
los rangos para cada paso en el programa de bonificación. Para habilitar las actualizaciones de todas
las columnas, debe especificar todos los nombres de las columnas o ningún nombre de columna,
como se muestra en el siguiente ejemplo:
ACTUALIZACIÓN DE LA SUBVENCIÓN
EN BONIFICACIÓN
A VPSales;
304 Parte IV: Control de operaciones
CONCEDER ELIMINAR
EN EMPLEADO
AL director de personal;
Supongamos, por ejemplo, que la tabla LAYOFF_LIST contiene los nombres de los
empleados que serán despedidos el próximo mes. Sólo la gestión autorizada tiene
SELECCIONARacceso a la mesa. Sin embargo, un empleado no autorizado deduce que la
clave principal de la tabla [Link], el empleado crea una nueva tabla SNOOP, que
tieneEmpIDcomo clave externa, lo que le permite echar un vistazo a LAYOFF_LIST.
(Describo cómo crear una clave externa con unREFERENCIAS cláusula del Capítulo 5.
Ocupa un lugar destacado en la lista de técnicas que todo administrador de sistemas
debería saber cómo usar (y cómo detectar). Aquí está el código que crea la tabla furtiva:
Ahora todo lo que el empleado necesita hacer es intentarINSERTARfilas correspondientes a todos los
números de identificación de los empleados en SNOOP. La tabla acepta los insertos solo para los empleados
en la lista de despidos. Todas las inserciones rechazadas son para empleados que no están en la lista.
Capítulo 14: Proporcionar seguridad a la base de datos 305
No todo está perdido. No corre el riesgo de exponer todos los datos privados que desea conservar.
Las versiones recientes de SQL evitan esta violación de seguridad al requerir que los usuarios
privilegiados otorguenexplícitamentecualquier derecho de referencia a otros usuarios, como se
muestra en el siguiente ejemplo:
Es posible que desee verificar que su DBMS tenga esta característica actualizada.
Usando dominios
Los dominios, los juegos de caracteres, las intercalaciones y las traducciones también
influyen en los problemas de seguridad. Debe vigilar de cerca todo esto, en particular
los dominios creados, para evitar que se utilicen para socavar sus medidas de
seguridad.
Puede definir un dominio que abarque un conjunto de columnas. Al hacerlo, desea que
todas estas columnas tengan el mismo tipo y compartan las mismas restricciones. Las
columnas que creas en tuCREAR DOMINIOLa declaración hereda el tipo y las
restricciones del dominio. Puede anular estas características para columnas específicas,
si lo desea, pero los dominios proporcionan una forma conveniente de aplicar
numerosas características a varias columnas con una sola declaración.
Los dominios resultan útiles si tiene varias tablas que contienen columnas con
características similares. La base de datos de su empresa, por ejemplo, puede constar de
varias tablas, cada una de las cuales contiene unaPreciocolumna que debe tener un tipo
deDECIMALES(10,2)y valores que no sean negativos y no sean superiores a 10.000. Antes
de crear tablas que contengan estas columnas, cree un dominio que especifique las
características de las columnas, como este:
Con los dominios en su lugar, ahora puede proceder a crear tablas de la siguiente manera:
Precio PrecioTipoDominio);
Como mencioné anteriormente para otras funciones SQL estándar ISO/IEC, ningún
producto DBMS las admite [Link] DOMINIOes uno que no cuenta con el apoyo
universal. El DBMS iAnywhere de Sybase lo admite, al igual que PostgreSQL, pero
Oracle 11g y SQL Server 2012 no.
Pueden surgir diferentes problemas de seguridad siGOTAdominios. Las tablas que contienen
columnas que usted define en términos de un dominio causan problemas si intenta GOTAel
dominio. Es posible que necesitesGOTAtodas esas tablas primero. O puede que te encuentres
incapaz deGOTAel dominio. como un dominioGOTAse maneja puede variar de una
implementación a otra. iAnywhere puede hacerlo de una manera, mientras que PostgreSQL
puede hacerlo de otra. En cualquier caso, es posible que desees restringir quién puedeGOTA
dominios. Lo mismo se aplica a los juegos de caracteres, las intercalaciones y las traducciones.
Por ejemplo, puede utilizar un disparador para ejecutar una declaración que verifique la validez de
un nuevo valor antes de unaACTUALIZAResta permitido. Si se determina que el nuevo valor no es
válido, se puede cancelar la actualización.
Siempre que se elimina un cliente de Nueva York de la tabla CLIENTE, una entrada
en la tabla de registro CUSTLOG registra la eliminación.
Una tabla con tipo es una tabla en la que cada fila almacenada en la tabla es una
instancia del tipo estructurado asociado. Una tabla escrita tiene una columna para cada
atributo de su tipo estructurado asociado. El nombre y el tipo de datos de la columna son
los mismos que el nombre y el tipo de datos del atributo.
ediciones limitadas, ediciones abiertas sin firmar y sin numerar y carteles. Puede crear un
tipo estructurado para su obra de arte de la siguiente manera:
Aquí hay otro caso de una característica que no está presente en todos los productos DBMS.
Sin embargo, PostgreSQL tiene laCREAR TIPOdeclaración, al igual que Oracle 11g y SQL Server
2012.
Figura 14-2:
Obra de arte
mesa
jerarquía.
Existe una correspondencia uno a uno entre los tipos de la jerarquía de tipos y las tablas
de la jerarquía de tablas con tipo. Las tablas estándar, como se analiza en los Capítulos 4
y 5, no se pueden colocar en una jerarquía similar a la que se analiza aquí para las tablas
tipificadas.
En lugar de una clave principal, una tabla escrita tiene una columna de autorreferencia
que garantiza la unicidad, no sólo para la supertabla máxima de una jerarquía,
Capítulo 14: Proporcionar seguridad a la base de datos 309
sino también para todas sus subtablas. La columna de autorreferencia se especifica mediante
un REFERENCIA EScláusula en la supertabla máximaCREARdeclaración. Cuando la referencia
se genera por el sistema, se garantiza la unicidad en todos los ámbitos.
Después de la ejecución de esta declaración, cualquier persona con el rol de asistente del
gerente de ventas puede realizar cambios en laBonoPctcolumna en la tabla BONUSRATE.
Por supuesto, usted hace un equilibrio entre seguridad y conveniencia cuando delega los
derechos de acceso a una persona alternativa designada. El propietario de la tabla
BONUSRATE cede un control considerable a la hora de conceder elACTUALIZAR privilegio al
gerente de ventas mediante el uso delCON OPCIÓN DE SUBVENCIÓ[Link] dueño de la mesa
espera que el gerente de ventas tome en serio esta responsabilidad y tenga cuidado al
transmitir el privilegio.
310 Parte IV: Control de operaciones
Quitando privilegios
Si tiene una manera de otorgar privilegios de acceso a las personas, también debería tener una
manera de quitarles esos privilegios. Las funciones laborales de las personas cambian y, con estos
cambios, también cambian sus necesidades de acceso a los datos. Digamos que un empleado deja la
organización para unirse a un competidor. Probablemente deberías revocar todos los privilegios de
acceso a esa persona, inmediatamente.
Puede utilizar esta estructura para revocar privilegios específicos y dejar otros
intactos. La principal diferencia entre elREVOCARdeclaración y el CONCEDER
declaración es la presencia de la opcionalRESTRINGIRoCASCADApalabra clave en el
REVOCARdeclaración.
✓ Si el beneficiario no le otorgó a nadie más ninguno de los privilegios que usted está
revocando, entonces elREVOCARLa declaración ejecuta y elimina la capacidad del
cesionario para otorgar privilegios.
ACTUALIZACIÓN DE LA SUBVENCIÓN
CONCEDER SELECCIONAR
EN EL CLIENTE
A los representantes de ventas;
Protección de datos
En este capítulo
▶ Evitar daños en la base de datos
▶ Comprender los problemas causados por operaciones concurrentes
▶ Tratar problemas de concurrencia a través de mecanismos SQL
▶ Adaptando la protección a sus necesidades con SET TRANSACTION
▶ Protegiendo tus datos sin paralizar operaciones
mi Todo el mundo ha oído hablar de la Ley de Murphy, que suele decirse: "En todo caso
poderir mal, esovoluntad.” La gente bromea con esta pseudoley porque la mayoría
de las veces las cosas van bien. A veces, puedes sentirte afortunado porque no te afecta
lo que pretende ser una de las leyes básicas del universo. Cuando surgen problemas
inesperados, probablemente simplemente reconozca lo que sucedió y lo solucione.
En una estructura compleja, la posibilidad de que surjan problemas imprevistos se dispara. (Un
matemático podría decir que “aumenta aproximadamente como el cuadrado de la
complejidad”). Por lo tanto, los grandes proyectos de software casi siempre se entregan tarde y
a menudo están cargados de errores. Una aplicación DBMS multiusuario no trivial es una
estructura grande y compleja. Durante el funcionamiento, muchas cosas pueden salir mal. Se
han desarrollado métodos para minimizar el impacto de estos problemas, pero nunca se
pueden eliminar por completo. Esta es una buena noticia para los profesionales que realizan
mantenimiento y reparación de bases de datos: probablemente nunca será posible
automatizarlos en un trabajo. Este capítulo analiza los principales aspectos que pueden salir
mal con una base de datos y las herramientas que SQL proporciona para solucionar los
problemas que surjan.
Las aplicaciones mal diseñadas también pueden dañar sus datos, y descubrir cómo no
requiere mucha imaginación. Dos amenazas relativamente obvias (la inestabilidad de la
plataforma y las fallas del equipo) también pueden destruir sus datos. Ambos peligros
se detallan en las siguientes secciones, así como los problemas que pueden surgir por
el acceso simultáneo.
inestabilidad de la plataforma
inestabilidad de la plataformaEs una categoría de problema que ni siquiera debería existir,
pero, lamentablemente, existe. Es más frecuente cuando ejecuta uno o más componentes
nuevos y relativamente no probados en su sistema. Los problemas pueden acechar en una
nueva versión de DBMS, una nueva versión del sistema operativo o un nuevo hardware.
Condiciones o situaciones que nunca antes habían aparecido pueden aparecer mientras
realiza un trabajo crítico. Su sistema se bloquea y sus datos están dañados. Más allá de dirigir
algunas palabras selectas a su computadora y a las personas que la construyeron, no puede
hacer mucho excepto esperar que su última copia de seguridad sea buena.
Falla en el equipo
Incluso los equipos altamente confiables y bien probados fallan a veces, enviando
sus datos al más allá. Todo lo físico se desgasta con el tiempo, incluso las
computadoras modernas de estado sólido. Si tal falla ocurre mientras su base de
datos está abierta y activa, puede perder datos y, a veces (aún peor) no darse
cuenta. Un fracaso así ocurrirá tarde o temprano. Si ese día está en vigor la Ley de
Murphy, el fallo se producirá en el peor momento posible.
Una forma de proteger los datos contra fallas del equipo [Link] copias
adicionales de todo. Para obtener la máxima seguridad (siempre que su organización pueda
hacerlo financieramente), configure hardware duplicado exactamente como su sistema de
producción. Tenga copias de seguridad de bases de datos y aplicaciones que puedan cargarse
y ejecutarse en su hardware de copia de seguridad cuando sea necesario. Si las limitaciones de
costos le impiden duplicar todo (lo que efectivamente duplica sus costos), al menos asegúrese
de hacer copias de seguridad de su base de datos y aplicaciones con suficiente frecuencia para
que una falla inesperada no requiera volver a ingresar una gran cantidad de datos. Muchos
productos DBMS incluyen capacidades de replicación. Eso está muy bien, pero no ayudará a
menos que configure su sistema para usarlos.
Capítulo 15: Protección de datos 315
Otra forma de evitar las peores consecuencias de una falla del equipo es utilizar
procesamiento de transacciones—un tema que ocupa un lugar central más adelante en este
capítulo. Atransacciónes una unidad de trabajo indivisible, por lo que cuando utiliza el
procesamiento de transacciones, se ejecuta una transacción completa o no se ejecuta
ninguna. Este enfoque de todo o nada puede parecer drástico, pero los peores problemas
surgen cuando una serie de operaciones de base de datos sólo se procesan parcialmente. Por
lo tanto, es mucho menos probable que pierda o corrompa sus datos, incluso si la máquina
en la que reside la base de datos falla.
Acceso simultáneo
Suponga que está ejecutando hardware y software probados, que sus datos son buenos, su
aplicación está libre de errores y su equipo es inherentemente confiable. Utopía de datos,
¿verdad? No exactamente. Aún pueden surgir problemas cuando varias personas intentan
utilizar la misma tabla de base de datos al mismo tiempo.(acceso simultáneo),y sus
computadoras discuten sobre quién va primero(contención).Los sistemas de bases de datos
de múltiples usuarios deben poder manejar el alboroto de manera eficiente.
Los problemas de contención pueden acechar incluso en aplicaciones que parecen sencillas.
Considere este ejemplo. Estás escribiendo una aplicación de procesamiento de pedidos que
incluye cuatro tablas: ORDER_MASTER, CUSTOMER, LINE_ITEM e INVENTORY. Se aplican las
siguientes condiciones:
y tablas LINE_ITEM.) Hasta ahora, todo bien. Usted configura la aplicación para procesar pedidos de
una de dos maneras cuando los usuarios acceden a la base de datos simultáneamente:
✓ El método 2 verifica cada fila de INVENTARIO que corresponde a una fila en los
LINE_ITEM del pedido. Si ellos estantodolo suficientemente grande, luego procesa
esos elementos disminuyéndolos.
Generalmente, el Método 1 es más eficiente cuando logra procesar el pedido; El método 2 es más
eficiente cuando fallas. Por lo tanto, si la mayoría de los pedidos se pueden completar la mayor parte
del tiempo, será mejor que utilice el Método 1. Si la mayoría de los pedidos no se pueden completar la
mayor parte del tiempo, será mejor que utilice el Método 2. Supongamos que esta aplicación
hipotética ya no existe. y ejecutarse en un sistema multiusuario que no tiene un control de
concurrencia adecuado. Sí. Se están gestando problemas, de acuerdo. Considere este escenario:
2. El usuario 1 utiliza el Método 1 para procesar el pedido. El primer artículo del pedido son
diez piezas del artículo 1 (cortapernos).
Da la casualidad de que su empresa tiene diez cortadores de pernos en stock y el pedido del Usuario
1 se los lleva todos.
La tabla INVENTARIO ahora ha vuelto al estado que tenía antes de que cualquiera de los
usuarios comenzara a operar. Ninguno de los pedidos se ha completado, aunque el pedido
del Usuario 2 podría haberlo sido.
Capítulo 15: Protección de datos 317
En un escenario ligeramente diferente, al método 2 le va un poco mejor, aunque por una razón
diferente. El usuario 1 verifica todos los artículos pedidos y decide que todos los artículos
pedidossondisponible. Luego, el Usuario 2 entra y procesa un pedido de uno de esos artículos.
antesEl usuario 1 realiza la operación de disminución; La transacción del usuario 1 falla.
Si las transacciones se ejecutan en serie (una tras otra), no tienen ninguna posibilidad
de interactuar de manera destructiva. La ejecución de transacciones concurrentes es
serializablesi el resultado es el mismo que si las transacciones se ejecutaran en serie.
Reducir la vulnerabilidad
a la corrupción de datos
Puede tomar precauciones en varios niveles para reducir las posibilidades de perder
datos debido a algún percance o interacción imprevista. Puede configurar su DBMS para
que tome algunas de estas precauciones por usted. Cuando configura su DBMS
adecuadamente, actúa como un ángel guardián para protegerlo de cualquier daño,
operando detrás de escena; Ni siquiera sabes que el DBMS te está ayudando. Su
administrador de base de datos (DBA) puede tomar otras precauciones a su discreción
que usted quizás no conozca. Como desarrollador, puedes tomar precauciones al escribir
tu código.
318 Parte IV: Control de operaciones
Para evitar muchos dolores de cabeza, adquiera el hábito de adherirse automáticamente a algunos
principios simples para que siempre estén incluidos en su código o en sus interacciones con su base
de datos:
✓ Sepa cuándo y cómo configurar transacciones, bloquear objetos de bases de datos y realizar copias de
seguridad.
Una aplicación puede incluir una serie de transacciones SQL. La primera transacción
SQL comienza cuando comienza la aplicación; la última transacción SQL finaliza cuando
finaliza la aplicación. CadaCOMPROMETERSEoRETROCEDERque realiza la aplicación
finaliza una transacción SQL y comienza la siguiente. Por ejemplo, una aplicación con
tres transacciones SQL tiene la siguiente forma:
Inicio de la aplicación
Varias declaraciones SQL(Transacción SQL-1) COMMIT
o ROLLBACK
Varias declaraciones SQL(Transacción SQL-2) COMMIT
o ROLLBACK
Varias declaraciones SQL(Transacción SQL-3) COMMIT
o ROLLBACK
Fin de la aplicación
Capítulo 15: Protección de datos 319
yo uso la frasetransacción SQLporque la aplicación puede estar utilizando otras
capacidades (como el acceso a la red) que realizan otros tipos de transacciones. En la
siguiente discusión, usotransacciónsignificartransacción SQLespecíficamente.
Una transacción SQL normal tiene un modo de acceso que esLEER ESCRIBIRo SOLO
LECTURA;tiene un nivel de aislamiento que esSERIALIZABLE, LECTURA REPETIBLE,
LECTURA COMPROMETIDA,oLEER SIN COMPROMISO. (Puede encontrar las
características de las transacciones en la sección “Niveles de aislamiento”, más adelante
en este capítulo). Las características predeterminadas sonLEER ESCRIBIRySERIALIZABLE.
Si quieres alguna otra característica, tienes que especificarla con unESTABLECER
TRANSACCIÓN declaración como la siguiente:
Debes realizar unESTABLECER TRANSACCIÓNal comienzo de cada transacción para la que desea
propiedades no predeterminadas, porque cada nueva transacción después de unCOMPROMETERSEo
RETROCEDERrecibe las propiedades predeterminadas automáticamente.
La transacción predeterminada
La transacción SQL predeterminada tiene características que resultan satisfactorias para la mayoría
de los usuarios la mayor parte del tiempo. Si es necesario, puede especificar diferentes características
de transacción con unESTABLECER TRANSACCIÓNdeclaración, como se describe en la sección
anterior. (ESTABLECER TRANSACCIÓNrecibe su propio tratamiento destacado más adelante en el
capítulo).
320 Parte IV: Control de operaciones
Niveles de aislamiento
Idealmente, el sistema maneja sus transacciones independientemente de cualquier otra
transacción, incluso si esas transacciones ocurren al mismo tiempo que la suya. Este concepto
se conoce [Link] embargo, en el mundo real de los sistemas multiusuario en
red con requisitos de acceso en tiempo real, el aislamiento completo no siempre es factible. El
aislamiento puede suponer una penalización demasiado grande en el rendimiento. Surge una
pregunta de compensación: "¿Cuánto aislamiento desea realmente y cuánto está dispuesto a
pagar por él en términos de rendimiento?"
2. Casi al mismo tiempo, el Usuario 2 inicia y luego finaliza una transacción con el
COMPROMETERSEDeclaración que registra un pedido de diez unidades de ese
mismo producto, disminuyendo el inventario a cero.
3. Ahora el Usuario 1, al ver que hay diez disponibles, intenta pedir cinco de ellos.
Sin embargo, ya no quedan cinco porque el Usuario 2 ha asaltado la despensa.
Supongamos, por ejemplo, que el Usuario 1 emite un comando cuya condición de búsqueda
(laDÓNDEcláusula oTENIENDOcláusula) selecciona un conjunto de filas e, inmediatamente
322 Parte IV: Control de operaciones
Luego, el Usuario 2 realiza y confirma una operación que cambia los datos enalgunode esas
filas. Esos elementos de datos cumplían con la condición de búsqueda del Usuario 1 al
comienzo de este problema, pero ahora ya no lo hacen. Quizás algunas otras filas que lo
hicieron primeronocumplir con la condición de búsqueda original ahorahacerconocerlo. El
usuario 1, cuya transacción aún está activa, no tiene idea de estos cambios; la aplicación se
comporta como si nada hubiera pasado. El desventurado Usuario 1 emite otra declaración SQL
con las mismas condiciones de búsqueda que la original, esperando recuperar las mismas
filas. En cambio, la segunda operación se realiza en filas distintas a las utilizadas en la primera
operación. Los resultados confiables se van por la ventana, desaparecidos por la lectura
fantasma.
Por supuesto, una confiabilidad superior puede tener el precio de un rendimiento más lento, por lo
que está de regreso en Tradeoff City. La Tabla 15-1 muestra cómo se comparan los diferentes
niveles de aislamiento.
ESTABLECER TRANSACCIÓN
En ocasiones, es posible que desee utilizar características de transacción diferentes a las
establecidas de forma predeterminada. Puede especificar diferentes características con un
ESTABLECER TRANSACCIÓNdeclaración antes de emitir su primera declaración que realmente
requiere una transacción. ElESTABLECER TRANSACCIÓNLa declaración le permite especificar el
modo, el nivel de aislamiento y el tamaño de diagnóstico.
Para cambiar los tres, por ejemplo, puede emitir la siguiente declaración:
ESTABLECER TRANSACCIÓN
SOLO LECTURA,
NIVEL DE AISLAMIENTO LEÍDO NO COMPROMETIDO,
DIAGNÓSTICO TAMAÑO 4 ;
Con esta configuración, no puede emitir ninguna declaración que cambie la base de datos.
(SOLO LECTURA),y ha establecido el nivel de aislamiento más bajo y más peligroso (LEER NO
COMPROMETIDO).El área de diagnóstico tiene un tamaño de 4. Las exigencias mínimas a los
recursos del sistema son mínimas.
ESTABLECER TRANSACCIÓN
LEER ESCRIBIR,
NIVEL DE AISLAMIENTO SERIALIZABLE,
DIAGNÓSTICO TAMAÑO 8 ;
Estas configuraciones le permiten cambiar la base de datos; también le brindan el más alto
nivel de aislamiento y un área de diagnóstico más amplia. La desventaja es que también
exigen mayores recursos del sistema. Dependiendo de su implementación, estas
configuraciones pueden resultar ser las mismas que las utilizadas por la transacción
predeterminada. Naturalmente, puedes emitirESTABLECER TRANSACCIÓNdeclaraciones con
otras opciones para el nivel de aislamiento y el tamaño del diagnóstico.
Establezca el nivel de aislamiento de su transacción tan alto como necesite, pero no más.
Estableciendo siempre su nivel de aislamiento enSERIALIZABLESólo estar seguro puede parecer
razonable, pero no lo es para todos los sistemas. Dependiendo de su implementación (y de lo
que esté haciendo), es posible que no necesite hacerlo y el rendimiento puede verse afectado
significativamente si lo hace. Si no tiene intención de cambiar la base de datos en su
transacción, por ejemplo, configure el modo enSOLO LECTURA. En pocas palabras: no ocupe
ningún recurso del sistema que no necesite.
324 Parte IV: Control de operaciones
COMPROMETERSE
Aunque SQL no requiere una palabra clave explícita para iniciar una transacción, tiene dos que
finalizan una transacción:[Link] haya
llegado al final de la transacción y desee hacer permanentes los cambios (si los hay) que
realizó en la base de datos. Puede incluir la palabra clave opcionalTRABAJAR (COMPROMISO
DE TRABAJO)si quieres. Si la base de datos encuentra un error o el sistema falla mientras se
COMPROMETERSEestá en progreso, es posible que tengas que revertir la transacción e
intentarla nuevamente.
RETROCEDER
Cuando llega al final de una transacción, puede decidir que no desea que los cambios
que se produjeron durante la transacción sean permanentes. En tal caso, debe
restaurar la base de datos al estado en el que se encontraba antes de que comenzara
la transacción. Para ello, emita unRETROCEDERdeclaración. RETROCEDERes un
mecanismo a prueba de fallos.
✓ La fila de la tabla a la que accede está bloqueada, lo que impide que otros accedan
a ese registro mientras usted lo usa.
✓ Una tabla completa está bloqueada si está realizando una operación que podría
afectar a toda la tabla.
Suponga que está realizando una serie compleja de operaciones con sus datos. A mitad
del proceso, recibes resultados que te llevan a concluir que estás yendo por un camino
improductivo. Si estuvieras pensando lo suficiente en el futuro como para poner un
PUNTO DE GUARDADOdeclaración justo antes de comenzar en esa ruta, puede
retroceder al punto de guardado y probar otra opción. Siempre que el resto de su
código estuviera en buen estado antes de establecer el punto de guardado, este
enfoque funciona mejor que cancelar la transacción actual e iniciar una nueva solo para
probar una nueva ruta.
SAVEPOINT nombre_punto_guardado ;
Capítulo 15: Protección de datos 327
Puede hacer que la ejecución retroceda a ese punto de guardado con código como el
siguiente:
Para agregar registros en blanco o realizar otras operaciones que puedan violar
APLAZABLErestricciones, puede utilizar una declaración similar a la siguiente:
Consideremos un ejemplo de nómina para ver por qué es importante poder diferir la
aplicación de restricciones.
Además, desea tener una tabla como DEPT que también contenga unaNómina de sueldos
columna que (a su vez) contiene la suma de losSalariovalores para los empleados de cada
departamento.
Suponiendo que está utilizando un DBMS que admita esta funcionalidad estándar
de SQL, puede crear el equivalente de esta tabla con la siguiente vista:
Pero supongamos que, por motivos de eficiencia, no desea calcular elSUMAcada vez
que haces referenciaDEPT3.Nó[Link] lugar de ello, desea almacenar un valor real
Nómina de sueldoscolumna en la tabla DEPTO. Luego actualizará esa columna cada vez
que cambie unSalario.
Capítulo 15: Protección de datos 329
Para asegurarse de que elSalariocolumna es precisa, puede incluir una
RESTRICCIÓNen la definición de la tabla:
ACTUALIZAR EMPLEADO
SET Salario = Salario + 100
DONDE EmpNo = '123';
ACTUALIZACIÓN DEPARTAMENTO D
Pero hay un problema: las restricciones se verifican después de cada declaración. En principio,
todoSe verifican las restricciones. En la práctica, las implementaciones verifican solo las
restricciones que hacen referencia a los valores modificados por la declaración.
Este procedimiento difiere todas las restricciones. Si inserta nuevas filas en DEPT, no se
verificarán las claves principales; has eliminado la protección que tal vez quieras
conservar. En su lugar, debe especificar las restricciones que desea aplazar. Para hacer
esto, asigne un nombre a las restricciones cuando las cree:
Con los nombres de las restricciones implementados, puede hacer referencia a sus restricciones
individualmente:
En este capítulo
▶ Usando SQL dentro de una aplicación
▶ Combinando SQL con lenguajes procedimentales
▶ Evitar incompatibilidades entre idiomas
▶ Incrustar SQL en su código procesal
▶ Llamar módulos SQL desde su código de procedimiento
▶ Invocar SQL desde una herramienta RAD
PAG Los capítulos anteriores abordan sentencias SQL principalmente de forma aislada. Por
ejemplo, se hacen preguntas sobre datos y se desarrollan consultas SQL que recuperan
respuestas a las preguntas. Este modo de operación,SQL interactivo,está bien para descubrir lo
que SQL puede hacer, pero no es así como se usa normalmente SQL.
Aunque la sintaxis SQL puede describirse como similar a la del inglés, no es un lenguaje fácil
de dominar. La abrumadora mayoría de los usuarios de computadoras no dominan SQL, y se
puede suponer razonablemente que nunca lo serán, incluso si este libro tiene un gran éxito.
Cuando surge una pregunta sobre una base de datos, Joe User probablemente no se sentará
en su terminal e ingresará un código [Link]ón para encontrar la
respuesta. Los analistas de sistemas y desarrolladores de aplicaciones son las personas que
probablemente se sientan cómodas con SQL y, por lo general, no hacen carrera ingresando
consultas ad hoc en bases de datos. En cambio, desarrollan aplicaciones para realizar esas
consultas.
Debido a la forma en que está estructurado, SQL tiene algunas fortalezas y debilidades. Los
lenguajes procedimentales están estructurados de manera diferente a SQL y, en
consecuencia, tienendiferentefortalezas y debilidades.
Un cambio de este tipo en una tabla no afecta a los programas existentes hasta que es
necesario volver a compilarlos para corregir un error o realizar algún cambio, tal vez meses
después de que se realizó el cambio. Luego, el efecto del comodín * se expande para incluir
todas las columnas actuales. Este cambio puede hacer que la aplicación falle de una manera no
relacionada con la corrección del error (u otro cambio realizado), creando su propia pesadilla de
depuración personal.
Para estar seguro, especifique todos los nombres de las columnas explícitamente en una aplicación en lugar de utilizar
el comodín asterisco. (Para obtener más información sobre los caracteres comodín, consulte el Capítulo 6).
A veces una fortaleza en un contexto es una debilidad en otro. Uno de los puntos
fuertes de SQL es que puede operar en una tabla completa a la vez. Ya sea que la tabla
tenga una fila, cien filas o cien mil filas, una solaSELECCIONAR La declaración puede
extraer los datos que desee. Sin embargo, SQL no puede operar fácilmente en una fila a
la vez y, a veces, es necesario tratar cada fila individualmente. En tales casos, puede
utilizar la función de cursor de SQL (descrita en el Capítulo 19) o puede utilizar un
lenguaje anfitrión procedimental.
Un gran problema al combinar SQL con un lenguaje procedimental es que SQL opera en tablas
un conjunto a la vez, mientras que los lenguajes procedimentales trabajan en ellas una fila a la
vez. A veces este problema no es gran cosa. Puede separar las operaciones de conjunto de las
operaciones de fila, realizando cada una con la herramienta adecuada.
336 Parte IV: Control de operaciones
Pero si desea buscar en una tabla registros que cumplan ciertas condiciones y realizar
diferentes operaciones en los registros dependiendo de si cumplen con las condiciones, puede
tener un problema. Un proceso de este tipo requiere tanto el poder de recuperación de SQL
como la capacidad de ramificación de un lenguaje procedimental. SQL incorporado le ofrece
esta combinación de capacidades. Puedes simplemente empotrarDeclaraciones SQL en
ubicaciones estratégicas dentro de un programa que haya escrito en un lenguaje de
procedimiento convencional. (Consulte “SQL incorporado” más adelante en este capítulo para
obtener más información).
Otro obstáculo para la integración fluida de SQL con cualquier lenguaje procedimental
es que los tipos de datos de SQL difieren de los tipos de datos de los principales
lenguajes procedimentales. Esta circunstancia no debería sorprender, porque los tipos
de datos definidos para cualquier lenguaje procedimental son diferentes de los tipos de
otros lenguajes procedimentales.
Puede buscar arriba y abajo, pero no encontrará ninguna estandarización de tipos de datos en
todos los idiomas. En las versiones de SQL anteriores a SQL-92, la incompatibilidad de tipos de
datos era una preocupación importante. En SQL-92 (y también en versiones posteriores del
estándar SQL), elELENCOdeclaración aborda el problema. El capítulo 9 explica cómo puede
utilizarELENCOconvertir un elemento de datos del tipo de datos del lenguaje procedimental a
uno reconocido por SQL, siempre que el elemento de datos en sí sea compatible con el nuevo
tipo de datos.
SQL incorporado
El método más común para mezclar SQL con lenguajes procedimentales se llama
SQL incorporado.¿Se pregunta cómo funciona SQL incorporado? Eche un vistazo al
nombre y comprenderá lo básico: coloque declaraciones SQL en medio de un
programa de procedimiento, donde las necesite.
Capítulo 16: Uso de SQL dentro de las aplicaciones 337
Por supuesto, como es de esperar, una declaración SQL que aparece repentinamente en medio
de un programa en C puede presentar un desafío para un compilador que no se lo espera. Por
esa razón, los programas que contienen SQL incorporado generalmente pasan a través de un
preprocesadorantes de ser compilado o interpretado. El SQL EJECUTIVOLa directiva advierte al
preprocesador de la inminente aparición de código SQL.
Como ejemplo de SQL incorporado, mire un programa escrito en la versión Pro*C del
lenguaje C de Oracle. El programa, que accede a la información de una empresa
EMPLEADOtabla, solicita al usuario el nombre de un empleado y luego muestra el
salario y la comisión de ese empleado. Luego solicita al usuario nuevos datos sobre
salarios y comisiones y actualiza la tabla de empleados con ellos:
No es necesario ser un experto en C para comprender la esencia de lo que hace este programa
(y cómo pretende hacerlo). A continuación se muestra un resumen del orden en que se
ejecutan las declaraciones:
Puede mezclar los comandos de dos idiomas de esta manera gracias al preprocesador.
El preprocesador separa las sentencias SQL de los comandos del lenguaje principal y
coloca las sentencias SQL en una rutina externa independiente. Cada declaración SQL se
reemplaza con un lenguaje anfitriónLLAMARde la rutina externa correspondiente. El
compilador de lenguaje ahora puede hacer su trabajo.
Se debe pasar cierta información entre el programa del lenguaje anfitrión y los segmentos
SQL. Pasas estos datos convariables del lenguaje [Link] que SQL reconozca las
variables del lenguaje principal, debe declararlas antes de utilizarlas. Las declaraciones se
incluyen en un segmento de declaración que precede al segmento del programa. El segmento
de declaración se anuncia mediante la siguiente directiva:
Cada declaración SQL debe estar precedida por unEJECUTIVODirectiva SQL. El final de
un segmento SQL puede o no ser señalado por una directiva terminadora. En COBOL,
la directiva terminadora es "EJECUTIVO FINAL”,y en C, es un punto y coma.
un SQLmóduloes simplemente una lista de declaraciones SQL. Cada declaración SQL está
incluida en un SQLprocedimientoy está precedido por una especificación del nombre del
procedimiento y el número y tipos de parámetros.
Cada procedimiento SQL contiene sólo una declaración SQL. En el programa host, usted
llama explícitamente a un procedimiento SQL en cualquier punto del programa host en el
que desee ejecutar la instrucción SQL en ese procedimiento. Se llama al procedimiento SQL
como si fuera un subprograma en el lenguaje anfitrión.
340 Parte IV: Control de operaciones
Por lo tanto, puede utilizar un módulo SQL y el programa host asociado para codificar
explícitamente a mano el resultado del preprocesador SQL para la sintaxis incorporada.
El SQL incorporado es mucho más común que el lenguaje de módulo. La mayoría de los
proveedores ofrecen algún tipo de lenguaje de módulo, pero pocos lo enfatizan en su
documentación. El lenguaje del módulo tiene varias ventajas:
✓ No se mezcla ningún SQL con el código de procedimiento, por lo que su depurador de lenguaje de
procedimiento [Link] puede ahorrarle un tiempo de desarrollo considerable.
Una vez más, lo que puede considerarse una ventaja desde una perspectiva puede ser
una desventaja desde otra. Debido a que los módulos SQL están separados del código de
procedimiento, seguir el flujo de la lógica no es tan fácil como lo es en SQL incorporado
cuando se intenta comprender cómo funciona el programa.
Declaraciones de módulos
La sintaxis de las declaraciones en un módulo es la siguiente:
MÓDULO [nombre-módulo]
[LOS NOMBRES SON nombre-conjunto-de-caracteres]
IDIOMA {ADA|C|COBOL|FORTRAN|MUMPS|PASCAL|PLI|SQL}
[ESQUEMA nombre-esquema]
[AUTORIZACIÓN id-autorización]
[declaraciones-de-tabla-temporales...]
[declaraciones-de-cursor...]
[declaraciones-de-cursor-dinámico...]
procedimientos...
Los corchetes indican que el nombre del módulo es opcional. Nombrarlo de todos modos es
una buena idea si quieres evitar que las cosas se vuelvan demasiado confusas.
Capítulo 16: Uso de SQL dentro de las aplicaciones 341
Siguiendo todas las declaraciones que analicé en la sección anterior, las partes funcionales del
módulo son los procedimientos. Un procedimiento de lenguaje de módulo SQL tiene un
nombre, declaraciones de parámetros y declaraciones SQL ejecutables. El programa en
lenguaje procesal llama al procedimiento por su nombre y le pasa valores a través de los
parámetros declarados. La sintaxis del procedimiento se ve así:
PROCEDIMIENTO nombre-procedimiento
(declaración-parámetro [, declaración-parámetro]... declaración SQL;
[declaraciones SQL];
nombre-parámetro tipo-datos
ESTADOSQL
342 Parte IV: Control de operaciones
Los parámetros que declare pueden ser parámetros de entrada, parámetros de salida o
[Link] un parámetro de estado a través del cual se informan errores.
(Puede profundizar en los parámetros dirigiéndose al Capítulo 21).
El Capítulo 4 le muestra cómo crear tablas de bases de datos con Access. Esa operación
representa sólo una pequeña fracción de las capacidades de Access. Access es una
herramienta y su objetivo principal es desarrollar aplicaciones que procesen los datos en
tablas de bases de datos. Con Access, puede colocar objetos en formularios y luego
personalizarlos dándoles propiedades, eventos y métodos. Puede manipular los
formularios y objetos con código VBA, que puede contener SQL incorporado.
Aunque las herramientas RAD como Access pueden ofrecer aplicaciones de alta calidad en
menos tiempo, normalmente no funcionan en todas las plataformas. Access, por ejemplo, sólo
se ejecuta con el sistema operativo Microsoft Windows. Es posible que tenga suerte y descubra
que la herramienta RAD que eligió funciona en algunas plataformas, pero si para usted es
importante crear una funcionalidad independiente de la plataforma, o si cree que
eventualmente querrá migrar su aplicación a una plataforma diferente, tenga cuidado.
Capítulo 16: Uso de SQL dentro de las aplicaciones 343
Las herramientas RAD como Access representan el comienzo de la eventual fusión del
diseño de bases de datos relacionales y orientadas a objetos. Las fortalezas estructurales
del diseño relacional y SQL sobrevivirán. Se verán incrementados por el desarrollo rápido
(y comparativamente libre de errores) que proviene de la programación orientada a
objetos.
Menciono los tres componentes de SQL (lenguaje de definición de datos, lenguaje de manipulación de
datos y lenguaje de control de datos) en el capítulo 3. El subconjunto de SQL contenido en Access
implementa principalmente el lenguaje de manipulación de datos. Puede realizar operaciones de
creación de tablas con Access SQL, pero son mucho más fáciles de realizar con la herramienta RAD
que describo en el Capítulo 4. Lo mismo se aplica a la implementación de funciones de seguridad, que
cubro en el Capítulo 14.
Para echar un vistazo a algo de Access SQL, debes acercarte sigilosamente desde atrás.
Consideremos un ejemplo tomado de la base de datos de la ficticia Sociedad Lunar de Oregón,
una organización de investigación sin fines de lucro. La Sociedad cuenta con varios equipos de
investigación, uno de los cuales es el Equipo de Investigación de la Base Lunar (MBRT). Ha
surgido una pregunta sobre qué artículos académicos han escrito los miembros del equipo. Se
formuló una consulta utilizando la función Consulta por ejemplo (QBE) de Access para
recuperar los datos deseados. La consulta, que se muestra en la Figura 16-1, extrae datos de las
tablas RESEARCHTEAMS, AUTHORS y PAPERS con la ayuda de las tablas de intersección AUTH-
RES y AUTH-PAP que se agregaron para romper las relaciones de muchos a muchos.
344 Parte IV: Control de operaciones
Figura 16-1:
El diseño
Vista de
MBRT
Documentos
consulta.
Después de hacer clic en la pestaña Inicio para acceder a la barra de herramientas, puede hacer clic
en el menú desplegable del ícono Ver en la esquina superior izquierda de la ventana para revelar
las otras vistas disponibles de la base de datos. Una de las opciones es Vista SQL. (Ver Figura 16-2.)
Figura 16-2:
Uno de tus
Ver menú
opciones es
Vista SQL.
Cuando hace clic en Vista SQL, aparece la ventana de edición de SQL, que muestra la
declaración SQL que ha generado Access, según las elecciones que realizó utilizando
QBE.
Esta declaración SQL, que se muestra en la Figura 16-3, es lo que realmente se envía al motor
de la base de datos. El motor de la base de datos, que interactúa directamente con la propia
base de datos, sólo entiende SQL. Cualquier información ingresada en el entorno QBE debe
traducirse a SQL antes de enviarse al motor de la base de datos para su procesamiento.
Capítulo 16: Uso de SQL dentro de las aplicaciones 345
Figura 16-3:
un SQL
declaración
eso
recupera el
nombres de todos
los papeles
escrito por
miembros de
el MBRT.
Puede notar que la sintaxis de la declaración SQL que se muestra en la Figura 16-3
difiere algo de la sintaxis del SQL estándar ANSI/ISO. Tome en serio el viejo dicho:
“Cuando estés en Roma, haz lo que hacen los romanos”. Cuando trabaje con Access,
utilice el dialecto Access de SQL. Ese consejo también se aplica a cualquier otro entorno
en el que esté trabajando. Todas las implementaciones de SQL difieren del estándar en
un aspecto u otro.
Si desea escribir una nueva consulta en Access SQL, es decir, una que aún no se haya creado usando
QBE, simplemente puede borrar alguna consulta existente de la ventana de edición de SQL y escribir
un nuevo [Link]ón. Haga clic en la pestaña DISEÑO y luego en el ícono rojo del
signo de exclamación (Ejecutar) en la barra de herramientas en la parte superior de la pantalla para
ejecutar su nueva consulta. El resultado aparece en pantalla en la Vista Hoja de datos.
346 Parte IV: Control de operaciones
Parte V
✓ Usando JDBC
I n los últimos años, las computadoras se han interconectado cada vez más, tanto
dentro como entre organizaciones. Con esta conexión surge la necesidad de
compartir información de bases de datos a través de redes. El principal obstáculo para el
libre intercambio de información entre redes es la incompatibilidad del software
operativo y las aplicaciones que se ejecutan en diferentes máquinas. La creación de SQL y
su continua evolución han sido pasos importantes para superar la incompatibilidad de
hardware y software.
ODBC
ODBCEs una interfaz estándar entre una base de datos y una aplicación que accede
a los datos de la base de datos. Tener un estándar permite que cualquier interfaz
de aplicación acceda a cualquier base de datos mediante SQL. El único requisito es
que tanto el front-end como el back-end cumplan con el estándar ODBC. ODBC 4.0
es la versión actual del estándar.
Una aplicación accede a una base de datos utilizando unconductor(en este caso, el
controlador ODBC), que está diseñado específicamente para interactuar con esa base de
datos en particular. La parte delantera del conductor, el lado que va a la aplicación, cumple
estrictamente el estándar ODBC. La aplicación tiene el mismo aspecto, independientemente
del motor de base de datos que se encuentre en el back-end. El back-end del controlador
está personalizado para el motor de base de datos específico al que se dirige. Con esta
arquitectura, las aplicaciones no tienen que personalizarse (ni siquiera tener en cuenta) qué
motor de base de datos back-end controla realmente los datos que están utilizando. El
conductor enmascara las diferencias entre los extremos.
La interfaz ODBC
Elinterfaz ODBCEs esencialmente un conjunto de definiciones, cada una de las cuales se
acepta como estándar. Las definiciones cubren todo lo necesario para establecer
comunicación entre una aplicación y una base de datos. La interfaz ODBC define lo
siguiente:
Para realizar una operación en una base de datos, incluya la declaración SQL adecuada como
argumento de una llamada de función ODBC. Siempre que utilice la sintaxis SQL estándar
especificada por ODBC, la operación funciona, independientemente del motor de base de datos
que se encuentre en el back-end.
Capítulo 17: Acceso a datos con ODBC y JDBC 351
Componentes de ODBC
La interfaz ODBC consta de cuatro componentes funcionales, denominados capas ODBC. Cada
componente desempeña un papel para hacer que ODBC sea lo suficientemente flexible como para
proporcionar una comunicación transparente desde cualquier front-end compatible hasta cualquier
back-end compatible. Las cuatro capas de la interfaz ODBC se encuentran entre el usuario y los datos
que el usuario desea, de la siguiente manera:
✓ DLL del controlador:Debido a que las fuentes de datos pueden ser diferentes entre sí
(en algunos casos,muydiferente), necesita una forma de traducir las llamadas a
funciones ODBC estándar al idioma nativo de cada fuente de datos. La traducción es
tarea del controlador DLL. Cada DLL de controlador acepta llamadas a funciones a través
de la interfaz ODBC estándar y luego las traduce a código que sea comprensible para sus
[Link] de [Link] la fuente de datos responde con un conjunto de
resultados, el controlador lo reformatea en dirección inversa a un conjunto de resultados
ODBC estándar. El controlador es el elemento crucial que permite que cualquier
aplicación compatible con ODBC manipule la estructura y el contenido de una fuente de
datos compatible con ODBC.
✓ Fuente de datos:La fuente de datos puede ser una de muchas cosas diferentes. Puede
ser un DBMS relacional y una base de datos asociada que reside en la misma
computadora que la aplicación. Puede ser una base de datos de este tipo en una
computadora remota. Puede ser unmétodo de acceso secuencial indexado(ISAM) sin
DBMS, ya sea en la computadora local o remota. Puede incluir o no una red. Las
innumerables formas diferentes que puede adoptar la fuente de datos requieren que
haya un controlador personalizado disponible para cada una.
352 Parte V: Llevando SQL al mundo real
Si su sistema cliente/servidor siempre accede al mismo tipo de fuente de datos y está seguro
de que nunca necesitará acceder a datos de otro tipo de fuente de datos, entonces es posible
que desee utilizar el controlador nativo suministrado con su DBMS. Sin embargo, si es posible
que necesite acceder a datos almacenados en una forma diferente en algún momento en el
futuro, usar una API ODBC ahora podría ahorrarle una gran cantidad de trabajo posterior.
Los controladores ODBC también están optimizados para funcionar con fuentes de datos de back-end
específicas, pero todos tienen la misma interfaz de front-end para el administrador de controladores. Por lo
tanto, cualquier controlador que no haya sido optimizado para una interfaz en particular probablemente no
sea tan rápido como unnativocontrolador que está diseñado específicamente para esa parte delantera. Una
queja importante sobre la primera generación de controladores ODBC fue su bajo rendimiento en
comparación con los controladores nativos. Sin embargo, pruebas comparativas recientes han demostrado
que los controladores ODBC 4.0 son bastante competitivos en rendimiento con respecto a los controladores
nativos. La tecnología es lo suficientemente madura como para que ya no sea necesario sacrificar el
rendimiento para obtener las ventajas de la estandarización.
ODBC e Internet
Las operaciones de bases de datos a través de Internet difieren en varios aspectos
importantes de las operaciones de bases de datos en un sistema cliente/servidor, aunque es
posible que el usuario no note ninguna diferencia. La diferencia más visible desde el punto de
vista del usuario es la parte del cliente del sistema, que incluye la interfaz de usuario. En un
sistema cliente/servidor, la interfaz de usuario es la parte de una aplicación que se comunica
con la fuente de datos en el servidor, mediante declaraciones SQL compatibles con ODBC. En
la web, la parte cliente del sistema todavía está en la computadora local, pero se comunica con
la fuente de datos en el servidor mediante el protocolo estándar HTTP.
Capítulo 17: Acceso a datos con ODBC y JDBC 353
Cualquiera que tenga el software de cliente adecuado (y la autorización adecuada) puede
acceder a los datos almacenados en la web. Esto significa que puede crear una
aplicación en la computadora de su trabajo y luego acceder a ella con su dispositivo
móvil. La Figura 17-1 compara los sistemas cliente/servidor con los sistemas basados en
web.
Figura 17-1:
Un cliente/
servidor
sistema
versus un
basado en web
base de datos
sistema.
Extensiones de servidor
En el sistema basado en web, la comunicación entre la interfaz de la aplicación en la
máquina cliente y el servidor web en la máquina servidor se realiza mediante HTTP. Un
componente del sistema llamadoextensión del servidortraduce los comandos que llegan
a través de la red a SQL compatible con ODBC. Luego, el servidor de la base de datos
actúa sobre el SQL, que a su vez trata directamente con la fuente de datos. En la
dirección inversa, la fuente de datos envía el conjunto de resultados generado por una
consulta a través del servidor de la base de datos a la extensión del servidor, que luego
lo traduce a un formato que el servidor web pueda manejar. Luego, los resultados se
envían a través de la web al front-end de la aplicación en la máquina cliente, donde se
muestran al usuario. La figura 17-2 muestra la anatomía de este tipo de sistema.
354 Parte V: Llevando SQL al mundo real
Figura 17-2:
basado en la web
base de datos
sistema con
un servidor
extensión.
Extensiones de cliente
Aplicaciones como Mircosoft Access 2013 están diseñadas para funcionar con datos
almacenados localmente en la máquina del usuario, en un servidor ubicado en una red
local o de área amplia (LAN o WAN), o en Internet en la nube. El repositorio en la nube de
Microsoft se llama SkyDrive. También es posible acceder a una aplicación en la nube
usando nada más que un navegador web. Los navegadores web fueron diseñados (y
ahora están optimizados) para proporcionar interfaces fáciles de entender y usar para
sitios web de todo tipo. Los navegadores más populares, Google Chrome, Mozilla Firefox,
Microsoft Internet Explorer y Apple Safari, no fueron diseñados ni optimizados para ser
interfaces de bases de datos. Para que se produzca una interacción significativa con una
base de datos a través de Internet, el lado cliente del sistema necesita una funcionalidad
que el navegador no proporciona.
Para satisfacer esta necesidad, existen varios tipos deextensiones de clienteha sido
desarrollado. Estas extensiones incluyen controles ActiveX, subprogramas de Java y
scripts. Las extensiones se comunican con el servidor vía HTTP, utilizando HTML, que
es el lenguaje de la web. La extensión del servidor traduce cualquier código HTML que
se ocupe del acceso a la base de datos a SQL compatible con ODBC antes de reenviarlo
a la fuente de datos.
Capítulo 17: Acceso a datos con ODBC y JDBC 355
controles ActiveX
Los controles ActiveX de Microsoft funcionan con Internet Explorer de Microsoft, que es un
navegador muy popular. Sin embargo, recientemente ha perdido cuota de mercado frente a
Google Chrome y Firefox de Mozilla.
Guiones
Los scripts son las herramientas más flexibles para crear extensiones de cliente. El uso de un lenguaje
de secuencias de comandos, como el omnipresente JavaScript o VBScript de Microsoft, le brinda el
máximo control sobre lo que sucede en el lado del cliente. Puede realizar comprobaciones de
validación en los campos de entrada de datos, lo que permite rechazar o corregir entradas no válidas
sin tener que acceder a la web. Esto puede ahorrarle tiempo y reducir el tráfico en la web,
beneficiando así también a otros usuarios. Por supuesto, las comprobaciones de validación también
se pueden realizar en el extremo del servidor aplicando restricciones a los valores que pueden tomar
los elementos de datos. Al igual que con los subprogramas de Java, los scripts están integrados en una
página HTML y se ejecutan cuando el usuario interactúa con esa página.
JDBC
JDBC (Java DataBase Connectivity) es similar a ODBC, pero difiere en algunos aspectos
importantes. Una de esas diferencias se insinúa en su nombre. JDBC es una interfaz de
base de datos que siempre tiene el mismo aspecto para el programa cliente,
independientemente de qué fuente de datos se encuentre en el servidor (back-end). La
diferencia es que JDBC espera que la aplicación cliente esté escrita en el lenguaje Java en
lugar de otro lenguaje como C++ o Visual Basic. Otra diferencia es que Java y JDBC fueron
diseñados específicamente para ejecutarse en la web o en una intranet.
356 Parte V: Llevando SQL al mundo real
Java es un lenguaje similar a C++ desarrollado por Sun Microsystems específicamente para el
desarrollo de programas de cliente web. Cuando se establece una conexión entre un servidor
y un cliente a través de la web, el subprograma de Java apropiado se descarga al cliente,
donde el subprograma comienza a ejecutarse. El subprograma, que está integrado en una
página HTML, proporciona la funcionalidad específica de la base de datos que el cliente
necesita para proporcionar acceso flexible a los datos del servidor. La Figura 17-3 es una
representación esquemática de una aplicación de base de datos web con un subprograma
Java ejecutándose en la máquina cliente.
Figura 17-3:
Una red
base de datos
solicitud,
usando un Java
subprograma.
Cuando el sistema que le interesa está en la Red, las condiciones de funcionamiento son
diferentes a las condiciones en un sistema cliente/servidor. El lado cliente de una aplicación
que opera a través de Internet es un navegador, con capacidades computacionales mínimas.
Estas capacidades deben aumentarse para que se pueda realizar un procesamiento
significativo de la base de datos; Los subprogramas de Java proporcionan estas capacidades.
Al igual que ODBC, JDBC pasa sentencias SQL desde la aplicación de front-end (applet)
que se ejecuta en el cliente a la fuente de datos en el back-end. También sirve para pasar
conjuntos de resultados o mensajes de error desde la fuente de datos a la aplicación. El
valor de usar JDBC es que el escritor del subprograma puede escribir en la interfaz JDBC
estándar sin necesidad de saber o preocuparse qué base de datos se encuentra en el
back-end. JDBC realiza cualquier conversión necesaria para que se produzca una
comunicación bidireccional precisa. Aunque está diseñado para funcionar en la web,
JDBC también funciona en entornos cliente/servidor donde una aplicación escrita en Java
se comunica con un servidor de base de datos a través de la interfaz JDBC.
358 Parte V: Llevando SQL al mundo real
Capítulo 18
En este capítulo
▶ Usando SQL con XML
▶ Explorando la relación entre XML, bases de datos e Internet
S A partir de SQL:2008, el estándar ISO/IEC SQL admite XML. Los archivos XML
(eXtensible Markup Language) se han convertido en un estándar universalmente
aceptado para el intercambio de datos entre plataformas diferentes. Con XML, no
importa si la persona con la que comparte datos tiene un entorno de aplicación
diferente, un sistema operativo diferente o incluso hardware diferente. XML puede
formar un puente de datos entre ustedes dos.
SQL y XML proporcionan dos formas diferentes de estructurar datos para que pueda
guardarlos y recuperar información seleccionada de ellos:
✓ SQL es una excelente herramienta para manejar datos numéricos y de texto que
pueden clasificarse por tipo de datos y tener un tamaño bien definido.
SQL se creó como una forma estándar de mantener y operar con datos guardados en
bases de datos relacionales.
Las fortalezas y objetivos de SQL y XML son complementarios. Cada uno reina en
su propio dominio y forma alianzas con el otro para brindar a los usuarios la
información que desean, cuando la desean y donde la desean.
El tipo de datos XML, incluidos sus subtipos, aunque es intrínseco a cualquier implementación
que lo admita, actúa como un tipo definido por el usuario (UDT). Los subtipos son:
✓ XML(DOCUMENTO(SIN TIPO))
✓ XML(DOCUMENTO(CUALQUIER))
✓ XML(DOCUMENTO(XMLSCHEMA))
✓ XML(CONTENIDO(SIN TIPO))
✓ XML(CONTENIDO(CUALQUIER))
✓ XML(CONTENIDO(XMLSCHEMA))
✓ XML(SECUENCIA)
El tipo XML acerca a SQL y XML porque permite que las aplicaciones realicen
operaciones SQL en contenido XML y operaciones XML en contenido SQL. Puede
incluir una columna del tipo XML con columnas de cualquiera de los otros tipos
predefinidos cubiertos en el Capítulo 2 en una operación de unión en elDÓNDE
cláusula de una consulta. Al estilo de una verdadera base de datos relacional, su
DBMS determinará la forma óptima de ejecutar la consulta y luego la hará.
Capítulo 18: Operar con datos XML con SQL 361
Comentarios XML(SECUENCIA) );
<Comentarios>
<Comentar>
<NºComentario>1</NºComentario>
<MessageText>¿Está VetLab equipado para analizar pingüinos?
¿sangre?</MessageText>
<RespuestaSolicitada>Sí</RespuestaSolicitada> </
Comentar>
362 Parte V: Llevando SQL al mundo real
<Comentar>
<NºComentario>2</NºComentario>
<MessageText>Gracias por la rápida respuesta al
muestra de esputo de foca leopardo.</MessageText>
<RespuestaSolicitada>No</RespuestaSolicitada> </
Comentar>
</Comentarios>
Identificadores de mapeo
XML es mucho más estricto que SQL en los caracteres que permite en los identificadores.
Los caracteres que son legales en SQL pero ilegales en XML deben asignarse a algo legal
antes de que puedan formar parte de un documento XML. SQL admite identificadores
delimitados. Esto significa que todo tipo de caracteres impares como %, $ y & son legales,
siempre que estén entre comillas dobles. Estos caracteres no son legales en XML.
Además, los nombres XML que comienzan con los caracteresXMLen cualquier
combinación de casos están reservados y, por tanto, no pueden utilizarse impunemente.
Si tiene identificadores SQL que comienzan con esas letras, debe cambiarlos.
Un mapeo acordado cierra la brecha de identificadores entre SQL y XML. Al pasar de SQL
a XML, todos los identificadores SQL se convierten a Unicode. A partir de ahí, todos los
identificadores SQL que también sean nombres XML legales no se modifican. Caracteres
de identificador SQL que no son legales. Los nombres XML se reemplazan con un código
hexadecimal que toma la forma “_xNNNN_”o "_xNNNNNNNN_”, dóndenorterepresenta
un dígito hexadecimal en mayúscula. Por ejemplo, el guión bajo estará representado por
“_x005F_”.Los dos puntos estarán representados por “_x003A_”.Estas representaciones
son los códigos de los caracteres Unicode para el guión bajo y los dos puntos. El caso en
el que un identificador SQL comienza con los caracteresx, metro,yyose maneja prefijando
todas esas instancias con un código en la forma “_xFFFF_”.
La conversión de XML a SQL es mucho más sencilla. Todo lo que necesita hacer es escanear los
caracteres de un nombre XML en busca de una secuencia de "_xNNNN_”o "_xNNNNNNNN_”.
Siempre que encuentre una secuencia de este tipo, reemplácela con el carácter al que
corresponde el Unicode. Si un nombre XML comienza con los caracteres “_xFFFF_”,ingnóralos.
Siguiendo estas reglas simples, puede asignar un identificador SQL a un nombre XML y luego
volver a un identificador SQL nuevamente. Sin embargo, esta feliz situación no se aplica a una
asignación del nombre XML al identificador SQL y de regreso al nombre XML.
364 Parte V: Llevando SQL al mundo real
<xsd:simpleType>
<xsd:base de restricción=”xsd:entero”/>
<xsd:maxInclusive value=”2157483647”/>
<xsd:minInclusive value=”-2157483648”/>
<xsd:anotación>
<sqlxml:sqltype name=”INTEGER”/> </
xsd:anotación>
</xsd:restricción>
</xsd:simpleType>
Tablas de mapeo
Puede asignar una tabla a un documento XML. De manera similar, puede asignar todas las
tablas de un esquema o todas las tablas de un catálogo. Los privilegios se mantienen mediante
el mapeo. Una persona que tiene laSELECCIONAREl privilegio en solo algunas columnas de la
tabla podrá asignar solo esas columnas al documento XML. En realidad, la asignación produce
dos documentos, uno que contiene los datos de la tabla y el otro que contiene el esquema XML
que describe el primer documento. A continuación se muestra un ejemplo de la asignación de
una tabla SQL a un documento que contiene datos XML:
<CLIENTE>
<fila>
<Nombre>Abe</Nombre>
<Apellido>Abelson</Apellido>
<Ciudad>Springfield</Ciudad> <Código
de área>714</Código de área>
Capítulo 18: Operar con datos XML con SQL 365
<Teléfono>555-1111</Teléfono> </fila>
<fila>
<Nombre>Bill</Nombre>
<Apellido>Bailey</Apellido>
<Ciudad>Decatur</Ciudad>
<Código de área>714</Código de área>
<Teléfono>555-2222</Teléfono> </fila>
.
.
.
</CLIENTE>
Al elemento raíz del documento se le ha dado el nombre de tabla. Cada fila de la tabla está contenida
dentro de un archivo <fila>elemento, y cada elemento de fila contiene una secuencia de elementos de
columna, cada uno de los cuales lleva el nombre de la columna correspondiente en la tabla de origen.
Cada elemento de columna contiene un valor de datos.
<fila>
<Nombre>Bill</Nombre>
<Apellido>Bailey</Apellido>
<Ciudad xsi:nil=”true” /> <Código de
área>714</Código de área>
<Teléfono>555-2222</Teléfono>
</fila>
<fila>
<Nombre>Bill</Nombre>
<Apellido>Bailey</Apellido> <Código de
área>714</Código de área>
<Teléfono>555-2222</Teléfono>
</fila>
En este caso, la fila que contiene el valor nulo está ausente. No hay ninguna referencia al
respecto.
366 Parte V: Llevando SQL al mundo real
<xsd:esquema>
<xsd:simpleType nombre=”CHAR_15”>
<xsd:base de restricción=”xsd:cadena”>
<xsd:valor de longitud = “15”/> </
xsd:restricción>
</xsd:simpleType>
<xsd:simpleType nombre=”CHAR_25”>
<xsd:base de restricción=”xsd:cadena”>
<xsd:valor de longitud = “25”/> </
xsd:restricción>
</xsd:simpleType>
<xsd:simpleType nombre=”CHAR_3”>
<xsd:base de restricción=”xsd:cadena”>
<xsd:valor de longitud = “3”/> </
xsd:restricción>
</xsd:simpleType>
<xsd:simpleType nombre=”CHAR_8”>
<xsd:base de restricción=”xsd:cadena”>
<xsd:valor de longitud = “8”/> </
xsd:restricción>
</xsd:simpleType>
<xsd:secuencia>
<xsd:element name=”FirstName” type=”CHAR_15”/>
<xsd:element name=”Apellido” type=”CHAR_25”/>
<xsd:elemento
nombre=”Ciudad” tipo=”CHAR_25 nillable=”true”/>
<xsd:elemento
nombre=”Código de área” tipo=”CHAR_3” nillable=”true”/>
<xsd:elemento
name=”Teléfono” type=”CHAR_8” nillable=”true”/> </
xsd:secuencia>
</xsd:esquema>
Este esquema es apropiado si se utiliza el enfoque nulo para manejar valores nulos. El enfoque
ausente requiere una definición de elemento ligeramente diferente. Por ejemplo:
<xsd:elemento
nombre=”Ciudad” tipo=”CHAR_25” minOccurs=”0”/>
Capítulo 18: Operar con datos XML con SQL 367
DOCUMENTO XML
ElDOCUMENTO XMLEl operador toma un valor XML como entrada y devuelve otro
valor XML como salida. El nuevo valor XML es un nodo de documento que se
construye según las reglas del constructor de documentos calculado en XQuery.
ELEMENTO XML
ElELEMENTO XMLEl operador traduce un valor relacional en un elemento XML. Puede
utilizar el operador en unSELECCIONARdeclaración para extraer datos en formato XML
de una base de datos SQL y publicarlos en la web. He aquí un ejemplo:
SELECCIONAR [Link]
XMLELEMENT (NOMBRE”Ciudad”, [Link]) COMO
“Resultado” DEL CLIENTE c
DONDE Apellido=”Abelson”;
Apellido Resultado
abelson <Ciudad>Springfield</Ciudad>
368 Parte V: Llevando SQL al mundo real
XMLFOREST
ElXMLFORESTEl operador produce una lista, obosque,de elementos XML de una lista de valores
relacionales. Cada uno de los valores del operador produce un nuevo elemento. A continuación se
muestra un ejemplo de este operador:
SELECCIONAR [Link]
XMLFOREST ([Link],
c.Código de área,
[Link]éfono) COMO “Resultado”
DEL CLIENTE c
DONDE Apellido=”Abelson” O Apellido=”Bailey”;
Apellido Resultado
XMLCONCAT
XMLCONCATproporciona una forma alternativa de producir un bosque de
elementos concatenando sus argumentos XML. Por ejemplo, el siguiente código:
SELECCIONE [Link],
XMLCONCAT(
XMLELEMENT (NOMBRE”primero”, [Link],
XMLELEMENT (NOMBRE”apellido”, [Link]))
COMO “Resultado”
DEL CLIENTE c ;
Apellido Resultado
abelson <primero>Abe</primero>
<last>Abelson</last>
Muralla exterior <primero>Bill</primero>
<last>Bailey</last>
Capítulo 18: Operar con datos XML con SQL 369
XMLAGG
XMLAGG,la función agregada, toma documentos XML o fragmentos de documentos XML
como entrada y produce un único documento XML como salida enAGRUPAR POR
consultas. La agregación contiene un bosque de elementos. Aquí hay un ejemplo para
ilustrar el concepto:
Lista de ciudades
<Nombre de la ciudad=”Decatur”>
<last>Bailey</last>
</Ciudad>
<Nombre de la ciudad=”Philo”>
<last>Stetson</last>
<last>Stetson</last>
<last>Madera</last>
</Ciudad
<Nombre de la ciudad=”Springfield”>
<last>Abelson</last>
</Ciudad>
COMENTARIO XML
ElCOMENTARIO XMLLa función permite que una aplicación cree un comentario XML. Su
sintaxis es:
Por ejemplo:
XMLCOMMENT ('Haga una copia de seguridad de la base de datos a las 2 am todas las noches').
<!--Haga una copia de seguridad de la base de datos a las 2 am todas las noches. -->
370 Parte V: Llevando SQL al mundo real
XMLPARSE
ElXMLPARSELa función produce un valor XML al realizar un análisis sin
validación de una cadena. Podrías usarlo así:
XMLPI
ElXMLPILa función permite a las aplicaciones crear instrucciones de procesamiento
XML. La sintaxis de esta función es:
CONSULTA XML
ElCONSULTA XMLLa función evalúa una expresión XQuery y devuelve el
resultado a la aplicación SQL. La sintaxis deCONSULTA XMLes:
XMLQUERY ( expresión-XQuery
[ PASANDO { Por REF | POR VALOR }
lista de argumentos]
REGRESANDO { CONTENIDO | SECUENCIA }
{ POR REFERENCIA | POR VALOR } )
SELECCIONE max_average,
CONSULTA XML (
'para $batting_average en
/jugador/promedio_bateo
Capítulo 18: Operar con datos XML con SQL 371
donde /jugador/apellido = $var1 return
$batting_average’
PASANDO POR VALOR
'Manto' AS var1,
SECUENCIA DE DEVOLUCIÓN POR VALOR)
DE estadísticas_ofensivas
XMLCAST
ElXMLCASTLa función es similar a una [Link] SQLfunción, pero tiene
algunas restricciones adicionales. ElXMLCASTLa función permite a una aplicación
convertir un valor de un tipo XML a otro tipo XML o un tipo SQL. De manera similar,
puede usarlo para convertir un valor de un tipo SQL a un tipo XML. Aquí hay algunas
restricciones:
✓ Sólo se pueden convertir valores de uno de los tipos XML o del tipo nulo SQL a XML
(DOCUMENTO SIN TIPO)o paraXML (CUALQUIER DOCUMENTO).
He aquí un ejemplo:
ElXMLCASTla función se transforma en una ordinariaCAST [Link] única razón para utilizar
una palabra clave independiente es hacer cumplir las restricciones que se enumeran aquí.
Predicados
Predicadosdevuelve un valor de Verdadero o Falso. Se han agregado algunos predicados nuevos
que se relacionan específicamente con XML.
DOCUMENTO
El propósito deDOCUMENTOEl predicado es determinar si un valor XML es un documento
XML. Prueba para ver si un valor XML es una instancia de cualquiera de los dosXML
(CUALQUIER DOCUMENTO)oXML (DOCUMENTO SIN TIPO).La sintaxis es:
CONTENIDO
tu usas elCONTENIDOpredicado para determinar si un valor XML es una instancia de
XML (CUALQUIER CONTENIDO)oXML (CONTENIDO SIN TIPO).Aquí está la sintaxis:
XMLEXISTE
Como su nombre lo indica, puede utilizar elXMLEXISTEpredicado para
determinar si existe un valor. Aquí está la sintaxis:
XMLEXISTS ( expresión-XQuery
[ lista de argumentos ])
VÁLIDO
ElVÁLIDOEl predicado se utiliza para evaluar un valor XML y ver si es válido en el
contexto de un esquema XML registrado. La sintaxis delVÁLIDO El predicado es
más complejo que el caso de la mayoría de los predicados:
y/o:
nombre-columna tipo-datos
[POR REFERENCIA | POR
VALOR] [cláusula-por defecto]
[PATH XQuery-expresión]
$col/cliente
devolver
millones de dólares
Mapeo no predefinido
Tipos de datos a XML
En el estándar SQL, los tipos de datos no predefinidos incluyen dominio, UDT distinto, fila,
matriz y conjunto múltiple. Puede asignar cada uno de estos a datos con formato XML,
utilizando el código XML adecuado. Las siguientes secciones muestran ejemplos de cómo
mapear estos tipos.
Dominio
Para asignar un dominio SQL a XML, primero debe tener un dominio. Para este
ejemplo, cree uno usando unCREAR DOMINIOdeclaración:
<xsd:simpleType>
Nombre=’[Link] Oeste’>
<xsd:anotación>
<xsd:appinfo>
<sqlxml:sqltype tipo='DOMINIO'
nombreEsquema='Ventas'
typeName = 'Costa Oeste'
mappedType = 'CHAR_2'
final='verdadero'/>
<xsd:appinfo>
</xsd:anotación>
<xsd:base de restricción=’CHAR_2’/>
</xsd:simpleType>
376 Parte V: Llevando SQL al mundo real
<Región Oeste>
<fila>
.
.
.
<Estado>AK</Estado>
.
.
.
</fila>
.
.
.
</Región Oeste>
UDT distinto
Con un UDT distinto, puede hacer lo mismo que puede hacer con un dominio,
pero con una escritura más fuerte. Así es cómo:
<xsd:simpleType>
Nombre=’[Link] Oeste’>
<xsd:anotación>
<xsd:appinfo>
<sqlxml:sqltype tipo=’DISTINTO’
nombreEsquema='Ventas'
typeName = 'Costa Oeste'
mappedType = 'CHAR_2'
final='verdadero'/>
<xsd:appinfo>
</xsd:anotación>
<xsd:base de restricción=’CHAR_2’/>
</xsd:simpleType>
Esto crea un elemento que es el mismo que el creado para el dominio anterior.
Capítulo 18: Operar con datos XML con SQL 377
Fila
ElFILAtype le permite agrupar varios elementos, o incluso toda una fila de información,
en un solo campo de una fila de la tabla. Puedes crear unFILA escriba como parte de la
definición de la tabla, de la siguiente manera:
<xsd:complexType Name=’ROW.1’>
<xsd:anotación>
<xsd:appinfo>
<sqlxml:sqltype kind=’FILA’>
<sqlxml:nombre del campo=’Inicio’
mappedType=’CHAR_13’/>
<sqlxml:nombre del campo=’Trabajo’
mappedType=’CHAR_13’/>
</sqlxml:sqltype>
<xsd:appinfo>
</xsd:anotación>
<xsd:secuencia>
<xsd:nombre del elemento=’Inicio’ nillable=’verdadero’
Tipo='CHAR_13'/>
<xsd:nombre del elemento=’Trabajo’ nillable=’verdadero’
Tipo='CHAR_13'/>
</xsd:secuencia>
</xsd:complexType>
<Teléfono>
<Inicio>(888)555-1111</Inicio>
<Trabajo>(888)555-1212</Trabajo>
</Teléfono>
378 Parte V: Llevando SQL al mundo real
Formación
<xsd:complexType Name=’ARRAY_4.CHAR_13’>
<xsd:anotación>
<xsd:appinfo>
<sqlxml:sqltype tipo=’ARRAY’
elementos máximos = '4'
mappedElementType=’CHAR_13’/>
</xsd:appinfo>
</xsd:anotación>
<xsd:secuencia>
<xsd:element Name=’element’
minOccurs=’0’ maxOccurs=’4’ nillable=’true’
type=’CHAR_13’/> </xsd:secuencia>
</xsd:complexType>
<Teléfono>
<elemento>(888)555-1111</elemento>
<elemento>xsi:nil=’true’/>
<elemento>(888)555-3434</elemento>
</Teléfono>
Conjunto múltiple
Los números de teléfono del ejemplo anterior podrían almacenarse tanto en un conjunto múltiple
como en una matriz. Para mapear un conjunto múltiple, use algo similar a lo siguiente:
<xsd:complexType Name=’MULTISET.CHAR_13’>
<xsd:anotación>
<xsd:appinfo>
<sqlxml:sqltype tipo=’MULTISET’
mappedElementType=’CHAR_13’/>
</xsd:appinfo>
</xsd:anotación>
<xsd:secuencia>
<xsd:element Name=’element’ minOccurs=’0’
maxOccurs=’ilimitado’ nillable=’true’
type=’CHAR_13’/> </xsd:secuencia>
</xsd:complexType>
<Teléfono>
<elemento>(888)555-1111</elemento>
<elemento>xsi:nil=’true’/>
<elemento>(888)555-3434</elemento>
</Teléfono>
Temas avanzados
✓ Errores de manejo
✓ Aplicar desencadenantes
con cursores
En este capítulo
▶ Especificación del alcance del cursor con la declaración DECLARE
▶ Abrir un cursor
▶ Obteniendo datos una fila a la vez
▶ Cerrar un cursor
Un cursor es como un puntero que localiza una fila de una tabla específica. Cuando un
cursor está activo, puedeSELECCIONAR, ACTUALIZAR,oBORRARla fila a la que apunta el
cursor.
Los cursores son valiosos si desea recuperar filas seleccionadas de una tabla, verificar su
contenido y realizar diferentes operaciones basadas en ese contenido. SQL no puede realizar
esta secuencia de operaciones por sí solo. SQL puede recuperar las filas, pero los lenguajes de
procedimiento son mejores para tomar decisiones basadas en el contenido de los campos. Los
cursores permiten que SQL recupere filas de una tabla una a la vez y luego envíe el resultado al
código de procedimiento para su procesamiento. Al colocar el código SQL en un bucle, puede
procesar toda la tabla fila por fila.
Iniciar bucle
código procesal
BUSCAR SQL EJECUTIVO
código procesal
Prueba de fin de tabla Fin
del bucle
Declaración EXEC SQL CLOSE
código procesal
Declarar un cursor
Para utilizar un cursor, primero debe declarar su existencia al DBMS. Esto lo
haces con unDECLARAR CURSORdeclaración. ElDECLARAR CURSORLa declaración
en realidad no causa que suceda nada; simplemente anuncia el nombre del
cursor al DBMS y especifica en qué consulta operará el cursor. A DECLARAR
CURSORdeclaración tiene la siguiente sintaxis:
Nota:El nombre del cursor identifica de forma única un cursor, por lo que debe ser diferente al de
cualquier otro nombre de cursor en el módulo o unidad de compilación actual.
Para que su aplicación sea más legible, asigne al cursor un nombre significativo.
Relacionelo con los datos que solicita la expresión de consulta o con la operación que
su código de procedimiento realiza sobre los datos.
expresión de consulta
Puedes usar cualquier legalSELECCIONARdeclaración como unexpresión de [Link] filas
queSELECCIONARLas recuperaciones de declaraciones son aquellas por las que el cursor pasa
una a la vez. Estas filas son el alcance del cursor.
Puede tener varias especificaciones de clasificación. Cada uno tiene la siguiente sintaxis:
Ordena por nombre de columna y, para hacerlo, la columna debe estar en la lista de selección
de la expresión de consulta. Las columnas que están en la tabla pero no en la lista de selección
de consulta no funcionan como especificaciones de clasificación. Por ejemplo, suponga que
desea realizar una operación que SQL no admite en filas seleccionadas de la tabla CLIENTE.
Puedes usar unDECLARAR CURSORdeclaración como esta:
Una intercalación es un conjunto de reglas que determina cómo se comparan las cadenas de un
juego de caracteres. Un juego de caracteres tiene una secuencia de clasificación predeterminada
que define el orden en el que se ordenan los elementos. Sin embargo, puede aplicar una secuencia
de clasificación distinta a la predeterminada a una columna. Para hacerlo, utilice el opcional
COLABORAR POR cláusula. Su implementación probablemente admita varias intercalaciones
comunes. Elige uno y luego haz la recopilació[Link]ñadiendo unASCoDESC
palabra clave de la cláusula.
es equivalente a
Cláusula de actualizabilidad
A veces, es posible que desee actualizar o eliminar filas de la tabla a las que accede con un
cursor. En otras ocasiones, es posible que desees garantizar que no se puedan realizar
dichas actualizaciones o eliminaciones. SQL le da control sobre este problema con la
cláusula de actualizabilidad delDECLARAR CURSORdeclaración. Si desea evitar
actualizaciones y eliminaciones dentro del alcance del cursor, utilice la cláusula:
Para actualizaciones de columnas específicas únicamente (dejando todas las demás protegidas),
utilice lo siguiente:
Todas las columnas enumeradas deben aparecer en elDECLARAR CURSORs expresión de consulta. Si
no incluye una cláusula de capacidad de actualización, la suposición predeterminada es que todas las
columnas enumeradas en la expresión de consulta son actualizables. En ese caso, unACTUALIZAR La
declaración puede actualizar todas las columnas de la fila a la que apunta el cursor, y unaBORRARLa
declaración puede eliminar esa fila.
Sensibilidad
La expresión de consulta en elDECLARAR CURSORLa declaración determina las
filas que caen dentro del alcance de un cursor. Considere este posible problema:
¿Qué sucede si una declaración en su programa, ubicada entre elABIERTOy el
CERCA declaraciones, cambia el contenido de algunas de esas filas para que ya no
satisfagan la consulta? ¿El cursor continúa procesando todas las filas que
calificaron originalmente o reconoce la nueva situación e ignora las filas que ya no
califican?
Cambiar los datos en columnas que forman parte de unDECLARAR CURSORLa expresión de
consulta después de que algunas (pero no todas) de las filas de la consulta hayan sido
procesadas resulta en un gran desastre. Es probable que sus resultados sean inconsistentes y
engañosos. Para evitar este problema, asegúrese de que el cursor no cambie como resultado
de cualquiera de las declaraciones dentro de su alcance. Añade elINSENSIBLE
388 Parte VI: Temas avanzados
palabra clave para suDECLARAR CURSORdeclaración. Mientras el cursor esté abierto, no será
sensible a (no se verá afectado por) cambios en la tabla que afecten a las filas calificadas en el
alcance del cursor. Un cursor no puede ser a la vez insensible y actualizable. Un cursor
insensible debe ser de sólo lectura.
Ahora, supongamos que abre ambos cursores y busca algunas filas con C1 y luego actualiza
un salario con C2 para aumentar su valor. Este cambio puede hacer que una fila que haya
obtenido con C1 vuelva a aparecer en una recuperación posterior de C1.
Las interacciones peculiares que son posibles con múltiples cursores abiertos, o con cursores abiertos
y operaciones de configuración, son el tipo de problemas de concurrencia que evita el aislamiento de
transacciones. Si opera de esta manera, se está metiendo en problemas. Así que recuerde: no opere
con varios cursores abiertos. Para obtener más información sobre el aislamiento de transacciones,
consulte el Capítulo 15.
Capacidad de desplazamiento
Abrir un cursor
Aunque elDECLARAR CURSORLa declaración especifica qué filas incluir en el
cursor, en realidad no causa que suceda nada porqueDECLARAR es solo una
declaración y no una declaración ejecutable. ElABIERTOLa declaración da
existencia al cursor. Tiene la siguiente forma:
ABRIR nombre-cursor;
Capítulo 19: Recorrer un conjunto de datos con cursores 389
Para abrir el cursor que uso en la discusión delORDENAR PORcláusula (anteriormente
en este capítulo), utilice lo siguiente:
No puede recuperar filas de un cursor hasta que abra el cursor. Cuando abre un cursor, los
valores de las variables a las que se hace referencia en elDECLARAR CURSORLa declaración se
vuelve fija, al igual que todas las funciones de fecha y hora actuales. Considere el siguiente
ejemplo de SQL integrado en un programa de lenguaje host:
Como describo en la sección "Abrir un cursor", elABIERTOLa utiliza solo un valor de marca de tiempo, sin importar cuánto
declaración corrige el valor de todas las variables a las que se tiempo se ejecute la declaración.
hace referencia en el cursor de declaración. También fija un
Aquí hay un ejemplo interesante de una implicación de
valor para las funciones de fecha y hora. Existe una fijación
esta regla:
similar de valores de fecha y hora en operaciones de
conjuntos. Considere este ejemplo: ACTUALIZAR CLAVE DE CONFIGURACIÓN DE EMPLEADO = ACTUAL_
MARCA DE TIEMPO;
ACTUALIZAR PEDIDOS ESTABLECER RecheckDate =
FECHA_ACTUAL DONDE....; Es posible que espere que esa declaración
establezca un valor único en la columna clave de
Ahora suponga que tiene varios pedidos. Comienza a ejecutar
cada empleado, porque el tiempo se mide en una
esta declaración un minuto antes de la medianoche. A
pequeña fracción de segundo. Estarías
medianoche, la declaración todavía se está ejecutando y no
decepcionado; establece el mismo valor en cada
termina de ejecutarse hasta cinco minutos después de la
fila. Tendrás que encontrar otra forma de generar
medianoche. No importa. Si una declaración hace alguna
una clave única.
referencia aFECHA ACTUAL (oTIEMPOoMARCA DE TIEMPO),el
valor se establece en la fecha y hora en que comienza la Así que cuando elABIERTOLa declaración corrige los valores de
declaración, por lo que todas las filas de PEDIDOS en la fecha y hora para todas las declaraciones que hacen referencia al
declaración obtienen el mismoVuelva a verificar la [Link] cursor, trata todas estas declaraciones como una declaración
manera similar, si una declaración hace referenciaMARCA DE extendida.
TIEMPO,toda la declaración
390 Parte VI: Temas avanzados
ElABIERTOLa declaración fija el valor de todas las variables a las que se hace referencia en el
cursor de declaración y también fija un valor para todas las funciones de fecha y hora actuales.
Como resultado, la segunda asignación a la variable de nombre (NOMBRE := 'Omega Inc.') no
tiene efectoen las filas que busca el cursor. (Ese valor deNOMBREse utiliza elpróximovez que
abres C1.) E incluso si elABIERTOLa declaración se ejecuta un minuto antes de la medianoche y
elACTUALIZARLa declaración se ejecuta un minuto después de la medianoche, el valor de
FECHA ACTUALen elACTUALIZARdeclaración es el valor de esa función en el momento en que
ABIERTOdeclaración ejecutada, incluso siDECLARAR CURSORno hace referencia a la función de
fecha y hora.
El cursor puede apuntar a una de las filas en el alcance del cursor, o a la ubicación
inmediatamente antes de la primera fila en el alcance, o a la ubicación
inmediatamente después de la última fila en el alcance, o al espacio vacío entre dos
filas. Puede especificar dónde apunta el cursor con la cláusula de orientación en el
BUSCARdeclaración.
Sintaxis
La sintaxis para elBUSCARdeclaración es
✓ PRÓXIMO
✓ PREVIO
✓ PRIMERO
✓ ÚLTIMO
✓ ABSOLUTO
✓ RELATIVO
✓ <especificación de valor simple>
Capítulo 19: Recorrer un conjunto de datos con cursores 391
La opción predeterminada esPRÓXIMO,que, dicho sea de paso, fue elsoloOrientación
disponible en versiones de SQL anteriores a SQL-92. ElPRÓXIMOLa orientación mueve el cursor
desde donde esté a la siguiente fila en el conjunto especificado por la expresión de consulta.
Eso significa que si el cursor se ubica antes del primer registro, se mueve al primer registro. Si
apunta a grabarnorte,se mueve para grabarnorte+1. Si el cursor apunta al último registro del
conjunto, se mueve más allá de ese registro y se devuelve una notificación de que no hay datos
en el [Link] del sistema. (Capítulo 21 detallesESTADOSQLy el resto de
las funciones de manejo de errores de SQL).
El valor que coloque en cada columna especificada debe ser una expresión de valor o la
palabra clavePOR [Link] un intento de operación de actualización posicionada devuelve
un error, la actualización no se realiza.
Cerrar un cursor
Después de terminar con un cursor, acostúmbrese a cerrarlo inmediatamente. Dejar un cursor
abierto mientras su aplicación avanza hacia otros problemas puede causar daños. Además, los
cursores abiertos utilizan recursos del sistema.
Si cierra un cursor que no era sensible a los cambios realizados mientras estaba abierto,
cuando lo vuelve a abrir, el cursor reabierto refleja dichos cambios.
Puedes cerrar el cursor que abrí anteriormente en la tabla TRANSDETAIL con una
declaración simple como la siguiente:
CERRAR ingresos ;
Capítulo 20
En este capítulo
▶ Equipamiento de declaraciones compuestas con atomicidad, cursores, variables y condiciones
▶ Regular el flujo de declaraciones de control.
▶ Hacer bucles que hacen bucles que hacen bucles
▶ Recuperar y utilizar procedimientos almacenados y funciones almacenadas.
▶ Asignar privilegios, crear módulos almacenados y darles un buen uso a los módulos almacenados
Declaraciones compuestas
A lo largo de este libro, SQL se representa como un lenguaje no procedimental que trata
con datos un conjunto a la vez en lugar de un registro a la vez. Sin embargo, con la
adición de las instalaciones cubiertas en este capítulo, esta afirmación no es tan cierta
como solía ser. Aunque SQL todavía trata con datos un conjunto a la vez, se está
volviendo más procedimental.
394 Parte VI: Temas avanzados
El SQL arcaico (definido por SQL-92) no sigue el modelo de procedimiento, donde una
instrucción sigue a otra en una secuencia para producir un resultado deseado, por lo que las
primeras declaraciones SQL eran entidades independientes, tal vez integradas en un programa
C++ o Visual Basic. Con estas primeras versiones de SQL, se desaconsejaba plantear una
consulta o realizar otras operaciones mediante la ejecución de una serie de instrucciones SQL
porque estas actividades complicadas daban como resultado una penalización en el
rendimiento en forma de tráfico de red. SQL:1999 y todas las versiones siguientes permiten
declaraciones compuestas, formadas por declaraciones SQL individuales que se ejecutan como
una unidad, aliviando la congestión de la red.
Todas las declaraciones incluidas en una declaración compuesta están encerradas entre
un COMENZARpalabra clave al principio de la declaración y unaFINpalabra clave al final
de la declaración. Por ejemplo, para insertar datos en varias tablas relacionadas, utilice
una sintaxis similar a la siguiente:
vacío principal {
SQL EJECUTIVO
COMENZAR
Atomicidad
Las declaraciones compuestas introducen una posibilidad de error que no se
enfrenta cuando se construyen declaraciones SQL simples. Una declaración SQL
simple se completa exitosamente o no, y si no se completa exitosamente, la base de
datos no cambia. Este no es necesariamente el caso cuando una declaración
compuesta crea un error.
vacío principal {
SQL EJECUTIVO
COMENZAR ATÓMICO
INSERTAR EN estudiantes (StudentID, Fname, Lname)
VALORES (:sid, :sfname, :slname) ;
INSERTAR EN la lista (ID de clase, Clase, ID de estudiante)
VALORES (:cid, :cname, :sid) ;
INSERTAR EN cuenta por cobrar (ID de estudiante, clase, tarifa)
VALORES (:sid, :cname, :cfee) FIN ;
variables
Los lenguajes informáticos completos como C y BASIC siempre han ofrecidovariables, pero
SQL no los ofreció hasta la introducción de SQL/PSM. Una variable es un símbolo que toma
un valor de cualquier tipo de datos determinado. Dentro de una declaración compuesta,
puede declarar una variable, asignarle un valor y usarla en una declaración compuesta.
Después de salir de una declaración compuesta, todas las variables declaradas en ella se
destruyen. Por lo tanto, las variables en SQL son locales respecto de la declaración
compuesta dentro de la cual se declaran.
396 Parte VI: Temas avanzados
He aquí un ejemplo:
COMENZAR
Cursores
Puedes declarar uncursordentro de una declaración compuesta. Los cursores se utilizan para
procesar los datos de una tabla, una fila a la vez. (Consulte el Capítulo 19 para obtener más detalles).
Dentro de una declaración compuesta, puede declarar un cursor, usarlo y luego olvidarlo porque el
cursor se destruye cuando sale de la declaración compuesta. A continuación se muestra un ejemplo
de este uso:
COMENZAR
Condiciones
Cuando la gente dice que una persona tiene una enfermedad, normalmente quiere decir que
algo anda mal con esa persona: está enferma o lesionada. La gente normalmente no se
molesta en mencionar que una persona está enbiencondición; más bien, hablan de personas
que se encuentran en estado grave o, peor aún, en estado crítico. Esta idea es similar a la
forma en que los programadores hablan sobre la condición de una declaración SQL. La
ejecución de una declaración SQL conduce a un resultado exitoso, a un resultado cuestionable
o a un resultado completamente erróneo. Cada uno de estos posibles resultados corresponde
a uncondición.
Cada vez que se ejecuta una declaración SQL, el servidor de la base de datos coloca
un valor en el parámetro de [Link]. ESTADOSQLes un campo de cinco
caracteres. El valor que se coloca enESTADOSQLindica si la instrucción SQL anterior
se ejecutó correctamente. Si no se ejecutó exitosamente, el valor deESTADOSQL
proporciona alguna información sobre el error.
Capítulo 20: Agregar capacidades de procedimiento con módulos almacenados persistentes 397
Los primeros dos de los cinco personajes deESTADOSQL (el valor de clase) le brindan las
noticias más importantes sobre si la instrucción SQL anterior se ejecutó exitosamente,
devolvió un resultado que puede haber sido exitoso o no, o produjo un error. La tabla
20-1 muestra los cuatro resultados posibles.
Otro Excepción Los dos caracteres del código de clase, más los tres
caracteres del código de subclase, comprenden los
cinco caracteres [Link]én le dan una
idea de la naturaleza del error.
Condiciones de manejo
Puedes ver tu programaESTADOSQLdespués de la ejecución de cada
declaración SQL. ¿Qué haces con el conocimiento que adquieres?
personajes, así como los dos personajes de clase [Link] son posibles
múltiples excepciones diferentes, debe haber un procedimiento de manejo de
excepciones para cada una porque excepciones diferentes a menudo requieren
respuestas diferentes. Es posible que pueda corregir algunos errores o encontrar
soluciones. Otros errores pueden ser fatales; nadie morirá, pero es posible que
tengas que cancelar la aplicación.
Condición Descripción
COMENZAR
Este ejemplo no es realista, porque normalmente la instrucción SQL que puede provocar
que se produzca la condición (así como el controlador que se invocaría si se produjera la
condición) también estaría incluido dentro delCOMIENZO…FIN estructura.
Si ocurre una condición que invoca un controlador, se ejecuta la acción especificada por el
controlador. Esta acción es una declaración SQL, que puede ser una declaración compuesta.
Capítulo 20: Agregar capacidades de procedimiento con módulos almacenados persistentes 399
declaración. Si la acción del controlador se completa con éxito, entonces se ejecuta el efecto
del controlador. La siguiente es una lista de los tres posibles efectos del controlador:
COMENZAR ATÓMICO
DECLARAR CONDICIÓN de restricción_violación
PARA EL VALOR DEL ESTADO SQL '23000';
DECLARAR DESHACER MANEJADOR
PARA violación_restricción
RENUNCIA ;
INSERTAR EN estudiantes (StudentID, Fname, Lname)
VALORES (:sid, :sfname, :slname) ; INSERTAR EN la lista (ID
de clase, Clase, ID de estudiante)
VALORES (:cid, :cname, :sid) ;
FIN ;
La idea que quiero enfatizar aquí es que si escribe una declaración SQL que puede
causar excepciones, entonces debe escribir controladores de excepciones para todas
esas posibles excepciones. Si no lo hace, tendrá más dificultades para aislar el origen
de un problema cuando inevitablemente ocurra.
Asignación
Con SQL/PSM, SQL obtuvo una función que incluso los lenguajes procedimentales más
humildes han tenido desde sus inicios: la capacidad de asignar un valor a una variable.
Básicamente, una declaración de asignación toma la siguiente forma:
SI
vfname = 'Joss'
ENTONCES
ACTUALIZAR estudiantes
SET Fname = 'Joss' WHERE
StudentID = 314159;
DEMÁS
ELIMINAR DE estudiantes
DONDE StudentID = 314159;
TERMINARA SI
CASO vmayor
CUÁNDO 'Ciencias de la Computación'
LUEGO INSERTAR EN geeks (StudentID, Fname, Lname)
VALORES (:sid, :sfname, :slname) ;
CUÁNDO 'Medicina deportiva'
LUEGO INSERTAR EN deportistas (StudentID, Fname, Lname)
VALORES (:sid, :sfname, :slname) ; CUANDO
'Filosofía'
LUEGO INSERTAR EN los escépticos (StudentID, Fname, Lname)
402 Parte VI: Temas avanzados
CASO
CUANDO es mayor
IN ('Ciencias de la Computación', 'Ingeniería eléctrica') LUEGO
INSERTAR EN geeks (StudentID, Fname, Lname)
VALORES (:sid, :sfname, :slname) ; CUANDO
vclub
IN ('Radio amateur', 'Rocket', 'Computadora') LUEGO INSERTAR
EN geeks (StudentID, Fname, Lname)
VALORES (:sid, :sfname, :slname) ; CUANDO
es mayor
IN ('Medicina deportiva', 'Educación física') LUEGO INSERTAR en
deportistas (StudentID, Fname, Lname)
VALORES (:sid, :sfname, :slname) ; DEMÁS
Se evita una excepción poniendo a todos los estudiantes que no sean geeks ni deportistas en la tabla
SKEPTICS. Debido a que no todos los no geeks y no deportistas son escépticos, esto puede no ser
estrictamente exacto en todos los casos. Si no es así, siempre puedes agregar algunos má[Link]
cláusulas.
ESTABLECER vcount = 0;
BUCLE
SET vcount = vcount + 1; INSERTAR EN
asteroide (AsteroidID)
VALORES (vcount);
FINALIZAR BUCLE
Para elBUCLEPara que la declaración sea útil, necesita una forma de salir de los bucles antes de
generar una excepción. De esa manera es laDEJARdeclaración.
DEJAR
ElDEJARLa declaración funciona tal como se podría esperar que funcione. Cuando la ejecución
encuentra unDEJARdeclaración incrustada dentro de una declaración etiquetada, pasa a la
siguiente declaración más allá de la declaración etiquetada. Por ejemplo:
Precarga de asteroide:
ESTABLECER vcount = 0;
BUCLE
SET vcount = vcount + 1; SI
vcount> 10000
ENTONCES
ElMIENTRASLa declaración proporciona otro método para ejecutar una serie de declaraciones
SQL varias veces. Si bien una condición designada es verdadera, laMIENTRAS El bucle continúa
ejecutándose. Cuando la condición se vuelve falsa, el bucle se detiene. Por ejemplo:
Precarga de asteroide2:
ESTABLECER vcount = 0;
MIENTRAS
vcount< 10000 hacer
SET vcount = vcount + 1; INSERTAR EN
asteroide (AsteroidID)
VALORES (vcount);
FINALIZAR MIENTRAS AsteroidPreload2
REPETIR…HASTA…TERMINAR REPETIR
ElREPETIREl bucle es muy parecido alMIENTRASbucle, excepto que la condición se verifica
después de que se ejecuten las declaraciones incrustadas en lugar de antes. Por ejemplo:
Precarga de asteroide3:
ESTABLECER vcount = 0;
REPETIR
SET vcount = vcount + 1; INSERTAR EN
asteroide (AsteroidID)
VALORES (vcount);
HASTA X = 10000
FINALIZAR REPETIR AsteroidPreload3
ITERAR
ElITERARLa declaración proporciona una manera de cambiar el flujo de ejecución dentro
de una declaración SQL iterada. Las sentencias SQL iteradas sonBUCLE, MIENTRAS,
REPETIR,[Link] la condición de iteración de la sentencia SQL iterada es verdadera o no
se especifica, entonces la siguiente iteración del bucle comienza inmediatamente
después de laITERARse ejecuta la declaración. Si la condición de iteración de la sentencia
SQL iterada es falsa o desconocida, la iteración cesa después de laITERARse ejecuta la
declaración. Por ejemplo:
Precarga de asteroide4:
ESTABLECER vcount = 0;
MIENTRAS
vcount< 10000 hacer
SET vcount = vcount + 1; INSERTAR EN
asteroide (AsteroidID)
VALORES (vcount);
ITERAR AsteroidPreload4;
ESTABLECER vpreload = 'HECHO';
FINALIZAR MIENTRAS AsteroidPreload4
Procedimientos almacenados
Los procedimientos almacenados residen en la base de datos del servidor en lugar de
ejecutarse en el cliente, donde se ubicaban todos los procedimientos antes de SQL/PSM.
Después de definir un procedimiento almacenado, puede invocarlo con unLLAMAR
declaración. Mantener el procedimiento ubicado en el servidor en lugar de en el cliente
reduce el tráfico de la red, acelerando así el rendimiento. El único tráfico que necesita
pasar del cliente al servidor es elLLAMARdeclaración. Puede crear este procedimiento de
la siguiente manera:
SQL EJECUTIVO
CREAR PROCEDIMIENTO ChessMatchScore
(Puntuación ENTRADA CHAR (3),
resultado FUERA CHAR (10))
COMENZAR ATÓMICO
Puntuación del CASO
CUANDO '1-0' ENTONCES
Resultado SET = 'ganancias blancas';
CUANDO '0-1' ENTONCES
Resultado SET = 'blackwins';
DEMÁS
Resultado SET = 'empate';
CASO FINAL
FIN ;
SQL EJECUTIVO
CREAR PROCEDIMIENTO ChessMatchScore
(Puntuación ENTRADA CHAR (3) PREDETERMINADO
'1-0', resultado FUERA CHAR (10))
COMENZAR ATÓMICO
Puntuación del CASO
CUANDO '1-0' ENTONCES
Resultado SET = 'ganancias blancas';
CUANDO '0-1' ENTONCES
Resultado SET = 'blackwins';
DEMÁS
Resultado SET = 'empate';
CASO FINAL
FIN ;
Ahora puedes llamar a este procedimiento de esta manera con el valor predeterminado:
Por supuesto, sólo querrá hacer esto si el valor predeterminado fuera en realidad
el valor que desea enviar al procedimiento.
Funciones almacenadas
Una función almacenada es similar en muchos aspectos a un procedimiento almacenado. En
conjunto, los dos se conocen comorutinas [Link] diferencian en varios aspectos,
incluida la forma en que se invocan. Un procedimiento almacenado se invoca con unLLAMAR
declaración, y se invoca una función almacenada con unaLlamada de función, que puede
reemplazar un argumento de una declaración SQL. El siguiente es un ejemplo de definición de
función, seguido de un ejemplo de llamada a esa función:
COMENZAR
SI un <>''
ENTONCES ESTABLECER compra = compra || ', ';
TERMINARA SI ;
SET compra = compra || [Link]ón; FIN PARA
DEVOLUCIÓN compra;
FIN ;
Esta definición de función crea una lista delimitada por comas de compras realizadas
por un cliente que tiene un número de cliente específico, tomado de la tabla
TRANSACCIONES. La siguienteACTUALIZARLa declaración contiene una llamada de
función aHistorial de comprasque inserta el último historial de compras del cliente
número 314259 en su registro en la tabla CLIENTE:
Privilegios
Analizo los diversos privilegios que puede otorgar a los usuarios en el Capítulo 14. El propietario de la
base de datos puede otorgar los siguientes privilegios a otros usuarios:
Módulos almacenados
Un módulo almacenado puede contener múltiples rutinas (procedimientos y/o funciones) que
pueden ser invocadas por SQL. Cualquiera que tenga laEJECUTAREl privilegio de un módulo
tiene acceso a todas las rutinas del módulo. Los privilegios sobre rutinas dentro de un módulo
no se pueden otorgar individualmente. El siguiente es un ejemplo de un módulo almacenado:
SI un <>''
ENTONCES ESTABLECER compra = compra || ', ';
TERMINARA SI ;
SET compra = compra || [Link]ón; FIN PARA
DEVOLUCIÓN compra;
FIN ;
MÓDULO FINAL ;
410 Parte VI: Temas avanzados
Las dos rutinas de este módulo (un procedimiento y una función) no tienen mucho
en común, pero no es necesario. Puede reunir rutinas relacionadas en un solo
módulo, o puede incluir todas las rutinas que probablemente utilizará en un solo
módulo, independientemente de si tienen algo en común.
Capítulo 21
Manejo de errores
En este capítulo
▶ Condiciones de error de señalización
Por ejemplo, elCUANDO SEALa directiva le permite tomar una acción predeterminada
siempre que se cumpla una condición específica (siESTADOSQLtiene un valor distinto de
cero, por ejemplo). También puede encontrar información de estado detallada sobre la
declaración SQL que acaba de ejecutar en el área de diagnóstico. En este capítulo,
explico estas útiles funciones de manejo de errores y cómo usarlas.
ESTADOSQL
ESTADOSQLespecifica un gran número de condiciones anó[Link] una
cadena de cinco caracteres en la que sólo las letras mayúsculasAa través dezy los
números del 0 al 9 son caracteres válidos. La cadena de cinco caracteres se divide en dos
grupos: un código de clase de dos caracteres y un código de subclase de tres caracteres.
El código de clase mantiene un estado después de completar una declaración SQL. Ese
estado podría indicar la finalización exitosa de la declaración o uno de varios tipos
principales de condiciones de error. El código de la subclase proporciona detalles
adicionales sobre esta ejecución particular de la declaración. La figura 21-1 ilustra la
ESTADOSQLdisposición.
412 Parte VI: Temas avanzados
El estándar SQL define cualquier código de clase que comience con las letrasA a través deho los
números del 0 al 4; por lo tanto, estos códigos de clase significan lo mismo en cualquier
implementación. Códigos de clase que comienzan con las letras. Ia través dezo los números del
5 al 9 se dejan abiertos para que los implementadores (las personas que crean sistemas de
administración de bases de datos) los definan porque la especificación SQL no puede anticipar
todas las condiciones que pueden surgir en cada implementación. Sin embargo, los
implementadores deberían utilizar estos códigos de clases no estándar lo menos posible para
evitar problemas de migración de un DBMS a otro. Idealmente, los implementadores deberían
utilizar los códigos estándar la mayor parte del tiempo y los códigos no estándar sólo en las
circunstancias más inusuales.
Figura 21-1:
ESTADOSQL
de 00000
indica
exitoso
terminación
de un SQL:
declaración.
PROCEDIMIENTO NUTRIENTE
(SQLSTATE, :foodname CHAR (20), :calorías SMALLINT,
:proteína DECIMAL (5,1), :grasa DECIMAL (5,1),
:carbo DECIMAL (5,1))
INSERTAR EN LOS ALIMENTOS
(Nombre del alimento, Calorías, Proteínas, Grasas, Carbohidratos)
VALORES
(:nombre del alimento, :calorías, :proteína, :grasa, :carbo) ;
Capítulo 21: Manejo de errores 413
En el lugar apropiado de su programa de lenguaje de procedimientos, puede
hacer que los valores estén disponibles para los parámetros (tal vez
solicitándolos al usuario) y luego llamar el procedimiento. La sintaxis de esta
operación varía de un idioma a otro, pero se parece a esto:
SI SQLSTATE <>'00000'
Y SQLSTATE <>'00001'
Y SQLSTATE <>'00002'
ENTONCES GOTOerror_trap;
Áreas de Diagnóstico
A pesar deESTADOSQLpuede brindarle información sobre por qué falló una declaración
en particular, la información es bastante breve. Por tanto, SQL proporciona la captura y
retención de información de estado adicional en áreas de diagnóstico.
El área de diagnóstico es una estructura de datos administrada por DBMS que tiene dos
componentes:
✓ ElMÁSEl campo puede ser un 'Túo un 'NORTE'. 'Y'indica que hay más registros de
estado de los que puede contener el área de detalles. 'NORTE'indica que todos los
registros de estado generados están presentes en el área de detalles. Dependiendo de
su implementación, es posible que pueda ampliar la cantidad de registros que puede
manejar utilizando elESTABLECER TRANSACCIÓN declaración.
416 Parte VI: Temas avanzados
DECLARAR ConstNameVarCHAR(18) ;
OBTENER DIAGNÓSTICOS EXCEPCIÓN 1
ConstNameVar = CONSTRAINT_NAME;
Interpretando la información
devuelta por SQLSTATE
NOMBRE DE LA CONEXIÓNyENTORNO_NOMBREidentifique la conexión y el
entorno al que está conectado en el momento en que se ejecuta la instrucción
SQL.
A veces, un DBMS produce una cadena de texto en lenguaje natural para explicar una
condición. ElMENSAJE DE TEXTOEl artículo es para este tipo de información. El
contenido de este elemento depende de la implementación; el estándar SQL no
420 Parte VI: Temas avanzados
estadonortees una variable del lenguaje principal o un parámetro;artículonortepuede ser cualquiera de las
palabras clave NÚMERO, MÁS, COMMAND_FUNCTION, DYNAMIC_FUNCTION,oNÚMERO DE FILAS.
Manejo de excepciones
CuandoESTADOSQLindica una condición de excepción al mantener un valor distinto de
00000, 00001,o00002,Es posible que desee manejar la situación de una de las siguientes
maneras:
✓ Usar unaCUANDO SEAcláusula (como se describió anteriormente en este capítulo) para pasar
a una rutina de manejo de excepciones o realizar alguna otra acción.
COMENZAR
Desencadenantes
En este capítulo
▶ Creando desencadenantes
Los gatillos, por supuesto, son más conocidos como aquellas partes de un arma de fuego que hacen
que se dispare. De manera más general, un desencadenante es una acción o evento que provoca que
ocurra otro evento. En SQL, la palabradesencadenarse utiliza en este sentido más general. Una
sentencia SQL desencadenante provoca otra sentencia SQL (lamotivadodeclaración) a ejecutar.
Los desencadenadores también se pueden utilizar para mantener la coherencia de una base de
datos. En una aplicación de ingreso de pedidos, un pedido de un producto específico puede
generar una declaración que cambia el estado de ese producto en la tabla de inventario de
disponible a reservado. De manera similar, la eliminación de una fila en la tabla de pedidos puede
desencadenar una declaración que cambie el estado del producto en cuestión de reservado a
disponible.
424 Parte VI: Temas avanzados
Los disparadores ofrecen una flexibilidad aún mayor que la que se ilustra en los ejemplos
anteriores. El elemento activado no tiene por qué ser una declaración SQL. Puede ser un
procedimiento en el lenguaje anfitrión que realiza alguna operación en el mundo exterior,
como cerrar una línea de producción o hacer que un robot vaya a buscar una cerveza fría del
refrigerador.
Creando un disparador
Creas un disparador, lógicamente, con unCREAR DISPARADORdeclaración. Una vez creado el
desencadenante, permanece al acecho, esperando a que se produzca el evento
desencadenante. Cuando ocurra el evento desencadenante, ¡bang! El gatillo se dispara.
✓ Activador de declaración:El disparador se activará varias veces, una por cada fila
de la tabla de asuntos que se vea afectada por el evento desencadenante.
Como lo indican los corchetes, elPARA CADALa cláusula es opcional. A pesar de ello, el
desencadenante debe actuar de una forma u otra. Si noPARA CADA Si se especifica la
cláusula, el comportamiento predeterminado esPARA CADA DECLARACIÓN.
COMENZAR ATÓMICO
{ sentencia SQL 1 }
{ sentencia SQL 2 } . . .
{ sentencia SQLnorte}
FIN
426 Parte VI: Temas avanzados
Cada vez que se inserta una nueva fila en la tabla NEWHIRE, se envía un correo electrónico al gerente
de recursos humanos con los detalles, y el nombre de inicio de sesión de la persona que realiza la
inserción y la hora de la inserción se registran en una tabla de registro, lo que proporciona una pista
de auditoría.
Los alias de tabla son identificadores de tablas de transición, que no son persistentes, pero que
existen sólo para facilitar la operación de referencia. Como era de esperar,NUEVA FILAyNUEVA
MESAno se puede especificar para unBORRARdesencadenante, yVIEJA FILAasí comoMESA
ANTIGUAno se puede especificar para unINSERTARdesencadenar. Después de eliminar una fila
o tabla, no hay ningún valor nuevo. Similarmente,VIEJA FILA yMESA ANTIGUAno se puede
especificar para unINSERTARdesencadenar. No hay valores antiguos a los que hacer referencia.
En un desencadenador a nivel de fila, puede utilizar un nombre de correlación de valor antiguo para
hacer referencia a los valores de la fila que la instrucción SQL desencadenante modifica o elimina, ya
que esa fila existía antes de que la instrucción la modificara o eliminara. De manera similar, un alias
de tabla de valores antiguo es lo que se utiliza para acceder a los valores de toda la tabla tal como
existían antes de que la acción de la instrucción SQL desencadenante entrara en vigor.
428 Parte VI: Temas avanzados
La parte de decenas
línea.
Capítulo 23
I Si está leyendo este libro, debe estar interesado en construir sistemas de bases de datos
relacionales. Acéptalo: nadie estudia SQL por diversión. Utiliza SQL para crear aplicaciones
de bases de datos, pero antes de poder crear una, necesita una base de datos.
Desafortunadamente, muchos proyectos fracasan antes de codificar la primera línea de la
aplicación. Si no obtiene la definición correcta de la base de datos, su aplicación está
condenada al fracaso, sin importar qué tan bien la escriba. Aquí hay diez errores comunes en la
creación de bases de datos a los que debe estar atento.
Dar a los clientes exactamente lo que piden suele ser una receta segura para el desastre. La
mayoría de los usuarios (y sus gerentes) no poseen el conocimiento o las habilidades
necesarias para identificar con precisión el problema, por lo que tienen pocas posibilidades de
determinar la mejor solución.
432 Parte VII: La parte de decenas
No documentar su proceso
Si cree que su aplicación es tan perfecta que nunca es necesario revisarla, ni siquiera
una vez más, piénselo de nuevo. De lo único que puedes estar absolutamente seguro en
este mundo es del cambio. Cuenta con eso. Dentro de seis meses, no recordará por qué
diseñó las cosas de la forma en que lo hizo, a menos que documente cuidadosamente lo
que hizo y por qué lo hizo de esa manera. Si se transfiere a un departamento diferente o
gana la lotería y se jubila, su reemplazo casi no tiene posibilidades de modificar su
trabajo para cumplir con nuevos requisitos si no documentó su diseño. Sin
documentación, es posible que su reemplazo deba desechar todo y comenzar desde
cero.
En este capítulo
▶ Verificando la estructura de su base de datos
▶ Usando bases de datos de prueba
A La base de datos puede ser un tesoro virtual de información, pero al igual que el
tesoro de los piratas del Caribe de antaño, lo que realmente desea
probablemente esté enterrado y oculto a la vista. ElSELECCIONAR SQLLa declaración es
su herramienta para desenterrar esta información oculta. Incluso si tiene una idea clara
de lo que desea recuperar, traducir esa idea a SQL puede ser un desafío. Si su
formulación está un poco equivocada, puede terminar con resultados equivocados, pero
resultados que se acercan tanto a lo que esperaba que lo engañan. Para reducir sus
posibilidades de ser engañado, utilice los siguientes diez principios.
Cree varios conjuntos de datos de prueba y asegúrese de incluir casos impares, como tablas
vacías y valores extremos en el límite de los rangos permitidos. Trate de pensar en escenarios
poco probables y verifique el comportamiento adecuado cuando ocurran. Al comprobar casos
poco probables, podrá obtener información sobre los problemas que tienen más
probabilidades de ocurrir.
Esta consulta enumera cada equipo, seguido del número total de jonrones de todos los
jugadores de ese equipo.
En la mayoría de las implementaciones, esta consulta devuelve un error. Generalmente, solo las columnas
utilizadas para agrupar o las columnas utilizadas en una función establecida pueden aparecer en la lista de
selección. Sin embargo, si desea ver estos datos, la siguiente formulación funciona:
Debido a que todas las columnas que desea mostrar aparecen en elAGRUPAR PORcláusula, la
consulta tiene éxito y entrega los resultados deseados. Esta formulación ordena la lista
resultante primero porEquipo,entonces porJugador,y finalmente porHomeros.
Los paréntesis también ayudan a garantizar que elNOLa palabra clave se aplica al
término o expresión al que desea aplicarla.
Alerta de subestimación: los datos son difíciles de recuperar después de que una subida de tensión, un
incendio, un terremoto o algún otro desastre destruya su disco duro. (Recuerde, a veces las computadoras
simplemente fallan sin una buena razón). Haga copias de seguridad frecuentes y guarde los medios de
copia de seguridad en un lugar seguro.
Lo que constituye un lugar seguro depende de cuán críticos sean sus datos. Podría ser una
caja fuerte a prueba de fuego en la misma habitación que su computadora. Puede que esté
en otro edificio. Puede que esté en la nube. Podría estar en un búnker de hormigón bajo una
montaña endurecida para resistir un ataque nuclear. Decida qué nivel de seguridad es
apropiado para sus datos.
MINUTO
STDDEV_SAMP UNNEST CUANDO SEA
A
SUBMULTISET ACTUALIZAR DÓNDE
SEGUIMIENTO
SUBCADE SUPERIOR WIDTH_BUCKET
TRADUCIR
SUBSTRING_ USUARIO VENTANA
REGEXACIONES TRADUCIR_
REGEXACIONES USANDO CON
SUMA
TRADUCCIÓN VALOR DENTRO
SIMÉTRICO
TRATAR VALORES SIN
SISTEMA
DESENCADENAR VAR_POP AÑO
USUARIO_SISTEMA
TRUNCAR VAR_SAMP AÑOS
MESA
RECORTAR VARBINARIO
MUESTRA DE TABLA
TRIM_ARRAY VARCHAR
Índice
(IDE), 81 •L•
SQL interactivo, 333 RETRASOfunción, 239–240
interfaz, ODBC, 350 caracteres del idioma, 32
Índice 451
IDIOMAcláusula, 341 metadatos, 7, 359
ÚLTIMOorientación, 391 métodos, UDT, 41
LAST_VALUEfunción, 241 pila de último en Acceso [Link], controles
entrar, primero en salir (LIFO), 414 Microsoft Microsoft ActiveX, 355
DIRIGIRfunción, 240 MÍNIMOfunción, 70, 183
subtipos de hojas de UDT estructurados, 43 MODIFICACIÓNfunción, 194
tipos de hojas, 307 anomalías de modificación, 129–130, 283–284
DEJARdeclaración, 403 atributos modificados, creación de vistas con,
uniones exteriores izquierdas, 256–258 Pila 144–145
LIFO (último en entrar, primero en salir), 414 cláusulas [Link] tambiénDÓNDEclausulas
COMOpredicado, 218–220 valores literales, DEcláusula, 213
172–174 LNfunción, 194 discusión general, 211–213
AGRUPAR PORcláusula, 232–234
bloquear objetos de base de datos, TENIENDOcláusula, 234
324 funciones de registro, 423 ORDENAR PORcláusula, 235–236 modificar datos de la
conectivos lógicos, 230–232 tabla, otorgar acceso al usuario
esquemas lógicos, 61 a, 303
iniciar sesión, 299 lenguaje del módulo, 339–342
BUCLE... BUCLE FINALdeclaraciones, 402–403 módulos, 339
MÁS BAJOfunción de valor, 189 caracteres en módulos, almacenados,
minúscula, conversión módulo 409–410, 194
cadenas de caracteres a, 189 MÁScampo, área de encabezado de diagnóstico, 415
MULTICONJUNTOtipo de datos, 40 conjuntos múltiples, 193,
•M• 379
Bases de datos relacionales [Link] también
con subselecciones, doble verificación, 436 tablas lista_aliasfrase, 427–428 que hace referencia a
versionadas por el sistema, 168–169 en bases de tablas relacionadas y otorga acceso
datos de prueba, 436 para, 304–305
en documentos XML, 361 cuadrícula de integridad referencial, 75–77, 120–123
consulta por ejemplo (QBE), 95 expresiones restricciones de integridad referencial, 102,
de consulta, 385 163–164, 168
reglas de integridad referencial, yFÓSFORO
mesas(continuado) desencadenantes
tipos definidos por el usuario (UDT), 41–44, 67, 376 mesa única, 55–56
actualización, 145
VÁLIDOpredicado, 372–373
tiempo válido, 158
•W•
controles de validación, 355 Icono de advertencia, 2
expresiones de [Link] tambiénCASO sistemas de bases de datos basados en web, 352–354
expresiones CUANDOcláusula, 425
ELENCO,205–207 CUANDO SEAcláusula, 413–414 DÓNDEcláusulas.
condicional, 180 Ver tambiénconsultas anidadas
fecha y hora, 179–180 TODOpredicado, 221–224
discusión general, intervalo CUALQUIERpredicado, 221–224
64–68, 180 predicados de comparación,
numérico, 179 215 DISTINTOpredicado, 225
descripción general, 177–178 uniones equi, 251–253
fila, 207–209 EXISTEpredicado, 224–225
cuerda, 178 discusión general, 213–215
funciones de [Link] tambiénvalor de cadena operadores de unión, 266
expresiones COMOpredicado, 218–220 FÓSFORO
fecha y hora, 196 predicado, 226–228 NO EN
intervalo, 196 predicado, 217–218 DIFERENTE A
numérico, 190–196 predicado, 218–220 NULOpredicado,
descripción general, 184 220–221 SUPERPOSICIONES
[Link] tambiénfunciones; funciones de valor predicado, 226 descripción general,
CASOexpresiones con, 200–202 140, 212
JUNTARSEexpresiones, 204–205 ENTREpredicado, 215–217 EN
referencias de columnas, 176–177 predicado, 217–218
literal, 172–174 consultas recursivas, 292
descripción general, 171 reglas de integridad referencial yFÓSFORO
fila, 172 predicado, 228–230
variables especiales, 176 SIMILARpredicado, 220
tipos de, 171–172 ALGUNOpredicado, 221–224
460 SQL para principiantes, octava edición
•X• XML(SECUENCIA)tipo, 36
TABLA XMLpseudofunción, 373–374
XML (lenguaje de marcado extensible) XQuery
conjuntos de caracteres, mapeo, 362– descripción general, 36, 367
Dedicación
Este libro está dedicado a Walker Taylor, quien hará cosas increíbles cuando sea
mayor.