I

I

Contenido

Agradecimientos Introducción ... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

xxiii xxv

PARTE 1 Visión general de SQL

1.

Jotrod ucción

.

3
4

'.

El lenguaje SQL __ _ . El papel de SQL _.•......•.....•.•...... Características y ventajas de SQL , . Independencia del fabricante . Transportabilidad entre sistemas informáticos . Estándares SQL _ __ .' __ .. _. _ . Acuerdos y obligaciones de IBM (DB2) __ . . Obligaciones de Microsoft (SQL Server, ODBC y ADO) Fundamentos relacionales . Estructura de alto nivel en inglés , .. Consultas ad hoc interactivas . Acceso mediante programación a bases de datos. _ _. _ . Vistas múltiples de los datos _. __ _ . Lenguaje completo de base de datos _ __ .. Definición dinámica de datos _ _ _. _ . Arquitectura cliente/servidor . . . Soporte de aplicaciones empresariales . Extensibilidad y tecnología de objetos _.•... Acceso a bases de datos en Internet . Integración de Java (IDBC) . _ _ . Infraestructura de la industria .

6
7 8 8

9 9

9
10 10

ID
11 1I II 1I 12
12

12 13 13 14

vii

l'

viii

Contenido

Contenido

ix

2. Una introducción a SQL
Una base de datos simple Recuperación de datos _ Resumen de datos .. ._ _ Adición de datos a la base de datos .. " , ." , ,., Eliminación de datos Actualización de la base de datos Protección de datos . Creación de bases de datos .. Resumen -_ _.. _. _ _ ,

. . . . . .

15
15

El modelo relacional de datos .,., La base de datos de ejemplo, . "
Tablas.... ..

,. .
..

59
60

17
19 20 20
21 21

62
. ,

Claves primarias _.. _. _. . . . . . . . . . . Relaciones _. _ " . Claves externas _.. . .. , ,., Las 12 reglas de Codd '" , , Resumen .
PARTE 11 Recuperación de datos

.

,

64 66 67

68
71

22 23
25
. , , , _
25

3. SQL en perspectiva
SQL y la gestión de bases de datos Una breve historia de SQL ,... . . "" Los primeros años .. , , , , Los primeros productos relacionales Productos de mM Aceptación comercial _. _
oO.,"

5.

Fundamentos de SQL

oO

.

75 75 77

26
28 28

.
_
oO, , .. '

Estándares de SQL ...................•.. , ....••.....•...... ' Los estándares ANSIJISO ", Otros estándares de SQL "·,, · ODBC y el grupo de acceso SQL SQL y transportabilidad .. . . SQL y redes .,., .. , .. ,.",. .,.,.,,.,., , , , ....• ' , , , . , .
··.oO .. . oO,

Arquitectura Arquitectura Arquitectura Arquitectura SQL SQL SQL SQL

centralizada , del 'servidor de archivos cliente/servidor mullicapa _

,

, _ . .
.

29 30 32 32 34 35 36 38 38
39

Instrucciones , Nombres ,., , ,., Nombres de tablas Nombres de columnas Constantes Constantes Constantes Constantes Constantes . , . ".. , . " numéricas , .. , de cadena de fecha y hora simbólicas
,.,.,

" . .

. .
.

80
8J

Tipos de datos ... ,",."., ..• ',.,' ••......•......... ,",

81

' , , , ,., ' _ . .
oO '

86 86
87
88

Expresiones ,.,.,.,

89 89
90 91
93

40
42 42

Funciones predefinidas ., Datos ausentes (valores NULL) Resumen .
6.

,

,

,

.

... _.....••.....••.....••......•.

La proliferación de SQL . , . , . . , . , . , , .. , . , SQL y la estrategia de la base de datos unificada de IBM

en las minicomputadoras . _ en los sistemas basados en UNIX en computadoras personales .. _ y el procesamiento de transacciones

, _, ,._ _ _ .
. .

44
44 45 45

Consultas simples

.

95 95 98 98 98
JOl 102
105

.

,

47
48 49 51 52

SQL y las bases de datos de trabajo en grupo ".,', SQL y los almacenes de datos ,.,.,

SQL y las aplicaciones distribuidas en Internet Resumen

_. _

_. . .

La instrucción SELECT _•......•......•......•......•••.... La cláusula SELECT _....•......••.....•......••.... , . La cláusula FROM ..... Resultados de las consultas , . Consultas simples ., ,."...... ,.,., ' Columnas calculadas _. _. . _ _ _ _ Selección de todas las columnas (SELECT *) _
Filas duplicadas (DISTINCT) .. ,

4. Bases de datos relacionales
Los primeros modelos de datos . Sistemas gestores de archivos Bases de datos jerárquicas Bases de datos en red .. . _

53 53 53
55

. . .

56

Selección de filas (cláusula WHERE) . . , Condiciones de búsqueda ," ,., ,.,." . El test de comparación (=. <>. <, <=, >, >=) . El test pe rango (BETWEEN) .. _ . . _ . _ .•.• _ ....••... El test de pertenencia a conjuntos (IN) . _ . El test de encaje de patrones (LIKE) "

, oO oO_,., , .....• ' ......•.....

106

107
109
110

113
115

117

x

Contenido

Contenido

xi
188

El lesl de valores nulos (15 NULL) . Condiciones compueslas de búsqueda (ANO. QR Y NOT) . Ordenación de los resultados de las consultas (cláusula ORDER BY) . Reglas para el procesamienLO de consuhas sobre una sola tabla . Combinación de los resultados de las consultas (UNION)" . . Uniones y filas duplicadas * Uniones y ordenación" .. . __ . Uniones múltiples" . __ . _......•......•.................... Resumen. . . . . . . . . . . . . . . . . . .. _......•.....•......••...... 7.
Consultas multitabla (reuniones)

119 121 124 127 128

130 131
132

133
135

Funciones de columna en ht lista de selección . Valores NULL y funcione de columna _. Eliminación de filas duplicadas (DISTINCT) ...........••.... Consultas de agrupación (CI<iusula GROUP BY) . . . . . . . . . . . . • . . . . . . Agrupación de múltiples columnas ....................••.. __ Restricciones sobre las consultas de agrupación .........•..... Valores NUT L en las consultas de agrupación _ _. _. Condiciones de búsqueda de grupos (Cláusula HAVING) . _ .. _ . Restricciones sobre las condiciones de búsqueda de grupos . Valores NULL )' condiciones de búsqueda de grupos . _. _. _. . HAVING sin GROUP BY _. Resumen . __ . . _..................................•....

189 191
192

196
198 200 201

Un ejemplo de consulta con dos tablas ......•.............•..... Reuniones simples (equirrcuniones) . _ _. Consultas padrelhijo . Reuniones con criterios de selección de filas . Encaje de múltiples columnas . Consultas con tres), más labIas ................•.......... Otras cquirreuniones .. . _. _ . Reuniones sin igualdad _ _...............•........... Considemciones sobre SQL y consultas multitabla ...•......••.. Nombres calificados de columnas ...............•......•... Selecciones de todas las column<ls ...............••.....•.. Autorreuniones _ _............•......... Alias de tablas ...............................•........•.. Rendimiento de las consultas multitabla ........•............... La estructura de una reunión . . Multiplicación de tablas . Reglas para el procesamiento de consultas multitabla . Reuniones externas * . . . Reuniones externas por la izquierda y por la derecha '" Notación de la reunión externa * . . Reuniones y el estándar SQL2 _ . Reuniones internas en SQL2 '" ......................•....... Reuniones externas en SQL2 '" _ Reuniones cruzadas y reuniones de unión en SQL2 •...•...... Reuniones multitabla en SQL2 . Resumen . _. _. _. _....................•••... _

135

205 205 206 206

137 139
141
142
143

9.

SubconsuJtas y expresiones de consultas .....••....••..........
Uso de las subconsullas _. _ _ _. _. Concepto de subconsulta . _.. _ __ . _...•.... Subconsultas en la cláusula WHERE . Referencias externas _.. _ . Condiciones de búsqueda en las subconsultas ... _.... _ El test de comparación en subconsultas (==. <>, <, <==, >, >=) El test de pertenencia a conjuntos (IN) .•..................... El test de existencia (EXISTS) . Tests cuantificados(ANY y ALL) • . . . . . . . . . . • . . . . . . • . . . . . . . • . . Subconsultas y reuniones . Subconsultas anidadas Subconsultas correlacionadas * Subconsultas en la cláusula HAVING '" ...•......•.. Resumen de las subconsultas .. . .......••.. Consultas avanzadas en SQL2 * .. Expresiones escalares (SQL2) Expresiones de filas (SQU) .......................••. Expresiones de labias (SQL2) Expresiones de consulta (SQL2) ....•........•. Consultas SQL: un resumen final .......•.......•.. _...•.......

207
207 209

145
146

210
212 213

148

149
150

213 215
217

151 154 155
156 157

219
225 226

228
230 232

158 159 163
166 168

234
236 242 246

169
172

173
176 179
181
181 183 184 185 186

249 254

PARTE IJI Actualización de datos

8. Consultas de resumen
Funciones de columna _•...... _ Cálculo del lolal de una columna (SUM) Cálculo de la media de una columna (AVG) . . . . • . . . . . . • • . . . _ . . Búsqueda de valores extremos ('UN y MAX) Recuento de valores de datos (COUNT) .........•..•.•.•••••. _

10.

Actualizaciones de la base de datos ...........•......••...... Adición de datos a la base de datos .............•.... _.•.... _. La instrucción IN5ERT sobre una sola fila ....•.. _ _. _. . . La instrucción INSERT sobre varias filas _. • . Utilidades de carga masiva _. . . . . . . • . . . . . .

257 257 258 262 265

xii

Contenido

Contenido

xiii

Eliminación de datos de la base de datos ........•...... La inslrucción DELETE . . . . . . . . . . . . . . . . . . . • . • . . . . • . Eliminación de todas las lilas . DELETE con subconsulla * ModifIcación de datos de la base de datos La instrucción UPDATE Actualización de todas las filas . UPDATE con subconsulla * Resumen

266 266 268 269
271

271
274 274

276
.

JI.

Integridad de datos

277 277
279

Concepto de la integrIdad de datos . Datos requeridos Comprobación simple de validez. Restricciones de comprobación de columnas (SQL2) . Dominios (SQL2) Integridad de las entidades . Otras restricciones de unjcidad . Unicidad y valores NULL . ....••••.. Integridad referencial .............................••.. Problemas de integridad referencial . Reglas de eliminación y actualización *' ...............••.... Eliminaciones y actualizaciones en cascada * Ciclos referenciales * . . Claves externas y valores NULL '" ........•••... Restricciones avanzadas (SQL2) Asertos ........... . . Tipos de restricciones en SQL2 . . . . . . . . . . . . . Comprobación diferIda de restricciones . Reglas de negocio ......... . ..............•......... Concepto de disparador . Disparadores e integridad referencial . Ventajas e inconvenientes de los disparadores . Djsparadores y el estándar SQL ................•......... Resumen.

El problema de los daLOs no comprometidos El problema de los datos inconsistentes El problema de la inserción fantasma Transacciones simultáneas ............ Bloqueo * Niveles de bloqueo . Bloqueos compartidos y exclusivos lnterbloqueos * Técnicas avanzadas de bloqueo * Versiones * . Funcionamiento de las versiones * Ventajas e inconvenientes de las versiones * Resumen

. . .

.
~.

.

.

.

.

327 328 330 331 333 334 336 338 339 346 346 350 350

280 281 282 283 284 284 285 286 288 292 294 299 300 301 302 303 306 308 310 311 312
313 315

PARTE IV Estructura de la base de datos

13.

Creación de bases de datos
El lenguaje de definición de datos Creación de bases de datos. Definiciones de tablas . Creación de tablas (CREATE TABLE) . Eliminación de una tabla (DROP TABLE) _. Cambio de la definición de una tabla (ALTER TABLE) Definición de restricciones. . . . Asertos . Dominios Alias y sinónimos (CREATE/DROP ALIAS) Índices (CREATE/DROP INDEX). . ..........•. Gestión de otros objetos de la base de datos Estructura de la base de datos . Arquilectura de base de datos única Arquitectura de múltiples base de datos Arquitectura de ubicación múltiple Bases de datos en múltiples servidores . Estructura de la base de datos y el estándar ANSI/ISO .....•.. Catálogos en SQL2 ..............•.... Esquemas en SQL2 . Resumen .

.

365

355 357 358 359 369 370 374 375 375 376
378

12.

Procesamiento de transacciones
Conceplo de transacción ............................•...
COMMIT y ROLLBACK . . . . . . . . . . . ..••...•••.

315
317

382 386 387 388 390 392 393 395 396 400
401

El modelo de transacCIones ANSl/ISO Otros modelos de transacciones .. Transacciones: entre bastidores Transacciones y procesamiento multiusuario El problema de la actualización perdida ..

319 321 323 325 326

14.

Vistas .................................•......•......•....
Concepto de vista El manejo de las vistas por el SGBD Ventajas de las vistas Inconvenientes de las vistas . ..................•.. . .

401 403 404 404

xiv

Contenido

Contenido

xv

Creación de vistas (CREATE VIE\-l) - . . . . • . . . . . . • . - . - .. - Vistas horizontales .. - .. Vistas verticales Vistas de subconjuntos de filas y columnas Vistas de agrupación Vistas de reunión Actualización de vistas . . . . . . . . . . . . . . . . . . . Actualizaciones de vistas y el estándar ANSI/ISO Actualizaciones de vistas en producLOs SQL comerciales Comprobación de las actualizaciones en las vistas
OPTION)

.

. . . . . _. .
(CHECK . .

405 405 407 409 410
412

PARTE V
Programación con SQ L

17.

SQL incorporado
Técnicas de programación en SQL .. _ Procesamiento de instrucciones en el SGBD __ . _ Conceptos de SQL incorporado . Desarrollo de un programa SQL incorporado Ejecución de un programa SQL incorporado Instrucciones simples de SQL incorporado Declaración de tablas Manejo de crrores Uso de variables del anfitrión Recuperación de datos con SQL incorporado Consultas de una única fila Consultas de múltiples filas Eliminaciones y actualizaciones con cursores _. _ Los cursores y el procesamiento de transacciones Resumen .

.
.

481 481 483 485 486 490 492 495 497 506 513 514 521 530 534 535 537

414 415 416 417 419 420
422
425

Eliminación de vistas (DROP Vistas materializadas * Resumen

VIEW)

.
.

. .

15.

Seguridad en SQL ...........................•......•......
Conceptos de seguridad en SQL . Identificadores de usuario . Objetos de seguridad _ . Privilegio . Las vistas y la seguridad en SQL . Concesión de privilegios (GRANT) . . . . . . . . . . . . . . . . . . . . . . • . . Privilegios sobre columnas . Transmisión de privilegios (GRANT OPTION) ....••......•.... Retirada de privilegios (REVOKE) . . . . . . . . . . . . . . . . . • . . . . . . • . . . . . REVOKE y GRANT OPTION . . . . . . . . . . . . . . . . . . . • . . . . . . • • . . .
REVOKE y

425
427

432 432 436 438
440

_

. . _.. . . . . . . . .

18.

SQL dinámico Límites de SQL estático Conceptos de SQL dinámico Ejecución de instrucciones dinámicas Ejecución dinámica en dos pasos
La instrucci6n PREPARE

. _
(EXECUTE

441
444

_. .

537 539
541 544 .

IMMEDIATE)

446

el estándar ANSIIISO
. . . .. .

..•........•..
.

Resumen. . .. . . .. .. . . .

448 450 451
_. .

16.

El catálogo del sistema
El concepto de catálogo del sistema El catálogo y las herramientas de consulta El catálogo y el estándar ANSI/ISO Contenido del catálogo Información de tablas _ _. _ Información de columnas Información de vistas ._ Comentarios Información de relaciones Información de usuarios Información de privilegios El esquema de la información de SQL2 Otra información del catálogo Resumen

.
. . .

.
. . . . . . .

451 452 454 454 456 459 463 465 466 469 471
472 477 477

La instrucción EXECUTE .. .. .. .. . . Consultas dinámicas . La instrucción DESCRIBE _....••.....•......•...... La instrucción DECLARE CURSOR .....•.....•• _....••...... La instrucción dinámica OPEN . . . . . . . • • . . . . . • • . . . . . • • . . . . . . La instrucción dinámica FETCH . . . . . . . • • . . . . . • • . . . . . . • . . . . . La instrucción dinámica CLOSE .......••••...•••....••••...

Dialectos de SQL dinámico ..............•......•......•.....
SQL dinámico en Oracle •.. ................... _ .

SQL dinámico y el estándar SQL2
instrucciones básicas de SQL2 dinámico SQL2 y SQLOA SQL2 y consultas de SQL dinámico Resumen _

.
.
.

547 548 557 563 565 566 569 570 570 571 575 575
577

. .

584

588 591 600

19.

Las API de SQL Conceptos de las API

.. .

,-xvi
Contenido Contenido

xvii

La API dbi lb (SQL Server) . . Técnicas básicas de SQL Server Consull.as de SQL Server _. Actualizaciones posicionadas . Consultas dinámicas _. ODBC y el estándar SQUCLI .. . . La estandarización de la imerfaz en el nivel de Ila~adas (CLI) Estructuras CLl . ProcesamienlO de inslrucciones CLl Errores e información de diagnóstico en CLJ Atributos de CL! Llamadas de información a eL! La API de ODBC .. La estructura de ODSC ODBC y la independencia del SGBD . Funciones del catálogo de ODSC Capacidades ampl ¡adas de ODBC La interfaz de llamadas de Oracle (OCl) Conlroladores OCI . . Conexión a un servidor de OracJe Ejecución de inslrucciones . Procesamiento de los resultados de una consulta Manejo de descriplores . . . . . . . . . . . Gestión de Lransacciones _ . Conectividad con bases de datos Java (JDBC) . Historia y versiones de JDBe .... . ..... _ _ . lmplememaciones de lDSC y Lipos de conLroladores __ La API de JDBC Resumen _ .

594 595
602 608 609 614 615 620 624 647 649 651 652

653
654 655 656

660
662 663 664 21.

. de flujo de control Repetición con cursores . Gestión de condiciones de error VClllajas de los procedimienlOs almacenados Rendimiento de lo!'. procedimientos almacenado~ . _ Procedimientos almacenados definidos por el sistema Pro<.:edimientos almacenados exlernos . Disparadores . . Ventajas e inconvenicllles de los disparadores . Disparadores en TrunsacL·SQL Disparadores en SPL de lnrormix Disparadores en PLlSQL de Gracle Olras consideraciones sobre los disparadores Procedimientos almacenados. disparadores y el estándar SQL El estándar de Jos procedimientos almacenados SQLlPSM Estándares de disparadores en SQL: 1999 . Resumen .
OLra~ conslrUClOra~

Ejecución repelida

721
724

. . .
.

725
729

730 733 733
734

.

735 736 737
739 741 742

743
744 753

754 757
758

SQL y los almacenes de dalos

665
666 666 668 669 670 676 696

PARTE VI SQL hoy y mañana
20. Procesamiento de bases de dalos y procedimientos almacenados

Conceplos de los almacenes de daLos . Componentes de un almacén de datos La evolución de los almacenes de dalos Arquiteclura de las bases de datos para los almacenes de datos Cubos de hechos . Esquemas en estrella. _ Dimensiones multinivel _. . EXlensiones de SQL para los almacenes de dalos Rendimiento de los almacenes de datos Rendimiento de la carga Rendimienlo de las consultas Resumen. . . . . . . . . . . .
22. SQL l' los servidores de aplicaciones.. .. .. .... . .. .. .

760 761
. . . . . . . . .
.. .. . 762 762 764 766 768 769 769 771

772
775 775

701
702 704 706

Conceptos de los procedimienLos almacenados Un ejemplo básico Uso de Jos procedimientos almacenados .. Creación de un procedimiento almacenado Llamada a un procedim.iento almacenado Variables de los procedimientos almacenados Bloques de instrucciones . . Devolución de un valor Devolución de valores por parámetros Ejecución condicional

. . . . .

706 708 710
713

715
717

720

SQL y los SiLios web: las primeras implementaciones Los servidores de aplicaciones y las arquitecturas de tres capas de los sitios web .. ......... ......... Acceso a bases de datos desde los servidores de aplicaciones. . . . . . Tipos EJB .. .. Acceso a bases de dalas con sesiones bean ............. ......... . Acceso a entidades con sesiones bean _. Mejoras de EJB 2.0 . . . . . . . . . . . ... . . .... . . . . . Caché de los servidores de aplicaciones .. .. .. . .. . Resumen .......... ...............

777 779 780 782 786

790
791 793

xviii

Contenido

Contenido

xix
872

23.

Redes SQL y bases de datos distribuidas El desafío de la gestión de datos distribuidos . Distribución de datos: enfoques prácticos _. _ . Acceso a bases de datos remotas _..............• _.. Transparencia de los datos remotos _ Extractos de tablas . Réplica de tablas ...•.......•.....•.. Réplicas actualizables . Compromisos de las réplicas . Arquitecturas normales de réplica. . . ..............•. Acceso a bases de datos distribuidas .........•.............•... Solicitudes remotas. . . . . . . . . . . . .........••......... Transacciones remotas _. _.....•.... Transacciones distribuidas . . . .. . . . . . Solicitudes distribuidas. . . . . . . El protocolo de compromiso de dos fases * Aplicaciones de redes y arquitectura de bases de datos Aplicaciones cliente/servidor y arquitectura de bases de datos Aplicaciones cliente/servidor con procedimientos almacenados . Aplicaciones empresariales y caché de datos .. Gestión de grandes volúmenes de datos en Internet Resumen . . . . . .. .. .......... . .

795 795 801 802 806 808 810 813 814 816 819 821
822

Métodos y procedi mientas almacenados Soporte de objetos en el estándar SQL: 1999 Resumen. ... .. ... ... . ...........•........

875 876

25.

SQL)' XML
XML Fundamentos de XML XML para dalos . XML y SQL _ __ _ . _............•...... _ Elementos y atributos . Uso de XML con bases de datos Salidas de XML Entradas de XML . intercambio de datos en XML . Almacenamiento e integración con XML .......•....... XML y metadatos _ . . . . . ...••.... _.. Definiciones de tipos de documentos (DTD) . XML Schema .. XML y consultas .......•... Conceptos de XQuery . . . ..................•.. Procesamiento de consultas en XQuer)' ......•. Bases de datos XML __ . Resu¡nen . . . . . . . . . . . _.....•.......•.

879 879
881

824 825 827 831 831 832 834 836 838 839 839 840 842 842 844 845 846 847 850 852 855 856 858 861 863 867 868 869 871

24.

SQL y los objetos ....................•.....••.....•........
Bases de datos orientadas a objetos . Características de las bases de datos orientadas a objetos Pros y contras de las bases de datos orientadas a objetos. Los objetos y el mercado de bases de datos . Bases de datos relacionales orientadas a objetos _. Soporte de grandes objetos . ....•..... BLOB en el modelo relacional .....................•...... Procesamiento especializado de BLOB . Tipos de datos abstractos (estructurados) .........•........ Definición de tipos abstractos de datos . Manipulación de tipos abstractos de datos Herencia . Herencia de tablas: implementación de clases de objetos _. Conjuntos, arrays y colecciones . . _ _ _. Definición de colecciones Consultas sobre datos de tipo colección . Manipulación de datos de tipo colección . Colecciones y procedimientos almacenados . Tipos de dalos definidos por el usuario . .....•.. _.

884 885 886 889 890 892 894 894 899 901 903 910 911 914 916 917

26.

El futuro de SQL ...........................•..............
Tendencias del mercado de bases de datos . Madurez del mercado de las bases de datos empresariales . . Diversidad y segmentación del mercado Aplicaciones empresariales empaquetadas . Ganancias de rendimiento del hardware . . . . Hardware para servidores de bases de datos ........•........ Las guerras de las pruebas . Estandarización de SQL . SQL en la próxima década . .....•....... Bases de datos distribuidas . Almacenes de datos masivos Bases de datos de rendimiento ulLra-aho Integración de los servicios de Internet y de red Bases de dalos incorporadas integración de objetos _ Resumen .. _. . .

919 920
920

922 922
923

925 926 928 931 931 932 933 934 935 935 937

Contenido

xxi

PARTE VII Apéndices Apéndice A.
Apéndice B.

La

bas~

de datos de ejemplo

.

941 947 948 948 949 949 951 951 952 952 953 954 955 956 957 958 958 960 960 961 961 962 962 963 965 965
967

Perfiles de los fabricantes de bases de datos

A2i, loe. (www.a2i.com) Arbor Software (www.hyperion.com) Birdstep Technology (www.birdstep.com) Computer Assocíates (www.cai.com) Compuler Corporation of America (www.cca-inLcom) Empress Software (www.crnprcss.com)
eXceJon (www.cxln.com) .

Rutinas para la gesti6n del enlorno SQL Rutinas pan¡ la gestión de las conexiones SQL Rutinas para la gestión de las instrucciones SQL Rutinas para la ejecución de instrucciones SQL Rutinas para el procesamiento de los resultados de las consultas Rutinas para la descripción de los resultados de las consultas Rutinas para la gestión de descriptores de los resultadm. de las consultas H.utinas para el procesamiento diferido de parámetros dinámicos Rutinas para errores. estado y diagnóstico Rutinas de información de la implementación CL! Códigos de los valores de los parámetros eL! Apéndice E. La La La La La La La La La La La La La La La La La La La La La La La vista vjsta vista vista vista vista vista vista vista vista vista vista vista vjsta vista VIsta vista vista vista vista vista vista vista

978 978 979 980 981 982 983 985 985 986 987 993 994 995 995 997 997 998 999 999 1000 1001 1001 1002 1002 1003 1004 1004

Gupla Technologies (www.guptaworldwide.com) Hewlett Packard (www.hp.com)

.

. .

El estándar del esquema de la información de SQL ....
SCHEMATA TABLES CQLUMNS VI EWS . VIEW_TABLE_USAGE VIEW_COLUMN_USAGE TABLE_CONSTRJI.INTS REFERENTIAL_CONSTRAINTS CHECK_CONSTRJ>.INTS KEY_COLUMN_USAGE ASSERTIONS CONSTRAINT_TABLE_USAGE CONSTRP.INT_COLUMN_USAGE TABLE_PRIVILEGES COLUMN_PRIVILEGES USAGE_PRIVILEGES DOMAINS . DOMAIN_CONSTRAINTS DOMJl..IN_cüLUMN_USAGE CHARACTER_SETS COLLATIONS TRANSLJI.TIQNS SQL_LANGUAGES

IBM Corporation (www.ibm.com) lnformix Software (véase IBM Corporation)
Microsoft Corporation (www.microsofLCOm)

....

. .

. .

.......•.•....

MySQL AB (www.mysql.com)
Objectivity (www.objectivity.com) Onide Corporation (www.oracIe.com) Persistence Software (www.persistence.com) Pervasive Software (wwV:'.pervasive.com) PointBase (www.pointbase.com) ... PostgreSQL (www.pos'tgresql.org) Quadbase Systems (v$ww.quadbase.com). . Red Brick Systems (véase IBM Corporation) Sybase, Inc. (www.sybase.com) TimesTen Performance Software (www.ti.mesten.com) Yersant Corporation (www.versant.com)

. . . . .

Apéndice C.

Referencia de la sintaxis de SQL .•..•.......••......
. .

lOas
1006 1007 1008 1009 1009

Instrucciones de definición de datos Instrucciones básicas de manipu"laci6n de datos Instrucciones de procesamiento de transacciones Instrucciones de cursores Expresiones de consultas .... Condiciones de búsqueda Expresiones Elementos de las instrucciones Elementos simples ..

968 969 970 970 970
972 972

laja

973 973 97S
977 977

Apéndice F.

Guía de instalación del eD-ROM

1013 1014 1014 1015 1015 1016

Apéndice D.

La interfaz del nivel de llamadas de SQL

lnstalación del software SGBD SQL Microsoft SQL Server 2000 .
Requisitos de hardware y de software Notas sobre la instalación Inslalación de SQL Server 2000

Valores devueltos por eL! . Rutinas generales de gestión de controladores.

xxii

Contenido

. 1017 . 1017 1018 . . . 1018 1018 Notas sobre la instalación . Instalación de DB2 Enterprise Edition . 1019 Inicio de DB2 Enterprise Edition . . 1020 1020 Desinstalación de DB2 Enterprise Edition 1020 MySQL . Requisitos de hardware y de software _ . 1021 Notas sobre la instalación . 1021 Instalación de MySQL . 1021 Inicio de MySQL .. 1022 Desinstalación de MySQL . 1022 Descarga del software del SGBD Oraele .......•......••....... 1022 Inicio de SQL Server 2000 Desinstalación de SQL Server 2000 IBM DB2 Requisitos de hardware y de software Índice... 1025

Agradecimientos

Gracias especiales a Matan Arazi por hacer de nuevo un trabajo excepcional de ensamblaje del CD de este libro, llevando a cabo otro milagro al comprimir tres productos SGBD en un único CD, y por hacerlo en plazos imposibles. Gracias también al equipo de McGraw-Hill/Osborne, incluyendo a Jane

Brownlow. Jennifer Malnick. Martin Przybyla. Greg Gnntle y Chrisa Hotchkiss.

xxiii

Introducción

Esta edición I de SQL. Manual de referencia proporciona un tratamiento extenso y profundo del lenguaje SQL para usuarios, tanto técnicos como no, programadores, profesionales de procesamiento de datos y directivos que deseen comprender el impacto de SQL en la industria informática actual. Este libro ofrece un marco conceptual para comprender y usar SQL, describe la historia de SQL y los estándares SQL, y explica el papel de SQL en varios segmentos de la industria informática, desde el procesamiento de datos de la empresa y los almacenes de datos (data warehouses) hasta las arquitecturas de los sitios web. Esta edición contiene capítulos enfocados especialmente en el papel de SQL en las arquitecturas de los servidores de aplicaciones, y la -integración de SQL con XML y otras tecnologías basadas en objetos. Este libro mostrará paso a paso el uso de las características de SQL, con muchas ilustraciones y ejemplos reales para aclarar los conceptos de SQL. El libro también compara productos SQL de importantes fabricantes de SGBD (sistemas gestores de bases de datos) -describiendo sus ~ventajas y compromisos- para ayudarle a seleccionar el producto adecuado para su aplicación. El CD-ROM adjunto contiene versiones de prueba-reales de tres importantes fabricantes de SOBD, además de instrucciones para la descarga de las versiones de prueba de versiones posteriores, de forma que uno pueda probarlas por sí mismo y adquirir,experiencia real en el uso de los principales productos SGBD de Gracle, Microsoft e lBM, así como el popular SGBD de código abierto MySQL. En algunos de los capítulos, el tema tratado se explora en dos ámbitos diferentes -una descripción fundamental del tema y una discusión avanzada orientada a profesionales informáticos que necesitan comprender los aspectos internos de SQL. La información avanzada se trata en secciones marcadas con un asterisco (*). No es necesario leer estas secciones para comprender lo que es y hace SQL.

Organización del libro
El libro está dividido en seis partes que tratan varios aspectos del lenguaje SQL: • La Parte Uno, «Visión general de SQL», proporciona una introducción a SQL y una perspectiva de mercado de su papel como lenguaje de bases de datos. Sus cuatro capítulos describen la historia de SQL, la evolución de los estándares SQL y cómo se corresponde SQL con el modelo de datos relacional y

I

Nota del editor: segunda del inglés. primera en castellano.

xxv

así como interfaces en el nivel de llamada tales como el API OCI de Oracle. borrar los datos de la base de datos y modificar datos existentes en ella. La Parte Uno también contiene un breve recorrido de SQL que ilustra concisamente sus características más importantes y proporciona una visión general de todo el lenguaje. También describe el esquema de seguridad de SQL. tales como ODBe y IDBC. Por qué este libro es para usted Esta edición de SQL. programadores. los términos técnicos aparecen en cursiva la primera vez que se usan y definen. esto se indica con elipsis (. describe cómo los programas de aplicación usan SQL para el acceso a bases de datos. El último de los tres capítulos de esta parte estudia el concepto de transacción en SQL y su soporte para el procesamiento de transacciones multiusuario. interfaz en el nivel de llamada) y IDBC. Los elementos del lenguaje SQL. También explica la importancia de los estándares basados en SQL. la base de datos universal DB2 e Inforrnix de IBM. estudiantes y directivos. especificado por el estándar ANSI y usado por mM. Los listados de programa aparecen con fuente no proporcional y usan la convención habitual de caja para el lenguaje de programación de que se trate (mayúsculas para COBOL y FORTRAN. Oracle. Los siguientes cuatro capítulos comienzan con las consultas SQL más simples y progresivamente se construyen cansullas más complejas. «Recuperación de datos». describe el estándar. incluyendo a los usuarios de bases de datos. muestra cómo se puede usar SQL para añadir nuevos datos a la base de datos. incluyendo ODBC. esta parte describe las API (Application Programming Interface. y el uso comprobado de SQL para los almacenes de datos. SUS cuatro capítulos muestran cómo crear tablas. los resultados de consultas largas se truncan después de unas cuantas filas. También describe los aspectos de la integridad de las bases de datos que surgen al actualizar los datos. y el catálogo del sistema de SQL.. XML y las arquitecturas de servidores de aplicaciones.. Cuatro capítulos adicionales describen las bases de datos distribuidas basadas en SQL. Siempre que ha sido posible. el núcleo del lenguaje SQL y pasa a describir las diferencias entre los productos SQL más populares. tales como los generadores de informes y programas de exploración de bases de datos. y los estándares ANSI/ISO para SQL y las tecnologías relacionadas con SQL. Los nombres de las funciones de la API de SQL aparecen en minúsculas y con fuente no proporcional. así como las descritas en los estándares de SQL ANSIfISO. Su estructura permitirá empezar rápidamente a usar SQL. La Parte Cuatro. incluyendo consultas sobre varias tablas. Finalmente. También describe la interfaz de SQL dinámico que se usa para construir tablas de bases de datos de propósito general. progresando desde consultas simples hasta conceptos más avanzados. Cuando difieren los dialectos. el último capítulo explora el futuro de SQL y algunas de las tendencias más importantes en la gestión de datos basada en SQL.xxvi . interfaz de programación de aplicaciones) de SQL. pero el .lo que es SQL. minúsculas para C y Java). Si se afronta por primera vez SQL.. Esta parte también estudia las diferencias significativas entre las estructuras de bases de datos soportadas por varios productos SGBD basados en SQL. aparecen en MAYÚSCULAS y CON FUENTE NO PROPORCIONAL. En estos casos es posible que haya que modificar ligeramente las instrucciones SQL de los ejemplos para acomodarse a la marca particular de SOBD. que impide los accesos no autorizados a los datos. La Parte Dos. La Parte Cinco. que aparecen inmediatamente después de la instrucción SQL como si se tratase de una sesión interactiva. «Programación con SQL». Ingres. Muchos de los ejemplos de SQL incluyen resultados de consultas. Describe -con un lenguaje sencillo y comprensible. este libro ofrece un tratamiento extenso y paso a paso del lenguaje. la sintaxis descrita en este libro y usada en los ejemplos se aplica a todos los dialectos de SQL. incluyendo Oracle. el estándar de la interfaz en el nivel de llamada para Java. y cómo SQL trata estos aspectos. Este libro no es específico de ninguna marca o dialecto de SQL. que describe la estructura de la base de datos. Finalmente. La Parte Tres. estudia la creación y administración de una base de datos basada en SQL. «Actualización de datos». Introducción Introducción xxvii • • • • • con tecnologías anteriores de bases de dalos. consultas de resumen y consultas que usan subconsultas. Estudia SQL incorporado. Convenciones usadas en este libro Esta edición de SQL Manual de referencia describe las características de SQL y las funciones disponibles en los productos SGBD más conocidos. En cambio.) a continuación de la última fila de los resultados de las consultas. y los ejemplos siguen las prácticas más comunes. Manual de referencia es el libro adecuado para cualquiera que desee comprender y aprender SQL. nombres de tablas y de columnas e instrucciones de ejemplo. La Parte Seis. A lo largo del libro. «Estructura de la base de datos». examina el uso de SQL en varias de las áreas de aplicación actuales y destacadas. describe las características de SQL que permiten realizar consultas a la base de datos. se destacan las diferencias en el texto. Dos capítulos describen él uso de los procedimientos almacenados y los disparadores para el procesamiento interactivo de transacciones. Microsoft SQL Server. la mayoría de las implementaciones de SQL aceptarán instrucciones tanto en mayúsculas como en minúsculas. ilustrado con figuras y ejemplos. por qué es importante y cómo se usa. Informix y muchos otros productos SGBD basados en SQL. el estándar ISO CL! (Cal/-Level Interface. los profesionales de procesamiento de datos y arquitectos de sistemas. El primer capítulo de esta parte describe la estructura básica del lenguaje SQL. Sybase y MySQL. En algunos casos. Esta edición contiene nuevos capítulos y secciones que estudian las últimas innovaciones de SQL en las áreas de las tecnologías relacionales orientadas a objetos. y el estado vigente de los productos SGBD basados en SQL. la influencia de las tecnologías de objetos sobre SQL y la integración de SQL con las tecnologías XML. vistas e índices que forman la estructura de una base de datos relacional. «SQL hoy y mañana». Nótese que estas convenciones se usan s610 para mejorar la legibilidad. incluyendo las palabras clave.

En resumen. ofrece un marco conceptual p<\ra la programación SQL. El Capítulo l describe lo que es SQL y explica sus principales características y beneficios. las características y beneficios de SQL. los almacenes de datos y sitios web hasta aplicaciones distribuidas basadas en Internet-. este libro ofrece un tratamiento muy completo de la programación con SQL. El Capítulo 3 ofrece una perspectiva de mercado de SQL a través de su historia. este libro ofrece una comparación de las características de SQL y los beneficios ofrecidos por varios fabricantes de SOBO. Parte 1 VISiÓN GENERAL DE Sal f Los primeros cuatro capítulos de este libro proporcionan una perspectiva y una introducción rápida a SQL. Compara las interfaces de programación SQL ofrecidas por todos los pro~ ductos principales SQL. tanto los usuarios técnicos como no técnicos se pueden beneficiar de este libro. arquitecto de sistemas o directivo. Se explican las diferencias entre los productos SOBD más importantes. un recorrido rápido de SQL muestra muchas de sus capacidades con ejemplos simples y rápidos de programar. Si se es un programador. Los primeros capítulos describen la historia de SQL. productos populares basados en SQL. e identificando las razones de la importancia actual de SQL. ODBC. La descripción y comparación de las técnicas de programación proporciona una perspectiva que no se encuentra en ningún otro libro. describiendo los estándares SQL y los fabri· cantes principales de los productos basados en SQL. explicando tanto el por qué como el cómo del desarrollo de aplicaciones basadas en SQL. su papel en el mercado y su evoluci6n desde las primeras tecnologías de bases de datos. este libro proporcionará una perspectiva del impacto que SQL está teniendo en la industria de las tecnologías de informaci6n --desde los ordenadores personales. JDBC y API propietarias tales como Oracle Call Interface. Se puede usar el software SQL del CO-RüM adjunto para probar los ejemplos y adquirir práctica con SQL. la historia de SQL y el impacto de SQL en la dirección futura-de la industria de las tecnologías de la información. incluyendo SQL incorporado. L . El software SGBD del CD-ROM adjunto se puede usar para probar estas características en un prototipo de su propia aplicación. Es la fuente de información más extensa disponible sobre el lenguaje SQL. A diferencia de los manuales de referencia de muchos productos SGBD. Si se está eligiendo un producto SGBD. no sólo en términos técnicos. Si se es un profesional de procesamiento de datos. sino también en términos de su impacto en las aplicaciones y su posición competitiva en el mercado. bases de datos de informaci6n comercial e integración de las bases de datos con XML. extensiones de SQL orientadas a objetos. En el Capítulo 2.xxviii Introducción libro continuará adquiriendo valor al usar las características más complejas del lenguaje. SQL dinámico. El Capítulo 4 describe el modelo de datos relacional en el que se basa SQL y lo compara con modelos de datos anteriores. tales como bases de datos distribuidas. Los últimos capítulos describen el futuro de SQL y el desarrollo de nuevas tecnologías de bases de datos.

¿Qué es. como SQL Server. Gracle. Durante más de dos décadas SQL ha pasado de su primer uso comercial a ser un segmento del mercado de productos y servicios informáticos valorado en decenas de miles de millones de euros al año. SQL ha saltado a una posición destacada como importante. las tres mayores empresas de software del mundo. Desde sus oscuros comienzos como proyecto de investigación de IBM.~ I j 1 El lenguaje SQL y los sistemas de bases de datos relacionales basados en él son una de las tecnologías básicas más importantes de la industria informática. Se ha adoptado un estándar oficial internacional para SQL y se ha ampliado dos veces. Sybase y DB2. Prácticamente todos los principales productos de software para empresas confían en SQL para la gestión de los datos. Infonnix. Oraele e IBM.CAPíTULO ¡ 1 Introducción . tecnología infonnática y como poderosa fuerza de mercado. y SQL se halla en el núeleo de los productos de bases de datos de Microsoft. e incluso a los dispositivos de mano. y las arquitecturas competidoras de servicios web de los campos basados en Microsoft y en Java? ¿De verdad SQL se adapta tanto a los grandes sistemas como a los dispositivos de mano? ¿De verdad ha ofrecido el rendimiento necesario para el procesamiento de grandes volúmenes de transacciones? ¿Cómo afectará SQL al modo en que se emplean las computadoras. comparados entre sí? ¿Qué relación tiene SQL con los estándares de Microsoft. que se ejecutan en sistemas infonnáticos que van desde los grandes sistemas (mainframes) a las computadoras personales. como ODBC y COM? ¿Cómo conecta IDBC a SQL con el mundo de Java y con la tecnología de objetos? ¿Qué papel desempeña en la arquitectura emergente de los «servicios web». exactamente. SQL? ¿Por qué es importante? ¿Qué puede hacer y cómo funciona? Si SQL es verdaderamente un estándar. Literalmente centenares de productos de bases de datos. y SQL es hoy en día el lenguaje estándar para las bases de datos informáticas. ¿por qué hay tantas versiones y dialectos diferentes? ¿Cómo son los productos más populares de SQL. SQL también se halla en el corazón de los productos de bases de datos de código abierto que están ayudando a incrementar la popularidad de Linux y del movimiento de código abierto. y cómo puede obtenerse el máximo de esta importante herramienta de gestión de datos? 3 . admiten actualmente SQL.

protegiéndola así del deterioro debido a las actualizaciones inconsistentes o a los fallos del sistema. SQL es un sublenguaje de bases de datos. En cambio. C++ o Java. El SGBD procesa la solicitud de SQL. í"l :~ f' :tI . SQL es un lenguaje que se utiliza para interactuar con bases de datos. SQL permite que el usuario defina la estructura y la organización de los datos almacenados y las relaciones entre los elementos de datos almacenados. Si el sistema informático se halla en una empresa. como C. en realidad. pueden enviarse de forma explícita a un sistema gestor de bases de datos para su procesamiento mediante una intelfaz en el nivel de llamadas desde un lenguaje como e. protegiendo así los datos almacenados contra los accesos no autorizados. que consta de unas cuarenta instrucciones especializadas para las tareas de gestión de las bases de datos. En una computadora personal puede que la base de datos almacenara datos sobre los cheques emitidos. La Figura 1. SQL permite que el usuario o un programa de aplicación recupere de la base de datos los dalas almacenados y los emplee. un lenguaje completo para el control y la interacción COIl sistemas de gestión de bases de datos. 110101 101110 Sistema informático ¡¡ m Figura 1. En segundo lugar. SQL es mucho más que una herramienta para consultas. SQL se utiliza para coordinar el compartimiento de datos entre usuarios concurrentes. eliminando datos antiguos y modificando los datos almacenados previamente. Por motivos históricos. recupera los datos solicitados y los devuelve al usuario.¡ ·ti¡ in. y también hay algunas reglas especiales para evitar la construcción de instrucciones SQL que parezcan perfectamente legales pero que carezcan de sentido. Cuando se necesita recuperar datos de una base de datos. SQL puede utilizarse para restringir la capacidad del usuario para recuperar. ni FOR para el control del flujo de los programas. De hecho. . aunque ése fuera su propósito original y la recuperación de datos siga siendo una de sus JI funciones más importantes. Finalmente. Manual de referencia . añadir y m9dificar datos.».~ '¡¡~i " 1I :~ f. completadas con «palabras ruido}) que no añaden nada al significado de la frase pero que hacen su lectura más naturaL Hay unas cuantas inconsistencias en el lenguaje SQL. • Control de acceso.li. sobre todo si se compara con lenguajes muy estructurados. O SGBD. ~ . SQL es. SQL no es un lenguaje especialmente estructurado. El recorrido rápido por SQL del Capítulo 2 ofrecerá una buena visión general del lenguaje y de sus posibilidades. SQL permite que el usuario o un programa de aplicación actualice la base de dalas añadiendo daLas nuevos. SQL se ha situado como el lenguaje estándar para el empleo de las bases de datos relacionales. DO. En primer lugar.Q. En cambio. 4 SOL. De manera alternativa. denominado bases de datos relacionales. o mediante mensajes enviados mediante una red informática. corno COBOL o e. Este proceso de solicitud de datos de las bases de datos y de recepción de los resultados se denomina consulta de la base de datos ----'de ahí el nombre de lenguaje estructurado de consultas. con el fin de ampliar ese lenguaje para su empleo en el acceso a bases de datos. SQL no contiene ninguna sentencia IF para la comprobación de condiciones. de ventas o de nóminas. de producción. Uso de SOL para el acceso a bases de datos. Pascal o Java. SQL trabaja con un tipo específico de bases de datos. Estas instrucciones de SQL se pueden incorporar en otro lenguaje. SQL se suele pronunciar «sicuel» (en inglés). ~ Capítulo 1: Introducción 5 El lenguaje SOL SQL es-una herramienta para la organización. ~ m de·d Datos ~ ¡. SQL define restricciones de integridad en la base de datos. pero también se utiliza la pronunciación alternativa «S. C++ o Java. puede que la base de datos almacene datos de inventario. El'programa informático que controla 'la base de datos se denomina sistema gestor de bases de datos (database management system). asegurando así que no interfieran entre sí. C. El acrónimo SQL es la abrevia~ tura de Srructured Query Language (lenguaje estructurado de consultas).L. • Compartimiento de los datos. El sistema informático de la figura tiene una base de datos que almacena información importante. listas de personas y de sus números de teléfono o datos extraídos de un sistema informático mayor. SQL no es. se utiliza el lenguaje SQL para formular la solicitud. SQL se utiliza para controlar LOdas las funciones que el SOBD ofrece a los usuarios.l i~ .~ Solicitud SOL ~ i ). SQL es a la vez un lenguaje potente y un lenguaje que resulta relativamente sencillo de aprender. gestión y recuperación de los da~ tos almacenados en bases de datos informáticas.1. entre las que se hallan: • Definición de los datos. Como el nombre indica. • Integridad de los datos. ~¡ ~i }~nOOll. ni instrucciones GOTO. El nombre de lenguaje estructurado de consultas induce realmente a confusión.~.1 muestra el modo en que trabaja SQL. • Recuperación de los datos. Pese a la inexactitud de su nombre. l ~ " 1 lí i. un lenguaje informático completo como COBOL. por tanto. las instrucciones de SQL se parecen a las frases escritas en inglés. • Manipulación de los datos.

SQL es un lenguaje de acceso a datos por Internet. En las redes informáticas con mezcla de diferentes productos de SGBD. de otros sistemas informáticos. SQL desempeña muchos papeles diferentes: • SQL es un lenguaje interactivo de consultas. SQL es un lenguaje cliente/servidor. se ha manifestado como una herramienta útil y potente para enlazar personas.6 SOL Manual de referencia Capítulo 1: Introducción 7 El papel de SaL SQL no es. En cambio. SQL es un lenguaje de bases de datos distribuidas. incluso. Como muestra la figura. y el modo en que SQL actúa como el pegamento que los mantiene unidos. El software SGBD de cada sistema utiliza SQL para comunicarse con los demás sistemas. No se puede ir a una tienda de informática y «comprar SQL».2. Esta arquitectura cliente/servidor se ha vuelLo muy popular para las aplicaciones de tipo empresarial. por tanto. SQL es un componente integral de los sistemas de gestión de bases de datos.icas principales de SQL y las fuerzas del mercado que les han permitido tener éxito: • • • • Independencia del fabricante. ~QL es un lenguaje de programación de bases de datos. ni un producto independiente.datOrs _ SQL. Transportabilidad entre sistemas informáticos. almacenar y recuperar los dalOs de la base de datos. El motor de bases de dalos es el corazón del SGBD. Los programadores Incorporan comandos de SQL en los programas de aplicación para tener acceso ~ los datos de las bases de datos. Tanto los programas escritos por los usuaflos como los programas de utilidades de las bases de datos (como los escritores de informes y las herramientas deintroducci6n de datos) utilizan esta técnica para el acceso a las bases de datos. Acuerdos y obligaciones de IBM (DB2). A continuación se indican algunas de las característ. Los sistemas de gestión de bases de datos distribuidas utilizan SQL para ayudar a distribuir los datos por muchos sistemas informáticos interconectados. de los programas de aplicación escritos por los usuarios e. Acepta las solicitudes de SQL de otros componentes del SOBD -como el recurso de formularios. SQL es un lenguaje de pasarelas de bases de datos. por sí mismo. SQL suele utilizarse como pasarela que permita a unas marcas de SGBD comunicarse con las otras. Estándares SQL. Componentes de un sistema gestor de bases de datos típico. Los programas de las computadoras personales utilizan SQL para comunicarse mediante una red con los servidores de bases de datos que almacenan los datos companidos. I 1 I . El responsable de la administración de una base de datos en una minicomputadora o en un gran sistema utiliza SQL para definir la estructura de la base de datos y controlar el acceso a los datos almacenados. . Los servidores web de Internet que interactúan con los datos empresariales y los servidores de aplicaciones de Internet utilizan SQL como lenguaje estándar para el acceso a las bases de datos empresariales.2 muestra algunos de los componentes de un SGBD lípico. Base de datos A otras marcas de SGBD i I Figura 1. el escrilor de informes o el recurso de consullas interactivas-. SQL es un lenguaje de administración de bases de datos. Los usuarios escriben comandos de SQL en programas interactivos de SQL para recuperar los datos y • • • • 010011 110101 101110 Herramientas de programación fI • • mostrarlos en la pantalla. enviando solicitudes de acceso a los datos. La Figura 1. responsable de estructurar realmente. un sistema gestor de bases de datos. lo que proporciona una herramienta práctica y fácil de utilizar para las consultas ad hoc a las bases de datos. 'f~~ Motor de la base ~d. programas y sistemas infonnáticos con los datos almacenados en las bases de datos relacionales. sistemas informáticos :LY I Características y ventajas de SaL SQL es a la vez un lenguaje sencillo de comprender y una herramienta completa para la administración de los datos. un lenguaje y una herramienta para comunicarse con los SOBD.

Operan en sistemas informáticos independientes. incluso. las estaciones de trabajo. o en Internet. dispositivos de mano. FIPS). en redes de área local departamentales y en redes empresariales. Los datos de las bases de datos empresariales basadas en SQL pueden extraerse y descargarse a bases de datos departamentales o personales.• Los productos de bases de datos basados en SQL se pueden ejecutar en sistemas informáticos que van desde los grandes sistemas y los sistemas medianos a las computadoras personales. Acceso mediante programación a bases de da(Qs.8 • • • • • • • • • • • • • • SOL. Estructura de alto nivel en inglés. Í' . ODBC y ADO) Microsoft ha considerado desde hace tiempo el acceso a las bases de datos una parte fundamental de su arquitectura de software para computadoras personales Windows. las computadoras personales eco- Obligaciones de Microsoft (SOL Server.y de las bases de datos relacional. ISO) publicaron un primer estándar para SQL en 1986. LbS estándar en evolución sirven de sello oficial de aprobación de SQL y han acelerado su aceptación en los mercados. ODBC y ADO). allá de su propio negocio de sistemas informáticos. y nuevamenle en 1992 y en 1999. Vistas múltiples de los dalos. A lo largo de los años otros grupos internacionales. Las herramientas de bases de datos. Infraestructura de la industria. Fundamentos relacionales. lo que lo transforma en un requisito fundamental para los grandes contratos informáticos del gobierno estadounidense. Las aplicaciones basadas en SQL que comienzan en sistemas de un solo usuario o de servidores depanamentales pueden pasarse a sistemas servidores de mayor tamaño a medida que crecen.es. como las interfaces en el nivel de llamada o las extensiones basadas en los objetos. y ningún producto nuevo de bases de datos ha tenido un éxito importante en la última década sin soporte de SQL. Más adelante. S. Arquitectura cliente/servidor.versiones de sobremesa como las de servidor de Windows proporcionan un acceso estandarizado a las bases de datos relacionales mediante la conectividad abierta de bases de datos (Open Database COllneclivity. Finalmente. Definición dinámica de datos. Tanto las . Todas se describen en los apartados siguientes. nómicas pueden utilizarse como prototipos para aplicaciones de bases de datos basadas en SQL antes de pasarlas a sistemas multiusuario de elevado coste. en muchos casos de fabricantes informáticos de la competencia como Sun O Hewlett-Packard. Muchas de estas nuevas iniciativas se han incorporado con el tiempo al estándar ANSl/ ISO. Acceso a bases de dalOS en Internet. como las herramientas de consulta. Acuerdos y obligaciones de IBM (DB2) SQL fue inventado originalmente por investigadores de lB M. funcionan con muchas marcas diferentes de bases de datos de SQL. Los productos basados en SQL que ha desarrollado O adquirido IBM se ejecutan hoy en día en una amplia gama de hardware. SQL también es un estándar federal para procesamiento de información de EE UU (U. desde las computadoras personales a 'los sistemas intennedios (AS/400 y servidores basados en UNIX) y los grandes sistemas de IBM.. Consultas ad hoc interactivas. Extensibilidad y tecnología de objetos. Soporte de aplicaciones empresariales. Manual de referencia Capítulo 1: Introducción 9 Obligaciones de Microsoft (SQL Server. Integración de Java (lOBe). gubernamentales estadounidenses y de fabricantes han liderado la normalización de nuevas capacidades de SQL. Lenguaje completo de base de datos. Estándares SOL El organismo estadounidense de normalización (American National Standards Insti tute. y desde entonces se ha transformado en un producto estratégico para IBM basado en su base de datos insignia DB2. que se amplió en 1989. ANSI) y la Organización Internacional de Normalización (Inlernational Standards Organization. . Independencia del fabricante Todos los fabricantes principales de SGBD ofrecen SQL. Las bases de datos basadas en SQL y los programas que la utilizan pueden pasarse de un SGBD al SGBD de otro fabricante con un mínimo esfuerzo de conversión y una pequeña readaptación del personal. Éstas son las razones por las que SQL se ha situado como la herramienta estándar para la administración de datos en las computadoras personales. las minicomputadoras y los grandes sistemas. una amplia gama de computadoras servidoras especializadas e. Transportabilidad entre sistemas informáticos ~. El trabajo inicial de IBM proporcionó una señal clara de la dirección lOmada por IBM para que la siguieran los demás fabricantes de bases de datos y de sistemas en los albores del desarrollo de SQL. La independencia del fabricante que SQL ofrece de esta manera fue uno de los molivos más importantes de su temprana popularidad y sigue siendo hoy en día una característica importante. ODBC). el compromiso y el amplio sopone de IBM aceleraron la aceptación por los mercados de SQL. La influencia de IBM en SQL hoy en día llega mucho más. los escritores de informes y los generadores de aplicaciones. El soporte de SQL está disponible en todas las principales familias de productos de IBM. Federal Information Processing Standard.

bases de datos. etc. Aprovechando una ola de aceptación provocada por el éxito del modelo relacional. en lugar de especificar cómo hallar los datos. de las bases de datos relacionales resulta intuitiva para los usuarios.iante programación y un recurso de consulta diferente para las solicitudes ad hoc. procesadores de texto. Además. Al emplear SQL de manera interactiva. Esto se debe en parte a que las instrucciones de SQL describen los datos que hay que recuperar. la base de datos puede construirse de modo que cada usuario sólo vea los datos de su departamento o región de ventas. introdujo SQL Server como su propia oferta basada en SQL. SQL Server sigue siendo hoy en día un producto insignia de Microsoft y un componente fundamental de su arquitectura . Acceso mediante programación a bases de datos SQL es también un lenguaje de bases de datos empleado por los programadores para escribir aplicaciones que tengan acceso a las bases de datos. incluso a preguntas complejas.iferentes vistas de su estructura y de su contenido. Por ejemplo. utilizarse para mejorar la seguridad de la base de datos y adaptarla a las necesidades particulares de cada usuario. puede ofrecer a diferentes usuarids de la base de datos d. la recuperación de datos y el compartimiento de datos entre usuarios concurrentes. AClivelX Daca Objects o ADO). La estructura tabular. Manual de referencia Capítulo 1: Introducción 11 una API en el nivel de llamadas basarla en SQL. como parte de su tecnología Enlace e incrustación de objetos (Object Linking and Embedding. de filas y columnas. y todas las principales bases de datos de SQL ofrecen acceso ÜDBC. más recientemente. Lenguaje completo de base de datos SQL se desarrolló en un principio como un lenguaje para consultas ad hoe.) de Microsoft y de otros fabricantes admiten ODBC. Vistas múltiples de los datos Al emplear SQL el creador de una base de datos. En consecuencia. Consultas ad hoc interactivas SQL es un lenguaje de consultas interactivas que da a los usuarios acceso ad hoc a los datos almacenados. consullas ad hoc de SQL fue una ventaja importante respecto de las bases de datos no relacionales en los primeros tiempos de su evolución. la administración de su seguridad. la actualización de su contenido. sin ninguna sinergia entre los dos modos de acceso. por lo que las partes del programa de acceso a las bases de dalas pueden comprobarse previamente con SQL interactivo e incrustarse posteriormente en el programa. OLE DB) y. más orientadas a objetos. los usuarios pueden obtener respuestas. 10 que hace que SQL sea sencillo de aprender y de comprender. Las tablas y columnas de las bases de datos de SQL pueden tener nombres descriptivos largos. Cuando Microsoft comenzó su esfuerzo para hacer de Windows un sistema operativo para servidores viable a finales de los años ochenta del siglo pasado. Las principales aplicaciones de software de Windows (hojas de cálculo. Fundamentos relacionales SQL es un lenguaje para bases de datos relacionales y se ha hecho popular junto con el modelo relacional de bases de datos. por tanto. SQL ofrece un lenguaje completo y consistente para la creación de bases de datos. en nítido contraste con los días o semanas que tardaría un programador en escribir un programa personalizado para informes. la mayor parte de las instrucciones de SQL «dicen 10 que quieren decir» y pueden leerse como frases claras en lenguaje natural. aunque los usuarios estén teniendo acceso al contenido de la .NET para servidores web. El modelo relacional tiene también un sólido fundamento teórico que ha guiado la evolución e implementación de las bases de datos ·relacionales. pero su capacidad va hoy en día mucho más allá de la recuperación de datos. lo que hace que el lenguaje SQL siga siendo sencillo y fácil de comprender. las bases de datos tradicionales ofrecían un conjunto de herramientas para el acceso med. Los conceptos de SQL que se aprenden en una parte del lenguaje pueden aplicarse a otros comandos de SQL. los datos de diferentes partes de la base de datos pueden combinarse y presentarse al usuario como una mera tabla de filas y columnas. SQL se ha transformado en el lenguaje de bases de datos para las bases de datos relacionales. en minutos o en segundos. Las vistas de SQL pueden.10 SOL. como parte de ActiveIX (Objetos de datos AclivelX. La capacidad para Definición dinámica de datos Mediante SQL se puede modificar y expandir de manera dinámica la estructura de las bases de datos. A diferencia de esto. Microsoft ha mejorado el soporte de OOBC con capas de acceso de nivel superior. Estructura de alto nivel en inglés Las instrucciones de SQL tienen el aspecto de frases sencillas en inglés. Se emplean las mismas instrucciones de SQL tanto para el acceso interactivo corno para el acceso mediante programaci6n. Debido a la capacidad para consultas ad hoc de SQL los datos resultan más accesibles y pueden utilizarse para ayudar a una organización a tomar decisiones mejores y más informadas. y más recientemente ha seguido siendo una ventaja fundamental sobre las bases de datos basadas solamente en objetos. lo que hace que los usuarios sean más productivos.

muchos de los principales fabricantes de bases de datos también han anunciado o implementado el soporte de Java en sus sistemas de bases de datos. Extensibilidad y tecnologia de objetos El principal desafío al prolongado dominio de SQL como estándar de bases de datos ha surgido de la aparición de la programación basada en· objetos y de la introducción de bases de datos basadas en objetos como extensión de la amplia tendencia del mercado hacia la tecnología basada en objetos. los desarrolladores necesitaban una manera de recuperar y presentar en las páginas web la información de las bases de datos. Esto supone un importante avance respecto de los lenguajes estáticos de definición de datos. optimizados para la interacción con el usuario. los principales fabricantes de aplicaciones eliminan la necesidad de desarrollar su . En el futuro. SQL sirve de enlace entre los sistemas informáticos visibles al usuario. Los datos sobre las transacciones empresariales (pedidos. que define el entorno operativo proporcionado por todos los principales servidores de aplicaciones de Internet. ofreciendo acceso a los datos empresariales desde las aplicaciones de las computadoras personales. SQL halló un nuevo papel a finales de los años noventa del siglo pasado como estándar de acceSO. Viendo la necesidad de enlazar el lenguaje Java con las bases de datos relacionales existentes.3 datos en Internet. incrustada en el estándar XML y las arquitecturas de servicios web. Manual de referencia Capítulo 1: Introducción 13 base de datos. JDBe recibió un impulso posterior cuando se adoptó como acceso estándar a datos en la especificación de la edición empresarial Java2 (Java2 Enterprise Edition. Integración de Java (JDBC¡ Un área importante de desarrollo de SQL en los últimos cinco o diez años ha sido la integración de SQL con Java. Sun Microsystems (los creadores de Java) presentó la Conectividad Java de bases de datos (Java Database Connectivity. y los sistemas subxacentes especializados en la gestión de las bases de datos. JDBC).e permite que cada sistema h~ga lo que mejor ~ace. Esta tendencia hacia la integración entre Java y SQL asegurará que se mantenga la importancia de SQL en la nueva era de la programación basada en Java. que siguen estando basadas en SQL. SQL también permite que las computadoras persomile1s funcionen como sistemas visibles para los servidores de red o para bases de dátos de minicomputadoras y de grandes sistemas. En los primeros tiempos del desarrollo del web. ha vuelto a crear un conjunto de «bases de datos XML» y lenguajes de consulta alternativos para desafiar a SQL. una API estándar que permite que los programas de Java utilicen SQL para el acceso a bases de datos. y utilizaron SQL como lenguaje común para las pasarelas de bases de datos.propio software de gestión de datos y pueden aprovecharse de las herramientas y de las habilidades de programación ya existentes. Soporte de aplicaciones empresariales Todas las aplicaciones empresariales de gran tamaño que asumen la operativa diaria de las grandes empresas y organizaciones utilizan bases de datos basadas en SQL para almacenar y organizar los datos. Los fabricantes de bases de datos basadas en SQL han respondido a este reto ampliando y mejorando ._ La última ola de la tecnología orientada a objetos. J2EE). Más recientemente la aparición de arquitecturas de Internet de tres capas con capas delgadas diferenciadas de clientes. niveles de inventarios. servidores de aplicaciones y servidores de bases de datos ha asentado 3 SQL como enlace estándar entre las capas de aplicaciones y de bases de datos. En este papel. Como cada una de las principales aplicaciones empresariales necesita una base de datos basada en SQL para operar. La historia pasada parece sugerir que las extensiones de SQL basadas en XML y el modelo relacional volverán a superar este reto y a asegurar que se mantenga la importancia de SQL. clientes.) tienden a tener un formato estructurado de registros y de campos. lo que permite que las bases de datos se adapten a los requisitos cambiantes mientras las aplicaciones en línea siguen funcionando sin interrupción. se han constituido en una alternativa más popular que las bases de datos «sólo orientadas objetos» y han perpetuado el dominio de SQL durante la última década.12 SOL. y sus fundamentos basados en estándares. 10 que permite que se utilice Java como lenguaje para los procedimientos almacenados y la lógica empresarial dentro de las propias bases de datos. que se convierte con facilidad en el formato de filas y columnas de SQL. etc. lentamente SQL para incluir características orientadas a objetos. por tanto. Al crear las aplicaciones para utilizar bases de datos de SQL de tipo empresarial. Acceso a bases de datos en Internet Con la reciente popularidad de Internet y de WorId Wide Web. 10 qu. que impedían el acceso a las bases de datos mientras se modificaba su estructura. importes de las ventas. el papel de SQL en Internet se ampliará más allá de las arquitecturas de los sitios web para incluir la gestión de datos para las aplicaciones colaboradoras y los objetos distribuidos en una arquitectura de servicios web. Arquitectura cliente/servidor SQL es un vehículo natural para la implementación de aplicaciones mediante una arquitectura distribuida cliente/servidor. las ventas de aplicaciones empresariales g-eneran de manera automática una demanda inducida de nuevas copias de software de bases de datos. Estas bases de datos «relacionales orientadas a objetos». la máxima flexibilidad. Además de su papel como lenguaje de programación desde el que se utilizan bases de datos. SQL ofrece. importes de pagos.

almacena la información siguiente: • • • • d~tos Los clientes que compran los productos de la compañía. Una base de datos simple Los ejemplos de la introducción rápida se basan en una base de datos relacional simple para una pequeña compañía de distribución. es un modelo del «mundo reah). como la mayoría. cancelan y modifican los pedidos. Las oficinas comerciales en que trabajan esos representantes. La base de datos. optimización y ajuste de rendimiento de SQL. conviene desarrollar una perspectiva global del lenguaje y del modo en que trabaja. Los representantes que venden los productos a los clientes. pedidos.14 SOL. al igual que las herramientas para informes. CAPíTULO 2 Una introducción a SOL Antes de sumergirnos en los detalles de SQL. Los pedidos realizados por esos clientes. las herramientas para introducción de datos. tendrá más bien una familiaridad básica con el lenguaje SQL y una visión general de sus posibilidades. para resolver problemas de gestión de datos la solución más sencilla. En pocas palabras. Este capítulo contiene una introducción rápida a SQL que ilustra sus principales características y funciones.1. cuando se contrata y se despiden representan· tes. Manual de referencia Infraestructura de la industria Quizás el factor más importante de los que han contribuido a la creciente importancia de SQL sea la aparición de toda una infraestructura de la industria informática basada en SQL. cuando los clientes realizan. almacena la información necesaria para implementar una pequeña aplicación de procesamiento de pedidos. A continuación se verá ]a manera en que se puede utilizar SQL para manipular los datos. Otra parle importante son los servicios de formación y de soporte que giran alrededor de SQL y que ayudan a conferir y perpetuar la eficacia en SQL. Las aplicaciones empresariales que utilizan SQL y necesitan bases de datos basadas en SQL son otra parte importante. ése es el objetivo de la segunda parte del libro. Específicamente. representantes y oficinas-o Hay una tabla independiente de datos para cada tipo de entidad. 15 . Los sistemas de bases de datos relacionales basados en SQL constituyen una parte importante de esta infraestructura. las herramientas de diseño. El objetivo de esta introducción rápida no es hacer que el lector sea competente en la escritura de instrucciones SQL. Una gran cantidad de programadores de SQL experimentados constituye una parte fundamental de esa infraestructura. Los almacenados en la base de datos representan entidades reales -clientes. Todas las partes de la infraestructura tienden a reforzarse entre sí y contribuyen al éxito actual de las demás partes. etc. que se muestra en la· Figura 2. Ha surgido toda una subindustria alrededor de la consultoría. Esta base de datos. Las solicitudes a la base de datos que se realizan empleando el lenguaje SQL simulan las actividades del mundo real. las herramientas de programación y un conjunto de herramientas de otros tipos que simplifican el uso de SQL. Para cuando el lector haya concluido este capítulo. de menor riesgo y de menor coste casi siempre es una solución basada en SQL.

00€ J.000.6pcz 2117 J..l/OUIno 08l0H1990 101 BIC lOS ACI loa~ '" HaO) U004 . La instrucción SELECT se emplea para todas las consultas de SQL Por ejemplo. que almacena los datos de las oficinas comerciales..00E IU. 4. 2102 Filas 2103 2t2. ..000.saO.00€ '" '" '" no '" ".A. l2.'ll._ 211J t..0oE' 40.te 20110/1986 Repr.l.00E JOO. "• "• • .00€ 735.".OO€ lS.. 11305.00E 612. 10O.00E 4S.~~ C1Wi'IDAD 112961 113012 112989 11/1211989 11/01/1990 106 RE! 105 ACI 106 FEA 2"441. tc.000.. 2101 2112 110 ACI 108 REI 0210211"0 11112119119 U/Olll990 no] :1118 2108 2l:i!4 ¡as ..1S0... 2105 AJ.745. nt~n" U/ll/B88 ".t .00E" . También mu'estra la cuota (objetivo de ventas) y el número de la oficina en que ..00€ JOO.apE: 1.. .000.042 00E: 367.OOE 105 10' 102 106 10' 101 \10 108 10l 101 '" 1un3 lU024 nH2I1989 20/0111990 2101 211t lD062 11297g 2HD2I1990 12/1011989 22/0111"0 08/0111990 0210111990 29/01/1990 04/ll/H89 2124 ~" 107 !'EA 102 ACI . 2106 F.. DoE OFICINA CIUDAD 22 o..DOE 3.00€ J6l.8U.tlt•• 1'/0611'111 12 Jef.L 21S.Dte • c:om-R. • " Ud.ro " sagaz 2109 Chen AsocIado..CIOE 21..00E: 25.978..IOO.042.DOE Tabla REPRESENTANTES J:l)I'.Dte 10H21U16 11 VI' V.00E: SO.r~'.OO~. Tabla CLIENTES OC...0OE 20ILOOO. OFICINA.000. El resultado de la consulta aparece.OO€ 2n.s 2108 Me=he " l.r. Ul!! ".911.oee " l. La instrucción de SQL que recupera los datos de la base de datos se denomina SELECT.00E: 65... " " " U JIlILI.) 04/0111989 2110211990 25/0111990 10/02119'0 31/1211989 18/0211990 02102/1990 102 REI 109 1101 I08fOSA 105 ACI 103 Ael 101 Rl:I 2USC '" me ~" 4100Y 4100X 2AUIl ~" "• .OO€ 3S0.OO€ 835..'20.. IIlPORTE J1.350.t... en forma tabular. " " " lUlOlan 21 Repu.625.100.00€ '"' ".00€ Jl. 2120 Rico S.000.000. .00€ 1.ooe 350.. "• .DOE HU 2101 2112 UOOt 41002 ?13C Ill021 lUOO? 113069 113034 112n2 ua?s lIJOSS 113048 1l299J 113065 IlJ003 11J049 112981 llJ051 1l30U 105 hel 1081HM .000. 00€ Figura 2.000. 107 210? llO 108 2118 2111 103 2108 m 2120 102 2106 2106 2108 2118 210J 2111 2113 .Onctlct Den!el l<uidrobO -.16 SOL. ~" HOO' 41002 113051 112968 2118 108 OSA 101 ACI 12110/1989 )0/0111990 113016 113045 11296] 113(1) 210. Ji-'-: s..000.0OE: 20.911.OOE 1U.~ REP CLI LIMITE CREOIl'O 50. 458.OOE J.ogO.A.00€ 20. . S . R~r••.S.n~..ooo.1.A InvenIones ".00E: 725. inmediatamente después de la solicitud.04 •.00€ 2111 nOl 41003 03/0111990 ¡O/OUU90 U.OD€ 652. sotoc:a 2122 'toledo S..-PEDIDO u.00€ 4S.) La instrucción 5ELECT pide tres fragmentos de los datos -la ciudad.S00.3 Cruz e hijos 2101 Ace lntenuleio.00€ 70l. el número de la oficina y el importe de las ventas..000.. .DOO.."~e Ol/Ol/IUl 11 22 Il. EMPIlESA 2111 JCP S. =¡..0O€ 65.OOE 10. :l50.OOE' 20. López S..OOE IrJl..000.OOG. ".00E J5.. .000.~ 12110/1'19 1510211990 10/0211990 2109 . . 2119 Salomón S ..000..00E" 30.00€ 22.000. '" Navarra Castellón Almería León 12 13 21 186.0OE 600.\':'a !l/ouau .. También especifica que todos estos datos vengan de la tabla OFICINAS. 50.67J.u 167.00e 2S..00€ 215.0OE "'.000.0OE IU..00€ 13 Almeria 21 León '"' '" '" "..000.u.. ¡ 211S Sierra.500. Esta instrucción de SQL recupera los datos deseados: SELECT CIUDAD.00€ 692.000. "..~l Bcrn.5".000.915.. (Continúa.00€ JOS.. Una base de datos relacional simple.000.ordo S.00E 150. " l..B65.OOE" 101 ¡:uw. Asociadol 2114 orion Ltd.no..00e 800.9SS. U Recuperación de datos En primer lugar se realizará un listado de las oficinas comerciales.000..OOE: 6S.OSO.n6..92S.A..00€ 1...• J.000.OOO..pr.1.h Sa: Le6<l Fnire Pablo Cru: Neus "':c.00€ 286. 2118 M"jonda Silee.OOO.042.. 2124 Pascual Henuno. . 112991 .102 REI 7?SC 2M5C 41002 2AUG 4100X 719C iln REI .. VENTAS FROM OFICINAS CIUDAD ".000 OOE" 51S.\el 108 BIc 109 FEA 2"'HR 41004 Hao] . 2112 Z"ta Ptl'duc:c:ioncs -----------Daimiel OFICINA ------22 11 ------------ VENTAS 2121 O!".n~.04200E" 692.000.J.. llfOlfl99g 21 Jaf.00E: 55.A. v¡:.(lO.915. lSO.000.CO€ J'2. a continuación se ofrece una consulta que muestra un listado de los nombres y las ventas en el año actual de cada representante que figura en la base de datos.0040 40.00E: 8J5. mostrando la ciudad en que se halla cada una y sus ventas en el año actual. aoE 652. .000..~ . ..500. '" ".de cada oficina.000. ".00E ?60. Una base de datos relacional simple. (Continuación.. ".115.8RE ~""""'1>rt_ 1.OO€ "~.P.00€ 367.OOE" VENTAS 1I16.00e 60. SantOS SaaJel Cl.637 ooe 735.000..DOE "...00€ 2.637. " OFlCll~ KV lJ ~= Repn .eoe 50.i¡nie1 11 12 NlIvarra Castellón REGIOl1 Oeaetl Esee Este Esee Qesee '" OBJE'l'IVO 300.104. 12/10/1989 n ll~rea..'12.00E 2. '" '" '" ".QoE . Manual de referencia Capítulo 2: Una introducción a SOL 17 Tabla PEDIDOS 1l\W~PEPUlO Tabla onCINAS CLIEIlTE 2117 PZC>IA.OOE 5.00E 35. '" 10> '" 2101 Ja:-an<!ll1s Ltd.no...DoE (S. '" '" '" '" Figura 2..OOE 2.000. V""u UIOS/ln7 12 Reor. '1ent.

594.0S0.912.725.775.911.·40G. sino que también puede utilizarse para resumir el contenido de la base de datos.-------- CLIENTE PRODUCTO -------4l00Y 775C 2A44L 2A44R 2103 2109 2117 2112 --------.00e: 124.OO€ l86.OO€ 300. añadiendo una comparación matemática a la solicitud anterior: SELECT NOMBRE.00€ 474. VENTAS.912.OOe: 200.406.OOe: 305.00€ 186..958. Manual de referencia Capítulo 2: Una introducción a SOL 19 trabaja cada uno.OO€ 300. 000.18 SQL. OOO.00e: 275. CUOTA.865. 00e: Bruno Arteaga 392.CUOTA) Finalmente. VENTASREPS: SELECT NOMBRE.000.OOe: 300. (VENTAS .000.0S0.OO€ 350.S00.OO€ -57.042. VENTAS.958.985.00€ 142. se averiguará el valor total de los pedidos realizados por cada cliente. PEDIDOS IMPORTE> 25000.865. IMPORTE FROM VENTASREPS NOMBRE ---------------.000. el producto que se solicitó y la cantidad que se pidió. Esta solicitud pide a SQL que examine todos los pedidos y averigüe su importe promedio: SELECT AVG(IMPORTE) FROM PEDIDOS AVG(IMPORTE) 8.50e: Los datos solicitados (incluida la diferencia entre las ventas y la cuota de cada representante) vuelven a aparecer en una tabla de filas/columnas.042.OO€ 75.G73.912.OO€ 299.-----------.OO€ 361.----------11 22 7 CANTIDAD IMPORTE 10 27. los datos provienen de la tabla de representantes siguiente.OO€ BY IMPORTE PRODUCTO.OO€ VENTAS CUOTA (VENTAS-CUOTA) Maria Jiménez Susana Santos Samuel Clavel Bernardo Sánchez Daniel Ruidrobo Tomás Saz León Freire Pablo Cruz Neus Azcárat.98S.00e: 350.0S0.En este caso.775.00€ 275. CLIENTE. FROM VENTASREPS NOMBRE CUOTA.256.CUOTA) Resumen de datos SQL no sólo recupera de la base de datos fragmentos individuales de datos.000.00€ 24.91l.00€ 1l.000.00e: SQL también permite que se soliciten resultados calculados.e También se podría pedir el tamaño promedio de los pedidos de un cliente concreto: SELECT AVG(IMPORTE) FROM PEDIDOS WHERE CLIENTE = 2103 AVG(IMPORTE) 8.000. 00e: 5.QO€ 474.673.500.OO€ 361.00€ 367. se puede pedir a SQL que calcule el importe en que cada representante supera su cuota o está por debajo de ella: SELECT NOMBRE.OO€ 286. FROM VENTASREPS WHERE VENTAS < CUOTA NOMBRE Bernardo Sánchez Neus Azcárate VENTAS 142.-----------13 11 21 11 12 12 NULL 21 12 22 REP_OFICINA VENTAS Bruno Arteaga María Jiménez Susana Santos Samuel Clavel Bernardo Sánchez Daniel Ruidrobo Tomás Saz León Freire Pablo Cruz Neus Azcárate 367.OOe: 300.000.OOe: 300. OOO.00€ 286. 000.000.OO€ -113.00€ 31. SQL permite recuperar esa clase de información selectiva muy fácilmente.OO€ 7S.00€ -1l3.775.OOe: 275. VENTAS.OOe: 92.OO€ NULL 350.-----------.-----------.00e: 3S0.OOe: 300.725.6i3.OO€ NULL 350.000.000.594. REP_OFICINA.OOe: 186. CANTIDAD. Por ejemplo.OO€ NULL 11.895.865.OO€ 300. Se desea averiguar el tamaño promedio de los pedidos de la base de datos. CUOTA Se puede utilizar la misma técnica para obtener un listado de los grandes pedi~ dos incluidos en la base de datos y averiguar el cliente que realizó cada pedido.OO€ 30S.37€ ---------------.000.OO€ 392. Para ello se puede pedir a SQL que agrupe los pedidos por número de cliente y luego sume Jos pedidos de cada -cliente: SELECT CLIENTE.042.350.00€ 4S.000.911.00€ 275.72S.594.000.OO€ 200. SUM(IHPORTEj FROM PEDIDOS GROUP BY CLIENTE CUOTA (VENTAS-CUOTA) 200.OO€ CUOTA NUM_PEDIDO 112987 113069 112961 113045 ----------.00€ (VENTAS .000.000.OO€ 142.OO€ -57 .99.000.--------------17.000. También se puede pedir a SQL que ordene los pedidos de acuerdo con su importe: SELECT FROM WHERE ORDER NUM_PEDIDO.00€ 2. Quizás se prefiera centrar la atención en los representantes cuyas ventas son menores que sus cuotas.OO€ -----------350.00e: 31.OO€ .

OO€ 23. 'Oeste'.QO€ 3. Eliminación de datos Al igual que la instrucción de SQL INSERT añade datos nuevos a las bases de datos.132. A continuación puede verse la instrucción INSERT que añade la nueva oficina a la base de datos. VALUES ('Daganzo'.00.000 €. esta instrucción UPDATE eleva la cuota de todos los representantes en 15.925.60S. no ha sido autorizada con anterioridad a introducir en la base de datos los datos de los clientes nuevos.D82.350. la siguiente instrucción de SQL da a María permiso para actualizar y para recuperar datos de los clientes con la instrucción SELECT: GRANT UPDATE. la instrucción de SQL DELETE elimina datos de las bases de datos. NUM_CLI. María. VENTAS.OO€ 4.00. 23) 1 fila insertada.978.255. Por ejemplo.000 €.00 8 filas actualizadas. OFICINA) La instrucción UPDATE también puede realizar de manera simultánea varias modificaciones en la base de datos.582.QO€ 31. 25000. REP_CLI. Esta instrucción de SQL le concede ese permiso: GRANT INSERT ON CLIENTES TO MARIA Privilegio concedido. supóngase que se acaba de abrir una oficina comercial regional Oeste en Daganzo.OO€ 3. Protección de datos Un papel importante de las bases de datos es proteger los datos almacenados del acceso por usuarios no autorizados.458.OO€ 2 filas eliminadas.500. Por ejemplo. OBJETIVO.026. habría que utilizar la instrucción de SQL UPDATE: UPDATE CLIENTES SET LIMITE_CREDITO = 75000.00 WHERE EMPRESA = 'Filas' 1 fila actualizada.OO€ 22. 2125.OO€ 7. Por ejemplo. Si Acme Industrial decide pasarse a la competencia unos días más tarde. como oficina número 23: INSERT INTO OFICINAS (CIUDAD.OO€ Capítulo 2: Una introducción a SOL 21 CLIENTE 2101 2102 2103 2106 2107 2108 y si se decide despedir a todos los representantes cuyas ventas sean inferiores a sus cuotas. 109. Por ejemplo. si María Jiménez (número de empleado 109) suscribe a un nuevo cliente. 275000.000 €: UPDATE REPRESENTANTES SET CUOTA = CUOTA + 15000. se pueden eliminar de la base de datos con la instrucción DELETE: DELETE FROM REPRESENTANTES WHERE VENTAS < CUOTA 3. con un objetivo de' ventas de 275.QO€ Adición de datos a la base de datos También se puede utilizar SQL para añadir datos nuevos a la base de datos.OO€ 31. esta instrucción INSERT añade el cliente a la base de datos como cliente número 2125 con un límite de crédito de 25. SELECT ON CLIENTES TO MARIA Privilegio concedido. 0.OO€ Actualización de la base de datos También se puede utilizar SQL para modificar los datos que ya se hallan almacenados en la base de datos.20 SOL. Acme Industrial.10Q. se puede eliminar de la base de datos la información de cliente de Acme con esta instrucción: DELETE PROM CLIENTES WHERE COMPANY = 'Acme Industrial' 1 fila eliminada.QO€ 47.QO€ 35. para aumentar el límite de crédito de Filas a 75.S00. De manera parecida. Manual de referencia SUM(IMPORTE) 1.445. De manera parecida.Oü€ 22. 2117 2118 2120 2124 3. LIMITE_CREDITO) VALUES ('Acme Industrial'.000 €: INSERT INTO CLIENTES (EMPRESA. REGION.00) 1 fila insertada. .750. 2109 2111 2112 2113 2114 6. supóngase que la secretaria.

La cantidad actualmente en inventario. DESCR!PCION. Creación de bases de datos Antes de poder almacenar datos en una base de datos hay que definir la estructura de los datos. A continuación se ofrece una instrucción INSERT para un nuevo envío de 250 cables de la serie 7 (producto ACI-410Q7). CREATE TABLE Resumen Esta introducción rápida a SQL ha mostrado lo que puede hacer SQL y ha ilustrado el estilo del lenguaje SQL. . Una descripción del producto de treinta caracteres como máximo. Se pueden recuperar todos los datos almacenados o sólo parte de ellos. empleando la instrucción SELECT. PRECIO. utilizando ocho de las instrucciones de SQL empleadas con más frecuencia. Aun~ue más críptica que los ejemplos anteriores de instrucciones de SQL.: El fonnato numérico que acepta la mayoría de SGBD para la entrada de datos interactiva con SQL es el anglosajón. I N. • Se puede utilizar SQL para actualizar la base de datos. se pueden rellenar con datos. que cueslan 225. la instrucción REVOKE revocará todos los privilegios de María para cualquier tipo de acceso a los datos de los clientes: REVOKE ALL ON CLIENTES FROM MARIA Finalmente. 225. Tabla eliminada. Para cada producto los datos que hay que almacenar son los siguientes: • • • • • Un código de identificación del fabricante de tres caracteres. STOCK INTEGER) y REVOKE. Supóngase que se desea ampliar la base de datos de ejemplo añadiendo una tabla de datos de los productos que vende la empresa.22 SOL. si se descu. la instrucción CREATE TABLE sigue siendo bastante directa. 'Serie 7 cable'. se puede eliminar la tabla (y todos los datos que contiene) con la instrucción DROP TABLE: DROP TABLE PRPDUCTOS Privilegio revocado. PRECIO MONEY. • Se puede utilizar SQL para crear la base de datos definiendo la estructura de nuevas tablas y eliminando tablas cuando ya no resultan necesarias utilizando las instrucciones CREATE y DROP. ordenarlos y pedir a SQL que resuma los datos empleando totales y promedios. Asigna el nombre PRODUCTOS a la nueva tabla y especifica el nombre y el tipo de los datos almacenados en cada una de sus cinco columnas. (ID_FAB. El precio del producto. 250) 1 fila insertada. Para resumir: • Se puede utilizar SQL para recuperar datos de la base de datos. • Se puede utilizar SQL para controlar el acceso a la base de datos. ID_PRODUCTO CHAR(Sl. Tabla creada.bre posteriormente que ya no hace falta almacenar los datos de los productos en la base de datos. STOCK) '41007'. eliminando datos con la instrucción DELETE y modificando los datos existentes con la instrucción UPDATE. Una vez creada la tabla.00.00 € cada unidad ': INSERT INTO PRODUCTOS VALUES ('ACI'. De manera parecida. . los millares separados por comas y la parte fraccionaria por puntos. DESCRIPCION VARCHAR(20l. concediendo y revocando privilegios para usuarios concretos con las instrucciones M La instrucción de SQL los datos de Jos productos: define una nueva tabla para almacenar GRANT CREATE TABLE PRODUCTOS (ID_FAB CHAR(3). es decir. ID_PRODUCTO. Manual de referencia Capítulo 2: Una introducción a SOL 23 Si ya no se permite a María añadir clientes nuevos a la base de datos. Sin embargo. el formato de la respuesta sí se puede adaptar en algunos SGBD. la instrucción REVQKE se lo impedirá: REVOKE INSERT ON CLIENTES FROM MARIA Privilegio revocado. añadiendo datos nue vos con la instrucción INSERT. por lo que las respuestas se muestran en este libro según el convenio numérico en español. Un código de identificación del producto de cinco caracteres. del T.

CAPíTULO 3 SOL en perspectiva SQL es a la vez un lenguaje estándar defacto y un lenguaje estándar oficial para la gestión de bases de datos. Los sistemas gestores de bases de datos. Aunque los sistemas gestores de bases de datos se desarrollaron en primer lugar en los grandes sistemas informáticos. las minicomputadoras y Jos grandes sistemas? Para responder a estas preguntas este capítulo sigue la historia de SQL y describe su papel actual en el mercado informático. su popularidad se extendió rápidamente a las minicomputadoras y. posteriormente. a las computadoras personales y a las estaciones de trabajo. SOL Y la gestión de bases de datos Una de las tareas principales de los sistemas informáticos es almacenar y gestionar datos. Los años ochenta y noventa del siglo pasado vieron la explosión de un nuevo modelo cliente/servidor para el acceso a bases de dalOs. las redes de área local. Para realizar esta tarea comenzaron a aparecer programas informáticos especializados conocidos como sistemas gestores de bases de datos a finales de los años sesenta y comienzos de los setenta del siglo pasado. La gestión de bases de dalOs ha desempeñado también un papel fundamental en la explosión de las redes informáticas y de Internet. ¿Qué significa que SQL sea un estándar? ¿Qué papel desempeña SQL como lenguaje de bases de datos? ¿Cómo llegó SQL a ser un estándar y qué repercusión está teniendo el estándar SQL en las computadoras personales. Hoy en día. o SGBD. en los que la información. el software de gestión de bases de datos y el usuario o la aplicación que tenían acceso a la base de datos operaban lodos en el mismo sistema. muchos sistemas gestores de bases de datos operan en compuladoras servidoras especializadas. Los primeros sistemas de bases de datos se ejecutaban en grandes sislemas informáticos monolíticos. en el cual un usuario o un programa de aplicación que se ejecute en una computadora personal tienen acceso 25 . ayudaban a los usuarios a organizar y estructurar los datos y permitían que el sistema informático desempeñara un papel más activo en la gestión de los datos.

Cad(! (<<Ted»). IBM anuncia DB2. Por primera vez se distribuyen productos ODBC. Sybase introduce SGBDR para el procesamiento de transacciones. a su v. el Dr. SFA) y las aplicaciones financieras. Las compañías de software independientes y los fabricantes de computadoras facturan miles de millones de euros cada año en productos de gestión de bases de datos. y se emplean para capturar y analizar las interacciones de los usuarios con los sitios web. Los principales fabricantes de SGBD anuncian estrategias de integración de Java. está conectado a un tercer sistema que ejecuta el sistema gestor de bases de datos.26 SOL. y presentan muchas ventajas respecto de los tipos anteriores de bases de datos. Se ratifica el estándar ANSI SQLl. no sólo dentro de sus propias organizaciones. SCM). E. Se publica la primera prueba de rendimiento TPC (TPC-A). La inmensa mayoría de las aplicaciones informáticas de tipo empresarial que acogen la operativa diaria de las grandes empresas y de otras organizaciones utiliza bases de datos. Los fabricantes de computadoras desarroll?n y venden computadoras servidoras que se hallan configuradas específicamente como servidores de bases de datos. Se publica la especificación de acceso a bases de datos SQL Access Group. El concepto de base de datos relacional fue desarrollado originalmente por el Dr. Tabla 3. ERP). Las bases de datos proporcionan la inteligencia que sustenta la mayor parte de los sitios web orientados a transacciones. los usuarios necesitan poco más que un explorador web para tener acceso a las bases de datos e interactuar con ellas. Desde fines de los años ochenta se ha hecho tan popular un tipo específico de SGBD. un investigador de IBM. Microsoft introduce SQL Server 2000. superando a Oraele. la Gestión de relaciones con los clientes (Customer Relationship Management. Codd publicó un artículo titulado «A Relational Model of Data for Large Shared Data . CRM). Oracle Si ofrece integración entre las bases de datos e Internet y rompe con el modelo cliente/servidor. La Tabla 3. Orade introduce el primer SGBDR comercial. Por primera vez se distribuyen sistemas de almacenamiento de datos SQL especializados. la Gestión de la cadena de suministros (Supply Chain Management. Se publica la prueba de rendimiento TPC-C (OLTP). Se ratifica el estándar ANSI SQL2 (SQL-92). sino en todo el mundo. A fines de los años noventa. SQL es específicamente un lenguaje para bases de datos relacionales empleado para trabajar con bases de datos relacionales. Microsoft publica la especificación ODBC. Relational Technology introduce Ingres. conectada a un segundo sistema que ejecuta un programa de aplicación o servidor de aplicaciones.de millones de euros al año. Microsoft SQL Server 7 ofrece soporte de bases de datos para Windows NT en ámbito empresarial. dirigido a las aplicaciones empresariales. Actualmente. J2EE estandariza el acceso IDBe a bases de datos desde los servidores de aplicaciones. IBM comienza el proyecto System/R. Gartner clasifica a IBM como primer fabricante de bases de datos. Se distribuyen por primera vez productos comerciales de bases de datos residentes en memoria. Se publican el API estándar para el acceso OLAP a bases de datos y la prueba de rendimiento OLAP. Se publica el primer artículo que describe el lenguaje SEQUEL. La gestión de bases de datos se vincula de este modo a todos los segmentos del mercado informático. Hitos en el desarrollo de SOL Fecha Evento Codd define el modelo relacional de bases de datos. Hoy en día la gestión de bases de datos es un negocio enorme. la Automatización de la fuerza de ventas (Sales Force Automation. Se publica la prueba de rendimiento TPC-B. Entre estas aplicaciones se hallan algunas de las categorías de aplicaciones de crecimiento más rápido. Se realizan pruebas de SystemlR con clientes. F. Oracle introduce servidores de aplicaciones con caché integrada de bases de datos. 1970 1974 1974 1978 1979 1981 1981 1982 1983 1986 1986 1987 1988 1989 1990 1991 1992 1992 1992 1993 1993 1994 1996 1997 1997 1998 1998 1998 1999 2000 2000 2001 2001 2002 el Una breve historia de SOL La historia del lenguaje SQL se halla íntimamente vinculada al desarroll9 de las bases de datos relacionales.1 muestra algunos de los hitos en sus treinta años de historia. Ashton-Tate y Microsoft anuncian SQL Server para OS/2.ez. que es la forma estándar de bases de datos. denominado sistema gestor de bases de datos relacionales (SGBDR). la creciente popularidad de Internet y del World Wide Web entrelazaron aún más los ámbitos de las redes y de la gestión de datos. IBM adquiere el negocio de bases de datos de Informix. La posibilidad de integración de XML aparece en los principales productos SGBDR. IBM anuncia SQUDS. En Junio de 1970. A menudo estas arquitecturas basadas en Internet implican tres o más sistemas informáticos diferentes -una computadora que ejecuta el explorador web e interactúa con el usuario. como la Planificación de recursos empresariales (Enterprise Resource Planning. Se ratifica el estándar ISO SQLl. UDB DB2 de IBM unifica la arquitectura DB2 para las plataformas de IBM y de otros fabricantes. ANSI forma el comité para estándares de SQL. estos sistemas constituyen por sí mismos un mercado de varios miles . Las bases de datos relacionales organizan los datos de una manera sencilla. Manual de referencia Capítulo 3: SOL en perspectiva 27 a una base de datos de un sistema informático diferente mediante una red. que. tabular. Se distribuye comercialmente tecnología paralela de servidores de bases de datos.1.

prueba del dominio del mercado del estándar SQL. acrónimo de Lenguaje estructurado de consulta en inglés (Slruelured English Query Language). pero su rivalidad ayudó a llamar la atención hacia la tecnología de las bases de datos relacionales en esta etapa inicial. que competía contra las posibilidades basadas en SQL (y las agresivas estrategias de mercadotecnia y de ventas) de Grade. incluido un importante proyecto de investigación de IBM. así como muchas de las compañías emergentes de bases de datos orientadas a objetos. se había renombrado como SQL. que apareció en Communicarions o/ the AssociatiolJ for CompUling Machinery (<<comunicaciones de la aso~ ciación de maquinaria informática»). California. con ventas anuales de muchos miles de millones de euros. denominado System/R. En 1983.. En 1983. era comprobar la operatividad del concepto relacional y proporcionar experiencia en la implementación real de un SGBO relacional El trabajo en SystemIR comenzó a mediados de los años setenta en los laboratorios Santa Teresa de IBM en San José. la tecnología Ingres se había vendido a Computer Associates. que esbozaba una teoría matemática del modo en que se podían almacenar y manipular los datos empleando una estructura tabular. otro SGBD relacional para sus grandes sistemas. Gracle se adelantó dos años Los primeros años El artículo de Codd desató un frenesí de investigación en bases de datos relacionales. la primera fase del proyecto System/R produjo un prototipo mínimo de SGBD relacional. Hoy en día Oracle Corporation es el principal fabricante de sistemas gestores de bases de datos relacionales. Manual de referencia Capítulo 3: SOL en perspectiva 29 Banks» (<<Un modelo relacional de datos para grandes bancos de datos compartidos»). Muchos de los expertos actuales en bases de datos debe!1 su vinculación a las bases de datos relacionales al proyecto Ingres de Berkeley. que consideraron que la investigación de IBM presagiaba un mercado comercial para las bases de datos relacionales. era menos similar al inglés. En 1976 y 1977 el prototipo de investigación de System/R se volvió a escribir desde el principio. El objetivo del pro. crearon un prototipo de SGBD relacional y denominaron Ingres a su sistema. acabó cambiando su nombre por el de su producto insignia. La implementación de SystemIR se distribuyó a varios sitios clientes de IBM para su evaluación en 1978 y 1979. Estos primeros sitios clientes proporcionaron experiencia de usuarios reales Con System/R y su lenguaje de bases de datos. propiedad de IBM). e IBM concluyó que las bases de datos relacionales no sólo eran factibles. Relational Software. que resultaban menos caras que los grandes sistemas de IBM. para crear una versión comercial de Ingres. Al igual que el equipo de investigación de mM. la pronunciación inglesa SEQUEL se mantuvo. Pese a su superioridad técnica en muchos aspectos. Los profesores de los laboratorios informáticos de Berkeley de la Universidad de California también estaban investigando en las bases de datos relacionales a mediados de los años setenta. Los primeros productos relacionales El proyecto SystemIR y su lenguaje de bases de datos SQL se dieron a conocer con detalle en las revistas técnicas durante los años setenta. el cual. El proyecto lngres incluía un lenguaje de consultas. un sistema operativo que se empleaba con frecuencia en los grandes sistemas de IBM en las aplicaciones de los centros informáticos empresariales. En 1974 y 1975. y un importante fabricante de aplicaciones empresariales basadas en la base de datos Orade. O Lenguaje estructurado de consultas (Structured Query Language). En 1977 formaron una Productos de IBM Mientras Oracle e Ingres corrían a convertirse en productos comerciales. logres se convirtió en un claro jugador de segundo nivel en este mercado. para crear un SGBD relacional basado en SQL. uno de los principales fabricantes de software para grandes sistemas. IBM anunció SQU DS en 1981 y comenzó a distribuir el producto en 1982. En 1980. denominado Oracle. Inc. se distribuyó en 1979 y se transformó en el primer SGBD relacional disponible comercialmente. La empresa vendió agresivamente las ventajas del nuevo estilo relacional de gestión de bases de datos y. sino que podían ser la base de un producto comercial útil. finalmente. El producto. Ingres y Oracle se convirtieron rápidamente en grandes rivales. La publicidad de System/R atrajo la atención de un grupo de ingenieros de Menlo Park. Ine. IBM anunció una versión de SQLIDS para VMlCMS. denominado SQUData System (SQUDS). Además del propio SGBD. En 1979 el proyecto de investigación System/R llegó a su final. y continúa usándose hoy en día. que. aunque más estructurado que SQL. que . Los seminarios sobre tecnología de bases de datos ofrecían debates sobre las ventajas del nuevo y herético modelo relacional. El lenguaje QUEL original fue sustituido de manera efectiva por SQL en 1986. DB2 operaba bajo el sistema operativo MVS de IBM. Los orígenes de las bases de datos relacionales y SQL se remontan a este artículo.. que se anunció en 1981. por motivos . Hacia 1976 parecía evidente que IBM se estaba entusiasmando con la tecnología relacional de bases de datos y que estaba estableciendo un importante compromiso con el lenguaje SQL. incluidos los fundadores de Sybase e IlIustra (actualmente. denominado QUEL.legales. empresa. el proyecto SystemlR incluía el trabajo en los lenguajes de consulta a bases de datos. yecto. Hacia mediados de los noventa. el proyecto System/R de IBM también se había convertido en un esfuerzo por crear un producto comercial. enteros al primer producto que comercializó IBM y se ejecutaba en las minicomputadoras VAX de Digital.28 SOL. Pese al cambio de nombre. Uno de estos lenguajes se denominó SEQUEL. California. IBM introdujo también Database 2 (DB2). varios profesores abandonaron Berkeley y fundaron Relational Technology. La nueva implementación soportaba consultas multitabla y permitía que varios usuarios compartieran el acceso a los datos.

DB2 y SQUDS también se aceptaron poco a poco y contaron sus instalaciones combinadas'en poco más de mil sitios. Manual de referencia . desventajas en relación con las arquitecturas tradicionales de bases de datos. y los empleados de IBM la saludaron como una pieza estratégica de la tecnología de software de lBM. SQL pasó a constituir una parte fundamental de la arquitectura cliente/servidor que utilizaban las computadoras personales. en centenares de millones de euros. Los ingresos anuales totales de las bases de datos orientadas a objetos se miden. DB2 se ha convertido desde entonces en la insignia de los SGBD relacionales de IBM. Una segunda tendencia importante fue la incorporación a SQL de nuevos tipos de datos (como los datos multimedia) y los principios de orientación a objetos. sus clases. lngres y Oracle. 'Otro . Aceptación comercial Durante la primera mitad de los ochenta. La primera versión de DB2 comenzó a distribuirse en 1985. como mucho. especialmente para las computadoras personales y sus interfaces gráficas de usuario. sus herramientas y sus servicios generan decenas de miJes de millones de euros al año. Y. mientras que SQL y los sistemas de bases de datos relacionales. y los fabricantes de bases de datos para minicomputadoras bajaron un nivel del mercado para competir en el mercado emergente de las redes de área local de computadoras personales. Los productos relacionales. Los fabricantes de bases de datos para pe adoptaron SQL como la solución para estas necesidades. En 1997. las bas~s de datos relacionales tendían a ejecutarse en minicomputadoras. los fabricantes de bases de datos relacionales luchaban por conseguir la aceptación comercial de sus productos. Los produc:tos relacionales presentaban varias. desde las computadoras personales a los servidores de red y los grandes sistemas. Finalmente. SQL también se afianzó como estándar en los sistemas informáticos basados en UNIX. A finales de los años noventa.30 SOL. En los primeros años novema del siglo pasado las implememaciones de SQL que mejoraban poco a poco y las espectaculares mejoras de las velocidades de los procesadores hicieron de SQL una solución práctica para las aplicaciones de procesamiento de transacciones. proclamando su superioridad sobre el competidor y un rendimiento doble o triple que el de la versión anterior. cuando adquirió el negocio de bases de datos de Informix y. Hacia mayo de 1985. Las mejoras de la potencia de procesamie~to del hardware informático subyacente también ayudaron a mejorar el rendimiento. La supremacía de SQL en el mundo de las bases de datos no se ha librado de desafíos. en especial. el enfoque «un·tamaño-sirve-para-todos» dio muestras de agotamiento. tenían una ventaja importante. Uno de los segmentos de crecimien· to más rápido fueron los almacenes de datos. fueron necesitando una gestión de bases de datos más sofisticada. especialmente. filas y columnas de datos. SQL y el modelo relacional superaron con creces el reto. y algunas encuestas a usuarios lo colocan realmente en primer lugar. salvo los productos de 1BM. las bases de datos relacionales procedían de pequeños fabricantes emergentes. IBM incrementó su promoción de SQL. IBM es el segundo fabricante más importante de software de gestión de bases de datos. anunciando versiones de DB2 para sistemas informáticos fabricados por Sun Microsystems. LAN). IBM dio otro paso en su estrategia multiplataforma en 200 1. situando a DB2 como la solución de gestión de datos para los años noventa. A medida que SQL creció para abordar una variedad cada vez mayor de tareas de gestión de datos. el lenguaje SQL de DB2 se convirtió en el lenguaje de bases de dalos estándar de facto. en lugar de en los grandes sistemas de 1BM. El rendimiento de los productos de bases de datos relacionales mejoró espectacularmente. IBM llevó aún más allá la estrategia multiplataforma de DB2. Sin embargo. un poco por delante de Oracle en cuota de mercado. la programación orientada a objetos se había implantado como el método preferido para el desarrollo de aplicaciones. Hewleu-Packard y otros competidores de IBM en hardware. A medida que las computadoras personales se hacían más potentes y se conectaban en redes de área local (local area networks. En consecuencia. Surgió una nueva generación de empresas de «bases de datos orientadas a objetos» apoyadas por capital de riesgo que deseaban dejar obsoletas las bases de datos relacionales y a sus fabricantes. Oracle proclamó con orgullo que tenía más de mil instalaciones. Las fuerzas del mercado también fomentaron la popularidad de SQL a fines de los años ochenta del siglo pasado. con sus objetos. al igual que había hecho SQL con los fabricantes no relacionales anteriores. cuya popularidad se aceleró en los años ochenta. Surgieron sistemas especializados de bases de datos para dar soporte a diferentes necesidades del mercado. dieron un paso de gigante con cada nueva versión. La tecnología DB2 se ha migrado actualmente a todas las líneas de productos de IBM. La publicación del estándar ANSI/ISO para SQL en 1986 otorgó estatus oficial a SQL como estándar. Excepto los productos de IBM. en los que se utilizaban las bases de datos para buscar entre cantidades enormes de datos y descubrir las tendencias y los patrones subyacentes. A principios de los años noventa. sin embargo. lngres se instaló en un número de sitios comparable. la base instalada de Informix en servidores basados en UNIX que no son de IBM. Un tercer segmento de importancia fueron las bases de datos móviles para las computadoras personales portátiles que podían operar tanto conectadas como desconectadas de un sistema centralizado de bases de datos.Capítulo 3: SaL en perspectiva 31 era el burro de carga utilizado en los grandes centros de procesamiento de datos de los grandes sistemas. En la segunda mitad de los años ochenta del siglo pasado SQL y las bases de datos relacionales se aceptaron rápidamente como la tecnología de las bases de datos del futuro. la gestión de bases de datos ya no era un mercado monolítico. las bases de datos relacionales comenzaron a convertirse poco a poco en aplicaciones de centros informáticos como herramientas de soporte de decisiones. no proporcionaba un encaje ideal con el modelo relacional de tablas. las redes de área local y los servidores de red para crear sistemas de procesamiento de información mucho más económicos. y con el peso de IBM tras él. Sus lenguajes de consultas relacionales (SQL. El modelo de objetos. QUEL y otros) permitían a los usuarios formular consultas ad hoc a la base de datos -y obtener respuestas inmediatassin necesidad de escribir ningún programa. Según la mayor parte de los analistas de la industria. sus métodos y su herencia.

suele denominarse SQL-89 o estándar SQLI. El estándar SQL2 superó el proceso de aprobación de ANSI y se aprobó definitivamente en octubre de 1992. que tiene una cuota de mercado dominante en cuanto a base instalada.sus dialectos de SQL y se apartan más del estándar. hay otros estándares importantes de SQL. y el dialecto de SQL de Oracle. El nivel de cumplimiento más bajo (nivel inicial) sólo exige una capacidad adicional mínima respecto del estándar SQL-89. FIPS). cada uno de los cuales implementaba un dialecto de SQL ligeramente diferente. como los equipos de red. Donde se podía lograr sin dañar a los clientes o a las características ya existentes los fabricantes han adaptado sus productos para que cumplan con el estándar SQL-89. Tras varias revisiones el estándar se adoptó oficialmente como estándar ANSI X3. Sin embargo. Las bases de dalos residentes en la memoria se establecieron como otro segmento. en la práctica los productos comerciales de SQL más populares no implementan completamente la especificación SQL2. de lB M. SQL2. el núcleo central del lenguaje SQL se ha estandarizado bastante. el estándar SQL2 (denominado oficialmente SQL-92) ocupa cerca de seiscientas páginas. los estándares propuestos SQL2 y SQL3 resultaron mucho más polémicos que el estándar SQL inicial. los borradores de SQL2 especificaban características muc'ho más allá de las halladas en los productos SQL comerciales en vigor.135 en 1986. Sin embargo. . a medida que los fabricantes de bases de datos introducen nuevas posibilidades. . bastante parecidos el1lre sí. aunque contenía algunas diferencias importantes respecto de DB2. A lo largo de las seiscientas páginas del estándar la descripción de cada característica incluye una definición de los aspectos concretos de esa característica que deben soportarse para conseguir un cumplimiento inicial. Este estándar. pero que evita los aspectos más complejos y la mayoría de los problemas dependientes del sistema y de las marcas de SGBD. En principio el comité debatió las ventajas de los diversos lenguajes de bases de datos propuestos. El comité de estándares de SQL2 reconoció el gran avance logrado desde SQLI hasta SQL2 creando explícitamente tres niveles de cumplimiento de los estándares de SQL2. Muchos de los integrantes de los comités de estándares de ANSI y de ISO eran representantes de los fabricames de bases de datos que tenían productos SQL ya existentes. El estándar ANSI para SQL resultante se basaba principalmente en SQL de DB2. el comité seleccionó SQL como lenguaje para las . Se propusieron incluso más modificaciones de gran alcance para un posterior estándar SQL3. A medida que la industria informática se prepara para este nuevo siglo. Siguen surgiendo nuevos reto"s -las bases de datos basadas en el Lenguaje extendido de marcas (eXtended Markup Language. El gobierno estadounidense ha adoptado desde entonces el estándar ANSI/ISO como Estándar federal para el procesamiento de la información (Federalln/ormatioll Processing Standard. El tercer nivel de cumplimiento (completo) exige una implementación completa de todas las posibilidades de SQL2. y no hay dos productos comerciales de SQL que soporten exactamente el mismo dialecto de SQL. Los estándares ANSI/ISO El trabajo en el estándar oficia! de SQL comenzó en 1982.amente revisado y ampliado en 1989. el dominio de SQL como el estándar de bases de datos sigue siendo muy fuerte. Estas decisiones permitieron que las implememaciones ya existentes de SQL proclamaran una gran adhesión al estándar ANSI/ISO resultante. los borradores de estándares intentaban estandarizar oficialmente panes del lenguaje SQL en que las diferentes Imarcas de SGBD habían definido diferentes estándares propietarios desde hacía mucho tiempo. En consecuencia. Además. Estándares de SaL Uno de los desarrollos más importantes en la aceptación de mercado de SQL es la aparición de estándares de SQL. y con las posibilidades más útiles del estándar SQL2.32 SOL. pero hicieron el estándar relativamente débil. líger. el comité ANSI continuó su trabajo y se distribuyeron borradores de un nuevo estándar más riguroso. Para abordar los agujeros del estándar original. Al igual que ocurre con los dialectos de los lenguajes humanos. En muchas áreas el comité simplemente obvió estas diferencias omitiendo del estándar ciertas partes del lenguaje y especificando otras como «definidas por el implementador». El nivel de cumplimiento intermedio (nivel intermedio) se creó como un avance posible respecto de SQL-89. como el compromiso. cuando ANSI encargó a su comité X3H2 la definición de un lenguaje estándar para bases de datos relacionales.bases de datos relacionales y centró su atención en normalizarlo. y como estándar ISO en 1987. Mientras que el estándar original de 1986 ocupaba menos de cien páginas. Pese a la aparición de subsegmenlos del mercado de bases de datos.de IBM con SQL se incrementaba y SQL se estableció como un estándar de jacto en el mercado. amplían continuamente. como el estándar de/acto para algunas partes del·lenguaje SQL. Además. los dialectos de SQL eran. Pese. pero incompatibles en sus detalles. XML) son el último intento de salirse del modelo relacional y de SQLpero la historia de los últimos veinte años indica que SQL y el modelo relacional tienen una enorme capacidad para aceptar las nuevas necesidades de gestión de datos y adaptarse a ellas. Las referencias al «estándar de SQL» suelen hacer referencia al estándar oficial adoptado por el organismo estadounidense de normalización (American National Standards Institute. intermedio o completo. ISO). por lo general. ANSI) y la Organización Internacional de Normalización (International Standards Organization. SQL ha seguido siendo un denominador común de lodos ellos. Manual de referencia Capítulo 3: SOL en perspectiva 33 segmento importante de aplicaciones fueron las bases de datos incorporadas para su empleo con dispositivos inteligentes. que ha sido definido por la familia de productos DB2. No obstante. a la existencia del estándar SQL2 desde hace más de diez años. A diferencia del estándar de 1989. diseñado para niveles de rendimiento muy elevados.

IBM introdujo implementaciones de DB2 para OS/2. como las extensiones de SQL orientadas a objetos no están todavía disponibles de manera general o completamente implementadas. por supuesto. un grupo de fabricantes europeos. Manual de referencia Capítulo 3: SOL en perspectiva 35 Entretanto. IBM reforzó aún más sus posición en el software para bases de datos en plataformas de hardware que no son de IBM con su adquisición en 2001 de la base de datos Informix. pero han generarlo un alto grado de debate. La interoperatividad transparente entre bases de datos de diferentes fabricantes sigue siendo un objetivo huidizo. Algunas de ellas. el estándar ANSI/ISO no es el único estándar para SQL. OOBC) de Microsoft. El esfuerzo de SQL3 se fragmentó finalmente en esfuerzos de estandarización independientes y se centró en diferentes extensiones de SQL. La innovación de los fabricantes de bases de datos sigue impulsando la invención de nuevas posibilidades de SQL. como las posibilidades de los procedimientos almacenados. la especificación Interfaz en el nivel de llamadas (CalJ-Levellnlerface. Otras. OOBC se ha implantado como la interfaz estándar de jaclO para el acceso mediante computadora personal a las bases de datos de SQL. CU) resultante se publicó en 1992. Ante la insistente petición de Microsoft. Hewlett-Packard y Silicon Graphics. Se sue- . se publicó ese mismo año. OOBC está en su cuarta revisión de importancia como estándar para el acceso a bases de datos en diversas plataformas. Con el poder de mercado de Microsoft tras él y la bendición de «estándares abiertos» del Grupo de acceso SQL. IBM también incluyó SQL en la especificación de su audaz proyecto de los años noventa del siglo pasado Arquitectura de aplicación de sistemas (Syslems Applicalion Architeclure. algunos productos permanecen en el mercado durante años sólo para asegurar la compatibilidad con productos anteriores. y algunos logran el éxito comercial y pasan a ser de aceptación general. En su mayoría los. Aunque SAA no logró cumplir sus promesa de unificar la línea de productos de IBM. Las implementaciones de ODBC para los sistemas basados en UNIX no tardaron en llegar. RDA) se publicó en 1991. y van desde las aplicaciones de tipo empresarial de varios millones de euros como la planificación de recursos empresariales y la gestión de la cadena de suministros a aplicaciones para computadoras personales como las hojas de cálculo. Con la mayor parte de los fabricantes que sólo han implementado recienlemente las principales posibilidades de SQL2. por lo que tuvo poco impacto. de productos RS/6000 de estaciones de trabajo y de servidores basados en UNIX.34 SOL. Hoy en día. CLI). Con su base de datos DB2 para grandes sistemas como insignia. Hacia 1997 IBM había llevado a DB2 más allá de su propia línea de productos y había distribuido versiones de DB2-Universal Database para sistemas hechos por los fabricantes rivales Sun Microsystems. SAA). Con el liderazgo histórico de IBM en la tecnología de las bases de datos relacionales. El soporte de OOBC está disponible para todas las marcas de SGBD. con la publicación del estándar de la Interfaz en el nivel de llamadas para SQL (SQUCall-Levellnterface. se continúa trabajando en estándares posteriores a SQL2. X/OPEN. donde la transportabilidad entre sistemas informáticos de diferentes fabricantes es una preocupación fundamental. ADO). Un segundo estándar del Grupo de acceso SQL tuvo mucho más impacto en el mercado. el impulso hacia un SQL unificado de IBM continuó. también adoptó SQL como parte de su conjunto de estándares para un entorno portátil de aplicaciones basado en UNIX. el dialecto de SQL'incorporado por DB2 es un estándar de jaclo muy potente. la especificación RDA se hallaba íntimamente ligada a Jos protocolos OSI. La mayor parte de los programas de aplicación que se venden como paquetes que tienen el acceso a bases de datos como una parte importante de sus posibilidades soportan ODBC. y para Windows NT. La misma especificación de Conectividad abierta de bases de datos (Open Oatabase Connectivity. Otros estándares de SOL Aunque es el más ampliamente reconocido. basada en el estándar CLI. las herramientas de consulta y los programas de elaboración de infonnes. pero estás nuevas interfaces se apilan sobre üOBC para el acceso a bases de datos relacionales. el Grupo de acceso SQL amplió su campo de atención para incluir una interfaz en el nivel de llamadas para SQL. el estándar x/OPEN se diferencia del estándar ANSI/ISO en varias áreas. En 1995 la interfaz OOBC se transformó de manera efectiva en un estándar ANSI/lSO. La atención de Microsoft ha pasado de OOBC a in~ terfaces de nivel superior (como OLEJDB) y. que nunca se implementaron ampliamente. es el lenguaje SQL implementado en los productos que están generalmente aceptados por el mercado. el trabajo en SQL3 ha alcanzado menos importancia comercial. Por desgracia. ya se hallan en muchos productos comerciales de SQL y plantean los mismos retos de estandarización afrontados por SQL2. Los estándare·s x/OPEN han desempeñado un papel importante en el mercado ¡nfonnático europeo. Por desgracia. y con la diversidad de extensiones de SQL disponibles hoy en día en productos comerciales. Apple y Microsoft anunciaron un acuerdo para soportar ODBC en Macintosh y en Windows en la primavera de 1993. a los objetos de datos de ActiveIX (ActiveIX Data Objects. más recientemente. ODBC y el grupo de acceso SOL Un área importante de la tecnología de bases de datos no abordada por los estándares oficiales es la interoperatividad entre bases de dolos -los métodos mediante los cuales se pueden intercambiar datos entre bases de datos diferentes. generalmente a través de una red. El «verdadero» estándar de SQL. lo que da a ODBC estatus de estándar de la industria en los dos entornos de interfaz gráfica más populares. programadores y los usuarios tienden a seguir las partes del lenguaje que son bastante parecidas en una amplia gama de productos. y ésta sigue siendo una tecnología fundamental para el acceso a bases de datos entre diferentes plataformas. SOL Y transportabilidad La existencia de estándares publicados para SQL ha generado unas cuantas afirmaciones exageradas sobre SQL y la transportabilidad de las aplicaciones. La especificación resultante del Grupo de acceso SQL para el acceso a bases de datos remotas (Remate Database Access. Basada en un borrador de Microsoft. En 1989 un grupo de fabricantes formó el Grupo de acceso SQL (SQL Access Group) para abordar este problema. que prometía que todos sus productos de SQL acabarían pasándose a este dialecto SQL de SAA. y para su línea. su sistema operativo para computadoras personales.

Por ejemplo.de datos. • Tablas'del'sistema. el estándar SQL2 • • • I APllc:c.ado que no está incluida.ón Aplicación 2 Aplicacion 3 . FORTRAN y otros lenguajes de programación. las cuatro implementaciones de IBM difieren entre sí. pero no una interfaz en el nivel de llamadas. que la mayoría de los fabricantes todavía no ofrece. dependientes de la compatibilidad con los productores anteriores. El estándar SQL2 crea más uniformidad pero no puede enmascarar por completo estos detalles. 'APll. en las funciones de columnas y en la eliminación de filas duplicadas. incluso. los agujeros del estándar SQL-89 y las diferencias actuales entre los dialectos de SQL son lo bastante significativas como para que haya que modificar siempre las aplicaciones al pasarlas de una base de datos de SQL a otra. pero mucho después de que todos los principales vendedores de SGBD tuvieran posibilidades bien establecidas de SQL interactivo.1 para mostrar el modo en que las aplicaciones que utilizan SQL pueden trabajar de manera intercambiable con cualquier sistema gestor de bases de ·datos basado en SQL. El estándar SQL-89 no especifica los códigos de error que hay que mostrar cuando SQL o.:ción I . Como los estándares especifican ciertos detalles como definidos por el implementador.a otro. El estándar SQL2 especifica los'códigos de error estándar. 'como Jos gráficos. las herramientas comerciales para bases de datos que presumen de transportabilidad entre varias marcas diferentes de bases de datos de J . ~. pero es una característica de nivel avanz.+ I +. por lo general. El estándar SQL2 incluye una especificación elaborada de manera que los programas y los usuarios pueden solicitar una secuencia de ordenación determinada. pero no los tipos de datos «nuevos». Una vez más. y cada implementación comercial utiliza su 'propio conjunto de códigos. Estructura de las bases de datos.. en los productos comerciales. C. Cada fabricante tiene su propia estructura para estas tablas. El estándar especifica sólo la programación con SQL utilizado por los programas de aplicación. Entre estas diferencias. El estándar SQL2 especifica una interfaz incorporada para SQL para los lenguajes de programación más populares. Secuencias de ordenación. El estándar SQL-89 especifica el lenguaje SQL que hay que utilizar una vez se ha abierto una base de datos determinada y está preparada para su procesamiento. Estas diferencias se producen en el manejo de los valores NULL. no SQL interactivo. • SQL interactivo.1. El estándar SQL-89'no dice nada respecto de las tablas del 'sistema que ofrecen información relativa a la estructura de la propia base de ~atos.etecta un error. corno las cadenas de caracteres .implementado en los productos comerciales. los fabricantes de SGBD no 10 han implementado. • Tipos. las fechas y las horas y los datos de monedaJEI·estándar SQL2 aborda'este problema.36 SOL. como las herramientas para búsqueda y los redactores de informes. conocidas como SQL dinámico. Interfaz para programación. SQL2 incluye un estándar para SQL dinámico. El estándar SQUCLI de 1995 abordó finamente el acceso a SQL mediante programación.J SOL «eS. SQL dinámico. figuran: • • Códigos de error. Los detalles de las denominaciones de las bases de datos y del modo en que se establece la conexión inicial con la base de datos varían ampliamente y no son transferibles.ándarll I + SGBD .de .y los objetos multimedia. Las tablas se estandarizan en SQL2. Pese a estas diferencias. El estándar SQL-89 no aborda la secuencia de ordenación (tipo de orden) de los caracteres almacenados en la base de datos.longitud variable. pero sólo en los grados de cumplimiento más elevados. El estándar original especifica una técnica abstracta para emplear desde el interior de SQL unos programas de aplicación escritos en COBOL. pero no antes de que los productos SGBD comerciales hubieran popularizado interfaces propietarias y las incorporaran profundamente en forma de cientos de millares de aplicaciones de usuario y paquetes de aplicaciones. El estándar SQL-89 define un conjunto mínimo de tipos de datos. e. resulta posible ejecutar la misma consulta en dos implementaciones diferentes confof?les con SQL y obtener dos conjuntos de resultados de la consulta diferentes. De hecho. Pero con centenares de miles de aplicaciones ya existentes. Diferencias semánticas. Figura 3. El estándar SQL-89 no incluye las características necesarias para desarrollar partes visibles al usuario de finalidad general. I SGBD 1 l ..'pero'omite algunos de los tipos más populares y útiles. Estas características. El resultado de una consulta ordenada será diferente si la consulta se ejecuta en una computadora personal (con caracteres ASCII) O en un gran sistema (con caracteres EBCDIC). * I SGBD 2 ¡ ¡ 1 • 3 aborda este problema. se hallan en casi todos los sistemas de bases de datos de SQL. pero varían significativamente de un producto. y hay variaciones considerables entre las interfaces para programación utilizadas realmente. muchas de las cuales se eliminaron en el estándar SQL2 pero todavía no se han . Ningún producto comercial de SQL utiliza esta técnica. Manual de referencia Capitulo 3: SOL en perspectiva 37 len dibujar diagramas como el de la Figura 3. la instrucción SELECT utilizada para consultar la base de datos en SQL interactivo está ausent~ en el estándar SQL-89. El mito de la transportabilidad de SOL.

Arquitectura del servidor de archivos . no obstante. Manual de referencia Capitulo 3: SOL en perspectiva 39 SQL comenzaron a surgir a principios de los años noventa.2 muestra la arquitectura tradicionál de las bases de datos utilizada por DB2. cada uno de ellos añade carga de trabajo de procesamiento de la aplicación al sistema.3. controla la conversión de tipos de datos... .todos los pedidos. . La gestión de las bases-de datos en una arquitectura de servidor de archivos. Figura 3.. busca por la base de datos recogiendo cada registro. cada usuario experimenta un rendimiento deteriorado a medida que el sistema se va cargando. de cualquier tipo de consulta) resulta muy eficiente. SQL vuelve a proporcionar el enlace entre la lógica de las apli'caciones (que se ejecuta ahora en la capa intermedia. por lo que la ejecución de este tipo de consulta (y. -1 ¡ La introducción de las computadoras personales y de las redes derárea local llevó al desarrollo de la arquitectura del servidor de archivos. y las bases de datos originales de minicomputadoras como _1 •• : Servidor de archivos Base Gran sistema Pulsaciones---+ . y suelen incluir un controlador ODBe para tener acceso a las demás. . en un servidor de aplicaciones o en un servidor web) y la base de datos residente en la capa del sistema subyacente.Caracteres L ----' Figura 3. SQUDS..en una computadora personal puede tener acceso de manera transparente.2. En esta arquitectura.aplicación que acepta ·las entradas desde el terminal del usuario y muestra los datos en la pantalla del usuario. traduce los códigos de error. calcula el promedio y muestra el resultado en la pantalla del terminal. que almacena los archivos compartidos. basada en SQL estándar. Supóngase que el usuario escribe una consulta que exige una búsqueda secuencial en la base de datos. El SGBD recibe la consulta.. Tanto el procesamiento de la aplicación como el de la base de datos tienen lugar en la computadora central. SOL Y redes El espectacular crecimiento de las redes informáticas en los años noventa tuvo un importante impacto en la gestión de bases de datos y dio a SQLuna·nueva importancia. junto con el programa de. Como el sistema es compartido. En cada caso. El programa de aplicación se comunica con el SGBD empleando SQL. de hecho._-. como puede ser una solicitud de búsqueda del'tamaño promedio de los pedidos para . En la arquitectura de Internet de tres capas que se está imponiendo. Cuando una aplica- Arquitectura centralizada La Figura 3. Gracle e Ingres. . A medida que las redes se hicieron más' comunes. SoticitudesL_.. En estas 'redes SQL desempeña un papel crucial como enlace entre la aplicación que se ejecuta en la estación de trabajo de mesa con una interfaz gráfica de usuario y el SGBD que gestiona los datos compartidos en un servidor efectivo en costes. Hoy en día.~. En esta arquitectura el SGBn y los datos físicos residen en una minicomputadora o gran sistema central. las herramientas necesitaban un adaptador especial para cada SGBD albergado. El inconveniente de la arquitectura centralizada es la posibilidad de ampliación..que puede verse en la Figura 3. Según se agregan usuarios. Más recientemente.d de E/S de disco ~ aloques de disco \~ de datos y archivos ompartido . etc. :' \~ Aplicación +. las aplicaciones que tradicionalmente se ejecutaban en una minicomputadora o en un gran sistema central pasaron a redes de área local de estaciones de·trabajo de mesa y servidores...3. que genera el dialecto de SQL adecuado.. y se ha alcanzado un progreso significativo.de datos del disco. La transportabilidad transparente entre diferentes marcas de SGBD. una aplicación que se ejecute.... Las siguientes secciones estudian la evolución' de las arquitecturas de red de las bases de datos y el papel de SQL en cada una de ellas.a los . Gestión de bases de datos en una 'arquitectura centralizada.datos ubicados en un servidor de archivos. la creciente popularidad de Internet y World Wide Web ha reforzado el papel de SQL en las redes.. es el principal objetivo de SQL2 y de üDBC. casi todos los programas que albergan varias bases de datos incluyen controladores específicos para comunicarse con cada una de las principales marcas de SOBD.38 SOL.

Para las consultas típicas que sólo recuperan una fila o unas pocas filas de la base de datos. que también reside en el servidor. Sybase. pero a fines de los años noventa había una creciente preocupación sobre la gestionabilidad de las aplicaciones cliente/servidor en las grandes redes distribuidas de computadoras personales. En la arquitectura cliente/servidor la consulta viaja por la red hasta el servidor de bases de datos en forma de solicitud SQL. considérese la consulta formulada en el ejemplo anterior. Además. Algunas provenían de las propias empresas de bases de datos. Obviamente.---¡. Figura 3.------¡ \. el lenguaje SQL proporciona una interfaz bien definida entre los sistemas visibles al usuario y los sistemas subyacentes. La arquitectura cliente/servidor reduce el tráfico de red y divide la carga de trabajo de la base de datos. A medida que la arquitectura cliente/servidor creció en popularidad en los años noventa. L 1- I . en el servidor. como la E/S de archivos y el procesamiento de consultas. Arquitectura cliente/servidor La Figura 3. El motor de bases de datos del servidor procesa la solicitud y explora la base de datos. lo que incrementaba la carga de trabajo del soporte técnico. La parte visible para el usuario de las bases de datos. el departamento de sistemas informáticos tenía que actualizar millares de sistemas de computadoras personales. en el que cada computadora personal ejecutaba su propia copia del software de SGBD. A mediados de los años noventa. La industria de las bases de datos creció para incluir muchas empresas que ofrecían herramientas para la creación de aplicaciones cliente/servidor.40 SOL. el software de red recupera del servidor de manera automática el bloque solicitado del archivo. -'\. La gestión de bases de datos en una arquitectura cliente/servidor. Considérese una vez más la consulta que solicita el tamaño promedio de los pedidos. Cuando se ha calculado el resultado. esta arquitectura proporciona un rendimiento excelente. Las funciones del SGBD se dividen en dos partes. porque cada usuario tiene toda la polencia de una computadora personal que ejecuta su propia copia del SGBD. con las computadoras personales en las mesas de los usuarios. otras procedían de empresas independientes. más tarde.---¡. SQL Server.---¡. Para actualizar un programa de aplicación de una gran empresa. No obstante.ofrecían posibilidades de cliente/servidor. 10 que es más importante. uno a uno.4 muestra la siguiente etapa de la evolución de las bases de datos de red -la arquitectura de bases de datos cliente/servidor-o En este esquema las computadoras personales se combinan en una red de área local con un servidor de bases de datos que almacena las bases de datos compartidas. El principal era el problema de la gestión del software de las aplicaciones. Microsoft Access. Manual de referencia Capítulo 3: SaL en perspectiva 41 ción de una computadora personal solicita Jos datos de un archivo compartido. La situación era aún peor si había que sincronizar las modificaciones del programa de aplicación con modificaciones en otras aplicaciones. esta arquitectura produce un tráfico de red muy intenso y un bajo rendimiento para las consultas de este tipo. Estas modificaciones solían transtornar el funcionamiento de las aplicaciones ya existentes. Las funciones intensivas de datos. como las herramientas para consultas interactivas. comunicando las solicitudes de acceso a la base de datos de manera eficiente.4. Las funciones intensivas del usuario. SQL se convirtió en el lenguaje de bases de datos estándar para la comunicación entre las herramientas visibles para el usuario y el motor subyacente en esta arquitectura. Las primeras bases de dalos de computadoras personales. y la aplicación visible para el usuario lo muestra en la pantalla de la computadora personal. El motor de bases de datos subyacente que almacena y gestiona los datos se ejecuta en el servidor. como dBASE y. Todos los productos SGBD más populares -Gracle. o con el propio sistema SGBD. los redactores de infor- \. que se ubican físicamente al otro lado de la red. éstos tendían a añadir nuevo software personal propio o a modificar la configuración de sus sistemas. Las empresas desarrollaron estrategias para solucionar estos problemas. que ahora se hallaba distribuido entre centenares o millares de computadoras personales de sobremesa en lugar de ejecutarse en una minicomputadora O un gran sistema central.9 pe Il:'§~. DB2 y muchos más. Y. la arquitectura cliente/servidor presentaba sus inconvenientes. ~ Servidor de bases de datos . como el manejo de la entrada y exhibición de los datos. se concentran en el servidor de bases de datos. el SGBD solicita de la base de datos de manera repetida bloques de datos. el motor de bases de datos lo devuelve por la red en forma de una única respuesta a la solicitud inicial. Finalmente se solicitarán todos los·bloques del archivo y enviados por la red. mes y los programas de aplicaciones. se concentran en la computadora personal del usuario. Informix. Como la consulta exige una búsqueda secuencial de la base de datos. estas ventajas hicieron de la arquitectura cliente/servidor el esquema más popular para la implementación de nuevas aplicaciones. ~. albergaban este enfoque de servidor de archivos. se ejecuta en la computadora personal. Al igual que las demás arquitecturas.

. OLTP). cuyo papel es manejar la lógica empresarial necesaria para procesarla ~solicitud. Explorador web ro :¡¡ ". J2EE). lo que refutan completamente la idea generalizada en los años ochenta de que las bases de datos relacionales nunca ofrecerían un rendimiento lo bastante bueno para las aplicaciones de procesamiento de transacciones. En Internet las bases de datos basadas en SQL son el fundamento de productos más personalizados.tilt8 43 Arquitectura multicapa Con la -implantación de Internet y. el servidor web transfiere la solicitud a un servidor de aplicaciones. la arquitectura de las bases de datos de red dio otro paso en su evolución. • ~ Q o. Los métodos utilizados para conectar los servidores web con los sistemas SOBD evolucionaron rápidamente entre fines de los años noventa y comienzos de este siglo. supóngase que una empresa empieza utilizando la ·web para proporcionar información de sus productos a los clientes poniendo a su disposición en su sitio web descripciones de los productos y gráficos. JDBe) se ha implantado como el API estándar para el acceso de los servidores de aplicaciones a las ·bases de datos. Todos los productos de los servidores de aplicaciones distribuidos en paquetes proporcionan un API basado en SQL al que se puede llamar para 'acceso a las bases de datos. no pasó mucho tiempo antes de que las empresas pensaran en utilizarla como una manera sencilla de proporcionar acceso también a las bases de datos empresariales. por algún motivo. Como en el mercado de servidores·de aplicaciones ·se ha convergido alrededor del estándar Edición empresarial Java2 (Java2 Enterprise Edition. Cuando la solicitud del usuario es. y han convergido en la arquitectura de tres capas que puede verse en la Figura 3. cuando el empleo de los exploradores web se hizo más amplio. Esto exige conectar el servidor web con el sistema de bases de datos que almacena los niveles de inventario actuales (en perpetuo cambio) de los productos. El siguiente paso natural era dar a los clientes acceso a la información sobre la disponibilidad de los productos en cada momento mediante la misma interfaz del explorador web. Por ejemplo. de World Wide Web. A menudo la solicitud implica el acceso a una aplicación ya existente (heredada) que se ejecuta en un gran sistema o 'a una base de datos empresariaL Estos sistemas se ejecutan en la capa subyacente de la arquitectura. y evolucionó fuera del mundo de las bases de datos. Al principio la web se utilizaba para tener acceso a documentos estáticos (explorarlos). • • 1 e ro U Servidor de bases de datos Gran sistema Sistema " ~ Base de datos SGSD OLTP heredado ~ u .~-. ". Pero. la conectividad Java para bases de datos (Java DataBase Connectivity. especialmente. u \'-~ Figura 3. La interfaz de usuario es un explorador web que se ejecuta en una computadora personal o algún otro dispositivo cliente ligero en la capa visible para el usuario. Se comunica con un servidor web en la capa intermedia.. ro Q ro . La gestión de bases de datos en una arquitectura de Internet de tres capas. La proliferación de SaL Como estándar para el acceso a las bases de datos relacionales. especialmente para las aplicaciones departamentales. En el mercado de las computadoras personales las bases de datos de SQL en sistemas operativos Windows orientados a servidores están planteando un serio desafío a la dominación de UNIX como platafonna de procesamiento de bases de datos.~ . SQL está aceptado como tecnología para el procesamiento en conexión de transacciones (online transaction processing.5. IBM ha adoptado SQL como tecnología unificadora de las bases de datos para su línea de productos.• s ro '~ 'O E · • o Páginas web estáticas Servidor web Software del servidor web Servidor de aplicaciones Servidor de' aplicaciones (lógica empresarial) . más compleja que una mera página web.5. Al igual que con la arquitectura cliente/servidor. El almacenamiento de datos y las aplicaciones de bús· queda de datos basadas en SQL son el estándar para ayudar a las empresas a descubrir patrones de compra de los clientes y ofrecer mejores productos y servicios. SQL se ha establecido firmemente como el lenguaje de bases de datos estándar para la comunicación entre el servidor de aplicaciones y las bases de datos subyacentes. Manual de referencia Capítulo 3: SOL en perspec. y de los servicios de información que son una ventaja fundamental del comercio electrónico. infonnáticos basados en UNIX.42 SOL. SQL ha tenido una importante repercusión en todas las facetas del mercado informático. Las bases de datos basadas en SQL dominan el mercado de los sistemas .

SOL en las minicomputadoras Las minicomputadoras fueron uno de los más fértiles mercados. Oracle y otros productos en los servidores de bases de datos basados en Windows. Se ejecuta en una amplia gama de sistemas informáticos. A mediados de los años noventa. los fabricantes de minicomputadoras también desarrollaron sus propias bases de datos propietarias que utilizaban SQL. Originalmente desarrollado en los BeU Laboratories. Una versión de DB2 para servidor de red de área local de computadoras personales compite con Microsoft SQL Server. El producto dBASE de Ashton-Tate alcanzó una . una base de datos que albergaba su dialecto HPSQL y una interfaz no relacional. DB2. y actualmente ha sustituido a SQLlDS como sistema relacional para los sistemas operalivos para gran~ des sistemas VM y VSE. Además. • Windows. La base de datos DGISQL de Data Ge- SOL en computadoras personales Las bases de datos han sido populares en las computadoras personales desde los primeros días del PC de IBM. • Otras plataformas UNIX. los dos principales fabricantes de sistemas UNIX. Esta implementación de SQL se ejecuta sobre la familia de sistemas de tamaño mediano para empresas de IBM. IBM soporta DB2 ea plataformas basadas en UNIX de Sun Microsystems y de Hewleu-Packard. la imp0rlancia de los sistemas operativos propietarios de las minicomputadoras también disminuyó. también consideró VAX una de sus principales plataformas. un sistema de bases de datos posterior especializado en el procesamiento en línea de transacciones. desde estaciones de trabajo a grandes sistemas. y en estaciones basadas en UNIX de Silicon Graphics. A lo largo de los años ochenta. el papel unificador de SQL se ha vuelto aún más importante con el tiempo. • AS/400.44 SOL. neral sustituyó a sus bases de datos anteriores como herramienta estratégica de gestión de datos. En línea con esta tendencia. array redundante de discos independientes) para incrementar el rendimiento de E/S. suslituidos por el empleo generalizado de UNIX en los sistemas de gama media. Aunque los principales objetivos de IBM para SAA no se consiguieron. Tanto Gracle como Ingres se comercializaron originalmente para los sistemas de minicomputadoras VAXlVMS de Digital. SMP) como arquitectura habitual de los servidores y el empleo de tecnología RAID (Redundan! Array ollndependent Disks. Dos de ellas. Ambos productos se han pasado desde entonces a otras muchas plataformas. la insignia de los SGBD basados ea SQL de IBM. Informix y Unify. Entre ellas figuran la aparición del multiprocesamiento simétrico (symmelric multiprocessing. Hewlett-:Packard ofreció Allbase. incluidos los servidores de bases de datos. y como plataforma de servidores de bases de datos de UNIX de IBM. se escribieron específicamente para UNIX. pero hacia 1985 Unify ofreció un lenguaje de consultas SQL e Informix se había vuelta a escribir como Informix-SQL. eran versiones UNIX de los productos que se ejecutaban en las minicomputadoras propietarias de DEC. El anterior mercado de SQL para minicomputadoras se ha convenido de manera efecliva en el mercado actual de servidores de bases de datos basados en UNIX basados en SQL. muchos de los fabricantes de minicomputadoras reven· dieron bases de datos relacionales de los fabricantes independientes de software de bases de datos. Digital consideró tan importantes las bases de datos relacionales que incluyó una versión en tiempo de ejecución de su base de datos RdbNMS con cada sistema VAXI VMS. los produclOS SQL de los fabricantes de SQL habían desaparecido en su mayor parte. Inforrnix. Sybase. El sistema de bases de datos DB2. Ingres y Oracle. A principios de los años ochenta del siglo pasado ya se disponía de cuatro bases de datos principales para los sistemas UNIX. entre ellos: • Grandes sistemas. Las otras dos. dirigidos a las pequeñas y medianas empresas y a aplicaciones de servidores. Los servidores de bases de datos basados en UNIX son un componente habitual tanto de la arquitectura cliente/servidor como de la arquitectura de Internet de tres capas. que se anunció en marzo de 1987. Sybase y Q(fOS fabricantes. DB2 se ejecuta bajo el sistema operativo UNIX en la familia de estaciones de trabajo y de servidores basados en RISC de IBM. Manual de referencia Capítulo 3: SOL en perspectiva 45 SOL Y la estrategia de la base de datos unificada de IBM SQL ha desempeñado un papel fundamental como lenguaje común para acceso a las bases de datos en todas las familias de computadoras de IBM. y se ha transformado en el sistema operativo estándar para los sistemas servidores de alta gama. DB2 comenzó como el portaestandarte de SQL para los grandes sistemas de IBM que ejecutaban MVS. • Servidores de arquitectura potente. SOL en los sistemas basados en UNIX SQL se ha establecido firmemente como la solución de gestión de datos predilecta para los sistemas informáticos basados en UNIX. UNIX se hizo popular en los años ochenta del siglo pasado como sistema operativo estándar independiente del fabricante. Originalmente este papel era parte de la estrategia SAA de IBM. derrotados en el mercado por el software multiplataforma de Oracle. Informix y Sybase dominan el mercado de bases de datos basadas en UNIX y están disponibles en todas las plataformas principales de servidores UNIX. se ejecuta ahora en una amplia gama de sistemas informáticos de IBM y de otros fabricantes. Hoy en día los productos SOBD de Oracle. Ninguna de ellas ofrecía originalmente soporte para SQL. Estos esfuerzos ayudaron a establecer SQL como una teenoto· gía importante para los sistemas informáticos de gama media. La búsqueda constante de· mayor rendimiento de las bases de datos de SQL ha generado algunas de las tendencias más importantes en el hardware de los sistemas UNIX. con soporte integral de SQL. de los primeros tiempos para los sistemas de bases de datos basados en SQL.

diciendo en efecto que SQL era tan importante que formaba parte del sistema operativo de la computadora. Las pruebas de rendimiento de OLTP se han convertido hoy en día en una herramienta de ventas estándar para las bases de datos relacionales. Informix anunció una versión OLTP de su SGBD. Finalmente. Lotus Development (el otro de los tres grandes del software para computadoras personal~s de la época) añadió su apoyo a SQL Server invirtiendo en Sybase. Aunque estas primeras bases de datos para computadoras personales solían presentar los datos de forma tabular. Sybase. con ·Sybase centrada en los mercados de las minicomputadoras y de los servidores basados en UNIX y ·con Microsoft centrado en las redes de:área local de computadoras personales y en Windows NT. Microsoft vendería SQL Server con OS/2 a los fabricantes de c. En el mercado UNIX. por unos años. En septiembre de 1989. en el típico estilo de Microsoft. Sybase y Microsoft se fueron cada uno por su lado. IMS) no relacional reinaba como el SGBD dominante. y animó a los clientes a considerarlo una seria alternativa a IMS. ese mismo año. SOL Y el procesamiento de transacciones SQL y las bases de datos relacionales tuvieron originalmente muy poca repercusión en las aplicaciones de procesamiento en conexión de transacciones (online transaction processing. Ashton-Tate vendería el producto en el canal detallista a los usuarios de computadoras personales. de datos de mayor (amaño. que se distribuyó a finales de 1998.NET. en un movimiento sorpresa. Para las aplicaciones OLTP. . que se había desarrollado para VAX. proporcionó otro impulso importante. diseñada especialmente para las aplicaciones OLTP. Además del impacto de SQL Server.46 SOL. necesitaba dos megabytes de memoria -muy por encima de la típica configuración de 640KB de las computadoras personales de aquel entonces. Aunque UNIX sigue dominando las instalaciones de servidores de bases . . los procedimientos almacenados). Microsoft necesitaba una alternativa a Extended Edition. que se ejecUla en Windows 2000. introducido en 1984. Microsoft respondió obteniendo la licencia del SGBD de Sybase. A medida que los sistemas Windows NT y UNIX se iban volviendo competidores como plataformas de sistemas operativos para servidores de bases de datos. üLTP). La idoneidad de SQL para OLTP mejoró espectacularmente a lo largo de los años noventa. Por un tiempo. Con su énfasis en las consultas. de ¡nformix. Por ejemplo. Hoy en día SQL Server es un importante sistema de bases de datos en los servidores basado$ en Windows. Professional Gracle for the IBM pe. Más adelante. carecían de toda la potencia de los SGBD relacionales y de un lenguaje para bases de datos relacionales como SQL. pese a las serias dudas sobre la precisión con que estas pruebas miden realmente el rendimiento en las aplicaciones reales. El verdadero impaclO de SQL en las computadoras personales comenzó con el anuncio de OS/2 por mM y Microsoft en abril de 1987. rebautizado SQL Server. en menor grado. Manual de referencia Capítulo 3: SOL en perspectiva 47 base instalada de más de un millón de computadoras personales basadas en MSDOS. Microsoft siguió invirtiendo mucho en el desarrollo de SQL Server y lo adaptó a su sistema operativo Windows NT. Los fabricantes de SGBD comenzaron a promover sus productos de acuerdo con su rendiiento OLTP y. las bases de datos relacionales quedaron confinadas al soporte de decisiones y a las aplicaciones con conexión de escaso volumen. El SGBD de Sybase se ejecutaba en minicomputadoras VAXNMS y estaciones de trabajo Sun. y comenzó a adaptarlo a OS/2. y se centraba en el máximo rendimiento con conexión. La ascendencia común de los productos SQL de Sybase y de Microsoft todavía puede verse en posibilidades de los productos y en algunas extensiones comunes de SQL (por ejemplo. En 1988 IBM se subió al tren del OLTP relacional con DB2 Version 2. Con esta introducción mM volvió a indicar su fuerte compromiso con SQL. supuso un impulso importante en el tamaño y en ]a escala de las aplicaciones de bases de datos que podía soportar SQL Server.omputadoras. para el que las pruebas de rendimiento mostraban que la nueva versión operaba por encima de las doscientas cincuenta transacciones por segundo en los grandes sistemas. Microsoft y Sybase siguieron siendo socios. SQL Server 7. En enero de 1988. donde su rendimiento más lento no suponía un·'inconveniente.inversi6n a Lotus. el Sistema de gestión de la información (lnformation Management Syslem. en las que centenares de usuarios necesitaban acceso con conexión a los datos y tiempos de respuesta inferiores al segundo. ]a relación se volvió menos cooperativa y más competitiva. En 1986 un nuevo fabricante de SGBD. introdujo una nueva base de datos. OracIe Corporation y Relational Technology comunicaron poco después que también ellos ofrecerían versiones OLTP de sus populares sistemas de bases de datos Oracle e Ingres. Pero. SQL Server 2000. Como desarrollador y distribuidor del OS/2 estándar a otros fabricantes de computadoras personales. denominada Informix-Turbo. OS/2 Extended Edition planteó un problema a Microsoft. Además del producto OS/2 estándar. Las primeras bases de datos para computadoras personales basadas en SQL fueron versiones de productos populares para minicomputadoras que apenas cabían en las computadoras personales. IBM proclamó que el rendimiento de DB2 ya era adecuado salvo para las aplicaciones OLTP más exigentes. SQL Server para OS/2 sólo obtuvo un éxito limitado. las configuraciones de los servidores del sistema operativo Windows y los sistemas de arquitecrura Intel en los que se ejecutan han logrado credibilidad en el mercado de gama media. Microsoft y Ashton-Tate (el líder en bases de datos para computadoras personales de la época con su producto dBASE) anunciaron que venderían conjuntamente el producto basado en OS/2 resultante. Ashton-Tate renunció a sus derechos exclusivos de distribución minorista y vendió su. DB2 y otros productos SGBD habituales ha ayudado a los servidores basados en Windows a ir erosionando poco a poco el dominio de UNIX como pla(aforma para servidores de bases de datos. SQL Server está destinado a seguir teniendo un papel importante a medida que Microsof( vaya desplegando su familia de produc(os para servidores . pero las líneas de productos ya han divergido de manera significativa. mM anunció un OS/2 Extended Edition (OS/2 EE) propietario con una base de datos SQL incorporada y soporte de comunicaciones. la publicidad de las bases de datos se centró . la disponibilidad de Oracle y. basada en SQL. en que los avances en la tecnología relacional y un hardware informático más potente llevaron a velocidades de transacción cada vez más altas.

Aunque las bases .probar. basados en UNIX. y el tiempo de respuesta para los usuarios es muy importante. de aplicaciones OLTP. La llegada de Windows NT al mundo de la informática de trabajo en grupo fue el catalizador que hizo que despegara realmente el mercado de las bases de datos para trabajo en grupo. las bases de datos que utilizaban las empresas para tratar las operaciones de negocios coti. SQL ha crecido hasta ser el fundamento estándar de la industria para la creación Este fenómeno. Sybase. Microsoft vendió con éxito NT como una plataforma más atractiva para la ejecución de aplicaciones para trabajo en grupo (como servidor de aplicaciones) y de bases de datos para trabajo en grupo. Aunque NetWare ofrecía una clara ventaja en rendimiento frente a NT como servidor de archivos para trabajo en grupo. Los sistemas de bases de datos originales dirigidos a este segmento del mercado se ejecutaban en el sistema operativo OS/2 de IBM. se anunciaba (y. Desde una situación de «inadecuado para OLTP» . Hoy en día SQL está bien establecido como estándar para las bases de datos para trabajo en grupo. Durante varios años. surgieron algunos problemas prácticos muy significativos. el esfuerzo para hacer de SQL una tecnología viable para las aplicaciones OLTP apartó la 'atención de los puntos fuertes originales de las bases de datos relacionales en procesamiento de consultas y en toma de decisiones. Una organización independiente de los fabricantes. en servidores de bases de datos de gama alta. las consultas de apoyo a las decisiones pueden implicar búsquedas secuenciales de grandes tablas de las bases de datos para responder a preguntas como el tamaño promedio de los pedidos por región de ventas o la comparación entre las tendencias de inventario entre un año y el anterior. que suelen implicar a varios fabricantes de SOBD y a diferentes plataformas informáticas. SQL Server. en teoría. Mediante acuerdos con Oracle y con otras empresas. DB2 y otras muchas marcas de SGBD que se ejecutan en las plataformas de los servidores Windows. el Consejo de Procesamiento de Transacciones (Transaction Processing Council). El mismo producto de Microsoft. lnformix. estimuló el rápido crecimiento del segmento de bases de datos para trabajo en grupo. basadas en SQL. Novell también hizo un intenso esfue~o para hacer de su sistema operativo NetWare una plataforma atractiva para servidores de bases de datos para trabajo en grupo. que sólo sirvieron para intensificar la obsesión de los fabricantes por el rendimiento. hizo su debut originalmente como producto para bases de datos de OS/2. pero la combinación NT/SQL Server permitió a los departamentos y a ejecutivos ajenos a los sistemas informáticos emprender por su cuenta proyectos del nivel de trabajo en grupo de menor escala. como el añadido de un nuevo pedido a la base de datos o la determinación del saldo de la cuenta de un cliente. así como el soporte popular de las computadoras personales una década antes. Debido a la potencia del modelo de bases de datos relacionales. Desde los primeros días de las redes de área local de computadoras personales. SQL Server. Otro problema es que los datos para la respuesta a las preguntas útiles sobre tendencias comerciales suelen estar dispersos en muchas bases de datos diferentes. a menudo. Un tema habitual de las conferencias y los discursos de las ferias para gerentes de sistemas informáticos era que los datos acumulados de cada empresa (almacenados en bases de datos de SQL. De hecho.dianas también podían utilizarse para analizar las cantidades crecientes de datos que se estaban acumulando. los sistemas servidores basados en Windows están lanzando un continuo asalto a las aplicaciones de bases de datos de tipo empresarial. A SQL Server de Microsoft se han unido Oracle. y el que crece más rápidamente. Sin embargo. las bases de datos relacionales. Si un analista de la industria intentara ejecutar una de estas consultas en un momento en que los volúmenes de transacciones comerciales alcanzaran su máximo. más similar a la de los sistemas operativos para minicomputadoras. NT tenía una arquitectura más sólida y de propósito general. Los departamentos empresariales de sistemas informáticos fueron en principio muy cautos respecto al empleo de tecnología relativamente nueva y sin . Las bases de datos de SQL basadas en Windows son el segundo mayor segmento del mercado de SGBD. entró en la guerra de las pruebas de rendimien· to con una serie de pruebas de rendimiento independientes del fabricante (TPC-A. TPC-B y TPC-C). A fines de los años noventa.48 SOL. superaron la marca de las mil transacciones por segundo. y los problemas prácticos de rendimiento que generaba a las aplicaciones OLTP. sin la ayuda de los sistemas informáticos de sus empresas. A mediados de los años noventa. hoy en día una parte fundamental de la estrategia Windows de Microsoft. SOL Y los almacenes de datos SOL Y las bases de datos para trabajo en grupo El espectacular crecimiento de las redes de área local para computadoras personales a 10 largo de los años ochenta y noventa supuso una nueva oportunidad para la gestión de bases de datos departamental o para trabajo en grupo. Manual de referencia Capítulo 3: SQL en perspectiva 49 casi en su totalidad en estas guerras de pruebas de rendimiento. Estas consultas pueden tardar minutos u horas. Novell intent9 extender también este liderazgo a los servidores de bases de datos para trabajo en grupo. Desde 'este sólido dominio del segmento del trabajo en grupo.de datos relacionales podían. Los sistemas cliente/servidor que utilizan bases de datos SQL se han convertido en la arquitectura aceptada para la implementación de aplicaciones OLTP. podría ocasionar un grave deterioro en el rendimiento OLTP. se vendía) con NT como una plataforma para bases de datos para trabajo en grupo muy integrada. El deseo de aprovechar los datos comerciales acumulados. Las prue-:' bas de rendimiento y la competencia entre las principales marcas de SGBD se centró en las transacciones sencillas. llevó al concepto . llevar a cabo fácilmente tanto aplicaciones de OLTP como de toma de decisiones. NetWare se había establecido como el sistema operativo de red dominante para los servidores de 'archivos y de impresión. por supuesto) deberían tratarse como un activo valioso y emplearse para ayudar a mejorar la calidad de la toma de decisiones empresariales. Las cargas de trabajo de OLTP consisten en muchas transacciones breves con las bases de datos. socavando de manera lenta pero segura las implantaciones de bases de datos de gama baja basadas en UNIX.

crecimiento porcentual. La extracción y transformación de los datos puede programarse para su procesamiento por lotes fuera de las horas punta.'::=:s:. Se formó una serie de empresas nuevas para crear las herramientas de extracción y transformación de datos y de consulta de la base de datos necesarias para el modelo del almacén de datos.eran una opción clara para el almacenamiento del almacén de datos. Manual de referencia Capitulo 3: SOL en perspectiva 51 de almacén de datos.. Para abordar las necesidades especializadas de las aplicaciones de los almacenes de datos (a menudo denominadas Procesamiento en conexión analítico.-. Con su atención en la entrega de contenido en forma de texto y de gráficos. se les vuelve a dar formato y se validan según sea necesario.demás suelen crearse a petición del usuario. Por ejemplo. Algunas de estas bases de datos especializadas no utili- zaban SQL.de negocio de clientes l. y no la base." o 8 " '" l. El concepto de almacén de datos. el análisis de los datos de ventas de productos o de cuotas de mercado a lo largo del tiempo-. en e! sitio web comercial de un detallista. fuerza motriz del crecimiento de Internet. Las bases de datos relacionales basadas en SQL . las ofertas esp~ciales y. y exigían datos de series temporales -por ejemplo. con base en los datos rec~perados de una base de datos de SQL. ~ 'E o u o o • E Servidor de bases de_datos LAN Servidor de bases de datos Unix Gran sistema · • Ü ~ Base de Base Base Aplicación datos ¡. .50 SOL... Su rendimiento se ajustó para el acceso a consultas complejas sólo de lectura.• . Herramientas de extracción y formato de datos . sus precios.6. de manera análoga... más que los propios datos. pero muchas sí lo hacían (lo que llevó al término adjunto ROLAP. E • ~ . IJ. Estas bases de datos se optimizaron de diferentes maneras para las cargas de trabajo OLAP.:=t==. transformados al formato de páginas HTML de la web. En el sentido inverso. así como el cálculo previo de los datos . de datos -' J Figura 3. debido a su procesamiento flexible de las consultas. Estas consultas solían ser grandes y complejas -como el análisis de decenas o centenares de millones de recibos de cajas registradoras para buscar patrones de adquisición-de productos-." . y se ubican en una base de datos independiente que está dedicada a las consultas para toma de decisiones (el «almacén}»). volumen promedio de los pedidos.. comenzaron a aparecer bases de datos especializadas.~ I I I / ~ SOL Y las aplicaciones distribuidas en Internet A fines de los años noventa. SGBO I¡de datos del+SGBO de datos del+. de Procesamiento analítico relacional en conexión (Relational OnLine Analytic Processing). Con este esquema. . hacia mediados de los años noventa gran parte del contenido ofrecido en los sitios web empresariales tenía su orige-Q. Los datos comerciales se extraen de los sistemas OLTP. semanal o diario de puesta al día del almacén.. . lo que minimizaría la cantidad de datos que habría que procesar en el ciclo mensual. en bases de datos empresariales basadas en SQL. Herramientas de análisis de datos y elaboración de informes Solicitud~r. Además. La inmensa mayoría de las páginas mostradas por los sitios de subastas en línea o por los sitios de las agencias de viajes en línea se basan.y las bases de datos' basadas en SQL se han establecido con firmeza como la tecnología habitual para la creación de almacenes de datos. El almacenamiento de datos se ha convertido en un segmento de más de mil millones de euros anuales del~mercado de bases de datos.&. .-l Sal SGSD +-Oatos K Almacén. También tendían a exigir resúmenes estadísticos de los datos ~ventas totales... que puede verse en la Figura 3. los fabricantes de SGBD comenzaron a centrar su atención en el tipo de consultas a las bases de datos que los clien- tes solían ejecutar en los almacenes de datos. Sin embargo. como origen de datos. etc. en los datos recuperados de bases de datos de SQL..='J11 productos ~=+=J inventarin heredada l. las ventajas de SQL como estándar demostraron que eran una fuerza importante. World Wide Web y la posibilidad de exploración web que permitió fueron la. Asumían funciones estadísticas y otras funciones de tratamiento de datos avanzadas. de modo que la recuperación de los promedios y de los totales pudiera ser muchísimo más rápida. la disponibilidad de los productos. las consultas de análisis comercial que consumen tanto tiempo utilizan el almacén de datos. OnLine Analytical Processing..estadísticos de las bases de datos. como el procesamiento incorporado de series temporales. los primeros usos de la web tuvieron poco que ver con la gestión de datos. OLAP). Lo ideal sería que sólo se pudieran extraer datos nuevos o modificados. los datos introducidos por el usuario en los formularios de las páginas del explorador casi siempre se capturan en bases de datos de SQL que forman parte de la arquitectura del sitio web. Al igual que en tantos segmentos del mercado de bases de datos.de datos OLTP. las páginas que contienen la información sobre los productos disponibles para la venta. .> o • ~ .~ íg - rl.

con la vieja costumbre de la industria informática. el modelo relacional de datos representó un intento de racionalizar y simplificar los primeros modelos de datos.• SQL se ha convertido en el lenguaje estándar para la gestión de bases de datos en una amplia gama de sistemas informáticos y áreas de· aplicaciones. y la actividad en esta área mantendrá a SQL en el centro de atención de la industria hasta bien entrada la primera década del siglo. un estándar para el intercambio de datos estructurados. la atención de la i.. incluidos los grandes sistemas. CAPíTULO 4 Bases de datos relacionales Resumen Este capítulo ha descrito el desarrollo de SQL y su papel como lenguaje estándar para la gestión de bases de datos relacionales: • SQL fue desarrollado originalmente por investigadores de lBM. los sistemas OLTP. las estaciones de trabajo. Los fabricantes establecidos de bases de datos relacionales han respondido con sus propias iniciativas XML. Ambas arquitecturas otorgaron un papel clave a XML. Los primeros modelos de datos Cuando la gestión de bases de datos se extendió en los años setenta y ochenta. . y el fuerte soporte de IBM es una razón fundamental de su éxito. Las estructuras de los datos y las técnicas de acceso proporcionadas por cada SOBn son su modelo de datos. En respuesta a la atención prestada por la industria a los servicios web se ha anunciado gran cantidad de productos que enlazan los mensajes con formato XML y las bases de datos basadas en SQL. De acuerdo . La interacción entre XML y SQL es una de las áreas más activas en la gestión de datqs hoy en día. argumentando que ofrecen una contrapartida ideal y nativa para el intercambio de datos con formato XML por Internet. hay muchas pequeñas variaciones entre los dialectos comerciales de SQL. resulta útil examinar brevemente algunos modelos de datos que precedieron al desarrollo de SQL. todos los datos almacenados de manera permanente en los sistemas informáticos. cada uno de ellos ligeramente diferente de los estándares ANSI/ISO.NET y un bando rival centrado eh Java y los servidores de aplicaciones basados en J2EE. Los nuevos fabricantes de bases de datos y algunos de los vendedores de bases de datos orientadas a objetos han anunciado productos de bases de datos basados en XML. como los datos que residen en las bases de datos de SQL.52 SOL Manual de referencia A comienzos de este siglo. como los 53 . SQL es un lenguaje de bases de datos para bases de datos relacionales que utiliza el modelo relacional de datos. Para comprender el papel y la contribución de SQL y del modelo relacional. aparecieron bandos enfrentados que defendían diferentes conjuntos de estándares y de lenguajes para implementarlos: un bando liderado por Microsoft bajo la cobertura . Cada uno de estos modelos de datos primigenios tenía ventajas e inconvenientes que desempeñaron papeles fundamentales en el desarrollo del modelo relacional de datos. • Pese a la existencia de estándares.. ¿Qué es exactamente una base de datos relacional? ¿Cómo se almacenan los datos en las bases de datos relacionales? ¿En qué se diferencian las bases de datos relacionales de tecnologías anteriores. Estas arquitecturas de aplicaciones distribuidas recibieron una amplia cobertura de la prensa especializada bajo la denominación de servicios web. . añadiendo a sus productos posibilidades de entrada y salida XML y. • Hay estándares oficiales ANSIJISO de SQL y otros varios estándares de SQL. Los sistemas gestores de bases de datos organizan y estructuran los datos de modo que los usuarios y los programas de aplicación puedan recuperarlos y manipularlos. los sistemas cliente/servidor.ndustria había pasado a la siguiente fase de internet y al papel que pueden desempeñar las tecnologías de inter· net en la conexión de las aplicaciones de las computadoras entre sí. . Sistemas gestores de archivos Antes de la introducción de los sistemas gestores de bases de datos.. como las bases de datos jerárquicas y las bases de datos de red? ¿Cuáles son las ventajas e inconvenientes del modelo relacional? Este capítulo describe el modelo relacional de datos adoptado por SQL y lo compara con estrategias anteriores para la organización de las bases de datos. soporte de los tipos de datos XML. aparecieron unos cuantos modelos de datos que se popularizaron. En muchos aspectos. en algunos casos. no hay dos variedades de SQL exactamente iguales. los almacenes de datos e Internet. El modelo de datos determina tanto la «personalidad» del SOBn como las aplicaciones para las que se halla especialmente bien adaptado. las computadoras personales.

Si se modificaba la estructura de los datos -por ejemplo. El manejo de esta lista de componentes. carrocería. junto con Jos datos. así sucesivamente. cada vez se dedicaba más esfuerzo del departamento de procesamiento de datos a mantener las aplicaciones existentes.y el modo en que esos datos están organizados. La lisla de materiales de un producto tiene una estructura jerárquica natural. no sabía nada del contenido interno de los archivos. al desarrollo de sistemas gestores de bases de de datos. Si un fabricante de automóviles decidía producir diez mil unidades de un modelo de coche y cinco mil de otro modelo. J~ Archivo maestro emplea~os I I I I I I I I I Figura 4. y. en lugar de a desarrollar otras nuevas. El conocimiento sobre el contenido de los archivos -los datos que contienen . bujías). y así. que vinculan cada parte con sus componentes. necesitaba conocer el número de piezas que debía encargar a sus proveedores. Para almacenar estos -datos se desarrolló el modelo jerárquico de datos. Programa de emisiones de cheques FD ¡ I FD I I Aplicación para nóminas que emplea un sistema gestor de archivos. Figura 4. Bases de datos jerárquicas Una de las aplicaciones más imponantes de los primeros sistemas gestores de bases de datos era la planificación de la producción para las empresas manufactureras. realizaba el seguimiento del nombre"y d~ la ubicación de los archivo~. FD) que indicaba la disposición de los datos en el archivo. que se muestra en la Figura 4. Para responder a esta pregunta había que descomponer el producto (coche) en sus partes (motor. sucesivamente. generalmente proporcionado por el fabricante la computadora como parte de su sistema operativo. chasis). Como el número de archivos y de programas crecía con el tiempo. un archivo que contuviera un documento d~ un procesador de textos y uo'archivo que contuviera datos de una nómina parecían iguales.1. cilindros. Un sistema gestor de archivos. . a fines de los años sesenta. conocida como lista de materiales. Base de datos jerárquica de una lista de materiales. Al utilizar la información de la base de datos. Los registros tienen relaciones padre/hijo.2. si había que almacenar un elemento de datos adicional para cada empleado-. Programa de actualización de empleados FD I I I I I I I I Programa de informes de empleados FD '. había que modificar cada programa que tuviera accesq al archivo. En esta aplicación para nóminas cada uno de los programas de COBOL que procesaban el archivo maestro del empleado contenía una descripción del archivo (file description. En este modelo cada registro de la base de datos representa un componente concreto. Los problemas del mantenimiento de grandes sistemas basados en archivos llevó. Para el sistema gestor de datos. el SOBD que la controlaba podría adoptar un papel mucho más activo en la gestión de los datos y de las modificaciones de la estructura de la base de datos. que a su vez había que descomponer en sus componentes (válvulas.1. Manual de referencia Capítulo 4: Bases de daros relacionales 55 registros de las nóminas y de la contabilidad. El sistema gestor de archivos básicamente carecía de modelo de datos.2. era un trabajo hecho a medida para las . La idea subyacente a estos sistemas era sencilla: sacar de cada .54 SOL.se incorporaba en los programas de aplicación que utilizaban el archivo. se guardaban en archivos individuales.computadoras. en una base de datos. como se muestra en la Figura 4.programa la definición del contenido y la estructura de los archivos y almacenarla.

La estructura de este tipo de dalos simplemente no encajaba en la estricta jerarquía de IMS. En una base de Figura 4.3. y prefirió ampliar IMS a lo largo de los años. Su rendimiento bruto lo convierte eñ·la base de datos preferida para las aplicaciones de elevado volumen de procesamiento de transacciones. que se hizo muy popular. navegar por los registros. que se introdujo por primera vez en 1968. Clientes Vendedores Productos Bases de datos en red La sencilla estructura de las bases de datos jerárquicas se volvió un inconveniente cuando los datos pasaron a tener una estructura más compleja. por tanto. Manual de referencia Capítulo 4: Bases de datos relacionales 57 Para tener acceso a los datos de la base de dalas un programa. IMS) de IBM. se desarrolló un nuevo modelo de datos de red.56 SOL. por lo que el movimiento por la base de datos era rápido. subiendo. IMS sigue siendo un SGBD muy utilizado en los grandes sistemas de IBM.3. lo que minimizaba las operaciones de entrada y salida de disco. • «Bajar» hasta el primer nodo hijo (la manilla de la puerta). comprobación de los números de las tarjetas de crédito y seguimiento de la entrega de paquetería urgente. Unos de los sistemas gestores de bases de datos jerárquicas más populares era el Sistema de gestión de la información (Information Management System. el gran número de datos empresariales almacenado en bases de datos de IMS garantiza que el empleo de IMS se prolongue hasta mucho después de que las bases de datos relacionales hayan eliminado la barrera del rendimiento. El modelo de dalOs de red amplió el modelo jerárquico permitiendo que cada registro formara parte de varias relaciones padre/hijo. • «Subir» hasta su nodo padre (la carrocería). Aunque el rendimiento de las bases de datos relacionales ha mejorado espectacularmente en la última década. que se conoció como el modelo CODASYL. podría llevar a cabo las tareas siguientes: • Hallar un componente determinado por su número (como pudiera ser la puerta izquierda). como el procesamiento de las transacciones de los cajeros automáticos de los bancos. • ~overse «de lado» hasLa el siguiente nodo hijo (la puerta derecha). Como la estructura era sencilla. IMS almacenaba las relaciones padrelhijo en forma de punteros físicos de un registro de datos a otro. que vinculan el pedido al cliente que lo ha formulado. Además. • Bajar hasta el primer hijo de un conjunto determinado (el primer pedido rea· ¡izado por el cliente). por ejemplo. las empresas independientes de software se apresuraron a adoptar el modelo de red. Para los programadores. Los programas de aplicación podían hacer lo siguiente: • Hallar un registro padre concreto mediante su clave (que puede ser el número de cliente). Pedidos Relaciones padre/hijo múltiples. • Organización padre/hijo. tener acceso a las bases de datos de red era muy parecido a tener acceso a las bases de datos jerárquicas.4. Total de Cincom y el SGBD Adabas. Para poder trabajar con aplicaciones como las de procesamiento de pedidos. La recuperación de los dalOs en las bases de datos jerárquicas exigía. como «A es parte de B» o «A datos de procesamiento de pedidos. al vendedor que )0 ha tramitado y al producto solicitado. como puede verse en la Figura 4. cada pedido puede formar parte de tres relaciones padre/hijo diferentes. Las ventajas de IMS y de su modelo jerárquico son las siguientes: • Estructura sencilla. durante los años setenta. los requisitos de rendimiento de las aplicaciones de este tipo también se han incrementado. Las bases de datos de IMS eran excelentes para la representación de las relaciones padre/hijo. Estas relaciones se denominaron conjuntos en el modelo de red. En 1971 la Conferencia sobre lenguajes de sistemas de datos (Conference on Data Systems Languages) publicó un estándar oficial para bases de datos de red. bajando y desplazándose lateralmente registro a registro. es propiedad de B•. como puede verse en la Figura 4. La organización de las bases de datos de IMS era fácil de comprender. . Pero. IBM no desarrolló nunca un SGBD de red propio. por lo que IMS sigue teniendo un papel que desempeñar. La jerarquía de la base de datos era análoga al organigrama de una empresa o a un árbol genealógico. • Rendimiento. creando productos como IDMS de Cullinet. IMS podía situar los registros padres e hijos cercanos unos de otros en el disco.

58 SOL. como el producto más solicitado por Acme. Tanto las bases de datos jerárquicas como las de red eran herramientas para los programadores. Al principio. implementaron bases de datos de red. además de la dirección. CocId escribió un artículo en 1985 en el que establecía doce reglas que debía seguir cualquier base de datos que se denominara «verdaderamente relacional». en su lugar. Codd lo describió por primera vez en 1970. la importancia de las bases de datos de red se hallaba en franco declive. resultaban muy rígidas. la información que aportaba solía carecer de valor. El estándar CODASYL impulsó la popularidad del modelo de red. No obstante. Para responder a una pregunta. Eliminaba de las bases de datos -las estructuras padrelhijo explícitas y. Al igual que las bases de datos j-erárquicas. Las bases de datos de red siguieron siendo importantes durante los años setenta y principios de los años ochenta. las bases de datos de red presumían de un rendimiento próximo al de las bases de datos jerárquicas. Pese a su mayor complejidad.4. representaba todos los datos de la base de datos como meros valores de filas y columnas en tablas de datos. el Dr.4. esta vez especificando la relación por la que hay que navegar. Una vez más. A medida que el concepto relacional crecía en popularidad. en algunos sistemas. el programador tenía que navegar por la base de datos registro a registro. • Desplazarse lateralmente de un hijo al siguiente del conjunto (el siguiente pedido realizado por el mismo cliente). Las bases de datos de red también tenían sus inconvenientes. Los primeros sistemas gestores relacionales de bases de datos no lograron implementar algunas partes fundamentales del modelo de Codd. • Subir desde un hijo a su padre en otro conjunto (el vendedor que tramitó el pedido). La pila de solicitudes atrasadas de informes personalizados solía extenderse a semanas o meses. muchas bases de datos que se denominaban «relacionales». Una base de datos de red (CODASYL) para el procesamiento de pedidos. la definición práctica de lo que es u~ base de d3:~oS relacional se volvió mucho menos rotunda que la definición matemática precisa del trabajo de Codd de 1970. y hoy en día ya no desempeñan un papel importante en el mercado de las bases de datos. el modelo relacional no fue mucho más que una curiosidad académica. La modificación de la estructura de la base de datos solía exigir la reconstrucción de toda la base de datos. Manual de referencia Capítulo 4: Bases de datos relacionales 59 Conjunto Figura 4. Por desgracia. Había que especificar las rela- El modelo relacional de datos El modelo relacional propuesto por el Dr. cuya popularidad iba en aumento. . el programador tenía que escribir un programa que se desplazara por la base de datos. . como-Digital Equipment Corporation y Data General. y los fabricantes de minicomputadoras. Para principios de los años noventa. el modelo relacional se fue imponiendo claramente como la «nueva ola» en gestión de datos. Codd era un intento de simplificar la estructura de las bases de datos. Los conjuntos se representaban como punteros hacia los registros físicos de los datos y. y para el momento en que el programa estaba escrito. especialmente en los sistemas de minicomputadoras. • Estandarización. " Las bases de datos de red tenían varias ventajas: • Flexibilidad. a mediados de los años ochenta. . el administrador de la base de datos podía especificar las agrupaciones de los datos de acuerdo con las relaciones de los conjuntos. Los inconvenientes de los modelos jerárquico y de red motivaron un intenso interés en el nuevo modelo relacional de datos cuando el Dr. La existencia de varias relaciones padre/hijo permitían a las bases de datos de red representar los datos que no tení~n una estructura jerárquica sencilla. no lo eran.5 muestra una versión relacional de la base de datos "de red para el procesamiento de pedidos de la Figura 4. dones de conjunto y la estructura de los registros con antelación. Las doce reglas de Codd se han aceptado desde entonces como la definición de los verdaderos SGBD relacionales. resulta más sencillo comenzar con una definición menos formal: Una base de datos relacional es una base de datos en la que todos los datos visibles para el usuario están estrictamente organizados como tablas de valores de datos y en la que todas las operaciones de la base de datos se realizan sobre estas tablas. En respuesta a la degradación del ténnino «relacional». La Figura 4. Sin embargo. en realidad. • Rendimiento.

pero éstas quedan representadas estrictamente por los valores de los datos comenidos en las tablas de la base de datos. .00 € 150. '" '" ~.60 SOL Manual de referencia Capítulo 4: Bases de datos relacionales 61 Tabla PRODUCTOS OESCRIPCION Serie 3.458. como el nombre de la empresa. '" U" Haot ". 2118 2103 2111 211) Esta definición está pensada específicamente para excluir estructuras como los punteros incorporados de las bases de datos jerárquicas y de red. ~.. '" '" '" '" ." Barrilete '" " m Figura 4.. ".ble 41003 ll<Uice Bulón XK4B Reductora " ". "• .100..000. '" .S00. La base de datos de ejemplo (continúa).00E SS ooE 180 ooe 1. el límite de crédito y el representante que llama al cliente.00 € 776. '" BIC. las ventas en el año en curso y otros datos sobre cada representante. 112993 113065 113003 11)049 112981 113057 n30U no.A.000. Tabla CLIENTES EMPRESA REP CLI 105 LIMITE CREOITO 11302.~ Figura 4.00 € € 4.00 € € ~. .O' Acme JCP S. .OO € 3.00 € 600. '" '" ~.U (100) 4100. Una base de datos relacional para el procesamiento de pedidos.UR 41004 10 4S.U ".~ ~.145.~ . .00 € 50.000. la región comercial a la que pertenece. '" ". 4100Y noox 5.750. La base de datos de ejemplo contiene cinco tablas.00 € 22. • 702.00 € 350. '" ". 113062 112979 113027 113007 1130H 111014 112992 112915 113055 1130U '" '" '" O" ".a96. su nombre.625.00€ 652. '" " " '" ZM' Llave 112 Iluso 41089 RU<m UOOl Serie 1. .PWlDO CLID:TE 2117 2111 u.00 € ~.00 € 1.750. '" '" " ".00 € 22 31 350. incluidos la ciudad en la que se ubica la oficina.00 €o .00 € 632. "• • ".00 € 2. .00 € 1.216. .U .500.6 muestra una pequeña base de datos relacional para una aplicación de procesamiento de pedidos. cable Serie 4." S~~~~ 3. . .6. .00 € 117. etc.~ 773c 77SC 2A4SC 41002 2"44G UOOx 779c 2At'>C 2 925. '" '".430.87S. m U" ".00 € Acme JCP S. ~. ~.OO€ 148 OO€ 5'. • La tabla OFICINAS almacena los datos sobre cada una de las oficinas. XK41 '" • " ".00€ 107.O' 4100Z 41002 2.000.00 € STOCK 207 139 Tabla PEDIDOS _ _PEVlOO PECHA. .00€ Z50.00 € 2.C ".00 "615. . '"- -" 2..=.00 € 1. Los SOBD relacionales pueden representar las relaciones padrelhijo. " 'w~ CAllTlDAD IKI'ORTE 7 )1. 28 6 6 35 OO • n/ovugo 08/0111990 27112/1989 20/01119'0 24/0211990 12110/1989 22/01/1990 08/01/1990 0210311990 29/01/1990 04/11/19U 12110/1989 15/0211990 10/0211990 0'10111989 27/0211990 25/0111990 10/0211990 31/12/1989 18/02/1990 0210211990 2124 2101 2114 2124 2114 2103 2112 2109 n01 2118 2111 2108 2120 2106 2106 .00.A.A.00 €o 652." OS' OS' ~.104. Cada tabla almacena la información sobre una clase concreta de entidad: • La tabla CLIENTES almacena datos sobre cada cliente.130. 2l..00 € . 41004 Serie 4.00 € 1." '" '" . ".5.'. 77. '" "" . ".100.. 3.00€ 117.480.00E '. " .420.00 € 7. • La tabla REPRESENTANTES almacena el número de empleado..00 € .978." " . no R""'-uctora 41672 Plato 779c 90·kg bruo 4100) .~ 50. Acme JCP S. no ".00€ .~ . cable Hilo de cobre PRECIO 107.. .. Esta base de datos de ejemplo se usa a lo largo del libro y proporciona la base para la mayor parte de los ejemplos.00 €o 652.00 2AUI- €o 4100) 41002 " .500. m m m ~.00 € 760. 112961 113012 17112/1989 llfOllU90 0l/01/1990 10/0211991) 14 112989 113051 2101 2118 112958 12/10/1989 2102 2107 2112 2101 2118 2108 Tabla PEDIDOS NUK PEDIDO 112963 112975 112983 113012 CLIENTE PRODUCTO 41004 2A44G 41004 41003 CANTIDAD 113036 111045 112961 113013 111058 U2997 112983 lO/Olflno 02/02/1990 1111211989 14/01/1990 ". 2"UR Tabla PRODUCTOS IDJAB ID_PRODUCTO DESCRIPCION 2A<S 4100 Zftpa~:~ La base de datos de ejemplo La Figura 4.00 E 11 27. 41001 .00E 55. '" .00 € 103 '" '" '" OO. El Apéndice A contiene una descripción de la estructura de la base de datos y de su contenido.00e 134..00 €o 1.'>OO. ".00 "5 22. su edad.00 € 3.

dos AAJ>. . .00 55.~.. .00 E: 2".000.000. $001_ S.....775.. ro~ Ilepr..00 lO.00 t! 1I6.000.00'. el producto solicitado..00 E: lOO. S. 2101 .. La columna JEF muestra el número de empleado de la persona que dirige la oficina... .OO€ VENTAS lB6. • La tabla PRODUCTOS almacena los datos sobre cada producto disponible para la venta. 800..o~o.t"" • SUs.... '" '" U. s lb.OO f: !>O..000 00 25.. .OOO 00 ~S. f: f: .. 210l ...n.00 f: ~0.... ¡.00€ 735.. !lEP C!. por ejemplo.000. OFICINAS OFICINA n Po. " " ".'12.1l:TlYO VUlTAS " ..c212l C..suele escribirse como encabezado en la parte superior de la columna.725... l<epruen • . todos los valores de los datos de esa columna comparten el mismo tipo de datos... Representan.. ~~ 350..00 E: 21$."I14<1 1J Al_d. la columna CIUDAD contiene el valor «Navarra»...OO f: 575.000..0U.00 n7.1.A. ..nt.t.O.0OO.OO€" 575..co S...OOO.~'r.00 E: 300. El dominio de la columna VENTAS es cualquier cantidad de dinero..OOO.". la cantidad y el importe del producto.A. U..bl. Jefe V"" .042.637. ~ ~ Of"ICI B.OO E: datos tiene un nombre de tabla único que identifica su comenido.000.. .000.911.00 E: )50. Ileu& A.A.... Todas las columnas de una Figura 4.. 45... ..911.. n'an~ .042. y todos los valores de la columna JEF son enteros (que· representan los nú· meros de empleado).5~ •.00 E: lOO....637. liarla Ji. La columna VENTAS contiene los totales de ventas del año en curso para cada oficina...00 €». identificando al representante que tramitó la orden. . OFICINA CIUDAD 22 Daimiel 11 Navarra 12 Castellón 13 Almería 21 Los Ángeles Ciudad en la que se ubica la oficina REGIÓN Oeste Este Este Este oeste JEF 108 10G lO' lOS 108 OBJETIVO 300.000.. .. '" .000... cada pedido es para un solo producto.00 € l61..OO. VP V.000. '" . CMo Aao<:i. 2124 'ascual He.00 1l5.7. '" .....OO€ 350.00 E: 474.00 f: l5. .. ~" 12 Ca... " " " " " " " " " Represen""'~. ~~ro 1210211. .000.00 f: 20.865.8 12110/19$9 1011211...00 f: l.000.00 € U2. In••ma"'ona1 2115 Si.A.00 f: U..00 735. que es el total de ventas de la oficina de Navarra para el año en curso.050. . l57.. REPRESENTAm'f:S '" . s. ". cada usuario escoge sus propios nombres de tablas sin preocuparse de los nombres escogidos por otros usuarios...OOO.000..000..OO f: 40.. Su León Pnin Pablo e . J. o. En cada columna de una tabla..00 E: l50.) La estructura de filas y columnas de las tablas se muestra con mayor claridad en la Figura 4...OO€ +-- Los datos de esta fila son para esta oficina ~Losdatos t Tablas El principio organizativo de las bases de datos relacionales es la tabla.s""tant...'.00 € U6.lU.000.OOO.o. Rl. El conjunto de valores de datos que puede . Cada fila de una tabla contiene exactamente un valor de datos en cada columna. .OOO.91l...000. . rAda Sist. (Realmente. f: ..00€ 367.000. Cada tabla de la base de Número de empleado del jefe de la oficina t t Ventas de la oficina en el año en curso de esta fila son para esta oficina Figura 4.00 f: f: f: lE f: labl.00 lO. su descripción y su precio. IIoIj. En la fila que representa la oficina de Navarra. La columna VENTAS contiene el valor «692.6.rru S. que·.e Repru. La estructura en filas y columnas de las tablas relacionales.son importes monetarios.OO € ~.1 S. porque ésas son las dos únicas regiones comerciales que tiene la empresa.te " " " " " " U ro" ..62 SOL.000.000. 1 ku1drobo '" '" 1""". una disposición rectangular en filas y columnas de valores de datos.. Jefa V"" .OO lE f: f: .00 U2.0·O€ 692...OO 50.000.. .00 '5. .. ... como se explica en el Capítulo 5. 2101 J.1 • l>ij". Il/0III"0 lUIO/Un 0l/Ol/1981 It/Il/U88 . 00 E: l05..¡d 11 "'v..U1.OOO. Cada columna de una tabla tiene un nombre de columna. 2112 U pro<hK:ciones 2121 I. Por ejemplo. 105 10B lOO. . Tabla OFICINAS • La tabla PEDIDOS realiza un seguimiento de cada pedido realizado por los clientes.... El dominio de la columna REGION es exactamente dos valores de datos.000..r I.. La base de datos de ejemplo (continuación).. 2111 2102 .rra CIUDAll JP:7 OB.OOO.7..00€ 835.00 E: 215. «Este» y «Oeste». Cada columna vertical de la tabla OFICINAS representa un elemento de datos que se almacena en la base de datos para cada oficina.. ~ .I JC' '" .00 f: 725...00 E: 200.. .0U.042.. todos los de la columna VENTAS .. como su fabricante.6 14/06/1988 19/05/1987 ~O/IO/UU /lepres~t4n'" . S. Inve.000. las cinco filas de la tabla representan las cinco oficinas comerciales de la empresa..OOO. !>O.. I Ch"s1 Ilernarclo Unchn D&ni . 10B 10' 10. En aras de la simplicidad.6po. El dominio de la columna CIUDAD es el conjunto de todos los nombres de las ciudades.000.00 E: 392..IIA oci-oo!oos 21H 0'-.00 '0.u. etc.OOO.. que es una vista aumentada de la tabla OFICINAS. su número de producto.U.. Manual de referencia Capítulo 4: Bases de datos re/acionales 63 Tabla CL1ENTES CLIDlPR!:S... Cada fila horizontal de la tabla OFICINAS representa una única entidad física -una única ofici· na comercial-o Conjuntamente. .985.... '" .673..00 € 186. LIHITE CllEDITO 50. 1.. Todos los datos de cada fila de la tabla se aplican a la oficina representada por esa fila ..00 f: f: 10. ~.contener una columna se denomina dominio de esa columna.. todos los valores de la columna CIUDAD son palabras. .OO f: 15.OO€ 725.d.OOO.91l.n>no .. .00 f: 210' 2117 2122 2120 2106 211' 21l' 21U 210' n05 """"''''" ~ Loópe. L<. Sotoca '1"01_ S.OO€ BOO... P.915.. ro= . '" .....00 E: 75. .00 f: l50..A.000..000.A..000._ Ud.000. Represent.00 l5.

el límite es de doscientas cincuenta y cinco columnas o más por tabla. cable 107. pero no hay nada que prohíba que dos columnas de tablas diferentes tengan nombres idénticos. pero siempre muy generoso -dos mil millones de filas o más es algo habitual. ¿cómo se puede especificar una fila concreta como. PRECIO Y VENTAS. no hay ninguna garantía de que las filas se muestren dos veces en el mismo orden. si se realizan dos consultas consecutivas a la base de datos para que muestre el contenido de una tabla. En consecuencia. que se define cuando la tabla se crea por primera vez. Entonces.eI BIC 41003 41004 41003 Serie 3. Las columnas de una tabla tienen un orden de izquierda a derecha. La clave principal tiene un valor único diferente para cada fila de la tabla. Por supuesto. por ejemplo.- . El nombre «base de datos relacional» proviene de este término.. Cada tabla siempre tiene.00€ Serie 4.8.00E: Hélice 652. DB2 Version 2. Tabla con una clave primaria compuesta. el estándar ANSI! ISO se amplió para incluir la definición de soporte de clave primaria y. y la ca· lumna ID_PRODUCTO especifica el número de producto del fabricante. como los números de oficina (OFICINA en la tabla OFICINAS). una columna. De hecho. Manual de referencia Capítulo 4: Bases de datos relacionales 65 tabla deben tener nombres diferentes. Las tablas sin ninguna fila son perfectamente legales y se denominan tablas vacias (por motivos obvios). La tabla PRODUCTOS. pero no hay nada que impida que dos fabricantes diferentes utilicen el mismo número para sus produc· tos. Los diseñadores de bases de datos solían asegurar que todas las tablas de sus bases de datos tuvie· ran una clave primaria. la fila de la oficina comercial de Daimiel? En las bases de datos relacionales bien diseñadas. fue el primer producto comercial de SQL de IBM que dio soporte a las claves primarias. Tabla PRODUCTOS ID_FAS ID PRODUCTO DESCRIPCIÓN PRECIO STOCK 'CI . «última fila» ni «fila decimotercera» de una tabla. los números de empleado (NUM_EMPL en la tabla REPRESENTANTES) y los números de cliente (NUM_CLI en la tabla CLIENTES) suelen escogerse como claves primarias. Las tablas pueden tener cualquier número de filas. la mayor parte de los sistemas gestores de bases de datos lo ofrecen. los nombres de columnas utilizados frecuentemente. por lo que no hay dos filas de una tabla que tenga clave primaria que sean duplicados exactos la una de la otra. A diferencia de las columnas. La colum· na ID_PRODUCTO podría ser una buena clave primaria.. En el caso de la tabla PEDIDOS no hay opción -lo único que idenli· fica de manera unívoca un pedido es su número de pedido (NUM_PEDIDO). DB2. pero casi todos los productos comerciales de SQL sí que imponen un límite. Figura 4. Aunque las claves primarias son una parle esencial del modelo relacional de datos. El estándar ANSI/ISO de SQL no especifica un número máximo de columnas por tabla. ya que las relaciones (tablas con filas dife· rentes) se hallan en el corazón de las bases de datos relacionales. . los primeros sistemas gestores de bases de datos (System/R. tanto la columna OFICINA como la columna CIUDAD pueden servir como clave primaria de la tabla. Véase una vez más la tabla OFICINAS de la Figura 4..8. las filas de las tablas no tienen ningún orden concreto. Otros _productos de SQL imponen un límite máximo.7. Esta columna (o columnas) se denomina clave primaria de la tabla. Oracle y otros) no proporcionaban soporte explícito a las claves primarias. .. Se garantiza que cada producto de la tabla tenga una combinación única de valores de datos en estas dos columnas. no se puede seleccionar una fila concreta por su posición en la tabla.------. es un ejemplo de tabla en la que la clave principal debe ser una combinación de columnas. No hay una «primera fila». CANTIDAD. Generalmente. impuesta por sus columnas. DIRECCION. pero el SoBD en sí mismo no proporcionaba ningún modo de identificar la clave primaria de cada tabla. Pero si la compañía se expande y abre dos oficinas comerciales en la misma ciudad. y muchos produclOs de SQL permiten que las tablas crezcan hasta agotar el espacio de disco disponible en la computadora.64 SOL. cable 117. hay que utilizar una combinación de las columnas ID_FAB e ID_PRODUCTO como clave primaria de la tabla PRODUCTOS. Por tanto. Se suelen hallar en muchas tablas diferentes de cada base de dalos de producción. parte de la cual aparece en la Figura 4. La columna ID_FAB identifica al fabricante de cada producto de la tabla. El estándar ANSI/ISO no limita el número de filas de las tablas.OOE: 207 139 3 . De hecho. se puede pedir a SQL que organice las filas antes de mostrarlas. A primera vista. como NOMBRE. Las tablas vacías siguen teniendo estructura. como mínimo. pero el orden aplicado no tiene nada que ver con la verdadera disposición de las filas dentro de la tabla. cada tabla tiene alguna colum· na o combinación de columnas cuyos valores identifican de manera unívoca cada fila de la tabla. Claves primarias Como las filas de las tablas relacionales no están ordenadas. la columna CIUDAD ya no puede servir de clave primaria. hoy en día. Clave principal . En la práctica los «números de identificación». Las tablas en las que cada fila es diferente de todas las demás se denominan relaciones en términos matemáticos. introducido en abril de 1988. tan sólo no contiene ningún dato.

valores legales que puede contener) es exactamente el conjunto de números de oficinas hallados en la columna OFICINA de la tabla OFICINA. las claves externas también pueden ser una combinación de columnas. que relacion'a cada pedido con el cliente que lo realizó. Al igual que una combinación de columnas puede servir de. No obstante. por lo que hay una relación obvia entre las filas de la tabla OFICINAS y las de la tabla REPRESENTANTES. El dominio de esta columna (el conjunto de . Manual de referencia Capítulo 4: Bases de datos relacionales 67 Relaciones j Una de las principales diferencias entre los modelos relacionales ~ los modelos de datos anteriores es que los punteros explícitos. De hecho. los valores que contiene esa columna son números de oficinas. Coinciden con los valores de la columna OFICINA. Son. Conjuntamente una clave primaria y una clave externa crean una relación padrefhjjo entre las tablas que las contienen. el modelo relacional tiene toda la potencia del modelo de red para expresar relaciones complejas. • La columna REP es una clave externa de la tabla REPRESENTANTES. La figura muestra un primer plano de unas cuantas filas de las tablas OFICINAS y REPRESENTANTES. se puede hallar la oficina comercial en la que trabaja Maóa liménez buscando el valor de la columna OFICINA_REP (11) de Maóa y buscando la fila de la tabla OFICINAS que tiene el mismo valor en'. como es obvio. De hecho.REGIÓN Oeste Este Este Tabla REPRESENTATES NOMBRE 105 lO' 102 106 Bruno Arteaga Maria Jimenez Susana Santos Samuel Clavel Figura 4. que relaciona cada pedido con el representante que lo tramitó.9. Obsérvese que la columna OFICINA_REP de la tabla REPRESENTANTES contiene el número de oficina de la oficina comercial en que trabaja cada representante. .1a columna OFICINA (en la fila de la oficina de Navarra). la respuesta a la pregunta es «no». Una relación padre/hijo en una base de datos relacional. Por ejemplo. para hallar todos los representantes que· trabajan en Navarra se puede anotar el valor de OFICINA de la fila de Navarra (11) y luego buscar en-la co- lumna OFICINA_REP de la tabla REPRESENTANTES el valor correspondiente (en las filas de María liménez y Samuel Clavel). como las relacIOnes padre! hijo de las bases de datos jerárquicas.clave primaria de una tabla. _estas relaciones también existen en las bases de datos relacionales. las mismas relaciones de la base de datos de red de la Figura 4. la relación se representa mediante valores de datos comunes almacenados en las dos tablas. • Las columnas FAB y PRODUCTO son. La relación padre/hijo entre una oficina comercial y la gente que trabaja en eIJa no se pierde con el modelo relacional. y deben serlo. una clave externa compuesta de la tabla PRODUCTOS. la clave externa será siempre una clave compuesta (multicolumna) cuando haga referencia a una tabla con una clave primaria compuesta. cada representante está asignado a una oficina comercial concreta. están prohibidos en las bases de datos relacionales.9. Uno de los principales objetivos del lenguaje SQL es permitir la recuperación de la base de datos de los datos relacionados entre sí mediante la manipulación de estas relaciones de una manera sencilla y directa. en la base de datos de ejemplo. al igual que las relaciones padre/hijo de las bases de datos jerárquicas. Aunque OFICINA_REP es una columna de la tabla REPRESENTANTES. Tabla OFICINAS OFICIN CIUDAD . la columna OFICINA_REP es una clave externa de la tabla OFICINAS. De manera parecida. que es la clave primaria de la tabla OFICINAS.4. ¿El modelo relacional no «pierde información» al prohibir estas relaciones en la base de datos? Como puede verse en la Figura 4. precisamente. el número de columnas y los tipos de los datos de las columnas de la clave externa y de la clave primaria deben ser idénticos entre sr. Evidentemente. que relaciona cada pedido con el producto solicitado.9. Puede que las diferentes relaciones padrelhijo creadas por las tres claves externas de la tabla PEDIDOS resulten familiares al lector. La Figura 4. Una tabla puede contener más de una clave externa si se halla relacionada con más de una tabla. Claves externas Las columnas de una tabla cuyos valores coinciden con los de la clave primaria de otra tabla se denominan claves externas.10 muestra las tres claves externas de la tabla PEDIDOS de la base de datos de ejemplo: • La columna CLIENTE es una clave externa de la tabla CLIENTES. Como muestra·el ejemplo. conjuntamente. En lugar de eso. En la Figura 4.66 SOL. tan sólo deja de representarse mediante un puntero explícito almacenado en la base de datos. Todas las relaciones de las bases de datos relacionales se representan de esta manera.

Manual de referencia Capítulo 4: Bases de datos relacionales 69 Tabla CLIENTES f:!'l. de modo que los usuarios autorizados puedan aplicar el mismo lenguaje relacional para su consulta que para la de los datos normales. ~ A=e ~\ PEDIDO FECHA_P ~ <ACl 41004) Serie 4. 5. • Autorización. que se muestran en la lista siguiente. cable ~ > ~ 4. Independencia de los datos físicos. no en los programas de aplicaci6n. Los programas de aplicación y las actividades de los tenninales no se ven afectados lógicamente cuando se producen cambios en las representaciones para almacenamiento o en los métodos de acceso. 1 . como cadenas de caracteres y que sea completo en su soporte de todos los elementos siguientes: Figura 4. "'" CLlEIm: 112963 l7-DIC-89 " '>L 10 1\ 105 '" '''' P ODUcro . • Definici6n de los datos. Regla de la actualización de las vistas. Ted Codd presentó doce reglas que deben cumplir las bases de datos para considerarlas verdaderamente relacionales. en teoría. permitan que no se vean afectados. Inserción. < bIes de manera lógica recurriendo a la combinación del nombre de una tabla. 2.10. ya que crean relaciones entre las tablas de la base de datos. • Restricciones de integridad. independientemente del tipo de datos. l..PRESA NUM eLI Tabla REPRESENTANTES NUI'LEKPL Tabla PRODUCTOS ID FAB ID PRODUCTO DESCRIPCI NOMBRE Bruno Arteag<l 3. se han convertido desde entonces en una definición semioficial de las bases de datos relacionales. La posibilidad de manejo de las relaciones de la base de datos o de las relaciones derivadas como un solo operando no sólo se aplica a la recuperación de los datos. Las reglas proceden del trabajo teórico de Codd sobre el modelo relacional y representan realmente más un objetivo ideal que una definición de las bases de datos relacionales.. ReglC:l del acceso garantizado. actualización y eliminación de alto nivel. al igual que con las claves primarias. el soporte de las'c1aves externas estaba ausente de los primeros sistemas gestores de bases de datos relacionales. Los valores NULL (que son diferentes de la cadena de caracteres vacía y de las cadenas de caracteres de caracteres en blanco y de cero o de cualquier otro número) están incluidas en los SGBD completamente relacionales para la representación de manera sistemática de la información ausente y de la información no aplicable. Catálogo dinámico con conexión basado en el modelo relacional. Sin embargo. Toda la información de las bases de datos relacionales se representa de manera explícita en el nivel lógico y exactamente de una manera: mediante los valores de las tablas. 7. Independencia de los datos lógicos. La descripción de la base de datos se representa en el nivel lógico de la misma manera que los datos normales. sino también a la inserción. el valor de una clave primaria y el nombre de una columna. Regla del sublenguaje de datos completo. un lenguaje cuyas instrucciones sean expresabies. Las restricciones de integridad propias de una base de datos relacional concreta deben ser definibles en el sublenguaje relacional de datos y almacenables en el catálogo. Los sistemas relacionales pueden albergar varios lenguajes y diversos modos de empleo de los terminales (por ejemplo. ACI 4 1004) . Los programas de aplicación y las actividades de los terminales no se ven afectados lógicamente cuando se realizan en las tablas base modificaciones de cualquier tipo que preserven la información y que. compromiso y retroceso). 9.. el modo de relleno de los huecos). • Definición de las vistas.68 SOL. Las claves externas son una parte fundamental del modelo relacional. Regla de la información. debe haber. Todas las vistas que. Por desgracia. Varias relaciones padre/hijo en una base de datos relacional. Tratamiento sistemático de los valores NULL. mediante alguna sintaxis bien definida. 6. Las 12 reglas de Codd " En su artículo de 1985 en Computerworld. como mínimo. actualización y eliminación de datos. se han añadido desde entonces al estándar ANSUISO y aparecen hoy en día en muchos productos comerciales. Las doce reglas de Codd. teóricamente. Se añadió en DB2 Version 2. • Manipulación de los datos (de manera interactiva y mediante programaci6n). 10. Independencia de la integridad. sean actualizables también lo son por el sistema. Está garantizado que todos y cada uno de los datos (valores atómicos) de una base de datos relacional sean accesi8. • Límites de las transacciones (comienzo.

. la regla 12 evita «otros caminos» de acceso a la base de datos que puedan subvertir su estructura relacional y su integridad. I l' 1 . la definici6n informal de las bases de datos relacio. Se trata de otra regla que no está incluida en la mayor parte de los productos SGBD comerciales. • Una combinación de claves primarias y claves externas crea una relación padre/hijo entre las tablas que las contienen./ .. Cada tabla tiene sólo una clave primaria. '. • Una clave externa es una columna o una combinación de columnas de una tabla cuyos valores son el valor de la clave principal de alguna otra tabla. deben afectar a la capacidad del usuario para trabajar con los datos.operaciones de inserción. La regla 4 exige que las bases de datos relacionales se describan a sí mismas. Los datos distribuidos y los retos de su gestión se describen en el Capítulo 23. y se obtienen de un conjunto de valores legales denominado dominio de esa columna. por lo que las tablas de puntuación solían estar llenas de notas al pie y de salyedades. y no revelaban gran cosa sobre los productos. etc. Las Lvistas yJos problemas de su actualización se describen en el Capítulo 14.implementación de la seguridad=de la base de datos.... La regla 2 subraya la impo~ncia de las ciaves primarias para' la lótalización de los datos en las bases de datos.SQL. J . La regla 5... • Cada tabla tiene cero o más fiJas. SOL. como SQL. 'j' 1 La reglas 8 y 9 aíslan a los usuarios o a los programas de aplicación de la implementación de las bases de datos a bajo nivel.:. . Resumen SQL se basa en el modelo relacional de datos que organiza los datos de las bases de datos como un conjunto de tablas: • Cada tabla tiene un nombre que la identifica de manera unívoca. La regla 6 trata de las vistas..obliga a emplear . las prestaciones. .' . la estructura de la propia base de·datos. La regla JO dice que el lenguaje de la base de datos debe soportar las restricciones de integridad que restringen los datos que pueden introducirse en la base de datos y las modificaciones de la base de datos que pueden realizarse. eliminación y actualización. de la's bases de datos. sólo una fila cada vez.70 11.prohibir las implementaciones que admiten la modificaci6n mediante navegación. La regla 1 es.que las filas se traten como conjuntos en las . Independencia. ¡:. las bases de datos deben contener determinadas tablas de sistema cuyas columnas describan. Se trata de una de las reglas más difíciles de·implementar. cada una de las cuales contiene un único valor de datos en cada columna. :v nales presentada al comienzo de este apartado. en. Las filas no están ordenadas. En otros términos..datos•. El modelo relacional de datos utiliza las claves primarias y las claves externas para representar estas relaciones entre las tablas: • Una clave primaria es una columna o una combinaci6n de columnas de una tabla cuyos valores identifican de manera unívoca cada fila de la tabla. ' . que se describen en el Capítulo 5. . • Todos los valores de los datos de una columna dada tienen el mismo tipo de datos. la disponibilidad De herramientas de desarrollo. de la distribución. Exige. la calidad del soporte del fabricante. • Cada tabla tiene una o varias colu:mnas con nombre que están dispuestas en un orden determinado. exija específicamente que sea. ni siquiera. La regla 7 subraya la naturaleza orientada a conjuntos de las .No obstante. Regla de la no subversión. El nombre áe la tabla ubica la tabh! correcta..!. de izquierda a derecha..un lenguaje relacional de bases del datos.' .. Hoy en día la base de la competencia entre los fabricantes .. que son tablas virtuales.lapráctica. Estas "tablas se describen en el Capítulo 16. . la disponibilidad de programas de aplicación que soporten ese sistema concreto de bases de datos y.:. El lenguaje debe poder albergar las funciones iundamentáles de los SGBD .' . más que. . i I ] .creación de!\)ases de datos.. En los primeros años noventa.de bases de datos tiende a girar alrededor del rendimiento. el nombre de la columna localiza la columna correcta y el valor de la clave primaria ubica la fila que contiene el elemento de datos concreto que nos interesa. Los SGBD tienen independencia de la distribución. para mostrar su grado de cumplimiento de estas reglas. . Cada tabla puede contener más de una clave externa. ·y-hoy en día ningún producto comercial la cumple totalmente. otros aspectos.. Finalmente. Las tablas están relacionadas entre sí mediante los datos que contienen. estas reglas son subjetivas.. básicamente..' .. La regla 11 dice que el lenguaje de la base de datos debe poder manipular los datos distribuidos ubicados en otros sistemas informáticos. . Manual de referencia Capítulo 4: Bases de datos relacionales 71 12. que la vincula a una o varias tablas. Especifican que ni las técnicas concretas de acceso o de almacenamiento empleadas por el SGBD y. se hizo popular la compilación de «tablas de puntuación» para los productos de SOBD comerciales. La ~egla 3 exige el soporte de los datos que faltan mediante los valores NULL. las modificaciones en la estructura de las tablas de la base de datos. aunque no se. Por desgracia.. empleadas :para dar a diferentes usuarios de la base de datos vistas:diferentes de :su estructura. Si un sistema relacional tiene un lenguaje de bajo nivel (un solo registro cada vez). son una parte importante de la historia del modelo relacional. recuperación e introducción de. . . Esta regla está pensada para . . . <. sobre sU"conformidad con las reglas de Codd..bases de datos relacionales. ese nivel bajo no puede utilizarse para subvertir o soslayar las reglas de integridad ni las restricciones expresadas en el lenguaje relacional de alto nivel (varios registros a la vez).

y muchos usan SQL como herramienta de consulta de bases de datos.se describen en el Capítulo 8. Las consultas que resumen datos . El Capítulo 5 describe las tructuras básicas del lenguaje SQL que se usaD para fQrmar las instrucciones SQL. Los cinco capítulos siguientes describen las consultas SQL en profundidad. el Capítulo 9 explica la capacidad de las subconsultas SQL que se usa para manejar consultas complejas. Finalmente.Parte II RECUPERACiÓN DE BATOS ~ Las consultas son el corazón del lenguaje SQL. es- . El Capítulo 6 estudia consultas simples que obtienen datos de una única tabla de datos. El Capítulo 7 expande el estudio a consultas sobre varias tablas.

,.

.', .-', ..-..,. -:-5·
CAPITULO'

Fundamentos de SOL
"'.~
,

"#

,"

t: .- "; ;:~-,

¡.'

~..

~ -:- ': lo· ....

..

~I
Este capítulo comIenza con una descripción detallada de las características de SQL. Describe la estructura' básica.de una instrucción SQL y los elementos básicos del lenguaje, como las palabras clave,-los tipos de datos y las expresiones. También se describe la forma en que SQL maneja los datos con valores NULL. Aunque éstas sean las características básicas <te".SQL. hay algunás' diferencias sutiles en la forma en que se implementan en' varios'productos populareS SQL y, en muchos·casos-.los productos SQL proporcionan extensiones significativas a las capacidades especificadas en el estándar SQL de ANSmSO..En este oapítulo también se describen

estas diferencias y

I
,

I

e~t~nsiones.

. .;"_'

Instrucciones
El cuerpo principal del lenguaje SQL consiste en unas 40 instrucciones.. Las in~.­ trucciones más importantes y usadas con mayor frecuencia' se resumen ~én"I2.~'Ta~ bla 5.1. Cada instrucción requiere un'a acción- específica del SGBD, comó ctéár una nueva tabla, recuperar datos o insertar datos nuevos en la base de datos. Todas las ins~cciores,SQL tienen la.mis9Ja.fo~a.,bási<;:a:.JJustrada en la Fig~ra 5.L ~ Cada instrucción SQL comienza con un verbo. una palabra clave que describe lo que hace la instrucción. CREATE, INSERT, DELETE y COMMIT son verbOs -habituales. La instrucción continúa con'una o más·cláusulas. Una cláusula puede especificar los datos sobre los que operará la instrucción, o proporcionar más detalles sobre lo que debe hacer la instrucción. Cada cláusula también comienza con una pahibra clave:' com'ü WHERE, FRÓM," '.i:NTO 'HAVING. A)gunas cláusulas son opcionales, y otras son-obli'gatbrfas. El-confénidd y e""stttittüt'a específicos pueden variar para distintas cláusulas, Muchas cláusulas c'onti'ene"tt1i Í1'ombres de tablas o de columnas; algunas contienen palabras clave, constante,sno expresiones adicionales. El estándar SQL.de ANSI/lSO eSp'ecific~.I,~s,p,¡¡J~!1fas clave SQL que se usan como verbos y en cláusulas. De acuerdo con el estánd~ estas palabras clave no se pueden..llsar .para.denominar_oh}elos.,oeJa baSe Jé:B~tÓ~ tales._como tablas.. colum-

. j.'

. : .•

..
.','

.

.,'.
'

. ', ,

'.
~J

..-.

¡

o

'l

...

75

1

76

SOL. Manual de referencia

Capítulo 5: Fundamentos de SQL

77

Tabla 5.1.

Instrucciones principales de SQl

I

nstrucción Manipuúu:ión de datos
SELECT
INSERT

Descripción
Verbo Recupera datos de la base de datos. Añade nuevas filas de dalos a la base de datos. Elimina filas de datos de la base de datos. Modifica datos existentes en la base de datos.

Nombre de tabla

~Of:LETE

~
/

DELETE
UPDATE

¡::;"

FROM

wtfEM. lIENTAS < 2 OOOO• OO

REPRESENTANTE~
.

Cláu,ula,

Palab,., clav:

/

Definición de datos
CREATE TABLE
DROP TABLE

Añade una nueva tabla a la base de datos.

Nombre ¿umna Constante Figura 5.1.
La estructura de una instrucción SOL.

Elimina una tabla de la base de datos.
Cambia la estructura de una tabla existente. Añade una nueva vista a la base de dalos.

ALTER TABLE CREATE VIEW DROP VIEW

Elimina una vista de la base de datos.

CREATE INDEX
OROP INDEX

Construye un índice sobre una col,:,-mna.
Elimina el índice de una columna.
Añade un nuevo esquema a la base
d~

I

I

CREATE SCHEMA
DROP SCHEMA CREATE DOMAIN ALTER DOMAIN DROP DOMAIN

datos.

Eliminaun esquema de la base de datos. Añade un nuevo dominio qe valores de datos. Cambia la definición de un dominio. Elimina un dominio de la base de datos. Concede privilegios de acceso a los usuarios. Elimina privilegios de acceso de los usuarios. Finaliza la transacción actual. Aborta la transacción actual. Define las-características de acceso a datos de la transacción actual. Define un cursor para una consulta. Describe el plan de acceso a datos de una consulta. Abre un cursor para recuperar los resultados de una consulta. Recupera una fila de resultados de una consulta. Cierra un cursor. Prepara una instrucción SQL para la ejecución dinámica. Ejecuta dinámicamente una instrucción SQL. Describe una consulta preparada.

Control de acceso
GRANT

REVQKE

Control de transacciones
COMMIT ROLLeACK SET TRANSACTION

Programación con SQL
DECLARE EXPLAIN OPEN FETCH CLaSE PREPARE EXECUTE DESCRIBE

nas y usuarios. Muchas implementaciones de SQL suavizan esta restricción, pero en general es buena idea evitar,las palabras clave cuando se da nombre a las tablas y columnas propias. La Tabla 5.2 lista las palabras clave incluidas en el estándar SQL2 de ANSI/ISO, que triplica aproximadamente el número de palabras clave reservadas en el antiguo estándar SQLl. El estándar SQL2 también incluye una lista de palabras clave potenciales que son candidatas para revisiones futuras del estándar. En la Tabla 5.3 se incluyen estas palabras clave. A lo largo del libro se ilustran las fonnas ~ceptables de una instrucción SQL mediante un diagrama sintáctico, como el que se muestra en la Figura 5.2. Una instrucción o cláusula SQL válida se construye «siguiendo la línea» en el diagrama sintáctico y en los ejemplos (como DELETE y FRoM,en la Figura 5.2) siempre se muestran en mayúsculas, pero casi todas las implementaciones de SQL admiten tanto mayúsculas como minúsculas en las palabras clave, y a menudo es más conveniente escribirlas en minúsculas. Los elementos variables de una instrucción SQL (como el nombre de la tabla y la condición de búsqueda en la Figura 5.2) se muestran en minúsculas cursivas. Es privativo especificar el elemento apropiado cada vez que se usa la instrucción. Las cláusulas y palabras clave opcionales, tales como la cláusula WHERE de la Figura 5.2, se indican como caminos alternativos en el diagrama sintáctico. Cuando se ofrece la elección de palabras clave opcionales, la elección predetenninada (es decir, el comportamiento de la instrucción si no se especifica ninguna palabra clave) aparece SUBRAYADA.

Nombres
Los objetos de una base de datos SQL se identifican asignándoles nombres únicos. Los nombres se usan en las instrucciones SQL para identificar el objeto de

78

saL.

Manual de referencia

Capítulo 5: Fundamentos de SOL

79

Tabla 5.3.
ABSOLUTE ACTION
AOO

Palabras clave potenciales de SQL2 de ANSI/ISO
< 0'-'

CROSS CURRENT

'"'
co

NE:XT
NO NOT

SPACE

AFTER. ;
ALIAS

EQUALS GENERAL

'OLO OPERAT10N OPERATORS

RETURN RETURNS· ROLE

',.- TEST THERE TR1GGER

GLOB~L

soc
SQLCOOE SQLERROR SQLSTATE SUBSTR1NG
SUM

CURRENT_OATE

ASYNC BE:FORE BOOLEAN BREADTH COMPLE:TION CALL IGNORE LE:AVE LESS LIMIT LOOP MODIFY

ALL
ALLOCATE ALTER

CURRENT2.TIME

'GOTO

NULL. OCTET_LENGTH

OTHERS "PARAMETERS . PENOANT PREORDER PRIVATE PROTECTED RECURSIVE
RON

UNDER '; VARIABLE VIRTUAL VISIBLE WAIT "":\

CURRENT_USER
CURSOR

GROUP HAV1NG HOUR IDENT1TY

OR

SÁVEPOINT SEARCH :. SENSITIVE SEQUENCE SIGNAI¡: SIMILAR

ANO AN'

ON

DATE

ONLY OPEN .OPTION
OR

. 'SYSTEM_USER TABLE TEMPORARY CYCLE DATA DEPTH DICT10NARJ ;( EACH ELSEIF

'" " "C
ASSERTION
AT

DEALLOCATE

1MMEDIATE

O"
DECIMAL DECLARE
DEFAULT

"

1ND1CATOR

ORDER OUTER OUTPUT OVERLAPS

"'"
TIME .TIMESTAMP TIMEZONE_HOUR TIMEZONE_M1NUTE
TO
.~,

N'"
NONE OBJECT OFF'
0>0

\'iHIut ,. l.;,
WITHOUT

1N1TIALLY 1NNER INPUT

REFERENCltJG •• REPL},CE; RFSJ;GNAL

SQI¡E:l'¡CEPTION, 'SQLWARNING STRUCTURE

.;j

AUTHORIZATION

AV'
BE.GIN
BE~EEN

DEFERRABLE
DEFEí!-RED ,
DEL~TE,

!

INSERT
>NT

PART1AL POS.1TION PRECISION PREPARE

TRA:Lt':l",G TRANSACT10N TRÁNSLATE :: TRANSLATION TIÜM TRUE .. , UN10N UNIQUE UNKNOWN 'UPOATE UPPER USAGE USER USING
VALU~

BIT'
BIT_LENGTH

DEse
DESCRIBE

1NTEGER :'1NTERSECT 1NTERVAL INTO
'Ji . '1S

80TH

DESCRIPTOR

BY
CASCADE

OIAGNOSTICS
iOISCONNECT

P~E:SERVE

CA·SCADEti·
CASE

", 'ÓI~~I~¿'TI
DOMAIN

PR'rMARY . PRIOR'
PR1V1LEGES "' ~PROCEOURE 'PUBLIC RE:AD REAL .REFERENCES RELAT1VE RESTR1CT RE:VOKE

'

1SOLAT10N JÓ1N

CAST

DOVBLE

CATALOG
CHAR CHARACTER
CH~_LENGTH

DROP
ELSE END .

'" LANGUAGE
LAST LEA01NG LEFT. LEVEL L1KE LOCAL LOWER

El;ID_EXEC
ESCAPE

CHARACTER_LENGTH

CHECK

EXCEPT

CLOSE
CO!'L~~~E

EXCEPTION EXEC
EXECUTE EXIsTS E:XTERNAL EXTRACT FALSE . FETCH FIRST FLOAT
ROR

0,"

VALUES VARCHAR VJl.RYING

R1GHT ROLLBACK ROWS

la base de datos sobre el que la instrucción debería actuar, Lds objetos ;con 'llom.: bre fundamentales en una base de datos -relacional-son los nomores de "tablas (que identifican tablas), nombres_de columnas (qu~jdentifican columnas) y nombres de usuarios (que identifican,usuarios de la ,base·de ·datos); 'en .el ~stándar original SQLl ¡se especificaron 10s convenios de denominación !de¡estb.s'l0bjet0s: El estándar SQL2,de ANSUISO expande significativamente lajlista de¡entidá.'des con nombre para incluir esquemas (colecciones de tablas');restricciones'{ligadu:" ras sobre los contenidos de las' tablas y'sus rélaciones);ldominios (conjiúHós de valores legales que se pueden asignar a una columna)'y varios otros tipos 'de objetos: Muchas'implementaciones de SQL albergan objetos.con nombre'a-uicidnales, como -los procedimientos almacenados, las relaciones de clave 'primaria'o externa,' formularios de entrada' de datos"y esquemas de réplica de 'dato"s: El estándar original ANSI/ISO ,especificó -que los nombres SQL deben ·Conte· ner de 1 a 18 caracteres, deben empezar con una letra y no pueden contener espacios o caracteres de puntuación especiales. El estándar SQL2 aumentó el máxiino

COLL,ÚE
COLLATIÓN COLUMN
COHMIT

'~TCH
MAX

,

"

,';

VIEW WHEN WHENEVÉR WHERE' '·WITH WORK WRITE

SCHEMA 'SCROLL SECONO . SECTION SELECT SESSION SESSION_USER

M"
MINUTE' Momn::E' MONTH NAMES NAT10NAL NATURAL NCRAR NULL1F NUMERIC

COWh:CT
CQNNECTION

,1----,...-L

DELETE FRDM

rJombre·de-tabfa --~...,.------,
.,'
"

CONSTRAINT

CONSTRAINTS
CONTINUE
CONVERT

Y"R
ZONE

+

WHERE

condición-de:biísqúeda""C"'-'-"''----'''-+!

FORE1GN FOUNO FROM - [: FULL

s"'
SIZE SMALL1NT SOME

CORRESPONOING COUNT CREATE


Figura 5.2.

Un diagramálsintácti'ca~deejempID:::~ '¡"~':¡ ;':-,;-.~

80

SOL. Manual de referencia

Capítulo 5: Fundamentos de SOL

81

a 128 caracteres, En la práctica, los nombres albergados.por los productos SOBD basados en SQL varían significativamente. Es común ver restricciones más fuenes sobre los nombres que están conectados con otro software fuera de la base de datos (tales como nombres de usuarios, que pueden corresponder con los nombres de inicio de sesión usados en un sistema operativo), y restricciones más débiles sobre los nombres que son privados a la base de datos. Los diferentes productos también difiereI! en los caracteres especiales que admiten en los nombres de las tablas. Por razones de transportabilidad, es mejor tener nombres relativamente cortos y evitar el uso de caracteres especiales.

Nombres de columnas
Cuando se especifica un nombre de columna en una instrucción SQL, SQL puede determinar normalmente por el contexto la columna que se pretende. Sin embargo, si la instrucción involucra dos columnas con el mismo nombre de dos tablas diferentes, se debe usar un nombre de columna calificado para identificar sin ambigüedad la columna que se pretende. Un nombre de columna calificado especifica tanto el nombre de la tabla que contiene la columna como el nombre de la columna, separados por un punto (.). Por ejemplo, la columna denominada VENTAS de la tabla REPRESENTANTES tiene el nombre de columna calificado:
REPRESENTANTES. VENTAS

Nombres de tablas
Cuando se especifica el nombre de una tabla en una instrucción SQL, SQL entiende que se hace referencia a una de las tablas propias (es decir, una de las que haya creado el propio usuario). Usualmente se desea elegir nombres de tablas que sean pequeños pero descriptivos. LOS nombres de las tabJas en la base de datos de ejemplo (PEDIDOS, CLIENTES, OFICINAS, REPRESENTANTES, PRODUCTOS) son una muestra adecuada. En una base de datos personal o departamental, la elección de los nombres de las tablas recae en el desarrollador o diseñador de la base de datos. En una base de datos más grande de uso compartido y corporativa, puede haber estándares corporativos para la denominación de tablas, con el fin de' asegurar que los nombres de las tablas no entren en conflicto. Además, la mayoría de marcas de SGBD permiten que usuarios diferentes creen tablas con el mismo nombre (es decir, tanto Juan como Susana pueden. crear una tabla denominada CUMPLEAÑOS). El SGBD usa la tabla apropiada dependiendo del usuario que esté realizando la consulta. Con los permisos adecuados también se puede hacer referencia a tablas de otros usuarios usando un nombre de tabla calificado. Un nombre de tabla calificado especifica tanto el nombre del propietario de la tabla como el nombre de la tabla, separados por un punto (.). Por ejemplo, Juan podría acceder a la tabla CUMPLE~OS de Susana usando el nombre de tabla 'calificado:
SUSANA.CUMPLEARos

Si la columna proviene de una tabla propiedad de otro usuario, se usa un nombre de tabla calificado en el nombre de columna calificado. Por ejemplo, la columna FECHA_NAC de la tabla CUMPLEA90s, propiedad del usuario SUSANA, se especifica por el nombre de columna completamente calificado:
SUSANA. CUMPLEA»OS. FECHA_NAC

Los nombres de columna calificados se pueden usar generalmente en una instrucción SQL en cualquier lugar en que pueda aparecer un nombre simple de columna (sin calificar); en las descripciones de cada instrucción SQL se destacan las excepciones.

Tipos de datos
El estándar SQL2 de ANSIIISO especifica los diferentes tipos de datos que se pueden almacenar en una base de datos basada en SQL y manipulada por el lenguaje SQL. El estándar SQLl original especificó sólo un conjunto mínimo de tipos de datos" El estándar SQL2 expandió esta lista para incluir cadenas de caracteres de longitud variable, datos de fecha y hora, cadenas de bits y otros tipos. Los productos SGBD actuales pueden procesar una rica variedad de tipos de datos, y hay una considerable diversidad en los tipos de datos particulares incluidos en diferentes marcas de SGBD. Los tipos de datos habituales son, entre otros, los siguientes: • Enteros. Las columnas con este tipo de datos contienen normalmente cuentas, cantidades, edades, etc. Las columnas enteras se usan también frecuentemente para contener número de identificación (ID), como cliente, empleado y números de pedidos. • Números decimales. Las columnas con este tipo de datos almacenan números que tienen partes fraccionarias y deben ser calculados con precisión, como las tasas y los porcentajes. Se usan también frecuentemente para almacenar cuentas de dinero.

Un nombre de tabla calificado se puede usar generalmente en una instrucción SQL en cualquier lugar en que pueda aparecer un nombre de tabla. El estándar SQL2 de ANSIIISO generaliza la noci6n de un nombre de tabla calificado aún más. Permite la creación de una colección de tablas con nombre, denominada esquema. Es posible hacer referencia a una tabla en un esquema específico usando un nombre de tabla -calificado. "Por ejemplo, la referencia a la tabla CUMPLEAÑOS del esquema INFOEMPLEADOS sería:
INFOEMPLEADOS.CUMPLEARos

El Capítulq 13 proporciona más información sobre los esquemas, usuarios y otros aspectos de la estructura de una base de datos SQL.

82

SOL. Manual de referencia

Capítulo 5: Fundamentos de SQL

83

• Números en coma flotante. Las columnas con este tipo de'datos_se,usan para almacenar números científicos que pueden ser objeto de cálculo aproximado, como pesos y distancias. Los número en coma flotant~·pueden.repre:­ sentar un rango mayor de va,lores que Jos números decimales, pero producen errores de redondeo en los .cálculos. • Cadenas de caracteres de longitud fija. Las colu,mnas con este tipo cte.-datos almacenan, normalmente, nombres de personas y empresas, ¡jirecciones, descripciones, etc. '. , • Cadenas de caracteres de longit1,ld variable. Este tipo de datQ~ p~frnite que una columna almacene cadenas de caracteres que varían en su longitud de fila en fila, con un tamaño máximo. (El estándar SQLI permitía sólo cadenas de caracteres de longitud fija, que son más fáciles para el SOBD de procesar, pero pueden malgastar un espacio considerable.) • Cantidades monetarias. Muchos productos SQL ,albergan un tipo MONEY o CURRENC-Y, 'que se almacena usualmente como un número,decimal O en.coma flotante. Al tener,un tipo concreto de datos monetario, .el SGBD puede .dar formato adecuadamente a las 'cantidades monetarias al visualizarlas.' • Fechas y horas. El soporte de valores de fecha y hora es también común en los productos SQL, aunque los detalles pueden variar considerablemente de un producto a otro. Generalmente se albergan distintas combinaciones de fechas, horas, marcas temporales (timestamp), intervalof'd&tiempo'y aritmética de fechas y horas. El estándar'SQL2incluye una'especificaciólÍ-elaborada para los tipos de datos DATE, TIME, TIMESTAMP éLrNTERVAL, in'c1u''; yendo soporte para zonas horarias y precisión temporal (por ejemplo; décimás o centésimas de segundo). • Datos booleanos. Algunos productos SQL, como Informix Dynamic Server, albergan valores lógicos (TRUE y FALSE) como un tipo explícito,' y algUiIos también permiten operaciones lógicas (comparaciones, AND y OR, Y'otras) sobre los datos almacenados·con·instrucciones ·SQL. • Texto largo. Varias bases de datos basadas en SQL albergan columnas. que almacenan largas cadenas>deltex~o (normalmente; hasta 3.2.000 o 65.000 caracteres y, en .algunos casos,·incluso.más). Esto permite a la base de datos almacenar documentos completos,' descripciones de productos~~,artículos.téc.:. nicos,:resúmenes y .datos,textuales s~milares sin estructura.·El SGBD prohibe usualmente el uso de estas columnas 'en ,las consultas interactivas y las .. ":;' 1"J' 1, j,"_ búsquedas.'." • Corrientes de bytes sin estructura. Varios SGBD permiten el almacenamiento y recuperación de secuencias de bytes sin estructura y de longitud variable. Las columnas que contie~en estos datos~¡se usan'para almacenar imágenes de vídeo,comprimidas, código ejecutable 'y otros tipos de datos sin estructura. El tipo de datos de SQL Ser.ver .IMAGE, por ejemplo; puede almacenar una corriente de hasta dos mil millones de bytes de datos. • Caracteres no romanos. Al crecer las bases de datos'para dapsoporte'a aplicaciones globales, los fabricantes de SGBD han ido añadiendo 'soporte para cadenas de longitud fija y ,variable de caracteres de.-16 bits .usadas para representar Kanji u otros caracteres asiáticos o árabes. Mientras que las, bases

de datos ·modernas permiten el almacenamiento y recuperación de dichos caracteresl (usando a menudo el convenio UNICODE para representarlos), el soporte;de .la búsqueda y ordenación en los tipos GRAPHIC Y VARGRAPHIC .varía 'ampliamente. La Tabla 5.4 lista los tipos de datos especificados en el estándar ANSUISO de SQL.
.

~'.

Tabla 5.4....

Tip~s de datos de SOL de ANSI/ISO
-u;
~.

Descripción Cadenas de caracteres de longitud fija. rCadenas de caracteres de longitud variable*. .

CRAR (longitud),.
CHARAC'I.'.E~

(longit¡.td)
1,',

VARCHAR ::( longitud) CHAR VARYING (longitud) CHARACT,ER .VARYING .(longitud)

NCHAR; '(longitud)
NATIÓNA:L,CHJI.R NATIONAI.:

··(longitud) CHARACTER (longitud)

Cadenas de caracteres nacionales de ll-; longitud fija*, .(
, I

NCHAR VARYING (longitud) NATI'ÓNF.:L Cli1l.."R;VARYING '(longitud)-' NÁ+I;6ÑiL't~ARA.CTERVARYING (longitud)
-\(l"

'Cadenas de caract~ies n'acionales de longitud variable *. (
'~l.

(~, '!.,

'.j'

"

INTEGER

Números enteros. Números enteros pequeños. Cadenas de bits de longitud fija*. Cadenas de bits de longitud variable*. Números decimales.

INT
"

SMf\LHN,T,
BIT~,·(longitud),

BIT VARYING NUMERIC DECIMAL.
DEC

(longitud)

(precisión, escala) (precisión, escala) (precisión, escala)

FLOAT REAL

(pre~is"iÓAr

Números en coma flotante. Números en coma flotante de baja precisión. Números en coma flotante de-alta. precisión. Fechas del calendario*.
.1'

DOUBLE PRECISION DATE TIME

(precisión) (precisión)

Horas de

reloj~.

TIMESTAMP INTERVAL

Fechas y horas*. Intervalos de tiempo*.

* Nuevo tipo de datos en SQL2.

'/ 1

84

SOL. Manual de referencia

Capítulo 5: Fundamentos de SOL

85

Las diferencias entre los tipos de datos ofrecidos en varias implementaciones SQL son una de las barreras prácticas a la transponabilidad de las aplicaciones basadas en SQL. Estas diferencias han sido resultado de la innovación en la evolución de las bases de datos para la inclusión de un rango más amplio de capacidades. Éste ha sido el patrón habitual: • Un fabricante de SaBn añade un nuevo tipo de datos que proporciona nuevas capacidades útiles para un cierto grupo de usuarios. • Otros fabricantes de SGBD añaden el mismo tipo de datos o similar, e introducen sus propias innovaciones para diferenciar sus productos del resto. • Durante varios años se incrementa la popularidad del tipo de datos y llega a ser parte de la «corriente principal» de tipos de datos albergados por la mayoría de implementaciones de SGBD. • Los cuerpos estándares se involucran en el intento de estandarizar el nuevo tipo de datos y eliminar las diferencias arbitrarias entre las implementaciones de los ~abricantes. Cuanto más se ha asentado el tipo de datos, más difícil es encontrar el compromiso al que se enfrenta el grupo de estandarización. Normalmente esto resulta en una adición al estándar que no se corresponde exactamente con ninguna de las implementaciones actuales. • Los fabricantes de SGBD añaden lentamente soporte para el nuevo tipo de datos estandarizado como una opción a sus sistemas, pero, dado que tienen una gran base instalada que usa la versión antigua (ahora «propietaria») del tipo de datos, deben también continuar con su soporte. • Durante un periodo de tiempo muy grande (generalmente varias versiones principales del producto SGBD), los usuarios migran al nuevo tipo de datos estandarizado y el fabricante de SGBD puede empezar el proceso de eliminación de la versión propietaria. Los datos de fecha y hora proporcionan un ejemplo excelente de este fenómeno y las variaciones en los tipos de datos que crean. DB2 ofreció pronto soporte para las fechas y las horas, con tres tipos de datos diferentes:
• DATE.

SQL Server se introdujo con un único tipo de datos de fecha y hora, denominadatos TIMESTAMP de DB2. Si Server podría aceptar esta versión de la consulta (sin la aritmética de fechas):

do

DATETIME, que se asemeja mucho al tipo de FECHA_CONTRATO contiene datos DATETIME, SQL

5ELECT NOMBRE, FECHA_CONTRATO FROM REPRESENTANTES WHERE FECHA_CONTRATO >= '06/14/1989'

Dado que en la consulta no se ha especificado la hora del 14 de junio de 1989, SQL Server asume la medianoche de esa fecha. La consulta SQL Server significa realmente:
SELECT NOMBRE, FECHA_CONTRATO FROM REPRESENTANTES WHERE FECHA_CONTRATO >= '06/14/1989 12:00AM'

Si la fecha de contrato de un representante se almacenase en la base de datos como el mediodía del 14 de junio de 1989, el representante no se incluiría en los resultados de la consulta de SQL Server, pero sí en los de DB2 (dado que s6lo se almacenó la fecha). SQL Server también alberga aritmética de fechas mediante un conjunto de funciones predefinidas. Así, la consulta al estilo DB2 se puede también especificar de esta forma:
SELECT NOMBRE, FECHA_CONTRATO FROM REPRESENTANTES WHERE FECHA_CONTRATO >= DATEADD(DAY, 15,

'05/30/1989')

"

lo cual es considerablemente diferente a la sintaxis de DR2. Gracle también alberga los datos de fecha y hora con un único tipo de datos, denominado DATE. Al igual que el tipo de datos DATETIME de SQL Server, la parte de la hora de un valor DATE de Gracle entiende «medianoche» si no se especifica una hora concreta. El formato de fechas predeterminado de Oracle es diferente de los formatos de DB2 y SQL Server, así que la versión de Gracle de la consulta es:
SELECT NOMBRE, FECHA_CONTRATO FROM REPRESENTANTES WHERE FECHA_CONTRATO >= '14-JUN-89'

• TIME.

Almacena una fecha, como Junio 30, 1991. Almacena un momento del día, como 12:30 P.M. T:IKESTAKP. Un instante específico en la historia, con una precisión mejor que el nanosegundo. .

Se pueden especificar fechas y horas concretas como constantes de cad~ena y se incluye la aritmética de .fechas. A continuación se muestra un ejemplo de una consulta válida usando las fechas DB2, en el que se asume que la columna FECHA_ CONTRATO contiene un dato DATE.
SELECT NOMBRE, FECHA_CONTRATO FROM REPRE~ENTANTES WHERE FECHA_CONTRATO >= '0513011.989'

Oracle también alberga una aritmética limitada de fechas, de forma que la consulta al estilo DB2 también se puede especificar, pero sin la palabra clave DAYS:
SELECT NOMBRE, FECHA_CONTRATO FROM REPRESENTANTES WHERE FECHA_CONTRATO >= '30-HAY-89'

+

15

+ 15 DAYS

Finalmente, el estándar SQL2 de ANSIIISO añadió soporte para los datos de fecha y hora con un conjunto de tipos de datos basados en los tipos de datos de DB2,

86

SOL. Manual de referencia
21 -375 2000.00
+4~7500.8778

Capítulo 5: Fundamentos de SOL

87

pero no idénticos a éstos. Además de los tipos de datos DATE, TIME YTIME5TAMP, el estándar especifica el tipo de datos INTERVAL, que se puede usar para almacenar un intervalo de"tiempo (por ejemplo, un intervalo medido en"días o una duración medida en horas, minutos y segundos). El estándar también proporciona un método muy elaborado y complejo para manejar la aritmética de fechas y horas, especificando la precisión de los intervalos, ajustando las diferencias debidas al-uso horario, etc. Como ilustran estos ejemplos, las sutiles diferencias en los 'tipos de datos en varios productos SQL conducen a diferencias significativas en la sintaxis de las instrucciones SQL. Incluso pueden provocar que la misma instrucción SQL produzca resultados ligeramente distintos en diferentes sistemas gestores de bases de datos. La ampliamenté predicada transportabilidad de SQL es cierta, pero s.ólo de manera general. Una aplicación se puede trasladar de una base de datos a otra y puede ser muy transportable si sólo usa las características fundamentales y básicas de SQL. Sin embargo, las diferencias sutiles en las implementaciones SQL indican que los tipos de datos y las instrucciones SQL deben ajustarse casi siempre si hay que llevarlos a otras marcas de SGBD. Cuanto más compleja sea la aplicación, más probable es que.lIegue alser dependiente {fe-las características' y matices específicos, y, por tanto,·menos'tran'sportable. J d. T ''l'']!'

No se d.ebe poner una coma entre los dígitos de _~na constante numérica, y no todos los dIalectos .de SQL permiten ~l signo positivo. así que es mej?r evitarlo. Para los datos monetarios, la mayoría de implementaciones SQL U$an simplemenM te las_ .const~ntes ~nteras ~ decímales, aunque algunas permiten que se esp~cifique la constante con un símbolo de moneda: . .
$0.75 $5000.00 $~567.89

Las constantes en coma flotante (también denominadas literales numéricos aproximados) se especifican usando la notación E, usada comúnmente en los len M guajes de programación corno e y FORTRAN. AqUÍ hay algunas constantes válidas en SQL de coma flotante:

,"
1.SE3 -3.14159El 2.5E-7 0.783926E21

'

"

La se lee como «por diez elevado a la poten.cia», así.ql,Ie la iprimer~ se lee «1,5 por diez elevado al cubo», o 1.500..

e

c.o~stante
"

Constantes
En algunas instrucciones SQL, un valor de datos numérico, de carácter o de fechas se debe expresar de forma textual. Por ejemplo. en esta instrucción INSERT, que añade un representante a la base de datos: ... . VENTAS).

Constantes de cadena
El estándar ANSIIISO especifica' gti'e las constantes SQL para ios datos de cuacteres se deben encerrar entre comillas simples (' ....), como en estos ejemplos:
'Garcia, Juan J .. ' 'Madrid' 'Oeste'

INSERT INTO REPRESE~TAN~~S VALUES (115,
.•

(,~~_~MPL~, NOM~~~ •., ~~~T,t:-,. ~f.C~~_CO~~~:o,

, , el valor de cada ¡columna en' la nueva fila insertada se especifica en' ta..cláusula VALUES.' Los valores de datos,constantes también se usan en expresiones, como en , I ", .•.• :.'. la instrucción SELECT:' . "
SELECT CIUDAD FROM OFICINAS

'"Daniel Izquierdo', 175000'.00, ':21-JUÑ-'90",l:-O;'OO)

Si hay que incluir una comilla simple dentro del texto const~nte, s~ escribe -~n la constante como dos caracteres consecutivos de comilla simple. Así, el valor constante:
.,
'McDon.~ld'

's'

WHERE OBJETIVO>

(1.1 * VENTAS) + 10000.00

es la cadena de diez caracteres «McDonald's». Algunas implementaciones de SQL, como-SQL Server e Infonnix, aceptan constantes de cadena encerradas entre comillas dobles

-e'..."):

".

El estándar SQL de ANSIIISO especifica el fonnato de las constantes de cadena y numéricas,'o literales,'que'representan valores de datos'específicos. 'La mayoría de implementaCiones de SQL ·siguen estos convenios. . 1:

"Garcia. Juan J..

"Madrid"

·Oeste"

Constantes numéricas
Las constantes enteras y decimales (también denominadas literales numáicos exactos)·se e"sc'riben como números:deciinales ordin-ariós en las instrucciones SQL; como uñ'~signo opcional positivo o negativo. .'.'

Desafortunadamente, las comillas dobles pueden plantear problemas de transportabilidad con otros productos SQL. El estándar SQL2 proporciona la capacidad adicional de especificar constantes de cadena de un conjunto concret~· de caracteres nacionales (por ejemplo, francés O alemán) o de un conjunto de caracteres definido por el usuario. Las capacidades del conjunto de caracteres definido por el usuario no se han implementado, generalmente, en los principales productos SQL.

~.

8S

SOL. Manual de referencia

Capítulo 5: Fundamentos de SOL

89

Constantes de fecha y hora
En los productos SQL que incluyen los datos de fecha y hora, los valores constantes para fechas, horas e intervalos de tiempo se especifican como constantes de cadena. El formato de estas constantes varía de un SGBD a otro. Hay incluso más variaciones introducidas por las diferencias en la forma en que se escriben las fechas y las horas en diferentes países. DB2 alberga varios formatos internacionales diferentes para las constantes de fecha, hora y marca temporal, como se muestra en la Tabla 5.5. La elección del formato se hace al instalar el SGBD. DB2 también alberga duraciones especificadas como constantes especiales, como en este ejemplo:
FECHA_CONTRATO + 30 DAYS

También se puede usar la función predefinida de Oracle TO_DATE {} para convertir las constantes escritas en otros formatos. como en este ejemplo:
SELECT NOMBRE, EDAD FROM REPRESENTANTES WHERE FECHA_CONTRATO = TO_DATE('JUN 141989',

'MON DD YYYY'}

El estándar SQL2 especifica un formato para las constantes de fecha y hora basado en el formato de la Tabla 5.5, excepto en. que las constantes de hora se escriben con dos puntos, en lugar de puntos, para separar las horas, minutos y segundos.

Constantes simbólicas
Además de las constantes proporcionadas por el usuario, el lenguaje SQL incluye constantes simbólicas especiales que devuelven valores de datos mantenidos por el propio SGBD. Por ejemplo, en algunas marcas de SGBD, la constante simbólica CURRENT_DATE da el valor de la fecha actual y se puede usar en consultas como la siguiente, que lista los representantes cuya fecha de contrato está aún en el futuro:
SELECT NOMBRE, FECHA_CONTRATO FROM REPRESENTANTES WHERE FECHA_CONTRATO > CURRENT_DATE

Nótese que, sin embargo, no se puede almacenar una duración en la base de datos, ya que DB2 no tiene un tipo de datos explícito DURATION. SQL Server también alberga los datos de fecha y hora, y acepta una variedad de formatos diferentes para las constantes de fecha y hora. El SGBD acepta automáticamente todos los formatos alternativos, y se pueden entremezclar si se desea. Aquí hay algunos ejemplos de constantes de fecha legales en SQL Server:
March 15, 1990 Mar 1S 1990 3/15/1990 3-15-90 1990 MAR 15

y aquí hay algunas constantes de tiempo legales:
15:30:25 3:30:25 PM 3:30:25 pm 3 PM

Las fechas y horas de Gracle también se escriben como constantes de cadena, usando este formato:
15-MAR-90

Tabla 5.5.

Formatos de fecha y hora en SOL de IBM

Fonnato:

Ejemplo
de fecha
511911960

Fonnato
debora

, ombre, del formato
American (americano) European (europeo) Japanese (japonés) ISO Formato TIMESTAMP

de la fecha
mmldd/yyyy

Ejemplo de hora

El estándar SQLl e'specificaba sólo una única constante simbólica (la constante USER descrita en el Capítulo 15), pero la mayoría de productos:SQL proporcionan muchas más. ,Generalmente, una constante simbólica puede ~parecer en una instrucción SQL en cualquier lugar en que pueda aparecer cualquier constante ordinaria del mismo tipo de datos. El estándar SQL2 adoptó las constantes simbólicas más útiles de las implementaciones SQL y proporciona CURRENT_DATE, CURRENT_TIME y CURRENT_TIMESTAMP (obsérvense los caracteres de subrayado), así como USER, SESSION_USER y SYSTEM_USER. Algunos productos SQL, incluido SQL Server, proporcionan acceso a los valores del sistema mediante funciones predefinidas, en lugar de constantes'simbólicas, La versión de SQL Server para la consulta anterior es:
SELECT NOMBRE, FECHA_CONTRATO FROM REPRESENTANTES WHERE FECHA_CONTRATO> GETDATE(}

hh:mm am/pm 2: 18 PM hh.mm.ss hh:mm:ss hh.mm.ss 14.18.08 14:18:08 14.18.08

dd.mm.yyyy yyyy-mm-dd
yyyy-rnrn-dd yyyy-rnrn-dd hh.mm.ss.nnn .nnn

19.5.1960 1960-5-19 1960-5-19

Las funciones predefinidas se describen más tarde en este capítulo, en la sección «Funciones predefinidas».

Expresiones
Las expresiones se usan en el lenguaje SQL para calcular-valores que se recuperan de una base de datos y para calcular valores uSádos en las búsquedas. Por

Ejemplo de TIMESTAMP

1960-05-19-14. 18.08.048632

~-----

I

90

SOL. Manual de referencia

Capítulo 5: Fundamentos_de SaL

91

ejemplo, esta consulta calcula las ventas de cada oficina como un porcentaje de su objetivo: .
SELECT CIUDAD, OBJETIVO. VENTAS, (Vf;NTAS!OBJETIVO)
~

de DB2 MONTH () y YEAR (l toman un· valor DATE o TIHE$TAMP como -entratla y de: vuelven ·un enteró que es el mes b porción del año "Bel valor. Esta consulfillista el nombre y mes de contratación de cad~ representante en la base de datos de ejemplo:
SELECT NOMBRE, MONTH(FECHA_CONTRATO) FROM REPRESENTANTES·

100

FRQM OFICINAS

y esta consulta lista las oficinas cuyas ventas superan en sq.OOO € al objetivo:
y esta lista
SELECT CIUDAD FROM OFICINAS
1. ,:

todos los -representantes contratados en 1988:

WHERE VENTAS> OBJETIVO + 50000.00

SELECT NOMBRE, MONTH(FECHA_CONTRATO) FROM REPRESENTANTES WHERE YEAR(FECHA_CONTRATO¡ = 1988

El estándar SQL de ANSI/ISO especifica cuatro operaciones aritméticas"que se pueden usar en expresiones: suma (X+Y), resta (X-Y), multiplicación (X*Y) y división (XlY). Se, pueden usar.,paréntesisl para formar expresiones más.complica... ..~j, .) .. 1 das.-como,ésta:.' ;. '1:
.. ,~'J

(VENTAS

~.

-'o '., " .. '1.05) -

I

1.... :.;

"

_.~,

,(OBJETIVO.~

.9?) ..

Las funciones predefinidas también se usan habitualmente para dar formato a los datos. La función predefinida de Orade' TO_CHAR ( ) , por ejemplo, toma un tipo de datos DATE y una especificaCión de formato como argumentos, y devuelve una cadena conteniendo la versión 'con formato de la fecha. En los resultados producidos por esta consulta:
SELECT NOMBRE, TO_CHAR(FECHA_CONTRATO. 'OAY MONTH 00, yyyy.) FROM REPRESENTANTES

, , De manera estricta. los paréntesis no se necesitan en esta consulta porque el estándar ANSI/ISO especifica que la multiplicación y la división tienen una precedencia superior a la suma y la resta. Sin embargo, se deberían usar paréntesis siempre para que las expresiones no sean ambiguas. 'dado que diferentes dialectos SQL usan diferentes reglas. Los paréntesis también incrementan la legibilidad de la instrucCiÓn y hacen que 'las instruccíones S.QL sean más fáciles de mantener.' 'El estándar ANSI/ISO también 'especifica la conversión automática de ti'pos de datos de enteros a números 'decimales, y de números decimales a nÚ,meros en coma flotante. Por taÍúo, se pueden mezclar estos tipos 'de datos en una expresión mimé.rica.'Muchas·iInpleme.ntaciónes SQL albergan otros operadores y' admiten operaciones sobre datos de caráéter y de "fecha. DB2, por ejemplo·, alberga el operador de concatenaCión'·de cadenas', escrit<:l"como dos caracteres ·consecutivos 'de'barra vertical (11). Si las columnas NOMBRE y '-?>PELLIDO contienen los valore·s «Juan» y «García», entonces esta 'expresión' DB2: 1 /, ' " 1
. ,"
'~l ~

todas las fechas íendrári el fonnato «Wednesday June 14, 1989» debido a la función predefinida. _. En general, las funciones pre.definidas se pueden especificar en cualquier lugar de una expresión SQL en que ,pueda aparecer una constante del mismo tipo de datos. Las funciones pr~efinidas inéluidas en los dialectos SQI: populares son demasiado numerosas p~a listarl~~ :aquí. Los dialectos de SQL de IBM incluyen cerca de dos docenas de funciones predeterminadas, y SQL Server tiene varias docenas, 'El estándar SQL2'incorpora las fnncioneS 'pretlefinidasm'ás útiles de estas implementaciones, en muchos .casos· con una sintaxis ligeramente diferente. En la Tabla 5.6 se'-restimen estas"fun~ciones.

,.. :_.

¡t,"

,."

(. Sr ./Sra.

1I

NOMBRE

11' ....

11

APELLIDO)

Datos ausentes (valores NUL'LJ
DadQ_que una.base. de datos es. usualmente un.modelo de una situación del mundo real, varias piezas de datos estarán inevitablemente ausentes, serán desconocidas o simplemente no se podrán aplicar. Así, en la base de datos de ejemplo. la columna CUOTA de la tabla REPRESENTANTES contiene el objetivo de 'ventas de cada representante. Sin embargo, el último representante contratado aún no tiene asignada cuota; este dato está ausente en esa fila de la tabla.'lCabría estar tentado de poner un cero en esa columna, pero no sería un reflejo fiel de la situación. El representante no tiene una cuota cero¡ la cuota simplemente «no se conoce aún». ~l De forma similar, la columna DIRECTOR de la tabla REPRESENTANTES contiene el número de empleado de cada' jefe del representante. Pero Sarnuel Clavel,

produce la cadena «Sr.lSra. Juan García». Como ya ·se ha mencionado. DB2 también alberga la suma y resta de datos DATE, TIME Y TIMESTAMP en las ocasiones en que estas operaciones tienen sentido. Esta capacidad se ha incluido en eÍ est~ndar SQL2, _,

Funciones predefinidas
Aunque el estándar SQLl no las especifica, la mayoría de las implementaciones SQL incluye~ varias funciones· predefinidas. Estas facilidades proporcionan a menudo conversiones de tipos de. datos: Por ejemplo. las funciones 'predefinidas

92

SOL. Manual de referencia

Capítulo 5: Fundamentos de SQL

93

Tabla 5.6.
Función"
BIT_LENGTH CAST

Funciones predefinidas de SGL2

Devuelve

(valor

AS

(cadena) tipo_de_datos)

El número de bits en una cadena de bits.

El valor, convertido al tipo de datos especificado (por ejemplo, llna fecha convertida a una cadena de caracteres).
La longitud de una cadena de caracteres. Una cadena convertida como se especifica por la función de conversión.

CARACTER_LENGTH CQNVERT

(cadena

USING

(cadena) conv)

CURRENT_DATE CURRENT_TlME

La
(precisión) (precisión) origen)

fe~ha

actual.

La hora actual, con la precisión especificada. La hora y fecha actual, con la precisión especificada. La parte especificada (DAY, HOUR, etc.) de un valor DATETIME. Una cadena convertida a minúsculas. El número de bytes de 8 bits de una cadena de caracteres. La posición en donde aparece objetivo dentro de la cadena origen. Una porción de la cadena origen,

CURRENT_TIMESTAMP EXTRACT

(parte

FROM

LOWER

(cadena) (cadena)
IN

OCTET_LENGTH

datos real, como 0,473,83 o «Samuel Clavel». En cambio, es una señal, o recordatorio, de que el valor de datos está ausente o es desconocido. La Figura 5.3 muestra los contenidos de la tabla REPRESENTANTES. Nótese que los valores de CUOTA y OFICINA_REP de Tomás Saz y el valor de JEFE de Samuel Clavel en la tabla tienen todos valores NULL. En muchas situaciones los valores NULL requieren del SGBD un manejo especial. Por ejemplo, si el usuario solicita la suma de la columna CUOTA, ¿cómo se deberían manejar los datos ausentes al calcular la suma? La respuesta la da un conjunto de reglas especiales que gobiernan el manejo de los valores NULL en varias instrucciones y cláusulas SQL. A causa de las reglas, algunas personalidades importantes en bases de datos están convencidas de que no se deberían usar los valores NULL. Otros, incluyendo al Dr. Codd, han proclamado el uso de los diferentes valores NULL, con indicadores distintivos para los datos «desconocidos» y «no aplicables». Independientemente de los debates académicos, los valores NULL son una parte muy enraizada del estándar SQL de ANSI/lSO y se admiten en ·prácticamente todos los productos comerciales de SQL. También desempeñan un papel práctico e importante en las bases de datos de producción. En este libro se resaltan las reglas especiales que se aplican a los valores NULL (y los casos en los que estos valores se manejan de forma consistente en diferentes productos SQL).

POSITION

(objetivo (origen

origen) n
FOR

Resumen
Este capítulo ha descrito los elementos básicos del lenguaje SQL. La estructura básica de SQL se puede resumir como sigue: • El lenguaje SQL usado habitualmente incluye unas 30 instrucciones, y cada una consiste en un verbo y una o más cláusulas. Cada instrucci6n realiza una única función específica.

SUBCADENA

FROM

longitud)

TRANSLATE TRIM (BOTH

(cadena

USING FROM

trad)
cadena) cadena)

carácter

TRIM (LEADING

carácter

FROM

TRIM (TRAILING

carácter

FROM

cadena)

UPPER

(cadena)

comenzando en el enésimo carácter, en una longitud longitud. Una cadena traducida como se especifica por la funci6n de traducción. Una cadena con las apariciones a ambos lados de carácter eliminadas. Una cadena con cualquier número de apariciones de carácter al principio eliminadas. Una cadena con cualquier. número de apariciones de carácter al final eliminadas. Una cadena convertida a mayúsculas.

Tabla REPRESDnANTES
NU~ ~PL

vicepresidente de Ventas, no tiene ningún jefe en la organización de ventas. Esta columna no se aplica a SamueL De nuevo, se podría pensar en introducir un cero o 9999 en la columna, pero ninguno de estos valores sería el número de empleado del jefe de SamueL Ningún valor de datos es válido para esta columna. SQL admite explícitamente datos ausentes, desconocidos o no aplicables mediante el concepto de los valores nulos. Un valor nulo es un indicador que dice a SQL (y al usuario) que el dato está ausente o no es aplicable. Por conveniencia, un dato.omitido se dice que tiene el valor NULL. Pero el valor NULL nQ es un valor de
<

'"' '" '" , '" no '" '" '" '"

..

Bruno AnO!a a Maria Ji.....n. . S"Mna SaHos sa",,,el Clavel Bernardo S&nche. Oaniel Ruidrol>o To..... S~z Lebn Freüe Pablo Cr"~ Ne"s A.~~rate

"~~

,~,

"

" " " " "

" '"

OFICINA REP 13 11 21 11 n 12 12 4l NULL 21 12

n

PUESTO Re ruenUn'e Re resMtanU Re ruentante VP Ventas Jefe Venta. Re r ... enUn'e Re re.entante Jefe Ventas Re r ... enUn'e Re reuntan.e

nCII" CONTR1ITO 1210211988 12!IOf1989 10/12/1986
14/06fl988 19f0511981

,m
NULL

'" '"' '" , '" '"

20flO/19a6 13/01/1990 12/10/1989 01/03/1981 14fl1/1968

. .. '"
..

350.000,00E: 300.000,00';; 350.000,001: 215.000,00& 200.000,00E: O.OOO,OOE NULL 50.000.00e 215.000,Ooe ~00. 000, ooe

,~"

VENtAS 361.911,00E: 392.125.00';; 414.0S0.001: 299.9H,00e 142.594,ooe
~05.613.00e

1S.9S5,001: 361.865,OOe 286.17S.00E 186.042.001:

Valor desconocido

/
"
REPRESENTANTES.

Valor desconocido

Figura 5.3.

Valores

NULL

en la tabla

000.. Listar las ofiéinas comerciales de la región Este . -. Este capítulo estudia las consultas SQL más simples -las que recuperan datos de una única tabla de la base de datos. constantes y funciones predefinidas.------.obje"tivos.000. • Las instrucciones SQL pueden incluir expresiones que combinan nombres de columna. VENTAS -VENTAS .aJ.- .00 350.00 O~ETIVO € € € € 186..00 € ·367. " 95 -'-- . A pesar de las muchas opciones que ofrece la instrucción SELECT.00 €.94 SOL.00 125.. FROM OFICINAS CIUDAD ~'-..€ 692'. Dairnie¡ Navarra Caste1l6n Almería León.ntas actua:li.911.000. .ltroducción..00_0.. enteros.00 800..OO. números en coma flotante y.915. es la instrucción más potente y compleja de las instrucciones SQL.. "OBJETIVO. -:-:: 7' SELECT CIUDAD. OBJETivo. usando'operadores aritméticos y otros específicos del propio fabricante. es posible comenzar simplemente y después construir consultas más complejas._es c~n sus objeti~os y ve.637 . La instrucción SELECT.. 0 ccm sus.:-~.. muchos otros tipos de datos específicos del propio fabricante.042. SELECTO CIUDAD. incluyendo texto. la instrucción SELECT enJa iJ.a SQL del Capítulo 2. 00 € 835..000. • Los valores NULL proporcionan una forma sistemática de manejar datos ausentes o no aplicables en el lenguaje SQL.consulta: Ya se han' examinado muchos ejemplos de. usualmente. Aquí hay algunas otras consultas de ejemplo que recuperan información sobre las oficinas comerciales: ··Listqr las . Manual de referencia • Las bases. constantes'y funciones predefinidas hacen que la transportabilidad de las instrucciones SQL sea más difícil que lo que pudiera parecer en un primer momento.Y·ventas. La instrucción 5ELEC'l' La instrucción SELECT recupera datos de una base de'datos y los devuelve'en forma de resultados.-.oó €735. las consultas son el corazón del lenguaje SQL.oficin~s ~~·~er. consultas SQL. CAPíTULO 6 Consultas simples Por muchas razones. de la.042.00 € 575. FROM·· OFICINAS WHERE REGlON = 'Este' VENTAS . números decimales. que se usa para ~xpresaf. . ------------300. • Las variaciones en los tipos de datos. :..qi.de datos basadas en SQL pueden almacenar varios tipos de datos.

La cláusula HAVING se describe en el Capítulo 8. Si se omite. La Figura 6. • La cláusula GROUP BY especifica una consulta de resumen.. Manual de referencia OBJETIVO VENTAS Capítulo 6: Consultas simples 97 Navarra Caste116n Almería ----------.00 € 692.00 € Navarra 575.cóón.911. la solicitud en inglés y la instrucción SELECT de SQL son muy similares. Al igual que la cláusula WHERE. Las consultas más complejas que combinan datos de dos o más tablas se estudian en el Capítulo 7. AVG(VENTAS¡ FRQM OFICINAS WHERE REGlON = 'Este' GROUP BY~:ción columna-de- I AVG(OBJETIVO) 575. Las cláusulas SELECT y FROM son obligatorias.000.000.00 € 350.1 muestra la forma completa de la instrucción SELECT. La siguiente lista resume la función de cada cláusula: • La cláusula SELECT lista los elementos de datos a recuperar por la instrucción SELECT.1. El resto de cláusulas es opcionaL Sólo se incluyen en una instrucción SELECT cuando se quiere usar las funciones que proveen. VENTAS ""'-.042..------------575¿OOO.------------.530. MJ.00 € f--SELECT-t.911. agrupa filas similares y produce una fila de resumen de los resultados de cada grupo.00 € AVG(VENTAS) 598. WHERE condIÓón-de- búsqueda ¿.637. condiÓón-debúsqueda especificaÓón-de- aRDER BY~~ación I . • La cláusula HAVING indica a SQL que incluya en el resultado sólo determinados grupos producidos por la cláusula GROUP BY. • La cláusula WHERE informa a SQL de que incluya sólo ciertas filas de datos en los r~sultados de la consulta.00 € LHAVING L. La cláusula SELECT se describe en la siguiente sección. se deben usar más características de la instrucción SELECT para especificar de forma precisa la consulta.00 € L L. • La cláusula ORDER BY ordena los resultados tomando como base los datos de una o más columnas. .00 € 367.00 € 735. Cuando la solicitud se torna m.FROM WHERE REGlON = 'Este' AND VENTAS > OBJETIVO ORDER BY CIUDAD CIUDAD OBJETIVO VENTAS t -. los resultados no se ordenan.i d especificación elemento·de- If.Cuáles son los objetivos y ventas de las oficinas de la región Este? SELECT AVG(OBJETIVO) .OO € 800. usa una condición de búsqueda para especificar los grupos deseados.000. Los usos básicos de la cláusula WHERE se descri- Diagrama sintáctico de la instrucción ben en la sección «Selección de filas (cláusula WHERE)>>. SELECT. más adelante en este capítulo. ---'- I Almería 350. 1 . FROM OFICINAS DISTINC * OBJETIVO. más adelante en este capítulo. La cláusula aRDER BY se describe en la sección «Ordenación de los resultados de las consultas (cláusula ORDER BY)>>. Se usa una condición de búsqueda para especificar las filas deseadas.000. En este capítulo se describen las consultas que toman datos de una única tabla. Las que conllevan subconsultas se estudian en el Capítulo 9. Listar las oficinas comerciales de la región Este cuyas ventas excedan sus objetivos y ordenadas según el nombre de ciudad. SELECT CIUDAD. Las consultas de resumen se describen en el Capítulo 8. Figura 6.00 € 367.00 € 692:637. En lugar de producir una fila de resultados por cada fila de datos de la base de datos. • La cláusula FROM lista las tablas que contienen los datos a recuperar por la consulta. Los elementos pueden ser columnas de la base de datos o columnas calculadas por SQL al procesar la consulta.ás complicada.000. Para las' consultas simples.96 CIUDAD SOL. que consiste en seis cláusulas.

. Por ejé"hlplo. como las de la base de datos. y cada cláusula FROM contienen un ú~ico 'nombre de tabla. Cuando aparece un nombre de columna como elemento -de seleccióñ.:1'-89 10-DIC-. que especifica que ese mismo valor de constante aparecerá en cada fila-de-los resultados de fa c6ñsulta.. de la consulta (y de la instrucción SELECT). los resultados siempre tienen el mismo formato de filas y columnas que las tablas reales de la base de datos.99 La cláusulasELEcT La cláusula SELECT con la que comi~nza cada instrucción SELECT especifica los elementos de datos que recupera la consulta. Estas tablas se denominan tablas fuente. FROM REPRESENTANTES FECHA_CONTRATO .de datos. la estructura tabular de los resultados de las ·consultas SOL. Un elemento de selección puede ser: • Un nombre de Lolumna. REGIÓN FROM OFICINAS I Programa . l' Listar los nombres. . . según se especifica en la expresión En este capítulo se describe cada tipo de eleme·nto de selección. Los'resultados de una cláusula son·usualmente una tabla cOn varias filas y columnas.programación con SQL. En cua1quier caso..uz Neus Azcá'ra te 21 11 12 12 NULL 21 12-0<. Pablo C:r. oficinas y fechas de contratación de todos los lrepresentantes..86 14-JUN-88 i'9-MAY-87 20':"OCT-86 13-ENE-90 12-0CT-B9 12 01-MAR~B7 22 14-NOV-88 En cambio.. • Una expresión SQL.. La cláusula FROM c0nsiste en la-palabra clave FRDM seguida por-una lista de especificaciones de tabla separadas-por comas.98 SOL...2. OFICINA_REP.. SQL lo considera una tabla de tres columnas y una fila_ . " Resultados de las consultas "'.-' Tomás Saz León Freire. de izquierda a derecha. porque son la fuente de todos'los 'datos de los resultados: Todas las consultas de este capítUlo tienen una única tabla fuente. 1 SELECr CIUDAD. La cláusula FROM Figura 6. la siguiente consulta produce una única fila porque sólo un representante tiene el número de empleado requerido. se devuelve la tabla de resultados al programa.. que indica que SQL debe calcular el valor a poner en los resultados.tabular en-la/pantalla de la computaoora. Manual ·de referencia I Sal interactivo Capítulo 6: Consultas simples . Los elementos se especifican usual· mente por una lista de selección... -esta' consulta produce una tabla'de tres columnas (porque pide tres elementos de datos) y diez filas (porque hay 10 representantes)"· ·0··· e I NOMBRE Bruno Arteaga Mar~a..1 Programación con Sal I Consulta --- --Resultados de la consulta CIUDAD Daimiel Navarra Castellón Almeria León REGIÓN oeste Este Este Este Oeste 1+- -' SGBD Consulta Base de dato . Cada elemento de selección en la lista genera'una única columna de resultados de la consulta.y'iI!'énez 13 12-FEB-88 'In Susana Santos Samuel Clavel Bernardo Sánchez DanielJ Ru-idrobo. SI un programa envía 'un consulta al SGBD usando'. como se muestra en la Figura 6.. SQL -simplemente toma el valor de esa columna de cada fila de la tabla de la base de datos y lo pone en la fila correspondiente de los resultados de la consulta: • Una constante. el SGBD 'muestra los resultados de·forma. '1. El resultado de una consulta' SQL. Si se escribe-una instrucción SELECT usando SQL interactivo. Aunque esta única fila de resultados parezca menos «tabular» que los resultados multifila..2. . es siempre uria tábla . una lista de elementos de selección separados por comas. Cada especificación de tabla identifica una tabla que contiene datos a recuperar por la consulta. SELECT NOMBRE. que identifica una columna de la tabla o tablas que aparecen en la cláusula FROM.

042. para consultas simples como ésta.00 € VENTAS 186.00 835.000.00 Incluso en esta situación los resultados son una tabla.000. VENTAS FROM OFICINAS CIUDAD REGlaN VENTAS 186.00 275. Las tablas se pueden consultar y las consultas producen tablas. por tanto.000. FECHA_CONTRATO FROM REPRESENTANTES WHERE VENTAS> SOOOOO.00 300. los resultados de una consulta pueden ser un único valor. Conceptualmente.20 € El hecho de que una consulta SQL produzca siempre una tabla es importante.00 367. Significa que los resultados de la consulta se pueden almacenar como una tabla en la base de datos.00 300. Finalmente.00 275. Por cada fila. SQL procesa la consulta examinando la tabla referenciada en la cláusula FROM. Por ejemplo. incluye sólo las dos cláusulas requeridas. como en este ejemplo: Consultas simples Las consultas más simples solicitan columnas ·de datos de una única tabla de la base de datos.000. aunque una muy pequeña que s610 tiene una fila y una columna.00 350. la cuota y las ventas del empleado número 107? SELECT NOMBRE. SELECT NOMBRE. Una estructura tabular de una base de datos relacional tiene. Daimiel Navarra Caste1l6n Almeria Le6n Oeste Este Este Este Oeste € € € € € Listar los representantes. Estos resultados son una tabla. Nótese que el soporte de SQL par~ dalos ausentes se extiende también a los resultados de las consultas.915. SELECT NOMBRE. con dos columnas y ninguna fila. En este caso es una tabla vacía. una relación sinérgica con las capacidades de las consultas relacionales de SQL.000.000 f. esta consulta solicita tres columnas de la tabla OFICINAS: Listar el nombre y fecha de coiltrato de quienes tengan ventas superiores a 500. SELECT CIUDAD. REGION. . CUOTA.00 300.042. de fila en fila. como en el siguiente ejemplo: ¿ Cuáles son las ventas promedio de nuestros represen/antes? SELECT AV~(VENTAS) FROM REPRESENTANTES AVG (VENTAS) Bruno Arteaga Maria Jiménez Susana Santos samuel Clavel Bernardo Sánchez Daniel Ruidrobo Tomás Saz Le6n Freire Pablo Cruz Neus Azcárate 350. la tabla REPRESENTANTES contiene valores NULL en sus columnas CUOTA y JEFE.00 735.000.000. significa que los resultados de una consulta pueden ser el objetivo de otras consultas posteriores. la cláusula FROM da nombre a la tabla que las contiene. Por ejemplo.100 SOL. como se muestra en la Figura 6. sus cuotas y sus jefes.00 € En algunos casos.042.00 NULL 350. La consulta devuelve así una fila de datos por cada fila de la tabla.OO € NOMBRE FECHA_CONTRATO Listar la ubicación. CUOTA. Finalmente. VENTAS FROM REPRESENTANTES WHERE NUM_EMPL : 107 NOMBRE Neus Azcárate CUOTA 300.353. Si un elemento de datos de la base de datos contiene un valor NULL.000.911.637. el valor NULL aparecerá en los resultados de la consulta cuando se recupere el elemento de datos. región y ventas de cada oficina comercial. es posible que una consulta no produzca ninguna fila como resultado.00 692.000. La cláusula SELECT da nombre a las columnas requeridas. Manual de referencia NOMBRE CUOTA Capítulo 6: Consultas simples JEFE 104 106 101 ¿Cuáles son el nombre.3. La siguiente consulta devuel ve estos valores NULL en la segunda y tercera columnas de los resultados de la consulta. JEFE FROM REPRESENTANTES La instrucción SELECT.00 lOa NULL 106 104 101 106 104 loa 289. Significa que el resultado de dos consultas similares se pueden combinar para formar una tabla mayor de resultados.00 200.000. SQL toma los valores de las columnas requeridas en la lista de selección y produce una única fila de resultados.

SELECT CIUDAD.OO€ 22 Daimiel 11 Navarra Oeste Este Este 12 cast.637. las columnas referenciadas en una expresión aritmética deben tener un tipo numérico. las expresiones SQL pueden incluir la suma.OO€ 7J5.OO€ BOa. Aquí hay otros ejemplos de consultas que usan columnas calculadas: Mostrar el valor del inventario de cada producto.149. (STOCK ~ PRECIO) Resultados de la consulta Navarra Cast..00 13 .911. cuyos valores se obtienen a partir de los valores -de datos almacenados. También se pueden usar paréntesis para construir expresiones más complejas. . Este (VENTAS d OBJETIVO) PRODUCTO 2A44L 2M4R 775C 'CI REI ACI REI REI REI IMM 4100Y 2A44L 4100Z 2A44R 2A44L 2A44R 775C (VENTAS-OBJETIVO) -113.4.-------------------------. cable Serie 4.000 Figura 6.958.00 22. ID_PRODUCTO. Procesamiento de consultas con una columna calculada.958.Rueda 2A45C 16.4.ellón Almería oeste Este Est.042.637. La tercera columna de resultados se calcula.102 SOL.e -1l3.OO€ 117.000.00 E 17.000.958.490.00 16. CIUDAD Daimiel REGIÓN OBJETIVO SELECT ID_FAB.OO€ 367. REGlON.ellón 13 Almería 21 León ESte oeste loa 106 104 lOS 108 300. multiplicar o dividir columnas que contengan datos textuales.Dae 575.OOO.00 1. fila a fila. SQL informará de un error.00 DESCRIPCION (STOCK~PRECIO) QS' Figura 6.911. FROM OFICINAS CIUDAD Daimiel Navarra REGlON Oeste . FROM PRODUCTOS ID_FAS REI 'CI ID_PRODUCTO DESCRIPClON.OO€ llO.00 € 110.000.590. BIC IMM 'CI 'CI BIC € € € € € € € Columnas calculadas Además de las columnas cuyos valores vienen directamente de la base de datos. una consulta SQL puede incluir columnas calculadas. Para solicitar una columna calculada se especifica una expresión SQL en la lista de selección. usando los valores de datos de la fila en curso de la tabla OFICINAS.00 16.OO€ 692.263.00 € 103 Tabla OFICINAS OFICINA CIUDAD OBJETIVO VENTAS 186.915. cable Hélice 68.00€ Para procesar la consulta. Como se estudió en el Capítulo 5. SQL va a las oficinas y genera una fila de resultados por cada fila de la tabla OFICINAS. región y cantidad por encima o por debajo del objetivo de cada oficina.-. Si se intenta sumar.00€ --------------. Las dos primeras columnas de resultados vienen directamente de la tabla OFICINAS.00 E 117.915.OO€ nS.915. 00 0.00€ LoOn Este Oeste 17.750. Procesamiento de una consulta simple (sin cláusula WHERE).637. Resultados de la con sulta Tabla PEDIDOS 1 1---> FAB REI REI IMM UNIÓN }--+ Listar la ciudad.00€ 835. Manual de referencia Castellón Almería León REGIÓN JEF Capítulo 6: Consultas simples Este Este Oeste -64. Esta consulta muestra una columna calculada simple: Tabla PRODUCTOS PRECIO > 2 OOO€ ID FAB ID PRODUCTO ACI 4100Y REI 2A44L 4100Z 'CI REI 2A44R ¡-. la multiplicación y la división. la resta.911.ooe 3S0.Q42.956.00 € CANTIDAD > 30. restar.875.958. Por supuesto.00 € 4100Y XK47 41672 779C 41003 41004 41003 Zapata pequei'ia Reductora Plato 90-kg brazo Serie 3.ODO. como se muestra en la Figura 6.3.OO€ ~64.

pero no se permite en el estándar ANSI/ISO.000.911.637. 360.TARGET) FROM OFFICES ---------- --------------------.------.997.000. la consulta: NAS.-------------€ 186. Éstas pueden aparecen en las expresiones de la lista de selección. Esta distinción es sutil cuando los re- es legal en la mayoría de los dialectos comerciales de SQL (por ejemplo. La segunda columna contiene la misma cadena de 20 caracteres. 15 364.33 311. 'tiene unas ventas de' .00 € 300.000.915.00 835. VENTAS FROM OFICINAS CIUDAD Daimiel Navarra Castel1ón A1mería León TIENE UNAS VENTAS DE VENTAS Los resultados de la consulta contienen las seis columnas de la tabla OFICIen el mismo orden.042. Listar las ventas de cada ciudad. dejará de funcionar cuando las columnas se reorganicen y se añada una nueva. Esto puede ser particularmente útil cuando se afronta una nueva base de datos y se desea obtener una idea rápida de su estructura y de los datos que contiene.00 REGlaN JEF OBJETIVO VENTAS Navarra Castellón A1meria León € € € € 692. La selección de todas las columnas es más apropiada cuando se usa SQL interactivo. SELECT NOMBRE.277.000.000.00 367. MONTH(FECHA_CONTRATOI.037.000.00 € 275.104 SOL.000.82 309.00 735. muchas implementaciones de SQL tratan el asterisco sólo como un elemento más de la lista de selección (*). pero no puede modificar el programa de aplicación.00 725.637.042.00 € 300.00 € NULL 350.------------tiene unas ventas de 186.042.000. (CUOTA sultados se muestran en pantalla. como en el siguiente ejemplo. SELECT· (SALES . Se debería evitar en la programación con SQL porque los cambios de la estructura de la base de datos pueden hacer que el programa falle.36 204.00 € 350. CUOTA. Sin embargo. SQL permite usar un asterisco (*) en lugar de la lista de selección como abreviatura de «todas las columnas»: Mostrar todos los daros de la tabla SELECT FROM OFICINAS OFICINA CIUDAD 22 11 12 13 21 OFICINAS. pero son realmente una tabla de tres columnas.00 € € € € Las constantes SQL también pueden ser útiles por sí mismas como elementos de una lista de selección.00 € Este Este Este Oeste 106 lO' 105 108 575.00 € 275. Manual de referencia Capítulo 6: Consultas simples 105 Mostrar los resultados si se eleva la cuota de cada representante en un 3 por ciento de las ventas de este año.00 835. El estándar de SQL ANSUISO especifica que una instrucción SELECT puede tener una selección de todas las columnas o una lista de selección.855. . + (. Así. 03'"'VENTAS) FROM REPRESENTANTES NOMBRE CUOTA (CUOTA+(.1.581. Si el programa espera que la consulta SELECT • FROM OFICINAS devuelva seis columnas como resultado con ciertos tipos de datos.911. muchos productos SQL proporcionan operaciones aritméticas adicionales.00 800. supóngase que la tabla OFICINAS se haya eliminado de la base de datos y se haya recreado con sus columnas reorganizadas y con una nueva séptima columna. La primera y tercera columnas contienen valores de la tabla OFICINAS.---.25 305.000.000.000. mes y año de contrato de cada representante. Oraele y SQL Server). como se muestra en la Figura 6.00 367. operaciones sobre cadenas de caracteres y funciones predefinidas que se pueden usar en las expresiones SQL.00 € 300.042. Listar el nombre.50 283. pero es crucial en la programación con SQL cuando los resultados se recuperan con un programa y se usan para cálculos.03*VENTASI) Selección de todas las columnas 361. que la tabla.19 NULL (SELECT *) Bruno Arteaga María Jiménez Susana Santos Samuel Clavel Bernardo Sánchez Daniel Ruidrobo Tomás Saz León Freire Pablo Cruz Neus Azcárate 350.00 € € € € Los resultados de la consulta parecen consistir en una «frase» independiente para cada oficina.170. Por ejemplo. 781.95 283.00 € 200.221. pero no ambas.000.00 € tiene tiene tiene tiene unas unas unas unas ventas ventas ventas ventas de de de de 692.26 Como se mencionó en el Capítulo 5. como en el siguiente ejemplo con DB2.00 350.915.00 € A veces es conveniente mostrar el contenido de todas las columnas de una tabla. SELECT NOMBRE. de ¡"zquierda a derecha. SQL se hace cargo automáticamente cargo de los detalles concernientes a la base de datos de tales cambios.603.000. FROM REPRESENTANTES YEAR(FECHA_CONTRATOI -----------.------------.000. Esto puede ser útil para producir resultados que sean más fáciles de leer e interpretar. en DB2.00 Daimiel Oeste 108 300. SELECT CIUDAD.00 735.

SELECT NOMBRE.00 367.106 SOL. siempre que no cambien los nombres de las columnas referenciados de la tabla OFICINAS: SELECT OFICINA. Aquí hay algunos ejemplos de consultas simples que usan la cláusula WHERE: Listar los números de empleado de todos los jefes de oficinas comerciales. ¿Por qué? Debido a que León Freire es jefe tanto de la oficina de León como de la de Daimiel.911. SQL no elimina las filas duplicadas. VENTAS Filas duplicadas (DISTINCT) Si una consulta incluye la clave primaria de una tabla en su lista de selección. y su número de empleado (108) aparece en ambas filas de la tabla OFICINAS.00 € CUOTA 350. como se describe en el Capítulo 8). Si la clave primaria no se incluye en los resultados de la consulta.00 € OBJETIVO Mostrar el nombre. La palabra clave DI8TINCT se puede especificar independientemente de los contenidos de la lista SELECT (con ciertas restricciones sobre las consultas de resumen. Si se omite la palabra clave DISTINCT.00 € 835. SELECT JEF FROM OFICINAS JBF 108 Mostrar las oficinas donde las ventas superen a los objetivos. Manual de referencia Capítulo 6: Consultas simples 107 Estas dificultades se pueden evilar si se escribe el programa para solicitar las columnas que se necesitan según su nombre. VENTAS FROM REPRESENTANTES WHERE JEFE = 104 la' 105 la. Por ejemplo. SELECT NOMBRE. Se puede eliminar las filas duplicadas de los resultados insertando la palabra clave DISTINCT en la instrucción SELECT justo antes de la lista de selección.911.637. Selección de filas (cláusula WHERE) Las consultas SQL que recuperan todas las filas de una tabla son útiles para el examen de la base de datos y para los informes. La cláusula WHERE se usa para especificar las filas que se desea recuperar. 108 .00 € 725. pueden aparecer filas duplicadas. OBJETIVO FROM OFICINAS WHERE VENTAS > OBJETIVO CIUDAD VENTAS la.00 € 575. CIUDAD. OBJETIVO.915. Si hay cuatro jefes diferentes. supóngase que se hace esta solicitud: Conceptualmente. FROM REPRESENTANTES WHERE NUM_EMPL = 105 NOMBRE Bruno Arteaga CUOTA Listar los números de empleado de todos los jefes de oficinas comerciales. Aquí se ofrece una versión de la consulta anterior que produce los resultados deseados: -------Navarra Almería Le6n ------------. VENTAS. Usualmente no se desea seleccionar sólo algunas de las filas de una tabla e incluir sólo éstas en los resultados de la consulta. Por ejemplo. entonces cada fila de los resultados será única (dado que la clave primaria tiene un valor diferente en cada fila).000. También se puede especificar la palabra clave ALL para indicar explícitamente que se conserven las filas duplicadas. JEF.000.000. se debería haber esperado s610 cuatro números de empleado en los resultados. VENTAS. pero para poco más. pero dos de ellas son duplicados exactos.-------------€ 692. SQL resuelve esta consulta generando en primer lugar el conjunto completo de resultados (cinco filas) y eliminando después las filas que son duplicados exactos para formar los resultados definitivos de la consulta. FROM OFICINAS REGlON.00 € Mostrar los empleados subordinados de Bernardo Sánchez (empleado número 104). Es también inmune a los cambios de la estructura de la base de datos.00 € 350. SELECT CIUDAD. la siguiente consulta produce los mismos resultados que SELECT* FROM OFICINAS.000. SELECT DISTINCT JEF FROM OFICINAS JEF VENTAS 367. ventas y cuota del número de empleado 105. pero es innecesario porque es el comportamiento predeterminado. Estos resultados no eran los que probablemente se pensara obtener. 104 105 108 Los resultados deJa consulta tienen cinco filas (una por cada oficina).

La cláusula WHERE consiste en la palabra clave WHERE seguida de una condición de búsqueda que especifica las filas·a recuperar. la condición de búsqueda es JEFE = 104. la fila se excluye de los resultados de la consulta. Este test se puede usar para seleccionar las oficinas de la región este o los representantes cuyas ventas están por encima de sus cuotas.00€ 266775. SQL usa el valor de la columna en la fila en curso. • Test de ra. SQL examina cada fila deJa tabla REPRESENTANTES.00 € 305673. Compara el valor de una expresión con el valor de otra expresión.00 € 286.5. 108 106 104 (NULL \~ JEFE . una a una.00 € Tabla REPRESENTANTES Resultados de la consulta !~.775.OO€ NULL 106 104 ~ Filtro JEFE '" 104 Figura 6. Conceptualmente.f-+ ---<[-+ I~ NOMBRE Bruno Arteaga Daniel Ruidrobo Pablo Cruz VENTAS 367. Las filas que no satisfacen la condición de búsqueda quedan atrapadas por el filtro y se excluyen de.104 = 104 Desconocido Figura 6. En la consulta anterior. y aplica la condición de búsqueda a la fila.000. Las filas que satisfacen la condición de búsqueda atraviesan el filtro y pasan a formar parte de los resultados. los resultados. Por ejemplo. La cláusula WHERE como filtro.OO€ 305. un filtro para las filas de la tabla. • Test de encaje de patrones. la fila de Samuel Clavel tiene un valor NULL para la columna JEFE y se excluye. Comprueba si el valor de una expresión se encuentra en un rango especificado de valores. Este test se puede usar para seleccionar los clientes cuyos nombres comienzan por la letra E. Cuando aparece un nombre de columna en ]a condición de búsqueda (como la columna JEFE en este ejemplo).6 muestra otra forma de pensar sobre el papel de la condición de búsqueda de cláusula WHERE. Comprueba si el valor de una expresión coincide con uno de un conjunto de valores.911.00€ <W: / JEFE "JEFE 5lli. por ejemplo. Para cada fila.673. La Figura 6. ( Tabla REPRESENTANTES NOMBRE Bruno Arteaga María Jiménez Susana Santos SaJIluel Clavel Bernardo sánchez Daniel Ruidrobo JEFE = 104 l' . Por ejemplo. La Figura 6. . Comprueba si una columna tiene un valor NULL (desconocido). Comprueba si 'el valor de una columna que contiene datos de cadena coincide con un patrón especificado. la fila de Susana Santos tiene un valor de JEFE incorrecto y se excluye. Por ejemplo. • Si la condición de búsqueda tiene un valor NULL (desconocido).¡ti 108 NOMBRE SOL. Este test se puede usar para hallar los representantes cuyas ventas están comprendidas entre 100. Básicamente.775.OO€ 286. la condición de búsqueda actúa como NOMBRE Bruno Arteaga María Jiménez Susana Santos Samuel Clavel Bernardo Sánchez Daniel Ruiclrobo JEFE 104 106 108 ~ . la fila de Bruno Arteaga tiene el valor correcto de JEFE y se incluye. Condiciones de búsqueda SQL ofrece un rico conjunto de condiciones de búsqueda que penniten especificar muchos tipos diferentes de consultas de forma eficiente y natural.00 € 305. Manual de referencia VENTAS Capítulo 6: Consuftassimp'les 109 Bruno Arteaga Daniel Ruidrobo Pablo Cruz 367. • Test de valores nulos.5 muestra cómo funciona la cláusula WHERE.911. la fila se incluye en los resultados de la consulta. la fila se excluye de los resultados.000 y 500. Aquí se resumen cinco condición básicas de consulta (denominadas predicados en el estándar ANSUISO) y se describen en las secciones subsiguientes: • Test de comparación.6.ngo. Selección de filas con la cláusula WHERE. Castellón o León. Este test se puede usar para seleccionar las oficinas ubicadas en Navarra. Este test se-puede usar'P4ra hallar los representantes que· no tienen aún un jefe asignado. • Si la condición de búsqueda es FALSE.673. la condición de búsqueda puede producir 'uno de los siguientes tres resultados: • Si la condición de búsqueda es TRUE. • Test de pertenencia a conjuntos. \ TRUE ) Resultados de la consulta NOMBRE Bruno Arteaga Daniel Ruidrobo Pablo Cruz FALSE VENTAS 367 911.

En un test de comparación. A continuación hay algunos ejemplos de test de comparación.7. <..7. como «A != B» (usada por SQL Server) y «A~=B» (usada por DB2 y SQUDS). la comparación devuelve un resultado NULL.00 € <> < Ace Internacional <= > Figura 6..110 SOL. de crédito del cliente número 2107. Recuperación de una única fila Susana Santos Bernardo Sánchez Daniel Ruidrobo Pablo Cruz Listar las oficinas cuyas ventas están por debajo del 80 por ciento de sus objetivos.000 €) tienen .S OBJETIVO) t CIUDAD VENTAS 186. el test da un resultado FALSE. SELECT CIUDAD. SQL ofrece seis formas diferentes de comparar las dos expresiones.00 € OBJETIVO 300. . El usuario introduce un número de cliente en el formulario y el programa usa el nombre para construir y ejecutar una consulta. <>.042.7. o pueden ser expresiones aritméticas más complejas. Este tipo de consulta el es fundamento de los programas de recuperación de datos de bases de datos basados en formularios. como en este ejemplo. de acuerdo con la especificación de SQL ANSI/ISO. SELECT CIUDAD. Cuando SQL compara los valores de dos expresiones en el test de comparación pueden ocurrir tres resultados: • Si la comparación es cierta. LIMITE_CREDITO FROM CLIENTES WHERE NUM_CLI 2107 EMPRESA LIMITE_CREDITO 35. • Si la comparación es falsa. Varias implementaciones de SQL usan notaciones alternativas. SELECT NOMBRE FROM REPRESENTANTES WHERE FECHA_CONTRATO < 'Ol-ENE-SS' NOMBRE . son la única forma aceptable del test de desigualdad.. >.00 € Daimiel El test de comparación más común es el que comprueba si el valor de una columna es igual a una ~onstante. el test de comparación se escribe «A < > B».000. como se muestra en la Figura 6.1 Navarra Caste1l6n Almeria 106 104 105 Como se muestra en la Figura 6.. VENTAS.expresión-l . Las expresiones pueden ser tan simples como un" nombre de columna o una constante. Después se muestran los datos en el formulario. En algunos casos son formas alternativas.- expresión-2 ----+- SELECT EMPRESA. Cuando la columna es una clave primaria. • Si alguna de las dos expresiones devuelve un valor NULL. SQL calcula y compara los valores de dos expresiones para cada fila de datos. el test aísla una única fila de la tabla produciendo una única fila de resultados de la consulta... <=. Nótese que las instrucciones SQL para recuperar un cliente en concreto por su número. el test da un resultado TRUE.000. . Diagrama sintáctico del test de comparación. y la recuperación de todos los clientes con ciertas características (como clientes con límite de crédito superior a 25. Hallar los representantes contratados antes de 1988. como en este ejemplo: Obtener e"l nombre y e/limite. en otros. Manual de referencia Capítulo 6: Consultas simples 111 El test de comparación (=. >=) Listar las oficinas que no estén dirigidas por el número de empleado J08. JEF PROM OFICINAS WHERE JEF <> 108 CIUDAD JEF La condición de búsqueda más usual en una consulta SQL es un test de compara- ción. OBJETIVO PROM OFICINAS WHERE VENTAS < (.

500. FECHA_PEDIDO.00 2.I 1 11' :~I 112 SOL.. es necesario reflexionar sobre el manejo de los valores NULL cuando se especifica una condición de búsqueda. IMPORTE FROM PEDIDOS WHERE IMPORTE BETWEEN 20000. PRODUCTO.ón-.00 27. Manual de referencia Capítulo 6: Consultas simples 113 exactamente la misma forma.00 3.276. Esta uniformidad hace que SQL sea mucho más simple de aprender y usar que otros lenguajes de consulta anteriores. El test BETWEEN incluye los límites del rango. la segunda y tercera. FALSE 'o NULL. Los tipos de daros de las rres expresiones deben ser comparables. Aquí hay otro ejemplo de tesr de rango: Hallar los pedidos que se encuentran entre varios rangos de cantidades. ANO exp'es. las consultas producen.00 702. Diagrama sintáctico del test de rango (BETWEEN). mientras que hay 10 filas en la tabla REPRESENTANTES. En la lógica trivalorada de SQL.ón-supedo. Sólo las filas para las que la condición de búsqueda ofrezca un resultado TRUE se inciuirán en los resultados de la consulta. FAB.99 NUM_PEOIDO 113036 IMPORTE 22. El resr de rango comprueba si un valor se encuentra entre dos especificados.000.100.00 € ! . La prime~ ra define el valor a comprobar..CI 2A44L 41004 41004 41004 4100Z 41002 2A44G 4100Y IMPORTE 31.500. Hallar los pedidos del último trimestre de 1989.ón-de-res'l NOT jBE1'>1EEN eXp'es. respectivamente. SELECT NOMBRE FROM REPRESENTANTES WHERE VENTAS < = CUOTA NOMBRE Bernardo Sánchez Neus Azcárate € € € € € € € € Sin embargo. SELECT NUM_PEDIDO. La fila de Tomás Saz tiene un valor NULL en la columna CUOTA porque aún no se le ha asignado una cuota. podría parecer que los resultados de estas dos consultas incluirían todas las filas de la tabla REPRESENTANTES: El test de rango (BETWEEN) Listar los represellta1lIes que exceden su cuota. Este ejemplo muesrra un test de rango rípico. «desaparece» en el test de comparación. ..978.500.00 LisIar los representantes que no llegan a su cuota. Los dos tipos de consultas (recuperación según la clave primaria y recuperación basada en búsqueda de datos) serían operaciones muy diferentes en una base de datos no relacional. Como muestta esre ejemplo. SELECT NOMBRE FROM REPRESENTANTES WHERE VENTAS > CUOTA NOMBRE Bruno Arteaga María Jiménez Susana Santos Samuel Clavel Daniel Ruidrobo León Freire Pablo Cruz SQL proporciona una forma diferenre de condición de búsqueda con el resr de rango (BETWEEN) mosrrado en la Figura 6. _exP'es.. Implica tres expresiones SQL. una condición de búsqueda puede devolver un resultado TRUE.00 760. IMPORTE FROM PEDIDOS WHERE FECHA_PEDIDO BETWEEN '01-0CT-89' AND '31-DIC-89' NUM_PEDlOO FECHA_PEDIDO 112961 112968 112963 112983 112979 112992 112975 112987 17-DIC-89 12-0CT-89 17-DIC-89 27-DIC-89 12-0CT-89 04-NOV-89 12-0CT-89 31-DIC-89 FAB PRODUCTO REI ACI ACI ACI ACI ACI REI P.00 3. Esra fila no es lisrada por ninguna de las consultas. los límites inferior y superior del rango a comprobar. de forma que los pedidos del 1 de ocrubre o del 31 de diciembre se incluyen en los resuHados de la consuHa.00 AND 29999.00 15. Consideraciones sobre los valores NULL figura 6. El comportamiento de los valores NULL en los tests de comparación pueden revelar que algunas nociones «obviamente ciertas» acerca de las consultas SQL no sean realmente ciertas. Por ejemplo. SELECT NUM_PEDIDO.8.8. siete y dos filas de un total de nueve.nfedo.

ya que se puede expresar como dos tests de comparación.[ NOT J Figura 6. Conviene hacer notar que el test BETWEEN no añade realmente nada al poder expresivo de SQL. SELECT NOMBRE.725.00 392.9.000. • Si la expresión que define el límite inferior del rango produce un valor NULL. -------------.00 350.------------€ € € € € € € € -exp'esión-de-'es' . y NULL en caso contrario. .00 299.99 es completamente equivalente a: lA >= Bl AND (A < = Cl NUN_PEDIDO 113045 IMPORTE 45. y NULL en caso contrario. VENTAS. Diagrama sintáctico del test de pertenencia a conjuntos IIN).500. Almería o Daimiel. CUOTA. entonces el test BETWEEN devuelve FALSE si el valor es mayor que el límite superior.00 186.000. el test BETWEEN es una forma más simple de expresar una condición de búsqueda cuando se piensa en términos de rangos de valores. Aquí se muestran varias consultas que usan este test: Listar los represen'tames que trabajan en Navarra. pero en la práctica es generalmente sólo el nombre de una columna.8 NOMBRE Maria Jiménez VENTAS 392.~ :11 27.00 La expresión de test especificada en el test BETWEEN puede ser cualquier expresión SQL válida.912. o si ambas expresiones que definen el rango producen valores NULL.00 142.00 474.i 114 SOL Manual de referencia 112987 113042 Capítulo 6: Consultas simples 115 t . CUOTA FROM REPRESENTANTES WHERE VENTAS NOT BETWEEN (.500.------------.000.00 Otra condición común de búsqueda es el test de pertenencia a conjuntos (IN) mostrado en la Figura 6. entonces el test BETWEEN devuelve FALSE si el valor es menor que el límite inferior.00 ANO 49999.00 € SELECT NUM_PEDIDO.042.00 300.500. como en este ejemplo: Listar los representantes cuyas ventas no se encuentren entre el 80 y el 120 por ciento de su cuota. IMPORTE FROM PEDIDOS WHERE IMPORTE BETWEEN 40000.00 € Sin embargo.350.000.050.000.042. IMPORTE FROM PEDIDOS WHERE IMPORTE BETWEEN 30000.000. SELECT NOMBRE. El test de rango: A BETWEEN B ANO C 31..00 275. La versión negada del test de rango (NOT BETWEEN) comprueba los valores que están fuera del rango. VENTAS FROM REPRESENTANTES WHERE REP_OFICINA IN (11. El estándar ANSIfISO define reglas relativamente complejas para el manejo de los valores NULL en el test BETWEEN: • Si la expresión de test produce un valor NULL. • Si la expresión que define el límite superior del rango produce un valor NULL.00 186.00 AND 39999. Comprueba si un valor de datos coincide con uno de una lista de posibles valores.911.00 € 31. como en los ejemplos anteriores.00 300.00 € 22.9.000.000. NOMBRE Bruno Arteaga María Jiménez Samuel Clavel Neus Azcárate CUOTA 350.00 € SELECT NUM_PEDlDO.594.00 200. 13.00 El test de pertenencia a conjuntos (IN) CUOTA) ANO (1.99 IMPORTE 112961 113069 Antes de confiar en este comportamiento es recomendable probarlo en el SGBD particular que se use. entonces el test BETWEEN devuelve un resultado NULL.00 300. " .00 Susana Santos Bernardo Sánchez Neus Azcárate € € € € € € € € 22) VENTAS 367.725.2 * CUOTA) CUOTA 300.000.

s. 103) NUM_PEDIDO REP Se puede usar un test simple de comparación para recuperar las filas que coincidan con un texto en concretQ. REP. «Segadoras» o «Sillas)}.J Figura 6. el test IN no añade nada a la potencia expresiva de SQL.116 SOL.500.' IN {A. Diagrama sintáctico del test de encaje de patrones .00 Se puede comprobar si los valores de datos no coinciden con los valores usando la fonna NOT IN del test de pertenencia a conjuntos. esta consulta devuelve una fila de la tabla CLIENTES según el nombre: Mostrar eilimite de crédito de Sierras S. Todos los elementos de la lista de valores deben tener el mismo tipo. El patrón es una cadena que puede incluir uno o más caracteres comodín.' € € € € € € € € 112975 113055 113003 113057 113042 107 103 101 31. LIMITE_CREDITO FROM CLIENTES WHERE EMPRESA LIKE 'S% S. Si la expresión de test produce un valor NULL.00 150.625. FROM PEDIDOS WHERE FECHA_PEDIDO IN (' 04-ENE-90·.00 2. comprueba si el valor de una columna coincide con un patrón especificado. IMPORTE CIUDAD IN (' Navarra' l razones de transportabilidad.00 2.978. LIMITE_~REDITO FRQM CLIENTES WHERE EMPRESA = 'Sierras S.745.00 1. mostrado en la Figura 6.10. FECHA_PEDIDO. sería posible haber olvidado si el nombre de la empresa era «Sierras». L NOT -. pero es generalmente un nombre de columna. ESCAPE carader-de-escape Sin embargo. A.100. El test de encaje de patrones (LIKE).10. Caracteres comodín El carácter comodín signo del porcentaje (%) coincide con cualquier secuencia de varios o ningún caracteres. como en los ejemplos anteriores.00 € El test de encaje de patrones (LIKE) Hallar rodos los pedidos de cuatro representantes en concreto.00 652.A.. el test IN devuelve NULL. es generalmente buena idea evitar listas con un único elemento. Se puede usar el test de encaje de patrones para devolver los datos basados en una coincidencia parcial del nombre del cliente. . SELECT NUM_PEDIDO. Al igual que el test BETWEEN.350.480.430. SELECT NUM_PEDIDO. (LIKE).625. '11-ENE-90'. 101. IMPORTE FROM PEDIDOS WHERE REP IN (107.00 101 22. '25-ENE-90') NUM_PEDIDO FECHA_PEDIDO 113012 ll-ENE-90 113003 25-ENE-90 I1iPORTE 3. Por J.00 109 103 5. especialmente si el conjunto contiene más de unos pocos valores. Por ejemplo. La expresión de test en un test IN puede ser cualquier expresión SQL.00 € y reemplazarla con un test simple de comparación: CIUDAD = 'Navarra' 5. Aquí hay una versión modificada de la consulta anterior que usa el signo del porcentaje: SELECT" EMPRESA. como la siguiente: '18-ENE-90·. el es completamente equivalente a: (X = AlaR (X = B) OR (X = Cl -nombre-de-columna~LlKEParrónL . ya que la condición de búsqueda: X Sin embargo.00 112968 113058 112997 113062 113069 101 109 107 107 € € SELECT EMPRESA. Manual de referencia Capítulo 6: Consultas simples 117 '" Hallar todos los pedidos de un jueves de enero de 1990. y la mayoría de implementaciones comerciales tampoco establecen un límite superior explícito.A. el test IN ofrece una forma mucho más eficiente de expresar esta condición de búsqueda.00 600. 109. Estos caracteres se interpretan de fonna especial. IMPORTE 3. El estándar de SQL ANSIIISO no especifica un límite máximo sobre el número de elementos que pueden aparecer en la lista de valores. y el tipo debe ser comparable al tipo de datos de la expresión de test.

A. Legadoras S.A. Cualquiera de los nombres siguientes podría coincidir con el patrón: sierras S. probablemente haya encontrado ya el encaje de patrones. en lugar de cómo un carácter especial (se dice que este último carácter está escapado).A. El estándar de SQL ANSI/ISO especifica una forma de comparar estos caracteres mediante el uso de un carácter de escape especial. El uso de los caracteres de escape es muy común en las aplicaciones de encaje de patrones. PRODUCTO FROM PEDIDOS WHERE PRODUCTO LIKE 'A$%BC%' ESCAPE '$' Se pueden buscar cadenas que no coincidan con un patrón usando la forma del test de encaje de patrones. Sillas S. por ejemplo.». Si el valor de la columna es NULL. LIMITE_CREDITO FROM CLIENTES WHERE EMPRESA LIKE '_egadoras %' SELECT NUM_PEDIDO. El carácter comodín de subrayado L) coincide con cualquier carácter único. nn formaba parte de las primeras implementaciones de SQL.»: SELECT EMPRESA. Segadoras S.118 SOL. el asterisco (*) se usa en lugar del signo del porcentaje (%). identificado~s de producto comienzan con los sím- Los caracteres comodín pueden aparecen en cualquier lugar de la cadena patrón y en cualquier número. por In que el estándar ANSUlSO los especificó.A. El test de valores nulos lIS NULL) Caracteres de escape * Uno de los problemas del encaje de patrones de cadenas es cómo hacer la comparación de los propios caracteres comodín. Esto no plantea generalmente problemas serios porque los caracteres comodín no aparecen frecuentemente en los nombres. Esta consulta permite tanto la cadena «Secadoras» como «Pegadoras».A.» o «S. Pegadoras S. pero éstos no: Segadoras SA Sierras Ine.A. el test LIKE devuelve un resultado NULL. Hallar los productos cuyos bolos «A %BC». . El carácter de escape se especifica como una cadena constante de un carácter en la cláusula ESCAPE de la condición de búsqueda. que sigue al carácter de escape.' En este caso. Si se está seguro de que el nombre de la compañía es «Segadoras» o «Pegadoras». Manual de referencia Capítulo 6: Consultas simples 119 La palabra clave LIKE indica a SQL que compare la columna NAME con el patrón «8% S. para manejar esta tarea. el resultado de una condición de búsqueda puede ser TRUE o FALSE.11. se debería evitar la cláusula ESCAPE. Para asegurar transportabilidad. LIMITE_CREDITO FRQM CLIENTES WHERE EMPRESA LIKE '_egadoras S. NOT LIKE El primer signo de porcentaje del patrón. Para una fila dada. Y el signo de interrogación de cierre (?) en lugar del subrayado de SQL. el segundo funciona como comodín. Frecuentemente. se puede usar esta consulta: SELECT EMPRESA. SQL proporciona un test especial sobre valores NULL (IS NULL). mostrado en la Figura 6. . o puede ser NULL porque una de las columnas usadas en la evaluación de la condición de búsqueda contenga un valor NULL. como se muestra en la Figura 6. Sandalias S. los siguientes nombres coincidirían con el patrón: Segadoras S.A. de porcentaje en una columna de datos textuales. se trata como un signo de porcentaje literalmente. Pagadoras S. que ahora tiene un significado especial en el patrón.A.A. por ejemplo. Aquí se muestra un ejemplo que usa el signo del dólar ($) como carácter de escape: pero estos nombres no: Secadoras S. A. Si usted ha usado computadoras mediante una interfaz de comandos (como el entorno de UNIX). y también el final del nombre de la empresa «S. Con algunos productos SQL populares no se pueden comparar los dos caracteres comodín. Para comprobar si hay un carácter Los valores NULL crean una lógica trivalorada para las condiciones de búsqueda de SQL. El test LIKE se debe aplicar a una columna con un tipo de datos de cadena. L. A veces es útil comprobar explícitamente los valores NULL en una condición de búsqueda y manejarlos directamente. pero las capacidades de encaje de patrones son similares en la mayoria de situaciones en que una aplicación infonnática ofrece la capacidad de comparar partes seleccionadas de una palabra o texto. A. se puede incluir simplemente el signo de porcenlaje en el patrón porque SQL lo tratará como un comodín. Sin embargo. el carácter que lo sigue inmediatamente se trata como un carácter literal. Cuando el carácter de escape aparece en el patrón. El carácter escapado puede ser cualquiera de los caracteres comodín o el propio carácter de escape. números de producto y otros datos textuales del tipo que se almacena habitualmente en una base de datos. y se ha adoptado lentamente.A.10.

I A diferencia de las condiciones de búsqueda descritas anteriormente.11 . el test de valores NULL no puede devolver un resultado NULL.12. Condiciones compuestas de búsqueda (AND. como: SELECT NOMBRE FROM REPRESENTANTES WHERE OFICINA_REP = NULL OR Figura 6.11.' . Diagrama sintáctico de la cláusula WHERE.12. FALSE o NULL cuando se aplican a una fila de datos.nombre-de-columna 15 ¡-------. así que las reglas de la 16gica de SQL dicen que la condición de búsqueda debería dar un resultado NULL. SQL no puede decidirlo.c. la condición de búsqueda comprobaría: NULL = NULL La forma negativa del test de valores NULL (1S NOT NULL) encuentra las filas que no contienen un valor NULL: Listar los representantes que SELECT NOMBRE ¿El resultado es TRUE. Capítulo 6: Consultas simples 121 La palabra clave NULL no se puede usar aquí porque no es realmente un valor. como la que se muestra en la Figura 6. la fila se excluye de los resultados de la consulta -precisamente lo opuesto de lo que se esperaría-o Como resultado de la forma en que SQL maneja los valores NULL en las comparaciones. Dado que la condición de búsqueda no produce un resultado cierto. se debe usar explícitamente el valor NULL para comprobar los valores NULL. o FALSE? Dado que los valores en ambos lados de la igualdad son desconocidos. Cuando SQL encuentre una fila donde OFICINA_REP fuese NULL.I i l' 120 SOL Manual de referencia I!.ón-de-búsqueda I '¡ ti I I . las reglas para el manejo de los valores NULL en las comparaciones haría que su comportamiento fuese diferente del que cabría esperar. ---WHERE tL:J L AND cond. sino una señal de que el valor es desconocido. Puede resultar extraño que no se pueda comprobar un valor NULL usando una simple condición de búsqúeda de comparación.1 'i~ '1.. ten~an oficinas asignadas. OR Y NOT) FROM REPRESENTANTES WHERE OFICINA_REP r5 NOT NULL NOMBRE Bruno Arteaga Maria Jiménez Susana Santos Samuel Clavel Bernardo Sánchez Daniel Ruidrobo León Freire Pablo Cruz Neus Azcárate Las condiciones simples de búsqueda descritas en las secciones precedentes devuelven un valor TRUE. Incluso si el test de comparación: OFICINA_REP = NULL :¡: l' Figura 6. Usando las reglas de la lógica se pueden combinar estas condiciones simples de búsqueda de SQL para formar otras más complejas. OR Y NOT pueden ser a su vez condiciones compuestas de búsqueda.-----LNOT~ NULL . Nótese que las condiciones de búsqueda combinadas con AND. Siempre es TRUE o FALSE. i l' 1 11 . Esta consulta usa el valor NULL para encontrar el representante de la base de datos de ejemplo que no tenga asignada aún una oficina: Buscar el representante que no tenga aún una oficina asignada. Diagrama sintáctico del test de valores NULL (r5 NULL).. SELECT NOMBRE FRüM REPRESENTANTES WHERE OFICINA_REP 15 NULL NOMBRE Tomás Saz fuese legal. .

y los resultados son sutiles. Cuando se combinan más de dos condiciones de búsqueda con ANO. respectivamente. VENTAS 186.000 €.00 NOMBRE Neus Azcárate Por ejemplo. OR Y NOT. ~mo el siguiente: P'ALSE N11LL NULL . Hallar .000. se·pueden construir criterios de búsqueda muy complejos. como se podría esperar. y después OR.00) 15 UNKNOWN Tabla 6.000. CUOTA. VENTAS REPRESENTANTES VENTAS < CUOTA VENTAS < 300000.odos los representantes que estén por debajo de su cuota pero que sus ventas no estén por debajo de J50.00 CUOTA VENTAS 299. Navarra o CasteIlón.3 especifican tablas de verdad para AND.CUOTA) > 10000. Las Tablas 6. OR Y NOT.000. SELECT NOMBRE.00 NOMBRE Bernardo Sánchez Neus Azcárate CUOTA 200.000 €.775.00 € 186.000 €.042.00 € 186. OR Y NOT y paréntesis para agrupar el criterio de búsqueda.122 SOL. se puede usar la palabra clave condición de búsqueda sea falsa: para seleccionar filas donde la La razón por la que podría desearse ver esta lista particular de n~:)Jnbres no importa. Lo que ilustra este ejemplo es una consulta razonablemente compleja. El estándar SQL2 añade otra condición lógica de búsqueda.000.00 € OR 'rRUE La tabla de verdad de OR TRUE CUOTA 300. seguido de ANO. Manual de referencia Capítulo 6: Consultas simples 123 La palabra reservada OR se usa para combinar dos condiciones de búsqueda cuando cualquiera de ellas (o ambas) debe ser cierta: Tabla 6.00 € 75.000.000. o bien (b) no tienen jefe y están contratados desde junio de 1988. Como con las condiciones simples de búsqueda.2.00 € Hallar todos los representantes que o bien (a) trabajan en Daimiel.000 € o menos. que comprueba si el valor lógico de una expresión o test de comparación es TRUE. FALSE o UNKNOWN (NULL).000. Para asegurar la transportabilidad. siempre es buena idea usar paréntesis y eliminar cualquier posible ambigüedad. 6. a la lógica proporcionada por ANO.00 € 200. VENTAS FROM REPRESENTANTES WHERE VENTAS < CUOTA AND VENTAS < 300000.00 € También se puede usar la palabra clave AND para combinar dos condiciones de búsqueda que deben ser simultáneamente ciertas: Hallar los representantes que estén por debajo de su cuota y con ventas por debajo de 300.00) NULL 275.00 € FALSE TRUE FALSE N11LL TRUE NULL NULL TRUE TRUE TRUE Al usar las palabras clave AND. AND La tabla de verdad de AND TRUE TRUE FALSE NULL FALSE FALSE FAL5E FALSE NULL NULL FALSE NULL Hallar los representantes que estén por debajo de su cuota o con ventas por debajo de 300. [JO NULL.594. SELECT FROM WHERE OR OR NOMBRE REPRESENTANTES {OFICINA_REP IN (22. el resultado de (NULL OR TRUE) es TRUE. y muestran el impacto de los valores NULL.00 € 300.00 € NOT Finalmente. CUOTA.2 Y6.00 € VENTAS 142.00 € N11LL Samuel Clavel Bernardo Sánchez Tomás Saz Pablo Cruz Neus A%cárate 275. 12)) (JEFE IS NULL AND FECHA_CONTRATO >~ 'Ol-JUN-88') (VENTAS> CUOTA AND NOT VENTAS> 600000.1. los valores NULL afectan al resultado de las condiciones compuestas de búsqueda. o (e) superan su cuota pero tienen ventas de 600.00 € 142.042. CUOTA.13 muestra la sintaxis del test IS.042. el estándar ANSI/ISO especifica que NOT tiene la precedencia más alta. La Figura 6.00 € 300. VENTAS FROM REPRESENTANTES WHERE VENTAS < CUOTA AND NQT VENTAS < 150000.985. SELECT FROM WHERE DR NOMBRE TRUE FALSE NOMBRE. En particular.00 € 286.594. OR Y NOT.912.1. el test IS: ((VENTAS . el test IS. 11. SELECT NOMBRE.

consiste en la palabra clave DRDER BY seguida de una lista de especificaciones de orden separadas por comas. Manual de referencia Tabla de verdad de NQT Capítulo 6: Consultas simples 125 Tabla 6.637.. El diagrama sintáctico de IS. ordenadas en orden decreciente de ventas. y se puede ordenar sobre cualquier elemento de la lista de selección de la consulta. de forma que las oficinas con mayores ventas aparezcan primero. Para pedir una ordenación descendente.00 186.14. SELECT CIUDAD. ! 11 ---------Almería ------Este Este Este Oeste Oeste ------------367.: Figura 6. REGION. se puede solicitar la ordenación en secuencia ascendente o descendente. las siguientes (CIUDAD.00 € l .Ónj. Mostrar las ventas de cada oficina. ¡'li T eSI-de. dentro de cada región..CUOTA) > Figura 6. VENTAS FROM OFICINAS ORDER BY REGlON. Por ejemplo. por ciudad. León Oeste 835..3.. en este caso) son progresivamente claves de ordenación menores.042.. Se puede pedir que SQL ordene los resultados incluyendo la cláusula ORDER BY en la instrucción SELECT.00) I5 FALSE seleccionará las filas donde VENTAS no están significativamente sobre CUOTA. SQL ordena los datos en secuencia ascendente.s--r=TRUE:=f FALSE UNKNOWN Listar las oficinas. NO'!' i I I 'rRUE FALSE FAL5E TRUE NULL NULL .1I 124 1: SOL. los resu:Itados de esta consulta se ordenan sobre dos columnas: REGlON y CIUDAD: Castellón Navarra Daimiel León € € € € I ti' La primera especificación de orden (REGlON) es la clave de ordenación principal. Como muestra este ejemplo. No siempre es posible evitar la forma 18 UNKNOWN del test. FROM OFICINAS ORDER BY VENTAS DESC CIUDAD REGlON VENTAS expresión-lógica VENTAS l. conviene evitar estos tests y escribir las expresiones usando sólo AND. como en el siguiente ejemplo: . CIUDAD CIUDAD REGlON VENTAS 10000. lI Ase --1 DESC~ I se puede usar para hallar filas donde la comparación no se pueda realizar debido a que VENTAS o CUOTA tenga un valor NULL.13..00) Para asegurar una transportabilidad máxima.. Diagrama sintáctico de la cláusula QRDER BY. ya que el test se podría haber escrito de manera simple: NOT ((VENTAS ..- . ordenadas alfabéticamente por región y.14. el test 18: ((VENTAS ~ CUOTA) > 10000.915.comparaC.00 € Ordenación de los resultados de las consultas (cláusula ORDER BY) Al igual que las filas de una tabla de la base de datos.00 735.00 835. De forma similar.911. usadas como «decisivas» cuando dos filas de resultados tienen los mismos valores de las claves principales anteriores.042. Al usar la cláusula ORDER BY.aRDER BY I'n~mbre-de-COlumnaj I I Lnumero-de-columna f----.. De manera predeterminada. SELECT CIUDAD.915. mostrada en la Figura 6. La cláusula aRDER BY. las filas de los resultados de una consulta no se organizan de modo particular.. se incluye la palabra clave DEse en la especificación de orden. REGlON. OR Y NOT.00 692. el test 18 no añade realmente potencia expresiva a SQL.

En este caso se puede especificar un número de columna en lugar de un nombre de columna.14. Para cada fila restante. aplicar su condición de búsqueda a cada fila de la tabla. y es fácil de com· prender generalmente el significado de una consulta simplemente leyendo la instrucción SELECT.911.l .126 SOL. 3 DEse CIUDAD REGlaN Este Este Este Oeste Oeste 3.911. Si la columna de los resultados que se usa para ordenar es una columna calculada. Comenzar con la tabla referenciada en la cláusula FROM. 5. como en este ejemplo: juntos de caracteres internacionales o para asegurar la transportabilidad entre los sistemas de conjuntos de caracteres ASCII y EBCDIC. SELECT CIUDAD.00 € 367.958. ordenaciones ascendentes y descendentes. La cláusu· la FROM se aplica en primer lugar (seleccionando la tabla que contiene los datos a recuperar). REGlaN. REGlaN. Los siguientes pasos describen el procedimiento para generar los resultados de una consulta SQL que incluya las cláusulas descritas en este capílUlo. 4.00 110 . Si se especifica SELECT DISTINCT.00 -113 . se puede usar también la palabra clave Ase para especificar un orden ascendenre. que es la diferencia entre VENTAS y OBJETIVO de cada oficina.958. ordenadas alfabéticamente por región.637.637. como en el siguiente ejemplo final: Listar las oficinas.915.042.00 (VENTAS-OBJETIVO) € € € € € El estánqar SQL2 permite controlar el tipo de orden usado por el SGBD por cada clave de ordenación. nombres de columnas. Listar las oficinas.958. Como muestran estos pasos. una a una. Manual de referencia Este Este Este Oeste Capítulo 6: Consultas simples 127 Castellón Navarra Almería Daimiel 735. Si hay un cláusula WHERE. I . muchas implementa~ ciones de SQL o bien ignoran los aspectos de los tipos de ordenación o usan su propio esquema propietario para el control por el usuario de la secuencia de arde· nación. Esto puede ser importante cuando se trabaje con con- Las filas generadas por este procedimiento forman los resultados de la consulta. se pueden especificar ordenaciones muy complejas de los resultados.OBJETIVO) FRQM OFICINAS aRDER BY REGlaN Ase. Finalmente. A continuación se aplica la cláusula WHERE (seleccionando las filas específicas de la tabla). Si hay una cláusula ORDER BY. Sin embargo. 2. Al combinar números de columnas.00 € € € € € Estos resultados se ordenan según la tercera columna. La cláusula SELECT se aplica a continuación (generando las columnas específicas de los resultados y eliminando los duplicados si se solicita). no tiene nombre de columna para ser usado en una especificación de nombre. (VENTAS . de forma que las oficinas COn mejor rendimiento aparezcan primero. Sin embargo.00 € 692. Para generar los resultados de una instrucción 5ELECT hay que seguir estos pasos: l. usar el valor de la columna en la fila en curso. en la práctica. Navarra Almeria Castellón León Daimiel ---------- -----------------117. Reglas para el procesamiento de consultas sobre una sola tabla Las consultas de una única tabla son generalmente simples. pero dado que es la secuencia predeterminada de ordenación. ordenar los resultados como se haya especificado.915. ordenadas descendentemente según el rendimiento de sus ventas. Estas «reglas» para ti procesamiento de consultas SQL se expandirá varias veces en los próximos tres capítulos para incluir las cláusulas restantes de la instrucción SELECT.00 € 186.00 -113. SELECT CIUDAD. y dentro de cada región en orden descendente por el rendimiento de sus ventas. cuando las consultas se complican es importante tener una «definición» más precisa de los resultados que producirá una instruc· ción SELECT dada. reteniendo las filas para las que la condición de búsqueda es TRUE.042. FROM OFICINAS ORDER BY 3 DESC CIUDAD Navarra Le6n Almeria Castellón Daimiel REGION Este Oeste Este Este Oeste (VENTAS . eliminar cualquier fila duplicada de los resultados que se hubieran producido. Para cada referencia a columna. los resultados producidos por una instrucción SELECT se especifican aplicando cada una de esta cláusulas. y descartando las filas para las que es FALSE o NULL.637. calcular el valor de cada elemento en la lista de selección para producir una única fila de resultados.00 110. esta área de la especificación de SQL2 es muy compleja y.00 17.00 17 .OBJETIVO) (VENTAS-OBJETIVO) ---------- -----------------117 .911. la cláusula ORDER BY se aplica para ordenar los resultados.958.00 € Como se indicó en la Figura 6.00 -64 . la palabra clave usualmente se omite.00 -64.

ACl REl ACl REl . los resultados de la consulta combinada.000 € del producto en un único pedido.000 € del producto en un único pedido.--. la operación UNION produce una única tabla de resultados que combina las filas de los resultados de la consulta de arriba con las filas de los resultados de la de abajo. SQL dispone de esta capacidad mediante la característica UNION de la instrucción SELECT.. Sin embargo.000 € o cuando se hayan pedido más de 30.00 FAB IMM REI REI PRODUCTO 775C 2A44L 2A44R tll 11 " Listar todos los productos en los que su precio supere 2. La primera parte de la solicitud se puede satisfacer con la consulta superior de la figura: Listar todos los productos en los que su precio supere 2. PRODUCTO FROM PEDIDOS WHERE IMPORTE> 30000.000 €.lUU::. sí.000 € o cuando se hayan pedido más de 30. la segunda parte de la solicitud se puede satisfacer con la consulta inferior en la figura: Listar todos los productos de los que se hayan pedido más de 30. corno se describe en la siguiente sección. ID_PRODUCTO FROM PRODUCTOS WHERE PRECIO> 2000. Uso de UNION para combinar los resultados. Nótese que los nombres de las columnas de las dos consultas combinadas con no tienen que ser idénticas.000 € en un único pedido. UNION iJ !I • . ID_PRODUCTO PRODUCTOS PRECIO> 2000.128 SOL.1 SELECT ID_FAS. l' " " 1: r+ JEF eUNlÓNJ-1 -- 4100Y 2A44L 4100Z 2A44R 2A44L 2A44R 755C Hay restricciones severas sobre las tablas que se pueden combinar en una operación UNION: • Las dos tablas deben contener el mismo número de columnas. Manual de referencia Capítulo 6: Consultas simples 129 '''i' Combinación de los resultados de las consultas (UNION)* A veces es conveniente combinar los resultados de dos o más consultas en una única tabla de resultados. La Figura 6.00 ID_FAS ID_PRODUCTO ACl REl ACl REl Como se muestra en la Figura 6.00 DISTINCT FAB.15. SELECT FROM WHERE UNION SELECT FROM WHERE ACI ACI IMM REI REI ID_FAB..00 4l00Y 4100Z 775C 2A44L 2A44R 4100Y 2A44L 4100Z 2A44R Tabla PRODUCTOS ID JEF ID PRODUCTOS 4100Y 2A44L 4100Z 2A44R Resultados de la consulta ACl REl ACl REl REl REl lMM r----11' I <lOla J:'tW. REl REl lMM 755c ~¡ Figura 6. SELECT DISTINCT FAB. En el ejemplo anterior la primera tabla de resul- PRODUCTO 2A44L 2A44R ¡.15 ilustra cómo usar la operación UNION para satisfacer la siguiente solicitud: I De forma similar. • El tipo de datos de cada columna de la primera tabla debe ser el mismo que el de la columna correspondiente de la segunda. PRODUCTO PEDIDOS IMPORTE> 30000. . 1 :1 ii.15. • -Ninguna de las dos tablas se pueden ordenar con la cláusula ORDER BY. La instrucción SELECT que especifica la operación UNION es: Listar todos los productos en los que su precio supere 2.

la cláusula ORDER BY debe especificar las columnas por su número de columna. SELECT ID_FAB. Para eliminar filas duplicadas se debe especificar explícitamente SELECT DISTINCT.000 €. Dado que las columnas producidas por la operación UNION no tienen nombre.000 € del producto en un único pedido. Uniones y ordenación* La cláusula QRDER BY no puede aparecer en ninguna de las dos instrucciones SELECT combinadas con una operación UNION. SELECT ALL (se conservan los duplicados) es la forma predeterminada.500. las columnas de los resultados producidos por la operación UNION se dejan sin nombre.00 €.clave ALL inmediatamente a continuación de la palabra UNION. por lo que la forma predeterminada es no eliminar duplicados. La mayoría de implementaciones comerciales de SQL relajan esta restricción y permiten expresiones simples en la lista de selección. Si se sabe. Dado que las columnas de las dos tablas tienen nombres diferentes. el conjunto combinado de resultados contiene sólo una fila del producto REI-2A44L Si se desea conservar las filas duplicadas de una operación UNION. Sin embargo.. La razón de esta inconsistencia que las formas predeterminadas de SQL se eligieron para producir el comportamiento correcto en la mayoría de las ocasiones: UNION Uniones y filas duplicadas* Dado que la operación UNION combina las filas de dos conjuntos de resultados. El estándar de SQL ANSI/ISO especifica una restricción más sobre la instrucción SELECT que participa en una operación UNION. algunas implementaciones SQL ni siquiera albergan la operación UNION. Esta forma de la consulta produce dos filas duplicadas para el producto REI-2A44L: • En la práctica. Para conservar filas duplicadas se debe especificar explícitamente UNION ALL.00 € UNION ACI RE! IMM RE! RE! 4100Z 2A44R 775C 2A44L 2A44R . por 10 que aparece en el conjunto superior de los resultados.00 € de este producto en la tabla ORDERS. SELECT ID_FAB. Sólo se pemiten nombres de columna o una especificación de todas las columnas (SELECT *) en la lista de selección. ID_PRODUCTO FROM PRODUCTOS WHERE PRECIO> 2000. De hecho. el conjunto combinado de resultados producidos por la operación UNION se pueden ordenar especificando la cláusula ORDER BY después de la segunda instrucción SELECT. especialmente si los resultados contienen un gran número de filas. Para la operación UNION. y prohíbe expresiones en ella. la mayoría de instrucciones SELECT simples no producen filas duplicadas. Manual de referencia Capítulo 6: Consultas simples 131 tados tiene las columnas ID_JEF e ID_PRODUCTO. por lo que la forma predeterminada es la eliminación de duplicados. A continuación se muestra la misma consulta de productos que la mostrada en la Figura 6. con los resultados ordenados por fabricante y número de producto: Listar todos los productos para los que el precio sea mayor que 2. tendería a producir resultados con filas duplicadas.00 ACI RE! 4100Y 2A44L Listar todos los productos para los que el precio sea mayor que 2. ordenados por fabricante y número de producto. se debería especificar la operación UNION ALL. en la consulta de la Figura 6. Nótese que el manejo predeterminado de las filas duplicadas en la operación y para la instrucción simple SELECT es exactamente opuesto. Para la instrucción SELECT.00 UNION ALL SELECT DISTINCT FAB.] 5. debido a las consultas individuales implicadas. muchas implementaciones SQL no permiten que las instrucciones SELECT incluyan cláusulas GROUP BY o HAVING. la operación UNION elimina las filas duplicadas como parte de su procesamiento.500. No tendría mucho sentido ordenar los dos conjuntos de resultados porque se transmitirían directamente a la opera~ ción UNION y nunca serían visibles para el usuario. porque la consulta se ejecutará mucho más rápidamente. a cuando se hayan pedido más de 30.000 € del producto en un único pedido. También hay un pedido de 31. La eliminación de filas duplicadas de los resultados es un proceso costoso en tiempo.130 SOL. la mayoría de operaciones UNION producirían filas duplicadas no deseadas. Por ejemplo. el producto REI-2A44L se vende por 4. De forma predeterminada.000 € o cuando se hayan pedido más de 30. PRODUCTO FROM PEDIDOS WHERE IMPORTE> 30000. UNION (se eliminan los duplicados) es la for~ ma predeterminada. hay que especificar la palabra. ID_PRODUCTO PROM PRODUCTOS WHERE PRECIO> 2000. por 10 que aparece en el conjunto inferior de los resultados. que una operación UNION no puede producir filas duplicadas. Sin embargo. • En la práctica. Así. mientras que la segunda tabla de resultados tiene las columnas FAB y PRODUCTO. y algunas no permiten funciones en la lista de selección (prohiben las consultas de resumen descritas en el Capítulo 8). Los expertos en bases de datos han criticado el manejo de las filas duplicadas en SQL y apuntan a esta inconsistencia como un ejemplo de los problemas.15.

Operaciones UNION anidadas. l'. La consulta de la figura se escribe: Mary George Sil! Harry ..16.16. las siguientes tres expresiones son completamente equivalentes y producen doce filas de resultados. De hecho. Si la expresión: A UNIaN ALL B UNION C UNION y UNION ALL. . De forma similar.J sil! Mary George Fred Uniones múltiples* Tabla e ( UNIÓN J Sue Julia Harry Mary'¡ George J Sue Julia Harry La operación UNION se puede usar repetidamente para combinar tres o más conjuntos de resultados. Por esta razón siempre es buena idea usar paréntesis en las operaciones UNION de tres o más tablas para especificar el orden de evaluación pretendido. Tabla B sil! Mary ACI 4100Y ACI IMM 4100Z ?75C RE! RE! 2A44L 2A44R Sue Julia Harry George Fred Resultados de la consulta .1. si todas las operaciones UNION de la instrucción eliminan las filas duplicadas.132 SOL Manual de referencia 1 Capítulo 6: Consultas simples 133 SELECT DISTINCT FAS. FROM e) Bruno Sin embargo.1 1 SELECT FRQM A UNION (SELECT PROM B UNION SELECT Figura 6. si se interpreta como: (A UNION ALL Bl UNION interior más cuatro de e (A UNIaN B) UNION C (A UNIaN C) UNION B entonces produce sólo cuatro filas. PRODUCTO FROM PEDIDOS WHERE IMPORTE> 30000. L ¡ ¡:: (A UNION ALL Bl UNION ALL e (A UNTON ALL cl UNION ALL B - .1' . Sin embargo. o si todas ellas las conservan.J I . dado que la UNION externa elimina todas las filas duplicadas. La unión de la tabla B y la tabla e de la figura produce una única tabla combinada.. i y producen siete filas de resultados. Esta tabla se combina con la tabla A en otra operación UNION. capítulo es el primero de cuatro sobre las consultas SQL. . 2 Tabla A I(lUI(l"" sin. Cada instrucción SELECT produce una tabla de resultados que contiene una o más columnas. Estas tres expresiones son completamente equivalentes: A UNION (B UNION Cl entonces produce diez filas de resultados (seis de la la tabla A). y ninguna o varias filas. si las uniones implican una mezcla de orden de evaluación sí importa. dado que se conservan los duplicados: A UNION ALL (B UNION ALL Cl Resumen Este. ( sil! UNIÓN . Ha descrito las siguientes características de las consultas: • La instrucción SELECT se usa para expresar una consulta SQL. como se muestra en la Figura 6. el orden en que se realicen no es importante. el María Genaro Fulgencio Susana 'Julia Hilario se interpreta como: A UNION ALL (B UNION e) UNION Los paréntesis de la consulta indican la operación UNION que se debe realizar primero. f :.00 ·1 ORDER BY 1.

mostrando el importe del pedido. Por ejemplo. CAPíTULO 7 Consultas multitabla (reuniones) Mucha~ consultas útiles necesitan datos de dos o más tablas de la base de datos. que pueden ser columnas de datos de la base de datos o columnas calculadas. • La cláusula SELECT especifica la columna o columnas de datos que se incluirán en ·Ios resultados. el nombre del cliente y el nombre del producto del pedido (tablas PEDIDOS. • Mostrar todos los pedidos de los representantes de la región Este mostrando la descripción del producto y el representante (PEDIDOS. Un ejemplo de consulta con dos tablas La mejor forma de comprender las facilidades que proporciona SQL para las consultas multitabla es comenzar con una solicitud simple que combina datos de dos tablas diferentes: «Listar rodos los pedidos. • La operación UNION se puede usar en una instrucción SELECT para combinar dos o más conjuntos de resultados en un único conjunto. como se muestra en la Figura 7. tres y cuatro tablas: • Listar los representantes y las oficinas en las que trabajan (tablas SENTANTES REPRE- Y OFICINAS). OFICINAS Y PRODUCTOS). • Una condición de búsqueda puede seleccionar filas comparando valores. mostrando el número de pedido. Manual de referencia • La cláusula FROM especifica la tabla o tablas que contienen los datos a recuperar por una consulta.134 SQL. CLIENTES Y REPRESENTANTES).» Los cuatro elementos de datos solicitados están almacenados claramente en dos tablas diferentes. • La cláusula WHERE selecciona las filas a incluir en los resultados aplicando una condición de búsqueda a las filas de la base de datos. encajando un patrón de cadena y comprobando si son valores NULL. REPRESENTANTES. En este capítulo se describen estas consultas y la característica de reunión de SQL. • Listar cada pedido de la última semana. comprobando un valor con un rango de valores. las solicitudes de datos de la base de datos de ejemplo toman datos de dos. 135 l . • La cláusula ORDER BY especifica que los resultados se deberían ordenar de forma ascendente o descendente según los valores de una o más columnas. SQL permite recuperar datos que responden a estas solicitudes con las consultas multitabla que reúnen datos de dos o más tablas.1. OR Y NOT para formar condiciones de búsqueda más complejas. • Los condiciones simples de búsqueda se pueden combinar con ANO. su importe y el nombre y límite de crédito del cliente.

109 106 105 550oo.00€ 6 1. ~ .00€ • La tabla PEDIDOS contiene el número de pedido y su importe.OO€ 3 745. Resultados de la ccos NUM PEDIDO . mostrando el número de pedido. ¡1' Tabla PEDIDOS NUM PEDIDO FECIlA. Comenzar escribiendo los cuatro nombres de columna para los resultados. Ydespués copiarlos en la tabla de resultados. Sotoca.'-"" IJ. Repetir el proceso.» Tabla PEDIDOS Tabla CLIEtn'ES NUM_cIlr I EMPRESA REP~CLIILIMITE_~REDITO h'U!LPEOIDO PF:CIII. • La tabla CLIENTES contiene.~ EMPRESA J . dos cosas serán ciertas: • Cada fila de resultados torna sus datos de un par específico de filas.A.-PEDIDO CLIENTE r . pero no tiene información de los pedidos. 106 105 106 C1IN1'IDAD IMPORTE Tab! a CLIENTES NUM CLI EMPRESA REP CLI LIMITE CREDrTO Relación de clave primaria/clave I externa I """ 113012 112989 11/01/1990 03/01/1990 I g6f 211V ~. La tabla resultante (que contiene datos de las tablas originales) se denomina reunión de dos tablas Buscar en la fila de la tabla CLIENTES el nombre del cliente (<<1.000 OO€ 00 000 OO€ ® «Listar todos los pedidos.. L6 n ez 21. Buscar en la fila el número de cliente que realizó el pedido (2117) e ir a la tabla CLIENTES para encontrar el número de cliente 2117 en la columna CUST_NUM..500.458.e.el primer pedido.on el. llJ) 2 11961 11 012 11 989 Henche & López Sotoca Toledo S. PEDIDOS Por supuesto. Antes de examinar la instrucción SELECT de la consulta.000. uno de la tabla PEDIDOS y otro de CLIENTES.. P.1.000. empezando en el paso 2. 1 Hen. es instructivo pensar en cómo uno mismo resolvería la solicitud usando lápiz y papeL La Figura 7.viame~te.-PEDlOO 17/1?I1<lg'l CLIEm'E .500.oaE 35000.00€ 0 0 @ Figura 7. ésta no.00 E). Reuniones simples (equirreunion~.2 muestra lo que uno probablen:ente ~arfa: DIDOS.00 E). pero no tiene nombres de cliente ni límites de créditos.00€ / LIMITE CR¡¡Í:llTO / sotocl' 35. 5.00 € 17/12/1989 11/01/1990 2111 03/0111990 2101 $!V '" '" 105 '" II CM'TIDAD IMPORTE {~ 1. En cada fila de la tabla PE~ la columna CLIENTE contiene el número de cliente que realizó el pedido. los nombres y saldos de los clientes.22 Toledo S A. Figura 7.$ 351!:745.. Sin embargo.. \ su importe y el nombre y Ifmite de crédito del e/iente.000.) y el límite de crédito (35. Una solicitud sobre dos tablas. Ob. que coincide c.P. Manual de referencia Capítulo 7: Consultas multitabla (reuniones) 137 I .ción SELECT que maneja la solicitu~ d~be usar de algún modo este enlace entre las tablas para generar sus resultados.es la única forma de generar los resultados.i El proceso de la formación de pares de filas haciendo corresponder los contenidos de las columnas relacionadas se denomina reunión de tablas. la instru~. 7 35 6 34.L a MPORTE 7 :::i1.500. P.columna NUM_CLI en una de las filas de la tabla CLIENTES..500. Procesamiento manual de una consulta multitabla. v~lor de la . ¡Con esto se ha generado una fila de resultados! Ir de nuevo a la tabla e ir a la siguiente fila. -~112961 ~1.h. Y copiar ambos valores en la primera fila de resultados.2. pero independientemente de cómo se haga. Buscar en la fihel númeróde pedido (112961) y su importe (31. Despu'és'ir a 'la tabla PEDIDOS y comenzar con. hay un enlace entre estas dos tablas. • La pareja de filas se encuentran haciendo coincidir los contenidos de las columnas correspondientes de las tablas.136 SOL. \ 109 106 105 ~ooo~ 30.OO€ =.OaE 30.00.OO€ 1 458. hasta que no queden más pedidos.

la consulta dice a SQL qué tipo de resultados deberían aparecer y deja a SQL decidir cómo generarlos. 2. REGIÓN Deste Este Este Este oest" '" OBJE"l'IVO 3CC. De hecho. IMPORTE.'ll.>.EHPL '" lB6.esent..6)7.130. Las reuniones proporcionan.3.. OO€ Jarandilla Ltd.138 SOL.915..PRESA LIMITE_CREDITO T bl OFICINlIS OI'INA CIUD.00€ 55.nt.nte Jefe vente" Repres .. ... Consultas padre/hijo Las consultas multitabla más comunes involucran dos tablas que tienen una relación natural padre/hijo. Las reuniones también se basan en otras clases de comparaciones de columnas. En primer lugar..--------------6S.00€ Filas 112963 3.OOO. mostrando el número de pedido. no debería sorprender que la instrucción SELECT de una consulta multitabla contenga una condición de búsqueda que especifica el encaje de columnas.nte ""~ -~ CIUDAD """ÓN < compara columnas de dos tablas diferentes.OO€ 35.00€ Ace Internacional 113034 113058 1.00€ 55.OO€ SO.0C€ 73S.276.e6n F.2: Listar todos los pedidos.S..OO€ S7S.OO€ BOO. las reuniones son el único mecanismo para incorporar relaciones de datos entre tablas.OOO...00C.OO€ 367. Al igual que todas las condiciones de búsqueda.000. Estas columnas se denominan columnas coincidentes de las dos tablas.nt. p .OO€ -~ Rll'Suhados de le consult.D '22 Daimiel . '" '" '" '" Tebl'l\E~ ""\M.500.000.A. Dado que SQL maneja las consullas multitabla haciendo corresponder columnas.000.OO€ NUM_PEDIDO IMPORTE EM.CC€ 6'2.000. así que todas las posibles relaciones entre tablas se pueden formar haciendo corresponder los contenidos de las columnas relacionadas.. Manual de referencia Capítulo 7: Consultas multitabla (reuniones) 139 (una reunión que se basa en una correspondencia exacta entre las dos reuniones se denomina equirreuni6n. por tanto.00€ 50.nt .OO€ Acme 112987 27.00€ Acme 4.104.-REP 13 Representante Represll'ntante Representante VP Ventas Jefe Ventes Rep.000. Cada pedido (hijo) tiene un cliente asociado (padre).OO€ 50.00€ Henche & López 113003 5.drobo T<lIMS saz l.00€ 1. una facilidad potente para incorporar las relaciones entre los datos en la base de datos. La consulta de los pedidos y clientes de la sección anterior es un ejemplo de tal consulta.. Todos los datos de una base de datos relacional se almacenan en sus columnas como valores explícitos de datos. su importe y el bre y límite de crédito del cliente.. no '" ".nte R. Figura 7. CLIENTES WHERE CLIENTE : NUM_CLI EMPRESA. Aquí hay otro ejemplo de una consulta que incorpora la relación padre/hijo mostrada en la Figura 7.000..000.000. 480.» Nótese que la instrucci6n SELECT no dice nada sobre c6mo debería ejecutar SQL la consulta.000. la condición de búsqueda: '" '" '" '" ".OO€ F. Esto se parece a las consultas del capítulo anterior pero con dos nuevas características.625. OOE Henche & López 113055 150. La tabla que contiene la clave externa es el hijo en la relación: la tabla con la clave primaria es el padre... En segundo lugar. la cláusula FROM lista dos tablas en lugar de una.. 458.o."ent.00€ F.500.A.COO.978.00€ Henche & López 6S. y cada cliente (padre) puede tener muchos pedidos asociados (hijos). En su lugar.OO€ 65..OO€ 35. Dado que es una consulta de dos tablas. la condición de búsqueda especifica las mismas columnas coincidentes que se usaron en el procesamiento manual de la consulta. 112989 112968 3. Del Capítulo 4 se puede recordar que las claves externas y las claves primarias crean la relación padre!hijo en una base de datos SQL.---------..ate ~~ " " .-----------------. Las reuniones son el fundamento del procesamiento de consultas multitabla en SQL.n1el Ru. No hay mención acerca de «comenzar con los pedidos» o «comenzar con los usuarios».042. Una consulta padre/hijo con OFICINAS y REPRESENTANTES.OO€ SO. Para incorporar la relación padrelhijo en una consulta hay que especificar una condici6n de búsqueda que compare la clave externa con la clave primaria. López S. Nllvllrrll " ".00€ 65.eHe pablo C~uz Ileus Azcá...OO€ Ace Internacional 632.3: I I ----------.. FROM PEDIDOS.C42. Realmente captura el espíritu del encaje de columnas muy bien.896.OO€ <ti ~ón d. 113065 113036 22. como se describe más tarde en este capítulo).02. López S..000. Aquí hay una instrucción SELECT para la consulta calculada manualmente en la Figura 7.00C.00€ Acme 113027 112993 1.OO€ 350..OO€ Acme 112983 7. '" lO' BruDOAr~ K4na JiDén" SUsana Santos S4muel Clavel Bernardo S'ncllu o.OO€ 55. SELECT NUM_PEDIDO. Rep..OO€ 72S."" ~ " U """ OFICmA. Las parejas de filas que generan los resultados son combinaciones de filas padre/hijo.OO€ 835.000.OCO.000.. diciendo: «Generar los resultados sólo para parejas de filas en las que el número de cliente (CUST) de la tabla PEDIDOS coincide con el número de cliente (CUST_NUM) de la tabla CLIENTES. dado que las bases de datos relacionales no contienen punteros u otros mecanismos para relacionar filas entre sí. LIMITE_CREDITO nom~ ésta restringe las filas que aparecen en los resultados.

Supóngase que se desea volver a ejecutar la consulta anterior mostrando sólo las oficinas con los mayores objetivos de ventas: Listar las oficinas con un objetivo superior a 600. SELECT CIUDAD. Aquí hay otra consulta que involucra las mismas dos tablas. OFICINAS WHERE OFICINA_REP = OFICINA NOMBRE CIUDAD REGION Listar las oficinas y los nombres y puestos de sus jefes. REGION FROM REPRESENTANTES. REPRESENTANTES WHERE JEF = NUM_EMPL ANO OBJETIVO> 600000. PUESTO FROM OFICINAS. PUESTO FROM OFICINAS.ant.00 CIUDAD Castellón León León NOMBRE Bernardo Sánchez Freire PUESTO Jefe Ventas Jefe Ventas Figura 7.tel Clavel 11 VP Ventas 52 12 Jefe Ventas Bernardo Sárlchel 33 OaJ:¡iel Ruidrobo 45 12 Representante NULL Representante TOIlIás sal 41 León freire 62 21 Jefe Vent. nombres. Tabla REPRESENTANTES NUMJ:MPL a 105 109 102 106 104 EDAD OFICINILREP PUESTO NOMBRE Bruno Arteaql 37 13 Representante María Jimémel 11 Representante 31 SUsana Santos 21 Representante 5a=. mientras que los nombres asociados (ciudades.e lD7 22 Represent. Esta relación se usa para hallar la fila correcta de REPRESENTANTES para cada representante. y especificar nombres más descriptivos en la cláusula SELECT para generar las columnas de los resultados. REPRESENTANTES WHERE JEF = NUM_EMPL CIUDAD Castellón Almeria Navarra Daimiel León NOMBRE Bernardo Sánchez Bruno Arteaga PUESTO VENTAS JEF VENTAS REP VP VENTAS VENTAS JEF VENTAS JEF María Jiménez Samuel Clavel Bernardo Sánchez Pablo Cruz Daniel Ruidrobo Bruno Arteaga Susana Santos León Freire Neus Azcárate Navarra Navarra Castellón Castellón Este Este Este Este SaI'luel Clavel León Freire León Freire Castellón Este Este Almeria León León Daimiel I Oeste Oeste Oeste La tabla OFICINAS (hijo) contiene JEF. Manual de referencia Capítulo 7: Consultas multitabla (reuniones) 141 Listar cada representante y la ciudad y la región en que trabajan. como se muestra en la Figura 7.4. de forma que se pueda incluir en los resultados el nombre y el puesto correc[Qs del jefe. - . de forma que se incluyan las ciudades y regiones correctas en los resultados. Esto es porque las claves primarias y externas son generalmente números identificadores (como los números de oficina y de empleados en los ejemplos) que las personas consideran difíciles de recordar. regiones. SELECT NOMBRE. " / ( < Reuniones con criterios de selección de filas La condición de búsqueda que especifica las columnas coincidentes de una consulta multitabla se puede combinar con otras condiciones de búsqueda para restringir más los contenidos de los resultados. Es muy común que se usen números de identificación en la cláusula WHERE para reunir dos tablas. como en los dos ejemplos precedentes. lI.zcárat. Una consulta padre/hijo diferente con OFICINAS y REPRESENTANTES. SQL no requiere que las columnas coincidentes se incluyan en los resultados de una consulta multitabla. una clave externa para la tabla (padre) REPRESENTANTES. Esta relación se usa para encontrar la fila de OFICINAS correcta para cada representante.000 €. NOMBRE.e . pero con los papeles de padre e hijo invertidos.as lD3 ~o Crul 29 12 Represent. SELECT CIUDAD. NOMBRE.140 SOL.e .4. una clave externa de la tabla OFICINAS (padre). CIUDAD. A menudo se omiten en la práctica. puestos) son más fáciles de comprender.ant. La tabla REPRESENTANTES (hijo) contiene OFICINA_REP.

Aquí se muestra un ejemplo simple de una reunión de tres tablas: Encaje de múltiples columnas La tabla PED"IDOS y la tabla PRODUCTOS de la base de datos de ejemplo están relacionadas por una pareja de claves externa y primaria. Una reunión de tres tablas.00€ 6 1. se deben especificar ambas parejas de columnas coincidentes.Ill'I[l>. SELECT NUM_PEDIDO. encajando sus columnas ID_FAS e ID_PRODUCTO.745. respectivamente.OO€ 45 .OO€ 105 SO.000 €..00€ 3.OO€ I ! Figura 7. cable Serie 4. pero las reuniones generalmente reflejan las relaciones del mundo real entre entidades representadas en las tablas de las bases de datos.OOO. El primer test (JEF = NUM~EMPL) selecciona sólo parejas de filas de OFICINAS y REPRESENTANTES que tienen la relación padre/hijo adecuada..5..00€ Serie 2.OO€ NUM RMPL NOMBRE EDAD OFICINJ\. ~~~ ~~s REP eLI LIMITE CREDlTO 103 SO. IMPORTE.------------------.REP Bruno Arteaga 31 13 Maria Jinlénez 31 48 11 21 susana santos i¡ La condición de búsqueda en la consulta dice a SQL que las parejas de filas relacionadas de las tablas PEDIDOS y PRODUCTOS son aquellas en las que ambas parejas de columnas coincidentes contienen los mismos valores.000. La columna REP es una clave externa de la tabla REPRESENTANTES. cable Serie 3.s a 25.104. como se muestra en la Figura 7. REPRESENTANTES CLIENTE ~ NUM_CLI REP = NUM~EMPL IMPORTE> 25000.00€ 3.745. SELECT FROM WHERE AND AND NUM- NUM_PEDIDO... 1. Tabla CLIENTES NillLCLI EMPRESA Tabla REPRESENtANTES <. cable Zapata grande Zapata grande IMPORTE DESCRIPCION Esta consulta usa dos claves externas de la tabla PEDIDOS.00€ 31 . . Para reunir las tablas en términos de la relación padre/hijo. I ~ ! 113027 112992 113012 112968 112963 112983 113055 113057 ---------.00€ 150. incluyendo el nombre del representante que tomó nota del pedido y el nombre del cliente. No hay ninguna restricción de SQL sobre el número de columnas involucradas en la condición de encaje. CLIENTES. NOMBRE PEDIDOS. Planteando de manera informal.2. I : I 2A4.OO€ 35 3.. PRODUCTOS WHERE FAS ~ ID_FAS AND PRODUCTO ~ ID_PRODUCTO NUM_PEDIDO -------~--- 1 I I .00€ 3.350.5.D IMPORTE NUI\_PEDlOO CAN'J'IDA!l EMPRESA 00l!ERE 112961 17/12/1989 113012 11/0111990 112989 03/01/1990 l'.00€ EMPRESA Acme Chen Asociados Zeta Producciones J. Las reuniones mul· ticolumna que involucran dos tablas son menos comunes que las reuniones de una única columna y se encuentran generalmente en consultas que involucran claves externas compuestas como ésta. '\ Resultados de la consl. .276. Consultas con tres y más tablas SQL puede combinar datos de tres o más tablas usando las mismas técnicas básicas de las consultas de dos tablas.500.458.¡u. mostrando la cantidad y descripción de cada producto. Sotoca NOMBRE PEDIDO 112987 113069 113045 112961 ----------.142 SOL. y estas relaciones se encuentran usualmente en una o sólo unas pocas columnas de las tablas. JCP s .00€ 600. cable Serie 4.QO€ 31 .. que enlaza cada pedido con el representante que lo anotó. el segundo test selecciona sólo las parejas de filas en las que la oficina está por encima del objetivo. como se muestra en este ejemplo: Listar los pedidos superiore.00€ 702. DESCRIPCION PROM PEDIDOS..OOO.Ilta CLIDm REP F PROOOCTO CJ.----------.--------------4.00€ 760.00 IMPORTE 27 . La columna CUST es una clave externa de la tabla CLIENTES.4L 41003 114 7 21. la consulta enlaza cada pedido con su cliente y representante asociados.OO€ 101 6S..P. que enlaza cada pedido con el cliente que lo encargó. las filas que aparecen en los resultados de la consulta se restringen más. cable Serie 4.OOO.500.500. Las columnas FAB y PRODUCTO de la tabla PEDIDOS forman juntas una clave externa de la tabla PRODUCTOS.978. EMPRESA. cable Serie.-------------Bruno Arteaga Neus Azcárate León Freire Samuel Clavel Listar todos los pedidos. Manual de referencia Capítulo 7: Consultas muJtitabla (reuniones) 143 Con la condición de búsqueda adicional. IMPORTE.JI' I .

-------------3.500.o OPICIWL.00€ 12-QCT-89 12-OCT-89 12-0CT-89 12-0CT-89 12-0CT-89· Maria Jiménez María· Jiménez León Freire .= ~ FEOlA..OO€ 31.00€ .74S. no es difícil enconlrar una consulta de cuatro tablas con sentido: Listar Los pedidos superiores a 25. -----------------. SELECT NUM_PEDIDO. EMPRESA.OO€ 6S. siempre que tengan tipos de datos comparables.'lTII»J) IMPORTE 112'61 11/12/1989 113012 11/01/1990 112'89 03/01/U'0 I~ '" '" U <05 2101 ~ .S00.00 IMPORTE EMPRESA 27. esta consulta enlaza cada pedido con su cliente.sa. FROM PEDIDOS.. OFICINAS CLIENTE ~ NUM_CLI REP_CLI ~ NUM_EMPL OFICINA_REP ~ OFICINA IMPORTE> 25000. IMPORTE.Clavel Caste1l6n León Navarra La Figura 7.OO€ J.OO€ IMPORTE EMPRESA ~--~-------------- NOMBRE -------------Bruno Arteaga Pablo Cruz León Freire Acme 31. enlazando un pedido con su cliente. REPRESENTANTES WHERE FECHA_PEDIDO ~ FECHA~CONTRATO NUM_PEDIDO· IMPORTE FECHA_PEDIDO NOMBRE T'b"'m~~ ""." " ~ ~ -. Cualquier par de columnas de dos tablas pueden servir como columnas coincidentes.978. de cinco tablas. T.000 €.-00€ 15.OO€ Zeta Producciones 31..------------.b""~'oo'~ NUlLPEDIDO ~ Filas ~ ..P. FECHA_PEDIDO. La primera relación usa de nuevo la columna eLI de la tabla PEDIDOS como una clave externa de la tabla CLIENTES.00€ Chen Asociados 45. Incluso en los confines de la pequeña base de datos de ejemplo.000. pero SQL no requiere que las columnas coincidentes se relacionen como clave primaria y externa.S00.OO€ Zeta Producciones 3l.OO€ 2. IMPORTE. Una reunión de tres tablas con relaciones padre/hijo en cascada. Sotoca samuel Clavel NUM_PEDIDO 112987 113069 113045 112961 ----------. lL •I '-- .00 NUM_PEDIDO ----------- I JI ~ 11 112987 113069 113045 112961 ----------27. Planteando de manera informal.000.OOE "aSUlIaDOS ae III COfl$una ~. REPRESENTANTES.000.978. el representante del cliente y la oficina en la que trabaja el representante. REPRESENTANTES CLIENTE = NUM_eL! REP_eL! = NUM_EMPL No es extraño encontrar consultas de tres o ·incluso cuatro tablas en aplicaCiones SQL de producción.6. mostrando el nombre del cliente que lo encargó y el nombre del represelllanle asignado al cliente.-m 210~ "" León pre:ire Pablo Cru:l .350.----------.4 7 31..P.00€ 3. Hallar lodos los pedidos recibidos en fechas en las que se haya contratado algún lluevo representante.000... I aOla REPRESENTMITES ""'_D'.1' : León Fre i re León.QO€ J.REP Otras equirreuniones La gran mayoría de consultas multitabla se basan en relaciones padre/hijo. CLIENTES. IMPORTE. CLIENTES. y cada cliente con su representante. ----------. el cliente con su representante y el representante con su oficina.350.OOO. SELECT FROM WHERE AND ANO ANO NUM_PEDIDO..PlXlt CA. NOMBRE.-------------. CIUDAD PEDIDOS. La segunda usa la columna REP_CLI de la tabla CLIENTES como clave externa de la tabla REPRESENTANTES. EMPRESA. Sotoca NOMBRE CIUDAD AND IMPORTE> 25000..500.100. El siguiente ejemplo muestra una consulta que usa un· par de fechas como ~?~umnas coincidentes.S00. Se extiende la secuencia de reunión del ejemplo anterior un paso más.00€ ---i 1.00€ 3S 3.100.6 muestra las relaciones de esta consulta.OO€ Chen Asociados 45.OOO.OO€ 2. SELECT FROM WHERE AND HUM_PEDIDO.000 t: mostrado el nombre del cliente que lo encargó.144 SOL.---------Acrne Bruno Arteaga Almeria Pablo Cruz León Freire Samuel..7 muestra las relaciones padre/hijo de esta consulta.000.OO€ 12-0CT-89 Maria Jiménez 112968 112979 112975 112968 112979 112975 15.----------- La Figura 7. ~ JCP s . Neu$ A:lc!rate " " " m " LoIMI"fE_CRrolro " u EMPRU.05 SO. Manual de referencia Capftulo 7: Consultas multitabla (reuniones) 145 Aquí hay otra consulta de tres tablas que usa una organización diferente de relaciones padre/hijo: Listar los pedidos superiores a 25. NOMBRE PEDIDOS.OO€ SO.Freire NOMBRE i I i Figura 7.

OO€ 50. Los tres tipos de reunión se escriben de la misma forma -incluyendo un test de comparación entre los pares de columnas coincidentes en la cláusula WHERE.oae fiS. SQL reúne de todas formas y sin problemas las tablas.1111990 2118 2102 2107 24~90 2110/198" 2210111990 ¡---- h. nótese que tres pedidos Reuniones sin igualdad El término reunión se aplica a cualquier consulta que combine datos de dos tablas comparando los valores de un par de columnas de las tablas. " 29 n ~ 12 ~ '" '" '" '" '" no '" '" '" '" Bruno Art. IMPORTE: 113012 11/01/1990 112989 . Columnas coincidentes como las del ejemplo generan una relación varios a varios entre las dos tablas."".L1988 2/101198 10/1211986 . es útil pensar en las reuniones de esta manera para comprender cómo traducir una consulta en lenguaje natural a la instrucción SELECT correcta.na sant. Nótese que estas tres situaciones diferentes son independientes de cómo se escriba la instrucción SELECT que expresa la reunión. No obstante.OOO. Aunque las reuniones .. y se contrataron dos representantes (León Freire y Maóa Jiménez) el mismo día." oeste Este Este ~ "..-do Sánche o. " n :22 Daimiel N8varr¡l """'" .A. y más de un representante puede haber sido contratado en la fecha en que se haya realizado un determinado pedido.000..niel Ruidrobo TOIlIás 5<>..os 5aa1el Cl.J90 12110/198 30/1. La situación se puede resumir corno sigue: • Las reuniones que encajan las claves primarias con las externas siempre producen relaciones padrelhijo uno a varios.. ~'" '" ".. " i Una reunión de cuatro tablas...00€ 1.e 12/02. ~ Una reunión sin claves primaria y externa.8. Sin embargo..~~.-ia Jillléne" Sus. Los resultados de esta consulta vienen de pares de filas de las tablas PEDIDOS y REPRESENTANTES en las que FECHA_PEDIDO coincide con FECHA_CONTRATO con el representante....?" m 10L!!2lJ. 2124 2114 2103 113055 04Lllll989 121101198 15/1.1/1990 2118 2111 2108 ( Figura 7.-PEDlOO CU~ l' l' l' Tebla REPReSEN'I'Am'ES WUM DlPL ~ Tabla REPRESENTANTES tl\nLEMPL NOKBRE ~ OPIClNAJtEP ~ O 1 Pllblo cru~ ~u.oae 3. 21 3 I " " lOS ~~~ SO.112975 Y 112979) se realizaron el 12 de octubre de 1989. Ninguna de estas columnas es una clave externa o primaria.8. Varios pedidos pueden compartir la fecha de contrato de un representante.745. la reunión de columnas coincidentes arbitrarias generan relacio· nes varios a varios.:: 14/06/1988 19/0511987 ~"""""'" 113051 I ~~~~?~198: ~ 0~.. Por ejemplo. Los tres pedidos y los dos representantes producen seis filas de resultados.eaqa M<l.OO€ r---t I Figura 7. '" '" '" Nl/tLPEDIOO FECHA..ooe I .~:87'''' U/11/1988 R< ~ n ." León f"reire Pelo Cruz Ne»s "'"cArat. • Otras reuniones también pueden generar relaciones uno a varios si la columna coincidente en al menos una de las tablas tiene valores únicos en todas las filas de la tabla. ~~ io ~.458. ~'~"~. Esta relación varios a varios es diferente de la relación uno a varios creada con las columnas coincidentes de la clave primaria y externa.7. Manual de referencia Capítulo 7: Consultas multitabla (reuniones) 147 Tabla OFICINAS OFICINA Tabla PEDIOOS q¡ .i.146 SOL.. y la relación entre pares de filas es extraña -10 único que inevitablemente hay en común entre los pedidos y los representantes es que han ocurrido en la misma fecha. .. como se muestra en la Figura 7.1:. JCP S.ooo.vel Berna. h.' 112961 17/12/1989 Resultados de la consulta CLlEIlfE diferentes (112968. A"c'rat. • En general.03/01/1990 3losaD.

Nombres calificados de columnas SELECT NOMBRE. Sin embargo. -------- ------------ OBJETIVO 350. '. Nótese .I'. SELECT CIUDAD.000. VENTAS FROM REPRESENTANTES WHERE VENTAS> 350000... Sin embargo. ~. Normalmente no hay confusión entre las dos columnas porque la cláusula FROM determina la que es apropiada en cualquier consulta dada. .QO€ Daimiel 350~OOO.. el Aunque la descripción en inglés de la consulta implica que se desea la colum- na VENTAS de la tabla REPRESENTANTES. Recuérdese del Capítulo 5 que un nombre calificado de columna especifica el nombre de una columna y la tabla que contiene la columna. por ejemplo.1. CUOTA.:yconsultas multitabla n' 1:. :algunas consultas multitabla no se pueden expresar sin las características adicionales del lenguaje SQL descritas en las siguientes secciones. no se requiere específicamente que la fila de REPRESENTANTES represente a al- Mostrar todos los represemantes con ventas superiores a 350..OO€ 300. El ejemplo es un poco rebuscado· e ilustra por qué las 'reuniones ti'asadas en relaciones que sean las de igualdad ·no son :muy ·comunes. ya que ambas aportan datos a los resultados de la consulta. -'pecia): para -las consultas multitabla: .:' ~. - .OO€ Daimiel 300.. OFICINA~ WHERE CUOTA > OBJETIVO NOMBRE CUOTA CIUDAD Bruno Arteaga Susana Santos León Freire -------------. SQL también permite reunir tablas en términos de otros operadores de comparación.. Listar·lodas las combinaciones de representan/es y oficinas en las que la cuota de representantes es mayor que el dbjelivo de la oficina. pueden ser . ll"¡: . la de REPRESENTANTES contiene las ventas del año de cada representante.•. loO .veces'im consultas mul." titabla-para'eliminar referencias "ambiguas a ·columnas.útiles en aplicaciones para la ayuda a la 'toma de decisiones y otras aplicaciones que exploran relaciones más complejas en la base de datos..~' J.ciones.filas donde la columna CUOTA de la fila de REPRESENTANTES exc~e-la columna OBJETIVO de la.¡: . Manual de referencia Capftulo 7: Consultas multitabla (reuniones) 149 II "\ ~\ basadas en la igualdad "entre columnas coincidentes (equirreuniones) son con mucho las más comunes. . OFICINAS WHERE OFICINA_REP = OFICINA Error: ·VENTAS· es un nombre ambiguo de columna Considera. cada fila . El SGBD no tiene forma de saber si se desea la columna VENTAS de la tabla REPRESENTANTES o la de OFICINAS. en este caso de las tablas REPRESENTANTES y OFICINAS..000. Das selecciones de todas las·columnas (SELECT "')tienen un significado es" J. aquí hay una consulta en la que los nombres duplicados causan un problema: '" . Mostrar el nombre...' Sin embargo. Aquí hay un ejemplo en que se usa un test de comparación «mayor -q"ue» (» como base de una reunión: • Las autorreuniones se pueden usar para crear una consulta multitabla que relacione una tabla consigo misma..OO€ La base de datos de ejemplo incluye varios casos en los que dos tablas contienen columnas del mismo nombre. ventas y oficina de cada representante.. SELECT NOMBRE.que los pares de filas de REPRESENTANTES y OFICINAS seleccionadas se relacionan s6lo de esta forma. CIUDAD FROM REPRESENTANTES. • Los alias de tabla se pueden usar en la cláusula FROM para simplificar los nombres calificados de columna y permitir referencias no ambiguas a columnas en las autorreuniones.000. Como en todas las consultas de dos. SELECT NOMBRE..fila de OFICINAS.de los resultados viene de un par de filas. '. Las rabIas OFICINAS y REPRESENTANTES.00Q.-----------. VENTAS. La con· dición de búsqueda: ·CUOTA_ > OBJETIVO Mostrar las ciudades en las que las ventas superan los objetivos...OO€ Daimiel 350.sobre SQ/.148 SOL. tablas. VENTAS FROM OFICINAS WHERE VENTAS > OBJETIVO r 1 selecciona un par de ... La columna de la tabla OFICINAS contiene las ventas del año para cada oficina. Para eliminar esta ambigüedad se debe usar un nombre calificado de columna para identificar la columna.. OBJETIVO FROM REPRESENTANTES. En concreto: • Los nombres calificados de columna se necesitan '3 '..00 guien"·que·trabaje·en la'óficinaTepresentada en la fila de OFICINAS.000.'_ .OO€ 300. como en estos ejemplos: l' l.. tienen una columna denominada VENTAS. CIUDAD."" Las'corisultas-múltitabla 'descntas"ha'sta ¡momento no him requerido ninguna sintaxis·especüil' de SQ~'o"caractefísticas"del· lenguaje más allá 'de'las descritas para lasJeonsultas 'a 'Una única tabla.000 €. la consulta SQL es ambigua..

con una coincidencia entre clave primaria y externa. En estos dialectos el asterisco se puede calificar con un nombre de tabla. ventas y oficina de cada representante. NOMBRE FROM REPRESENTANTES. OFICINAS WHERE OFICINA_REP = OFICINA NOMBRE CIUDAD Lisiar lada /a información de los representantes y los lugares en que trabajan. Por ejemplo. coincidir con alguna de las tablas especificada en la lista FROM.OO€ 142.0S0. OFICINAS WHERE OFICINA_REP = OFICINA REGION II ~: REPRESENTANTES.042. tres o más tablas en la cláusula FROM. Manual de referencia VENTAS Capítulo 7: Consultas multitabla (reuniones) 151 Los nombres calificados de las dos columnas plo son: OFICINAS. Selecciones de todas las columnas Como se estudió en el Capítulo 6. Podría parecer que la columna JEFE es una clave externa de la tabla que tiene los datos de los jefes.~. TANTES seguidas de OFICINAS.86S. De hecho lo es.912. NUM_EMPL i. sería como: SELECT NOMBRE.594. Si se intentase expresar esta consulta como cualquier consulta de dos tablas. es que hacen que el texto de la consulta sea mayor. SELECT * se puede usar para seleccionar todas las columnas de la tabla nombrada en la cláusula FROM. VENTAS . al igual que la referencia a columnas calificadas.OO€ 474. SELECT NOMBRE. Y la columna JEFE contiene el número de empleado del jefe del representante. es una clave externa de la misma tabla ~EPRESENTANTES. Se podría intentar eliminar la segunda referencia a la tabla REPRESENTANTES así: REPRESENTANTES Listar (oda la información de los representantes y las oficinas en las que trabajan.673.775. que usa un nombre de columna calificado: Obviamente. Un nombre calificado de columna se puede usar en cualquier lugar de una instrucción SELECT en la que se permita un nombre de columna. Este tipo Autorreuniones Muchas consultas multitabla involucran una relación que una tabla tiene consigo misma. L~ desventaja. pero es parte de la especificación SQL2 de ANSI/ISO. OFICINAS WHERE OFICINA_REP = OFICINA Y REPRESENTANTES. SELECT REPRESENTANTES. produciría quince columnas de resultados -las nueve columnas de la tabla REPRESENTANTES seguidas por las seis de la tabla OFICINAS: Esta instrucción SELECT es ilegal debido a la referencia duplicada a la tabla en la cláusula FROM. Muchos dialectos SQL tratan el asterisco como una clase especial de nombre de columna comodín que Se expande en una lista de columnas.00€ 30S. La tabla especificada en la columna calificada debe. La siguiente consulta. Aquí está la versión corregida de la consulta anterior.91l.OO€ 361.VENTAS CIUDAD 392. el asterisco selecciona todas las columnas de todas las tablas de la cláusula FROM. VENTAS.150 SOL. en la base de datos de ejem- SELECT FROM REPRESENTANTES. REPRESENTANTES.725. la forma SELECT * de una consulta llega a ser mucho menos práctica cuando hay dos.OO€ 299. * se expande en una lista que contiene sólo las columnas de la tabla REPRESENTANTES: Mostrar el nombre. el elemento de selección REPRESENTANTES.OO€ Navarra Navarra Castell6n Castellón Castel16n Almería León Le6n Daimiel ~~~~~-~:~~~:---Saffiuel Clavel Bernardo Sánchez Pablo Cruz Daniel Ruidrobo Bruno Arteaga Susana Santos León Freire Neus Azcárate La consulta produciría once columnas de resultados -las nueve de REPRESENlas otras dos columnas solicitadas explícitamente de la tabla de elemento de selección «todas las columnas calificadas» se soporta en muchos pero no en todos los SGBD basados en SQL. Al usar SQL interactivo se puede desear en primer lugar una consulta sin nombres calificados y dejar que SQL encuentre las columnas ambiguas. FROM REPRESENTANTES. En la siguiente consulta. FROM REPRESENTANTES.00€ 186. REPRESENTANTES WHERE JEFE . por supuesto. VENTAS . CIUDAD. NOMBRE FROM ~EPRESENTANTES WHERE JEFE = NUM_EMPL . En una consulta multitabla. supóngase que se desea listar los nombres de todos los representantes y sus jefes. Cada representante aparece como una fila en la tabla REPRESENTANTES. por supuesto.OO€ 367. No se permitió en el estándar SQLl. SELECT NOMBRE.00€ 286. i I El uso de nombres calificados de columna en las consultas muJtitabJa es siempre conveniente. Si SQL informa de un error se puede editar la consulta para calificar las columnas ambiguas. por ejemplo.

NUM_EMPL REPRESENTANTES. como se muestra en la Figura 7. Es una consulta sobre una sola tabla. y la siguiente consulta funcionaría: Dado que las columnas de las dos tablas tienen nombres idénticos.o> 'AN'rES) ''-VI-'''' U" "<'''''<'''''''''''''-'''0>' NOMBRE Tomás Saz Bruno Arteaga Daniel Ruidrobo Pablo Cruz María Jirnénez Bernardo Sánchez León Freire Susana Santos Neus Azcárate OFICONA.CUOTA 1 .gll. María Jiméne'l: Susana Santos Samuel Clavel Bernardo Sánche aniel Ruidrobo s Saz Freb::e cruz zcárllte n " '" " " B n n n " " '" '" H " " n """ " " La cláusula FROM asigna un alias diferente a cada una de las dos «copias» de la tabla REPRESENTANTES involucrada en la consulta. I 1.JEFE = JEFES. y otra denominada JEFES. que contiene empleados. el alias se debe usar para identificar la tabla en las referencias calificadas a columna. esto parecería una consulta ordinaria sobre dos tablas. pero no hace 10 que se quiere.NOMBRE FROM EMPS. ~ I Figura 7. NOMBRE.NUM EMPL EMPS. una denominada EMPS. No hay tales filas. Como muestra el .r<. La columna JEFE de la tabla EMPS sería una clave externa de la tabla JEFES. En lugar de duplicar realmente los contenidos de una tabla. SQL usa exactamente esta «tabla imaginaria duplicada» para reunir una tabla consigo misma.NOMBRE FROM REPRESENTANTES EMPS. JEFES. SELECT FROM WHERE AND REPRESENTANTES . así que SQL toma fila a fila las filas de la tabla REPRESENTANTES aplicando la condición de búsqueda: JEFE == NUM_EMPL I i' Las filas que satisfacen esta condición son aquéllas en las que las dos colum- nas tienen el mismo valor -es decir.NOMBRE Listar los nombres de los representantes y sus jefes. Se podría haber escrito tan fácilmente como: SELECT REPRESENTANTES. A continuación se muestran algunos ejemplos adicionales de autorreuniones: 11: . SELECT EMPS. Listar los representantes con una cuota superior a la de su jefe. JEFES. REPRESENTANTES. JEFES WHERE EMPS. I -~ i~ Aquí el alias JEFE se asigna a una «copia» de la tabla.152 11 SOL. que contiene jefes.NOMBRE FROM REPRESENTANTES.JEFE = JEFES. lit l I1 i - . En caso contrario.CUOTA. realmente sólo es necesario usar un alias para una de las dos apariciones de las dos tablas en esta consulta. REPRESENTANTES JEFES REPRESENTANTES.-REP Daniel Ruidrobo Bernardo Sánchez Bernardo Sánchez Bernardo Sánchez Samuel Clavel Samuel Clavel Sarnuel Clavel León Freire León Freire NmCEMPL EDAD I !II 1 '" '" '"' '1 Bruno Artell. A continuación está la misma consulta escrita usando los alias para EMPS y JEFES para la tabla REPRESENTANTES: Listar los nombres de los empleados y sus jefes.NOMBRE JEFES.CUOTA JEFES. denominado alias de tabla.NQM_EMPL Tabl '"U''' uc. REPRESENTANTES. mientras que el propio nombre de la tabla se usa para la otra copia. Para comprender cómo resuelve SQL este problema hay que imaginar dos co· pias idénticas de la tabla REPRESENTANTES. cuando una cláusula FROM contiene un alias de tabla.9. especificando el nombre de alias inmediatamente después del nombre real de la tabla.NUM_EMPL l· I '11I 1 "..ejemplo. las filas en que un representante es su propio jefe. . JEFES.9. SELECT EMPS.JEFE = JEFES. todas las referencias a columna están calificadas. Una autorreunión de la tabla REPRESENTANTES. así que la consulta no produce ningún resultado-o No son exactamente los datos que se deseaban recibir según la consulta requerida. Manual de referencia Capitulo 7: Consultas muJtitabla (reuniones) 153 l' l. NOMBRE. CUOTA > JEFES.NOMBRE. REPRESENTANTES JEFES WHERE EMPS. SQL permite simplemente hacer referencia a ella con un nombre diferente. Esta consulta es legal. REPRESENTANTES JEFES WHERE REPRESENTANTES.JEFE = JEFES.NOMBRE. Por supuesto.

y es más descriptivo en cuanto a la función que realiza un alias de tabla.000. CUOTA Capítulo 7: Consultas multitabla (reuniones) 155 REPRESENTANTES. QFICINA_JEF.NOMBRE OFICINA_EMP.CUMPLEA&OS C WHERE R.CaE: 275. El diagrama sintáctico de la cláusula FROM. mostrando el nombre y oficina en donde trabaja cada uno. Cualquier columna referenciada en la instrucción SELECT debe venir de una de las tablas listadas en la cláusula PROM. no está incluido en todas las implementaciones de SQL. Por ejemplo.OOO.OO€ Listar los representantes que trabajan en una oficina distinta a la de su jefe. tal y como aparece en la cláusula PROM. La especificación SQL2 permite opcionalmente que la palabra clave AS aparezca entre el nombre de la tabla y su alias. es más fácil de leer y escribir si se usan los alias R y e para las dos tablas: Rendimiento de las consultas multitabla Al aumentar el número de tablas de una consulta. NOMBRE Bruno Arteaga ---------------------.000.10 muestra la forma básica de la cláusula FROM para una instrucción SELECT sobre varias tablas. el nombre de la tabla.NOMBRE. si una consulta se refiere a una tabla de otro usuario.CUMPLEAaOS.OFICINA_REP <> JEFES. o si el nombre de la tabla es muy largo.000. CUOTA. OFICINAS OFICINA_JEF WHERE EMPS.bla.NOHBRE = S. La Figura 7.--------------------. Algunos productos SQL limitan de hecho el número de tablas.CIUDAD JEFES.000.OOO. OFICINA_EMP.OFICINA_REP Figura 7.QFICINA_REP = QFICINA_EMP.CIUDAD.JEFE = JEFES.NOMBRE Bernardo Sánchez Bruno Arteaga León Freire Neus Azcárate Castellón Almería León Daimiel Samuel Clavel Bernardo Sánchez Samuel Clavel León Freire PROM identifica ladas las labias que aportan datos a los resultados de la consulta. SAM. (Hay una excepción para las referencias externas de las subconsultas.OFICINA AND JEFES. Alias de tablas Como se ha descrito en la sección anterior. completada con alias de tabla. JEFES.10. NOMBRE . se convierte en la etiqueta de tll. Esta consulta. los alias de tablas se requieren en las consultas con autorreuniones. Manual de referencia REPRESENTANTES CUOTA JEFES. Sin embargo. (Nótese que la especificación SQL2 usa el término nombre de correlaci6n para referirse a lo que hemos llamado alias de tabla. en caso contrario. SELECT EMPS.000.OO€ 200. El estándar SQL2 especifica una técnica similar para designar nombres de columna alternativos.BIRTH_DATE FROM REPRESENTANTES R. " : I I ti El único requisito para las etiquetas de tabla en la cláusula FROM es que todas las etiquetas de una cláusula FROM sean distintas entre sí. las cuotas y cumpleaños de los representantes.BIRTH_DATE FROM REPRESENTANTES. OFICINAS OFICINA~EMP. El propio lenguaje SQL no impone ningún límite en el número de tablas reunidas en una consulta.CIUDAD FROM REPRESENTANTES EMPS.-----------350. SELECT REPRESENTANTES.00€ 275.NOMBRE '1. CUOTA.CUMPLEA~OS. La cláusula tiene dos funciones importantes: • La cláusula OFICINA_JEF.OFICINA AND EMPS. Aunque esto hace que la cláusula FROM sea más fácil de leer. se puede usar un alias en cualquier consulta. el nombre de la tabla puede llegar a ser tedioso de escribir como un calificador de columna. CIUDAD Navarra Castellón Navarra León EMPS.NOMBRE I \ . Si se especifica un alias de tabla.OFICINA_REP = OFICINA_JEF. y en esa situación el nombre alias de columna se denomina realmente alias en el estándar).) • La cláusula FROM especifica la etiqueta que se usa para identificar la tabla en las referencias calificadas a columnas dentro de la instrucción SELECT. NOMBRE.OO€ 20D.000.OOe: 3ea. NOMBRE = SAM.OO€ Daniel Ruidrobo Pablo Cruz María Jiménez León Freire 3ea. como se describe en el Capítulo 9. las cuotas y cumpleaños de los representantes. La función y el significado de un nombre de correlación son exactamente como se describen aquí. SAM. SELECT R.OO€ 200.000. NOMBRE. REPRESENTANTES JEFES. es el que se convierte en la ~tiqueta. muchos productos SQL usan el término alias. que hace referencia a la tabla CUMPLEAÑOS y pertenece al usuario SAM: Lisrar los nombres.OOO.154 SOL. CUMPLEARos WHERE REPRESENTANTES.00€ 275.NOM_EMPL AND EMPS. C. la cantidad de esfuerzo requerido para manejarlas se incrementa rápidamente.caE: 350. un límite cercan? a ocho es algo muy Listar los nombres.

Habría 50 filas de resultados (5 oficinas * 10 representantes = 50 combinaciones). Por esta razón es importante definir con más cuidado y más formalmente lo que es una reunión. Las columnas de la tabla producto son todas las columnas de la primera tabla seguidas de todas las columnas de la segunda tabla. mostrando todos los posibles pares de representantes y ciudades. sin la cláusula WHERE que compara las columnas coincidentes. Sin embargo. NOMBRE CIUDAD Jaime Samuel Daimiel Castellón Figura 7. obtendría el produclO de las tablas REPRESENTANTES y OFICINAS. • El usuario introduce el nombre de un representante y el programa lista los pedidos en curso para ese representante (una consulta a dos tablas). En las aplicaciones de procesamiento interactivo de transacciones (OLTP. El producto de dos tablas. o examinar una instrucción SELECT y determinar lo que hace. y. Multiplicación de tablas Una reunión es un. El producto de dos tablas es otra tabla (la tabla producto) que consiste en todos los posibles pares de filas de las dos tablas. de forma que una consulta que requiera varios minutos o incluso varias horas es perfectamente aceptable. Tabla CHICAS NOMBRE CIUDAD Caste116n Barcelona Castellón Beatri María Susana La estructura de una reunión Tabla CHICOS I Para las reuniones simples es muy fácil escribir la instrucción SELECT correcta. los resultados que produce mediante una instrucción SELECT dada. La Figura 7. Ili :1/ I En cambio. clientes y los representantes que los gestionan (una consulta a cuatro tablas). esta consulta: Mostrar todas las combinaciones posibles de representantes y ciudades. productos. OFICINAS . como en: Mostrar todos los representantes y las ciudades en que trabajan. CIUDAD PROM REPRESENTANTES.11. cuando se reúnen varias tablas o cuando las condiciones de búsqueda son complejas. En estas aplicaciones el tiempo de respuesta es crítico -el usuario introduce normalmente uno o dos datos y necesita una respuesta de la base de datos en un segundo o dos-o Algunas consultas OLTP típicas en la base de datos de ejemplo serían: • El usuario introduce el número de cliente en un formulario y el SOBD devuelve el límite de crédito del cliente. en menor medida.11 muestra dos pequeñas tablas de ejemplo y su producto. Nótese que la instrucción SELECT es exactamente la misma que se usaría en la reunión de dos tablas. conocida como producto cartesiano (o simplemente el producto) de dos tablas. la teoría acerca de las bases de datos relacionales sobre las reuniones. A continuación se relacionan algunas consultas típicas para la ayuda a la toma de decisiones para la base de datos de ejemplo: • El usuario introduce el nombre de una oficina y el programa lista los 25 pedidos mayores correspondientes a los representantes de esa oficina (una consulta a tres tablas). llega a ser muy difícil observar simplemente una instrucción SELECT y determinar lo que significa.156 SOL. Si se especifica una consulta de dos tablas sin una cláusula WHERE. • Un informe resume las ventas por el tipo de producto para cada representante. En estas aplicaciones los resultados de la consulta se usan a menudo para ayudar en la toma de decisiones costosas. caso especial de una combinación de datos más general de dos tablas. Online Transaction Processing) es común que una consulta contenga sólo una o dos tablas. El alto coste de procesamiento de consultas que reúnen muchas tablas impone un límite práctico aún menor en muchas aplicaciones. en las aplicaciones de ayuda a la toma de decisiones. • Un dependiente examina el número de producto de un paquete y obtiene el nombre y el precio del producto de la base de datos (una consulta a una sola tabla). basada en la solicitud formulada en lenguaje natural. Manual de referencia Capítulo 7: Consultas multitabla (reuniones) 157 común. mostrando los representantes y los productos que venden (una consulta a tres tablas). SELECT NOMBRE. SQL obtiene el producto de las dos tablas como resultado. • Un jefe considera la posibilidad de abrir una nueva oficina de ventas en Salamanca y ejecuta una consulta que analiza el impacto sobre los pedidos. ~ . es normal que una consulta conlleve muchas tablas diferentes y haga uso de complejas relaciones de la base de datos. Por ejemplo. el saldo de la cuenta y otros datos (una consulta a una sola tabla).

Para cada fila restante calcular el valor de cada elemento en la lista de selección para produci. Si hay una cláusula ORDER BY. Eliminar las filas duplicadas a menos que se especifique UNIQN ALL.samente las que no cumplen la condición de las columnas comcldentes en la leU~l?.SOO. el producto es esa tabla. considérese esta consulta: 2. Las filas .n a plantear las re~las para el procesamiento de consultas SQL. En cambio. Para ver cómo funclOna el procedimiento. La cláusula FROM genera todas las posibles combinaciones de filas de las tablas CLIENTES (21 filas) y PEDIDOS (30 filas).00€ Reuniones externas* La operación de reunión de SQL combina la información de dos tablas formando parejas de filas relacionadas de dos tablas. Si la instrucción es una UNION de instrucciones SELECT. usar el valor de la columna de la fila en curso. Listar el nombre de la empresa y rodos los pedidos del cliente número 2103. Si la instrucción es una UNION de instrucciones SELECT. ordenar los resultados corno se especifique. como se ilustra en estas consultas: Para generar los resultados de una instrucción SELECT: 1. descnta en la sigUIente sección. Por cada referencia a columna. aplicar los pasos 2 al 5 a cada una de las instrucciones para generar sus resultados individuales. Reglas para el procesamiento de consultas multitabla Los pasos que siguen al código de ejemplo . Si hay una cláusula WHERE. CLIENTES. NUM_PEDIDO y CANTIDAD) de cada fila restante de la tabla producto para generar cuatro filas de resultados detallados de la consulta. Si se especifica SELECT DISTINCT. el conjunto de resultados que debería producir. Si una de las filas de una tabla no tiene correspondencia en este proceso. 4.104. 3. y las expande para incluir consultas ~ultltabla.276. 6. pero el propósito de la definición previa no es describir cómo un SGBD resuelve la consulta. Capítulo 7: Consultas multitabla (reuniones) 159 SELECT NOMBRE. Una reunión entre dos tablas es simplemente el producLO d.eli~llinadas son ~recl. . constituye una definición de cómo determinar exactamente lo que «significa» una consulta multitabla -es decir.e las dos tablas con algunas de sus filas eliminadas.siguient~ vuel~e.OO€ 112963 112983 112987 113027 702. Si la cláusula FROM lista sólo una tabla.n. 3. 2. OFICINAS WHERE OFICINA_REP = OFICINA Estas dos consultas ilustran una relación importante entre las reuniones y los productos: 7. Los productos son importantes porque SO~ parte de ~a d.----------. Intro~ucldo ongInalmente en la ~lg~­ ra 6. las otras 626 filas se eliminan. eliminar todas las filas duplicadas del resultado que se hubieran producido. conservando las filas para las que la condiCión de busqueda es TRUE (y descartando a las que corresponda FALSE o NULL). ~as reglas definen ~I s. mezclar los resul· tados de las instrucciones individuales en una única tabla de resultados. SELECT FROM WHERE AND ORDER EMPRESA Acrne Acme Acme Acme EMPRESA.efimclOn ~ormal de como procesa SQL una consulta multitabla. PEDIDOS NUM_CLI = CLIENTE NUM eLI = 2103 BY NUM_PEDIDO NUM_PEDIDO IMPORTE Obviamente. La cláusula vlHERE selecciona sólo las filas de la tabla producto en las que los números de cliente coinciden (NUM_CLI = CLIENTE) Y el número de cliente sea el especificado (NUM_CLI = 2103). OFICINA_REP FROM REPRESENTANTES NOMBRE Bruno Arteaga María Jiménez OFICINA_REP 13 11 .158 SOL Manual de referencia 5. La cláusula SELECT extrae las tres columnas requeridas (EMPRESA. SELECT NOMBRE.lgmficado de cualquier instrucción SELECT multltabla especificando un procedl~11Iento que siempre genera el conjunto correcto de resultados. Siguiendo los pasos anteriores: l. Las filas generadas por este procedimiento contienen los resultados de la consulta. l' 4. Formar el producto de las tablas listadas en la cláusula FROM. CIUDAD FROM REPRESENTANTES. Las parejas de filas que conforman la tabla reunida son aquellas en las que las columnas coincidentes de cada una de las dos tablas tienen el mismo valor. produciendo una tabla producto de 630.OO€ 27 . LisIar los representames y las oficinas en las que trabajan. La cláusula ORDER BY ordena las cuatro filas de la columna NUM_PEDIDO para generar los resultados finales de la consulta.----------3.14. una única fila de resultados. NUM_PEDIDO.OO€ 4 . la reunión puede producir resultados inesperados. ningún SOBD basado en SQL resolvería la consulta de esta forma. IMPORTE -------. aplicar su condición de búsqueda ~ ~ada fila ~e la tabla producto. Sólo se seleccionan cuatro filas.

incluyendo los productos líderes de Microsoft. Basándonos en la versi6n de la consulta en lenguaje natural cabría esperar que la segunda consulta produjese resultados como los siguientes: ICIUDAD Oenia CastelIón Barcelona NULL CasteU6n . Para comprender bien la reunión externa es útil abandonar la base de datos de ejemplo y considerar las dos tablas simples de la Figura 7. OFICINAS WHERE OFICINA_REP -. probablemente cabría esperar que produjesen el mismo número de filas..valor NULL en la columna OFICINA_REP (que es la columna coincidente de la reunión). Oracle e Informix de 18M.160 SOL.. no incluye la reunión externa. «desaparece» de la reunión. y se ha implementado en muchos productos SQL de marcas diferentes a lBM. CIUDAD FROM REPRESENTANTES. Beatriz CIUDAD NULL . Sybase. Pero la primera consulta incluye una fila cada uno de los diez representantes. CIUDAD FROM REPRESENTANTES. La reunión externa también es la forma más natural de expresar un cierto tipo de consultas. La tabla CHICAS Daimiel Tabla CHICAS NOMBRE Ana Beatriz María Nuria SUS41111 Basándonos en las descripciones en lenguaje natural de estas dos consultas.s .CIIJIWI Barcelona Herminio Barcelona Barcelona José Barcelona Catellón CasteU6n samuel Castellón CalStellón Semuel Denia NULL NULL NULC NULC NULL NULL NULC Jailllt! Genaro Daimiel NULL Saz María Jiménez ~- Navarra Samuel Clavel Navarra Bernardo Sanchez Castellón Figura 7. OFICINAS WHERE DFICINA_REP = OFICINA NOMBRE María Jiménez Samuel Clavel Bernardo Sánchez Pablo Cruz CIUDAD Navarra Navarra Castellón Daniel Ruidrobo Bruno Arteaga Susana Santos León Freire Neus Azcárate Castel16n Castel16n Almeria León León Estos resullados se generan usando un tipo diferente de operación reunión. Anatomía de una reunión externa. denominada reunión externa (indicada con la notación «*=» en la cláusula WHERE). Como resultado. Este valor NULL no encaja con ninguno de los números de oficina de la tabla OFICINAS. --+ María AnA NULC HULL ClI1CAS. La reunión estándar SQL tiene así el potencial de perder información si las tablas que se reúnen contienen filas que no encajan. =: rabra CHICOS NOMBRE CIUDAD Denia Castellón Barcelona NULL An' Be4tri Haría Nuria Susana Castellón Files no coincidentes Tabla resultado de la reunión externa Listar los representantes y las ciudades en las que trabajan. Sin embargo. Los primeros produc· tos SQL de IBM sólo daban soporte a la reunión interna.12. NOKBRE: ~ SUS4nII.ICOS. SELECT NOMBRE.1lI»lBRE Ol. mientras que la segunda sólo produce nueve.ClUOMl Ol. como se muestra en el resto de esta sección. que se denomina a veces reunión interna. OFICINA NOMBRE Tomás Filas no coincidentes Q "'"'. ¿Por qué? Porque Tomás Saz no está actualmente asignado y tiene un . Manual de referencia 21 11 12 12 Capítulo 7: Consultas multitabla (reuniones) Pablo Cruz Daniel Ruidrobo Bruno Arteaga Susana Santos León Freire Neus Azcarate 161 Susana Santos Samuel Clavel Bernardo Sánchez Daniel Ruidrobo Tomás Saz León Freire Castellón Castellón Almería León León Pablo Cruz Neus Azcárate NULL 21 12 22 Daimiel Listar los representantes y las ciudades en las que trabajan.ICAS. - . la reunión externa es una parte bien asimilada y útil del modelo de bases de datos relacionales. La reunión externa es una extensión de la reunión estándar descrita anteriormente en este capítulo. SELECT NOMBRE. por lo que la fila de Tomás de la tabla REPRESENTANTES no encaja con ninguna. El estándar SQL I especifica sólo la reunión interna.{ Nuria Oflo.12.

De forma similar. Estas filas también se han rellenado con valores NULL haciéndolas corresponder con una fila imaginaria con valores NULL en las columnas de la tabla CHICOS. Otras dos filas.CIUDAD : CHICAS.. y que se incluyan también los que no coincidan. de Jaime y Genaro. Estas filas también se han rellenado con valores NULL haciéndolas corresponder con una fila imaginaria con valores NULL en las columnas de la tabla CHICAS.l'·'~ ·. Manual de referencia Capítulo 7: Consultas multitabla (reuniones) SELECT FROM CHICAS.------------Boston Boston Bosten Castel16n Castellón CHICAS. y añadiéndolas a los resultados. SELECT FROM CHICAS.CIUDAD CHICOS.CIUDAD 3. La reunión externa por la izquierda de dos tablas se produce siguiendo los pasos 1 y 2 de la lista numerada anterior.NOI1BRE CHICAS. La reunión externa por la izquierda incluye así copias rellenas con valores NULL de las filas que no encajan de la primera tabla (izquierda). Las últimas dos filas. pero omitiendo el paso 3. y esta reunión se muestra gráficamente en la Figura 7.. ].Boston María José María Susana Beatriz Ana Nuria NULL NULL Boston Castellón Castel16n Daimiel NULL NULL NULL Herminio Sarnuel Sarnuel NULL NULL Joime Genaro Boston Boston Caste1l6n Castellón NULL NULL DalIas NULL CHICAS. pero no incluyen las filas que no encajan de la segunda (derecha). .CIUDAD * . Ambas tablas se tratan de forma simétrica en la reunión externa completa.--------------------------. Para cada fila de la segunda tabla que no coincida con ninguna fila de la primera tabla. <':QL que produce la reunión externa: ClLtu . La siguiente lista muestra el procedimiento para la construcción de la reunión externa. añadir una fila a los resultados usando los valores de las columnas de la primera tabla y asumiendo un valor NULL para todas las columnas de la segunda tabla.162 SOL.12. CIUDAD José Herminio Samuel Samuel Boston Castel16n Castellón La reunión interna produce cuatro filas de resultados. Reuniones externas por la izquierda y por la derecha* Técnicamente. La tabla resullí. Nótese que dos de las chicas (Ana y Nuria) y dos de los chicos (Jaime y Genaro) no están representados en los resultados. CHICOS WHERE CHICAS.do cualquier chico o . Cada fila de la tabla CHICOS se representa en los resultados (a veces más de una vez).* CHICOS. vienen de filas que no encajan de la tabla CHICAS. Estas filas no se pueden emparejar con ninguna fila de la otra tabla y. de Ana y Nuria.sultados (de nuevo. la reunión externa es una reunión que «preserva información». Como muestra este ejemplo. 4. Las otras dos filas no coincidentes (Nuria y Genare) tienen valores NOLL en las columnas CIUDAD. Para cada fila de la primera tabla que no coincida con ninguna de la segunda.. SELECT FRDM CHICAS. añadir una fila al resultado usando los valores de las columnas de la segunda tabla y asumiendo un valor NULL para todas las columnas de la primera tabla. Para encontrar los pares de chicas y chicos que viven en la misma ciudad se podría usar esta consulta.-------------. Listar las chicas y chicos de la I/usma chica que no encaje. A continuación se muestra. la tabla CHICOS lista cinco chicos y sus ciudades de residencia. Empezar con la reunión interna de las dos tablas usando las columnas coincidentes de la forma usual.-------------. CHICOS. y añadiéndolas a los resultados. la reunión externa producida por la consulta anterior se denomina reunión externa completa de dos tablas. Hay otras dos reuniones externas bien definidas que no tratan de fonna simétrica a las dos tablas.rerna de dos tablas.CIUDAD -------------. no aparecen en los resultados de la reunión interna.CIUDAD 163 lista cinco chicas y las ciudades en las que viven. pero no coinciden con ninguna ciudad de la Olra tabla.CIUDAD *. vienen de filas que no encajan de la tabla CHICOS. CHICOS WHERE CHICAS. que forma la reunión ioter· na de las dos tablas: Listar las chicas y los chicos que viven en la misma ciudad. Dos de las filas sin correspondencia (Ana y Jaime) tienen valores válidos en las columnas CIUDAD.CIUDAD CHICOS CIUDAD CHICOS NOMBRE CHICOS. A continuación se muestra la reunión externa por la izquierda de las tablas CHICAS y CHICOS: Listar las chicas y chicos de la misma ciudad y cualquier chica que no encaje. por tamo. La reunión externa de las tablas CHICAS y CHICOS produce exactamente este resultado. Supóngase que se desea listar los pares chica/chico que viven en la misma ciudad. 2. en ocasiones más de una vez). y por las reglas del manejo de valores NULL en SQL. CHICOS WHERE CHICAS. . La reunión externa de dos tablas contiene ocho filas.NOMBRE María Maria Susana Beatriz -------------. cada fila de la tabla CHICAS se representa en los re. NOMBRE CHICOS.-------------. el valor NULL no encaja con ningún otro valor (ni siquiera con otro valor NULL). Cuatro de las filas son idénticas a las de la reunión interna de las dos tablas.

Tomás Saz es uno de tales representantes de la base de datos de ejemplo. las reuniones por la izquierda y por la derecha son más útiles que la reunión externa completa. Los papeles se invierten en una reunión externa por la derecha (la tabla derecha es la mayor.CIUDAD Boston Boston Castellón Castellón NULL NULL las tablas REPRESENTANTES y OFICINAS. Para ilustrarlo considérese de nuevo la base de datos de ejemplo. Manual de referencia CHICAS. De forma similar. SELECT NOMBRE. mostrando los pares chica/chico que coinciden con las chicas que no encajan. con la tabla REPRESENTANTES como la tabla mayor.OFICINA~REP NOMBRE Tomás Saz Maria Jiménez Samuel Clavel Bernardo Sánchez Pablo Cruz Daniel Ruidrobo CIUDAD NULL Navarra Navarra Castellón Castellón Castellón . y la derecha (la última que se menciona) es la menor. CIUDAD FROM REPRESENTANTES. y la izquierda. especialmente cuando se reúnen datos de dos tablas con. indica la oficina en la que trabaja cada empleado y si se permite que contenga un valor NULL para un nuevo representante que no haya sido aún asignado a una oficina. la reunión externa por la derecha de dos tablas se produce siguiendo el paso 1 y el 3 de la lista numerada anterior.NOMBRE CHICOS. de forma que la tabla se convierta en la tabla mayor en la reunión externa. Ya se ha visto un ejemplo con Nótese en este caso (una reunión externa por la izquierda) que la tabla «hijo» (REPRESENTANTES. la «menor» (la que contiene valores NULL en las columnas de los resultados de la consulta de reunión). SELECT NOMBRE. Corno se indicó antes. Esta vez no aparecen en el resultado las chicas que no encajan. mostrando los pares chica/chico que coinciden y los chicos que no encajan.CIUDAD ~. Los chicos que no encajan no aparecen en los resultados. OFICINAS WHERE OFICINA ~. CHICOS WHERE CHICAS. En una reunión externa.CIUDAD CHICAS. y la otra tabla. una relación padre/hijo (clave primaria/clave externa). pero no incluye las filas que no encajan de la primera tabla (izquierda). Cualquier reunión que use la relación REPRESENTANTES~a-OFICINASy espere incluir datos de Tomás Saz debe ser una reunión externa. NOMBRE José Herminio Samuel Samuel NULL NULL CHICOS.NOMBRE Maria Maria Susana Beatriz NULL NULL CHICAS. la tabla izquierda (la primera que se menciona) es la tabla mayor. La columna OFICINA_REP de la tabla REPRESENTANTES es una clave externa de la tabla OFICINAS.CIUDAD Bostan Bostan Castellón Castel16n NULL NULL Capítulo 7: Consultas multitabla (reuniones) 165 CHICAS. SELECT FRDM CHICAS. pero omitiendo el paso 2. A menudo es útil pensar que una de las tablas es la tabla «mayor» (todas sus filas se representan en el resultado). A continuación se muestra el ejemplo usado anteriormente: Listar los representantes y las ciudades en las que trabajan.CIUDAD Bostan Bostan Castellón Castel16n Daimiel NULL CHICOS.CIUDAD Boston Boston Castellón Castellón DalIas NULL -------------- Esta consulta también produce seis filas de resultados. La reunión externa por la derecha incluye copias con valores NULL de las filas que no encajan de la segunda tabla (derecha).-------------José Herminio Samuel Samuel Jaime Genaro CHICOS. A continuación se muestra una reunión externa por la derecha de las tablas CHICAS y CHICOS: Listar las chicas y chicos de la misma ciudad y los chicos que no encajan. y la tabla «padre» (OFICINAS) es la tabla menor. NOMBRE María Maria Susana Beatriz Ana Nuria La consulta produce seis filas de resultados. las reuniones externas por la izquierda y por la derecha no tratan de forma simétrica a las dos tablas. CIUDAD FROM REPRESENTANTES. la tabla con la clave externa) es la tabla mayor de la reunión externa. En la práctica. No importa si la consulta se expresa realmente como una reunión externa por la' izquierda (como se hizo previamente) o como una reunión externa por la derecha como ésta: Listar los representantes y las ciudades en las que trabajan. la menor). OFICINAS WHERE QFICINA_REP -: OFICINA NOMBRE Tomás Saz Maria Jiménez Samuel Clavel Bernardo Sánchez Pablo Cruz Daniel Ruidrobo Bruno Arteaga Susana Santos León Freire Neus Azcárate CIUDAD NULL Navarra Navarra Castell6n Castellón Castellón Almeria León León Daimiel -------------- -------------.164 SOL.CHICOS. El objetivo es retener las filas que contienen valores NULL de la clave externa (como los de Tomás Saz) de la tabla hijo en los resultados.

Grade también incluye la operación de reunión externa. Los roles de las dos tablas están exactamente invertidos con respecto al ejemplo anterior. TBLl y TBL2. una reunión externa por la izquierda de TBLl y TBL2 que use una comparación mayor igual (>=) produciría un test de comparación como éste: ° WHERE COL! *>= COL2 En este caso. pero. se podría querer incluir una fila representando a la oficina de Daganzo. Para mdlcar la reunión exte~na de dos tablas. Por ejemplo. como se indicó anteriormente. El test de comparación resultante de la reunión externa completa es: WHERE COLl ~=* COL2 . se emplea en Nótese que el signo de suma aparece en el lado opuesto de la comparación con respecto a la notación de SQL Server. se pone un astensco (*) antes y después del operador de reunión estándar. de comparación en la cláusula WHERE que define la condición de reunión. . También hay consultas de reunión útiles en las que el padre es la tabla mayor. la tabla padre (OFICINAS) es la tabla mayor de la reunión externa. Por supuesto. Manual de referencia Almería León León Daimiel Capítulo 7: Consultas multitabla (reuniones) 167 Bruno Arteaga Susana Santos León Freire Neus Azcárate Lo que importa es que la tabla hijo es la tabla mayor de la reunión externa. dando el siguiente test de comparación: WHERE COL! *= COL2 Listar las oficinas y los representantes que trabajan en cada una. esto no disminuye la utilidad práctica de las reuniones externas de Oracle l. supóngase que la empresa de la base de datos de ejemplo abre una nueva oficina de ventas en Daganzo. Grade no incluye la reunión externa·completa. la versión Oracle 9i incorpora la notación estándar ANSI/ISO SQL: 1999 para las reuniones eXlernas. La notación «*=*».: A diferencia de versiones anteriores.on cualquiera de los operadores de comparaClOn usando la mIsma notaclOn. pero inicialmente la oficina no tiene representantes asignados a ella. que estaba incluida en los resultados del ejemplo anterior (cuando la tabla REPRESENTANTES era la mayor). . incluyendo la reunión externa completa. REPRESENTANTES WHERE OFICINA ~= OFICINA_REP CIUDAD Navarra Navarra Castellón Castellón Castellón Almería León León Daimiel Daganzo NOMBRE María Jiménez Samuel Clavel Bernardo sánchez Pablo Cruz Daniel Ruidrobo Bruno Arteaga Susana Santos León Freire Neus Azcárate NULL . así que desempeña el papel de la tabla mayor. ~xterna c. ~e puede usar u. Esta notación inicia la reunión externa en la cláusula WHERE incluyendo un signo de suma entre paréntesis después de la columna cuya tabla tiene añadida lafila imaginaria NULL (es decir. sólo se espeCifica el segundo astensco. La reunión externa por la izquierda de TBLl y TBL2 produce la condición de búsqueda: WHERE COLl = COL2 {+) y la reunión externa por la derecha de queda: WHERE COLl (+) TBLl y TBL2 produce la condición de bús- = COL2 Notación de la reunión externa* Dado que la reunión externa no formó parte del estándar SQLl y no se implementó en los primeros productos SQL de 1BM. Aquí está la consulta de reunión externa que produce estos resultados: SQL Server.na reunión. y la tabla hijo es la menor. pero usa una notación dlfe~ente. Esta notación indica una reunión externa añadiendo un asterisco al ~est.166 SOL. El objetivo es asegurar que todas las filas de la tabla OFICINAS se representan en los resultados. sobre las columnas COLly COL2. Para indicar una re~nión externa por la derecha de TBLl y TBL2. usada en los ejemplos anteriores de esta sección. NOMBRE FROM OFICINAS. y la tabla hijo (REPRESENTANTES) es la menor. I N.Para indicar una reunión externa por la izquierda de TBLl y TBL2. dando el siguiente test de comparación: WHERE COL! =* COL2 II . sólo se espeCIfica el primer asterisco. Por ejemplo. Si se desea generar un informe que liste todas las oficinas y los nombres de los representames que trabajan en ellas. los fabricantes de SGBD que daban soporte a la reunión externa usaron varias notaciones en sus dialectos SQL. la fila de Tomás Saz. no se encuentra en este conjunto de resultados porque ahora REPRESENTANTES es la tabla menor. la tabla menor de la reunión externa). SELECT CIUDAD. del T.

Además. Aparecen otros problemas con la notación de la reunión externa cuando la reunión se extiende a tres o más tablas. el estándar SQL2 puede expresar incluso la más compleja de las reuniones. Es fácil extender la noción de una reunión externa a tres tablas: TBLl OUTER-JOIN TBL2 OUTER-JOIN TBL3 Éste es un conjunto de operaciones de la base de datos perfectamente legítimo de acuerdo con la teoría de bases de datos relacionales. Las ventajas del soporte extendido de las reuniones en SQL2 tienen el costo de una complejidad añadida con respecto a lo que había sido una de las partes más simples del lenguaje SQL.168 SOL. Manual de referencia Capítulo 7: Consultas muftitabla (reuniones) 169 Aunque ambas notaciones para las reuniones externas son relativamente convenientes. los productos de bases de datos existentes pueden soportar las extensiones de SQL2 a SQLl y mantener el soporte de su sintaxis propia para las reuniones externas sin conflictos. Los escritores del estándar SQL2 no podrían realmente haberla hecho ilegal sin «romper» todos los millones de consultas multitabla que se habían escrito hasta comienzos de la década de 1990. fue importante que el estándar SQL2 incluyese soporte para las reuniones externas. y se permiten usar en subconsultas. Sin embargo. los métodos usados para representar las reuniones externas variaron ampliamente entre los diferentes productos SQL. el soporte extendido de las reuniones es parte de una extensión mucho mayor de las capacidades de las consultas en SQL2. y no es claro cómo se debería usar la notación cuando hay dos o tres pares de columnas coincidentes. Reuniones internas en SOL2* La Figura 7.CIUDAD Reuniones y el estándar SOL2 Las reuniones externas plantearon un problema a los escritores del estándar SQL2. Además. CHICOS WHERE CHICAS. Pero con la notación de SQL Server o de Oracle. Primera.o se construyera. después de la discusión de las subconsultas básicas. La reunión interna estándar de las tablas CHICAS y CHICOS se pueden expresar en el lenguaje SQLl. intersección y diferencia de tablas) y expresiones de consulta mucho más ricas que manipulan filas y tablas. Para determinarlo. Sólo después de que la tabla product. las reuniones externas se incluyeron en muchos productos SQL comerciales y llegaron a ser·una parte muy importante del lenguaje SQL. comenzando con la reunión interna estándar y después avanzando a las·diferentes formas -de la reunión externa. La especificación SQL2 puso eL soporte de las reuniones externas en la cláusula FRüM con una sintaxis elaborada que permite que el usuario especifique exactamente cómo se deben reunir las tablas fuente. los resultados producidos por la reunión externa de tres o más tablas depende de los aspectos específicos de la implementación del SOBD. Segunda. La base de datos relacional de IBM 082. por ejemplo. el estándar SQL2 especificó un nuevo método para el soporte de las reuniones externas que no estaba basado en la notación establecida de un producto SQL popular en concreto. Pero el resultado depende del orden en que se realicen las operaciones de reunión externa. todos los métodos usados para denotar reuniones externas en productos comerciales tenían deficiencias y se eligieron fun- Ésta es todavía una instrucción aceptable en SQL2.CIUDAD : CHICOS. la cláusula FROM no indica al SOBD si construir una tabla producto que sea s610 la reunión interna o una que incluya filas con valores NULL de una reunión externa. como: SELECT FROM CHICAS. Es razonable esperar que la mayoría de las marcas principales de SOBD la incluirán. Un problema más serio es que una reuni6n entre dos tablas puede involucrar más de un par de columnas coincidentes. aunque no toda. Las capacidades extendidas relativas a las reuniones se describen en esta sección. Dado que las reuniones externas son el único camino para representar algunas consultas extremadamente útiles. _1 _ . y que las características de la reunión en el estilo SQL2 serán parte de la corriente principal de SQL en los próximos años. Los resultados de: (TBLl OUTER-JOIN TBL2) OUTER-JOIN TBL3 serán. Al usar cualquiera de las notaciones de SQL Server o de Oraele es imposible especificar el orden de evaluación de las reuniones externas.13 muestra una forma simplificada de la sintaxis SQL2 extendida de la cláusula FRQM. ha añadido soporte para la mayor parte de la sintaxis. Frente a este escenario. en gen~ral. son también algo engañosas. Es más fácil entender todas las opciones proporcionadas considerando cada tipo de reunión una a una. como se muestra en las secciones anteriores. el SGBD debe «anticipar» la cláusula WHERE. El soporte de la reunión externa en el estándar SQL2 tiene dos ventajas distintas. de la reunión de SQL2 en el momento de escribir este libro. Recuérdese que las reglas para el procesamiento de consultas SQL multitabla comenzaban examinando la cláusula FROM de una consulta y construyendo conceptualmente el producto de dos (o más) tablas. Las otras características extendidas se describen en el siguiente capítulo. diferentes de los resultados de: TBLl OUTER-JOIN (TBL2 OUTER-JOIN TBL3) damentalmente debido a su menor impacto en el lenguaje SQL más que en su claridad o corrección. el SGBD comenzaba a eliminar las filas que no satisfacían la condición de búsqueda de la cláusula WHERE. que añaden incluso más capacidades y complejidad. De hecho. A causa de ello. Las otras características extendidas incluyen las operaciones de conjuntos sobre los resultados (unión.

T . Es completamente equivalente a la cláusula ON que especifica explícitamente cada par de columnas coincidentes... El estándar SQL2 permite otra variación en la reunión interna simple entre las tablas CHICAS y CHICOS.. hay que usar una cláusula ON o WHERE con un test de igualdad. Cláusula FROM extendida en el estándar SQL2... si las columnas coincidentes tienen diferentes nombres en las tablas CHICAS Y CHICOS. fácil de entender. Dado que las columnas coincidentes de las dos tablas tienen los mismos nombres y se comparan según su igualdad (que es el caso habitual).. por tanto.. INNER FULL ---¡.CIUDAD = CHICOS. 5ELECT FROM CHICAS INNER JOIN CHICOS ON CHICAS. y ésta no añade ninguna funcionalidad nueva al lenguaje SQL. Por ejemplo..1 OUTER LE'" RIGHT expresión-dtrreunión 1- tabla J- '.170 SOL... Por supuesto. ~--------T--- .. el orden en que suceden las reuniones afecta a los resultados de la consulta. pero es mucho más compacta y. EDAD) expresión-da-unión r-- tab /a 1 .JOIN fabla 2 --------j aUTER ON sends condition yo' T USING(column lisO LE'" RIGHT En estas reuniones simples de dos tablas.13.. La cláusula QN también se debe usar si la reunión no conlleva la igualdad de las columnas coincidentes.fabla 2-+e Figura 7. La cláusula QN proporciona un control detallado acerca de cómo se procesan estas reuniones multitabla.===:... si se desea seleccionar los pares chica/chico en ..---.espeCific8CiÓn-de.. Las columnas referenciadas en la condición de búsqueda deben venir sólo de dos tablas reunidas. todo el contenido de la cláusula WHEse ha trasladado a la cláusula ON. como se describe más adelante en este capítulo. La condición de búsqueda que sigue a la palabra clave ON puede ser cualquier condición de búsqueda que especifique el criterio usado para hacer corresponder las filas de las dos tablas reunidas... recuérdese de este mismo capítulo que en una reunión exterior que involucre tres o más tablas... EDAD) -==::.. ... Por ejemplo: pártase de la hipótesis que las tablas CHICAS y CHICOS se hubieran ampliado con la columna EDAD. A continuación se muestra una reunión que encaja pares chica/chico de la misma ciudad y que también requiere que el chico y la chica de cada pareja tengan la misma edad: SELECT FROM CHICAS INNER JOIN CHICOS ON (CHICAS.. se puede usar una forma alternativa de la cláusula ON especificando una lista de nombres de columnas coincidentes: RE expresión-de-producto cruzado r-rabla J------- CROSS JOIN _ _ _ _ tabla2 . CIUDAD) ANO (CHICAS.EDAD = CHICOS.INNER FULL - JOIN tabla 2---+-e Nótese que las dos tablas a reunir están conectadas explícitamente mediante una operación JOIN.. Sin embargo... La cláusula USING especifica una lista separada por comas de los nombres de columnas coincidentes.. que debe ser idéntica en ambas tablas. SELECT FROM CHICAS INNER JO IN CHICOS USING (CIUDAD. Manual de referencia Capítulo 7: Consultas multitab/a (reuniones) 171 1- _ FRDM Pero el estándar SQL2 especifica una forma alternativa de expresar la misma consulta: tabla -. CIUDAD expresión-de-reunión-nawral-------l expresión-de-reunión----------j expresión-de-prOduc"'~o-c~. CIUDAD = CHICOS.CROSS JOIN .. y la condición de búsqueda que describe la reunión se especifica ahora en una cláusula ON en la cláusula FROM.:u~"~d~o======j expresión-de-unión- expresión-dtrreunión-narural 1- tabla 1 NATURAL -...

EDAD) o bien: SELECT FROM CHICAS FULL OUTER JOIN CHICOS USING (CIUDAD) Hay una variación final de esta consulta simple que ilustra otra característica de la cláusula FRüM de SQL2. los resultados inciuirán pares chica/chico que no encajan y filas con valores NULL para cada fila que no encaje de la tabla CHICAS (la tabla «izquierda» de la reunión). . el estándar SQL2 también permite omitir la palabra clave OUTER. porque la reunión natural define específicamente la condición de búsqueda a usar para reunir las tablas -se confrontan todas las columnas con nombres idénticos de columna en ambas tablas. la consulta también se podría haber escrito como: SELECT FROM CHICAS NATURAL FULL OUTER JOIN CHICOS lIII . sus resultados son un subconjunto de los generados por la reunión externa completa. El estándar SQL2 parte de que la reunión «predeterminada» de dos tablas es una reunión interna. Análogamente. con valores NULL en las columnas de la otra tabla sin encaje. no se pueden usar las cláusulas ON y USING en la especificación de la reunión. Manual de referencia Capítulo 7: Consultas multitab/a (reuniones) 173 donde se requiere que la chica sea mayor que el chico. La consulta que selecciona pares de chica/chico que viven en la misma ciudad y tienen la misma edad se puede expresar como una reunión natural. Por ejemplo. Reuniones cruzadas y reuniones de unión en SOL2* El soporte en SQL2 de reuniones extendidas incluye otros dos métodos para combinar datos de dos tablas. Una reunión cruzada es otro nombre del producto cartesiano de dos tablas. porque usualmente ésta es la forma más «natural» de reunir las dos tablas. se debe usar una cláusula QN para especificar la reunión: SELECT FROM CHICAS INNER JOIN CHICOS ON (CHICAS.172 SOL. el lenguaje SQL2 se -extiende de forma natural a las reuniones externas por la izquierda O por la derecha. Se puede omitir la palabra clave INNER de los ejemplos anteriores y la consulta resultante sigue siendo una instrucción SQL2 válida con el mismo significado. así como una fila por cada chico que no.CIUDAD = CHICOS. pero no incluye las filas que no encajafl de la tabla CHICAS. Aquí hay una consulta SQL2 que genera el producto completo de las tahlas CHICAS y CHICOS: SELECT FROM CHICAS CROSS JOIN CHICOS Como se explicó anteriormente en este capítulo. Una reunión de dos tablas en la que las columnas coincidentes son exactamente las columnas específicas de las dos tablas que tienen nombres idénticos.CIUDAD incluye pares chico/chica y filas que no encajan de la tabla CHICOS (la tabla «derecha» de la reunión).CIUDAD ANO CHICAS. la reunión externa completa de las tablas CHICAS y CHICOS (sin las columnas EDAD) se genera con esta consulta: SELECT FROM CHICAS FULL OUTER JOIN CHICOS ON CHICAS. como se describió anteriormente en este capítulo. se denomina reunión natural. especificada como: SELECT FROM CHICAS RIGHT OUTER JO IN CHICOS USING (CIUDAD) Reuniones externas en SOL2* El estándar SQL2 proporciona un soporte completo de las reuniones externas usando las mismas cláusulas descritas en la sección anterior para las reuniones internas y palabras clave adicionales.usando esta consulta: SELECT FROM CHICAS NATURAL INNER JO IN CHICOS Como "'a palabra clave INNER es opcional en el lenguaje SQL2.EDAD > CHICOS. Como se describió anteriormente en este capítulo. A continuación se muestra la reunión externa por la izquierda de la misma consulta: SELECT PROM CHICAS LEFT OUTER JOIN CHICOS USING (CIUDAD) Si se especifica la palabra clave NATURAL. los resultados de la consulta contendrán una fila por cada par chica/chico que encaje. la versión de la reunión externa por la derecha de la misma consulta. Una reunión de unión está muy relacionada con la reunión externa completa. La consulta anterior se podría haber escrito: SELECT FROM CHICAS FULL JOIN CHICOS USING (CIUDAD) El SGBD puede inferir de la palabra FULL que se requiere una reunión externa. SQL2 permite las mismas variaciones de las reuniones internas para las reuniones externas. Al especificar LEFT o RIGHT en lugar de FULL. CIUDAD : CHICOS.pero los resultados no incluyen filas que no encajan de la tabla CHICOS.

Su utilidad viene realmente como bloque constructor de expresiones de consulta más complejas. y después usa las capacidades de las consultas de resumen de SQL2 (descritas en el siguiente capítulo) u operaciones de conjuntos de SQL2 para manipular más los resultados. la reunión cruzada de dos tablas es por sí misma de muy poco uso práctico. «reunión cruzada» en inglés) contiene cada posible par de filas de las dos tablas. el producto cartesiano (a veces denominado producto cruzado. Manual de referencia Capítulo 7: Consultas multitabla (reuniones) 175 Por definición.14. las columnas que vienen de la tabla CHICOS reciben los valores de datos correspondientes. así que no se permiten las cláusulas ON y USING.174 saL. estos resultados tienen cuatro columnas -todas las columnas de la primera tabla más todas las columnas de la segunda (mfitas) (n filas) Figura 7. las columnas que vienen de la tabla CHICAS reciben los valores de datos correspondientes. La reunión de unión de las tablas CHICAS y CHICOS se especifica con esta consulta SQL2: SELECT FROM CHICAS UNION JOIN CHICOS Pares de las filas Que no encajan de TBLl/TBL2 Filas que no encajan de TBL2 con valores NULL para las columnas de TBLl V Reunión cruzada Reunión de unión / \ y 1\ v . No hay «columnas coincidentes» o «criterio de selección» asociados con los productos cruzados. «Multiplica» las dos tablas convirtiendo las tablas de. Otra forma de observar los resultados de la reunión de unión es compararlos con ]os resultados de una reunión externa completa de las tablas CHICAS y CHICOS.' Todos los pares TBLlxTBL2 (m x n filas) 1\ Y' 1 TBLl con valores NULL TBL2 con valores NULL Los resultados tienen de nuevo cinco filas. Para cada fila de los resultados que vienen de la tabla CHICAS. que usa una operación simple UNION: SELECT FROM CHICAS UNION ALL tabla. y de nuevo cada fila de los resultados viene de exactamente una de las filas de la tabla CHICAS o de la tabla CHICOS. Pero a diferencia de la unión simple. Recuérdese que la operación UNtaN combina las filas de dos tablas que deben tener el mismo número de columnas y los mismos tipos de datos para las columnas correspondientes. de ahí el nombre CRDSS JOIN. que comienzan con el producto cruzado de dos tablas. De forma similar. Reunión externa completa Reunión externa por la izquierda Reunión externa por la derecha '\ "'" Filas que encajan de TBLl con valores NULL para las columnas de TBL2 Pares de las filas coincidentes de TBLl/TBL2 Reunión interna Filas ~ue encajan de TBL2 con valores NULL para las columnas de TBLl SELECT FROM CHICOS "Filas que no encajan de TBLl con valores NULL para las columnas de TBL2 cuando se aplica a una tabla de tres filas de chicas y de dos filas de chicos. NOMBRE y CIUDAD. Cada fila de los resultados corresponde a una fila de la tabla CHICAS o de la tabla CHICOS de la cual deriva. Nótese que la reunión cruzada realmente no añade ninguna nueva capacidad al lenguaje SQL. Los resultados de la reunión de unión incluyen filas con valores NULL de los datos de la tabla CHICAS y filas con valores NULL de los datos de la tabla CHICOS pero no incluyen ninguna de las filas generadas por las columnas coincidentes: Volviendo a la definición de la reunión externa de la Figura 7. por cada fila de resultados que vIenen de la tabla CHICOS. Se pueden generar exactamente los mismos resultados con una reunión interna que no especifica columnas coincidentes. . la reunión de unión es corno todas las otras reuniones. En este aspecto. Relaciones entre los tipos de reunión en SQL2.14. Los resultados tienen dos columnas. tres chicas y dos chicos en una tabla de seis (3x2 == 6) pares chica! chico. por ejemplo. La reunión de unión en SQLZ combina algunas de las características de la operación UNION (descrita en el capítulo anterior) con algunas de las características de las operaciones de reunión descritas en este capítulo. da una tabla de cinco filas de resultados. la reunión de unión se produce omitiendo el paso 1 y siguiendo el paso Z y el 3. Así que la consulta anterior se puede escribir como: SELECT • FROM CHICAS.a CHICOS) tienen valores NULL. las otras columnas (en este caso las que vienen de la tabla CHICAS) tienen valores NULL. CHICOS El uso de las palabras clave CROSS JO IN en la cláusula FROM sólo hace más explícita la reunión cruzada. Esta consulta. las otras columnas (las que vienen de la tabl. porque las tablas CHICAS y CHICOS tienen cada una estas dos columnas. En la mayoría de bases de datos.

con valores NULL. pero se seguirán omitiendo las chicas que no vivan en la misma ciudad que algún chico. consistentes en todas los pares de filas de las dos tablas. el estándar SQL2. Se forma eliminando las filas de la reunión cruzada que no satisfacen la condición de la reunión interna. la segunda reunión también se debe convertir en una reunión externa por la izquierda: SELECT FROM ON LEFT ON WHERE CHICAS. VÁSTAGO = NOMBRE) JOIN CHICOS (CHICAS. independientemente de que las chicas tengan a su madre definida en la base de datos. La ta~la PROGENITORES tiene tres columnas: VÁSTAGO Esta consulta incluirá todos los pares chica/chico. Las tablas CHICAS. NOMBRE PRO . más todas las filas de TBL2. cualquiera de las expresioñes de reunión mostradas en la Figura 7.CIUDAD : CHICOS. Para incluir tam· bién a estas chicas. Para ilustrar las reuniones multitabla asúmase que se ha añadido una nueva tabla PROGENITORES a la base de datos que contiene las tablas CHICAS y CHICOS del ejemplo que se ha estado usando. NOMBREPRO.CIUDAD» (TIPO: "MADRE") OR {TIPO IS NULLI Coincide con la columna NOMBRE de las tablas TIPO Especifica PADRE o MADRE Nombre de pila del progenitor NOMBREPRO CHICAS y CHICOS Nótese que la extensión con valores NULL de las filas de la tabla CHICAS de la reunión externa con sus madres también crea alguna complicación adicional en la cláusula WHERE. El criterio simple de selección: WHERE (TIPO: -MADRE") Cada fila de las tablas CHICAS y CHICOS puede tener dos filas coincidentes en la tabla PROGENITORES.NOMBRE {(CHICAS LEFT JO IN PROGENITORES PROGENITORES. CHICOS. • La reunión externa por la derecha contiene todas las filas de la reunión interna más cada fila que no encaje de TBL2. Por ejemplo. los diferentes tipos de reuniones externas y la reunión interna mostrada en la Figura 7. -. tener sólo una de estas filas o ninguna si no hay datos sobre los progenitores del vástago. • La reunión externa completa contiene todas las filas de la reunión interna más cada fila que no encaja de TBLl. con valores NULL.CIUDAD : CHICOS. CHICOS.CIUDAD» TIPO : -MADRE" Dado que ambas reuniones son internas. • TBL1 INNER JOIN TBL2 contendrá algún número de filas. Grosso modo. con valores NULL. VÁSTAGO : NOMBRE) CHICOS (CHICAS. sus resultados son la reunión externa «menos» la reunión interna.NOMBRE. Grosso modo. La reunión interna es estrictamente un subconjunto de la reunión cruzada. con valores NULL.1~ y descritas en las anteriores secciones se pueden encerrar entre paréntesis. NOMBREPRO.14. con valores NULL. TBL1 con m filas y TBL2 con n filas.NOMBRE {(CHICAS LEFT JO IN PROGENITORES PROGENITORES.176 SOL. Manual de referencia Capitulo 7: Consultas multitabla (reuniones) 177 Finalmente es útil examinar la relación entre los conjuntos de filas producidos por la reunión cruzada. La expresión de reunión resultante se puede usar por sr mima ·en otra expresión de reunión. se debería cambiar la reunión entre las tablas CHICAS y PROGENITORES en una reunión externa por la izquierda. A continuación se muestra una consulta que produce la lista: SELECT FROM ON JOIN ON WHERE CHICAS. permite construir expresiones de reunión más complejas del mismo modo. con valores NULL.NOMBRE ((CHICAS JOIN PROGENITORES PROGENITOR. sino también un valor NULL en la columna TIPO.CIUDAD)) (TIPO: "MADRE") OR (TIPO IS NULL) Reuniones multitabla en SOL2 Una ventaja importante de la notación SQL2 es que pennite una . Éste puede ser el resultado deseado o no. más cada fila que no encaja de TBL2. Para construir estas reuniones más complejas. CHICOS.NOMBRE. Al reunir dos tablas.especificación muy clara de las reuniones de tres o cuatro tablas. o puede • . la figura muestra que: • La reunión cruzada contendrá m x n fiJas. sus resultados son iguales a la reunión externa por la izquierda «más» la reunión externa por la derecha. f. que es menor que m x n.CIUDAD : CHICOS. NOMBRE. Las chicas sin madres coincidentes generarán filas no sólo con el nombre de la madre con valor NULL (NOMBREPRO). Para incluir las chicas sin una madre que encaje en la base de datos. * y !) con paréntesis y construir expresiones más complejas. cualquier chica que no tenga algún chico que viva en la misma ciudad o que no tenga a su madre definida en la base de datos no se mostrará en los resultados de la consulta. una especificando una MADRE y otra un PADRE. como ésta: SELECT FROM ON JO IN ON WHERE CHICAS. • La reunión de unión contiene todas las filas de TBLl. CHICOS Y PROGENITORES proporcionan un rico conjunto de datos para algunos ejemplos de reuniones multitabla. supóngase que se desea confeccionar una lista de todas las chicas junto con los nombres de sus madres y los chicos que viven en la misma ciudad. • La reunión externa por la izquierda contiene todas las filas de la reunión interna más cada fila que no encaje de TBL1. como si fuese una simple tabla. VÁSTAGO = NOMBRE) CHICOS (CHICAS. Así como SQL permite combinar opera· ciones matemáticas (+.

Esta consulta SQL2 da los resultados deseados: SELECT CHICAS. • El estándar SQL2 proporciona un soporte completo para las reuniones internas y externas. No hay ambigüedad acerca del orden en que se reúnen las tablas. De nuevo. pero una reunión interna para la parte (CHICOS reunión CHICAS) de la consulta. Sin embargo. la cláusula WHERE especifica el criterio de búsqueda que se aplica a la tabla complela resultado de estas reuniones. el test para el TIPO apropiado de progenitor se realizará cuando el SGBD encuentre columnas coincidentes para construir la reunión. la capacidad añadida compensa la complejidad introducida por la cláusula FROM de SQL2. • Cada fila de resultados es una combinación de datos de una única fila de cada tabla y es la única fila que obtiene sus datos de una combinación particular.NOMBRE. Supóngase. Por tanto.178 SOL. i Pero la razón de usar la reunión externa por la izquierda fue asegurarse de que se incluyesen! Para resolver este problema la cláusula WHERE se expande para comprobar también las filas en las que el tipo de progenitor es NUL~. usando un test de igualdad o cualquier otro test de comparación. Como muestra este ejemplo. que se desease incluir todas las chicas y chicos en los pares chica/chico. con dos papeles diferentes. el potencial de las filas sin encaje en las reuniones significa que hay varias posibles respuestas «correctas» a la consulta. las reunión se puede construir comparando cualquier par de columnas de las dos tablas reunidas. incluso si el chico o chica no tiene una fila coincidente en la tabla PROGENITORES. o sobre cuáles son las reuniones internas o externas. MADRES. antes de que se añadan las filas con valores NULL a los resultados de la reunión externa. como antes. • Las consultas multitabla más comunes usan la relación padre/hijo creada por las claves primarias y las claves externas.NOMBRE) ANO (TIPO = "PADRE")))) USING (CIUDAD) reunión en la que aparecen. es necesario dar dos alias de tabla diferentes para especificar correctamente los nombres en la lista de selección. la cláusula ON especifica el criterio de Resumen En este capítulo se ha descrito la forma en que SQL maneja las consultas que combinan datos de dos o más tablas: • En una consulta multitabla (una reunión). • En general. una para reunir con la información de los chicos los nombres de los padres.NOMBRE. intersecciones y diferencias. La relación entre las cláusulas es simple y permanece como se describió antes en este capítulo. Aunque ninguno de los ejemplos de las consultas incluidos en esta sección tengan cláusulas WHERE u ORDER BY. En resumen.NOMBRE) ANO (TIPO = -MADRE"))) JO IN (CHICOS LEFT JOIN PROGENITORES AS PADRES ON ((VÁSTAGO = CHICOS. las autorreuniones requieren el uso de alias de tabla. Manual de referencia Capítulo 7: Consultas mu/titabla (reuniones) 179 generaría un resultado «desconocido» para estas filas y no se incluirían en los resultados. Dado que la tabla PROGENITORES se usa dos veces en la cláusula FRDM. las tablas que contienen los datos se listan en la cláusula FROM. De este modo. la consulta SQL2 especifica de forma precisa la consulta que debe resolver el SGBD. incluso una consulta de cuatro reuniones como ésta puede llegar a ser bastante compleja usando la sintaxis de SQL2. Esta consulta resuelve el problema del test de la cláusula WHERE de forma diferente -trasladando el test sobre el TIPO de progenitor a la cláusula ON de la especificación de la reunión. Es necesario usar reuniones externas para las partes (CHICOS reunión PROGENITORES) y (CHICAS reunión PROGENITORES) de la consqlta. se pueden usar libremente con la cláusula FROM extendida en SQL2. y otra para reunir la información de las chicas para obtener los nombres de sus madres). Cuando se completa el procesamiento de la cláusula selección en la cláubúsqueda que se aplica a reuniones específicas.NOMBREPRO.NOMBREPRO FROM ({CHICAS LEFT JOIN PROGENITORES AS MADRES ON ({VÁSTAGO = CHICAS. PADRES. CHICAS Y dos copias de la tabla PROGENITORES. la tabla resultado se usa para aplicar el criterio de sula WHERE. Como ejemplo final supóngase que se desea generar de nuevo un listado de chicas/chicos. pero en este caso se desea incluir en los resultados el nombre del padre del chico y de la madre de la chica. • Las reuniones externas extienden la reunión (interna) estándar conservando las filas que no encajan de una tabla o de ambas reunidas en los resultados y usando valores NULL para los datos de la otra tabla. y para la combinación de resultados de reuniones con otras operaciones multitabla. • Una tabla se puede reunir consigo misma. a pesar de la complejidad. El procesamiento especificado en una cláusula USING u DN se aplica como parte de una especificación particular de la . FROM. CHICOS. Esta consulta requiere una reunión de cuatTo tablas (CHICOS. • Se puede pensar que una reunión es el producto de dos tablas de las que se han eliminado algunas de las filas. como las uniones.

AVG(VENTAS) FROM REPRESENTANTES AVG(CUOTA) AVG(VENTAS) 300.000.OO€ 289. la función de columna AVG () toma una columna de datos y calcula su media.de ventas? SQL alberga estas solicitudes de datos ~e resumen mediante funciones de columna y las cláusulas GROUP BY y HAVING de la instrucción SELECT. cada una de las siguientes solicitudes piden un único valor o un pequeño número de valores que resumen los contenidos de la base de datos: • • • • • • ¿Cuál es la cuota total de todos los representantes? ¿Cuáles son la mayor y menor cuotas asignadas? ¿Cuántos representantes exceden su cuota? ¿Cuál es el importe de un pedido medio? ¿Cuál es el importe del pedido medio de cada oficina de ventas? ¿Cuántos representantes están asignados a cada oficina . Por ejemplo. que se describen en este capítulo. A continuación se muestra una consulta que usa la función de columna AVG () para calcular el valor medio de dos columnas de la tabla REPRESENTANTES: ¿ Cuál es la cuota media y las ve1llas medias de nuestros represemantes? SELECT AVG(CUOTA). Funciones de columna SQL permite resumir los datos de la base de datos mediante un conjunto de funciones de columna.20€ 181 .353.'i CAPíTULO 8 ~ Consultas de resumen Muchas solicitudes de información no requieren el grado de detalle proporcionado por las consultas SQL descritas en los dos últimos capítulos. Una función de columna de SQL toma una columna de datos completa como argumento y produce un único elemento de datos que resume la columna. Por ejemplo.

000.OO€ 298. la segunda calcula la media de los valores de la columna VENTAS.OO€ 300.00€ 392. Los datos de la columna deben tener un tipo numérico (entero.2.000. OO€ 286. decimal.1 ¿ Cuál es el rendimiento medio de la cuota de nuestros representantes? • Figura 8.253.72S. A continuación se muestran varios ejemplos que usan la función de columna SUM{}: Figura 8.I i. • SUM () • AVG () SOt1. • MAX () halla el mayor valor de una columna.00€ 186. como se muestra en la Figura 8.00€ 361.Nombre-de-columna El argumento de una función de columna puede ser simplemente un nombre de columna.00€ SELECT AVG(100 * (VENTAS/CUOTA)) FROM REPRESENTANTES AVG{100*(VENTAS/CUOTA) ) 102. 86S. 1--. como se muestra a continuación: COUNT ('J -----------------. SQL construye una columna temporal que contiene el valor de la expresión {lOO * (VENTAS/CUOTA}) para cada fila de la tabla REPRESENTANTES y después calcula las medias de la columna temporal.! r! 1 105 109 102 106 104 101 110 108 103 107 Bruno Arteaga María Jiménez Susana Santos Samuel Clavel Bernardo Sánchez Daniel Ruidrobo Tomás Saz León Freire Pablo Cruz Neus Azcárate 104 106 108 NULL 106 104 101 106 104 108 CUOTA 350.0S0. SQL ofrece seis funciones de columna diferentes.00€ 27S.00€ 305.00€ NULL 3S0. Cálculo del total de una columna (SUM) I l' 1'.20€ La función de columna SUM () calcula la suma de los valores de datos de una columna.673. Las funciones de columna ofrecen seis clases diferentes de datos de resumen: calcula el total de una columna. El resultado de la función SUM () tiene el mismo tipo de datos básico que los datos de la columna.000. La consulta produce una única fila de resultados que resume los datos de la tabla REPRESENTANTES. Por ejemplo. Tabla REPRESENTANTES NUM EMPLE NOMBRE JEFE I l' I l' .00€ 75.00€ VENTAS 367. coma flotante o moneda).:---.000.OO€ 27S.00€ 200.00€ 350.91l. J DISTINCT Nombre-de-columna-l I---AVG (-r Expresión LDISTINCT Nombre-de-COlumna"J) 1--. corno en el ejemplo anterior. . • COUNT () cuenta el número de valores de una columna.60 Para procesar esta consulta.. o puede ser una expresión SQL. calcula el valor medio de una columna.1. Manual de referencia Capítulo 8: Consultas de resumen 183 I I I 1. La primera funcjón de columna de la consulta tomas los valores de la columna CUOTA y calcula su media.000. .MAX COUNT {Expresión)I-----------. (LEXpresión---------.00€ 474.¡ 182 SOL.000.00€ 299. • COUNT ( *) cuenta las filas de los resultados.00€ 300. se puede producir un entero de 32 bits como resultado.775. pero el resultado puede tener mayor precisión. . si se aplica la función SUM () a una columna de enteros de 16 bits. 300.00€ 300.594.00€ 142.MIN() halla el menor valor de una columna.042.912.985.000.2. Operación de una consulta de resumen. J muestra gráficamente cómo se producen los resultados de la consulta. Diagrama sintáctico de las funciones de columna.000.000." 1" La Figura 8.000.MIN (Expresión)J------------------.:------->! (T DISTINCT 3.

A continuación hay algunos ejemplos que muestran el uso de estas funciones de columna: ¿ Cuáles SO" las cuotas mayor y menor asignadas? ij I I I n SELECT MIN(CUOTA) . Por ejemplo. el cual es a su vez menor que todos los números positivos).00 2. REPRESENTANTES WHERE NOMBRE = 'Bruno Arteaga' AND REP = NUM_EMPL SUM(IMPORTE) Las funciones de columna MIN () y MAX () hallan respectivamente los valores menor y mayor de una columna.895. Manual de referencia Capítulo 8: Consultas de resumen 185 ¿ Cuáles son las cuotas y ventas tolales de lOdos los representantes? SELECT SUM(CUOTA). Los datos de la columna pueden contener información numérica. que son menores que cero. su resultado puede tener un tipo de datos diferente del de los valores de la columna. el resultado puede ser un número decimal o en coma flotante.00€ ¿ Cuál es el 10tal de los pedidos de Bruno Arteaga? SELECT SUM(IMPORTE) FROM PEDIDOS. la comparación de dos cadenas depende del conjunto de caracteres que se use. Al usar HIN () Y MAX () con datos de cadena.700. En una computadora personal o minicomputadora. dependiendo del SGBD que se esté usando.000.000. si se aplica la función AVG () a una columna de enteros. A continuación se muestran algunos ejemplos de la función de columna AVG (): Calcular el precio medio de los productos del fabricante AC/. SELECT AVG(IMPORTE) FROM PEDIDOS WHERE CLIENTE = 2103 AVG(IMPORTE) 8. Dado que la función AVG () suma los valores de la columna y después lo divide por el número de valores. Las fechas se comparan secuencialmente (las fechas anteriores son menores que las posteriores).327. y todos los caracteres en mayúscula vienen antes de los caracteres en minúscula.893. Como con la· función SUM ( ) • los datos de la columna deben tener un tipo numérico. SUM(VENTAS) FROM REPRESENTANTES SUM{CUOTA) Búsqueda de valores extremos (MIN y MAX) SUM(VENTAS) 2.OO€ Cálculo de la media de una columna (AVG) ¿ Cuál es la fecha más antigua de SELECT MIN(FECHA_PEDIDO) FROM PEDIDOS MIN(FECHA_PEDIDO) 04-ENE-S9 UIl pedido en la base de datos? La función de columna AVG () calcula la media de una columna.44 Calcular el importe medio de los pedidos de Acme (número de cliente 21. ambas usan el conjunto de caracteres ASCII.532. los dígitos vienen antes que las letras en la secuencia de ordenación. SQL compara los número en orden algebraico (los números grandes negativos son menores que los números pequeños negativos.OO€ 200. que usan el conjunto de caracteres EBCDIC.29€ ¿ Cuál es el mejor rendimiento en ventas de los representantes? SELECT MAX(lOO • (VENTAS/CUOTA)) FROM REPRESENTANTES MAX(100*IVENTAS!CUOTA)) 135. los caracteres en minúscula preceden a los caracteres en mayúscula.00€ 350. MAX(CUOTA) FROM REPRESENTANTES HIN/CUOTA) HAX(CUOTA) 39.184 SQL. y los dígitos vienen des- .03). En los grandes sistemas (mainframe) de IBM. SELECT AVG(PRECIO) FROM PRODUCTOS WHERE ID_FAS = 'ACI' AVG(PRECIO) S04.000. El resultado de la función MIN () O MAX () tiene exactamente el mismo tipo de datos que los datos de la columna. de cadena o de fecha y hora.50€ Cuando las funciones de columna MIN () Y MAX () se aplican a datos numéricos.

5678ABC ACME MFG. A continuación se muestra una comparación de las secuencias de ordenación de ASCII y EBCDIC de una lista de cadenas. Los datos de la columna pueden ser de cualquier tipo. .00 COUNT (IMPORTE) 4 1234ABC 5678ABC La diferencia en las secuencias de ordenación significa que una consulta con una cláusula ORDER BY puede producir diferentes resultados en dos sistemas diferentes. Otros simplemente los ordenan de acuerdo con el valor numérico del código asignado al carácter. Si una aplicación maneja texto internacional se debe experimentar con el SGBD particular para determinar cómo s-e manejan estos caracteres. CQUNT (* ) . independientemente del tipo de datos de la columna. La función COUNT ( ) siempre devuelve un entero. Como resultado. Por esta razón. reescrita de nuevo esta vez con la función COUNT (*) : SELECT COUNT(*) FROM PEDIDOS WHERE IMPORTE> 25000. Nótese que la función COUNT () ignora los valores de Jos elementos de datos de la columna. simplemente cuenta cuántos elementos de datos hay. alemán. la función COUNT ( * ) se usa casi siempre en lugar de la función CQUNT () para contar filas. es mucho más fácil pensar cómo «contar los pedidos». el estándar SQL2 incluye un soporte elaborado para los conjuntos de caracteres nacionales.00 4 Recuento de valores de datos (COUNT) La función de columna COUNT () cuenta el número de valores de datos de una columna. no importa realmente la columna que se especifique como argumento de la función COUNT ( ). ZETA Zeta acme zeta CQRP. En la práctica. los caracteres acentuados en francés. SQL alberga una función de columna especial. el soporte de estas características de SQL2 varía ampliamente entre diferentes productos SGBD populares. de las menores a las mayores: ASCII 1234ABC ¿ Cuántos representantes exceden su cuota? SELECT COUNT(NOMBRE} FROM REPRESENTANTES WHERE VENTAS > CUOTA COUNT(NOMBRE} 7 EBCDIC acme mfg. ACME MFG. . carpo Zeta Carpo ZETA CORP. Manual de referencia Capítulo 8: Consultas de resumen 187 pués de las letras. Desafortunadamente. Para manejar estos aspectos. es difícil pensar en la consulta como «contar los importes de pedidos» o «contar los números de pedido». A continuación se muestran varios ejemplos de consultas que usan la función de columna COUNT ( 1: ¿ Cuántos clientes hay? SELECT COUNT(NUM_CLI) FROlo1 CLIENTES De hecho. zet.186 SOL. A continuación se muestra la misma consulta. italiano. esto hace que la consulta sea más fácil de leer. El último ejemplo se podría haber escrito simplemente como: SELECT COUNT (NUM_PEDIDO) FROM PEDIDOS WHERE IMPORTE> 25000.000. Los caracteres internacionales plantean problemas adicionales (por ejemplo.00 COUNT(*) 4 21 Si se piensa en la función COUNT (*) como una función de «recuento de filas». ¿Cuántos pedidos de más de 25. o las letras del alfabeto cirílico usados en griego y ruso. Acrne Mfg. Algunas marcas de SOBD usan algoritmos de ordenación internacional especiales para ordenar estos caracteres en su posición correcta en cada lenguaje.a carpo Acme Mfg. Carpo mEg. que cuenta filas en lugar de valores de datos. español. O los símbolos kanji usados en japonés). conjuntos de caracteres definidos por el usuario y secuencias de ordenación alternativas.están registrados? SELECT COUNT(IMPORTE) FROM PEDIDOS WHERE IMPORTE> 25000.

Para generar los resultados de una consulta de una instrucción SELECT: l. ellolal de los importes. considérese esta consulta: SELECT NOMBRE. Si la cláusula FRQM lista una única tabla. Para cada fila restante. MIN (). FROM PEDIDOS.pedido. (100 ' (100 ' AVG(IMPORTE/CUOTA)) PROM PEDIDOS.51 Sin las funciones de columna. mezclar los resultados de la consulta de las instrucciones individuales en una única tabla de resultados. ORDER BY. MAX () Y COUNT () toman cada columna de valores de datos como argumento y producen un único valor de datos - . Por ejemplo. Los siguientes pasos muestran las reglas del procesamiento de consultas SQL expandido una vez más para describir cómo se manejan las funciones de columna. Por ejemplo. Para una función de columna. 3. considérese la siguiente consulta compleja: Hallar el importe medio de los pedidos. CLIENTES. Como antes. REPRESENTANTES WHERE CLIENTE = NUH_CLI ANO REP • NUH_EHPL I Capítulo 8: Consultas de resumen AVG(IHPORTE/LIHITE_CREOITO)). usar el valor de la columna en la fila en curso. 5. aplicar su condición de búsqueda a cada fila de la tabla producto. IMPORTE.00€ 24. SOM!IHPORTE).efinición precisa de lo que significa una consulta. Las funciones de columna usan las columnas de esta tabla de resultados detallados para generar una tabla de una única fila de resultados de resumen. Valores NULL Y funciones de columna Las funciones de columna SUM (). porque la expresión resultante no tiene sentido. 2. Si hay una cláusula se especifique. la consulta puede ser difícil de l~er y comprender. las reglas están pensadas para proporcionar una d. la media de los impories de los pedidos como un porcenlaje dellímile de crédilo del cliente. El segundo elemento pide a SQL que genere una columna de una fila de resultados de resumen que contenga el total de la columna VENTAS. il89 Funciones de columna en la lista de selección Las consultas simples con una función de columna en su lista de selección son muy fáciles de comprender. produciendo una única fila de resumen. Eliminar las filas duplicadas a menos que se especifique UNION ALL. Después habría que imaginar a SQL aplicando las funciones de columna sobre los resultados detallados.37€ 247. SUH(VENTAS) FROM REPRESENTANTES 7. Realmente. Si la instrucción es una UNION de instrucciones SELECT. o la lista de selección no contiene ninguna función de columna (produciendo una consulta detallada). Si la instrucción es la UNION de instrucciones SELECT. calcular el valor de cada elemento de la lista de selección para producir una única fila de resultados. CLIENTES. Por ejemplo. cuando la lista de selección incluye varias funciones de columna. Manual de referencia '] SELECT AVG ! IMPORTE) . Los dos elementos SELECT se contradicen entre sí.69l. Esta regla se conoce a veces como «es ilegal anidar las funciones de columna». de nuevo porque la consulta resultante no tendría sentido.188 SOL. También es ilegal mezclar funciones de columna y nombres de columnas normales en una lista de selección. Formar el producto de las tablas listadas en la cláusula FROM. AVG (). el argumento de una función de columna no puede contener otra función de columna. Los refinamientos necesarios se describen más adelante en la sección «Condiciones de búsqueda de grupos». Si se especifica SELECT DISTINCT. ordenar los resultados de la consulta como Las filas generadas por este procedimiento forman los resultados de la consulta. Sin embargo. Por esta razón. conservando las filas para las que la condición de búsqueda es TRUE (y descartando aquellas para las que la condición es FALSE o NULL). IMPORTE/LIMITE_CREDITO. usar el conjunto completo de filas como argumento.4:> (lOO'AVa (IMPORTE/CUOTA) ) 2. Primero habría que imaginar cómo funcionaría la consulta sin las funciones de columna. o todas las referencias a columna de la lista de selección aparecen en el argumento de una función de columna (produciendo una consulta de resumen). Si hay una cláusula WHERE. eliminar cualquier fila duplicada que se haya producido en el resultado. 6. la regla es un poco más compleja cuando se consideran las consultas agrupadas y las subconsultas. sería: SELECT IMPORTE. REPRESENTANTES WHERE CLIENTE = NUM_CLI AND AND REP = NUM_EMPL IMPORTE/CUOTA y produciría una fila de resultados detallados para cada. Para una referencia a columna simple. y el imporle medio de los pedidos como un porcemaje de la cuota del represemallle. AVG (IMPORTE) SUM (IMPORTE) (100' AVG (IMPORTE/LIMITE_CREOITO)) 8. puede ser parte de una expresión que sume o reste los valores de dos funciones de columna. 4. Una función de columna puede aparecer en la lista de selección en cualquier lugar en que pueda aparecer un nombre de columna. no una descripción de cómo resuelve realmente el SGBD los resultados de la consulta.256. aplicar los pasos del 2 al 5 a cada una de las instrucciones para generar sus resultados individuales. produciendo un error. produciendo muchas filas de resultados detallados. El primer elemento de selección pide a SQL que genere una tabla de diez filas de resultados detallados -una fila por cada representante-. o cuando el argumento de una función de columna es una expresión compleja. Una de las mejores formas de pensar en las consultas de resumen y en las funciones de columnas es imaginar el procesamiento de consultas dividido en dos pasos. Sin embargo. el producto es esta tabla.

Aunque el estándar es muy claro en esta área. Esta consulta muestra cómo la función COUNT () ignora los valores NULL de una columna: SELECT COUNT{*). que se ignora en la función SUM ( ) . En la fila con un valor NULL de la cuota. entonces SUM (). la función COUNT (*) se usa casi siempre en Jugar de COUNT ( ) . ¿Cuál es la respuesta «correcta»? ¡Las dos! La primera expresión calcula exactamente lo que dice: «la suma de VENTAS. Sin embargo. ¿Qué ocurre si uno o más de los valores de datos de la columna es un valor NULL? El estándar SQL de ANSI/ISO especifica que los valores NULL de la columna se ignoran por las funciones de columna. También se puede pedir a SQL que elimine valores duplicados de una columna antes de aplicarle una función de columna. 10 10 REPRESENTANTES contiene diez filas. Sin embargo. La columna CUOTA es NULL para el último representante contratado. la función COUNT () devuelve el valor cero.OO€ Se esperaría que las dos expresiones: (SUM(VENTAS) SUM(CUOTA)) y SUM{VENTAS-CUOTA) Eliminación de filas duplicadas (DISTINCT) de la lista de selección produjesen resultados idénticos. La expresión: sUM(VENTAS¡ resume el total de ventas de los diez representantes. puede causar problemas sutiles en las funciones de columna SUM () y AVG (). FROM REPRESENTANTES SUM(VENTAs) sUM(CUOTA} 2.700.000. SUM(VENTAs-CUOTA) La tabla (SUM(VENTAS)-SUM(CUOTA)) 193. los productos comerciales SQL pueden producir resultados diferentes del estándar.532. se incluye la palabra clave DISTINCT antes del argumento de la función de columna. la función de columna: SUM(VENTAS-CUOTA) . A continuación se muestran dos consultas que ilustran la eliminación de filas duplicadas en las funciones de columna: ¿ Cuántos puestos diferentes tienen los representantes? SELECT COUNT{DISTINCT PUESTO} FROM REPRESENTANTES COUNT{DISTINCT PUESTO) 3 resume el tata] de ventas de sólo los nueve valores de cuota que no son NULL. Por tanto. AVG ().547.OO€ (SUM!VENTAS) SUM(CUOTA)). a menos que se desee excluir explícitamente los valores NULL de una columna particular del total. • COUNT (") cuenta fiJas y no depende de la presencia o ausencia de valores NULL en la columna. El estándar ANSI/ISO especifica estas reglas precisas para el manejo de valores NULL en las funciones de columna: • Si alguno de los valores de datos de una columna es NULL.190 SOL. Sin embargo. la resta produce un valor NULL. se excluyen en este cálculo. así que la función COUNT (VENTAS) también devuelve un recuento de diez. La expresión: SUM(VENTAS) SUM(CUOTA) calcula la diferencia de estas dos cantidades. Ignorar Jos valores NULL tiene poco impacto en las funciones de columna MIN ( ) y MAX ( ) . la función COUNT () devuelve el valor cero. Antes de asumir el comportamiento especificado por el estándar se debería contrastar con el SGBD que se use. Manual de referencia Capítulo 8: Consultas de resumen 191 como resultado. AVG (). Si no hay filas. cuando aparecen valores NULL. devuelve el valor cero. • Si cada elemento de datos de la columna es NULL.OO€ sUM(VENTAS-CUOTA) 117. A causa de estas anomalías. se ignora para el propósito del cálculo del valor de una función de columna.532. que se incluyen en el cálculo anterior. La función COUNT (CUOTA) ignora este valor NULL y devuelve un recuento de nueve. El representante con un valor NULL en la columna CUOTA es de nuevo la razón. especialmente si todos los valores de datos de una columna son NULL o cuando una función de columna se aplica a una tabla vacía. COUNT(CUOTA) FROM REPRESENTANTES COUNT(*) COUNT(VENTAS} COUNT(CUOTA) 9 tiene un valor del argumento distinto de NULL sólo para nueve de los diez representantes. pero el ejemplo muestra que no lo hacen. COUNT(VENTAS) . inmediatamente después del paréntesis de apertura. los dos cálculos no son el mismo.893. La segunda expresión también calcula exactamente 10 que dice: «la suma de (VENTAS-CUOTA)>>.OO€ 2. menos la suma de CUOTA». MIN () Y MAX () devuelven el valor NULL. Para eliminar valores duplicados. • Si no hay elementos de datos en la columna (es decir. las ventas del representante sin cuota. SUM(CUOTA). como se ilustra en esta consulta: SELECT SUM (VENTAS 1 . la columna está vacía). entonces las funciones de columna SUM (1. así que COUNT (*¡ devuelve un recuento de diez. La columna VENTAS contiene diez valores que no son NULL. mientras que la expresión: SUH(CUOTA) Recuérdese del Capítulo 6 que se puede especificar la palabra clave DISTINCT al principio de la lista de selección para eliminar filas duplicadas de resultados. MIN () y MAX () devuelven un valor NULL.

Además. resumiendo los pedidos de cada representante.. 112961 112989 112975 113057 '> >.00E 775. no puede aparecer en ninguna de las funciones de columna.~.479. El estándar también requiere la palabra clave DIST1NCT en la funci6n de columna. con un grupo por cada representante.37 113051 113045 113013 113024 113007 112992 113049 : I~ ~~: I ~ 108 108 108 108 1. SQL divide los pedidos en grupos. no puede aparecer en ninguno otro. La Figura 8.14€ 109 3. AVG(IMPORTE) FROM PEDIDOS GRQUP BY REP REP AVG(IMPORTE) 101 8. Como los subtotales son útiles en los informes impresos.> < lO' lO' lO' lO' ( ) 31.458. - . es conveniente a menudo resumir los resultados en un nivel «subtotal». ~~~o.40€ 106 16. permitiendo que D18T1NCT se aplica en cualquiera de las funciones de columna y permitiendo expresiones como argumentos de cualquiera de las funciones.OO€ 107 11.OOE 2.00€ 106 1.420.00€ 600. pero algunas implementaciones lo permiten de lodas formas.iKUPIUlA Las consultas de resumen descritas hasta el momento son como los totales en el pie de un infonne. Las subconsultas se describen en el Capítulo 9.376. "".865.r:k '" Figura 8. La segunda consulta produce varias filas de resumen una fila por cada grupo. Si aparece en el argumento de una función de columna.33€ 108 8...500. Conceptualmente.552. D18T1NCT no se puede especificar en la función COUNT (1<) porque no trata en absoluto con una columna de valores de datos simplemente cuenta filas. pero muchas implementaciones de SQL permiten el uso de la funci6n COUNT () sin ella.256. Dentro de cada grupo. El estándar no permite el uso de la palabra clave DISTINCT en las funciones de columna HIN () y MAX () porque no tiene impacto en sus resultados. La función de la cláusula GROUP BY se comprende más fácilmente mediante un ejemplo. w La primera consulta es una simple consulta de resumen.. SQL resuelve la consulta como sigue: 1. el argumento de la función de columna debe ser un nombre simple de columna.OO€ \~ 108 ¿ Cuál es el importe medio de los pedidos? SELECT AVG(IMPORTE) FROM PEDIDOS AVG(IMPORTE) 8.477.00€ 1025. Considérense estas dos consultas: I NUM.350.694.OO€ 7. Condensan todos los datos detallados del infonne en una única fila de datos de resumen. Tabla PEDIDOS Consultas de agrupación (cláusula GROUP BY) I ilDlil Al.192 SOL. PEDIOO RE' IMPORTE .OO€ 193 ¿ Cuántas oficinas de ventas tienen representalltes que superen sus cuolas? 5ELECT COUNT(DISTINCT OFICINA_REPI FROM REPRESENTANTES WHERE VENTAS > CUOTA COUNT(DISTINCT OFICINA_REP) 4 El estándar SQLl especifica que cuando se use la palabra clave DISTINCT.00€ 2. todos los pedidos tienen el mismo valor en la columna REP.3.566.479. La cláusula GROUP BY de la instrucción SELECT proporciona esta capacidad. La única excepción es que D1STINCT se puede especificar una segunda vez dentro de una subconsulta (contenida dentro de la consulta).000.100. I f-i 10.925. Si se especifica antes de la lista de selección.50€ 110 1l.00€ Funcionamiento de una consulta de agrupación.OO€ 45.OO€ 103 1.350. Manual de referencia Capítulo 8: Consultas de resumen ¿ Cuál es el importe medio de los pedidos de cada representante? SELECT REP.OOE 8.3 muestra cómo funciona la segunda consulta. como en los ejemplos anteriores de este capítulo.OOE 750. El estándar SQL2 relaja estas restricciones. El estándar permite la palabra clave DISTINCT en las funciones de columna SUM () y AVG (). no puede ser una expresión.100.'RT" 106 16.00€ 652.376. la palabra clave D1ST1NCT se puede especificar sólo una vez en una consulta.OO€ 105 7.00E M.00€ 1.876.

000. 5.n?mlnan columnas de agrupación de la consulta. Si la instrucción es una UNION de instrucciones SELECT. Las columnas listadas en la clausula . Si hay una cláusula HAVING. 7. y genera una única fila resumen de. de forma que las filas de cada grupo tengan idénticos valores en todas las columnas de agrupación. COUNT(*) FROM REPRESENTANTES GROUP BY OFICINA_REP OFICINA_REP COUNT{*) NULL 11 12 13 21 22 1 4. l. usar el valor de la columna en la fila en curso (o grupo de filas). Si la cláusula FROM lista una única tabla.GROUP BY se de. Para una referencia a columna simple. Si hay una cláusula GROUP BY. aplicar su condición de búsqueda a cada fila de la labia producto. Si la instrucción es la UNION de instrucciones SELECT. MAX(CUOTA) NULL 300. el producto es esta tabla.OO€ 350. Para cada grupo. Para una función de columna. Para generar los resultados de una consulta de una instrucción SELECT: BY. resultados. conservando los grupos para los que la condición de búsqueda es TRUE (y descartando aquellos para los que la condición es FALSE o NULL). 8.000.000. usar el conjunto completo de resultados.00€ 200.000. porque determman cómo se d¡Vlden las filas en grupos.OO€ 300.194 SOL. ORDER BY. REP _eLI COUNT{DISTINCT NUM_CLI) CLIENTES DEL REPRESENTANTE REP_CLI 3 clientes del representante 4 clientes del representante 9.000. expandido de nuevo para las consultas de agrupación. SQL calcula el valor medio de la columna IMPORTE para todas las filas del grupo.ooe 350. usar el grupo actual de filas como argumento. produciendo un único resultado para cada grupo. si se especificó GROUP BY. A continuación se muestran ejemplos adicionales de consultas de agrupación: ¿ Cuál es el rango de las cuotas asignadas en cada oficina? SELECT OFICINA_REP. Eliminar las filas duplicadas a menos que se especifique UNION ALL. ¿ Cuántos representantes están asignados a cada oficina? SELECT OFICINA_REP. 6.ooe 2. Si hay una cláusula se especifique.o00. aplicar su condición de búsqueda a cada grupo de filas. ordenar los resultados de la consulta como 101 102 Las filas generadas por este procedimiento forman los resultados de la consulta. FROM REPRESENTANTES GROUP BY OFICINA_REP MIN(CUOTA) NULL 11 12 13 21 22 NULL 275.tablas fuente e? una única fila de resume.000. Cuando está presente la cláusula GROUP BY. Una consulta que incluya una cláusula GROUP BY se denomina consulta de agrupación porque agrupa los datos de sus . Para cada fila restante (o grupo de filas).000. conservando las filas para las que la condición de búsqueda es TRUE (y descanando aquellas para las que la condición es FALSE o NULL). 3. dice a SQL que divida los resultados detallados en grupos y que aplique la función de columna separadamente a cada grupo. eliminar cualquier fila duplicada que se haya producido en el resultado. Manual de referencia 3 1 2 2 Capítulo 8: Consultas de resumen clientes clientes clientes clientes del del del del representante representante representante representante 103 lO' 105 106 195 2.OO€ 350. ~ fila contiene el valor de la columna REP para el grupo y el Impone medio de los pedidos calculado. FROM CLIENTES GROUP BY REP_CLI •clientes del representante'.OO€ 300.000." por cada grupo de filas. calcular el valor de cada elemento de la lista de selección para producir una única fila de resultados. Formar el producto de las tablas listadas en la cláusula FROM. .OO€ 350. MIN(CUOTA). organizar las filas restantes de la tabla producto en dos grupos.OO€ 300. en caso contrario.000. Los siguientes pasos muestran las reglas para el procesamiento de consultas SQL. aplicar los pasos del 2 al 7 a cada una de las instrucciones para generar sus resultados individuales.oaE MAX{CUOTA) Hay un vínculo íntimo entre las funciones de columna SQL y la cláusula GROUP Recuérdese que las funciones de columna toman una columna de valores de datos y producen un único resultado. 2 3 1 2 1 ¿ Cuántos clientes diferentes atiende cada representante? SELECT COUNT (DISTINCT NUM_CLII. mezclar los resultados de la consulta de las ínstrucciones individuales en una única tabla de resultados. Si se especifica SELECT DISTINCT. Si hay una cláusula WHERE.

SUM(IMPORTE) PEDIDOS BY CLIENTE. La cláusula COMPUTE calcula los subtotales y los sub-subtotales.----.OO€ avg 3..B76. CLIENTE COMPUTE SUM(IMPORTE) . .. ordenados por cliente y.745. CLIENTE.OO€ Nótese que también es imposible obtener tanto resultados detallados como de resumen de una única consulta.OO€ sum 3 _978. AVG(IMPORTE) BY REP RETRIEVING DATA REP CLIENTE 101 2102 2103 2111 35.. REP IMPORTE 3.--.00€ 7. pero se puede omitir esta ordenación con una cláusula ORDER BY. dentro de cada cliente.700.OO€: 2101 2102· 2103 2106 2107 106 101 105 102 110 1.000.4SB.S0Q..OO. REP BY CLIENTE.OO€ 3.OO€ 3.OO€ 31.132. REP.€ surn 26. Para obtener resultados detallados con subtotales o para obtener subtotales multinivel hay que escribir un programa de aplicación que use SQL para programación y calcular los subtotales en la lógica del programa.S00. ordena.. CLIENTE REP CLIENTE SUMIIMPQRTE) 101 101 101 102 102 102 103 105 105 2102 2108 2113 3. Es imposible crear grupos y subgrupos con dos niveles de subtotales en SQ~.700.O€. CLIENTE.196 SOL.OO€ . Capítulo 8: Consultas de resumen 197 Agrupación de múltiples columnas SQL puede agrupar los resultados de la consulta en términos de los contenidos de dos o más columnas. Los desarrolladores originales de SQL Server trataron esta limitación de SQL estándar añadiendo una cláusula COMPUTE opcional al final de la instrucción SELECT.QO€ 2106 2114 2120 2111 4.--. por representante" SELECT FROM GROUP ORDER CLIENTE.00€ sum 150. SELECT REP. SQL proporciona s610 un único nivel de agrupación.e los pedidos de cada cliente de cada representante. SELECT REP. Manual de referencia 210S 210S 2109 2111 2111 101 109 107 103 105 150.--101 2113 REP CLIENTE IMPORTE 22. En muchas implementaciones de SQL.978.745.500.582.978. dos por representante y.026.OO€: 23.750. la cláusula GROUP BY tendrá automáticamente el efecto colateral de ordenar los datos.3S0.OO€: -.628. FROM PEDIDOS SUM(IHPORTE) GROUP BY REP. OO€: REP CLIENTE 101 2108 IMPORTE 150. CLIENTE COMPUTE SUM(IMPORTEj BY REP.10S. por cliente.OO€: S.00€ Incluso con varias columnas de agrupación.OO€ 150.O€.. SB2.OO€ 2.... como se muestra a continuación: Calculflr el total cf. Lo mejor que se puede hacer es ordenar los datos de forma que las filas de los resultados de aparezcan en el orden apropiado. IMPORTE FROM PEDIDOS aRDER BY REP. dentro de cada representante.0€· 3.OO€ 22. 2.97B. OO€: 4.026.OO€ sum CLIENTE REP SUM(IMPORTE) 22. como se muestra en este ejemplo: CalcuLar el total de los pedidos de cada cliente de cada representante.00€ 15. La consulta produce una fila de resumen separada para cada par representante/cliente. Por ejemplo.OO€: 35.-. supóngase que se desean agrupar los pedidos por representante y por cliente. Esta consulta agrupa los datos basándose en ambos criterios: Calcular los pedidos totales para cad~ cliente de cada representante.

calc~la 1~ suma de los Error: «NOMBRE» no es una expresión GROUP BY Dada la naturaleza de los datos.oae: ----------. cada representante (un subtotal de alto nivel). Calcular el total de los pedidos de cada representante. que por definición tiene el mismo valor en cada fila del grupo • Una expresión que contenga combinaciones de lo anterior En la práctica. que incluyen tanto subtotales como sub-subtotales. Además. y de hecho ~s ~~lca en .00€ . que produce un único valor resumiendo las filas del grupo • Una columna de agrupación.oaE: 2106 102 2106 1.150.uro 4. Para corregir el problema se incluye simplemente la columna NOMBRE como una segunda columna de agrupación (redundante): Restricciones sobre las consultas de agrupación Las consultas de agrupación son sujeto de algunas limitaciones ~lgo estrictas. A la inversa. NOMBRE . SUM(IMPORTE) PEDIDOS. . Más precisamente.750.00€ REP CLIENTE IMPORTE --------.694. ¡no será posible decir qué fila de los resultados vienen de qué grupo! Otra limitación de las consultas de agrupación es que SQL ignora la información sobre las claves primarias y las externas al analizar la validez de una consulta de agrupación.130.896.776. la consulta se puede expresar de forma más sencilla usando SELECT DISTINCT. Además. Todos los elementos de la lista de selección deben tener un único valor para cada grupo de filas. No se pueden agrupar las filas en térmmos del valor de una expresión calculada. SQL informa de un error porque la columna NOMBRE no está especificada explícitamente como columna de agrupación. SELECT FROM WHERE GROUP NUM_EMPL.el dIalecto Transact-SQL usado en SQL Server.00€ También hay restricciones sobre los elementos que pueden aparecen en la lista de selección de una consulta de agrupación.--------------102 2114 1S.198 SOL. NOMBRE.00€ avg 5. Manual de referencia IMPORTE Capitulo 8: Consultas de resumen 199 REP CLIENTE 102 -----------.QO€ Calcular el total de los pedidos de cada representante. una consulta de agrupación siempre incluirá tanto una columna de agrupación como una función de columna en la lista de selección. la columna de agrupación NUM_EMPL es la clave primaria de la tabla REPRESENTANTES. como muestra el ejemplo.000. NOMBRE. Considérese esta consulta: . No obstante.uro 22. la consulta tiene perfectamente un buen sentido porque la agrupación del número de empleado de un representante es de hecho la misma agrupación que sobre el nombre del representante. Las columnas de agrupación deben ser columnas reales de las tablas h~tadas en la cláusula FROM ·de la consulta. REPRESENTANTES REP = NUM_EMPL BY NOM_EMPL La consulta proct!.--------2. Si no aparece ninguna función de columna.------------3.026. viola los prInCIpIOS báslcos de las consultas relacionales porque los resultados de la instrucción SELECT no son una tabla. esto significa que un elemento de selección de una consulta de agrupación puede ser: • Una constante • Una función de columna. SUM(IMPORTE) PEDIDOS. puede ser muy útil. si no se incluye una columna de agrupación en los resultados. La cláusula COMPUTE no es nada estándar. REPRESENTANTES REP = NUM_EMPL BY NUM_EMPL.e (un subtot~l de baJo nIvel) y calcula la suma de los pedidos y el importe medIO de los pedIdos de. SELECT FROM WHERE GROUP NUM_EMPL.OO€ .OO€ 102 REP CLIENTE IMPORTE 2120 suro 3. sino una combinación extraña de diferentes tipos de filas. pedidos de cada par cliente/representant. sin GROUP BY.uro 15. . . No obstante.000. Los resultados de la consulta contienen por tanto una mezcla de filas de detalle y de resumen.lce una fila de resultados por cada fila de la tabla PEDIDOS. Básicamente. ordenados pur CLIENTE dentro de REP. así que la columna NOMBRE debe tener un único valor en cada grupo.

QO€ 39.4 ilustra manejo de ANSI/ISO de los valores cláusula GROUP BY.132.00€ 2 2 3 2 2 Valores NULL en las consultas de agrupación Un valor NULL plantea un problema esp~cial cuando aparece en una columna de agrupación.OO€ 58.4.958.628.327.132.00€ 5B. .432. el resultado es NULL (no TRUE).OO€ 101 Daniel Ruidrobo 102 Susana Santos Bruno Arteaga Samuel Clavel Neus Azcárate León-Freire María Jiménez 22. Condiciones de búsqueda de grupos (cláusula HAVING) Al igual que la cláusula ~IHERE se puede usar para seleccionar y descartar las filas individuales que participan en una consulta.DO€ 103 Pablo Cruz NUM_EHPL NOMBRE NOMBRE Clara Luisa Herminio Samanta Juana Jorge María Paula Carlos José Susana Sandra PELO Marrón NULL NULL NULL NULL Marrón Marrón Marrón Marrón Marrón Rubio Rubio OJOS 2. En su lugar. si el número de empleado del representante no se necesita en los resultados de la consulta.00€ .00€ ·22. COUNT(*) FROM PERSONAS GROUP BY PELO.OO€ 32. es decir. no está implementado en todos los dialectos de SQL.00€ 34.628. Manuaf de referencia SUM (IMPORTE) Capítulo 8: Consultas de resumen 201 -------------------------------------26. ¿en qué grupo se deberla situar la fila? En la cláusula WHERE.OO€ 110 Tomás Saz Por supuesto. SELECT FROM WHERE GROUP NOMBRE NOMBRE. esta regla no es muy útil.7DQ.00€ 2. OJOS. La pequeña tabla de Aunque este comportamiento de los valores NULL en la agrupación de columnas está especificado claramente en el estándar ANSI/ISO.00€ 32. como se muestra en esta consulta: SELECT PELO.327.432.633.26.Ooe 23. SUM(IMPORTE) PEDIDOS.633. se puede eliminar completamente de la lista de selección. que consiste en la palabra clave HAVING seguida de una condición de búsqueda. ejemplo de la Figura 8. En la práctica. OJOS PELO Marrón NULL NULL Marrón Marrón Marrón OJOS COUNT(*) Azul Azul NULL NULL Marrón Marrón 1 el NULL en la --------------------------- Bruno Arteaga Daniel Ruidrobo León Freire María Jiménez Neus Azcárate Pablo Cruz samuel Clavel Susana Santos Tomás Saz 39. se agrupan en el mismo grupo de filas. La cláusula HAVING especifica así una condición de búsqueda para grupos.OO€ 105 106 107 lOa 109 7.700. Si el valor de la columna es desconocido. El formato de la cláusula HAVING es paralelo al de la cláusula WHERE. Conviene construir una pequeña tabla de test y comprobar el comportamiento de cada SGBD en particular antes de confiar en ningún comportamiento específico.taS.776. La tabla PERSONAS. Si dos filas tienen valores NULL en las mismas columnas de agrupación" e idénticos valores en todas sus columnas de agrupación con valbres diferentes de NULL. los dos valores NULL no se consideran iguales. REPRESENTANTES REP = NUM_EMPL BY NOMBRE SUM (IMPORTE) Figura 8.200 SOL.105. la cláusula HAVING se puede usar para seleccionar y descartar los grupos de filas.958. el estándar SQL de ANSI/ ISO SQL considera que dos valores NULL son iguales para los propósitos de la cláusula GROUP BY. cuando se comparan dos valores NULL diferentes. dando: Azul Azul Azul NULL NULL NULL NULL NULL NULL Marrón Azul Azul Calcular el total de los pedidos de cada representante.00€ 7.00€ 23. Aplicar el mismo convenio a la cláusula GROUP BY forzaría que SQL reemplazase cada fila con una columna de agrupación NULL en un grupo separado por sí mismo.776.00€ 34.

000.420.00€ "" +(stni CA.nI CANTIDM) 4. Tabla AGRUPADA NmLPEOIDO Tabla AGRUPADA 112961 112989 112975 113057 106 106 "" IMPORTE 31. Finalmente. eliminar cualquier fila duplicada que se haya producido en el resultado.637..000. Si hay una cláusula GROUP BY.925. T: bt PEDIDOS . usar el valor de la columna en la fila en curso (o grupo de filas).5.00E: Navarra 575.00€ GROO? BY RE? HAVING SUM(IMPORTE} REP AVG(IMPORTE) 105 106 107 108 7. como se describió en los capítulos 6 y 9. GROUP . t 1l30S1 113045 113013 113024 113007 112992 113049 Si la instrucción es la UNION de instrucciones SELECT. Manual de referencia 203 Un ejemplo proporciona la mejor forma de comprender el papel de la cláusula HAVING.458. la cláusula SELECT calcula el Importe medIO de los pedidos para cada grupo restante y genera los resultados de la consulta. Funcionamiento de una condición de búsqueda de grupos.865.00€ 2. calcular el valor de cada elemento de la lista de selección para producir una única fila de resultados. Para cada fila restante (o grupo de filas).OO€ 835. Si se especifica SELECT DISTINCT.VENTAS) 735.OO€ 692. Si la cláusula FROM lista una única tabla. conservando las filas para las que la condición de búsqueda es TRUE (y descartando aquellas para las que la condición es FALSE o NULL).OO€ León 700.79. Para una función de columna. aplicar su condición de búsqueda a cada grupo de filas. aplicar los pasos del 2 al 7 a cada una de las instrucciones para generar sus resultados individuales.00€ 652.00€ 776.. conservando los grupos para los que la condición de búsqueda es TRUE (y descartando aquellos para los que la condición es FALSE o NULL).os en el gru~o no exceda los 30.Capítulo 8: Consultas de resumen 202 SOL.479. ~ I < 7.00€ 4S.042. 40€ 16.14€ > 30000. REPRESENTANTES OFICINA ~ OFICINA_REP BY CIUDAD COUNT(*) >= 2 SUM{CUOTA) SUM (REPRESENTANTES . 3.00€ 600. usar el grupo en curso de filas como argumento si se especific6 GROUP BY. de forma que las filas de cada grupo tengan idénticos valores en todas las columnas de agrupación. aplicar su condición de búsqueda a cada fila de la tabla producto. Considérese esta consulta: ¿Cuál es eL importe medio de fas pedidos de cada representante los cuyos pe· didas superan los 30.00€ 7. La cláusula HAVING elimina después cualquier grupo donde el total de los pedid. en caso contrario.000. Figura 8. AVG(IHPORTEI PROM PEDIDOS Las condiciones de búsqueda que se pueden especificar en la cláusula HAVING son las mismas que las usadas en la cláusula WHERE.376. .915. Para una referencia a columna simple. Castellón 775.000 E ? \ 5. Si hay una cláusula HAVING. La cláusula GROUP BY organiza primero los pedidos en grupos por represent~nte.. usar el conjunto completo de resultados.33€ 8. . organizar las filas restantes de la tabla producto en dos grupos.~I~r 106 >30.100. Si hay una cláusula WHERE. el producto es esta tabla.000.<:.!>OO.477.000 €? 5ELECT RE?.000 €.100. A continuación se muestra otro ejemplo del uso de una condición de búsqueda de grupos: Para cada oficina con dos O más personas.5 muestra gráficamente cómo resuelve SQL la consulta. VENTASJ OFICINAS.00€ 2. oo€ 1l.00€ F""" 6. Para generar los resultados de una consulta de una instrucción SELECT: 1. SUM (REPRESENTANTES. expandidos de nuevo para incluir las condiciones de búsqueda de grupos.OO€ 1. SUM(CUOTA) .00€ ~ -+(SUM CANTlOAD) >30.00 . 2.000 E ? Sl.00€ Los siguientes pasos muestran las reglas para el procesamiento de consultas SQL. calcular la cuota total y las ventas totales para lodos los representantes que trabajan en ella. ~g: I < 108 108 108 108 108 1.00€ 760. Formar el producto de las tablas listadas en la cláusula FROM. i La Figura 8. SELECT FROM WHERE GROUP HAVING CIUDAD CIUDAD. H.

Ordena los resultados de la consulta de forma que los productos con el mayor stock aparecen en primer lugar. 4.OO€ 50-kg brazo 37 PRECIO STOCK SUM(CANTIDAD) 15 12 5 30 16 15 22 Para procesar esta consulta. PRECIO. Realmente no contribuyen en nada al proceso de agrupación ID_FAB e ID_PRODUCTO especifican completamente una única fila de la tabla PRODUCTOS. Como se describió anteriormente. DESCRIPCION. la condición de búsqueda de la cláusula HAVING puede producir uno de estos tres resultados: • Si la condición de búsqueda es TRUE. Elimina los grupos donde la cantidad pedida (el total de la columna CANTIDAD para todos los pedidos del grupo) es menor que el 75 por ciento de la de stock.OO€ Reductora 25. Genera una fila de resumen de resultados para cada grupo. Reúne las tablas PEDIDOS y PRODUCTOS para determinar la descripción. . Agrupa las filas resultantes por oficina. Eliminar las filas duplicadas a menos que se especifique UNIQN ALL. las condiciones de búsqueda de grupos La cláusula HAVING se usa para incluir o excluir grupos de filas de los resultados. PRECIO y STOCK se deben especificar como columnas de agrupación en esta consulta. la condición de búsqueda se trasladaría a la cláusula WHERE y se aplicaría a filas individuales. QRDER BY. La forma más sencilla de determinar si una condición de búsqueda pertenece a la cláusula WHERE O a HAVING es recordar cómo se aplican las dos cláusulas: • La cláusula WHERE se aplica afilas individuales. STOCK. la condición de búsqueda de la cláusula HAVING incluirá siempre al menos una función de columna.OOE Zapata grande 243.75 • STOCK) ORDER BY STOCK DESC = STOCK DESCRIPCION ----------------------------------------------32 38 355. DESCRIPCION. el precio y stock de cada producto pedido. stock y cantidad total en orden para cada producto en que la cantidad total del pedido sea mayor que el 75 por ciento del stock. 3. que por definición tiene el mismo valor en cada fila del grupo • Una expresión que contenga una combinación de lo anterior En la práctica. SUM{CANTIDAD) FROM PRODUCTOS. Si no. Agrupa las filas resultantes por fabricante e identificador de producto. así que la condición de búsqueda que especifica debe ser una que se aplique al grupo completo.OO€ Riostra 1. 4. 6. SQL realiza conceptualmente los siguientes pasos: . que usa todas las cláusulas de la instrucción SELECT: Mostrar el precio. A continuación se muestra otro ejemplo más.204 8. 2.OO€ Montura del motor 4.500. así que las expresiones que contiene se deben poder calcular sobre grupos de filas. Calcula la cuota total y las ventas totales para cada grupo. Manual de referencia Capítulo 8: Consultas de resumen 205 Si la instrucción es una UNIQN de instrucciones SELECT. el grupo de filas se conserva y contribuye como una fila de resumen a los resultados.425. PEDIDOS WHERE FAB = ID_FAB AND PRODUCTO ID~PRODUCTO GROUP BY ID_FAB" ID_PRODUCTO. así que las expresiones que contiene se deben poder calcular sobre filas individuales. Valores NULL Y condiciones de búsqueda de grupos Al igual que la condición de búsqueda de la cláusula WHERE. mezclar los resultados de la consulta de las instrucciones individuales en una única tabla de resultados. HAVING SUM(CANTIDAD) > (. Siguiendo este procedimiento. haciendo automáticamente que las otras tres columnas tengan un único valor en cada grupo. Restricciones sobre. PRECIO. SELECT DESCRIPCION. ordenar los resultados de la consulta como Las filas generadas por este procedimiento forman los resullados de la consulta. 2. • La cláusula HAVING se aplica a grupos de filas. SQL maneja la consulta del ejemplo anterior como sigue: 1. Reúne las tablas OFICINAS Y REPRESENTANTES para encontrar la ciudad en la que trabaja cada representante. Calcula la cantidad total pedida por cada grupo. Elimina los grupos con dos o menos filas . 3. en lugar de a filas individuales. 1. 9. Si hay una cláusula se especifique. Esto significa que un elemento que aparezca dentro de la condición de búsqueda en una cláusula HAVING puede ser: • Una constante • Una función de columna que produce un único valor que resume las filas del grupo • Una columna de agrupación. 5. SOL. sólo porque aparecen en la lista de selección.representa las oficinas que no cumplen el criterio de la cláusula HAVING.

porque se acerca a la descripción en lenguaje natural de la consulta.en la condició~ de búsqueda son las mismas que en la cláusula WHERE. las funcion~s de columna de la cláusula HAVING se aplican a un. y el grupo c~nsiste en todas las filas. resumiendo todas las filas de una tabla o un conjunto reunido de tablas. se descarta el grupo de filas y no contribuye a ninguna fila de resumen de los resultados. Manual de referencia • Si la condición de búsqueda es FALSE. En otras palabras. porque permiten dividir la consulta en piezas (la consulta y sus subconsultas) y después componerlas de nuevo. contar el número de valores de datos en una columna o contar el número de filas de resultados de la consulta. se descnbieron en el CapItulo 6. • Una consulta de resumen con una cláusula GROUP BY genera múltiples filas de resultados cada una resumiendo las filas de un grupo en concreto. SQL considera el conjunto completo de resultados detallados de la consulta en un único grupo. Uso de las subconsultas Una subconsulta es una consulta dentro de otra. el mínimo y el máximo de una columna. ésta aparece dentro de una cláusula WHERE o HAVING de otra instrucción SQL.Si aparece una cláusula HAVING sin una cláusula GROUP BY. • Las subconsultas hacen más fácil la escritura de las instrucciones SELECT. • Las funciones de columna pueden calcular la media. El SGBD usa los resultados de la subconsulta para determinar los resultados de la consulta de alto nivel que contiene a la subconsulta. que resumen datos de la base de datos: • Las consultas de resumen usan funciones de columna SQL para colapsar una columna de valores de datos en un único valor que resume la columna. pero la sintaxis de la instrucción SELECT no 1. grupo para determInar si el grupo se incluye o excluye de los resultados. La cláusula HAVING se usa casi siempre en conjunción con la cláusula GROUP BY. la suma. Resumen En este capítulo se han descrito las consultas de resumen. En las formas más simples de una subconsulta. Las subconsultas en SQL permite usar los resultados de una consulta como parte de otra. pero desempeñan un papel importante en SQL por tres motivos: • Una instrucción SQL con una subconsulta es a menudo la forma más natural de expresar una consulta. que expanden sustancialmente la capacidad de SQL para realizar incluso las operaciones más complejas de bases de datos. Las primeras secciones de este capítulo describen las subconsultas y muestran cómo se usan en las cláusulas WHERE y HAVING de una instrucción SQL. • La cláusula ~AVING actúa como una cláusula WHERE para grupos. Las últimas secciones de este capítulo describen las capacidades avanzadas de expresión de consultas que se han añadido al estándar SQL2. CAPíTULO 9 Subconsultas y expresiones de consultas HA VING sin GROUP BY .0 requiere.206 SOL. seleccionando los grupos de filas que contribuyen al resumen de los resultados de la consulta. y sólo un. Las anomalías que ocurren con los valores NU~L . • Si la condición de búsqueda es NULL.. • Algunas consultas no se pueden expresar en el lenguaje SQL sin el uso de una subconsulta. se descarta el grupo de filas y no contribuye a ninguna fila-de resumen de los resultados. • Una consulta de resumen sin una cláusula GROUP BY genera una única fila de resultados. El uso de una cláusula HAVING sin la cláusula correspondiente GROUP BY se ve rara vez en la práctica. La capacidad de usar una consulta dentro de una consulta fue el motivo original de la palabra «estructurado» en el nombre <<lenguaje estructurado de consultas» (Structured Query Language. Las subconsul- 207 . SQL). Las subconsultas son menos conocidas que las reuniones de SQL.

La consulta externa (la consulta principal) compara el objetivo de la oficina con el total calculado y decide si añade la ofi~ina a los resultados de la consulta principal. una subconsulta debe producir una única fila de datos como resultado.+ PROM fespecificac:ón-de+tablas I L-. ¿Cómo se pueden poner los resultados de esta consulta en la consulta anterior en lugar de los signos de interrogación? Podría ser razonable comenzar con la primera consulta y reemplazar «???» por la segunda consulta.1 muestra la forma de una subconsulta SQL. y realizan sus funciones normales cuando se usan dentro de una subconsulta. A continuación se muestra un ejemplo de tal solicitud: Concepto de subconsulta La Figura 9. por ejemplo. La forma de estas cláusulas en una subconsulta es idéntica a la de la instrucción SELECT. Parece razonable que la instrucción SELECT que expresa la consulta pueda ser corno: SELECT CIUDAD FROM OFICINAS WHERE OBJETIVO > ??? El valor «???» se debe rellenar y debe ser igual a la suma de las cuotas de los representantes asignados a la oficina en cuestión. no obstante.-------" elemento-de- DISTINCT Pero sería poco eficaz tener que escribir esta consulta. como sigue: SELECT CIUDAD· FROM OFICINAS WHERE OBJETIVO> (SELECT SUM(CUOTA) FROM REPRESENTANTES WHERE OFICINA_REP ~ OFICINA) L. WHERE condición-de-búsqueda ~ ~GROUP BY De hecho. ésta es una consulta SQL formada correctamente.208 SOL. La solicitud pide una lista de oficinas de la tabla OFICINAS donde el valor de la columna OBJETIVO cumple alguna condición.¡. el número de oficina 21) se puede obtener con esta consulta: SELECT SUM(CUOTA) FROM REPRESENTANTES WHERE OFICINA_REP ~ 21 r-ISELECT -t: ALL =r I!. la consulta principal y la subconsulta expresan la solicitud original y recuperan los datos solicitados de la base de datos. Las subconsultas SQL aparecen normalmente como parte de las cláusulas WHERE o HAVING. Manual de referencia Capítulo 9: Subconsultas y expresiones de consultas 209 tas proporcionan una forma natural y. algunas diferencias entre una subconsulta y un instrucción SELECT real: • En la mayoría de los usos comunes. GROUP BY Y HAVING. Listar las oficinas en las que el objetivo de ventas exceda la suma de las cuotas de cada representante.:Ción -'n'. sin embargo. la consulta intema (la subconsulta) calcula la suma de las cuotas de los representantes que trabajan en esa oficina. escribir los resultados y escribir en la consulta anterior la cantidad correcta. Figura 9. • Diagrama sintáctico de las subconsuJtas. Por cada oficina. En la cláusula HAVING ayudan a seleccionar grupos de filas que aparecen en los resultados de la consulta. Hay... En la cláusula WHERE ayudan a seleccionar filas individuales que aparecen en los resultados. eficiente de manejar las solicitudes de consultas que se expresan en términos de los resultados de otras. Al trabajar juntas.1. - . tiene la forma familiar de una instrucción SELECT. con una cláusula FROM y cláusulas opcionales WHERE. L columnas-de- agrU~aCión ~ ~ ~HAVING condición-de-búsqueda ~ ) . La subconsulta se encierra entre paréntesis. Esto significa que una subconsulta casi siempre tiene un único elemento de selección en su cláusula SELECT.. ¿Cómo se puede especificar ese valor en la consulta? Por el Capítulo 8 se sabe que la suma de las cuotas de una oficina determinada (digamos.

2.000..} FROM OFICINAS}) En este caso la subconsulta calcula la suma de los objetivos de ventas de todas las oficinas para determinar el objetivo total de la empresa. pañía. la subconsultas no son tan simples. Manual de referencia Capítulo 9: Subconsultas y expresiones de consultas 211 • La cláusula üRDER BY no se puede especificar en una subconsulta.000 € en la base de datos de ejemplo). Los resultados de la subconsulta se usan internamente en la consulta principal y nunca son visibles para el usuario.. calculando el importe de cuota umbral (275. La Figura 9. una subconsulta no puede ser la UNION de varias instrucciones SELECT diferentes. en cualquier caso.00 Tabla REPRESENTANTES Subconsulta L. como se describe más adelante en la sección «Consultas avanzadas en SQL2». La subconsulta produce un valor diferente para cada oficina..2 muestra Tabla REPRESENTANTES Listar los representantes cuya cuota sea menor que ella por ciento de los objetivos totales de la empresa. A continuación se muestra un ejemplo de una subconsulta simple: En este caso (más normal). En este caso simple la subconsulta produce el mismo valor para cada fila de la tabla REPRESENTANTES.. y llevando a cabo la consulta principal usando este número en una consulta WHERE simple: WHERE CUOTA < 275000 " n " " B Daimiel Navarra Castellón Almeria Le6n 300. Este valor se usa después en la condición de búsqueda para comprobar cada fila de la tabla REPRESENTANTES y encontrar los nombres requeridos.000. .00€ BOO. Funcionamiento de la subconsulta en la cláusula 1'1HERE. así que tiene poco sentido.OOO. SELECT NOMBRE FROM REPRESENTANTES WHERE CUOTA < (.00 575. el valor de CUOTA de cada representante se compara con el mismo número de la com.0{~ELECT SUM (CumA) } >7 FROM REPRESENTANTES l'o'HERE OFICINI\. Por ejemplo.REP . que se multiplica por el 10 por ciento para detenninar la cuota de venta umbral para la consulta. Estas referencias externas se describen en detalle más adelante en la sección «Referencias externas». SELECT CIUDAD PROM OFICINAS WHERE OBJETIVO> (SELECT SUM(CUOTA) FROM REPRESENTANTES WHERE OFICINA~REP = OFICINA) CIUDAD Castellón León Subconsultas en la cláusula WHERE Las subconsultas se usan más frecuentemente en la cláusula WHERE de una instrucción SQL. considérese de nuevo la consulta de la sección anterior: Listar las oficinas para las que el objetivo de ventas supere la suma de las cuotas de cada representante.) Es más conveniente usar la subconsulta.1 * (SELECT SUM(OBJETIVO) NOMBRE Bernardo Sánchez -+@{:"= "'" ''"0'". la subconsulta no se puede calcular una vez para toda la consulta. pero no es esencial. 21 Figura 9. Cuando aparece una subconsulta en la cláusula WHERE. Las subconsultas más simples aparecen dentro de una condición de búsqueda y producen un valor que se usa para comprobar la condición de búsqueda. • En la mayoría de implementaciones. s610 se permite una única SELECT.000. (El estándar SQL2 permite expresiones de consultas mucho más potentes y alivia esta restricción. De hecho.00€ 725. Usualmente.000. en términos de las cuotas de los representantes para esa oficina en particular. funciona como parte del proceso de selección de filas.ftEP ~ 22 .OO€ 350.' >? Tabla OFICINAS OFICINA CIUDAD OilJETIVO Subconsulta PROM REPRESENTANTES WHERE OFlCINJ\. • Los nombres de columna que aparecen en una subconsulta pueden hacer referencia a columnas de tablas de la consulta principal. se podría realizar esta consulta realizando primero la subconsulta.210 SOL. ordenarlas.

>. <=. SQL va por las filas de la tabla OFICINAS una a una. Manual de referencia Capítulo 9: Subconsultas y expresiones de consultas 213 conceptualmente cómo realiza SQL la consulta. la oficina que se está comprobando en la cláusula WHERE de la consulta principal-o La subconsulta hace esto examinando la tabla REPRESENTANTES. En cambio. Para comprobar el valor de OBJETIVO. Además. El Capítulo 6 describió las condiciones simples de búsqueda que se pueden usar en estas cláusulas. Diagrama sintáctico del test de comparación en subconsultas. y la cláusula WHERE compara el número con el valor de OBJETIVO. (SELECT SUM(CUOTA) FROM REPRESENTANTES WHERE OFICINA_REP = OFICINA) I I l' l' I El papel de la subconsulta en esta instrucción SELECT es calcular la cuota total de los represenFantes que trabajan en una oficina en concreto -específicamente. como se muestra en la Figura 9. una vez por cada fila comprobada en la cláusula WHERE de la consulta principal. - ~ .subconsulta---+-. >=) Este test de comparación en subconsultas es una forma modificada del test simple de comparación. Como muestra el ejemplo anterior. Comprueba si la subconsulta produce alguna fila de resultados. <.alor de la columna en una referencia externa se toma de la fila que se está comprobando en la consulta principal. usa el valor de OFICINA de la fila actual cuando realiza la subconsulta.212 SOL. seleccionando o descartando la oficina en curso en términos de la comparación. el nombre de columna hace referencia a una columna de una tabla especificada en la cláusula FROM de la consulta principal. Referencias externas Dentro del cuerpo de una subconsulta es necesario a menudo hacer referencia al valor de una columna de la fila actual de la consulta principal. cuando el SGBD examina la condición de búsqueda de la subconsulta. Comprueba si el valor de una expresión coincide con uno de los valores del conjunto producido por la subconsulta. la mayoría de productos SQL ofrecen estas condiciones de búsqueda en las subconsultas: • Test de comparación en subconsultas. La cláusula WHERE compara el valor de la columna OBJETIVO de la fila en curso con el valor producido por la suhconsulta. como en el siguiente ejemplo. Pero obsérvese que la columna OFICINA de la cláusula WHERE de la subconsulta no hace referencia a ninguna columna de la tabla REPRESENTANTES. Al ir por cada fila de la tabla OFICINAS.3. La subconsulta produce un único número. Compara el valor de una expresión con cada uno de los valores del conjunto producido por una subconsulta. Considérese de nuevo la consulta de las secciones anteriores: Listar las oficinas para las que el objetivo de ventas supere la suma de las cuotas de sus representantes. que es un nombre de columna que no se refiere a ninguna de las tablas listadas en la cláusula FROM de la subconsulta en la que aparece el nombre de columna. SQL lleva a cabo la subconsulta encontrando la suma de las cuotas de los representantes de la oficina en curso. • Tests cuantificados. que es parte de la consulta principal. • Test de pertenencia al conjunto devuelto por una subconsulta. Este test se parece al test simple de comparación. SELECT CIUDAD FROM OFICINAS WHERE OBJETIVO> El test de comparación en subconsultas !=. ---expresión --. Este test se usa para comparar el valor de la fila que se está comprobando con un único valor producido por la subconsulta.'r-<> ----. Compara el valor de una expresión con el valor producido por la subconsulta. < <= > >= Figura 9. La columna OFICINA de esta subconsulta es un ejemplo de una referencia externa. Condiciones de búsqueda en las subconsultas . • Test de existencia. hace referencia a una columna de la tabla OFICINAS. el v. Este test se parece al test simple de pertenencia a conjuntos. La consulta principal obtiene sus datos de la tabla OFICINAS y la cláusula WHERE selecciona las oficinas que se incluirán en los resultados de la consulta. Como muestra la figura. SQL lleva a cabo repetidamente la subconsulta. aplicando el test establecido en la cláusula WHERE. <>. Las subconsultas aparecen usualmente como parte de la condición de búsqueda de una cláusula WHERE o HAVING. Compara el valor de una expresión con el valor producido por una subconsulta y devuelve un resultado TRUE si la comparación es cierta.-.3.

STOCK PRODUCTOS IO_FAB : 'ACI' STOCK> (SELECT STOCK FROM PRODUCTOS WHERE IO_FAB : 'ACI' AND ID_PRODUCTO: '41004') .. en lugar de a un único valor.) disponibles para el test de comparación. SELECT NOMBRE FROM REPRESENTANTES WHERE CUOTA >= (SELECT OBJETIVO FROM OFICINAS WHERE CIUDAD = 'Almería') NOMBRE El test de comparación en subconsultas especificado por el estándar SQLl e incluido por todos los productos SOBO líderes permite que una subconsulta aparezca sólo en la parte derecha del operador de comparación. Sin embargo. como se muestra en la Figura 9. .:. cable Serie 2. >. <>. Esta comparación: A < (subconsulta) Bruno Arteaga Susana Santos León Freire se permite. <=. De hecho.4. Por razones de transportabilidad. como se han descrito. el test de comparación devuelve NULL (desconocido). La subconsulta especificada en este test debe producir un único valor del tipo de datos apropiado -es decir. Esto no limita la capacidad de los tests de comparación.A. El valor se usa después para seleccionar a los representantes cuyas cuotas son superiores al objetivo obtenido. el estándar SQL2 va mucho más allá y permite que se aplique un}est de comparación a una fila completa de valores. El test de pertenencia a conjuntos (IN) en subconsultas es una forma modificada del test de pertenencia a conjuntos simple.subconsulta LNOT-I . Compara Listar todos los productos del fabricante AC/ para los que su stock está por encima del stock del producto ACI-41004. significa que a veces se debe invertir la lógica del lenguaje natural para obtener una forma de la solicitud en una instrucción SQL legaL El estándar SQL2 eliminó esta restricción y permite que la subconsulta aparezca en cualquier lado del operador de comparación. >. subcon~ Figura 9. pero esta otra: La subconsulta del ejemplo devuelve el objetivo de ventas de la oficina de AImería. A continuación se muestran más ejemplos de este test: (subconsulta) > A no se permite.4.--IN-----.expresión-de-test ¡--. debe producir una única fila de resultados conteniendo exactamente una columna-o Si la subconsulta produce varias fiJas o varias columnas. la comparación no tiene sentido y SQL informa del error. Sin embargo.214 SOL Manual de referencia DESCRI PC ION Serie 3.. SELECT FROM WHERE ANO OESCRIPCION. El test de comparación en subconsultas ofrece los mismos seis operadores de comparación (=. <. Si la subconsulta no produce filas o produce un valor NULL. cable Capítulo 9: Subconsultas y expresiones de consultas STOCK 207 277 167 215 Listar los representantes cuyas cuotas son iguales o superiores al objetivo de la oficina de ventas de Almeria. porque el operador en cualquier comparación de desigualdad siempre se puede dar la vuelta de forma que la subconsulta se sitúe en la parte derecha de la desigualdad.. cable Serie 1. no se incluye de forma unifonne en las versiones actuales de los principales productos SQL. SELECT EMPRESA FROM CLIENTES WHERE REP_CLI (SELECT NUM_EMPL FROM REPRESENTANTES WHERE NOMBRE: 'Bruno Arteaga') El test de pertenencia a conjuntos (IN) EMPRESA Acme Toledo S. es mejor escribir consultas que se adecuen a las restricciones de SQLl. Esta y otras características más avanzadas de expresión de consultas se describen en las últimas secciones de este capítulo. Diagrama sintáctico del test de pertenencia a conjuntos en su Itas (IN). Listar"todos los clientes a los que sirve Bruno Arteaga.

A continuación se muestra un ejemplo de una solicitud que se puede expresar de forma natural con un test de existencia: Listar los productos para los que se haya recibido un pedido de 25. SELECT NOMBRE FROM REPRESENTANTES WHERE OFICINA-REP NOT IN (SELECT OFICINA FROM OFICINAS WHERE JEF = 108) NOMBRE Bruno Arteaga Maria Jiménez Samuel Clavel Bernardo Sánchez Daniel Ruidrobo Pablo Cruz El test de existencia (EXISTS) El test de existencia (EXISTS) comprueba si una subconsulta produce alguna fila como resultado de la consulta. A continuación se muestra un ejemplo simple: Listar los represemames que trabajan en oficinas que esIán por encima de sus objetivos. La forma de la subconsulta del test IN funciona exactamente igual que el test simple IN. No hay ningún test de comparación simple que se parezca al test de existencia. Manual de referencia Capítulo 9: $ubconsultas y expresiones de consultas SELECT EMPRESA FROM CLIENTES WHERE NUM_CLI IN (SELECT FROM WHERE ANO AND AND EMPRESA Acme Ace Internacional Henche & L6pez JCP S.216 SOL. La solicitud se podría reescribir fácilmente como: Listar los productos para los que existe al menos un pedido en la tabla PEDI· DOS de forma que (a) sea para el producto en cuestión). Listar t040s los clientes que han formulado pedidos de zapatas de ACI (fabricante ACI. 13 y 21).5. LNcrr~ Figura 9. > 217 un único valor de datos con una columna de valores de datos producidos por una subconsulta y devuelve un resultado TRUE si el valor de dalos coincide con uno de los valores de la columna. como se muestra en la Figura 9.000 €. Este test se usa cuando es necesario comparar un valor de la fila que se está comprobando con un conjunto de valores producido por una subconsulta. A continuación se muestran otros ejemplos de subconsultas que comprueban la pertenencia a conjuntos: Listar los represimtantes que no trabajan en oficinas dirigidas por León Freire (empleado lOS). Diagrama sintactico del test de existencia (EXISTS).A.000 € o más. ~EXISTS subconsulta . La subconsulta produce un conjunto de números de oficina donde las ventas SQn superiores a sus objetivos (en la base de datos de ejemplo hay tres de estas oficinas con números 11. excepto en que el conjunto de valores se produce por una subconsulta. y la cláusula WHERE de la consulta principal comprueba si un valor de una fila de la consulta principal coincide con uno de los valores de la columna. (b) tenga un importe de al menos 25.5. - . números de producto que comienzan en 4100) entre enero y junio de 1990. en lugar de listarse explícitamente en la instrucción. La consulta principal comprueba a continuación cada fila de la tabla REPRESENTANTES para determinar si un representante en concreto trabaja en una oficina con uno de estos números. SELECT NOMBRE FROM REPRESENTANTES WHERE OFICINA_REP IN (SELECT OFICINA FROM OFICINAS DISTINCT CLIENTE PEDIDOS FAB = 'ACI' PRODUCTO LIKE '4100%' FECHA_PEDIDO BETWEEN '01-ENE-90' '30-JUN-90') WHERE VENTAS NOMBRE OBJETIVO) Maria Jiménez Samuel Clavel Bruno Arteaga Susana Santos León Freire En cada uno de estos ejemplos la subconsulta produce una columna de valores de datos.. se usa sólo con subconsultas..

Ambos tests comparan un valor de datos con la columna de valores de datos producida por una subconsulta. <>.55 . En la práctica. como se muestra en la Figura 9. OBJETIVO)) CIUDAD Daimiel Almeria Conceptualmente. >. SI la columna no está vacía).. Nótese que la condición de búsqueda no usa realmente los resultados de la subconsulta. SQL usa .A. Por esta razón. SELECT DESCRIPCION FROM PRODUCTOS WHERE EXISTS (SELECT FROM WHERE AND AND Tests cuantificados (ANY y ALL) * PEDIDOS PRODUCTO ~ ID PRODUCTO FAB ~ ID_FAB IMPORTE >~ 25000.000 € o más. Simplemente comprueba si la subconsulta produce resulta~d~s." . la subconsulta de un test EXISTS se escribe siempre usando la notación SELECT . Manual de referencia SELECT EMPRESA PROM CLIENTES WHERE REP_CLI Capítulo 9: Subconsultas y expresiones de consultas 219 La instrucción SELECT usada para obtener la lista requerida de productos se parece a la solicitud reescrita: SELECT DISTINCT DESCRIPCION FROM PRODUCTOS WHERE EXISTS (5ELECT NUM_PEDIDO FROM PEDIDOS WHERE PRODUCTO = ID PRODUCTO AND FAB = ID_FA8 AND I~PORTE >= 25000. El test EXISTS no puede producir un valor NULL. SQL relaia la regla de «las subconsultas deben devolver una UOIca columna de datos» y permite usar la forma SELECT * en la subconsulta de un test EXISTS.00) La versión de la subconsulta del test IN comprueba si un valor de datos es igual a algún valor de una columna de los resultados de una subconsulta. Si la subconsulta no produce filas. A continuación se muestran ejemplos adicionales de consultas que usan EXISTS: * Listar los clientes asignados a Susana Santos que hayan fonnulado un pedido superior a 3. que extienden esta noción a otros operadores de comparación. López S. el test es TRUE si la subconsulta no produce filas. <=. En este caso. Si hay tales pedidos (es deCIr. <. Para realizar este test. La s~bcons~lta produce una columna que contiene los números de pedido para cualqUier pedl..6. Se puede invertir la lógica del test EXISTS usando la forma NOT EXISTS.o.000 €.00) DESCRIPCION SO-kg brazo Llave Riostra Zapata pequei\a Listar las oficinas donde haya un representante cuya cuota represente más del 55 por ciento del objetivo de la oficina. SQL proporciona dos tests cuantificados.000 €. la subconsulta de un test EXISTS siempre contendrá una referencia externa que vincule la subconsulta con la fila que se esté comprobando en el momento en la consulta principal. como «mayor que» (» y «menor que)} «). .do ~el producto «en curso» que exceda de 25. Listar los productos para los que se hayan recibido pedidos de 25. NUM_EMPL REPRESENTANTES NOMBRE ~ 'Susana Santos') PEDIDOS CLIENTE NUM_CLI IMPORTE> 3000. el test EXISTS es FALSE.00) (SELECT PROM WHERE AND NOT EXISTS ( SELECT FROM WHERE ANO EMPRESA Cruz e hijos F. y FALSE en caso contrario. el test EXISTS es TRUE. SELECT CIUDAD FRQM OFICINAS WHERE EXISTS (SELECT FROM REPRESENTANTES WHERE OFICINA_REP ~ OFICINA ANO CUOTA> (.218 SOL. La consulta anterior se podría haber escrito así: Nótese que en cada uno de estos ejemplos la subconsulta incluye una referencia exterior a una columna de la tabla de la consulta principal. ANY y ALL. SQL procesa esta consulta examinando la tabla PRODUCTOS y realizando la subconsulta para cada ~roducto. El test ANY se usa en conjunción con uno de los seis operadores de comparación de SQL (=. El test ANY En la práctica. >=) para contrastar un único valor de test con una columna de valores de datos producida por una subconsulta.

. Manual de referencia 221 . La subconsulta halla todos los pedidos anotados por el representante en curso y devuelve una columna que contiene los importes de estos pedidos. Si se lee el test de forma ligeramente diferente a como aparece en la instrucción puede ayudar.I < ----1 f--<=----1 > ALL incluye en los resultados de la consulta. • Si el test de comparación no es TRUE para algún valor de datos de la columna. pero es NULL (desconocido) para uno o más valores de datos. entonces la condición de búsqueda ANY devuelve NULL.. Si algún pedido supera el valor calculado del test. la consulta principal comprueba cada fila de la tabla REuna a una.1 * CUOTA) < ANY (SELECT IMPORTE FROM PEDIDOS WHERE REP : NOM_EMPLl NOMBRE Samuel Clavel León Freire Neus Azcárate PRESENTANTES. En caso contrario. la consulta precedente se convierte en: el operador de comparación especificado para contrastar el valor de test con cada valor de datos de la columna..Capítulo 9: Subconsultas y expresiones de consultas 220 SOL.. entonces la condición de búsqueda ANY devuelve FALSE. para algún Y.. Diagrama sintáctico de los tests de comparación cuantificados (ANY y ALL). . El test ANY puede ser difícil de entender a veces porque implica un conjunto completo de comparaciones. el test ANY devuelve un resultado TRUE. Si alguna de las comparaciones individuales da un resultado TRUE. En este caso se puede afirmar que no se ha producido ningún valor en la subconsulta para el que se cumpla el test de comparación. Conceptualmente. A continuación se muestra un ejemplo de una solicitud que se puede expresar con el test ANY: Listar los representantes que han formulado un pedido que representa más del 10 por ciento de su cuota. ellO por ciento de La cuota del representante es menor que el impar/e del pedido. uno a uno. ) en lugar de leer este test como: ----1 ·donde X es menor que algún Y seleccionado . • Si el test de comparación es FALSE para cada valor de datos en la columna..6.. el test ANY devuelve TRUE. comparándolo con cada importe de pedido producido por la subconsulta. el representante no se incluye en los resultados. • .. Si la subconsulta en un test ANY no produce filas de resultados o si los resultados incluyen valores NULL.expresión-de-test I = -¡-[. entonces la condición de búsqueda ANY devuelve TRUE -hay realmente algún valor producido por la subconsulta para el que se cumple el test de comparación. pero algunas marcas de SGBD no admiten SOME. el test ANY devuelve FALSE -no se produce ningún valor en la subconsulta para el que se cumpla el test de comparación.--->=-.l se puede probar a leerlo como: "donde. Figura 9. Si aparece el test ANY: WHERE X < ANY (SELECT Y . La cláusula WHERE de la consulta principal calcula a continuación ellO por ciento de la cuota del representante actual y lo usa como valor de test.. no sólo simplemente una. El estándar SQL de ANSI/ISO especifica estas reglas detalladas que describen los resultados del test ANY cuando el valor del test se compara con la columna de los resultados de la subeoosulta: • Si la subconsulta produce una columna vacía de resultados. Se puede usar en general cualquiera de ellas. En esta situación no se puede afirmar si hay un valor producido por la subconsulta para el que se cumple el FROM REPRESENTANTES WHERE (. X es menor que Y· Cuando se usa este truco.. para aLgún pedido anotado por el representante. • Si el test de comparación es TRUE para al menos uno de los valores de datos de la columna. y el representante se • . ANY T subconsulta----+-· 1---<>----1. La palabra clave 50ME es una alternativa para ANY especificada en el estándar de SQL ANSIfISO. la operación de un test ANY puede variar de un SGBD a otro. SELECT NOMBRE SeLeccionar Los representantes en los que.

EDAD FROM REPRESENTANTES WHERE NOT (NUM_EMPL : Al igual que el test ANY. Aquí hay una forma alternativa de la consulta usando el test EXISTS: SELECT NOMBRE. Para resolver el test. la consulta parece decir: Hallar cada representante que no sea director de ninguna oficina.OO€ 350. no sea su director. <=. el test ALL se usa en conjunción con uno de los seis operadores de comparación de SQL (=.. >. Por supuesto para un representante dado es posible hallar algunas oficinas de las que este representante no sea director. .000. por tanto.000. tas que excedan el 50 por ciento del objetivo de cada oficina. para alguna oficina. A continuación se muestra un ejemplo que se puede resolver con el test ALL: Listar las oficinas. <.. Es tenlador expresar esta consulta como se muestra en este ejemplo: SELECT NOMBRE.222 SOL. Manual de referencia Capítulo 9: Subconsultas y expresiones de consultas 223 test de comparación. <>. A continuación se muestra un ejemplo que ilustra el problema: Siempre se puede convertir una consulta con un test ANY en una consulta con un test EXISTS. La subconsulta halla todos los representantes que trabajan en la . SELECT CIUDAD.50 • OBJETIVO) < ALL (SELECT VENTAS FROM REPRESENTANTES WHERE OFICINA_REP : OFICINA) CIUDAD Daimiel Navarra Almería OBJETIVO 300. puede que lo haya y puede que no dependiendo de los valores «reales» (aún desconocidos) para el dato NULL.OO€ ANY (SELECT JEF FROM OFICINAS') NOMBRE María Jiménez Susana Santos Daniel Ruidrobo Tomás Saz Pablo Cruz.- 1 . >=) para contrastar un único valor de test con una columna de valores de datos producidos por una subconsulta.. . La consulta correcta es: SELECT NOMBRE. especialmente en conjunción con el operador de comparación desigualdad (<».. Los resultados incluirían a todos los representantes y. y sus objetivos. Si todas las comparaciones individuales producen un resultado TRUE.000. SQL usa el operador de comparación especificado para contrastar el valor de test con cada valor de datos de la columna. Esto es generalmente una buena idea porque elimina errores como el que se ha descrito. donde todos los representantes tengan ven. el test ALL devuelve un resultado TRUE. EDAD FROM REPRESENTANTES WHERE NOT EXISTS {SELECT FROM OFICINAS WHERE NUM_EMPL NOMBRE EDAD 31 48 45 41 29 49 Listar los nombres y edades de todas las personas incluidas en ventas que no dirigen una oficina. EDAD FROM REPRESENTANTES WHERE NUM_EMPL <> ANY (SELECT JEF FROM OFICINAS) JEF} La subconsulta: SELECT JEF María Jiménez Susana Santos Daniel Ruidrobo Tomás Saz Pablo Cruz Neus Azcárate FROM OFICINAS El test ALL • produce obviamente los números de empleado de Jos directores y. trasladando la comparación dentro de la condición de búsqueda de la subconsulta. por tanto. fallarían al responder la cuestión planteada. la consulta principal comprueba cada fila de la tabla OFIuna a una. ¡Pero esto no es lo que dice la consulta! Lo que dice es esto: Hallar cada representante que. uno por uno. Neus Azcárate EDAD 31 48 45 41 29 49 cINAs' Conceptualmente.OO€ 575. El operador de comparación ANY puede ser muy sutil de usar en la práctica. OBJETIVO FROM OFICINAS WHERE (.

Esta forma de la consulta refleja estrechamente la solicitud planteada. SELECT NOMBRE. entonces la condición de búsqueda ALL devuelve NULL. Si la subconsulta en un test ALL no produce filas de resultados. OFICINAS OFICINA_REP : OFICINA REGION = 'Oeste' EDAD 48 62 49 NAS Esta forma de la consulta reúne la tabla REPRESENTANTES con la tabla OFICIpara hallar la región en la que trabaja cada empleado. De nuevo. entonces la condición de búsqueda ALL devuelve FALSE. A continuación se muestra una forma alternativa de la consulta usando una reunión de dos tablas: Listar los nombres y edades de los representantes que trabajan en las oficinas de la región oeste. entonces la condición de búsqueda ALL devuelve TRUE. ) en lugar de leerlo corno: -donde X es menor que todos Y seleccionados LiSTar los nombres y edades de los representantes que trabajan en las oficinas de la región oeste. simplemente no hay valores. el test ALL siempre se puede convertir en un test EXISTS equivalente trasladando la comparación dentro de la subconsulta. Si aparece este test ALL: WHERE X < ~ Los errores sutiles que pueden ocurrir cuando el test ANY se combina con el operador de comparación de desigualdad también pueden ocurrir con el test ALL. En caso contrario no se incluye. el test de comparación se cumple para cada valor producido por la subconsulta. La subconsulta da una lista de oficinas de la región oeste y la consulta principal halla los representantes que trabajan en una de las oficinas de la lista. Al igual que con el test ANY. . • Si el test de comparación es TRUE para todos los valores de datos de la columna. y la oficina se incluye en los resultados de la consulta. para todo Y. Como con el test ANY. pero es NULL (desconocido) para uno o más valores de datos. puede que lo haya y puede que no. el test ALL devuelve TRUE. o si la consulta incluye valores NULL. ayuda el leer el test de forma ligeramente diferente a como aparece en la instrucción.. El test de comparación no se cumple para ningún valor de la subconsulta. Si todas las ventas superan el valor de test calculado. EDAD REPRESENTANTES. y después elimina las filas de los empleados que no trabajan en la región oeste. el test ALL puede ser difícil de comprender porque implica un conjunto completo de comparaciones. y SQL permite escribir la consulta de ambas formas. X es menor que Y· Cuando se usa este truco. • Si el test de comparación no es FALSE para ningún valor de datos de la columna. SELECT FROM WHERE AND NOMBRE Susana Sa~tos León Freire Neus Azcárate NOMBRE. Este ejemplo lo ilustra: ALL (SELECT Y . comparándolo con cada valor de ventas producido por la subconsulta. para todos los representantes que trabajan en cada una de ellas. • Si el test de comparación es FALSE para algún valor de datos en la columna. o reuniones.. el test ALL devuelve TRUE. En esta situación no se puede afirmar si hay un valor producido por la subconsulta para el que se cumple el test de comparación. la operación del test ALL puede variar de un SGBD a otro. EDAD FROM REPRESENTANTES WHERE OFICINA_REP IN (SELECT OFICINA FROM OFICINAS WHERE REGION ~ 'Oeste') NOMBRE Susana Santos Le6n Freire Neus Azcárate EDAD 48 62 49 se puede probar a leerlo como: "donde. el 50 por ciento del objetivo de la oficina es menor que las ventas del representante. El estándar SQL de ANSIIISO especifica estas reglas detalladas que describen los resultados del test ~LL cuando el valor del test se compara con la columna de los resultados de la subconsulta: • Si la subconsulta produce una columna vacía de resultados. La consulta WHERE de la consulta principal calcula a continuaci6n el 50 por ciento del objetivo de la oficina y lo usa como valor de test. la consulta anterior se convierte en: Seleccionar las oficinas donde. dependiendo de los valores «reales» (aún desconocidos) para el dato NULL. Éste es el caso habitual.224 SOL Manual de referencia Capítulo 9: Subconsultas y expresiones de consultas 225 oficina en curso y devuelve una columna que contiene las ventas de cada representante. «» Subconsultas y reuniones Es posible que se haya reparado a lo largo de este capítulo en que muchas de las consultas que se han escrito con subconsuItas se podrían haber escrilo como consultas multitabla. De nuevo. En este caso el test de comparación no se cumple para ningún valor de datos producido por la consulta. no sólo una única.

la consulta más exterior: SELECT EMPRESA FROM CLIENTES WHERE REP_CLI IN (subconsultaj detennina los clientes cuyos representantes tienen uno de los números de empleado seleccionados. AAA Inversiones JCP S. y contienen una consulta principal y una subconsulta. y ninguna es mejor o peor. EDAD FROM REPRESENTANTES WHERE CUOTA> (SELECT AVG(CUOTA) FROM REPRESENTANTES) NOMBRE Bruno Arteaga Susana Santos Le6n Freire EDAD 37 48 62 FROM REPRESENTANTES WHERE OFICINA_REP IN (SELECT OFICINA FROM OFICINAS WHERE REGION = 'Este'j) EMPRESA Filas sierras S.A. A continuación se muestra un ejemplo simple: Listar los nombres y edades de representantes que estén por encima de la cuota media. mientras que la externa no. Finalmente. Manual de referencia Capítulo 9: Subconsultas y expresiones de consultas 227 Cualquiera de las dos consultas hallará los representantes correc!os. pero en la práctica una consulta llega a consumir mucho tiempo al aumentar el número de niveles. A continuación se muestra un ejemplo de una solicitud que se representa de fonna natural como una consulta de tres niveles. Muchas personas encontrarán que la primera forma (con una subconsulta) es más natural porque la solicitud en lenguaje natural no pide ninguna información acerca de las oficinas. Muchas implementaciones de SQL restringen el número de niveles de subconsulta a un número relativamente pequeño. El estándar SQL de ANSIIISO no especifica un número máximo de niveles de anidamiento. si la solicitud se cambia para pedir alguna informaci6n de la tabla OFICINAS: Listar los nombres y edades de los representantes que trabajan en las oficinas de la región oeste y las ciudades en que trabajan. por lo qu~ no hay fonna de que las dos consultas se puedan combinar en llna única reunión. se puede usar una subconsulta dentro de otra subconsulta. La consulta también llega a ser difícil de leer. Por supuesto. una subconsulta y una sub-subconsulta: Listar los clientes cuyos representantes estén asignados a oficinas de la región de ventas este.226 SOL. La misma técnica usada en esta consulta de tres niveles se puede usar para construir consultas con cuatro o más niveles. . Chen Asoc iados QMA Asociados íbero &< Sagaz Acme En este ejemplo. A la inversa. con una consulta principal. y porque parece un poco extraño reunir las tablas REPRESENTANTES y OFICINAS para responder a la solicitud. la forma de subconsulta no funcionará y se deberá usar la consulta de dos tablas. Al igual que se puede usar una subconsulta dentro de una consulta principal. muchas consultas con subconsultas no se pueden traducir a una reunión equivalente. Subconsultas anidadas Todas las consultas descritas hasta ahora en este capítulo tienen consultas de dos niveles. comprender y mantener cuando contiene más de uno o dos niveles de subconsultas.A. SELECT NOMBRE. SELECT EMPRESA FROM CLIENTES WHERE REP_CLI IN (SELECT NUM_EMPL produce una columna que contiene los números de empleado de los representantes que trabajan en una de las oficinas seleccionadas. la subconsulta más interna: SELECT OFICINA FROM OFICINAS WHERE REGION = 'Este' produce una columna que contiene los números de oficina de las oficinas de la región este. la consulta interna es una consulta de resumen. La siguiente subconsulta: SELECT NUM_EMPL FROM REPRESENTANTES WHERE OFICINA_REP IN (subconsulta) En este caso.

00 referencia externa) tiene un valor diferente. SQL debe determinar si se refiere a una tabla de la cláusula FRQM de la propia subconsulta o de la cláusula FROM de la consulta que contiene a la subconsulta. SQL resuelve una subconsulta una y otra vez -una por cada fila de la consulta principal-. por ejemplo. la subconsulta produce los mismos resultados para cada fila o grupo de filas. A continuación se muestra un ejemplo: Listar las oficinas de ventas cuyas yemas esláll por debajo del objetivo medio. una referencia externa siempre toma el valor de la columna en la fila en curso de la tabla que se está comprobando. SQL puede resolver la subconsulta en primer lugar en este caso. o a una tabla listada en la cláusula FROM de la consulta de segundo o tercer nivel que la contiene. Independientemente del nivel de anidamiento. es completamente independiente de la oficina que se esté comprobando actualmente. SQL no . Por tanto. como en este ejemplo: Listar todas las oficinas cuyos objetivos excedan la suma de las cuotas de los representantes que trabajan en ellas: SELECT CIUDAD FROM OFICINAS WHERE OBJETIVO> NOMBRE Samuel Clavel León Freire (SELECT SUM(CUOTA) FROM REPRESENTANTES WHERE OFICINA_REP = OFICINA) CIUDAD Castellón León Por cada fila de la tabla OFICINAS a comprobar en la cláusula WHERE de la consulta principal. en este ejemplo se usa la misma tabla en la consulta y en la subconsulta: Listar los representantes mayores de 40 años y que dirigen a un representante que supere su cuota. Cuando un nombre de columna no calificado aparece dentro de una subconsulta. hallando los representantes que superan su cuota y generando una lista de los números de empleado de sus jefes. puede hacer referencia a una de las tablas listadas en la cláusula FROM de la consulta principal. las interpreta como referencias externas y la subconsulta no es una subconsulta correlacionada. sin embargo. Si se desea usar una referencia externa dentro de una subconsulta como la del ejemplo anterior. independientemente de la profundidad en que se aniden las subconsultas. SELECT FROM WHERE AND NOMBRE REPRESENTANTES EDAD > 4 o NUM_EMPL IN (SELECT JEFE FROM REPRESENTANTES WHERE VENTAS > CUOTA) Las implementaciones comerciales de SQL detectan automáticamente esta situación y usan este atajo siempre que es posible para reducir la carga de procesamiento requerido por una subconsulta. Una subconsulta que contiene una referencia externa se denomina subconsulta correlacionada porque sus resultados están correlacionados con cada fila individual de la consulta principal. una referencia externa se conoce a veces como referencia correlacionada. SQL no tiene otra alternativa que resolver esta subconsulta cinco veces -una por cada fila de la tabla OFICINAS. Como resultado. el atajo no se puede usar si la subconsulta contiene una referencia exterior. SELECT CIUDAD PROM OFICINAS WHERE VENTAS < (SELECT AVG(OBJETIVO) FROM OFICINAS) CIUDAD Daimiel Almeria En esta consulta no sería muy inteligente realizar la subconsulta cinco veces (una vez por cada oficina). la columna OFICINA (que aparece en la subconsulta como una Las columnas JEFE.228 SOL. Para minimizar esta posibilidad de confusión. SQL puede centrar su atención ahora en la consulta principal.000 €) Ydespués convirtiendo la consulta principal en: SELECT CIUDAD FROM OFICINAS WHERE VENTAS < 550000. hay incluso más posibilidades de nombres de columna ambiguos en una subconsulta que en una consulta principal. se debe usar un alias de tabla para forzar . SQL siempre interpreta una referencia a columna en una subconsulta usando la cláusula FROM posible más próxima. CUOTA Y VENTAS de la subconsulta son referencias a la tabla REPRESENTANTES de la cláusula FRQM de la propia subconsulta. Un nombre de columna en una subconsulta de cuarto nivel. dando el objetivo medio (550. Para ilustrarlo. SQL puede manejar la consulta resolviendo primero la subconsulta. El objetivo medio no cambia con cada oficina. Por el mismo motivo. Manual de referencia Capítulo 9: Subconsultas y expresiones de consultas 229 Subconsultas correlacionadas* Conceptualmente. Sin embargo. Para muchas subconsultas. Una subconsulta puede contener una referencia externa a una tabla de la cláusula FROM de cualquier consulta que contenga la subconsulta. seleccionando los jefes cuyos números de empleado aparecen en la lista generada. Dado que una subconsulta puede contener referencias externas.

. También se puede usar una subconsulta correlacionada en la cláusula HAVING.51111.OOO. AVG(IMPORTE) REPRESENTANTES. .. Si es así. y agrupándolos por representante. y esta subconsulta es correlacionada. Esta solicitud.OFICINA_REPl NOMBRE samuel Clavel León Freire La copia de la tabla REPRESENTANTES usada en la consulta principal tiene ahora la etiqueta JEFES. Manual de referencia Capítulo 9: Subconsultas y expresiones de consultas 231 la referencia externa. todas las referencias externas de la subconsulta correlacionada deben tener un solo valor en cada grupo de filas. Cuando.011€ 3. el grupo de filas se conserva. La cláusula HAVING comprueba a continuación cada grupo de filas para ver si el pedido medio en ese grupo es mayor que la media de todos los pedidos.110E 150. El nombre de columna calificado JEFES. '" 1< ~) 3. Es una subconsulta simple y no contiene referencias externas. mostrando el nombre del representante y el importe medio de los pedidos de cada uno. si no. Funcionamiento de la subconsulta en la cláusula HAVING. SELECT NOMBRE FROM REPRESENTANTES JEFES WHERE EDAD> 40 AND JEFES. O estar contenida en una función de columna.7.CUOTA > EMPS.7 muestra conceptualmente cómo funciona esta consulta.OFICINA_REP <> JEFES. Dado que la subconsulta se evalúa una vez por cada grupo de filas." "" 1< ~.745. funciona como parte de la seleccIón de grupos de filas realizada por la cláusula HAVING.01l€ 4 . muestra cómo hacerlo: re Sil Listar los jefes mayores de 40 años y que dirigen a un representante que supecuota y que no trabaje en la misma oficina de ventas que el jefe. Finalmente.216.S00. que añade una condición más a la anterior. La Figura 9. y la copia de la subconsulta tiene la etiquet~ EMPS. Tlbla REPRESENTAm'ES Tabla PEDlOOS Subconsultas en la cláusula HAVING* Aunque las subconsultas se encuentran a menudo en la cláusula WHERE. que reqUIere que el numero de oficina del empleado no coincida con el del jefe. La consulta principal recorre la tabla PEDIDOS.NUM_EMPL IN (SELECT JEFE FROM REPRESENTANTES EMPS WHERE EMPS. el grupo de filas se descarta.1114 OO€ NOMBRE Susana Santos Tomás Saz Figura 9.1111€ 27. SELECT FROM WHERE AND GROUP HAVING NOMBRE. En el último caso. ~onsidérese esta consulta con una subconsulta: JOIN GROUP " Tabla AGRUPADA NUliJ'EDlOO 112!168 113055 Listar los representantes cuyos importes medios de pedidos para los productos fabricados por AC/ sea superior al importe medio de los pedidos.011E """"" 112963 112983 112981 113012 113027 ~. . PEDIDOS NUM_EMPL = REP FAB = 'ACI' BY NOMBRE AVG(IMPORTE} > (SELECT AVG(IMPORTE) FROM PEDIDOS) AVG(IMPORTE) lS. también se pueden usar en la cláusula HAVING de una consulta. así que SQL puede calcular la media una vez y después usarla repetidamente en la cláusula HAVING.230 SOL. Efectivameme esto significa que la referencia externa debe ser a una referencia a una columna de agrupación de la consulta externa.1111€ 1112. calculada anteriormente. el valor de la función de columna del grupo de filas que se comprueba se calcula como parte del procesamiento de subconsultas. Tabla PEDlOOS 3. :~:~ ~~~::~: '" ~.VENTAS AND EMPS.OO€ """"" Rui~:: Daniel Daniel Ruidr anu>o ArlOe"v" Bruno ArlOe"g" Bruno ArlOea¡¡a ". aparece una subconsulta en la cláusula HAVING.. 1L . sin embargo.978. la cláusula SELECT produce una fila de resumen para cada grupo. hallando todos los pedidos de los productos ACI. OFICINA de la subconsulta es una referenci~ externa. La subconsu Ita calcula la media general del importe de los pedidos. La su~bcon­ sulla contiene una condición de búsqueda adicional.OO€ 22.

• Una subconsuha puede incluir una referencia externa a una tabla en cual· quiera de las consultas que la contienen. Si la instrucción es la UNION de instrucciones SELECT. mezclar los resultados de la consulta de las instrucciones individuales en una única tabla de resultados.OO€ Para generar los resultados de una consulta de una instrucción SELECT: 1. Si hay una clausula HAVING. . Si la cláusula HAVING contiene una subconsulta. Eliminar las fijas duplicadas a menos que se especifique UNION ALL.4a€ 15. Si hay una cláusula aRDER BY. eliminar cualquier fila duplicada que se haya producido en el resultado. que permiten usar los resultados de una consulta para ayudar en la definición de otra. usar el grupo actual de filas como argumento si se especificó GROUP BY.8. dUCIOS SELECT NOMBRE. consultas SQL. los resultados de la subconsulta se usan para seleccionar los grupos de filas que aportan datos a los resultados de la consulta. La Figura 9. 2. 3. Manual de referencia Capítulo 9: Subconsultas y expresiones de consultas 233 HAVING Si la solicitud anterior se cambia ligeramente.. Para cada fila restante (o grupo de filas). Para una referencia a columna simple. ésta se ejecuta por cada fila que se esté comprobando. las filas generadas por este procedimiento forman los resultados de la consulta. Proporciona una definición completa de los resultados producidos por una instrucción SELECT.. NUM_EMPL HAVING AVG(IMPORTE) >= (SELECT AVG(IMPORTE) FROM PEDIDOS • La forma de subconsulta del test de pertenencia a conjuntos (IN) compara un valor de test con el conjunto de valores que devuelve la subconsulta. vinculando la subconsulta a la fila actual de la consulta. Figura 9. el producto es esta tabla. de forma que las filas de cada grupo tengan identicos valores en todas las columnas de agrupación.8 muestra la versión final de las reglas para el procesamienlo de. comprobando si se cumple la comparación para alguno o para todos los valores. usar el valor de la columna en la fila actual (o grupo de filasl.QO€ Tomás Saz 22. Si la cláusula H .. conservando las filas para las que la condición de búsqueda es TRUE (y descartando aquellas para las que la condición es F. Si hay una cláusula WliERE. La subconsulta selecciona pedidos para ese representante en concreto. conservando los grupos para los que la condición de búsqueda es TRUE (y descartando aquéllos para los que la condición es FALSE o NULL). la subconsulta de la cláusula se convierte en una subconsulta correlacionada: Listar lodos los representantes cuyos importes medios de pedidos para los profabricados por AC/ sean al menos como el importe medio general de los pedidos del representante. Antes de continuar con las consultas avanzadas de la especificación SQL2. usando la referencia externa NUM_EMPL. 7. Reglas de procesamiento de consultas SOL (versión final). Las subconsultas aparecen dentro de las condiciones de búsqueda de las subconsultas· en la cláusula WHERE o HAVING. • El test de existencia (EXISTS) comprueba si una subconsuha devuelve algún valor. Si la cláusula FROM lista una única tabla. AVG(IMPORTE) FROM REPRESENTANTES. ésta se ejecuta por cada fila que se este comprobando.LSE o NULL). extendidas para incluir subconsultas. • Cuando aparece una subconsulta en la cláusula WHERE. • Cuando aparece una subconsulta en una cláusula HAVING. La referencia externa es legar porque NUM_EMPL tiene el mismo valor en todas las filas de un grupo producidas por la consulta principal. 8.. en caso contrario. 9. calcular el valor de cada elemento de la lista de selección para producir una única fila de resultados. aplicar su condición de búsqueda a cada fila de la tabla pro· ducto.. • Las subconsultas se pueden anidar dentro de otras_ • La forma de subconsulta del test de comparación usa uno de los operadores simples de comparación para contrastar un valor de test con el único valor que devuelve la subconsulta. Si la instrucción es una UNION de instrucciones SELECT.00Q. Si se especifica SELECT DISTINCT..B65.232 saL. ordenar los resultados de la consulta como se especifique.S00. organizar las filas restantes de la tabla producto en dos grupos. Resumen de fas subconsuftas Este capítulo ha descrito las subconsultas.VING contiene una subconsulta. En este nuevo ejemplo. usar el conjunto completo de resultados. aplicar los pasos del 2 al 7 a cada una de las instrucciones para generar sus resultados individuales. PEDIDOS WHERE NUM_EMPL = REP ANO FAS = 'ACI' GROUP BY NOMBRE. la subconsulta debe producir un importe medio general de pedidos para el representante cuyo grupo de filas se esté comprobando en el momento en la cláusula HAVING. 6. • Los tests cuantificados (ANY y ALL) usan uno de los operadores simples de comparación para compara un valor de test con todos los valores devuehos por la subconsulta. 4. Si hay una cláusula GROUPBY. se resumirán las subconsultas: • Una subconsulta es una «consulta dentro de otra». 5. Para una función de columna. los resultados de la subconsulta se usan para seleccionar filas individuales que aportan datos a los resultados de la consulta. Formar el producto de las tablas listadas en la clausula FROM. WHERE REP = NUM_EMPLl NOHBRE Bruno Arteaga susana Santos AVG (IMPORTE) 7. aplicar su condición de búsqueda a cada grupo de filas.

filas y tablas. las consultas de resumen en las cláusulas GRQUP BY y HAVING. las reuniones mullitabla de la cláusula FROM.de otros. Se debe incluir cuatro consultas SQL separadas (una por cada trimestre) y el programa debe seleccionar la consulta a ejecutar en términos de la entrada del usuario. según el que sea mayor. La solicitud a la base de datos «listar las oficinas donde la suma de las cuotas de los representantes sea superior al objetivo de la oficina» se expresa de forma más directa con esta consulta: SELECT OFICINA FROM OFICINAS WHERE (SELECT SUM{CUOTA) FROM REPRESENTANTES WHERE OFICINA_REP ~ OFICINA) En este simple ejemplo no es difícil invertir la lógica. Más claramente. SQL permitiría que se sustituyese la definición de la vista en la consulta.. PRODUCTO Conceptualmente. SUM(CANTIDAD) FROM (SELECT * FROM PEDIDOS WHERE IMPORTE > 10000) GROUP BY FAB. En su lugar se debe construlf la consulta como un gran conjunto de comparaciones individuales conectadas con AND y DR. En su lugar hay que dar la vuelta a la desigualdad: SELECT OFICINA FROM OFICINAS WHERE OBJETIVO < ISELECT SUM(CUOTA) FROM REPRESENTANTES WHERE OFICINA_REP ~ OFICINA) Pero el estándar SQLI no permite una subconsulta en esta posición de la cláusula WHERE. O bien supóngase que se tiene una base de datos que almacena las ventas por trimestre (cuatro columnas de datos para cada oficina) y que se desea escribir un programa que muestre oficinas y sus ventas por cuatrimestre (especificado por el usuario). La combinación de características que representan -la selección de columnas en la cláusula SELECT. Sin embargo.de esta consulta. por ejemplo. • Expresiones de tabla limitadas. como en: SELECT FAS. SQL permite definir una vista como ésta para grandes pedidos: SELECT FROM PRODUCTOS WHERE IMPORTE > 10000 y después usar la vista como si fuera una tabla real en la cláusula FROM de una consulta para detenninar los productos y cantidades que fueron fonnulados en estos grandes pedidos: SELECT FAB._ . Supóngase que se desea listar los proveedores. incluyendo las siguientes: • No hay toma de decisiones dentro de las subconsultas.41003). los expertos en bases de datos han indicado varias limitaciones de estas características. Este caso simple no es muy difícil. y las subconsulLas para solicitudes más complejas. PRODUCTO. pero la restricción es cuando ~enos una molestia. son un conjunto de productos ~uya IdentIficaCIón (un par ID fabricante I ID producto) coincide con un conjunto de valores y sería natural escribir la consulta usando un test de pertenencia a conjuntos como: SELECT ID_FAB. el programa podría llegar a ser más complejo.. los ~umeros de articulos y los precios de un conjunto de productos que son SUStI~utos .234 SOL.41089).('BIC'. De nuevo. este programa es más difícil de escribir usando consultas SQL estándar. así como el objetivo de ventas anual o las ventas del año. . SUM(CANTIDADj FROM PEDIDOSGRANDES GROUP BY FAB.dan al usuario un potente conjunto de posibilidades de recuperación y análisis de datos. ID_PRODUCTO. ) El estándar SQLl no penn~te esta clase de test de pertenencia a conjuntos. el criterio de selección de filas de la cláusula WHERE. pero en un caso más general. el estándar SQLl y los productos SGBD prinCIpales que Implementan este nivel del estándar son relativamente restrictivos en su ~so permitido de expresiones que contengan elementos individuales de datos. Con las características estándar de las consultas es difícil de hacer. el SGBD debería ser capaz de determinar el significado . PRODUCTO > OBJETIVO Pero ésta no es una instrucción SQLI legar. El estándar SQL2 incluye varias pOSIbIlIdades de consultas avanzadas que se centran en la eliminación de estas . El ejemplo más simple de esta limitación es la restricción de SQLI que establece que una subconsulta sólo puede aparecer en el lado derecho de un test de comparación en una cláusula WHERE. PRECIO FROM PRODUCTOS WHERE 1ID_FAB . Como m~estran estos ejemplos. ID_PRODUCTO) IN (('ACI'. Conceptualmente. e impide comparar los resultados de dos subconsultas. Manual de referencia Capítulo 9: Subconsultas y expresiones de consultas 235 Consultas avanzadas en SQL2* Las consultas SQL descritas hasta aquí en los capítulos 6 al 9 son las caracterÍsticas principales proporcionadas por la mayoría de implementaciones SQL. • Expresio~es de fila Ii~itadas. Supóngase que se desea generar un informe de dos columnas de la base de dalOs de ejemplo que muestre el nombre de cada oficina de ventas.unos . con~u~~os de elementos de datos. dado que debe hacer básicamente el mismo procesamiento para Interpretar la definición de la vista PEDIDOSGRANDES. PRODUCTO. • Uso limitado de subconsultas.

el estándar dice que el SGBD debería generar un error. NUM_EMPL. El espíritu de estas características de SQL2 tiende a ser que un usuario sea capaz de escribir una expresión de consulta que tenga sentido y que la expresión de consulta sea una consulta legal. FECHA_CONTRATO. Diagrama sintáctico de la expresión CAST de SQL2. Dentro del lenguaje SQL. Para estas expresiones SQLl básicas. • Un valor definido por el usuario. Si esta inslrucción SQL apareciese dentro de una programa SQL incorporado (descritos en el Capítulo 17). como el valor calculado CUOTA * . Expresiones escalares (50L2) Las capacidades de consultas extendidas de SQL2 son las que proporcionan más potencia de manipulación y cálculo de datos entre valores de datos individuales (denominados escalares en el estándar SQL2). Dado que estas capacidades de SQL2 constituyen la expansión principal del lenguaje sobre el estándar SQL 1. Los números 9 y 13 Yla cadena de caracteres «VP VENTAS» generan. Sin embargo. si se intenta comparar los datos numéricos y de caracteres. FECHA_CONTRATO.9. se puede especificar un dominio SQL2. Nótese que también se puede generar un valor NULL del tipo de datos apropiado para usar en las expresiones SQL usando la expresión CASTo Los usos más comunes de la expresión CAST son: • Convertir datos de una tabla de la base de datos en la que se define la colum· na con el tipo de datos incorrecto.as}) ~. el operador CASE para la toma de decisiones. (CUOTA * FROM REPRESENTANTES WHERE (OFICINA_REP = 13) OR PUESTO = 'VP VENTAS' . como 125. la mayoría de ellas se requieren sólo en el nivel completo del estándar. cuya sintaxis se muestra en la Figura 9. La expresión CAST tiende a tener poca importancia cuando se están escribiendo directamente instrucciones en una interfaz interactiva de SQL. y la consulta podría se como: SELECT NOMBRE. puede ser crítico cuando se use SQL desde un lenguaje de programación cuyos lipos de datos no coincidan con los tipos de datos incluidos por el estándar SQL. El estándar considera que esto es una condición de error incluso si la cadena de caracteres contiene datos numéricos. Se puede. la operación NULLIF para crear condicionalmente un valor NULL. IMPORTE PROM PEDIDOS WHERE CLIENTE = CAST '2107' AS INTEGER los nombres de columna NOMBRE. • . introducido en un programa. cuando se define una columna Como han mostrado esta consulta y muchos ejemplos anteriores. los valores de datos individuales tienden a tener tres fuentes: • El valor de una columna individual dentro de una fija individual de una tabla. NUM_EMPL. Se describen completamente en el Capítulo 11 debido al papel que desempeñan en la inlegri· dad de datos de SQL.7 o ABC. FROM REPRESENTANTES FECHA_CONTRATO AS VARCHAR La expresión CAST puede aparecer generalmente en cualquier lugar en el que pueda aparecer una expresión escalar en una instrucción SQL.9.9) FROM REPRESENTANTES WHERE (OFICINA_REP = :num_oficina) OR PUESTO = 'VP VENTAS' En lugar de especificar un tipo de datos en la expresión CAST.9. En esta consulta SQL: SELECT NOMBRE. SQL2 añade el operador CAST para la conversión explícita de datos. Especifica que el SGBD convertirá automática- Figura 9. de forma que se pueda comparar con los datos de la base de datos: SELECT PRODUCTO. La expresión CAST (SQL2) f---CAST (TeXP'e5'Ón-de-vaIO'T NULL AS T'ipa-da-da. NUM_EMPL. Los dominios son colecciones específicas de valores de datos legales que se pueden definir en la base de datos bajo el estándar SQL2. los valores de datos individuales se pueden combinar en expresiones simples.dedomIniO El estándar SQL tiene reglas bastante restrictivas sobre la combinación de datos de tipos diferentes en expresiones. y el operador COALESCE para crear condicionalmeme valores distintos de NULL. En este ejemplo ~e usa en la cláusula WHERE para convertir un número de cliente en cadena de caracteres en un entero. CANTIDAD. Por ejemplo. valores de datos individuales. • Un valor lileral. CAST OFICINA_REP AS VARCHAR. sin embargo. FECHA_CONTRATO Y CUOTA generan valores de datos individuales por cada fila de resultados. Por ejemplo. ~ Lnomb~e-. por ejemplo.236 SOL. de forma similar. (CUOTA * . Sin embargo. la variable de programa num_oficina podría contener un valor de datos individual. como los enteros de 2 y 4 bytes.9) menle tipos de datos similares. la expresión CAST de la cláusula SELECT de esta consulta convierte los valores de OFICINA~REP (enteros en la base de datos de ejemplo) y FECHA_CONTRATO (una fecha en la base de datos de ejemplo) en cadenas de caracteres para los resultados de la consulta: SELECT NOMBRE. pedir explícitamente que el SGBD convierta tipos de datos usando la expresión CAST. como lo hacen los nombres de columna OFICINA_REP y PUESTO en la cláusula WHERE. Manual de referencia Capitulo 9: Subconsultas y expresiones de consultas 237 restricciones y en hacer más general el lenguaje SQL.

mostrada en la Figura 9. y si la comparación es TRUE. Sintaxis alternativa de la expresión CASE de SOL2.. pero en general pueden ser cualquier expresión SQL.r-------..10. sus columnas deben tener tipos de datos idénticos. la mayoría de lenguajes de programación anfitriones no tienen tipos de datos explícitos para la fecha y la hora. todavía se pueden comparar las columnas de las dos tablas aplicando CAST sobre una de las columnas para obtener el tipo de datos de la otra. Cuando el SGBD encuentra una expresión. los clientes B son los que tienen límites de crédito superiores a 30. Supónganse que se desea un análisis AlBIC de los clientes de la base de datos de ejemplo de acuerdo con sus límites de crédito. Y los clientes e son el resto. CASE WHEN LIMITE_CREDITO > 60000 THEN 'A' WHEN LIM1TE_CREDITO > 30000 THEN '8' EL SE 'c' PROM CLIENTES La expresión CASE de SQL2 proporciona una toma de decisiones limitada dentro de expresiones SQL.. si una fecha de un pedido se almacena en una tabla como datos DATE. expresión- ' . A continuación se estudia un ejemplo simple del uso de la expresión CASE. Si lo es...resultado L . Esto se puede conseguir con el uso de CAST en las columnas de una de las tablas.:--. THEN .NULL t. cadenas de dígitos) o fechas (cadenas que se pueden interpretar como día/mes/año).----. B o C. Los clientes A son los que tienen límites de crédito superiores a 60.11.000.CASE _ comprobaclon valor-de-.000 €. esa persona debería eslar incluida en el total de la oficina de su jefe. entonces el valor de la expresión CASE es el yalor de la primera expresión resultado. Los resultados de la expresión CASE son lodos literales aquí.. Manual de referencia Capítulo 9: Subconsu/tas y expresiones de consultas 239 como una cadena de caracteres. A continuación se muestra una consulta que genera las agrupaciones adecuadas de oficinas: SELECT CIUDAD. • Eliminar diferencias entre tipos de datos de dos tablas diferentes.. A continuación se muestra un ejemplo de una consulta donde es útil en la cláusula WHERE. REPRESENTANTES WHERE OFICINA CASE WHEN (OFICINA_RtP 1S NOT NULL) THEN OFIC1NA_REP ELSE (SELECT OFICINA_REP FROM REPRESENTANTES AS JEFES WHERE JEFES.000 €.resultado -. La expresión CASE (SQL2) crédito y asignar una clasificación A.238 SOL. En caso contrario.NULL L- NULL ELSE -r. si se desea combinar datos de dos tablas diferentes con una operación UN10N. ELSE que se encuentra en muchas lenguajes de programación.resultado l-NULL expresión- Figura 9. Si un representante no ha sido asignado aún a una oficina. es similar a la instrucción 1F . habría que obtener los nombres de cliente y los límites de crédito de la base de datos y después usar un programa de aplicación que buscase los valores de los límites de Por cada fila de resultados.10. . De forma análoga. como lo son aquí. el SOBD evalúa la expresión CASE comparando primero el límite de crédito de 60. la tercera columna de los resultados contendrá C Éste es un ejemplo muy simple de la expresión CASE". devuelve A en l~ segunda columna de los resultados" Si la comparación falla.. Por ejem~ pIo.. no hay requisito respecto a que las comprobaciones en cada cláusula WHEN sean similares. el valor de la expresión CASE es el valor de la segunda expresión resultado. Es(a versión de la sintaxis de CASE se muestra en]a Figura 9.NUM_EMPL = JEFE) El estándar SQL2 proporciona una versión abreviada de la expresión CASE para la situación habitual en la que se desea comparar un valor de alguna clase con una secuencia de valores de datos (usualmente literales).:: valor] 1. y requieren que los valores de fecha/hora se conviertan en cadenas de caracteres que maneje el programa. • Convertir datos de tipos de datos albergados por el SGBD que no son admilidos por el lenguaje de programación anfitrión. pero la fecha de disponibilidad se almacena en una tabla diferente como una cadena de caracteres. el SGBD procede con la segunda condición de búsqueda y comprueba si es TRUE..CASE - WHEN condición-debúsqueda THEN T expresiónresultado -. y así sucesivamente. SUM{VENTAS} FROM OFICINAS.. Por ejemplo. evalúa la primera condición de búsqueda. Figura 9. Supóngase que se desea halJar el total de las ventas de los representantes ·por oficina.000 y se devuelve B si esta segunda comparación es TRUE. En lugar de repelir una condición de búsqueda de la forma: valor_de_comprobación .11. Al usar SQL1.. SU estructura básica. De forma similar.. expresiónELSE . pero se sabe que realmente contiene números (es decir..¡¡rr-----::==. La expresión CASE también puede aparecer en otras cláusulas de una consulta. Al usar la expresión puede hacer que el SGBD haga el trabajo: CASE de SQL2 se SELECT EMPRESA. Si el resultado de la primera condición de búsqueda no es TRUE.. Diagrama sintáctico de la expresión CASE de SQL2. . y si es TRUE. CASE valor THEN. se hace la comparación con 30.

La expresión NULLIP ¡SQL2) La expresión COALESCE ¡SQL2) Uno de Jos usos más comunes de la capacidad de toma de decisiones de la expresión CASE es el manejo de valores NULL dentro de la base de datos. La expresión NULLIF. un nombre de columna) y lo compara con el segundo valor (usualmente. A continuación se muestra un informe que lista los representantes y sus cuotas. a veces es necesario crear valores NULL. t-NULLIF(C:::==rl •• Figura 9. mostrada en la Figura 9. se usa para este propósito. Si por alguna razón las ventas actuales fuesen también NULL (desconocidas). la expresión COALESCE.00) nuación se muestra una consulta con una expresión hace el trabajo: SELECT NOMBRE.==r) .240 SOL. En caso contrario.. Diagrama sintáctico de la expresión NULLIF de SOL2. es el valor de la expresión. el SGBD va al segundo valor y comprueba si es NULL. Manual de referencia Capítulo 9: Subconsultas y expresiones de consultas 241 en cada cláusula WHEN. examina el primer valor (usualmente. . Si el primer valor es NULL. La sintaxis de la expresión COALESCE se muestra en la Figura 9. En muchas aplicaciones de procesamiento de datos (especialmente algunas antiguas desarro· lladas antes de que las bases de datos relacionales fueran populares). Por ejemplo. en la base de datos de ejemplo.. Si su valor no es NULL. La instrucción CASE genera la lógica IF . Cuando el SGBD encuentra una expresión NULLIF. permite especificar una sola vez el cálculo valor_de_comprobación. en lugar de con la expresión CASE: SELECT NOMBRE. ELSE deseada: SELECT NOMBRE. A conti- el valor de la expresión COALESCE.12.. por lo que la consulm debe generar esta información por sí misma. En su lugar se utilizaba un código especial que se usa para indicar que el dato estaba ausente. para ello. a menudo es deseable tener un valor NULL de la base de datos representado por algún valor literal (tal como la palabra «ausente») o por algún valor predeterminado cuando se use SQL para generar un informe. pero no nuevas capacidades al lenguaje SQL2. Si no lo es. REPRESENTANTES OFICINA ~ (NULLIF OFICINA_REP. la expresión genera un valor NULL. VENTAS. REPRESENTANTES WHERE JEF = NUM_EMPL 11 12 13 21 22 CASE en la lista SELECT que THEN THEN THEN THEN THEN 'Navarra' 'Sevilla' 'Barcelona' 'cádiz' 'Madrid' Como se puede ver comparando las dos consultas. y así sucesivamente. el valor usado para indicar los datos ausentes)..12. la situación en la que un representante no tuviese aún asignado un jefe se indica con un valor de cero (O) en la columna JEFE en lugar de un valor NULL. la simplicidad de la sintaxis de COALESCE hace que el significado de la consulta sea más sencillo de ver en un primer vistazo. la operación de las dos consultas es idéntica. El SOBD examina el primer valor de la lista. CASE OFICINA WHEN WHEN WHEN WHEN WHEN FROM OFICINAS. CASE WHEN (CUOTA IS NOT NULL) THEN CUOTA WHEN (VENTAS IS NOT NULL) THEN VENTAS ELSE 0. Las reglas de procesamiento de la expresión COALESCE son muy sencillas. Si un representante no tiene aún asignada una cuota. COALESCE (CUOTA. BY CIUDAD O) t-COALESCE (C~:::. Si los dos valores son iguales. Sin embargo. En caso contrario. En algunas circunstancias se puede desear detectar esta situación en una consulta SQL y sustituir ese valor NULL por el «código» cero.13. el SGBD va al tercer valor. se debería listar un importe de O. La base de datos de ejemplo no incluye los nombres de las provincias.. Por ejemplo supóngase que se desea generar una lista de todas las oficinas mostrando los nombres de sus jefes y las ciudades y provincias en las que están ubicados. es Si bien la expresión COALESCE se usa para eliminar valores NULL cuando no se desean para el procesamiento.00 FROM REPRESENTANTES Este tipo de lógica de gestión de valores NULL se necesita frecuentemente. TREN .13. SOM(VENTASl OFICINAS. la expresión genera el primer valor. A continuación se muestra una consulta que maneja el caso en el que los números ausentes de oficina se representan con un cero: SELECT FROM WHERE GROUP CIUDAD. se asume que se debe listar en su lugar las ventas actuales del representante.. los datos ausentes no se representaban con valores NULL. Por ejemplo. así que el estándar SQL2 incluye una forma especializada de la expresión CASE.• Figura 9. supóngase. PROM REPRESENTANTES 0. La expresión COALESCE añade simplicidad. CIUDAD. Diagrama sintáctico de la expresión COALESCE de SOL2. A continuación se muestra el mismo ejemplo anterior expresado mediante COALESCE.

La primera constructora de la cláusula WHERE (a la izquierda del signo igual) genera una fila de dos columnas que contiene el código de fabricante y el número de producto del pedido considerado en ese momento.' Figura 9.242 SOL.14. las expresiones CASE. El estándar SQL2 va más allá de estas capacidades.. la estructuración de columnas en filas que representan entidades del mundo real. Esta palabra clave puede aparecer en una constructora de filas s6lo en ciertas situaciones -por ejemplo. Básicamente. cuando la constructora aparece en una instrucción IÑSERT para añadir una nueva fila a una tabla. cuya sintaxis se muestra en la Figura 9. pero sí una gran flexibilidad en las expresiones de consulta.. tales como oficinas individuales. que se procesa comparando una por una cada columna de las dos filas.-expresión-de-valor. corno: Listar el número de pedido. El resultado neto es que el SaBD puede hacer más trabajo de procesamiento. y dejando menos trabajo para el usuario humano o el programa de aplicación. El estándar SQLl. etc.. truida debe contener una valor NULL (desconocido). 'San Diego'. Permite subconsultas que devuelven filas. UPDATE o DELETE). clientes o pedidos. IMPORTE FROM PEDIDOS WHERE (FAB. PRODUCTO) '" ('ACI'. pero pro-porcionan una capacidad muy limitada para manipular realmente filas y grupos de filas. La constructora de filas (SQL2) -DEFAULT- ' . Por supuesto. COALESCE y NULLIF proporcionan una sólida capacidad de toma de decisiones para su uso en las instrucciones SQL. Proporciona una sintaxis para construir filas de datos. bifurcaciones. las operaciones SQLl permiten insertar una fila en una tabla...14. Manual de referencia Capítulo 9: Subconsultas y expresiones de consultas 243 En conjunto. (1§exp. I--------. SELECT NUM_PEDIDO. .. El signo igual compara ahora dos filas de valores. DEFAULT. los nombres de columna también pueden aparecer como elementos de datos individuales dentro de la constructora de filas o como parte de una expresión dentro de la constructora de filas.. La segunda constructora (a la derecha del signo igual) genera una fila de dos columnas que contiene el código (literal) del fabricante ACI y el número de producto 41002. no dos valores escalares. 0. permitiendo utilizar generalmente filas en las expres"iones SQL de forma muy parecida al uso de valores escalares.00) El resultado de esta expresión es una únic~ fila de datos con seis columnas. es una de las más importantes características del modelo relacional. reflejándose en los resultados de las consultas. considérese esta consulta: Listar el mímero de pedido..vaJO' )~.. NULL. 'Oeste'. El estándar SQL2 define este tipo de comparación de filas para la igualdad.).---------l -NULL- Expresiones de filas (SQL2) Aunque las columnas y los valores de datos escalares que contienen son los bloques constructores de una base de datos relacional. es posible escribir la consulta sin las constructoras de filas. Por ejemplo. Cuando una constructora de filas se usa en la cláusula WHERE de una instrucción SQL. No proporcionan toda la potencia de las constructoras de flujo de control aportadas por la mayoría de lenguajes de programación (bucles. Por ejemplo. Diagrama sintáctico de la constructora de filas de SQL2. reflejan ciertamente esta estructura fila/columna. Y define significados de filas para los operadores de comparación SQL y otras estructuras SQL. una a una. . '41002') SQL2 permite especificar una fila de valores de datos usando una constructora de filas. Bajo las reglas nonnales del procesamiento de consultas SQL. El resultado de la comparación es TRUE s6lo si todas las comparaciones de columnas son TRUE. y la mayoría de los principales productos comerciales de bases de datos. . CANTIDAD. la constructora de filas es una lista separada por comas de valores literales o expresiones.. La palabra clave NULL en cuarta posición indica que la cuarta columna de la fila cons. o recuperar. actualizar o eliminar grupos de filas de una base de datos (usando las instrucciones SELECT. la cláusula WHERE se aplica a cada fila de la tabla PEDIDOS. I CEFAULT .subconsulta-que-devuelve-filas . La palabra clave DEFAULT de la quinta posición indica que la quinta fila construida debería contener el valor predeterminado de la columna. la cantidad y el importe de todos los pedidos de zapatas ACf-41002. En su forma más habitual."s:~:~.. a continuación se muestra una constructora de filas para una fila de datos cuya estructura coincide con la tabla OFICINAS de la base de datos de ejemplo: (23. la cantidad y el importe de todos los pedidos de zapatas ACI-41002.

Una forma lógica de empezar a construir la consulta SQL apropiada sería encontrar una expresi6n que proporcione la identidad (ID de fabricante y de producto) del producto más caro en cuesti6n. FROM PEDIDOS FECHA_PEDIDO : (SELECT ID_FAS. pero la consulta resultante sería mucho menos inmediata: Listar los números y fechas de lodos los pedidos formulados para el producto con el mayor precio unitario. Cada vez que se examina la cláusula WHERE para resolver la consulta externa. Comparaciones de filas (50L2) El uso más habitual de las expresiones de filas en la cláusula WHERE o HAVING es dentro de un test de igualdad. A continuación se muestra una consulta que halla el producto correcto: La cláusula WHERE más externa de esta consulta contiene una comparación de filas. El estándar SQL2 también pro- Ignorando la posibilidad de varios productos con el mismo precio máximo. el valor de esta expresión de filas es un par ID de fabricante/ID de producto de una fila de la tabla PEDIDOS. con dos columnas. Sin embargo. igualmente claro en cualquiera de las dos formas. Al usar las subconsultas que devuelven filas de SQL2. El valor generado por la subconsulta se usa entonces corno parte de una expresión dentro de la instrucción SQL principal que contiene la subconsulta. supóngase que se desea mostrar los números de pedido y las fechas de todos los pedidos formulados del producto más caro de la base de datos de ejemplo. Manual de referencia IMPORTE '41002') Capítulo 9: Subconsultas y expresiones de consultas SELECT NUM_PEDIDO. y es más fácil de leer y comprender.números y fechas de lodos los pedidos formulados para el producto con el mayor precio unitario. sino una fila de elementos de datos que se puede usar en las expresiones SQL2 y compararse con otras filas. el estándar SQLI proporciona las subconsultas para expresar consultas más complejas a la base de datos. con toda probabiliodad. cuyos tipos de datos coinciden con los de la expresión de filas de la parte izquierda del signo igual. y pueden llegar a ser incluso más útiles al combinarlas con sub· consultas que devuelven filas. la subconsulta interna para hallar el precio máximo se debe repetir también. Por ejemplo.244 SOL. Es posible expresar esta consulta sin la subconsulta que devuelve filas. En general. PRODUCTO} y en este simple ejemplo el significado de la consulta es. pero una subconsulta SQLl debe tener un valor escalar -es decir. la consulta resultante tiene dos comparaciones separadas de valores escalares. las constructoras de filas pueden ser muy útiles en la simplificación de la apariencia de consultas más complejas. Una fila construida (a menudo consistente en valores de columna de una fila candidata de resultados) se compara con otra fila construida (quizás una fila de resultados de subconsulta o una fila de valores literales). ID_PRODUCTO FROM PRODUCTOS WHERE PRECIO = (SELECT MAX(PRECIO) PROM PRODUCTOS» WHERE (FAS = 'ACI') AND (PRODUCTO = WHERE {FAB. La subconsulta toma la misma forma que una consulta SQL (es decir. Dado que la comparación se debe dividir. y si las filas son iguales. . SELECT ID_FAB. Este uso de subconsultas se incluye actualmente en los principales sistemas de bases de datos relacionales de clase empresarial. una para el ID de fabricante y otra para el ID de producto. 5ubconsultas que devuelven filas 150L2) Como se ha descrito anteriormente en este capítulo. Una subconsulta que devuelve filas devuelve no sólo un único elemento de datos. la fila candidata se incluye en los resultados de la consulta. ID_PRODUCTO FROM PRODUCTOS WHERE PRECIO = (SELECT MAX{PRECIO) FROM PRODUCTOS) En lugar de una comparación de una única fila en la cláusula WHERE. una instrucci6n SELECT). En la parte derecha del signo igual está la subconsuha que genera la identidad del producto con el mayor valor. El resultado de esta subconsulta es de nuevo un valor de fila. la forma de la consulta que usa la expresión de filas es una traducción más directa de la solicitud en lenguaje natural. FROM PEDIDOS 245 SELECT NUM_PEDIDO. SELECT NUM_PEDIDO. se puede incorporar esta consulta completa como una subconsulta dentro de una instrucción SELECT para obtener la información del pedido: Listar los . El estándar SQL2 expande drásticamente la capacidad de las subconsultas incluyendo el soporte de subcollsultas que devuelven filas. CANTIDAD. En la parte izquierda del signo igual hay una constructora de filas que consiste en dos nombres de columna. como se ilustró en los últimos ejemplos. FECHA_PEDIDO FROM PEDIDOS WHERE {FAB = (SELECT ID_FAB FROM PRODUCTOS WHERE PRECIO = (SELECT MAX(PRECIO) FROM PRODUCTOSl)) ANO {PRODUCTO {SELECT ID_PRODUCTO FROM PRODUCTOS WHERE PRECIO = (SELECT MAX(PRECIO) FROM PRODUCTOS»)) Hallar el ID de fabricante y del producto con el mayor precio unitario. debe producir un único valor de datos como resultado. esta consulta generará una única fila de resultados que contenga dos columnas.

Al comparar dos filas según su igualdad. 'Oeste'. En la segunda fila.'41002'. INTERSECTION OFICINAS. (SELECT 'BRIHUEGA'. Por ejemplo.'41002'. INSERT INTO OFICINAS (OFICINA. Quizás la forma más inmediata de expresar esta solicitud sea en esta instrucción SQL2 que usa una subconsulta que devuelve tablas: Figura 9.00). (24. (24. la constructora de tablas es una lista separada por comas de constructoras de filas. Compara los contenidos de la primera columna de las dos filas y.CIUDAD.35).CIUDAD. (14. la instrucción INSERT de SQL2 usa una constructora de tablas como la fuente de datos a insertar en una base de datos.000 €.15. En su forma más simple.15. 'Oeste'. La constructora de tablas (SQL2) SQL2 permite especificar una tabla de valores de datos dentro de una instrucción SQL usando una expresión constructora de tablas. 'Oeste'. A continuación se muestran las comparaciones resultantes de las filas construidas de tres columnas derivadas de la tabla PEDIDOS: Añadir tres oficinas a la tabla OFICINAS. la cuarta columna se especifica como una subconsulta que devuelve escalares que obtiene el jefe del empleado con número 105. que obtiene el jefe y la región de la oficina de Navarra (número 12).5).basada en la primera columna Nótese que las filas individuales de la constructora de tablas no se restringen a sólo ciertos valores literales. 'Sevilla'. los usa para ordenar las filas.JEF.00) . la fila completa se genera por una subconsulta que devuelve filas. una subconsulta puede aparecer en la cláusula FROM de una instrucción SELECT como sus tablas fuente-o Finalmente. SQL2 usa las mismas reglas que se usarían para ordenar las filas. 0. la instrucción INSERT de SQL2 insena tres filas en la tabla OFICINAS.00 FROM OFICINAS WHERE OFICINA: 12) y DIFFERENCE.246 SOL. 'Oeste'. Manual de referencia Capítulo 9: Subconsultas y expresiones de consultas 247 pordona dos formas para los tests de comparación de desigualdad y de rangos.54).JEF. Mientras que la instrucción INSERT de SQLI (descrita en el Capítulo 10) permite insenar sólo una única fila de datos. En la tercera fila. Por ejemplo. 'Brihuega'.54) < ('ACI'. INSERT INTO OFICINAS (OFICINA. incluyendo las operaciones UNIaN. después en la tercera y así sucesivamente. supóngase que se desea listar las descripciones y precios de todos los productos con pedidos que superen 20. si son distintos. NULL. ésta es una instrucción legal INSERT de SQL2 que ilustra estas capacidades: Expresiones de tablas (50L2) Añadir tres oficinas a la tabla Además de las capacidades extendidas para las expresiones que contienen valores simples de datos escalares y valores de filas. o una fila completa puede ser el resullado de una subconsulta que devuelve filas. JEF.'4J002'. REGION. 0.'2A44R'. 0.00). tres de los valores de la cláusula SELECT de la subconsulta son realmente valores literales. 0. Si son iguales. la cláusula VALUES de esta instrucción INSERT genera una tabla de tres filas para insertar. proporciona capacidades desarrolladas para la combinación de tablas. Subconsultas que devuelven tablas (SQL2) ~VALUESlconstructo:a-de-fiIasJ lO Así como SQL2 expande el uso de subconsultas que devuelven escalares en subconsuItas que devuelven filas. La fuente de un valor de datos puede ser una subconsulta que devuelve escalares. 108. donde se combina con formas extendidas de los tests de subconsultas. (SELECT JEFE FROM REPRESENTANTES WHERE NUM_EMPL : lOS). también extiende las subconsultas SQL para admitir subconsultas que devuelven tablas --es decir. pero la tercera y cuarta columnas se producen en la subconsulta.IO) < ('ACI'.basada en la primera columna ('ACI'. 104. Proporciona un mecanismo para la construcción de una tabla de valores de datos dentro de una instrucción SQL. Como en el ejemplo anterior. cuya sintaxis se muestra en la Figura 9. 'ESTE'.VENTASI VALUES (23.VENTASI VALUES (23. 'Santander'.basada en la primera columna ('ACI'. En este caso. el estándar SQL2 amplía espectacularmente las capacidades de procesamiento de consultas SQL para el procesamiento de tablas. 'Este. 1 . "Diagrama sintáctico de la constructora de tablas SOL2. 0. La primera fila se especifica con valores literales.54) < ('REI'.00) ('ACI'.'41003'.'41002'. Aunque no tiene mucho sentido en la base de datos de ejemplo.00). 'Santander'. 108.000 € en la base de datos de ejemplo. Listar la descripción y el precio de todos los productos con pedidos individuales superiores a 20. 'Sevilla'. cada una de las cuales contiene una conjunto de literales separados por comas que forman los valores individuales de columna. subconsultas que devuelven una tabla completa de resultados-o Un papel útil de las subconsultas que devuelven tablas es dentro de la cláusula WHERE o HAVING. Permite subconsultas que devuelven tablas y amplia los test de las subconsultas SQLl para manejarlas.REGION.REGION. la comparación se centra en la segunda fila. 0. También permite que aparezcan subconsultas en muchos otros lugares dentro de llna instrucción SQL -por ejemplo.

como se describe en la siguiente sección. PRECIO PRODUCTOS. Del estudio del Capítulo 7 se desprende que se puede expresar como la reunión de las tablas PRODUCTOS Y PEDIDOS con una condición de búsqueda compuesta: PROM . Expresiones de consulta (SOL2) El estándar SQL2 define una expresión de consulta como la forma completa y de propósito general con la que se puede especificar una tabla de resultados en el . • La cláusula WHERE describe cómo el SGBD debería determinar las columnas que se incluyen en los resultados y las que se descartan. PRODUCTO Capítulo 9: $ubconsultas y expresiones de consultas 249 SELECT DESCRIPCION.respeCifjca'. se usa una especificación de consulta para describir una subconsulta. FROM PRODUCTOS WHERE (ID_FAB. Es ciertamente posible expresar esta consulta de otras formas. • Las cláusulas GROUP BY y HAVING unidas controlan la agrupación de resultados de consultas individuales en una consulta de agrupación. las especificaciones de consulta se pueden combinar usando operaciones de tablas para formar expresiones de consulta de propósito general. La especificación de una consulta es el bloque constructor básico en el están· dar SQL2. la capacidad de usar sub· consultas que devuelven tablas llega a ser incluso más útil que la simplificación y clarificación de solicitudes SQL.c~.248 SOL Manual de referencia PRECIO IN (SELECT FAB.00l nombre-de-tabla expresión-de valor *rl I ~ La consulta externa es una representación inmediata de la solicitud en lenguaje natural-pide la descripción y el precio de los productos cuya identificación (como en los ejemplos previos.16. y la selección de grupos de filas para la inclusión o exclusión en los resultados finales. PEDIDOS (ID_FAB = FAB) (ID_PRODUCTO = PRODUCTO) (IMPORTE> 20000. Ésta es una instrucción igualmente válida. ID_PRODUCTO) FROM PEDIDOS r-- SELECT I 1 I WHERE IMPORTE> 20000.o:·n=.:d:e=':::r-----------------l tab'!J I f [GROUP BY Listar la descripción y el precio de lOdos los productos con pedidos individua· les superiores a 20. La especificación de consulta en SQL2 • La cláusula FROM especifica las tablas que contribuyen a los resultados de la consulta. una especificación de consulta en SQL2 consiste en una especificación simple de consulta. pero se ha eliminado más de la con· sulta en lenguaje natural y por tanto es más difícil de comprender para la mayoría de las personas. Al hacerse más complejas las consultas. Cada columna se especifica con una expresión que dice al SGBD cómo calcular su valor. SELECT FROM WHERE ANO ANO DESCRIPCION. En un caso un poco más complejo. Sus componentes deberían resultar familiares por los capítulos anteriores: • Una lista de selección especifica las columnas de los resultados.. Finalmente. es útil comprender esta definición formal. Conceptualmente describe el proceso de combinar datos de las tablas de la cláusula FROM en una tabla de filas y columnas de resultados. Se puede asignar un alias opcional a la columna con una cláusula AS . El estándar SQL2 formaliza la definición de lo que informalmente hemos estado denominando instrucción SELECT o una consulta en los últimos tres capítulos en un bloque constructor denominado especificación de consulta. El valor de la especificación de una consulta es una tabla de datos.000 €. En el caso más simple. que son los identificadores de los productos que se ajustan al criterio establecido sobre los pedidos. que aparece dentro de otra especificación de consulta (externa). La forma de una especificación de consulta en SQL2 se muestra en la Figura 9. • Las palabras clave ALL y UNIQUE controlan la eliminación de filas duplicadas de los resultados.00) [ WHERE condiciÓn·de· búsqueda lista·decolumnas TIHAVING condición-de· j búsqueda Figura 9. Esto se expresa corno un test de pertenencia a conjuntos de la subconsulta en la cláusula WHERE. Especificación de consulta en SQL2: definición formal. Para una completa comprensión de las capacidades de expresión de tablas en SQL2. un par ID de fabricante/ID de producto) coincide con algún conjunto de productos.16. La subconsulta genera una tabla de dos columnas de resultados.

columnas correspondientes como éstas tendrán siempre el mismo nombre en cada una de las tablas a combinar. PRODUCTO FROM PEDIDOS WHERE IMPORTE> 30000.000 € o más de 30. y las columnas correspondientes de cada tabla deben tener tipos de datos idénticos-o A continuación se muestran unos ejemplos simples de expresiones de consulta en SQL2 con las operaciones UNlüN.00€) UII pedido superior a 30. Las operaciones UNION.. Como conveniencia.000 € de stock disponible. Al usar estos bloques constructores. reuniones naturales. las operaciones UNION. derecha y completa). ).00) UNION (SELECT ID_FAB. y la respuesta son las filas restantes de la primera tabla. INTERSECT ALL y EXCEPT ALL de las operaciones.000 €. ID_PRODUCTO FROM PRODUCTOS WHERE (PRECIO * STOCK) > 30000) Mostrar todos los productos para los que hay excepto los que se venden por menos de 1. Los bloques constructores básicos que se pueden usar para crear una expresión de consulta son los siguientes: • Una especificación de consulta. ). como se describió previamente (VALUES . INTER5ECT y DIFFERENCE de SQL2 proporcionan operaciones de conjunto para la combinación de dos tablas de entrada para formar una tabla de salida. Manual de referencia Capítulo 9: Subconsultas y expresiones de consultas (SELECT FAS.. • UNION. como en estos ejemplos. En la base de datos de ejemplo las columnas correspondientes tienen nombres diferentes en las dos tablas.00) INTERSECT (SELECT ID_FAS. SQL2 permite especificar las columnas correspondientes en una cláusula CORRESPONDING unida a la operación UNION. (SELECT FAB. PRODUCTO FROM PEDIDOS WHERE IMPORTE> 30000. Las filas de la segunda tabla se eliminan de las filas de la primera. INTERSECT y DIFFERENCE en términos de la base de datos de ejemplo: Mostrar todos los productos para los que hay un pedido superior a 30. INTERSECT o EXCEPT. • Una constructora de tablas. ID_PRODUCTO FROM PRODUCTOS WHERE PRECIO < 100. Esto se puede hacer especificando las formas UNION ALL. • Una referencia explícita a tabla (TABLE nombre-tabla). Una operación JOIN toma dos tablas como entrada y produce una tabla de resultados de consulta combinados de acuerdo con la especificación de la reunión. FROM . SU valor es una tabla de resultados de una consulta. como se describió en la secclOn anterior (SELECT . Mostrar todos los productos para los que hay un pedido superior a 30. Conceptualmente. • DIFFERENCE. Su valor es una tabla de valores construidos. (La columna del ID de fabricante se denomina FAB en la tabla PEDIDOS. • JOIN. la operación EXCEPT es como una resta de tablas.. La operación INTERSECT de SQL2 toma dos tablas como entrada y produce como salida una tabla que contiene las filas que aparecen en las dos tablas de entrada. INTERSECT y DIFFERENCE de SQL2 Las operaciones UNION. SQL2 permite combinar sus valores de tabla usando las siguientes operaciones: SQL2 proporciona soporte explícito para las reuniones completas de producto cruzado (reuniones cruzadas). así que se pue den combinar usando estas operaciones.250 SOL. La operación UNION de SQL2 proporciona soporte explícito para la mezcla de filas de dos tablas compatibles (es decir.) Sin embargo. las columnas seleccionadas en estas tablas tienen los mismos tipos correspondientes. Éste es usualmente el resultado deseado.000 €. pero ocasionalmente puede ser necesario suprimir la eliminación de filas duplicadas. pero se denomina ID_FAB en la tabla PRODUCTOS... dos tablas con el mismo número de columnas y con los mismos tipos de datos en las columnas correspondientes). Su valor son los contenidos de la tabla listada. (SELECT FAB. La operación UNION toma dos tablas como entrada y produce una única tabla mezclada de resultados de consulta. ID_PRODUCTO FROM PRODUCTOS WHERE (PRECIO * STOCK) > 30000) 251 lenguaje SQL2. INTERSECT y EXCEPT eliminan las filas duplicadas durante su procesamiento. PRODUCTO FROM PEDIDOS WHERE IMPORTE> 30000.. Los resultados vienen de dos tablas fuente diferentes de la base de datos -la tabla PEDIDOS y la tabla PRODUCTOS-o Sin embargo. La operación EXCEPT de SQL2 toma dos tablas como entrada y produce como salida una tabla que contiene las filas que aparecen en la primera tabla pero que no aparecen en la otra -es decir. Nótese que cada uno de estos ejemplos produce una tabla de dos columnas de resultados.000 € Y más de 30.00) EXCEPT (SELE~T ID_FAS. A continuación se muestra el ejemplo anterior de UNJON modificado para la situación en la que las tabla~ PEDIDOS Y PRODUCTOS tienen nombres de columna paralelos para el ID de fabricante y de producto: M .000 € de stock disponible. las filas ausentes de la segunda. como se describieron en el Capítulo 7. reuniones internas y todos los tipos de reuniones externas' (izquierda. • INTERSECT. Las tres operaciones requieren que las dos tablas de entrada sean compatibles bajo unión -deben tener el mismo número de columnas. De manera predeterminada.

una expresión de consulta puede aparecer en lugar del nombre de una tabla en la cláusula FROM. Cuando aparece una expresión de consulta en la cláusula FROM. el estándar SQL2 permite que aparezcan casi en cualquier lugar en que pueda aparecer una referencia a tabla en una consulta SQL1. esta tabla temporal consiste en dos columnas que listan cada número de cliente y el total de pedidos para ese número de cliente. A continuación se muestra un ejemplo simple de una consulta SQL2 para la base de datos de ejemplo que usa esta característica: Mostrar los Ilombres y el total de los mejores pedidos de los cliellles con límires de crédito superiores a 50. ID_PRODUCTO AS PRODUCTO PRODUCTOS (PRECIO * STOCK) > 30000) En este ejemplo simple no hay mucha ventaja al usar esta constructora.252 SOL.000 € de stock. ¡SELECT • PROM PRODUCTOS PRODUCTO) WHERE (PRECIO· STOCK) > 30000) En un caso como éste. la expresión podría haber sido mucho más compleja. Como muestra este ejemplo. con los mismos nombres) de las dos labias participan en la operación UNION. La operación reunión podría haberse hecho explícita con un operador JO IN de SQL2. La consulta completa se podría haber escrito como una consulta de agrupación externa que reuniese las tablas CLIENTES y PEDIDOS.000 € de stock. sino una expresión de consulta completa. WHERE (LIMITE_CREDITO > 50000. (SELECT FROM WHERE UNION (SELECT FROM WHERE PEDIDOS IMPORTE> 30000. SUM(IMPORTE) AS TOT_PEDIDOS FROM PEDIDOS GROUP BY CLIENTE). el SGBO la resuelve conceptualmente primero. Manual de referencia Capítulo 9: $ubconsultas y expresiones de consultas Expresiones de consulta en la cláusula FRDM 253 Mostrar rodos los productos para los que hay un pedido superior a 30. aún es posible usar la forma coRRESPONDING de la operación UNION en esta consulta simplemente renombrando las columnas en una de las tablas: Mostrar todos los productos para los que hay un pedido superior a 30. en el que todas las columnas correspondientes (es decir. (SELECT FROM PEDIDOS WHERE IMPORTE> 30000. pero en el caso más general en que las consultas conllevan columnas calculadas o son consultas de agrupación. (SELECT CLIENTE. merece la pena destacar que la capacidad de los alias de columna de la especificación de una consulta se puede usar para renombrar o asignar nombres a las columnas de resultados de consultas individuales que se combinan con la operación UNION. una de las ventajas de la expresión de consultas en SQL2 es que normalmente proporcionan varias formas diferentes de obtener los mismos resultados de la consulta. y crea una tabla temporal de resultados generados por la expresión de consulta. En este caso. La filosofía general detrás de las capacidades de SQL2 en esta área es que el lenguaje SQL debería proporcionar la flexibilidad de expresar una consulta de la forma más natural. incluyendo operacio~ nes UNION o JOIN. Para hacer que las expresiones de consulta sean incluso más útiles y de propósito general. TOT_PEDIDOS PROM CLI~NTES. El SGBD subyacente debe ser capaz de tomar la consuha. Hay muchas otras formas en las que se podría haber escrito esta consulta. (SELECT FROM PEDIDOS Las expresiones de consulta SQL2 proporcionan un método mucho más potente y flexible para generar y combinar tablas de resullados que la simple subconsulta y las operaciones UNION proporcionadas por el estándar SQL l.000 € o superior a 30.000 € o superior a 30. Este plan de ejecución inter- . En panicular.000 € o superior a 30. descomponerla en sus piezas fundamentales y después determinar la forma más eficiente de resolver la consulta.00) UNION CORRESPONOING BY (FAB. como se haya expresado. Esta tabla temporal actúa a continuación como una de las tablas fuente de la consulta principal. sus contenidos se reúnen con la tabla CLIENTES para obtener el nombre de la empresa y generar la respuesta a la pre. la cláusula CORRESPQNDING y los alias de columna pueden ayudar a clarificar el significado de la consulta. SQL2 incluso permite dejar vacía la lista explícita de nombres de columna: Mostrar todos los productos para los que hay un pedido superior a 30.000 f. En este ejemplo. antes de ningún otro procesamiento de la consulta. De hecho. gunta principal.OO€¡ CORRESPONDING ID_FAB AS FAB. SELECT EMPRESA.00) AND (NUM_CLI ~ CLIENTE) WHERE IMPORTE> 30000. Si se elimina el supuesto de que las tablas PRODUCTOS y PEDIDOS usan los mismos nombres de columna.000 € de slOck. El segundo <<nombre de tabla» de la cláusula FROM en la consulta principal no es un nombre de tabla en absoluto. como ocurre aquí.00€) UNION CORRESPONDING {SELECT FROM PRODUCTOS WHERE (PRECIO * STOCK) > 30000) Finalmente. y después los resultados de la reunión se podrían haber agrupado en la consulta externa.

• La palabra clave DISTINCT. • La cláusula GROUP BY. si se encuentra. el efecto neto es trasladar la sobrecarga debida a la optimización de las personas al SGBD. pero al producir los mismos resultados. o debe ser una referencia externa a una columna de una tabla fuente de una consulta externa. agrupa las filas individuales seleccionadas por la cláusula WHERE en dos grupos. • La cláusula ORDER BY. • La cláusula SELECT determina los valores de datos que aparecen finalmente como columnas en los resultados de la consulta. si se encuentra. Cada cláusula desempeña un papel específico en la recuperación de datos: • La cláusula FRQM especifica las tablas fuente que aportan datos a los resultados. Como se describió en los capítulos 6 al 9. Parte flI ACTUALIZACiÓN DE DATOS SQL no es sólo un lenguaje de consultas.254 SOL. Las subconsultas en la cláusula HAVING se evalúan por cada grupo de filas. pero la capacidad de expresar consultas dentro de otras se mejora notablemente. si se encuentra. elimina filas duplicadas de los resultados de la consulta. t L 1: . • El operador UNION. ordena los resultados finales en términos de una o más columnas. si se encuentra. las cláusulas de la instrucción SELECT proporcionan un conjunto potente y flexible de capacidades para la recuperación de datos de la base de datos. El flujo fundamental del procesamiento de consultas no se modifica. • Las capacidades de expresión de consultas en SQL2 añaden expresiones de filas y de tablas y operaciones INTERSECT y EXCEPT a las capacidades de SQLl. Las subconsultas en la cláusula WHERE se evalúan para cada fila individual. Los capIt~­ los 10 al 12 se centran en las actualizaciones de las bases de datos. sino que además es un lengu. El Capítulo II describe la forma en que SQL mantiene la integridad de los datos almacenados cuando éstos se modi~can. selecciona grupos de filas para participar en los resultados de la consulta. si se encuentra. Cada nombre de columna en el cuerpo de la instrucción SELECT debe identificar sin ambigüedades una columna de estas tablas. eliminan y modifican datos de una base de datos.aje completo para recuperar y modificar datos de la base de datos. Consultas SaL: un resumen final Esto concluye el estudio de las consultas SQL y de la instrucción SELECT que comenzó en el Capítulo 6. • La cláusula HAVING. selecciona combinaciones individuales de filas de las tablas fuente para participar en los resultados de la consulta. si se encuentra. mezcla los resultados de la consulta producidos por las instrucciones SELECT individuales en un único conjunto de resultados. • La cláusula WHERE. El CapItulo 10 describe las instrucciones SQL que añaden. Manual de referencia no de consultas puede ser muy diferente del plan aparente de la instrucción SQL real. El Capítulo 12 describe las características de procesamiento de transaccI~nes con SQL que permiten actualizaciones simultáneas de la base de datos debidas a diferentes usuarios.

Este capítulo describe las tres instrucciones de SQL que se utilizan para modificar el contenido de las bases de datos: • INSERT. En comparación con la complejidad de la instrucción SELECT. Modifica los datos de las bases de datos. • UPDATE. Actualizaciones de la base de datos SQL es un lenguaje completo para la manipulación de datos que no sólo se utiliza para las consultas a bases de datos. El Capítulo 12 trata del soporte de SQL cuando concurren varios usuarios. Elimina filas de datos de las tablas. las actualizaciones plantean algunos retos a los SGBD aparte de los presentados por las consultas a las bases de datos. Por ejemplo. En el Capítulo 11 se describen los servicios de SQL para el mantenimiento de la integridad de los datos. Adición de datos a la base de datos Se suele añadir una fila de datos a la base de datos relacional cuando aparece en el mundo e~terior una nueva entidad representada por esa fila. El SGBD también debe coordinar las actualizaciones simultáneas realizadas por varios usuarios.CAPíTULO 10 '. El SGBD debe proteger durante las modificaciones la integridad de los datos almacenados. Añade nuevas filas de datos a las tablas. asegurándose de que los usuarios y sus modificaciones no interfieran entre sí. en la base de datos de ejemplo: .. • DELETE. sino también para modificar y actualizar los mismos. las instrucciones de SQL que modifican el contenido de las bases de datos son extremadamente sencillas. asegurando que s610 se introduzcan en la base de datos datos válidos y que la base de datos siga siendo autoconsistente. 257 . que admite las consultas de SQL. incluso en caso de fallos del sistema. No obstante.

111) ~NULL~ INSERT INTO PEDIDOS . la rellena con los datos de la cláusula VALUES y. Figura 10. que representa a ese cliente nuevo.00. • Cuando un cliente realiza un pedido.2 ilustra de manera gráfica el modo en que SQL ejecuta la instrucción IN5ERT. Insertar un nuevo cliente y un pedido par'!. 'ACI'.1. Herminio Juárez. y la cláusula VALUES especifica los valores de datos que contendrá la nueva fila.. VENTAS. ~INSERT INTO nombre·detabla ---r----------:r-----. Una utilidad de carga masiva añade datos a una tabla desde un archivo externo a la base de datos. Éstas son las instrucciones INSERT que añaden a la base de datos el nuevo cliente y el pedido: . • Carga masiva.00. hay que añadir una fila nueva a la tabla REPRESENTANTES para almacenar sus datos. de InterCorp. • INSERT sobre varias filas.. hay que añadir una fila nueva a la tabla CLIENTES. PUESTO.. Suele emplearse en las aplicaciones cotidianas -por ejemplo. • Cuando un representante suscribe a un nuevo cliente. 113069. FECHA_PEDIDO. programas de introducción de datos. Manual de referencia Capítulo 10: Actualizaciones de la base de datos 259 • Cuando se contrata a un nuevo representante. Una consulta posterior a la tabla REPRESENTANTES incluirá la nueva fila. EDAD. 13) 1 fila insertada.. NUM_EMPL. con los datos personales siguientes: Nombre: Edad: Número de empleado: Puesto: Oficina: Fecha de contratación: Cuota: Ventas durante el año en curso: Ésta es la instrucción ejemplo: INSERT Herminio Juárez 36 111 Jefe de ventas Almería (oficina número 13) 25 de julio de 1990 Por asignar 0.. (IMPORTE.258 SOL. Tras la instrucción INSERT la nueva fila es. Don Herminio.. 20. '25-JUL-90'.. 0. FECHA_CONTRATO. pero puede aparecer en cualquier parle enlre las filas de los resultados de la consulta. nombre-de(~/um~) La Figura 10.340 € Y se le ha asignado el número de pedido 113069.. LIMITE_CREDITO. 111. parte de la tabla. que puede verse en la Figura 10. Diagrama sintáctico de la instrucción INSERT sobre una sola fila. OO. Conceptualmente.00 € En cada caso se añade la fila nueva para que la base de datos siga siendo un modelo preciso del mundo real. OFICINA_REP) VALUES (' Herminio Juárez'. cuando se desplazan a una tabla inactiva las filas de una tabla que ya no van a ser necesarias. los SGBD basados en SQL proporcionan tres maneras de añadir filas de datos a las bases de datos: sobre una única fila.-__ •• 1 fila insertada. un nuevo cliente al que se le asigna el número de cliente 2126. CLIENTE. 2126. La instrucción INSERT sobre una única fila añade una sola fila de datos nueva a una tabla. Las filas de las tablas no están ordenadas. FAB. REP) VALUES (2340. 1 fila insertada. La lista de columnas indica el valor de datos que va a cada columna de la fila nueva. En general. 111) REP_CLI) VALUES ( T I c o n s t a n t 8 1 1 ) . con un importe total de 2. 2126. INSERT INTO CLIENTES (EMPRESA. La cláusula INTD especifica la tabla que recibe la nueva fila (la tabla destino). La instrucción IN5ERT sobre una sola fila La instrucción INSERT sobre una sola fila. La unidad de datos más pequeña que puede añadirse a una base de datos relacional es una sola fila. 36. La instrucción INSERT sobre varias filas extrae filas de datos de otra parte de la base de datos y las añade a una tabla. PRODUCTO. por lo que no existe el concepto de inserción de la fila en la parte superior de la tabla. 'Jefe Ventas'. añade una fila nueva a una tabla.1. Suele emplearse para cargar inicialmente la base de datos o para incorporar dalas descargados desde otro sistema infonnático o recopilados desde varios sitios. en la inferior o entre dos filas. la instrucción INSERT crea una sola fila de datos que coincide con la estructura de columnas de la tabla. sencillamente. NUM_PEDIDO. añade la nueva fila a la tabla. CANTIDAD. luego.. Supóngase que Don Herminio recibe ahora su primer pedido. VALUES ('InterCorp'. INSERT INTO REPRESENTANTES (NOMBRE. • INSERT que añade a Don Herminio a la base de datos de AJiadir a Herminio Juárez como nuevo representante. '41004'.. Supongamos que se acaba de contratar a un nuevo representante. NUM_CLI. 15000. CURRENT_DATE. Suele emplearse en procesamientos de fin de mes o de fin de año. hay que añadir una fila nueva a la tabla PEDIDOS para que contenga los datos de ese pedido. El pedido es de veinte cables ACI-41004. ..

no puede haber ninguna ambigüedad en los nombres de las columnas. lU. lo que hace que se inserte la fecha actual como fecha del pedido.OOO. . como puede verse en la Figura 10. Para insertar datos en una .260 SOL.'tnLEMPL. ~~ ~u '" "." " . Esta constante del sistema se especifica en el estándar SQL2 y la incluyen muchos de los productos SQL más populares.Dae 367.t. 14-NOV-88 ~u'""tantt 12-I'EB-U J. . pero muchas implementaciones permiten nombres calificados. NULL. NULL. EDAD. Se trata de la misma secuencia de columnas que genera SQL cuando se utiliza una consulta SELECT *. '" ". 'Jefe Ventas'.00.anu 12-OCT_89 Repre.OO€ 299.00€ J92. En esta instrucción INSERT. CNs ~.DaE 2Do. y el tipo de datos de cada valor debe ser compatible con el tipo de datos de la columna correspondiente. En la práctica.OO€ lOO.00€ lOO. 0. Cuando se omite la lista de columnas. 13) A 15".REP ~ "". ven. Independientemente de si se emplea SQL interactivo o para programación.000.ntos ~. '25-JUL-90'." ". pero su formato sigue siendo muy directo.>niel Ruld<obo Taoofos 5&1 I. VENTAS. pedidos o representantes se añaden casi siempre a la base de datos mediante un programa de introducción de datos orientado a los formularios. la fila recién añadida tiene un valor NULL en las columnas y JEFE.tabla poseída por otro usuario se puede especificar un nombre de tabla calificado. EDAD. el programa de aplicación inserta la nueva fila de datos empleando SQL para programación. Cuando se concluye la introducción de datos. los datos sobre los nuevos clientes.00€ H2.IO-OCT-86 ~"enunte lJ-Em:-'O Jde Vo:nl:U U-OCT-" !lepreseotante Ol-KU·87 tepns.de Jil>O!M: SUsal\ll s. fila nueva I 111 IHera.00 I en esa tabla. Empleando este atajo se puede reescribir de manera equivalente la instrucción INSERT anterior como: INSERT INTO REPRESENTANTES VALUES (111.0aO. VENTAS. La segunda instrucción INSERT utiliza la constante de sistema CURRENT_DATE en su cláusula VALUES.?S ('Herminio Juárez' ..GG€ . sin embargo. ".-e:·. EDAD.613. que añadió a Don f{erminio a la tabla REPRESENTANTES..OOG.. 0.u~4. Se puede hacer más explícita la asignación de valores NULL incluyendo estas columnas en la lista de columnas y especificando la palabra clave NULL en la lista de valores. '" '" '" ".JUL-1990 """ I NULLI 0.59 •• 00€ 30S.13) Inserción de todas las columnas Como un servicio más. se omitieron las columnas CUOTA y JEFE: INSERT INTD REPRESENTANTES (NOMBRE.ant. 36. El nombre de tabla especificado en la instrucción INSERT suele ser un nombre de tabla no calificado. '"' Bruno Ko. " " " OFlCIta.-"". asigna de manera automática un valor NULL a todas las columnas cuyo nombre no se halle en la lista de columnas de la instrucción INSERT. también hay que tener permiso para insertar los datos En consecuencia.U1.uu . PUESTO. .r.l Cbvel Be.¡u6.00. r. 36. Otras marcas de SGBD ofrecen otras constantes del sistema o funciones incorporadas para obtener la fecha y la hora actuales.inio Juárnl 1 r ~ _ 36 I / Tabla REPRESENTA/trES III. ". la instrucción INSERT puede hacerse muy larga si hay muchas columnas de datos.050.. 1 l' t1enoinio '. ." ~. 'Jefe Ventas'.. La finalidad de la lista de columnas de la semencia INSERT es que coincidan Jos valores de los datos de la cláusula VALUES con las columnas que los van a recibir.. Manual de referencia Capítulo 10: Actualizaciones de la base de datos 261 Instrucción saL INSERT Im'O REPRESENTI<m'&S lNOHBRE.ooE 474. ". Inserción de valores NULL . o se producirá un error.GG€ 186. 36. NULL..715.. OFICINA_REP) VALUES ('Herminio Juárez' . Como muestra este ejemplo.000." ".""tanu IO-DIC-86 U-JUN-88 J9-MI.eó:l PTdn hbl . Esta instrucción INSERT tiene exactamente el mismo efecto que la anterior: CUOTA INSERT INTO REPRESENTANTES (NOMBRE.=. o la instrucción INSERT fallará.. Inserción de una sola fila.. NUM_EMPL. '25-JUL-90'. SQL permite omitir la lista de columnas de la instrucción INSERT. .2. como la tabla OFICINAS. OFICINA_REP) VALU..165. que especifica una tabla que posee el usuario. PUESTO.85. 'Herminio Juárez' ."" . oo. Se puede utilizar la instrucción INSERT con SQL interactivo para añadir filas a una tabla que aumenta de tamaño muy raras veces.-~ro U U ..ooe 275.Ol.. ".00€ 211i.s·.H2.te :.= " " U bprese:l. NULL.00) 'Jefe Ventas'-. 0. 3S0. .OO€ 350.OaO. El esquema de seguridad y los permisos de SQL se describen en el Capítulo 15. 13.ooe 275. JEFE.125...oaO. Por supuesto.D1PL ~ ~ " Jefe venusl 25-. 111.00€ lOO. 1)) 'Jefe Ventll. 36.00G. SQL genera de !llanera automática una lista de columnas consistente en todas las columnas de la tabla. O. Cuando SQL inserta en una tabla una nueva fila de datos. VP VerltU ". NUM_EMPL. Por supuesto.00€ 361. El estándar ANSI! ISO obliga a que haya nombres de columnas no calificados en la lista de columnas. FECHA_CONTRATO. ya que todos deben hacer referencia a nombres de columnas en la tabla destino.0'2.. ordenadas de izquierda a derecha. '25-JUL-90' . CUOTA.GO€ Figura 10.sc Sinc~e1 D.OOE " " " 3S0. V~WES ·25~JU¡'-90·. FECHA_CONTRATO. La lista de valores y la lista de columnas deben contener el mismo número de elementos.Y·67 bp<es""t. la instrucción INSERT es la misma.2. 111.000.

SQL realiza en primer lugar la consulta de la tabla PEDIDOS y luego inserta Jos resultados de la consulta en la tabla PEDIDOSANTIGUOS. La instrucción identifica la tabla que va a recibir las filas nuevas (PEDIDOSANTIGUOS) y las columnas que van a recibir los datos. . es muy sencilla.500.00 9 filas insertadas. En vez de eso. desde la tabla PEDIDOS a otra tabla. que puede verse en la Figura 10. ya que bace el programa más fácil de leer y de comprender. Conceptualmente.. Supóngase que se desean analizar los patrones de compra de los clientes averiguando los clientes y los vendedores que son responsables de los grandes pedidos -por encima de los 15. En esta forma de la instrucción INSERT los valores de los datos de las filas nuevas no se especifican de manera explícita dentro del texto de la instrucción.500. FECHA_PEDIDO..000 €-.-PEDIDO FECHA. .4. como puede verse en el ejemplo.00 1. 112993 04-ENE-89 112987 3l-DIc-89 1. La omisión de la lista de columnas es conveniente en SQL interactivo porque reduce la longitud de la instrucción INSERT que hay que escribir. Estas consultas a las tres tablas se ejecutarán bastante rápido en nuestra pequeña base de datos de ejemplo. pero. Figura 10. Para SQL con programación la lista de columnas se debe especificar siempre. Las consultas que se ejecutarán combinarán datos de las tablas CLIENTES.-90 10-FEB-90 2117 2111 2101 2118 • ''''" "" '" '" .00 Figura 10.. denominada PEDIDOSANTIGUOS.PEDIOO fECI\A.00 3. La instrucción INSERT sobre varias filas La segunda forma de la instrucción INSERT. Diagrama sintáctico de la instrucción INSERT sob~e varias filas. el origen de las nuevas filas es una consulta a una base de datos.500.. comenzar a generar errores si algún administrador de la base de datos modifica el número o los tipos de datos de las columnas. La instrucción INSERT sobre varias filas proporciona una manera concisa y eficiente de copiar los datos: Esta instrucción INSERT parece complicada. La adición de filas cuyos valores provienen de la misma base de datos puede parecer.978.00 1.00 22. de repente.00 27. igual que en la instrucción INSERT sobre una sola fila. Tabla PEDIDOSjoNI'IGUOS f.420. FECIlA.500. La Figura 10.500. la secuencia de valores de datos debe corresponder exactamente con la secuencia de columnas de la tabla. NUM_PEDIDO.PORTE 31. U 31.4 ilustra gráficamente la opera· tiva de esta instrucción INSERT. '" Q" PROOOC'!'t 2A44L 41003 ""'~ . Veamos otra situación en la que se puede utilizar la instrucción INSERT sobre varias filas..458.INSERT INTO nombre-tablaT nombre· (~um~) I =oJ-consulta~.500.-PEDlDO <: • 01-ENE-90' 1 Copiar los pedidos antiguos a la tabla PEDIDOSANTIGUOS. FECHA_PEDIDO.00 1" Consulta SELECT NUloLPEDIDO. se puede crear una nueva tabla. en principio. añade varias filas de datos a su tabla destino.00 3.C> 4l00Y 4l00X 2A44R Q" XK47 ". . pero resulta muy útil en algunas situaciones especiales. Por ejemplo. extraña..3.00 600.262 SOL. Inserción de varias filas.-PEDIDO IMPORTE Resultados de la consulta NUlLPEDI FECI\A. El resto de la instrucción es una consulta que recupera los datos de la tabla PEDIDOS..'UM. Además. especificada en la instrucción. tardarían mucho tiempo.-PEDlOO CLIE:lrn: 112961 113012 112989 113051 n-DIC-89 11-eNE-90 03-DQ'. REPRESENTANTES Y PEDIDOS. En lugar de ejecutar muchas consultas largas a las tres tablas.. INSERT INTO SELECT FROM WHERE PEDIDOSANTIGUOS (NUM_PEDIDO. Además. que contenga los datos necesarios.00 27. la fecha y el importe de todos los pedidos realizados antes del primero de enero de 1990. con muchos millares de filas.896.745. las estructuras de las tablas suelen cambiar con el tiempo para incluir columnas nuevas o eliminar las que ya no se utilizan...3. realmente.00 1.-PEDlOO 112961 17-DIC-B9 112968 12--ocT-89 IH. pero en una base de datos empresarial real. supóngase que se desea copiar el número de pedido. IMPORTE FROM PEDIDOS WHERE FECf!A. Un programa que contenga instrucciones INSERT sin una lista explícita de columnas puede funcionar bien durante meses o años y. '" m '" '" . Manual de referencia Capítulo 10: Actualizaciones de la base de datos 263 Cuando se omite la lista de columnas hay que utilizar la palabra clave NULL en la lista de valores para asignar de manera explícita valores NULL a las columnas.. denominada PEDIDOSGRANDES. "• 2 IMPORTE 31.PEOlOO. IMPORTE PEDIDOS FECHA_PEDIDO < 'Ol-ENE-90' IMPORTE) 113049 112987 113057 113042 10-FEB-90 31-DIC-89 lB-FEB-90 02-FEB-90 2118 2103 2111 2113 '" '" '" '"' '" '" . y que venga definida como se indica en la página siguiente: TbI a PEDIDOS tML.

(VENTAS . carece de orden. Sin embargo. estas restricciones se relajaron en el estándar SQL2. Sólo se puede especificar una instrucción SELECT. Las dos primeras restricciones son estructurales. También permite varias formas de autoinserción. Una vez creada la tabla PEDIDOSGRANDES. En esta situación es probable que la tabla PEDlOOSGRANDES se utilice como tabla temporal para la realización del análisis. REPRESENTANTES CLIENTE ~ NUM_CLI REP : NUM_EMPL IMPORTE> 15000. y los tipos de datos deben ser compatibles. En consecuencia. Si la inserción de una sola fila tarda medio segundo . Todos los 6 filas insertadas. En una base de datos de gran tamaño esta instrucción INSERT puede tardar un rato en ejecutarse porque implica una consulta a tres tablas. RENO. El estándar SQL ANSI/ISO no incluye esta función. resulta inútil ordenar los resultados de la consulta. se puede utilizar la instrucción SERT sobre varias filas para rellenarla: Cargar los datos para su análisis en la tabLa INSERT INTO PEDlDOSGRANDES SELECT FAS. al igual que las instrucciones interactivas INSERT sobre una sola fila de los ejemplos anteriores. EMPRESA. la tabla PEDIDOSGRANDES no se actualizará de manera automática cuando se agreguen a la base de datos nuevos pedidos. se ejecutarán los programas de análisis y luego la tabla se vaciará o se desechará. En todo caso. Sin embargo. cada una de estas consultas se ejecutará mucho más rápido que si fuera una reunión de tres tablas. pero las dos últimas se incluyeron en el estándar simplemente para evitar complejidades.00 . El estándar SQLI especifica varias restriccioñes lógicas para la consulta que aparece dentro de la instrucción INSERT sobre varias filas: • La consulta no puede contener ninguna cláusula ORDER BY. ya que se van a insertar en una_tabla que. CANTIDAD) IMPORTE.CUOT~l. Por este motivo la mayor parte de los productos SGBD comerciales incluyen una característica de carga masiva que carga en una tabla los datos de un archivo a gran velocidad. las consultas para el análisis de los datos posteriores a la tabla PEDIDOSGRANDES pueden expresarse de manera muy sencilla -se transforman en consultas a una sola tabla. • La tabla destino de la instrucción INSERT no puede aparecer en la cláusula FROM de la consulta ni de ninguna subconsulta que pueda conte::". En consecuencia. El estándar permite hoy en día operaciones UNION y JO IN y expresiones en la consulta. Cuando se utiliza SQL desde el interior de un programa de aplicación 'se suele ofrecer otra técnica para insertar de manera más eficiente una gran cantidad de datos en una base de datos. Manual de referencia Capítulo 10: Actualizaciones de la base de datos 265 Información sobre las columnas IMPORTE EMPRESA NOMBRE REND FAB PRODUCTO CANTIDAD Importe del pedido (de PEDIDOS) Nombre del cliente (de CLIENTES) Nombre del representante (de REPRESENTANTES) Diferencia por debajo o por encima de la cuota (calculada a partir de REPRESENTANTES) Identificador del fabricante (de PEDIDOS) Identificador del producto (de PEDIDOS) Cantidad encargada (de PEDIDOS) IN- • Los resultados de la consulta deben contener el mismo número de columnas que la lista de columnas de la instrucción INSERT (o que toda la tabla destino. NOMBRE. la sobrecarga derivada de hacer que el SGBD ejecute de manera repetida instrucciones INSERT sobre una sola fila puede ser muy elevada. FAS. La instrucción de programación INSERT estándar inserta una sola fila de datos. columna a columna. Cada uno de estos factores parece un inconveniente. que representarán una instantánea del estado de los pedidos en un momento dado. NOMBRE. ~ - . WHERE AND AND PEDIDOSGRANDES. • La consulta no puede ser la UNION de varias instrucciones SELECT diferentes. eso probablemente sea un renclimiento aceptable para un programa interactivo. y suele ofrecerse más bien como un programa de utilidad independiente que como parte del lenguaje SQL. r. Se creará y llenará·de datos. Para cargar los datos en una tabla se puede escribir un programa con un bucle que lea cada registro del archivo y utilice la instrucción INSERT sobre una sola fila para añadir esa fila a la tabla. CLIENTES. Pero ese rendimiento se vuelve rápidamente inaceptable cuando se aplica a la tarea de carga masiva de cincuenta mil filas de datos. funciones y comandos ligeramente diferente. (IMPORTE. Cuando se complete la instrucción. la carga de los datos necesitaria más de seis horas. probablemente se trate de una buena estrategia para llevar a cabo el análisis. en las que la tabla origen de los datos que hay que insertar y la tabla destino son la misma. como todas las tablas. Además. CANTIDAD FROM PEDIDOS. los datos de la tabla PEDIDOSGRANDES duplicará la infonnación de otras tablas. permitiendo básicamente que los resultados de una consulta general a la base de datos se recuperen y se inserten en una tabla con la instrucción INSERT. PRODUCTO. Esto prohíbe la inserción en la propia tabla de una parte de sí.con una carga de sistema habitual. PRODUCTO. especialmente si las tres tablas originales son de gran tamaño. EMPRESA. Además. si se omite la lista de columnas). En ese caso.111 264 SOL. La utilidad de cada fabricante ofrece un conjunto de características. Utilidades de carga masiva Los datos que hay que insertar en una base de datos suelen descargarse de otro sistema informático o reunirse de otros sitios y almacenarse en un archivo secuencial. por lo que sus datos se pueden quedar rápidamente desactualizados. Pero muchos productos SOBD comerciales permiten que se proporcionen los datos de dos o más filas (a menudo hasta de centenares de filas) como parte de una sola instrucción INSERT masiva.

A continuación se muestra la sentencia DELETE que elimina los pedidos de la tabla SENTANTES.5. InterCorp (número de cliente 2126). Supóngase. la cláusula WHERE selecciona varias filas de la tabla PEDIDOS. Eliminar a Herminio Juárez de la base de datos. Eliminación de datos de la base de datos Se suele eliminar una fila de datos de una base de datos cuando la entidad representada por la fila desaparece del mundo exterior. exactamente. según la condición de búsqueda concreta. Figura 10. La ejecución de una instrucción INSERT masiva para cien filas de datos tiene exactamente el mismo efecto que ejecutar cien instrucciones INSERT sobre una sola fila. elimina aquellas en las que la condición de búsqueda da un resultado TRUE y conserva aquellas en las que la condición de búsqueda da un resultado FALSE o NULL. y hasta un trescientos por ciento o más respecto de las instrucciones INSERT sobre una sola fila. que siempre elimina una sola fila. PEDIDOS: Eliminar todos los pedidos de InterCorp (número de cliente 2126). DELETE FROM REPRESENTANTES WHERE NOMBRE ~ 'Herminio Juárez' 1 fila eliminada. Como este tipo de instrucción DELETE busca en la tabla las filas que hay que eliminar.266 SOL Manual de referencia Capítulo 10: Actualizaciones de la base de datos 267 datos proporcionados deben ser para filas nuevas de la única tabla que es el destino de la instrucción INSERT. La cláusula WHERE de este ejemplo identifica una sola fila de la tabla REPREque SQL elimina de la tabla. L WHERE c~ndici6n~bÚSqUeda] . que puede verse en la Figura 10.5. . suele resultar mucho más eficiente. La cláusula WHERE especifica las filas de la tabla que deben eliminarse. Conceptualmente. como se describe en los capítulos 6 y 9. a veces se denomina instrucción DELETE con búsqueda. en la base de datos de ejemplo: • Cuando un cliente cancela un pedido. h~y que eliminar la fila correspondiente de la tabla PEDIDOS. hay que eliminar la fila correspondiente de la tabla OFICINAS. ya que sólo supone una llamada al SGBD. SQL aplica la cláusula WHERE a cada fila de la tabla PEDIDOS. elimina las filas de datos seleccionadas de una sola tabla. No obstante. Este término se usa para diferenciarla de otra forma de la instrucción DELETE.--------+ •• Diagrama sintáctico de la instrucción DELETE. ha llamado para cancelar todos sus pedidos. el nuevo representante contratado anteriormente en este capítulo. en función de la marca del SGBD y del tipo concreto de datos que se esté insertando. La cláusula FROM especifica la tabla destino que contiene las filas. En cada caso se elimina la fila para hacer que la base de datos siga siendo un modelo preciso del mundo reaL La unidad de datos más pequeña que puede eliminarse de una base de datos relacional es una sola fila. • Cuando se cierra una oficina comercial. La instrucción DELETE En este caso. de la misma cláusula WHERE que se especifica en las sentencias SELECT para recuperar la misma fila de la tabla-. y SQL elimina de la tabla todas las filas seleccionadas. La instrucción DELETE que elimina su fila de la tabla REPRESENTANTES se muestra a continuación. Por ejemplo. Lo mismo puede decirse de la cláusula WHERE de las sentenCias DELETE. La cláusula WHERE debería tener un aspecto familiar -se trata. Resultan habituales mejoras de la eficiencia entre un veinte y un treinta por ciento. también hay que eliminar sus filas de la tabla REPRESENTANTES. por ejemplo. hay que actualizar sus columnas OFICIN~REP. ~DELETE FROM nombre-tabla-r . acaba de decidir abandonar la empresa. Recuérdese que las condiciones de búsqueda de la cláusula WHERE de las sentencias SELECT puede especificar una sola fila o un conjunto de filas. denominada instrucción DELETE posicionada. A continuación se ofrecen varios ejemplos más de instrucciones DELETE con búsqueda: La instrucción DELETE. y debe nombrarse en la cláusula INTO. • Cuando un representante abandona la empresa. La instrucción DELETE posicionada sólo se aplica a SQL para programación y se describe en el Capítulo 17. Supóngase que Herminio Juárez. Si se despide a los representantes de esa oficina. hay que eliminar la fila correspondiente de la tabla REPRESENTANTES. que el cliente de Don Herminio. Las condiciones de búsqueda que pueden especificarse en la cláusula WHERE de la instrucción DELETE son las mismas disponibles en la cláusula WHERE de la instrucción SELECT. Si se los traslada. DELETE FROM PEDIDOS WHERE CLIENTE ~ 2126 2 filas eliminadas.

A veces la selección de filas debe hacerse en términos de datos de otras tablas. 109.00€ DELETE. DELETE FROM PEDIDOS WHERE REP = (SELECT NUM_EMPL FROM REPRESENTANTES WHERE NOMBRE = 'Susana Santos') 4 filas eliminadas. DELETE con subconsulta * Eliminar lodas las filas de los clientes atendidos por Bruno Arteaga. pero casi siempre se halla presente. FROM PEDIDOS WHERE FECHA_PEDIDO < 'lS-NOV-89' 5 filas eliminadas. Sin conocer su número de empleado no se pueden hallar esos pedidos consultando únicamente la tabla PEDIDOS. DEL~TE se de que son las que se desea eliminar y. Las instrucciones DELETE con condiciones de búsqueda sencillas. 109 Y JOl). como ocurre en este ejemplo: Pero no se puede utilizar una reunión en una instrucción ción DELETE paralela es ilegal: DELETE FROM PEDIDOS. Debido al daño potencial que puede causar una instrucción DELETE de este tipo hay que tener la precaución de especificar siempre una condición de búsqueda y de asegurarse de que realmente selecciona las filas que se desea eliminar. Para hallar los pedidos se puede utilizar una consulta a dos tablas: Eliminar todos los representantes contratados antes de julio de 1988 a los que no se les ha asignado todavía cuota. Si se omite la cláusula WHERE de una instrucción DELETE. como las de los ejemplos anteriores. IMPORTE PEDIDOS. REPRESENTANTES WHERE REP = NUM_EMPL ANO NOMBRE = 'Susana Santos' La instruc- Eliminar todos los pedidos. DELETE FROM REPRESENTANTES WHERE FECHA_CONTRATO < 'Ol-JUL-8S' AND CUOTA 15 NULL o filas eliminadas.268 SOL. Al utilizar SQL interactivo resulta una buena idea emplear primero la cláusula WHERE en una instrucción SELECT para mostrar las filas seleccionadas. SELECT FROM WHERE AND NUM_PEDIDOS. Manual de referencia Capítulo 10: Actualizaciones de la base de datos 269 WHERE Eliminar todos los pedidos realizados antes del 15 de noviembre de 1989. REPRESENTANTES REP = NUM_EMPL NAME = 'Susana Santos' IMPORTE lS.896. Para eliminar de la base de datos la definición de la tabla hay que utilizar la instrucción DROP TASLE (que se describe en el Capítulo 13).ooE: 2. DELETE FROM PEDIDOS 30 filas eliminadas. María Jiménez o Daniel Ruidrobo (números de empleado 105. La tabla sigue existiendo y se puede seguir insertando filas nuevas en la tabla PEDIDOS con instrucciones INSERT. Por ejemplo. supóngase que se desea eliminar todos los pedidos tramitados por Susana' Santos.130.OOE: 3.OO€ 1. 101) 7 filas eliminadas. no elimina la tabla PEDIDOS de la base de datos. utilizar la cláusula en una instrucción DELETE. NUM_PEDIDO 112979 11306s 112993 113048 Eliminación de todas las filas La cláusula WHERE de las instrucción DELETE es opcional. DELETE FROM CLIENTES WHERE REP_CLI IN (lOS. A continuación puede verse una forma válida de la instrucción DELETE que maneja la solicitud: Eliminar los pedidos tramitados por Susana Santos.OOO. Hay que asegurar- La manera de tratar esta solicitud es utilizar una de las condiciones de búsqueda de la subconsulta. La definición de la tabla PEDIDOS y de sus columnas sigue almacenada en la base de datos. s610 enlonces. seleccionan las filas para su eliminación con base únicamente en el contenido de las propias filas.7S0. Error: se ha especificado más de una tabla en la cláusula FROM Aunque la instrucción DELETE produce una tabla vacía. . se eliminan todas las filas de la tabla destino. Hallar los pedidos tramitados por Susana Santos.

8 * CUOTA)) 2 filas eliminadas. pero el comportamiento de esta instrucción queda bien definido por el estándar. En el estándar SQL1.subconsulta o de cualquiera de sus subconsultas en cualquier nivel de anidamiento. TES Conceptualmente. ya que implementan la reunión entre la(s) tablas(s) de la subconsulta y la tabla destino de la instrucción DELETE. y la cláusula WHERE selecciona los pedidos con el valor correspondiente. A continuación se ofrece un ejemplo de solicitud de eliminación que necesita una subconsulta con una referencia externa: Eliminar los clientes que no hayan realizado pedidos desde ellO de noviembre de 1989. Las subconsultas en la cláusula WHERE pueden anidarse igual que en la cláusula WHERE de la instrucción SELECT. salvo para las referencias externas a la fila que está examinando en ese momento la condición de búsqueda de la instrucción DELETE. DELETE FROM REPRESENTANTE WHERE (. porque permiten eliminar filas en términos de la información de otras tablas.6. También pued. • Cuando se elevan un cinco por ciento las cuotas de ventas en la oficina comercial de Navarra. A este respecto. hay que modificar la columna JEF de la tabla OFICINAS y la columna OFICINA_REP de la tabla REPRESENTANTES para que reflejen el nuevo puesto.02 * CUOTA) > (SELECT SUM(IMPORTE) FROM PEDIDOS WHERE REP = NUM_EMPL) de la fila de la tabla CLIENTES que está examinando la instrucción DELETE. Para cada cliente la subconsulta selecciona los pedidos realizados antes de la fecha de corte. La tabla destino . Como muestra este ejemplo. esta instrucción DELETE opera fila a fila por la tabla CLIENY verificando la condición de búsqueda. Modificación de datos de la base de datos Generalmente. los valores de los elementos de datos almacenados en las bases de datos se modifican cuando se producen cambios equivalentes en el mundo exterior. Manual de referencia Capítulo 10: Actualizaciones de la base de datos 271 La subconsulta halla el número de empleado de Susana Santos. A continuación se ofrecen dos ejemplos más de instrucciones DELETE que milizan condiciones de búsqueda con subconsullas: Eliminar los clientes atendidos por representames cuyas ventas no lleguen al ochenta por ciento de su cuota. que puede verse en la Figura 10. El estándar SQL2 elimina esta restricción al especificar que la instrucción DELETE debe tratar las subconsultas de ese tipo como si se aplicara a toda la tabla destino. como se describe en el Capítulo 9. Las referencias externas suelen hallarse en las subconsultas de las instrucciones DELETE. hay que modificar la columna CANTIDAD de la fila correspondiente de la tabla PEDIDOS.270 SOL. • Cuando un jefe se traslada de una oficina a otra. La referencia a la columna NUM_CLI de la subconsulta es una referencia externa al número de cliente La instrucción UPDATE La instrucción UPDATE. La subconsulta de este ejemplo es una subconsulta correlacionada. Esto provoca una mayor sobrecarga del SGBD (que debe tratar el procesamiento de la subconsulta y la eliminación de las filas con más cuidado). la base de datos se actualizan para hacer que la base de datos siga siendo un modelo preciso del mundo real. Eliminar cualquier representante cuyos pedidos actuales sean menos del dos por ciento de su cuota.en contener referencias externas a la tabla destino de la instrucción DELETE. antes de que se haya eliminado ninguna fila. hay que modificar la columna CUOTA de las filas correspondientes de la tabla REPRESENTANTES. La unidad mínima de datos que puede modificarse en una base de datos es una sola columna de una única fila. 1 fila eliminada. DELETE FROM CLIENTES WHERE REP_CLI IN (SELECT NUM_EMPL FROM REPRESENTANTES ¡"/HERE VENTAS < (. En cada caso los valores de los datos de. Esto evita que las subconsultas hagan referencia a la tabla destino (algunas de cuyas filas pueden haberse eliminado ya). la cláusula FROM de la instrucción DELETE funciona igual que la cláusula FROM de la instrucción SELECT. DELETE PROM CLIENTES WHERE NOT EXISTS (SELECT PROM PEDIDOS WHERE CLIENTE = NUM_CLI AND FECHA_PEDIDO < 'lO-NOV-89') 16 filas eliminadas. Por ejemplo. las subconsultas pueden desempeñar un papel importante en la instrucción DELETE. en la base de datos de ejemplo: • Cuando un cliente llama para modificar la cantidad de un pedido. una restricción del emple<? de las subconsultas en las instrucciones DELETE evita que la tabla destino aparezca en la cláusula FROM de una . modifica los valores de una o varias columnas de las filas seleccionadas de una sola tabla.

La expresión debe ser calculable en términos de los valores de la fila que se . pero algunas implementaciones de SQL permiten los nombres de columna cualificados. Conceptualmente. WHERE condición-de-búsqueda • I • Figura 10. ya que deben hacer referencia a las columnas de la tabla destino. UPDATE CLIENTES Asignar una cuota de 100.000 € Y reasignarlo a María Jiménez (número de empleado 109). UPDATE CLIENTES SET REP_CLI = 102 WHERE REP_CLI IN (105.00 WHERE CUOTA 15 NULL 1 fila actualizada. Este término la distingue de una forma diferente de la instrucción UPDATE. Al igual que la instrucción DELETE. 107) 5 filas actualizadas. UPDATE REPRESENTANTES SET CUOTA = 100000.umna I = expresión 3 filas actualizadas. esta modalidad de la instrucción UPDATE se denomina a veces sentencia UPDATE con búsqueda. La cláusula WHERE selecciona las filas de la tabla que hay que modificar. y hay que tener los permisos necesarios para actualizar la tabla y cada una de las columnas que vayan a modificarse. SQL procesa la instrucción UPDATE recorriendo la tabla REPRESENTANTES fila a fila. A continuación se ofrecen varios ejemplos más de instrucciones UPDATE con búsqueda: TANTES que hay que actualizar se nombra en la instrucción.6. SET LIMITE_CRED1TO = 60000.9 * CUOTA La cláusula SET de la instrucción UPDATE es una lista de asignaciones separadas por comas. Cada columna destino sólo debe aparecer una vez en la lista. De hecho. actualizando las filas para las que la condición de búsqueda da un resultado TRUE y saltando aquellas para las que da un resultado FALSE o NULL. UPDATE REPRESENTANTES SET OFICINA_REP = 11. denominada instrucción UPDATE posicionada. La cláusula SET especifica las columnas que se van a actualizar y calcula sus nuevos valores. las condiciones de búsqueda que pueden aparecer en la cláusula WHERE de las instrucciones UPDATE son exactamente las mismas que las disponibles en las instrucciones SELECT y DELETE. 106 o 107 al empleado número 102. Manual de referencia Capítulo 10: Actualizaciones de la base de datos WHERE OFICINA_REP = 12 273 l. La cláusula WHERE es exactamente la misma que se utilizaría en una instrucción DELETE o SELECT para identificar la fila. la instrucción UPDATE puede actualizar varias filas al tiempo con la condición de búsqueda adecuada. CUOTA . que siempre actualiza una sola fila. La expresión de cada asignación puede ser cualquier expresión de SQL válida que dé como resultado un valor del tipo de datos adecuado para la columna destino.000 € a cualquier representante que no tenga cuota actualmente. A continuación se ofrece un ejemplo de la instrucción que cambia el límite de crédito y el representante de un cliente: Reasignar todos los clientes atendidos por los números de empleado 105.UPDATE nombre-tabla SET fnombre-co. WHERE EMPRESA = 'Acme' 1 fila actualizada. En todo caso.00. En este caso la cláusula WHERE selecciona varias filas de la tabla REPRESENY se modifican en todas ellas los valores de las columnas OFICINA_REP y CUOTA.272 SOL. como en este ejemplo: Trasladar a todos los representantes de la oficina de Castellón (número 12) a la oficina de Navarra (número 11) Y bajar sus cuotas un diez por ciento. Cada asignación identifica una columna destino que hay que actualizar y especifica el modo de calcular su nuevo valor. Elevar el límite de crédito de Acme a 60. Diagrama sintáctico de la instrucción UPDATE. 106. REP_CLI 109 En este ejemplo la cláusula WHERE identifica una sola fila de la tabla CLIENTES. La especificación ANSmSO obliga a que se utilicen nombres no cualificados para las columnas destino. y la cláusula SET asigna valores nuevos a dos de las columnas de esa fila. no puede haber ninguna ambigüedad en los nombres de las columnas. La instrucción UPDATE sólo se aplica a SQL para programación y se describe en el Capítulo 17. Como busca en la tabla. no debe haber dos asignaciones para la misma columna destino.

Esto evita que las subconsultas hagan referencia a la tabla destino (algunas de cuyas filas puede que ya se hayan actualizado). 400000. Si se omite la cláusula WHERE. las asignaciones pueden especificarse en cualquier orden. Lo mismo ocurre con las referencias a columnas que tienen lugar en la cláusula WHERE.8 • CUOTAl) < Antes de la actualización. En la mayor parle de las implementaciones de los SGBD la expresión no puede incluir funciones de columna ni subconsultas. Bruno Arteaga tenía un valor de CUOTA de 350. UPDATE con subconsulta * Al igual que con la instrucción DELETE. Manual de referencia Capítulo 10: Actualizaciones de la base de datos UPDATE CLIENTES SET LIMITE_CREDITO = LIMITE_CREDITO + SOOO.000 € el límile de crédito de todos los clientes que hayan realizado pedidos por encima de 25. Tras la actualización su fila tiene un valor de VENTAS de 350. El estándar SQL2 también eliminó esta restricción y especifica que las referencias a la tabla destino en las subconsultas se evalúan como si no se hubiera actualizado ninguna fila de la tabla destino.00 VENTAS 5ET CUOTA WHERE CUOTA CUOTA UPDATE CLIENTES SET REP_CLI : lOS WHERE CUST_REP IN (SELECT NUM_EMPL FROM REPRESENTANTES WHERE VENTAS < (.00) 275 esté actualizando en la tabla destino. UPDATE REPRESENTANTES SET CUOTA = 1. las subconsultas pueden desempeñar un papel importante en la instrucción UPDATE. Reasignar todos los clientes atendidos por representantes cuyas ventas estén por debajo del ochenta por ciento de su cuota. La subconsulta de este ejemplo es una subconsuIta correlacionada. la instrucción UPDATE sin cláusula WHERE lleva a cabo una labor útil. considérese la instrucción UPDATE (algo foriada): UPDII. 400000. como se describe en el Capítulo 9. se actualizan todas las filas de la tabla destino. NUM_EMPL) 1 fila actualizada. en la que la cláusula WHERE casi nunca se omite.00. El orden de las asignaciones en la cláusula.05 * CQUOTA 10 filas actualizadas. realiza una actualización masiva de toda la tabla.000 f. Actualización de todas las filas La cláusula WHERE de la instrucción qPDATE es opcional. el valor utilizado para calcular la expresión es el valor de esa columna en la fila actual antes de que se aplique ninguna actualización. ya que permiten seleccionar las filas que hay que actualizar con base en la información contenida en otras tablas.OO WHERE NUM_CLI IN (SELECT DISTINCT CLIENTE FROM PEDIDOS WHERE IMPORTE> 25000. Al igual que en la instrucción DELETE. no de 400.911 €. Las referencias externas suelen hallarse en las subconsultas de las instrucciones UPDATE. como se demuestra en el ejemplo anterior. como en este ejemplo: Hacer que todos los representantes que atienden a más de tres cliellles informen directamente a Samuel Clavel (número de empleado /06).000 € Y un valor de VENTAS de 367. todas las referencias en las subconsultas a la tabla destino son referencias externas a la fila de la tabla destino que está verificando la cláusula WHERE de la instrucción UPDATE.274 SOL. por tanto. La columna NUM_EMPL de la subconsulta del ejemplo anterior es una de esas referencias externas.TE OFICINAS 4 filas actualizadas. ya que implementan la reunión entre las tablas de la subconsulla y la tabla destino de la instrucción UPDATE. Se aplica la misma restricción de SQLI que a la instrucción DELETE: la tabla destino no puede aparecer en la cláusula FROM de ninguna subconsulta en ningún nivel de anidamiento. hace referencia a la columna NUM_EMPL de la fila de la tabla REPRESENTANTES que está verificando la instrucción UPDATE.ar en 5. Por ejemplo. las subconsultas de la cláusula WHERE de la instrucción UPDATE pueden anidarse a cualquier nivel y pueden contener re· ferencias externas a la tabla destino de la instrucción UPDATE. A diferencia de la instrucción DELETE. Por ello. carece de importancia. A continuación se ofrecen varios ejemplos de instrucciones UPDATE que utilizan subconsultas: /ncrement. UPDATE REPRESENTANTES SET JEFE = 106 WHERE 3 < (SELECT COUNT{*) FROM CLIENTES WHERE REP_CLI /ncremenrar todas las cuotas un cinco por ciento. Si una expresión de la lista de asignaciones hace referencia a una de las columnas de la tabla destino. 2 filas actualizadas.000 €. Básicamente. .000 €.

DELETE y UPDATE sólo trabajan sobre una tabla a la vez. Las filas que hay que actualizar se especifican mediante una condición de búsqueda.276 SOL. Este capítulo presenta las características del lenguaje SQL que ayudan en esta tarea al SGBD. Las filas que hay que eliminar se especifican mediante una condición de búsqueda. DELETE O UPDATE. • Se pueden aplicar las modificaciones realizadas sólo parcialmente. Concepto de la integridad de datos Para mantener la consistencia y corrección de los datos. entre ellas las siguientes: 277 ~ . corno puede ocurrir al trasladar a un representante a una oficina inexistente. En las bases de datos relacionales se suelen encontrar diferentes tipos de restricciones de integridad de datos. • La instrucción INSERT sobre varias filas añade cero o más filas a una tabla. Cuando se modifica el contenido de una base de datos con las instrucciones INSERT. de muchas maneras diferentes. • La instrucción DELETE elimina cero o más filas de datos de una tabla. • Se pueden perder las modificaciones realizadas en la base de datos debido a un error del sistema o a un fallo del suministro eléctrico. Los valores para la nueva fila se especifican en la instrucción como constantes. Manual de referencia Resumen Este capítulo describe las instrucciones de SQL que se utilizan para modificar el contenido de las bases de datos: CAPíTULO 11 : • La instrucción INSERT sobre una sola fila añade una fila de datos a una tabla. Estas restricciones limitan los valores de datos que pueden introducirse en la base de datos o crearse mediante una actualización de la base de datos. Integridad de datos La expresión integridad de los datos hace referencia a la corrección y completitud de los datos de una base de datos. que puede operar sobre varias tablas. Las columnas que hay que actualizar y las expresiones que calculan sus nuevos valores se especifican en la instrucción UPDATE. Por ejemplo: • Se pueden añadir a la base de datos datos no válidos. se puede perder. como puede ocurrir al añadir un pedido para un producto sin ajustar la cantidad disponible para la venta. • La instrucción UPDATE modifica los valores de una o más columnas en cero O más filas de una tabla. Los valores para las nuevas filas provienen de una consulta. Uno de los papeles más importantes de los SGBD relacionales es el mantenimiento de la integridad de los datos almacenados en la medida en que sea posible. como puede ser un pedido que especifique un producto inexistente. • La condición de búsql!eda utilizada en las instrucciones DELETE y UPDATE tiene la misma forma que la condición de búsqueda de las instrucciones SELECT. que se especifica como parte de la instrucción INSERT. las instrucciones INSERT. • Se pueden modificar los datos existentes y asignarles valores incorrectos. los SGBD relacionales suelen imponer una o varias restricciones de integridad de datos. • A diferencia de la instrucción SELECT. la integridad de los daLas almacenados.

El mecanismo de las transacciones de SQL.características de SQL que alojan las cinco primeras restricciones de integridad se describen en este capítulo. puede' que la empresa que utiliza la base de datos de ejemplo tenga una regla de negocio que prohíba la aceptación de pedidos para los que no haya existencias suficientes. Integridad referencial. De manera parecida. Los valores duplicados son ilegales. o el representante estará asignado a una oficina no válida. el incremento de la columna VENTAS de la tabla REPRESENTANTES para la persona que haya tramitado el pedido y el incremento de la columna VENTAS de la tabla OFICINAS para la oficina a la que está asignado ese representante. Los intentos de insertar una fila que contenga un valor NULL (tanto explícita como implícitamente) da lugar a un error. Manual de referencia Capítulo 11: Integridad de datos 279 • Datos requeridos. no se permite que estén en blanco o contengan valores NULL.- \ . Otras relaciones de datos. Por tanto. que identifican de ma. Datos requeridos La restricción para la integridad de los datos más sencilla exige que las columnas contengan valores que no sean NULL. Las operaciones INSERT y UPDATE deben realizarse todas en orden para que la base de datos continúe en un estado consistente y correcto. Muchas transacciones del mundo real provocan múltiples actualizaciones de las bases de datos. y hay una amplia variación en las técnicas y en la sintaxis de SQL utilizadas para albergarlas. en la base de datos de ejemplo. Se puede pedir al SGBD que impida los valores NULL en esta columna. Por ejemplo. la aceptación del pedido de un cliente puede suponer la adición de una fila a la tabla PEDIDOS. Un inconveniente de la restricción NOT NULL es que generalmente se debe especificar cuándo se crea la tabla. se describe en el Capítulo 12. no vienen especificadas en el estándar ANSI/lSO. Por ejemplo. Se puede pedir al SGBD que haga cumplir este tipo de regla de consistencia o que incluya aplicaciones que implementen este tipo de reglas. Las. • Cada instrucción UPDATE que actualice la columna debe asignarle un valor de datos que no sea NULL. de modo que el dominio de la columna NUM_PEDIDO son los enteros positi- • Consistencia.nera unívoca al producto representado por esa fila. La situación del mundo real modelada por una base de datos suele tener restricciones adicionales que regulan los valores legales de los datos susceptibles de aparecer en la base de datos. Se puede pedir al SGBD que compruebe las modificaciones de las cuotas objetivo de la oficina y de los representantes para asegurarse de que sus valores están restringidos de esta manera. La clave primaria de una tabla debe contener en cada fila un valor único que sea diferente de los valores del resto de las filas. Se puede pedir al SGBD que evite otros valores de datos en estas columnas. la columna CLIENTE de]a tabla PEDIDOS es una columna requerida.. puede que el vicepresidente comercial desee asegurarse de que la cuota objetivo de cada oficina no supera el total de las cuotas objetivo de los representantes de esa oficina. La columna OFICINA_REP debe contener un valor válido de la columna OFICINA de la tabla OFICINAS. porque al crear la tabla resulta evidente qué columnas deben permitir valores NULL y cuáles no. El estándar ANSI/ISO de SQL especifica algunas de las restricciones de integridad de datos más sencillas. un conjunto de valores de datos que son legales para esa columna. El estándar ANSI/lSO y la mayor parte de los productos comerciales de SQL admiten esta restricción al permitir que se declare una columna como NOT NULL cuando se crea la tabla que contiene esa columna. alberga la restricción de datos necesarios y se implementa de una manera uniforme en casi todos los productos comerciales de SQL. • Comprobación de la validez. La base de datos de ejemplo utiliza números de pedido a partir de 100001. Habitualmente este inconveniente no es importante. Las restricciones más complejas. ya que no permitirían que la base de datos distinguiera un producto de otro. • • • • vos mayores de cien mil. el SGBD hace que se cumpla la restricción asegurándose de que: • Cada instrucción INSERT que añada filas nuevas a la tabla debe especificar un valor de datos que no sea NULL para esa columna. Se puede pedir al SGBD que haga cumplir esta restricción de claves externa/primaria. En la base de datos de ejemplo cada pedido debe tener un cliente asociado que lo realice. Por ejemplo. como la de las reglas de negocio. cada fila de la tabla PRODUCTOS tiene un conjunto único de valores en sus columnas ID_FAS e ID_PRODUCTO. que se describe en el Capítulo 13. Se puede pedir al SGBD que haga cumplir esta restricción de unicidad de los valores. Integridad de las entidades. Cada columna de una base de dalos tiene un dominio. Las claves externas de las bases de datos vinculan cada fila de la tabla hijo que contenga la clave externa con la fila de la tabla padre que contiene el valor correspondiente de la clave primaria. Algunas columnas de la base de dalOs deben contener un valor de datos válido en cada fila. En la base de datos de ejemplo. Por ejemplo. Cuando se declara una columna como NOT NULL. La restricción NOT NULL se especifica como parte de la instrucción CREATE TABLE. Reglas de negocio. que alberga la restricción de consistencia. Generalmente no se puede ir a una tabla ya creada y desautorizar los valores NULL en una columna. Los intentos de actualizar la columna con un valor NULL también dan lugar a un error. el valor de la columna OFICINA_REP de cada fila de la tabla SALESREPS relaciona al representante representado por esa fila con la oficina en la que trabaja. Las actualizaciones de las bases de datos pueden quedar restringidas por las reglas de negocio que regulan las transacciones del mundo real que se representan mediante las actualizaciones. Se puede pedir al SGBD que compruebe cada nueva fila que se añada a la tabla PEDIDOS para asegurarse de que el valor de su columna CANTIDAD no viola esta regla de negocio. También hay un problema lógico poten- ---!.. En particular.278 SOL. los números de empleado de la columna NUM_EMPL deben hallarse en el rango de 101 a 999.

Las restricciones de comprobación de las columnas se especifican como parte de la definición de las columnas en la instrucción CREATE TABLE. del modo en que la mayor parte de los SGBD implementan internamente los valores NULL. las reglas de SQL Server se escriben en el dialecto de Transacl-SQL que utiliza SQL Server. La imposibilidad de adición de restricciones NOT NULL a las tablas ya existentes también es consecuencia. la columna NUM_EMPL de la tabla REPRESENTANTES está definida como INTEGER. un programa escrito por el usuario que comprueba si los valores de los datos son válidos. En caso contrario. Considérese este fragmento de una instrucción CREATE TABLE. el byte indicador no·se halla presente. por lo que no se puede utilizar para buscar valores únicos o relaciones entre claves primarias y externas. y se le da un valor especificado para indicar los valores NULL. Por ejemplo. hay que indicar al SGBD lo que debe hacer con esas filas. por tanto. el SGBD comprueba de manera automática el valor de esa columna cada vez que se inserta o que se actualiza una fila para asegurarse de que la condición de búsqueda se cumple. Si una o varias columnas de la tabla ya contienen valores NULL. Cuando se especifica una restricción de comprobación para una columna. SQL Server permite asignar un nombre a la regla (LIMITE_CUOTA. datos. como las condiciones de búsqueda de las cláusulas WHERE. que se describe en el Capítulo 13. y el SGBD se asegura de que sólo se introduzcan en esa columna datos del tipo especificado. a continua· ción se muestra una instrucción de Transact~SQL que establece una regla para la columna CUOTA de la tabla REPRESENTANTES: CREATE RULE LIMITE_CUOTA AS @VALUE BETWEEN 0.280 SOL. en parte. DB2 invoca el procedimiento de validación cada vez que una instrucción de SQL intenta modificar una fila de la tabla o insertar una nueva y presenta al procedimiento de validación los valores de las columnas propuestos para esa fila. aunque los números de empleados de la base de datos de ejemplo tengan. Los dos dan al creador de la base de datos una manera de indicar al SGBD el modo de determinar si un valor de datos concreto es válido.. y el SGBD generará un mensaje de error si alguna instrucción INSERT o UPDATE intenta almacenar en esa columna una cadena de caracteres o un número decimal. SQL Server también ofrece una posibilidad de validación de datos al permitir la creación de reglas que determinen los valores de los datos que pueden introducirse legalmente en cada columna. mediante el valor de su respuesta. Representan objetos del mundo real. No obstante. aunque la empresa esté cerrada el día de Navidad. en este caso). Manual de referencia Capítulo 11: Integridad de datos 281 cial con la adición de restricciones NOT NULL a tablas ya existentes. Por ejemplo. el estándar SQLI y muchos productos comerciales de SQL no ofrecen ningún modo de restringir una columna a determinados valores de datos. La adición y eliminación dinámica de restricciones NQT NULL exigiría. por convenio. La caracterí~tica del dominio permite especificar una sola vez la prueba de validez y reutilizarla en la definición de muchas columnas diferentes cuyos valores legales de datos sean iguales. No obstante.000 €. lo que aborra espacio de almacenamiento en disco. los SGBD reservan un byte extra por cada columna en cada fila de datos almacenada que permite valores NULL. por ejemplo) que puede llevar a cabo las comprobaciones de valores que hagan falta. Generalmente. lo que no resulta práctico en bases de datos de gran tamaño. el procedimiento de validación no puede tener acceso a la base de Esta regla evita que se introduzca o se actualice una cuota con un valor negativo o mayor de 500. A diferencia de los procedimientos de validación de DB2. pero desde ese momento violan la restricción de datos (recién) impuesta. También se aceptaría una fecha de contratación de 25 de diciembre. Sin embargo.00 Comprobación simple de validez El estándar SQLl ofrece un soporte limitado de las restricciones de los valores legales que pueden aparecer en las columnas. incluy~ndo comprobaciones de rangos y de consistencia interna de la fila. Cuando se crea una tabla se le asigna un tipo de datos a cada una de las columnas. El procedimiento de validación es un programa convencional (escrito en ensamblador S/370 o en PUl. corno ocurre con los procedimientos de validación de DB2. Como se muestra en el ejemplo. SQL Server comprueba la regla cada vez que se intenta aplicar INSERT O UPDATE a la tabla que contiene esa columna. se puede asignar a cada tabla de la base de datos el procedimiento de validación correspondiente. Algunas implementaciones comerciales de SQL ofrecen características suplementarias para la comprobación de los valores legales de los datos. El byte extra sirve como indicador de valor nulo para la columna. las reglas de SQL Server no pueden hacer referencia a columnas ni a otros objetos de la base de datos. la reconfiguración sobre la marcha de las filas almacenadas en el disco. modificado a partir de la definición de la base de datos de ejemplo para incluir tres restricciones de comprobación: CREATE TABLE REPRESENTANTES (NUM_EMPL INTEGER NOT NULL . El procedimiento de validación comprueba los datos e indica. por ejemplo. En DB2. si son aceptables. Cuando se define una columna como NOT NULL. El estándar SQL2 ofrece un soporte más amplio de las comprobaciones de validez mediante dos características diferentes -las restricciones de comprobación de las columnas y los dominios. que producen valores verdadero o falso. la instrucción INSERT o UPDATE falla. sólo tres cifras. La característica de la comprobación de restriccion~ especifica la prueba de validez de los datos para una sola columna. El SGBD no ofrecerá ningún obstáculo a la inserción en una fila de REPRESENTANTES del número de empleado 12345. Restricciones de comprobación de columnas (SQL2) Las restricciones de comprobación de SQL2 son condiciones de búsqueda.00 AND 500000.

Un dominio es un conjunto de valores legales de datos. si la empresa crece y se deben permitir números de empleados del rango 200-299). los paréntesis que siguen a la palabra clave CHECK pueden contener cualquier condición de búsqueda válida que tenga sentido en el contexto de la definición de una columna. se puede utilizar varias veces el nombre del dominio. incluso. se emplea una condición de búsqueda para definir el rango de los valores legales de los datos. En las grandes bases de datos empresariales puede haber literalmente cientos de dominios definidos. La segunda restricción (para la columna EDAD) evita de manera parecida la contratación de menores de edad.01 CUOTA MONEY CHECK (MONEY >= 0. Estas posibilidades se describen con mayor detalle en el apartado «Restricciones avanzadas». resultaría imposible distinguir la fila que representa realmente a la entidad del mundo real asociada con ese valor de la clave -Bruno Arleaga. Con esta flexibilidad las restricciones de comprobación pueden comparar varios valores de dos columnas diferentes de la tabla o. Estas tres restricciones de comprobación de columnas son ejemplos muy sencillos de la posibilidad especificada por el estándar SQL2. OBJETIVO MONEY. Capitulo 11: Integridad de datos 283 CUOTA MONEY CHECK (MONEY >= 0. VENTAS MONEY NOT NULL Dominios (SQL2) Los dominios de SQL2 generalizan el concepto de restricción de comprobación y permiten aplicar de manera sencilla la misma restricción de comprobación a muchas columnas diferentes de una base de datos. En general. si las columnas de otras tablas contienen también números de empleado. Tanto para especificar un dominio como para asignarle un nombre de dominio se emplea la instrucción de SQLZ CREATE OOMAIN.00 €. La ventaja de emplear un dominio es que. puede que se emplee para definir las columnas de las tablas de la base de datos en lugar del tipo de datos. Por ejemplo. que se describe en el Capítu!o 13. Aprovechando esta posibilidad. Por este motivo.0) La primera restricción (para la columna NUM_EMPL) exige que los números de empleado válidos sean números de tres cifras comprendidos entre 101 y 199. el requisito de que las claves prima. más adelante en este mismo capítulo. Si la definición se modifica posteriormente (por ejemplo. Una vez definido el dominio ID_EMPLEADa_vALIDO. la instrucción CREATE TABLE de ejemplo para la tabla REPRESENTANTES tendría el aspecto siguiente: . REGION VARCHAR(lOj NOT NULL.282 SOL. que es el empleado número 106-. resulta mucho más sencillo modificar una definición de dominio que muchas restricciones de columnas dispersas por toda la base de datos. Integridad de las entidades La clave primaria de cada tabla debe tener un valor único para cada fila de la tabla. y las ventajas de los dominios de SQL2 en la gestión de los cambios pueden ser muy notables. que incluye a todos los números de empleado: CREATE DOMAIN ID_EMPLEADO_VALIDO INTEGER CHECK (VALUE BETWEEN 101 AND 199) Otra ventaja de los dominios es que la definición de los datos válidos (como los números de empleado válidos de este ejemplo) se almacena en un punto central de la base de datos. Al igual que con la definición de restricción de com~ probación. La tabla OFICINAS contiene una de esas columnas: CREATE TABLE OFICINAS (OFICINA INTEGER NOT NULL. EDAD INTEGER CHECK (EDAD >= 18). si dos filas de la tabla REPRESENTANTES tuvieran el valor 106 en la columna NUM~EMPL. rias tenganvalores únicos se denomina restricción de integridad de las entidades. CIUDAD VARCHAR(15) NOT NULL. a continuación se ofrece una instrucción CREATE DOMAIN de SQL2 para crear el dominio ID_EMPLEADO_VALIDO. Manual de referencia CHECK (NUM_EMPL BETWEEN 101 AND 199). lo que simplifica las definiciones de las tablas. comparar un valor de datos propuesto con otros valores de la base de datos. CREATE TABLE REPRESENTANTES (NUM_EMPL ID_EMPLEADO_VALIDO.La tercera restricción (para la columna CUOTA) evita que un representante tenga una cuota inferior a 0. o la base de datos perderá su integridad como modelo del mundo exterior. JEF ID_EMPLEADO_VALIDO. . EDAD INTEGER CHECK (EDAD >= 18). Por ejemplo.

e identifica de manera unívoca cada fila. Por ejemplo. el usuario de SQL no tiene que preocuparse de estas instrucciones en absoluto. La clave primaria se especifica como parte de la instrucción CREATE TABLE. El estándar ANSUISO para SQL utiliza la instrucción CREATE TABLE para especificar las restricciones de unicidad para las columnas o combinaciones de columnas..00€ 186.1. Cuando se especifica una clave primaria para una tabla. Los intentos de insertar una fila con un valor duplicado de la clave primaria o de actualizar una fila de modo que su clave primaria sea un valor duplicado fallarán y generarán un mensaje de error.. el estándar SQL exige que cada columna que forme parte de una clave primaria se declare como NOT NULL.. las restricciones de unicidad se implementaron en DB2 mucho antes de la publicación del estándar ANSIIISO.. Por este motivo. La mayor parte de los otros fabricantes comerciales han seguido el mismo camino y.a OFICINAS CIUDAD 22 Daimiel 11 Navarra 12 Castellón 13 Almería 21 León REGIÓN Oeste Este Este Este Oeste JEF OBJETIVO S 300.1 muestra las tablas REPRESENTANTES Y OFICINAS e ilustra el modo en que trabajan las claves primarias y las externas..OO€ 835..000.. Muchos productos comerciales de SQL siguieron la práctica original de DB2 en lugar del estándar ANSrnSO para las restricciones de unicidad y exigieron el empleo de una instrucción CREATE INDEX. Las versiones posteriores de DB2 añadieron una restricción de unicidad a la instrucción CREATE TABLE. La columna OFICINA_REP. La Figura 11. . Supóngase que se in. La respuesta debe ser «quizás».1C~NAl::i . es una clave externa de la tabla OFICINAS. y DB2 las transformó en parte de su instrucción CREATE INDEX... Conjuntamente. Se añadió a DB2 en 1988 y al estándar ANSlIISO original en una actualización intermedia. La columna OFICINA es la clave primaria de la tabla OFICINAS.. No obstante. supóngase que se desea restringir los datos de la labIa REPRESENTANTES de modo que dos representantes no puedan tener exactamente el mismo número en la tabla.. . La definición de la base de datos de ejemplo del Apéndice A incluye definiciones de claves primarias para todas las tablas. Cualquier intento de insertar o actualizar una fila de la tabla que viole la restricción de unicidad fracasará. si la clave primaria está compuesta por más de una ~olumna).00€ 108 725.00 lO' aoo. Se aplica la misma restricción a cada columna que figure en una restricción de unicidad.OO€ 367. OFICINA REP PUESTO 13 Representante 11 Representante 21 Representante 11 VP Ventas 12 Jefe Ventas 12 Representante NULL Representante 21 Jefe Ventas 12 Representante l .00€ NULL 350. ..tenta insenar una fila con una clave primaria que sea NULL (o parcialmente NULL.000. incluyen el estándar ANSurSO para la restricción de unicidad. al valor NULL el SGBD no puede decidir de manera concluyente si la clave primaria duplica otro valor que ya se halle en la tabla.00€ 575. Una referencia a clave primaria/clave externa. Cada fila OFICINAS (padre) tiene cero o Otras restricciones de unicidad A veces resulta adecuado exigir que una columna que no es la clave primaria de la tabla contenga un valor único en cada fila.ooo.042. Esta instrucción es una de las instrucciones para administración de la base de datos que tratan del almacenamiento físico de la base de datos en el disco. en función del valor «real» de los datos que faltan (NULL). ---"-- . estas restricciones aseguran que las columnas que se supone que contienen valores únicos en cada fila de la tabla lo hagan realmente. Normalmente.. .OO€ 735.. pero hoy en día resulta muy frecuente. de la tabla REPRESENTANTES.. antes de que apareciera el estándar SQL2 completo. Tabl Ul'·.000. sólo las utiliza el administrador de la base de datos.000.637. Las columnas OFICINA_REP y OFICINA crean una relación padrelhijo entre las filas OFICINAS y REPRESENTANTES. hoy en día. las claves externas y las relaciones padre/hijo que crean entre las tablas.042. Debido Tabla REPRESENTANTES I NUM EMPL NOMBRE 105 Bruno Arteaga 109 Maria Jiménez 102 Susana Santos 106 samuel Clavel lO' Bernardo Sánchez 101 Daniel Ruidrobo 110 Tomás Saz 108 León Freire 103 Pablo Cruz 107 Neus Azcárate EDlID 37 31 '8 S2 33 45 " 62 29 49 . que se describe en el Capítulo 13.00€ 692. Este objetivo se puede conseguir imponiendo una restricción de unicidad a la columna NOMBRE.911..OO€ 108 106 t incipal Refer Unicidad y valores NULL Los valores NULL plantean un problema cuando aparecen en la clave primaria de una tabla o en una columna especificada en una restricción de unicidad.. Identifica la oficina a la que está asignado cada representante. el SGBD comprueba de manera automática la unicidad del valor de la clave primaria de cada instrucción INSERT o UPDATE ejecutada sobre la tabla. Integridad referencial El Capítulo 4 estudiaba las claves primarias.. siguiendo la sintaxis del estándar ANSI/ISO. El SGBD hace que se cumpla la restricción de unicidad del mismo modo en que hace que se cumpla la restricción de clave primaria..284 SOL Manual de referencia Capítulo 11: Integridad de datos 285 I En las primeras bases de datos comerciales de SQL no se daba soporte a las claves primarias. " .915.... 22 Re~resentante I J Figura 11.

el nuevo valor debe coincidir con uno de la clave primaria (OFICINA) de la tabla padre (OFICINAS). el número de oficina de la instrucción INSERT es probable que sea un error -puede que el usuario pretendiera escribir el número de oficina 11. se rechaza la instrucción INSERT. no hay nada erróneo en esta instrucción INSERT. En la Figura 11. Si la clave externa (OFICINA_REP) se modifica mediante una instrucción UPDATE. VENTAS) 31. ya que habrá un hijo sin padre (un huérfano). Cuando una instrucción INSERT añade una nueva fila a la tabla hijo (REPRESENTANTES). el padre de esa fila simplemente tiene un hijo menos tras esa eliminación. se transforma en un padre sin hijos. 0. Si el valor de la clave externa no coincide con ninguno de los de la clave primaria. cada fila REPRESENTANTES (hijo) tiene exactamente una fila OFICINAS (padre) con un número de oficina coincidente. Utilizando las tablas OFICINAS y REPRESENTANTES de la Figura 11. las filas hijos se transforman en huérfanos. Cabría preguntarse lo que ocurrirá con las dos filas hijos de la tabla REPRESENTANTES que representan a los representantes asignados a la oficina de León. El tercer problema (DELETE de una fila padre) es más complejo. Si no coinciden con un valor de la clave primaria. El primer problema (INSERT en la tabla hijo) se aborda comprobando los valores de las columnas de la clave externa antes de autorizar la instrucción INSERT. En la Figura 11. De hecho. 37. FECHA_CONTRATO. Si se modifica la clave primaria (OFICINA) de una fila de la tabla padre (OFICINAS). indicando que se desconoce su asignación de oficina. 21 o 13. aunque no aparezca ninguna oficina número 31 en la tabla OFICINAS. EDAD. • Actualización de la clave primaria de una fila padre. La mayor parte de los fabricantes de SGBD de hoy en día soportan las restricciones de integridad referencial. Se trata de una forma diferente del problema anterior. De manera parecida. Esta regla se conoce como restricción de integridad referencial. esa oficina ya debe estar en la tabla OFICINAS. el valor de su clave externa (OFICINA_REP) debe coincidir con uno de los de la clave primaria (OFICINA) de la tabla padre (OFICINAS). En caso contrario. muchas implementaciones de SQL añadirán la fila con éxito. • Eliminar también de manera automática a los dos representantes de la tabla REPRESENTANTES. esta restricción tiene sentido en la base de datos de ejemplo. supóngase que se cerrara la oficina de León y se quisiera eliminar la fila correspondiente de la tabla OFICINAS en la Figura 11.1. Si se elimina una fila de la tabla padre (OFICINAS) que tenga uno o varios hijos (en la tabla REPRESENTANTES). La base de datos mostrará que Gabriel Suárez trabaja en la oficina número 31. Obsérvese que la eliminación de una fila de la tabla hijo no plantea ningún problema.1 esto significa que antes de poder reasignar a un represen· tante a una oficina diferente. 'Ol-ABR-90'. OFICINA_REP.1 esto significa que antes de que se pueda añadir un representante nuevo a la tabla REPRESENTANTES.00) l' l' Aparentemente. Supóngase que se ha intentado insertar una nueva fila en la tabla REPRESENTANTES que contenía un número de oficina no válido. En función de la situación se deseará: • Evitar que se elimine la oficina hasta que se haya reasignado a los representantes. IBM añadió el soporte de la integridad referencial a DB2 en 1989. Como puede verse. Parece claro que se debe obligar a que cada valor legal de la columna OFICINA_REP coincida con algún valor que aparezca en la columna OFICINA. La integridad referencial ha sido una parte principal del modelo relacional desde que Codd la propuso por primera vez.1 como ejemplo. Los valores de la clave externa (OFICINA_REP) de estas filas ya no coincidirán con ningún valor de la clave primaria (OFICINA) de la tabla padre. La fila recién insertada rompe claramente la relación padrelhijo entre las tablas OFICINAS y REPRESENTANTES. . • Eliminación de una fila padre. ni en las primeras versiones de DB2 ni de SQUDS. la inserción de la fila deteriorará la base de datos. El segundo problema (UPDATE de la tabla hijo) se resuelve de manera parecida comprobando el valor actualizado de la clave externa. Asegura la integridad de las relaciones padre/hijo creadas por las claves primarias y externas. Las características de integridad referencial del estándar ANSI/ISO de SQL trata cada una de estas cuatro situaciones. Obsérvese que la inserción de una fila en la tabla padre no supone nunca un problema. las restricciones de integridad referencial no se incluyeron en el prototipo de IBM del SGBD SystemIR. esta restricción tiene sentido en la base de datos de ejemplo. ya debe estar en la tabla OFICINAS la oficina a la que se le asigne. la fila actualizada será huérfana. • Actualización la clave externa de una fila hijo. Se trata de una forma diferente del problema anterior. como en este ejemplo: INSERT INTQ REPRESENTANTES VALUES (115. Problemas de integridad referencial Hay cuatro tipos de actualizaciones de las bases de datos que pueden afectar a la integridad referencial de las relaciones padre/hijo de una base de datos. Sin embargo. NOMBRE. sencillamente. Si no hay ningún valor coincidente en la clave primaria. 'Gabriel Suárez'. como el número de oficina de la oficina central de Navarra. la instrucción UPDATE se rechaza con un mensaje de error. y la integridad referencial se añadió al estándar SQLl tras su edición inicial. De hecho. tenemos las siguientes cuatro situaciones de actualización: • Inserción de una fila hijo nueva. • Definir la columna OFICINA_REP de los dos representantes como NULL.286 SOL Manual de referencia Capítulo 11: Integridad de datos 287 más filas REPRESENTANTES (hijos) con números de oficina coincidentes. Una vez más. (NUM_EMPL. Por ejemplo. • Definir la columna OFICINA_REP de los dos representantes con algún valor predeterminado. todos los hijos existentes de esa fila se transforman en huérfanos debido a que sus claves externas ya no coinciden con ningún valor de la clave primaria.

eliminar la fila antigua de la tabla OFICINAS para León. el SGBD generará un código de error. hay que indicar que se desconoce la asignación actual de oficina de sus representantes». Aunque algunas de estas opciones puedan parecer más lógicas que otras en este ejemplo concreto. Para las tablas de la Figura 11. • Regla de eliminación SET DEFAULT. Las versiones recientes de DB2 admiten tanto la regla de eliminación RESTRICT como la regla de eliminación NO ACTION. Para la Figura 11. nes DELETE que intenten eliminar una de estas filas padres se rechazarán con un mensaje de error. finalmente. Manual de referencia Capítulo 11: Integridad de datos 289 indicando que los representantes se reasignan de manera automática a esa oficina. por tanto. No obstante. si se desea que la base de datos modele con precisión la situación del mundo real. La regla de eliminación RESTRICT evita que se elimine una fila de la tabla padre si esa fila tiene hijos. el nombre de DB2 para esta regla. La denominación de SQL2 es algo confusa.1 esta regla puede resumirse así: «Si se elimina una oficina.1 esta regla puede resumirse así: «La eliminación de una oficina elimina de manera automática a todos los representantes asignados a esa oficina». actualización indica al SOBO lo que debe hacer cuando un usuario intente actualizar el valor de Reglas de eliminación y actualización * Para cada relación padre/hijo creada por una clave externa de una base de datos. • Regla de eliminación SET NULL. El estándar SQLI sólo ofrecía la primera posibilidad para los ejemplos anteriores -prohibía la modificación de los valores en uso de las claves primarias y la eliminación de filas que contuvieran una clave primaria-o DB2. Las eliminaciones en la tabla padre generan. también se deben eliminar automáticamente de la tabla hijo todas sus filas hijos. corno el número de oficina de la cenrral de Navarra. una actualización «definir como DEFAULT» de las columnas correspondientes de la tabla hijo. En este caso. el valor de la clave externa de sus filas hijos debe definirse automáticamente como el valor predeterminado de esa columna concreta. sin embargo. Al igual que en el ejemplo anterior. Por ejemplo. Hay unas pequeñas diferencias entre las implementaciones de SQL2 y de DB2 de las reglas de eliminación. esta regla puede resumirse así: «No se puede eliminar una oficina si tiene representantes asignados». Las eliminaciones de la tabla padre provocan. la regla de. El estándar SQL2 llama realmente NO ACTION a·la regla RESTRICT ya descrita. La regla de eliminación SET NULL indica al SGBD que cuando se elimine una fila padre se debe definir automáticamente como NULL el valor de la clave externa de todas sus filas hijo. una actualización «definir como NULL» en las columnas correspondientes de la tabla hijo. de modo que sus filas sigan vinculadas con la fila de León de la tabla OFICINAS. Una vez más hay cuatro posibilidades lógicas: • Evitar que el número de oficina se modifique hasta que se haya reasignado a los representantes. indicando que su asignación de oficina es desconocida. De manera intuitiva. • Regla de eliminación CASCADE. La regla RESTRICT se aplica antes que ninguna otra restricción. De este modo se restringen las eliminaciones de la tabla padre a las filas sin hijos. En casi todas las circunstancias las dos reglas operan de manera idéntica. la regla NO ACTION se aplica después de las demás restricciones referenciales. La implementación actual de DB2 no incluye la regla SET DEFAULT. Significa: «Si se intenta eliminar una fila padre que todavía tenga hijos. Aplicada a la Figura 1 J . La regla de eliminación CASCADE indica al SGBD que cuando se elimine una fila padre. hay que indicar que la asignación actual de oficina de sus representantes es la oficina predeterminada especificada en la definición de la tabla REPRESENTANTES». se desea modificar el número de la oficina de León del 21 al 23. el SOBD no emprenderá ninguna acción sobre esa fila». Para las tablas de la Figura 11. El cuarto problema (UPDATE de la clave primaria de la tabla padre) tiene una complejidad parecida. permitía otras opciones mediante su concepto de reglas de eliminación.288 SaL. • Actualizar de manera automática el número de oficina de los dos representantes en la tabla REPRESENTANTES. Se pueden especificar estas cuatro reglas de eliminación: • Regla de eliminación RESTRICT. La regla de eliminación SET DEFAULT indica al SGBO que.1 esta regla puede resumirse así: «Si se elimina una oficina. la pregunta es lo que debe ocurrir con las filas hijo de la tabla REPRESENTANTES que representan a los representantes de la oficina de León. • Definir la columna OFICINA_REP de los dos representantes con un valor predeterminado. restrict. primero habría que añadir una fila nueva a la tabla OFICINAS con el nuevo número de oficina de León. parece una descripción mejor de la situación -el SGBD restringirá (impedirá) la operación DELETE y generará un código de error. por alguna razón. cuando se elimina una fila padre. resulta relativamente sencillo encontrar ejemplos en que cualquiera de las opciones sea la solución correcta. ésta sólo viene especificada en el estándar SQL2. el estándar SQL2 permite especificar una regla de eliminación y una regla de actualización asociadas. La regla de eliminación indica al SOBD lo que debe hacer cuando un usuario intente eliminar una fila de la tabla padre. supóngase que. que tratan tanto la eliminación de filas padre como la actualización de las claves primarias. indicando que los representantes se reasignan de manera automática a esa oficina. Al igual que la regla de eliminación indica al SOBO lo que debe hacer cuando un usuario intente eliminar una fila de la tabla padre. mediante su nuevo número de oficina: • Definir la columna OFICINA_REP de los dos representantes como NULL. El estándar SQL2 ha ampliado estas reglas de eliminación a reglas de eliminación y actualización. por (anta. luego actualizar la tabla REPRESENTANTES y. Las instruccio- . La diferencia entre ellas es el momento de aplicación de la regla.1.

las modificaciones de las claves primarias de la tabla padre quedan restringidas a las filas sin hijos. 106 Sou:Iel Clavel >O. las modificaciones de la clave primaria de la tabla padre generan una actualización «definir como DEFAULT» de las columnas correspondientes de la tabla hijo. la tabla PEDIDOS contiene tres relaciones clave externa/clave primaria. cuando se actualice el valor de la clave'primaria de una fila padre.-CLI EMPRESA . Aplicada a la Figura 11. En consecuencia. una actualización «definir como NULL» de las columnas correspondientes de la tabla hijo. . hay que cambiar de manera automática la asignación de oficina de sus representantes a la oficina predeterminada especificada en la definición de la tabla REPRESENTANTES». como regla de eliminación y regla de actualiza-ci6n de una relaci6n padre/hijo. Tabla REPRESEm'ANTES NIDLEHPL """"RE Tabla PRODUCTOS IDJAB ID PRODUC"l'O DESCRIPCIÓN 2108 HeZ'lche " L6pez 2117 J. Las instrucciones UPDATE que intenten modificar la clave primaria de una fila padre de este tipo se rechazarán con un mensaje de error. La regla de actualización SET NULL indica al SGBD que cuando se actualice el valor de la clave primaria de una fila padre. La regla de actualización RESTRICT es un convenio de denominación de DB2.. hay que indicar que la asignación actual de oficina de sus representantes es desconocida». • Regla de actualización CASCADE. Las mismas diferencias entre DB2 y el estándar SQL2 descritas para las reglas de eliminación son aplicables para las reglas de actualización. no en la implementación actual de DB2. en la mayor parte de los ca- SOS. deba utilizar la regla RESTRICT para eliminación y actualización.A. Para las tablas de la Figura 11. Por tanto.P. Manual de referencia' Capítulo 11: Integridad de datos 291 una de las columnas de la clave primaria de la tabla padre. • Regla de actualización SET NULL. • El representante que tramitó el pedido. Para la Figura 11.1 esta regla puede resumirse así: «Si se modifica el número de una oficina. Generalmente. para la relación entre un pedido y el vendedor.lniel R'Jidrobo m "41003 4100441003 Serie J. a CLIENTES NUM. se debe definir de manera automática como NULL el valor de la clave externa de todas sus filas hijos. cable Hélice CASCAD" (eliminar hijo cuando se elimine al padre) Tabla PEDIDOS NrnLPEDIDO FECHA PEDIDO CLIEm'E RE' ~'7 'AB 2108 2120 2106 101 AC' 4100X 102 'MM 179C 101 2A45C (definir el hijo como NULL cuando se elimine RESTRIC1' al padrel (prohibir la eliminación del padre) PRODUCTO 113055 l5-FEB-90 113048 10-FEB-90 112993 04-ENE-S9 "" Figura 11. el comportamiento del mundo real modelado por la base de datos indicará la regla que resulta apropiada. hay cuatro posibilidades.1 esta regla puede resumirse así: «No se puede modificar el número de una oficina si tiene asignados representantes».2. que recuerdan a las disponibles para las reglas de eliminación: • Regla de actualización RESTRICT. Para las tablas de la Figura 11. el valor de la clave externa de todas sus filas hijos debe definirse automáticamente como el valor predeterminado de esa columna concreta. • Regla de actualización SET DEFAULT.1 esta regla puede resumirse así: «Si se modifica el número de una oficina. el valor predeterminado es la regla RESTRICT. Las modificaciones de la clave primaria generan. por tanto. La regla de actualización SET DEFAULT sólo se halla presente en el estándar. La regla de actualización SET DEFAULT indica al SGBD que. Bernardo SáDcbe: 101 AC> AC' D. Una vez más. No debería resultar posible eliminar de la base de datos información de productos ni modificar T . aunque. Para cada una de estas relaciones parecen adecuadas reglas diferentes: • Es probable que. Sotoca 2122 Toledo S. como puede verse en la Figura 11.2. Cada una de estas reglas resulta adecuada en situaciones diferentes. En la base de datos de ejemplo. Las reglas DELETE en acción. Se pueden especificar dos reglas diferentes. ya que presenta el riesgo mínimo de destrucción o modificación accidental de los datos.290 SOL. Estas tres relaciones vinculan cada pedido con: • El producto encargado. La regla de actualización CASCADE indica al SGBD que cuando se modifique el valor de la clave primaria de una fila padre. cable Serie 4. La regla de actualización RESTRICT evila que se actualice la clave primaria de una fila de la tabla padre si esa fila tiene hijos. Si no se especifica ninguna regla. el estándar SQL2 también llama NO ACTION a esta regla de actualización. el valor correspondiente de la clave externa de sus filas hijo debe modificarse también de manera automática en la tabla hijo para que coincida con la nueva clave primaria.1 esta regla puede resumirse así: «La modificación del número de una oficina modifica automáticamente el número de oficina de todos los representantes que tenga asignados». las dos reglas serán idénticas. • El cliente que realizó el pedido.

con una regla d. las modificaciones del número de cliente deben transmitirse de manera automática a los pedidos de ese cliente.OO€ VENTAS 186. Esta vez. NULL .911. la regla de eliminación SET NULL indica al SGBD"que defina la columna OFICINA_REP como NULL en las filas de REPRESENTANTES que hacen referencia a la oficina número veintiuno.000.OO€ 367.OO€ 108 725. por tanto.000. Supóngase para esta discusión que las relaciones OFICINAS/REPRESENTANTES Y REPRESENTANTES/PEDIDOS que aparecen en la figura tienen reglas CASCADE. para que las modificaciones en los números de empleado se transmitan automáticamente a la tabla PEDIDOS. Como muestra el ejemplo. Dos niveles de las· reglas CASCADE. esto no resulta muy frecuente. La eliminación.3. De manera parecida. ya que pueden generar una eliminación automática generalizada de datos si se utilizan de manera incorrecta.000. No obstante. las filas siguen en la tabla REPRESENTANTES. La regla CASCADE de la relación OFICINAS/REPRESENTANTES indica al SGBD que elimine también de manera automática todas las filas de REPRESENTANTES que hagan referencia a la oficina de León (oficina número 21). En la práctica. Planteémonos lo que ocurre cuando se elimina la oficina de León de la tabla OFICINAS.292 SOL. su impacto acaba en la tabla hijo. Esta regla indica al SGBD que elimine de manera automática todas las filas de PEDIDOS que hagan referencia a Susana (número de empleado 102).000.042. Las reglas de actualización y de eliminación SET NULL y SET DEFAULT son reglas de dos niveles. puede ser una regla multinivel. también habrá que eliminar los pedidos pendientes de ese cliente. En ese caso.OO€ 800.OO€" S7S. Pero la eliminación de la fila de Susana Santos de REPRESENTANTES pone en funcionamiento la regla CASCADE para la relación REPRESENTANTES/PEDIDOS. • Para la relación entre un pedido y el cliente que lo formuló. a la tabla padre de la relación-o La regla CASCADE. por lo que las actualizaciones en cascada suelen tener efectos de menor alcance que las eliminaciones en cascada. Yla repercusión de la operación de eliminación sólo llega a la tabla hijo.OO€ NOLL 350. lo que causa una eliminación en cascada de pedidos. Tabla OFICINAS OFICINA 22 11 12 CIUDAD Daimiel Navarra Castellón 13 Almeria 21 León REGIÓN Oeste Este Este Este Oeste JEF 108 106 104 OBJETIVO 300. Es probable que esta relación deba utilizar la regla de actualización CASCADE.OO€ 735.000. las reglas de eliminación CASCADE deben especificarse con cuidado. Manual de referencia Capítulo 11: Integridad de datos 293 su número de producLO si sigue habiendo pedidos pendientes de esos pro· duetos.042. por otra parte. • Para la relación entre un pedido y el representante que lo tramitó. Las reglas de actualización en cascada pueden crear actualizaciones multinivel parecidas si la clave externa de la tabla hijo también es su clave primaria.915. como puede verse en la Figura 11. De manera alternativa podría utilizarse la regla SET DEFAULT para asignar de forma automática esos pedidos al vicepresidente de ventas. es probable que deba utilizar la regla CASCADE para eliminaciones y actualizaciones. es probable que deba utilizar la regla SET NULL.e eliminación SET Figura 11. los pedidos que haya tramitado pasan a ser responsabilidad de un representante desconocido hasta que se reasignen.OO€ 692. para la relación OFICINAS/REPRESENTANTES.3.OO€ " Eliminaciones y actualizaciones en cascada * La regla RESTRICT para eliminaciones y actualizaciones es una regla de un solo nivel -sólo afecta. Probablemente s610 se elimine una fila de cliente de la base de datos si el cliente está inactivo o si ha concluido su relación con la empresa. al eliminar al cliente.637.4 muestra nuevamente las tablas oFicINAS. REPRESENTANTES y PEDIDOS. Si el representante abandona la empre· sa. cuando se elimina la oficina de León.OO€ 835. genera una eliminación en cascada de representantes. La Figura 11.

00€ 367.OO€: 575.000. del modo en que se halla definida la base de datos de ejemplo. supóngase que los valores NULL no estuvieran permitidos en las claves primarias O externas de las dos tablas de la Figura 11.637.QO€ NULL 350.00e: 725. * En la base de datos de ejemplo. Considérese esta solicitud de actualización de la base de datos y las instrucciones INSERT que intentan implementarla: EDAD OFICINA REP PUESTO 109 Maria Jiménez 102 Susana Santos 106 Samuel Clavel 31 48 52 11 21 11 Representante Representante Jefe Ventas Clave externa Tabla OFICINAS OFICINA I CIUDAD 22 Daimiel 11 Navarra 12 Castellón 13 Almería 21 León CLIENTE REP FAB I REGIÓN oeste Este Este Este Oeste JEF 108 lO.QOQ. una clave externa de la tabla REPRESENTANTES.OO€ 108 SET NULL Tabla REPRESENTANTES NUM EMPL NOMBRE tiene la columna JEF.OOe: a35. Por ejemplo.as 33 12 Jefe Ventas lO' Bernardo Sánchez 101 Daniel Ruidrobo 12 Representante 45 110 Tomás Saz 41 NULL Representante lOa Le6n Freire . Manual de referencia Capitulo 11: Integridad de datos 295 T a bla OFICINAS OFICINA CIUDAD 22 11 12 13 21 REGIÓN JEF 108 106 lO' OBJETIVO VENTAS Daimiel Navarra Castellón Oeste Este Este Este Almeria León Oeste 300.000. pero también es posible crear ciclos de tres o más tablas.042.294 SOL. (No se trata.91l. Como puede verse en la Figura 11.2 21 Jefe Ventas 103 Pablo Cruz 29 12 Representante 107 Neus Azcárate 22 Representante 49 Clave primaria l Ciclos referenciales OFICINA_REP. la tabla REPRESENTANTES contiene la columna una clave externa de la tabla OFICINAS.Oa€ aao.oae: 350.000. en realidad.5.OO€ VENTAS CASCADE NULL 108 186.915.QO€ aoo. los ciclos referenciales plantean problemas especiales para las restricciones de la integridad referencial.oaa.OO€ 725. que hace referencia a una fila de la tabla REPRESENTANTES. Este ciclo sólo incluye dos tablas.OO€ 835.aa€ 692.00Q.4. 000. por motivos que se harán evidentes en un momento).000.8 21 Representante 106 Samuel Clavel 52 11 VP Vent.5. estas dos relaciones forman un ciclo referencial.OO€ Tabla PEDIDOS NUM PEDIDO FEC~PEOI Clave prima ria t Referencia Referencia 113055 lS-FEB-90 113048 lO-FEB-90 112993 Q4-ENE-89 2108 2120 2106 101 102 102 Ael lMM REl Figura 11.a42.aa€ 735. Cualquier fila dada de la tabla REPRESENTANTES hace referencia a una fila de la tabla OFICINAS.000.637.000.00 € 186 042.00 € 735. etc.042.QO€ 692. Una combinación de reglas de eliminación DELETE.911.OOe: 575.QO€ 367. lO' OBJETIVO 300. . Independientemente del número de tablas que impliquen. Clave externa Tabla REPRESENTANTES NUM-EMPL NOMBRE EDAD OFICINA REP PUESTO 37 105 Bruno Arteaga 13 Representante 109 María Jiménez 31 11 Representante 102 Susana Santos . La tabla OFICINAS con- Figura ".915. Un ciclo referencial.5.

que todavía nO. y la tabla NIÑOS muestra a cuatro chicos y las chicas que les gustan.00. 1~5. OFICINA_REP.001 INSERT INTO REPRESENTANTES (NUM_EMPL. que es el jefe de una oficina nueva de Dos Hermanas (número de oficina 14). VENTAS) VALUES (lIS. JEF. la tabla CHICAS muestra a tres chicas y las mascotas que les gustan.7. OFICINA~REP. OBJETIVO. NOMBRE. REGION. 115. Benjamín Aláez (número de empLeado 115). JEF. 0.00) el pn¡maria "':S' CI~ve pnmana .-ABR-90' . que forman un ciclo referencia~. 115.6.00) (115. hay veces en que sería conveniente que no se comprobara la restricción de integridad referencial hasta que se realice una serie de actualizaciones interrelacionadas. 'Benjamín Aláez' . REGlaN. Considérense las tres tablas del ciclo referencial que se muestran en la Figura 11.6. NOMBRE. La regla CASCADE presenta un problema parecido. El estándar SQL2 especifica algunas posibilidades de comprobación diferida. Obsérvese que la fila de Gustavo es la única fila que se puede eliminar de las tres tablas. pero la columna OFICINA_REP sí lo hace. como mínimo una de las claves externas del ciclo referencial debe permitir los valores NULL. Esta figura contiene exactamente los mismos datos que la Figura 11.00) UPDATE REPRESENTANTES SET OFICINA_REP = 14 WHERE NUM_EMPL = 115 primaria a •••~ RESTRICT Como muestra el ejemplo. como puede verse en la Figu· ra 11.296 SaL. 0. RESTRICT Clave externa Tabla CHICAS NOMBRE GUSTA Fino Susana Juanita Simbad Beatriz Ringo INSERT INTO OFICINAS (~FICINA. 'Ol-ABR-90'. 'Este'. en este caso) seguirá fallando. OBJETIVO. FECHA_CONTRATO. El resto de las filas es padre de alguna relación y. VENTAS) VALUES (14.se halla en la base de datos. VENTAS) VALUES (14. Clave externa Tabla CHICOS GUSTA NOMBRE Benito Juanita Beatriz Samuel José Susana Gustavo Juanita i RESTRICT Figura 11. Debido a esta anomalía no se debe especificar la regla RESTRICT para todas las relaciones de un ciclo referencial. 0. está protegida de la elimina· ción por la regla RESTRICT. 0.00. En la definición real de la base de datos de ejemplo la columna JEF no permite los valores NULL. Para evitar este bloqueó de inserciones. 0. INSERT INTO REPRESENTANTES VALUES (NUM_EMPL. VENTAS) VALUES (14. 'Este'.--Las tres relaciones del ciclo especifican la regla de eliminación RESTRICT. La tabla MASCOTAS muestra tres mascotas y los chicos que les gustan. La inserción de las dos filas puede lograrse con dos instrucciones INSERT y una instrucción UPDATE. 14. INSERT INTO OFICINAS (OFICINA. com9 se describe más adelante en el apartado «Comprobación diferida de restricciones». este tipo de comprobación compleja dif~rida no lo proporciona la mayor parte de las implementaciones actuales de SQL. CIUDAD. FECHA_CONTRATO.00) Los ciclos referenciales también restringen las reglas _de eliminación y de actualización que pueden especificarse para las relaciones que fonnan el ciclo. la inversión del orden de las instrucciones INSERT no ayuda: INSERT INTO OFICINAS (OFICINA.00. VENTAS) 'Ol-ABR-90'. como puede verse a continuación: INSERT INTO REPRESENTANTES (NUM_EMPL. . JEF. ya que la nueva fila hace referencia al empleado número 115 como jefe de la oficina. y Benjamín Aláez no se halla todavía en la base de datos. Un ciclo con todas las reglas RESTRICT. 0.6. 0. por tanto. ¿Por qué? Porque la fila nueva hace referencia a la oficina número 14. 'Dos Hermanas'. 'Dos hermanas'. VENTAS) VALUES (lI5.'Benjamín Aláez'. 0. pero Clave externa Tabla MASCOTAS I GUSTA NOMBRE Fino Samuel Ringo Benito Simbad José La primera instrucción INSERT (para Dos Hermanas. CIUDAD. OFICINA_REP. 0. '01. NOMBRE.00) Por desgracia. NULL. Manual de referencia Capítulo 11: Integridad de datos 297 Se acaba de contralar a U!l representante. OBJETIVO. Por desgracia. 'Este'. Por supuesto. CIUDAD. 'Dos Hermanas'. FECHA_CONTRATO. REGlDN. 14. 'Benjamín Aláez'. la primera instrucción INSERT (para Benjamín Aláez) fallará.

Manual de referencia Capítulo 11: Integridad de datos 299 Claves externas y valores Clave externa Tabla MASCOTAS NULL * I NOMBRE Fino Ringo GUSTA Samuel Benito José Simbad el P'imaria . Como mínimo. (No se trata de la estructura real de la base de datos de ejemplo..riz Susana Gustavo Juanita Samuel José CI~ve . lo que obliga a eliminar a Beatriz (a la que le gusta Ringo) de la tabla CHICAS. rápidamente se volvería imposible realizar un seguimiento de las eliminaciones en cascada y conservar la integridad de la base de datos. por los motivos que se expondrán en este ejemplo. primaria i CASCADE Figura 11.) Se pueden insertar con éxito en la tabla PEDIDOS un pedido de un producto con el identificador de fabricante (FAB) ABe y un identificador de producto (PRODUCT) NULL debido al valor NULL de ]a columna PRODUCTO. las claves externas de las bases de datos relacionales pueden contener valores NULL. A diferencia de las claves primarias. Para estas tablas pequeñas pudiera resultar práctico. esta columna contiene un valor NULL en la fila de Tomás Saz. Una aplicación que introduzca o actualice los datos de la tabla que contienen la clave externa deberá normalmente hacer cumplir la regla «todos NULL o ninguno NULL» en las columnas de la clave externa.~ CASCADE Clave externa Tabla CHICAS NOMBRE GUSTA Susana Fino Juanita Simbad Beatriz Ringo a_. La regla de eliminación SET NULL puede producir un efecto parecido. El estándar SQL2 aborda este problema dando al administrador de la base de datos más control sobre el manejo de los valores NULL en las claves externas para .298 SOL. Pero el valor NULL plantea una pregunta interesante sobre la restricción de integridad referencial creada por la relación entre la clave primaria y la clave externa. las filas tendrían un valor de FAB que no coincidiría con ninguna fila de la tabla PRODUCTOS. Realmente. De hecho. la eliminación de esa fila haría que sus filas hijos de la tabla PEDIDOS pasaran a tener su columna PRODUCTO definida como NULL. El estándar SQLl de ANSI/ISO da por supuesto de manera automática que una clave externa que contiene un valor NULL satisface ]a restricción de integridad referencial. En la base de daLaS de ejemplo la clave externa DFICINA_REP de la tabla REPRESENTANTES permite valores NULL. como la que vincula la tabla PEDIDOS con la tabla PRODUCTOS. Resulta interesante que se suponga que la restricción de integridad referencial se cumple si cualquier parle de la clave externa tiene un valor NULL. Supóngase por un momento que la tabla PEDIDOS de la base de datos de ejemplo permitiera valores NULL en la columna PRODUCTO. La eliminación de una fila de la tabla PRODUCTOS hará que el valor de la clave externa de todas sus filas hijos de la tabla PEDIDOS se defina como NULL. En consecuencia. Las reglas de eliminación obligan al SGBD a eliminar a Ringo (al que le gusta Benito) de la tabla MASCOTAS. aunque ningún producto de la tabla PRODUCTOS tenga el identificador de fabricante ABe. pero para una base de datos de producción con millares de filas. etc. ¿Coincide el valor NULL con alguno de los valores de la clave primaria? La respuesta es «quizás» -depende del valor real de los datos que faltan o son desconocidos. Por este motivo DB2 hace que se cumpla una regla que evita los ciclos referenciales de dos o más tablas en que todas las reglas de eliminación sean CASCADE. DE2 Y el estándar ANSI/ISO dan por supuesto que la fila cumple la restricción de integridad referencial para PEDIDOS y para PRODUCTOS. da a la fila el beneficio de la duda y le permite ser parte de la labia hijo. sólo las columnas de la clave externa que acepten valores NOLL se definirán como NULL. 10 que obliga a eliminar a Samuel (al que le gusta Beatriz). Supóngase que se intenta eliminar a Benito de la tabla CHICOS. Las claves externas que son parcialmente NULL y parcialmente no NULL pueden crear problemas con facilidad. hasta que todas las filas de las tres tablas se hayan eliminado. una de las relaciones del ciclo debe tener una regla de eliminación RESTRICT o SET NULL para romper el ciclo de eliminaciones en cascada.. ya que a Tomás todavía no se le ha asignado ninguna oficina. Para evitar crear esta situación se debe ser muy cuidadoso con los valores NULL en las claves externas compuestas. las tres reglas de eliminación se han cambiado a CASCADE.~ primaria CASCADE Clave Tabla CHICOS externa NOMBRE Benito GUSTA Juanita Beat.. En otras palabras. y que la relación PRODUCTOS/PEDIDOS tuviera una regla de eliminación SET NULL. Un ciclo ilegal con todas las reglas CASCADE. pero su columna FAB seguiría teniendo el valor DEF. Si hubiera una sola fila en la tabla PRODUCTOS para el fabricante DEF.7. Esto puede provocar un comportamiento inesperado y no intuitivo de las claves externas compuestas. aunque el valor de su clave externa no coincida con ninguna fila de la tabla padre.

los asertos especifican relaciones entre valores de datos que abarcan varias tablas de la base de datos.CUOTA <= SUM(REPRESENTANTES. El aserto que causa el error puede resultar obvio en una base de datos pequeña de ejemplo. • Opción MATCH FULL. etc. Conceptualmente. Los asertos se especifican mediante la instrucción de SQL2 CREATE ASSERTION. Las restricciones de tabla se especifican en la instrucción CREATE TABLE que define cada tabla. resulta fundamental conocer el aserto que se ha violado.LIMITE_CREDITO <= 110 supera su . que se especifica como parte de la definición del dominio. las distinciones entre ellas son algo arbitrario. las restricciones de unicidad y las restricciones de los valores ausentes (NULL) ofrecen comprobaciones de la integridad de los datos para estructuras y situaciones de las bases de datos muy específicas. Las restricciones de columna aparecen en la definición de cada columna en la instrucción CREATE TABLE. se especifican aparte de la estructura de tablas y columnas de la base de Asertos En apartados anteriores de este capítulo ya han aparecido ejemplos de los tr~s primeros tipos de restricciones. por lo que no se presenta el problema del tratamiento de los valores NULL en las reglas de eliminación y de actualización. Una vez definido con nombre un dominio.300 SOL. La opción MATCH PARTIAL permite valores NULL en algunas parles de las claves externas. CREATE ASSERTION cuota_valida CHECK ((OFICINAS. Al igual que los dominios. Conceptualmente restringen los valores legales que pueden aparecer en la columna. El esquema completo incluye cuatro tipos de restricciones: • Restricciones de columna. Cualquier restricción de columna que aparezca para la definición de una columna dada puede especificarse también como aserto. La restricción de integridad de la instrucción CREATE TP. es cuota_valida). El estándar SQL2 va más allá de estas posibilidades para incluir una posibilidad mucho más general de especificar y hacer cumplir las restricciones de integridad de los datos.) deberían aparecer como asertos. un dominio es uno de los tipos predefinidos de tipos de la base de datos con alguna restricción adicional. A continuación se ofrece otro ejemplo de aserto que puede resultar útil en la base de datos de ejemplo: Asegurarse de que el total de los pedidos de cualquier cliente límite de crédito: CREATE ASSERTION credito-pedidos CHECK (CLIENTE. Los dominios se definen. En efecto. • Restricciones de tabla. El tipo más general de restricción de SQL2. Las restricciones que se apliquen a un tipo concreto de entidad (un cliente o un pedido) deberían aparecer como restricciones de tabla O de columna en la tabla correspondiente que describa ese tipo de entidad. el nombre del dominio se puede utilizar en lugar de un tipo de datos para definir nuevas columnas.BLE ofrece dos opciones: datos. Las restricciones que se apnquen globalmente a toda la situación (procesos comerciales. probablemente sea mejor espe· cificar cada restricción de la base de datos donde parezca que encaja de manera más natural. • Opción MATCH PARTIAL. Con esta opción ninguna parte de la clave externa puede contener valor NULL. resultará apropiado un dominio. Se especifican como parte de la definición de las columnas al crear la tabla. • Aser~os. Conceptualmente restringen los valores legales que pueden aparecer en las filas de la tabla. relaciones entre clientes y productos. Una forma especializada de restricción de columna. aparte de las definiciones de tablas y columnas de la base de datos. Ofrecen una posibilidad limitada de definición de tipos nuevos de datos dentro de la base de datos. siempre que los valores no NULL coincidan con las partes correspondientes de alguna clave primaria de la tabla padre. Generalmente aparecen como un grupo tras las definiciones de las columnas. No obstante. En la práctica. empleando la instrucción CREATE DOMAIN. Con esta opción el manejo de los valores NULL en las reglas de eliminación y de actualización se realiza como ya se ha descrito. Las columnas heredan las restricciones del dominio. pero en una base de datos de gran tamaño que puede contener docenas o centenares de asertos. A continuación se rnuestr"'3 un aserto que pudiera resullar útil en la base de datos de ejemplo: Asegurarse de que el objetivo de cuota de cada oficina no supera la suma de las cuotas de sus representantes.OFICINA)) Como es un objeto de la base de datos (como las tablas o las columnas). • Dominios. Manual de referencia Capítulo 11: Integridad de datos 301 las restricciones de integridad. Cada uno de los cuatro tipos diferentes de restricciones tiene su propio objetivo conceptual y aparece en una parte diferente de la sintaxis de las instrucciones de SQL2. El nombre se utiliza en los mensajes de eITor generados por el SGBD cuanélo se viola el aserto. hay que dar un nombre al aserto (en este caso. pero el estándar SQL2 les permite aparecer intercaladas con las definiciones de las columnas. Restricciones avanzadas (SQL2j Las restricciones de clave principal y de clave externa. Se especifican como parte de la definición de las tablas al crearlas. dada la situación del mundo real que la base de datos está intentando modelar. Cuando la misma restricción se aplique a muchas columnas diferentes de la base de datos que se refieran al mismo tipo de entidad.OFICINA_REP = OFICINAS.CUOTA)) AND (REPRESENTANTES. La opción MATCH FULL exige que las claves externas de las tablas hijos coincidan totalmente con la clave primaria de la tabla padre.

En teoría. puede que resulte más adecuada la restricción de columna. La restricción NOT NULL sólo puede aparecer como restricción de columna. UPDATE o DELETE-. Si. Tipos de restricciones en SQL2 Comprobación diferida de restricciones Los tipos de restricciones que pueden especificarse en SQL2 y el papel representado por cada una de ellas puede resumirse de la manera siguiente: • Restricción NOT NULL. la transacción propuesta violara alguna de las restricciones. Sólo las modificaciones que afecten a esas tablas o columnas en concreto activarán la condición de búsqueda. se contrasta la condición de búsqueda con la modificación (propuesta) del contenido de la base de datos. Pese a todo. Si una tabla tiene muchas relaciones de clave externa con otras tablas. y en las que haya poca posibilidad de error. Si la restricción de unicidad de valores sólo se aplica a una columna. La restricción PRIMARY KEY puede aparecer como restricción de columna o de tabla. La restricción UNIQUE puede aparecer como restricción de columna O de tabla.CLIENTE = CLIENTE NUM_CLIJ Capítulo 11: Integridad de datos 303 Como muestran estos ejemplos. no obstante. la comprobación de las restricciones se mantiene en suspenso hasta el final de cada transacción SQL.302 SOL. También es el único tipo de restricción que forma parte de la definición de dominios o de asertos. • Restricción referencial (FOREIGN REY). En bases de datos más complejas. los asertos de SQL2 se definen mediante una condición de búsqueda. puede que resulte más adecuado reunir todas sus restriccioEn su forma más sencilla. du~ante el intento de ejecución de cada instrucción INSERT. que se encierra entre paréntesis y a la que sigue la palabra clave CHECK. el SGBD no llevará a cabo la modificación propuesta y se devolverá un código de error. se permite la modificación. debe especificarse como restricción de tabla. los asertos pueden ocasionar una sobrecarga de procesamiento de la base de datos muy grande. la restricción de columna es la manera más sencilla de especificarla. el SGBD analiza el aserto y determina las tablas y columnas a las que afecta. este nombre se convierte de manera efectiva en el nombre del aserto que contiene esa restricción. Cuando la instrucci6n de SQL CQMMIT indica que se ha completado la transacción. se trata del único modo de operación permitido para las restricciones de la base de datos. la combinación de valores de esas columnas debe ser única en todas las filas de la tabla). La conformidad plena con el estándar SQL2 especifica una posibilidad adicional de comprobación diferida de las restricciones. Evita que se asigne a la columna un valor NULL. Si se cumplen todas las restricciones. Si la clave primaria consta de una sola columna. Si consta de varias columnas. al igual que la condición de búsqueda que aparece en la cláusula WHERE de las consultas a las bases de datos. en lugar de tenerlas dispersas por las definiciones de las columnas. que tengan varias restricciones en una misma tabla o columna. Si la restricción de unicidad de valores se aplica a dos o más columnas (es decir. En la práctica. entonces se debe utilizar la modalidad de restricción de tabla. Si consta de varias columnas. • Restricción UNIQUE. debe especificarse como restri~ción de tabla. Si la clave externa consta de una sola columna. ya que se comprueba cada instrucción que pueda modificar la base de datos. Si la condición de búsqueda sigue siendo TRUE. Obsérvese que la restricción de comprobación de los asertos debe tener un nombre de restricción. En lugar de eso. las diversas restricciones especificadas en una base de datos se verifican cada vez que se intenta modificar el contenido de la base de datos -es decir. la instrucción COMMIT fallaría y la transacción retrocedería -es decir. se puede seguir adelante con la instrucción CQMMIT y la transacción puede completarse con normalidad. mediante una instrucción INSERT. el SaBD comprueba las restricciones diferidas. puede que resulte más conveniente la restricción de columna. (El procesamiento de las transacciones y las instrucciones SQL asociadas se describe con detalle en el Capítulo 12). y la base de datos volvería a su estado previo al comienzo de la transacción. los aser· tos deben definirse con mucho cuidado para asegurarse de que suponen una sobrecarga razonable para la ventaja que ofrecen. se desharían todos las modificaciones de la base de datos propuestas. Cuando se difiere la comprobación de las restricciones no se comprueban las restricciones para cada instrucción de SQL. A cada restricción de la base de datos (independientemente de su tipo) se le puede asignar un nombre de restricción para identificarla de manera unívoca frente a las otras restricciones. puede resultar muy útil identificar cada restricción por su nombre (especialmente cuando comiencen a producirse errores). que indicará la viola· ción de un aserto. • Restricción PRIMARY KEY. . • Restricción CHECK.IMPORTE) FROM PEDIDOS WHERE PEDIDOS. La restricción CHECK puede aparecer como restricción de columna o de tabla. Manual de referencia SELECT SUM(PEDIDOS. UPDATE o DELETE. columna o dominio. Si la condición de búsqueda pasara a ser falsa. La restricción referencial (FOREIGN KEY) puede aparecer como restricción de columna o de tabla. La restricción se cumple si la condición de búsqueda tiene el valor TRUE. Siempre que se realiza un intento de modificar el contenido de la base de datos. nes de clave externa en un mismo sitio en la definición de la tabla. En ese momento las modificaciones realizadas a la base de datos durante la transacción se hacen permanentes. La restricción de comprobación se especifica como condición de búsqueda. Probablemente no sea necesario asignar nombres de restricción en bases de datos sencillas en que cada restricción se halle claramente asociada con una sola tabla. En los sistemas de bases de datos que sólo manifiestan una conformidad de nivel intermedio o inicial con el estándar SQL2.

debido a la especificación . . la tabla REPRESENTANTES no se habrá actualizado todavía.OFICINA-REP = OFICINAS. Esta secuencia de instrucciones logra el objetivo: SET CONSTRAINTS totales_cuota DEFERRED INSERT INTO REPRESENTANTES (NUM_EMPL. De manera parecida. La definición de la ·restricción también puede especificar el estado inicial de la restricción: • Restricción INITIALLY IMMEDIATE. La restricción de clave primaria. Cada restricción (de cualquier tipo) de la base de datos puede identificarse al crearla o definirla como DEFERRABLE o NQT DEFERRABLE: • Restricción DEFERRABLE. se vuelve a colocar la restricción totales_cuota en modo IMMEDIATE.ade otro mecanismo más· para controlar el procesamiento inmediato o diferido de las restricciones. • Restricción INITIALLY DEFERRED. como mostraba el ejemplo. Las restricciones INITIALLY IMMEDIATE son las que se inician como restricciones inmediatas. Si se intenta ejecutar la instrucción INSERT en la tabla REPRESENTANTES en primer lugar. y muchas restricciones de comprobación de columna suelen caer en esta categoría. hará falta diferir de manera temporal el procesamiento de la restricción. Sin embargo. VALUES (:num. el valor predeterminado es INITIALLY IMMEDIATE. su comprobación se difiere hasta el final de las transacciones. La única solución a este dilema es posponer la comprobación de las restricciones hasta que se hayan completado las dos instrucciones y comprobarlas luego para asegurarse de que las dos operaciones. es decir. instrucción a instrucción.se procese la restricción. supóngase que la base de datos de ejemplo contuviera este aserto: Asegurarse de que el objetivo de cuota de cada oficina es igual a la suma de las cuolas de sus represelllantes. : numero_oficina . Hay que declarar de manera explícita que una cons- .OFICINA)) DEFERRABLE INITIALLY IMMEDIATE Sin la comprobación diferida de las constantes esta restricción impediría de hecho la adición de representantes a la base de datos. Se puede modificar de manera dinámica el procesamiento de las restricciones durante la operación de la base de datos mediante la instrucción SET CONSTRAINTS. También se vuelve a colocar en su estado inicial al comienzo de cada transacción. una restricción de unicidad. si su operación puede diferirse-. SQL2 afj. OFICINA_REP. tomadas en su conjunto. El mecanismo de restricciones diferidas de SQL2 ofrece esta posibilidad y mucho más.CUOTA : SUM(REPRESENTANTES. Por ejemplo.CUOTA) AND (REPRESENTANTES. Estas comprobaciones de integridad de los datos no dependen de otras interacciones de la base de datos. esta opción no puede especificarse si la restricción se define como NOT DEFERRABLE. CUOTA. CREATE ASSERTION totales_cuota CHECK ((OFICINAS. el aserto no será TRUE y la instrucción fallará. la tabla OFICINAS no se habrá actualizado todavía. Las restricciones DEFERRABLE son aquellas cuya comprobación puede diferirse al final de las transacciones. : importe. Pueden y deben comprobarse después de cada instrucción de SQL que intente modificar la base de datos. Las restricciones NOT DEFERRABLE son aquellas cuya comprobación no puede diferirse. Dado que ofrece ]a comprobación de integridad más restrictiva. :fecha. han dejado la base de datos en un estado válido. para todo el procesamiento normal de ]a base de datos. Manual de referencia Capítulo 11: Integridad de datos 305 La comprobaci6n diferida de las restricciones puede resultar muy importante cuando se deben realizar simultáneamente varias actualizaciones de la base de datos para conservarla en un estado consistente. si se intenta ejecutar la instrucción UPDATE en la tabla OFICINAS en primer lugar.304 SQL. Al actualizar las cuotas o añadir nuevos representantes a la base de datos resulta ciertamente deseable poder diferir la comprobación de las restricciones. Las restricciones INITIALLY DEFERRED son las que se inician como restricciones diferidas./ La comprobación inmediata inicial hace que . NOMBRE. • Restricción NOT DEFERRABLE. Por supuesto. es decir. Las restricciones se deben declarar de manera explícita INITIALLY DEFERRED si se de:sea que inicie de manera automática cada transacción en estado diferido.CUOTA») AND (REPRESENTANTES. O) UPDATE OFICINAS SET OBJETIVO = OBJETIVO + :importe WHERE (OFICINA: :numero_oficina) COMMIT Una vez que la instrucción COMMIT finaliza la transacción. FECHA-CONTRATO.OFICINA) tante es DEFERRABLE si se desea diferir su operación. se comprobará de manera inmediata para cada instrucción de SQL.OFICINA_REP = OFICINAS. VENTAS). El motivo es que para con~ servar la cuota de la oficina y las de los representantes en la relación correcta hay que añadir las filas de los nuevos representantes con sus cuotas correspondientes (mediante una instrucción INSERT) e incrementar la cuota de la oficina correspondiente en la misma cantidad (mediante la instrucción UPDATE). supóngase que la base de. datos de eje~plo contiene este aserto: CREATE ASSERTION totales_cuota CHECK ((OFICINAS. el aserto no será TRUE y la instrucción fallará. : nombre. Dado que ofrece la comprobación de integridad más restrictiva. Por ejemplo.CUOTA : SUM(REPRESENTANTES. para la transacción especial que añade un nuevo representante a la base de datos. El aserto del ejemplo anterior es una restricción que debe ser diferible. La restricción se pone en el estado inicial especificado cuándo se crea. Obsérvese también que estos atributos de restricción sólo definen la diferibilidad de una restricción ---es decir. el valor predeterminado es NOT DEFERRABLE.

hay una lenta tendencia a 10 largo de los anos a atnbUlr más «comprensión» de los datos y más responsabilidad hacia su integridad en la propia base de datos. ajustar los totales de ventas de los representantes y de las oficinas y ajustar los stocks. Además. Los programas de aplicación han teOldo ~sa responsabilidad desde los primeros días de los programas de COBOL y_los sIstemas de archivos. La eliminación de pedidos. No obstante. Si las reglas de negocio se modifican. cada una de las partes de las posibilidades de SQL2 se tomaron de implementaciones de SQL ya existentes. Por ejemplo. pero el cumplimIento de las reglas de negocio es responsabilidad de los programas de aplicación que tienen acceso a la base de datos. Para la base de datos de ejemplo. la modificación de la cantidad o el cambio de producto también deben pravo· car los ajustes correspondientes en la columna STOCK. de IBM. En 1986.y ~a organización de los datos y de asegurar su integridad básica. Depositar la carga del cumplimiento de las reglas de negocio en los programas de aplicación que tienen acceso a la base de datos presenta varios inconvenientes: • Duplicación del esfuerzo. los programadores deberán identificar todos los programas que hacen que se cumplan las reglas. • Complejidad. Estas reglas caen fuera del ámbito del lenguaje SQL. los pedidos con más de seis meses de antigüedad deben cancelarse y volver a formularse. probablemente hagan cumplir las reglas de modo diferente. cada uno de ellos debe incluir código que haga que se cumplan las reglas relativas a las actualizaciones de PEDIDOS. el SGBD Sybase introdujo ~1 concepto de disparador como un paso hacia la inclusión de las reglas de negoclO en las bases de ~atos relacionales. suele haber reglas de contabilidad que deben seguirse para conservar la integridad de los totales. El SGBD asume la responsabilidad del almacenamiento. incluye la posibilidad de comprobación diferida de las restricciones y alberga las opciones de aplazamiento tipo SQL2. localizar el código y modificarlo de manera correcta. tal y como lo definía el estándar SQLl y lo implementan muchos productos SGBD basados en SQL de hoy en día. probablemente tengan sentido estas reglas: • Siempre que se acepte un nuevo pedido. por ejemplo. puede que la empresa modelada por la base de datos de ejemplo tenga reglas como las siguientes: • No se permite a ningún cliente formular pedidos que excedan su límite de crédito. El concepto se hizo muy popular. activando y desactivando el aplazamiento de la comprobación de las restricciones asociadas con el contenido de cada tabla. se puede definir el modo de procesamiento de todas las restricciones con una sola instrucción: SET CQNSTRAINTS ALL DEFERRED Las posibilidades de SQL2 para la comprobación diferida de restricciones forman un servicio muy completo para la gestión de la integridad de las bases de datos. Opera en las tablas de la base de datos.306 SOL. la columna VENTAS del representante que lo tramitó y de la oficina en la que trabaja deben incrementarse en el importe del pedido. su instrucción SET CONSTRAINTS. las cuentas y otros importes almacenados en la / • Falta de consistencia. • Se debe informar al vicepresidente de ventas siempre que se conceda a un cliente un límite de crédito superior a 50. se aparta del estándar SQL2. totales_rep IMMEDIATE Finalmente. Si seis programas diferentes tratan con diferentes actualizaciones de la tabla PEDIDOS. se podría volver a poner manualmente de nuevo en modo IMMEDIATE empleando esta instrucción: SET CQNSTRAINTS totales_cuota IMMEDIATE base de datos. • Siempre que se acepte un nuevo pedido se debe disminuir la columna STOCK del producto solicitado en la cantidad pedida. Manual de referencia Capítulo 11: Integridad de datos 307 INITIALLY IMMEDIATE. El requisito de que los programas de aplicación hagan cumplir l~s reglas de negocio no es exclusivo de SQL. por 10 que el soporte de los dlspa- . Reglas de negocio Muchos de los problemas de integridad de datos en el mundo real tienen que ver con las reglas y con los procedimientos de cada organización. Suele haber muchas reglas que recordar. Incluso en ]a pequeña base de datos de ejemplo un programa que maneje las modificaciones de los pedidos debe preocuparse de hacer cumplir los límites de crédito. No obstante. Al igual que ocurre con muchas de las posibilidades de SQL2. • Problemas de mantenimiento. Un programa que maneje actualizaciones sencillas puede volverse complejo con gran rapidez. Si varios programas escritos por programadores diferentes tratan las actualizaciones de las tablas. y algunas de eIJas han tenido acogida en otras implementaciones desde la publicación del estándar. Si hubiera más trabajo que hacer tras la instrucción upDATE previa al final de la transacción. • Los pedidos sólo pueden conservarse en los libros durante seis meses. DB2.000 €. Se puede definir el mismo modo para varias restricciones diferentes incluyendo sus nombres en una lista separada por comas: SET CONSTRAINTS totales_cuota. La eliminación del pedido o la modificación de su importe también debe hacer que se ajuste las columnas VENTAS.

que hace que las actualizaciones de la base de datos se produzcan de manera automática: CREATE ON FOR AS TRIGGER PEDIDONUEVO PEDIDOS INSERT UPDATE ~EPRESENTANTES SET VENTAS = VENTAS + INSERTED. Los disparadores y el cumplimiento de las reglas de negocio que proporcionan ha resultado especialmente útil en los entornos de bases de datos de las empresas. Indica de manera explícita a DB2 que hay que invocar al disparador después de que se inserte en la base de datos cada pedido nuevo. Esta instrucción de Transact-SQL define un disparador de SQL Server. Cuando se añade un pedido' nuevo a la tabla PEDIDOS.DATE. La acción desencadenada por cada evento viene especificada mediante una secuencia de instrucciones de SQL. SQL Server amplía de manera sustancial el lenguaje SQL para dar soporte a los disparadores. El resto de la definición (tras la palabra clave AS) define la acdón del disparador. La posibilidad de los disparadores. DELETE o UPDATE las filas de una tabla. IMPORTE REPRESENTANTES. no forma parte del estándar ANSI/ISO SQL2. Entre otras extensiones no mostradas aquí están ¡as pruebas iF/THEN/ELSE. En los disparadores de la operación UPDATE DB2 ofrece la posibilidad de hacer referencia tanto a los valores viejos (previos a UPDATE) como a los nuevos (posteriores a UPDATE). Concepto de disparador El concepto de disparador es relativamente sencillo. Manual de. El soporte de los disparadores en DB2 ofrece un ejemplo instructivo de estas diferencias. Al igual que ocurre con otras características de SQL cuya popularidad antecedió a su normalización.. En este caso.NUM_EMPL = INSERTED. INSERTED' WHERE REPRESENTANTES. denominado PEDIDONUEVO.PRODUCTO El comienzo de la definición del disparador incluye los mismos elementos que la defi1ición de SQL Server. ya que el evento desencadenante es una operación INSERT. Cuando docenas de programadores de aplicaciones desarrollan o modifican centenares de programas de aplicación cada año. . PRODUCTO.'1 308 SOL. tarse en el importe del pedido. las llamadas a procedimientos e. el usuario puede especificar una acción ~sociada que deba ejecutar el SGBD. esta vez con la sintaxis de DB2: nes UPDATE. CANTIDAD PRODUCTOS. tienen lugar las dos modificaciones siguientes de la base de datos: • La columna VENTAS del representante que tramitó el pedido debe incremen- una para la tabla REPRESENTANTES y la otra para la tabla PRODUCreferencia a la fila que se inserta mediante el nombre de pseudotabla insertado dentro de las instrucciones UP. Para comprender el modo de funcionamiento de los disparadores conviene examinar un ejemplo concreto. DB2 también permite especificar que hay que ejecutar el disparador antes de que la acción desencadenante se aplique al contenido de la base de datos. ID_PRODUCTO = INSERTED. los bucles.PEDIDO_NUEVO.REP: PRODUCTOS STOCK = STOCK . La primera parte de la definición del disparador indica a SQL Server que el disparador debe invocarse siempre que se intente ejecutar una instrucción INSERT sobre la tabla PEDIDOS.REP UPDATE PRODUCTOS SET STOCK = STOCK .IMPORTE FROM REPRESENTANTES.ID_FAB = INSERTED. aunque popular en muchos productos SGBD. ésta ha provocado una considerable divergencia en el soporte de los disparadores entre diferentes marcas de SGBD. TOS. Se hace CREATE TRIGGER AFTER REFERENCING FOR BEGIN . la posibilidad de centralizar la definición y la administración de las reglas de negocio puede resultar muy útil. Esto no tiene sentido en este ejemplo. INSERTED WHERE PRODUCTOS.NUM_EMPL = PEDIDO~NUEVO. referencia Capítulo 11: Integridad de datos 309 1 radores comenzó a aparecer en muchos productos SGBD de SQL a comienzos de los años noventa del siglo pasado. pero lo tiene para las operaciones UPDATE o DELETE. Los tres eventos que pueden desencadenar una acción son los intentos de INSERT. Otras reflejan auténticas diferencias en las posibilidades subyacentes.UPDATE SET WHERE UPDATE SET WHERE AND ENO PEDIDONUEVO INSERT ON PEDIDO NUEVO AS PEDIDO_NUEVO EACH ROW MODE DB2SQL ATOMIC REPRESENTANTES VENTAS = VENTAS + PEDIDO NUEVO.FAB PRODUCTOS. Tiene la misma función que la palabra clave INSERTED en el disparador de SQL Server. las instrucciones PRINT que muestran mensajes de usuarios. A continuación puede verse la misma definición de disparador mostrada anteriormente para SQL Server. • La columna STOCK del producto solicitado debe disminuir en la cantidad encargada. la acción es una secuencia de dos instruccio- La cláusula REFERENCING de DB2 especifica un alias de tabla (PEDIDO_NUEVO) que se utilizará para hacer referencia a la fila que se va a insertar a 10 largo del resto de la definición del disparador. Como muestra el ejemplo. Para cada evento que provoque una modificación del contenido de una tabla.CANTIDAD FROM PRODUCTOS. ID_PRODUCTO = PEDIDO_NUEVO. entre ellos en los de los principales fabricantes de SOBD para empresas. pero los reordena. La instrucción hace referencia a los valores nuevos de la fila insertada porque se trata de un disparador de la operación INSERT.INSERTED.ID_FAB = PEDIDO_NUEVO. Algunas de las diferencias entre las marcas son meramente de sintaxis. incluso.FAB AND PRODUCTOS. En los disparadores de la operación DELETE se hace referencia a los valores antiguos.

Esto puede reducir espectacularmente la complejidad de los programas de aplicación que tienen acceso a la base de datos. Ventajas e inconvenientes de los disparadores Durante los últimos años los mecanismos de los disparadores de muchos productos SaBD comerciales se han expandido de manera significativa. INSERTED. ha evolucionado más allá del cumplimiento de la integridad de los datos hacia una posibilidad de programación dentro de la base de datos. se hallan entre los aspectos menos transportables de las bases de datos de SQL de hoy en día. Manual de referencia Capítulo 11: Integridad de datos 311 . por lo que la acción desencadenada por una sola modificación de la base de datos puede estar definida por centenares de líneas de programación de procedimientos almacenados. las particularidades varían bastante.310 SOL. Se hace referencia a la fila que se va a insertar empleando el nombre de pseudotabla insertado en las instrucciones UPDATE. pero incluso estos ejemplos sencillos muestran la potencia del mecanismo de los disparadores. INSERTED WHERE OFICINAS. El siguiente disparador de SQL Server hace que la actualización de la columna OFICINA de la tabla OFICINAS pase en cascada a la columna OFICINA_REP de la tabla REPRESENTANTES: CREATE ON FOR AS TRIGGER CAHBIO_OFICINA_REP OFICINAS UPDATE IF UPDATE (OFICINA) BEGIN UPDATE REPRESENTANTES SET REPRESENTANTES. las instrucciones desencadenadas se ubican en un procedimiento almacenado de Inforrnix. ciertamente. El papel de los disparadores.OFICINA_REP = INSERTED. Los disparadores.OFICINA_REP = DELETED.OFICINA_REPI BEGIN PRINT -Número de oficina especificado no válido. Siguen la sintaxis estándar de SQL para las instrucciones UPDATE con búsqueda. por tanto. " . respectivamente. A continuación se ofrece otro ejemplo de definición de disparador. OFICINA del dispaqldor hacen mención a los valores de la columna OFICINA antes y después de la instrucción UPDATE. Cuando las reglas se desplazan al interior de la base de datos. pero no soportaba las actualizaciones en cascada si se modificaba el valor de alguna clave primaria. La definición del disparador debe poder diferenciar entre estos valores anteriores y posteriores para poder llevar a cabo las correspondientes acciones de búsqueda y actualización especificadas por el disparador. UPDATE IF ((SELECT COUNT(*) FROH OFICINAS. Esta limitación. Un estudio 'completo de los disparadores cae fuera del ámbito de este libro. entre los cuales se hallan: • Complejidad de la base de datos." ROLLBACK TRANSACTION ENn O) . Como muestran este ejemplo y los anteriores. Las dos instrucciones upDATE con búsqueda del núcleo de la definición del disparador son modificaciones directas de sus equivalentes en SQL Server. esta vez empleando lnformix Universal Server: CREATE TRIGGER PEDIDONUEVO INSERT üN PEDIDOS AFTER (EXECUTE PROCEDURE PEDIDO_NUEVO) Los disparadores también pueden emplearse para ofrecer formas ampliadas de integridad referenciaL Por ejemplo. DB2 ofrecía inicialmente eliminaciones en cascada mediante su regla de eliminación CASCADE. OFICINA INSERTED. empleando el alias de tabla especificado por la cláusula REFERENCING para identificar la fila concreta de las tablas REPRESENTANTES y PRODUCTOS que se va a actualizar.OFICINA END Este disparador vuelve a especificar una acción que tiene que realizarse después de que se inserte el nuevo pedido. De hecho.OFICINA FROM REPRESENTANTES.OFICINA = INSERTED. las diferentes instrucciones de SQL que forman la acción desencadenada no pueden especificarse directamente en la definición del disparador. e Como en el ejemplo anterior de SQL Server. denominado PEDIDO_NUEVO. los defensores de los disparadores señalan que el mecanismo de los disparadores es más flexible que la integridad referencial estricta proporcionada por el estándar ANSI/ISO. En vez de eso. la configuración de la base de datos se hace una tarea más Disparadores e integridad referencial Los disparadores ofrecen una manera alternativa de implementar las restricciones de integridad referencial proporcionadas por las claves externas y las claves primarias. sin embargo. La principal ventaja de los disparadores es que las reglas de negocio se pueden almacenar y hacer cumplir de manera consistente en cada actualización de la base de datos. las referencias DELETED. BEGIN ATOMIC y END sirven como paréntesis alrededor de la secuencia de instrucciones SQL que definen la acción desencadenada. DELETED WHERE REPRESENTANTES. Los disparadores también tienen algunos inconvenientes. Y muestra un mensaje cuando falla algún intento de actualización: CREATE ON FOR AS TRIGGER ACTUALIZAR_REP REPRESENTANTES INSERT. En muchas implementaciones comerciales las distinciones entre los disparadores y los procedimientos almacenados (que se describen en el Capítulo 20) se han difuminado. a continuación se ofrece un disparador que hace que se cumpla la integridad referencial en la relación OFICINAS/REPRESENTANTES. En este caso. Por ejemplo. aunque los conceptos fundamentales del mecanismo de los disparadores son muy consistentes de unas bases de datos a otras. y el disparador hace que se ejecute ese procedimiento almacenado. no hace falta aplicarla a los disparadores.

popularizado por Sybase y SQL Server. "Las restricciones de comprobación ofrecen una manera más limitada de incluir las reglas de negocio en la definición de las bases de datos y hacer que el SGBD consiga que se cumplan. Esto hace a los disparadores todavía más "útiles y se sumará al debate sobre su inclusión en futuros estándares . carecen de la capacidad de generar acciones independientes en las bases de datos. como el añadido de filas o la modificación de elementos de datos de otras tablas.. como las reglas de eliminación y de actualización que indican al SGBD el modo en que debe tratar la eliminación y la modificación de las filas a las que hagan referencia otras filas. . las restricciones de comprobación pueden emplearse de manera efectiva para limitar los datos que pueden añadirse a las tablas o modificarse en ellas. Disparadores y el estándar SOL Los disparadores fueron una de las características más ampliamente alabadas y anunciadas de SQL Server de Sybase cuando se introdujo en el mercado. Independientemente de la posición oficial. Resumen El lenguaje SQL ofrece varias características que ayudan a proteger la integridad de los datos almacenados en bases de datos relacionales: • Las columnas requeridas pueden especificarse al crear cada tabla. y que las funciones desempeñadas por los disparadores corresponden a los lenguajes de cuarta generación (Fourth Generation Languages. Los disparadores permiten que el SGBD emprenda acciones complejas en respuesta a eventos como los intentos de ejecución de las instrucciones INSERT. Con las reglas ocultas en el interior de la base de datos los programas que parecen realizar actualizaciones sencillas de la base de datos pueden. y desde entonces han hallado acomodo en muchos productos comerciales de SQL. desencadenar un proceso que implique la búsqueda secuencial de una tabla de la base de datos de tamaño muy grande. La capacidad adicional ofrecida por los disparadores ha llevado a varios expertos de la industria a defender que se incluyan en un futuro estándar SQL3. los disparadores se han hecho una parte cada vez más importante del lenguaje SQL en las aplicaciones empresariales durante los últimos años. Aunque el estándar SQL2 ofreció una oportunidad para normalizar la implementación de los disparadores en los SGBD. Como muestran los ejemplos de disparadores y de restricciones de comprobación de los apartados anteriores. • Reglas ocultas. Estas posibilidades ampliadas de los disparadores permiten que las modificaciones de los datos de una base de datos generen de manera automática acciones como el envío de correo. Estas implicaciones para el rendimiento de cualquier instrucción SQL resultan invisibles para los programadores. • Implicaciones ocultas para el rendimiento. el comité de normalizaCión introdujo en su lugar las restricciones de comprobación. lo que tardaría mucho en completarse. Con los disparadores almacenados en el interior de la base de datos las consecuencias de la ejecución de las instrucciones de SQL ya no son completamente visibles para los programadores. en realidad. • La validación de los datos en SQL estándar se limita a la comprobación del tipo de datos. DELETE o UPDATE. los productos de SGBD han experimentado nuevas posibilidades de disparadores que se extienden más allá de las propias bases de datos. • Las restricciones de integridad referencial aseguran que las relaciones entre las entidades de la base de datos se conserven durante las actualizaciones de la base de datos. Los programadores ya no tienen el control total de 10 que le ocurre a la base de datos.Manual. • Las restricciones de integridad de las entidades aseguran que la clave primaria identifique de manera unívoca cada entidad representada en la base de datos.ji I 312 SOL. y el SGBD evitará la presencia de valores NULL en esas columnas. una instrucción de SQL aparentemente sencilla puede. teóricamente. una acción de la base de datos iniciada por un programa puede generar otras acciones ocultas. 4GLs) y a otras herramientas de las bases de datos. Otros expertos han argumentado que los disparadores suponen una contaminación de la función de gestión de datos de las bases de datos.de referencia Capítulo 11: Integridad de datos 313 compleja. • El SGBD puede hacer que se cumplan las reglas de negocio mediante el mecanismo de los disparadores. • El estándar SQL2 y las implementaciones más recientes ofrecen un amplio soporte a la integridad referencial. oficiales de SQL. Los usuarios de los que se podía esperar razonablemente que crearan pequeñas aplicaciones ad hoc con SQL hallarán que la lógica de programación de los disparadores hace la tarea mucho más difícil. a diferencia de los disparadores. Mientras continúa el debate. pero muchos productos SGBD ofrecen'\otras características de validación. generar una enorme cantidad de actividad de la base de datos. Sin embargo. En vez de eso. el aviso a un usuario o ellanzamiento de otro programa para la realización de una tarea. En especial. más que a los propios SGBD.

SQL ofrece precisamente esta posibilidad mediante sus características de procesamiento de transacciones. las cuatro actualizaciones deben producirse como si fueran una unidad. sino esta serie de cuatro actualizaciones en la base de datos de ejemplo: • • • • Añadir el nuevo pedido a la tabla PEDIDOS. y todas ellas son necesarias para completarla. Si un fallo del sistema u otro error crean una situación en que alguna de las actualizaciones se procesa y el resto no. De manera parecida. si otro usuario calcula totales o relaciones durante la secuencia de actualizaciones. sus cálculos serán incorrectos. Actualizar el total de ventas del representante que tramitó el pedido. Concepto de transacción Una transacción es una secuencia de una o varias instrucciones de SQL que forman conjuntamente una unidad lógica de trabajo. la recepción de un pedido nuevo no genera una actualización. Actualizar el lOtal de ventas de la oficina del representante. Cada instrucción de la transacción lleva a cabo una parte de la tarea. De hecho. Las instrucciones de SQL que fonnan la transacción suelen estar íntimamente relacionadas y llevan a cabo acciones interdependientes. debe ser una proposición todo o nada de la base de datos.CAPíTULO Procesamiento de transacciones Las actualizaciones de las bases de datos suelen ser desencadenadas por eventos del mundo real. La secuencia de actualizaciones. se perderá la integridad de la base de datos. por tanto. Actualizar el stock del producto solicitado. \ 12 Para dejar la base de datos en un estado autoconsistente. como la recepción de un pedido nuevo de un cliente. que se describen en este capítulo. La agrupación de las instrucciones como una sola transacción indica al SGBD que toda la secuencia de 315 .

restando el importe del pedido del total de ventas de la oficina. ajustando el stock del producto. Manual de referencia ~ Capítulo 12: Procesamiento de transacciones 3·17 instrucción debe ejecutarse de forma atómica -se deben completar todas las instrucciones para que la base de datos quede en un estado consistente. el programa debe <a) actualizar la tabla CLIENTES para reflejar la modificación. (c) actualizar la tabla PRODUCTOS.' El concepto de transacción de SOL COMMIT y ROLLBACK SQL acoge las transacciones de las bases de datos mediante dos instrucciones de procesamiento de transacciones de SQL. y la base de datos es autoconsistente. ROLLBACK. y (d) actualizar la tabla REPRESENTANTES. O se ejecutan con éxito todas las -ins~ trucciones. el programa debe <a) eliminar el pedido de la tabla PEDIDOS. en lugar de ello. r Estado de la base de datos antes de la transacción ~ '-. elevando la cuota del representante que gana el cliente. <b) actualizar la tabla PRODUCTOS. Indica al SGBO que la transacción se ha completado. el SGBD debe volverse atrás de las modificaciones realizadas en la base de datos durante la transacción. Indica al SOBO que el usuario no desea completar la transacción. A continuación se ofrecen algunos ejemplos de transacciones típicas para la base de datos de ejemplo. En efecto. restando la cantidad encargada del stock del producto.!SELECT UPDATE UPDATE = ~ !SELECT UPDATE ! SELECT UPDATE Transacción ( ¡ ¡ ¡ ¡ UPDATE ¡ ¡ ¡ ¡ ¡ DELETE DELETE El SGBD deshace todas las modificaciones INSERT Estado de la base de datos después de la transacción . o no se ejecuta ninguna.. el programa de introducción de pedidos debe (a) consultar la tabla PRODUCTOS para asegurarse de que hay existencias del producto. El concepto de transacción resulta fundamental para los programas que actualizan las bases de datos.316 SOL. INSERT Y UPDATE. en la que cada acción consiste en una instrucción de SQL diferente. La instrucción ROLLBACK señala el -fracaso de una transacción. como puede verse en la Figura 12. (d) actualizar la tabla REPRESENTANTES. • La instrucción COMMIT señala la conclusión con éxito de una transacción. (b) actualizar la tabla PEDIDOS para mostrar el nuevo representante en todos los pedidos realizados por el cliente. (b) insertar el pedido en la tabla PEDIDOS. el SGBD devuelve la base de datos a su estado previo al comienzo de la transacción. (e) actualizar la tabla REPRESENTANTES. (e) actualizar la tabla REPRESENTANTES. que pueden verse en la Figura 12. aunque el programa de aplicación aborte o se produzca un fallo de hardware en mitad de la transacción.1. junto con la secuencia de instrucciones_ de SQL que comprende cada transacción: • Añadir un pedido. l ! l El SGBD deshace todas las modificaciones Figura 12. Para cancelar el pedido de un cliente. restando el importe del pedido de las ventas totales del representante y (d) actualizar la tabla OFICINAS. • Reasignar un cliente. se han ejecutado todas las instrucciones que confonnan la transacción. En cada uno de los casos se necesita una secuencia de cuatro o cinco acciones.. la base de datos no refleje una transacción parcial. • Cancelar un pedido. añadiendo el importe del pedido a las ventas totales del representante que ha tramitado el pedido y (e) actualizar la tabla OFICINAS. Las instrucciones COMMIT y ROLLBACK son instrucciones de SQL ejecutables.1 En cada caso el SOBD debe asegurarse de que. añadiendo el importe del pedido a las ventas totales de la oficina en que trabaja ese representante. -Los SOBO basados en SQL realizan este compromiso respecto de las instrucciones de cada transacción: Las instrucciones de cada transacción se ejecutarán en la base de datos como una unidad atómica de trabajo. cuand. . igual que SELECT. para tratar la transacción lógica. Para aceptar el pedido de un cliente.2: • COMMIT.o se complete la recuperación del fallo. A continuación se ofrece un ejemplo de una transacción de actualización con éxito que modifica la cantidad y el importe de un . ya que asegura la integridad de las bases de datos. Cuando se reasigna un cliente de un representante a otro. El SGBD es responsable de conservar este compromiso. reduciendo la cuota del representante que pierde al cliente.

El pedido es de reducloras QSA-XK47 y lo lrami16 Le61l Fre¡re (empleado Ilúmero 108).. del representante y de la oficina asociados con el pedi~o. no hay ninguna transacción más que comenzar. que trabaja en León (oficina número 21). La transacción continúa con las instrucciones de SQL siguientes hasta que concluye de una de las cuatro maneras siguientes: • COMMIT. IMPORTE SET CANTIDAD WHERE NUM_PEDIDO ~ 113051 UPDATE REPRESENTANTES SET VENTAS ~ VENTAS . Para corregir el error.00 + 3550. utilizan este modelo de transacción.. La mayor parte de los productos comerciales de SQL..- I I I Modificar la cantidad del pedido número J13051 de 4 a /0.458 € a 3. COMMIT WORK A.550 €.00 WHERE NOM_EMPL = 108 3550.1458. igual que si se hubiera ejecutado la instrucción COMMIT. Tras la instrucción ROLLBACK comienza de manera inmediata una nueva transacción. pero no todos. lo que incrementa su Imporle de 1. Como ha concluido el programa. continuación se ofrece la misma transacción.] 318 SOL. El estándar especifica que cada transacción de SQL comienza de manera automática con la primera instrucción de SQL que ejecuta un usuario o un programa.10 ID_FAS: 'OSA' ID_PRODUCTO ~ 'XK47' -- El estándar ANSI/ISO de SQL define un modelo de IrallSacci6n para SQL y los papeles de las instrucciones COMMIT y ROLLBACK.00 WHERE OFICINA ~ 21 UPDATE SET WHERE ANO PRODUCTOS STOCK ~ STOCK + 4 . El pedido es de reducloras QAS-XK47 y lo tramitó León Freire (empleado número /08).Modificar La cantidad del pedido número 113051 de 4 a JO...- Lwo.J Lwo.00 f---- ROLLBACK ..00 + 3550. se hace retroce~er la transacclOn.. IMPORTE WHERE NUM_PEDIDO = 113051 UPDATE REPRESENTANTES SET VENTAS = VENTAS 1458.00 Figura 12.. .00 + 3550. • ROLLBACK.. confirmar por última vez la modificación con el cliente. .1458. . UPDATE PEDIDOS ROLLBACK WORK El modelo de transacciones ANSI/ISO 3550.J •• + 3550.10 ID_FAS = 'QAS' ID_PRODUCTO ~ 'XK47' pedido y ajusta los totales del producto. Manual de referencia Capítulo 12: Procesamiento de transacciones 319 I I • '- COMMIT .00 WHERE OFICINA : 21 UPDATE SET WHERE ANO PRODUCTOS STOCK : STOCK + 4 . • Terminación con éxito del programa.. que se basa en el soporte de las transacciones de las primeras versiones de DB2. que Irabaja ell Le61l (oficilla Ilúmero 21). -. Para el lenguaje SQL para programación. volviéndose atrás de las modificaciones en la base de datos.. . UPDATE PEDIDOS 10. La instrucción ROLLBACK aborta la transacción.. de modo que pueda volver a introducirse de manera correcta: La instrucción COMMIT concluye las transacciones con éxito..00 WHERE NUMERO_EMPL ~ loa UPDATE OFICINAS SET VENTAS: VENTAS .. ¡Vaya! El fabricante es «QSA». haciendo permanentes las modificaciones de la base de datos. UPDATE OFICINAS SET VENTAS ~ VENTAS . no «QAS». pero esta vez supóngase que el usuano comete un error al i~~ucir el número de producto. -.1458.2. Tras la instruc· ción COMMIT comienza de manera inmediata una nueva transacción.. Diagramas de sintaxis de las instrucciones COMMIT y ROLLBACK.00 SET CANTIDAD = 10. la terminación con éxito de un programa conlleva que concluya también con éxito la transacción. lo que incrementa su imporle desde 1458 € a 3550 €. U~a modific~ción como ésta la manejaría normalmente un programa de modlficacI6n de pedidos basado en formularios. que ulilizaría SQL para programación para ejecutar las instrucciones que se muestran.

que está diseñado para aplicaciones de procesamiento en línea de transacciones. que se especifica en la instrucción. No obstante. pero.. Tiene dos cometidos. Sybase guarda el estado de la base de datos en ese momento de la transacción y asigna al estado guardado un nombre de punto de revisión.!. En consecuencia. Al igual que en el modelo ANSI/ISO. SQL Server. consistente ~ Otros modelos de transacciones UPDATE Transacción ( ! - UPDATE ! - Base de datos consistente . se ven rara vez en ese contexto. El dialecto Transact-SQL empleado por Sybase incluye cuatro instrucciones para el procesamiento de transacciones: • BEGIN TRANSACTION. no hay ninguna transacción más que Comenzar. Esto transforma de hecho cada instrucción de SQL interactivo en su propia transacción. Transacciones comprometidas y que se han hecho retroceder.! ! ! "'1 COMMIT COMMIT -! i -! -! UPDA~E UPDATE COHMIT COMMIT n ! - ! INSERT ! ! uñOSCüantos productos comerciales de SQL se separan del modelo de transacciones ANSI/ISO para ofrecer posibilidades adicionales de procesamiento de transacciones a sus usuarios. Obsérvese que el usuario o el programa se hallan siempre en una transacción según el modelo de transacción ANSI/ISO.ROLLx ! DELETE I • \Ci programa aborta • COMMIT Basededat~ ! • consistente Figura 12. Si no se asigna nombre a ningún . es un ejemplo.que se ejecutó la instrucción 8AVE TRANSACTION. en el que se ejecuta de manera automática una instrucción COMMIT tras cada instrucción de SQL escrita por el usuario. Si en la instrucción ROLLBACK se asigna un nombre a un punto de revisión. La instrucción BEGIN TRAN8ACTION Transacción l. El SGBD Sybase. SAVE TRANSACTION. .. en la práctica.3.!INSERT DELETE ! . no se inicia de manera automática una transacción nueva. Base de dato. el INSERT (-! INSERT . las actualizaciones son menos frecuentes. La Figura 12. las transacciones suelen constituir una preocupación de orden menor en SQL interactivo. lo que de hech9 hace retroceder la transacción hasta el punto en . Las instrucciones CQMMIT y RQLLBACK ofrecen. comienza de manera automática con la primera instrucción de SQL o inmediatamente después de que acabe la transacción anterior. Sybase exige una instrucción explícita para iniciar una transacción. también utiliza el modelo de transacciones de Sybase. Las transacciones desempeñan un papel importante en SQL para programación. todas las modificaciones de la base de datos realizadas durante la transacción se vuelven permanentes. que se creó a partir del producto de Sybase. De hecho. los programas de aplicación deben poder realizar las transacciones parcialmente y luego escoger entre abortarlas o continuar. Como ha concluido el programa.320 SOL. muchos productos de SQL interactivo toman como valor predeterminado un modo de compromiso automático. Como los usuarios -pueden cambiar de opinión y pueden darse otras condiciones (como la falta de existencias de un producto que desee encargar un cliente). A diferencia del modelo de transacciones ANSI/ISO. señala el comienzo de una transacción. igual que si se hubiera ejecutado la instrucción ROLLBACK. Para el lenguaje SQL para programación la terminación anormal de un programa hace que aborte la transacción. Señala la finalización con éxito de una transacción. COMMIT TRANSACTION. SQL interactivo suele utilizarse para las consultas a la base de datos. Manual de referencia I "-Capítulo 72: Procesamiento de transacciones 321 • Terminación anormal del programa. Recuérdese que el estándar ANSIIISO para SQL está pensado sobre todo parn el lenguaje SQL para programación con el fin de emplearlo en programas de aplicación. Las instrucciones COMMIT y ROLLBACK también pueden utilizarse en SQL interactivo. que da comienzo de forma explícita a una transacción nueva cuando concluye la anterior.3 muestra transacciones típicas que ilustran estas cuatro condiciones. Establece un punto de revisión en mitad de una transacción. ya que incluso los programas de aplicación sencillos necesitan a menudo ejecutar secuencias de dos o tres instrucciones de SQL para desempeñar su tarea.. y casi nunca se llevan a cabo actualizaciones con varias instrucciones mediante la anotación de las instrucciones en una instalación para SQL interactivo. precisamente.. No se necesita ninguna acción explícita para comenzar una transacción.. Sybase se vuelve atrás de las modificaciones de la base de datos realizadas desde el punto de revisión. ROLLBACK TRANSACTION. esta posibilidad.

Un modelo alternativo (explícito) de transacciones utilizado por Sybase. Las instrucciones de SQL que se ejecutan fuera de las transacciones (es decir. o GRANT y REVOKE. El programa de aplicación de la figura guarda de manera perió- Estado de la base de datos aotes---+ de la transacción BEGIN TRANSACTIQN SAVE + + INSERT + DELETE + TRANSACTION A ---------+ + UPDATE Punto de revisión A -> DELETE SAVE TRANSACTION B . puede hacer que la transacci6n retroceda a cualquiera de los puntos de revisi6n y continuar desde allí. que se estudian en el Capítulo 13. como puede verse en la Figura 12. Esta restricción hace más sencillo de implementar el modelo de transacciones.. por ejemplo. no hay manera de hacer que la instrucción retroceda una vez que ha tenido éxito. que no aparecen entre los pares de instrucciones BEGIN/COMMIT o BEGIN/ROLLBACK) se manejan de hecho en modo de compromiso automático.) El SOBD debe poder deshacer todas estas modificaciones.¡. Todas las instrucciones ejecutadas antes del punto de revisión siguen vigentes. incluidas las modificaciones e$tructurales. sin embargo. crearse y llenarse. en una implementación completa del modelo de transacciones del estilo ANSI/ISO. la instrucción ROLLBACK se vuelve atrás de rodas las mo- Capítulo 12: Procesamiento de transacciones 323 dificaciones en la base de datos desde la instrucción BEGIN TRANSACTION. Estas instrucciones deben ejecutarse fuera de las transacciones. Obsérvese que toda la transacción sigue siendo la unidad lógica de trabajo de Sybase. que se estudian en el Capítulo 15) aparezcan dentro de las transacciones.- ROLLBACK 70 B + + UPDATE + INSERT + Punto de revisión B ->1. la base de datos deshace toda la transacción. Otra restricción habitual es que las transacciones que modifican la estructura de la base de datos sólo puedan contener una única i.322 SOL. y muchos productos de SGBD populares introducen restricciones simplificadoras.4. Por el contrario. la operación de retroceso deshace las ejecutadas a partir del punto de revisión. al igual que ocurre con el modelo ANSI/ISO. Si se produce un fallo del sistema o de hardware en mitad de una transacción. En lugar de eso.4. por ejemplo. ¿Cómo puede el SGBD echarse . Si surgen problemas en un momento posterior de la transacción. ALTER TABLE Y DRQP TABLE.. Manual de referencia punto de revisión. El compromiso de todo o nada que el SGBD realiza con cada transacción parece casi mágico para los usuarios nuevos de SQL. una desviación significativa del modelo ANSI/ISO. En la práctica esto puede resultar difícil de implementar. (Las tablas pueden descartarse. El empleo explícito de una instrucción BEGIN TRANSACTION supone. ya que asegura que la estructura de la base de datos no se modifique durante la transacción. . pero no suponen una modificación fundamental del modelo de transacciones ANSIIISO. Estado de la base dica su estado a medida que la transacción avanza. El mecanismo de puntos de revisión de Sybase resulta especialmente útil en las transacciones complejas que implican a muchas instrucciones. estableciendo dos puntos de revisi6n con nombre. Cada instrucción se compromete en cuanto se ejecuta. ~ de datós después-----+ de la transacción Transacciones: entre bastidores* Figura 12. Por tanto.ostrucción de SQL (como la instrucción CREATE TABLE o DROP TABLE). los puntos de revisión son una comodidad para el programa de aplicación. . Algunas marcas de SOBD que utilizan un modelo de transacciones del estilo de Sybase prohíben que las instrucciones que modifican la estructura o la seguridad de la base de datos (como CREATE TABLE. si el usuario decide posteriormente hacer que la transacción retroceda. Una restricción frecuente es que las modificaciones de ]a estructura de la base de datos no puedan entremezclarse cpu operaciones de acceso a la base de datos dentro de una transacción. la estructura de la base de datos puede modificarse de manera significativa durante una transacción. UPDATE OELETE COMMIT TRANSACTION . el programa de aplicación no tiene que abortar toda la transacci6n.

el fi~al de la transacción se anota en el registro de transacciones.. La mejor manera de comprender el modo en que SQL trata las transacciones concurrentes es examinar los problemas que se producen si las transacciones no se tratan de manera adecuada. Ahora el SGBD no sólo debe recuperarse de manera adecuada de los fallos o de los errores del· sistema. Si el usuario ejecuta una instrucción ROLL- ....5.. buscando las transacciones no comprometidas antes del fallo... El empleo de un registro histórico de transacciones impone obviamente una sobrecarga a las actualizaciones de la base de datos. se pueden producir cuatro problemas fundamentales... Aunque pueden manifestarse de muchas maneras diferentes. 'Así es como funciona el registro histórico de transacciones: de una manera simplificada y conceptual.-.._ Ubicación de la fila:_ Antes:. Mediante estas imágenes el SOBO devuelve las filas a su estado anterior. Además. el registro de transacciones suele 'almacenarse en una unidad rápida de disco... los principales productos comerciales de SOBD utilizan técnicas de registro histórico mucho más sofisticados que el esquema sencillo a<)uí descritó para minimizar esa sobrecarga.324 SOL. 12:05 INSERT INTO PRODUCTOS Transacciones y procesamiento multiusuario Cuando dos o más usuarios tienen acceso... También puede suponer una alternativa aceptable para las bases de datos especializadas para producción..---- Capítulo 12: Procesamiento de transacciones 325 atrás de las modificaciones realizadas en la base de datos si se produce un fallo del sistema en el transcurso de la transacción? Las técnicas concretas empleadas por las diferentes marcas de SOBO varían._ I Figura 12. Una copia muestra la fila antes de la modificación y la otra muestra la fila tras la modificación.-..VI ... también pueden utilizar esta arquitectura sin registro histórico. Si el usuario ejecuta posteriormente una instrucción COMMIT.ase de datos ejecutando una utilidad de recuperación especial proporcionada con el SOBO. el esquema de registro histórico y su sobrecarga constituyen parte iote· gral de la operación de la base de datos. de manera simultánea.--.:"'_... cada usuario debería poder tener acceso a la base de datos corno si tuviera acceso exclusivo. Algunas marcas de SOBD para computadoras personales penniten desactivar el registro histórico de transacciones para incrementar el rendimiento del SGBD. sino que también debe asegurar que las acciones de los usuarios no interfieran entre sí. las transacciones en curso en el momento del fallo se han hecho retroceder.I_ Después: (Vacía) Ubicación de·la fila:_ Antes:--... Sólo después de haber escrito el registro histórico.. COMMIT I • Transacción comprometida • • • El registro histórico de transacciones. sin embargo. deshaciendo todas las modificaciones de la base de da lOS realizadas durante la transacción: Si se produce un falJo del sistema..I--'_ Después:_.. 1 ...5. Las bases de datos especializadas.histórico para hallar las imágenes «previas» de las filas que se hayan modificado desde el comienzo de la transacción. por ejem· plo. Idealmente. como puede verse en la Figura 12. para minimizar la disputa por el acceso a disco.Secuencia de instrucciones SOL . Cuando el usuario ejecuta una instrucción de SQL que modifica la base de datos... Registro histórico de transacciones UPDATE OFICINAS • • • f---+ 12:04 · · • • SGBD • • Ubicación de la fila:_ Antes:-._ Después: (Vacía) DELETE FROM CLIENTES ~ BACK.. pero casi todas se basan en un registro de transacciones.-. el SOBO escribe de manera automática un registro en el registro histórico de transacciones..I. el operador del sistema suele recuperar la b. como las bases de datos residentes en memoria o las copias de la base de datos guardadas en la caché. sin preocuparse de las acciones de otros usuarios.. de modo que sólo se reflejen en la base de datos las transacciones comprometidas. en el que muestra dos copias de cada fila afectada por la instrucción. diferente del que almacena la base de datos. Los cuatro apartados siguientes dan un ejemplo sencillo de cada problema. En la práctica. 12:06 · · · · • · Ubicación de la fila:_ Antes: (Vada) Después:.--. La utilidad de recuperación examina el final del registro histórico de transacciones. El modelo de transacciones de SQL permite que los SOBO basados en SQL aíslen a los usuarios entre sí de esta manera..L.. el procesamiento de las transacciones adopta una dimensión nueva.. en las que el contenido de la base de datos se halla reproducido en un sistema informático duplicado..--'. La utilidad deshace cada una de las transacciones incompletas... Manual de referencia .. a la base de datos. el SOBD modifica realmente la fila en el disco. En las bases de datos de producción más frecuentes. el SOBO examina el registro..

:. evidentemente... ~/ SELtcT STOCX FROM PRODUCTOS "-r'~'='o~'=-==:-::=--.'~-. Su copia del programa de introducción de pedidos actualiza el archivo PRODUCTOS para que muestre (139 . utilicen esos datos como base para un cálculo y traten de actualizar los datos. Además. 12: 06 IDJAS ID PRODUCTO STOCK Respuesta: 139 I : OS ID FAB I ID PRODUCTO STOCK UPDATE PRODUCTOS SET STOCK = 14 : ACl 41004 14 1 " 06 ROLLB1l.: 39 cables pendientes de venta. El programa de introducción de pedidos com~ prueba en el archivo PRODUCTOS si hay un inventario adecuado antes de aceptar el pedido del cliente.:'::'O".:. Manual de referencia Capítulo 12: Procesamiento de transacciones 327 El problema de la actualización perdida La Figura] 2.: 14 cables todavía en stock. ID FA!! Tabla PRODUCTOS ID PRODUCTO STOCK Programa de Maria ACl 41004 '" ACI 41004 1J9 : 12 01 SELECT STOCK FROM PRODUCTOS e'. se ha p. La primera de las dos actualizaciones del archivo PRODUCTOS.100). pero no hay en mventano suficientes cables para satisfacerlos. Pocos segundos más tarde. la base de datos ~uestra que sigue habiendo todavía catorce cables para la venta..::=:-::=. . El problema de los datos no comprometidos..326 SOL. Los pedidos de los dos clientes se han aceptado..7.6~ El problema de la actualización perdida. y su copia del programa de introducción de pedidos actualiza el archivo PRODUCTOS para que muestre (139 .125) . la base de datos en un estado inconsistente. e inserta un nuevo pedido de cien cables en la tabla PEDIDOS.CK (Recaha~ar pedido de 125) 1 1 1/ ACl 41004 '" ( Nota: ¡Comprar mlls1 ") Figura 12. María comienza a introducir el pedido de su cliente de ciento veinticinco cables ACI-41004. y los dos encuentran que hay 139 cables en stock -más que suficiente para cubrir la solicitud del cliente-o José pide a su cliente que confirme el pedido.6 muestra una aplicación sencilla en la que dos usuarios aceptan. pe- didos telefónicos de los clientes.7 muestra la misma aplicación de procesamiento de pedidos que la Figura 12. María pide a su cliente que confirme el pedido. I El problema de los datos no comprometidos L~ Figura 12.. Figura 12. José comienza a introducir un pedido de cien cables ACI-41004 de su cliente. Al mismo tiempo.6. Este ejemplo ¡Justra el problema de la actualización perdida que puede darse siempre que dos programas lean de la base de datos los mismos datos. El tratamienlo de los dos pedidos ha dejado. José vuelve a comenzar aceptando de su cliente un pedido de cien ca- Programa de José 12: 00 Tabla PRODUCTOS IO_FAB ID_PRODUCTO STOCK Programa de Maria Programa de José 12: . En la figura. e inserta un pedido nuevo de ciento veinticinco cables en la tabla PEDIDOS. '---+ SELECT STOCK FROM PRODUCTOS Respuesta: 139 Respuesta: 139 Respuesta: 139 1 (AcePtar pedido de 100 12 :04 ID_P"AB ID_PRODUCTO STOCK ( Aceptar pedido de 100) 12 :04 IDJAS ID PRQOUCTO STOCK Aceptar pedido de 125 12: 04 12 :04 I / UPDATE PRODUC'1'OS SET STOCK = 39 ACl 41004 : " 12: 05 r I 1 UPDATE PRODUCTOS SET STOCK e 39 : ACl 41004 39 12: 05 SELEC'T STOCK FROM PRODUCTOS I : "-. Cada programa de introducción de pedidos realiza una consulta del archivo PRODUCTOS.erdido.

no puede estar seguro de que las estadísticas reflejen una vista estable y consistente de los datos. El problema de los . También genera un aviso que indica al jefe de compras de que debe comprar más cables ACI-41004. el programa de Ma-. Nuevamente. y. Esta inconsistencia puede causar problemas aunque el programa de María no intente nunca actualizar la base de datos basándose en los resultados de la primera consulta. La copia de María del programa de procesamiento de pedidos consulta la tabla PRODUCTOS. que se piden mucho. La situación hubiera sido todavía peor si el cliente de María hubiera decidido conformarse con los 39 cables. y más adelante. ejemplo. a diferencia de los dos anteriores.00S. el cliente de María intenta encargar ciento veinticinco cables ACI41004. El problema en este caso es que se ha permitido al programa de L . el cliente de María decide encargar los cables ACI-41004 que María propuso inicialmente. su copia del programa para el procesamiento de pedidos consulta la tabla PRODUCTOS. el jefe de compras encargará más cables. mundo real. quedan 39 cables ACI-41004 porque el cliente de José ha adquirido cien.8. la nueva consulta s610 muestra 39. Tras considerar como alternativa los cables ACI-41. En este momento el cliente de José decide no encargar los cables finalmente. Pero cuando se hubiera producido el RQLLBACK de la lransacción de José. Mientras tanto. el cliente de José decide encargar los cables. S610 Fi9l:'ra 12. Su programa realiza otra consulta de una soja fila para obtener nuevamente la información de los cables ACI-41004. José comienza aceptando un pedido de su cliente de' cien cables ACI41004./CTO ~ SELECT STOCK FROl'l PRODUCTOS ID " 41004 l'lespuestll: 39 STOCK AC> 41004 39 El problema de los datos inconsistentes La Figura 12. -el pedido se completó y se comprometió con la base de datos-o No obstante. la base de datos no se mantuvo consistente durante su transacción. Manual de referencia --Programa de José 12:01 SELECT STOCK PROM PRODUCTOS Respuesta. actualiza esa fila de la base de datos y realiza un COMMIT en la base de datos para finalizar el pedido. s610 halla 39 cables disponibles y rechaza el pedido. en vez de hallar los 139 cables que había en stock sólo un momento antes. Entretanto. y el programa de María realiza una consulta sobre esa única fila.328 SOL. María también comienza a hablar con su cliente sobre los mismos cables y su programa realiza una consulta de una sola fila para averiguar la cantidad disponible. Luego. si el programa está acumulando totales O calculando estadísticas. Como se permitió al programa de procesamiento de pedidos de María que viera la actualización no comprometida del programa de José. también denominado problema de la lectllra desfasada.8 muestra una vez más la aplicación de procesamiento de pedidos. No hay ningún problema con que María haya visto datos no comprometidos del programa de José. por lo que los eventos externos han interferido con su vista consisten~e de la base de datos. El estándar SQL2 hace referencia a este problema como Pi. En este. aunque todavía queden 139 en stock. contenía unos datos diferentes. 139 Capítulo 12: Procesamiento de transacciones 329 bies ACI-41004. Pero. se rechazó el pedido del cliente de María. los datos que ha visto el programa de María están desfasados porque el programa de José no los ha comprometido. Poco después.datos inconsistentes. Al comienzo de la transacción una fila contenía unos datos determinados. . 12:04 12. halla 139 cables y actualiza la tabla PRODUCTOS para mostrar los 39 cables restantes tras el pedido del cliente. por lo que su programa. El problema de este ejemplo es que se ha autorizado al programa de María a ver las actualizaciones no comprometidas del programa de José y ha actuado sobre ellas. ría hubiera actualizado la tabla PRODUCTOS para que mostrara cero unidades dis· ponibles. José comienza a discutir con el cüente las ventajas relativas de los cables ACI-41004 y ACI-4100S.05 UPOATe PRODUCTOS SET STOCK'" 39 I 12:04 ID FAB ID PROOt. el estado de la base de datos no ha dejado de ser un modelo preciso de la situación del. el SGBD hubiera situado las existencias disponibles de nuevo en 139 cables. lo que ha generado el resultado erróneo. Por ejemplo. Esta vez el cliente de María pregunta por los cables ACI41005 como alternativa. En la jerga del estándar. y el programa de procesamiento de pedidos de José realiza un ROLLBACK para abortar su transacción. en la misma transacción. Tabla PRC?OUCTOS 12: OQ Programa de Maria STOCK ID_FAS ID PRODUCTO AC> 41004 '" ./ ~ SELECT STOCK FROH PRODUCTOS. desde el punto de vista del programa de María. aunque 39 de ellos estuvieran comprometidos con el cliente de María. En ese caso. Esta vez. ID • 41004 Respuesta: 139 ( Aceptar pedido de 100 12:03 SELEe'I' STOCK FROH PRODUCTOS ID '" 41005 .

.00üE 12:13 Respuesta: 111312. Poco después el programa del jefe de ventas (que sigue operando dentro de su transacción inicial) vuelve a explorar la tabla PEDIDOS. un cliente llama a Bruno para realizar un pedido adicional de 5.500€ Transacciones simultáneas 12:04 INSERT INTO PEDIDOS VALUES fllS102. Se inserta el pedido en la base de datos y se compromete la transacción. El nombre se deriva del hecho de que el programa de María no puede repetir el mismo acceso de lectura a la base de datos y obtener los mismos resultados. la clave de la recuperación y del control de la simultaneidad en las bases de datos de SQL. En el ejemplo anterior la consulta era una consulta de una sola fila y la inconsistencia de los datos la causaba una instrucción UPDATE. y también utiliza el término fantasma para describirlo. El estándar SQL2 se refiere a esto como P3. El estándar SQL2 se refiere a este problema como P2. . 5.745. El usuario no verá nunca las modificaciones no comprometidas de otros usuarios. Además del compromiso de todo o nada para las instrucciones de cada transacción. A y B. El problema de la inserción fantasma.. El problema de la inserción fantasma La Figura 12. pero la misma consulta realizada dos veces durante la misma transacción da dos resultados diferentes.000.31. Al igual que en el problema de los datos inconsistentes.9 el problema lo causa una instrucción INSERT comprometida.31. Esta vez hay un pedido adicional y el total es 5.500€ Durante una transacción el usuario verá una vista completamente consistente de la base de datos. La base de datos sigue siendo un modelo preciso de la situación del mundo real y su integridad está intacta. también denominado problema de la lectura no repetible. OO€ 12:00 SELECT PEDIDOS FROM PEDIDOS.OO€ 113012 J.000 €. Mientras tanto.330 SOL. La fila adicional no participó en la primera consulta.9 muestra nuevamente una aplicación de procesamiento de pedidos. cuando los usuarios comparten el acceso a la base de datos y uno o varios actualizan los datos.745€ 12:10 SELECT • FROM PEDIDOS 1 Como muestran los tres ejemplos de actualizaciones con varios usuarios. 745. ejecutando la misma consulta. Como en el ejemplo anterior. se ejecutan de manera simultánea. pero aparece cs>mo si fuera una fila fantasma que surgiera de ninguna parte en la segunda consulta. El compromiso anterior puede reformularse de manera explícita en términos de la ejecución de transacciones concurrentes: Respuesta: 118102.ooE 113012 3. . el SGBD asegura que el resultado será el mismo que si (a) la transacción A se ejecutara primero y la transacción B después o (b) la transacción B se ejecutara primero y la transacción A después.3.00E 118102 s. Esta vez.S00. En el ejemplo de la Figura 12. imprime una lista de los pedidos de los clientes de Bruno Arteaga y calcula el total. Respuesta: 112961.00) 12:04 NUM_PEDIDO IMPORTE 112961 31. las consecuencias del problema de la inserción fantasma pueden ser cálculos inconsistentes e incorrectos. Si dos transacciones.S00. SQL utiliza su mecanismo de transacciones para eliminar esta fuente de corrupción de la base de datos. Manual de referencia Capítulo 12: Procesamiento de transacciones 331 María que vea unas actualizaciones no comprometidas del programa de José que afectan a filas que ya ha examinado.ooo.745€ Figura 12..9. el jefe de ventas ejecuta un programa de informes que explora la tabla Programa de actualización Tabla PEDIDOS Programa de informes 12:00 NUM_PEDlDO IMPORTE 112961 31.000 € superior al de la primera consulta. y ni siquiera las modificaciones comprometidas realizadas por otros usuarios afectarán a los datos vistos por el usuario durante la transacción.3.OOE Respuesta: 113012. el problema aquí son los datos inconsistentes.5. existe la posibilidad de corrupción de la base de datos. Las transacciones son. por tanto. los SGBD basados en SQL realizan este compromiso para las transacciones: Respuesta: 112961.

Además. La moraleja de este ejemplo es sencilla: al escribir programas para bases de datos de SQL de producción hay que preocuparse siempre de las transacciones. Como muestra la figura. el programa debe utilizar una instrucción COMMIT después de cada consulta. de hecho. Los bloqueos. El concepto no especifica la secuencia de transacciones que debe emplearse. Bloqueo * I ! La mayor parte de los principales productos de SGBD utilizan técnicas de bloqueo sofisticadas para manejar las transacciones de SQL simultáneas para muchos usuarios concurrentes. El resto de este capítulo estudia los bloqueos. Por tanto. evitando que otras transacciones modifiquen los datos bloqueados. la rransacción continúa hasta que el programa concluye. se puede eliminar parte de la sobrecarga de las. se pueden estar ejecutando docenas o centenares de transacciones-de manera simultánea dentro de las grandes bases de datos de producción. lo que le permite seguir adelante. la situación viene a ser la contraria. En este caso. evitará que otros usuarios actualicen fragmentos cada vez m·ayores de la base de datos. y la mayor parte de las marcas de SGBD implementaban esquemas propietarios para mejorar el rendimiento de las transacciones de SQL. o modifica. el SGBD bloquea la transacción B. Para comprender completamente esta operación. Dado que el programa no actualiza la base de datos. Ciertamente. que se ejecuta un programa que lleva a cabo una secuencia de tres consultas de gran tamaño. ¿El motivo? Recuérdese que SQL comienza de manera automática una Jransacción con la primera instrucción SQL de cada programa. En la práctica. mientras el programa realiza sus tres consultas. El hecho de que el SGBD aísle al usuario de las acciones de otros usuarios concurrentes no significa que se pueda olvidar totalmente de ellos. resuelven todos los problemas de las transacciones concurrentes. Pero. El SGBD sólo libera los bloqueos establecidos por la transacción A cuando concluye con una operación COMMIT o ROLLBACK. La secuenciabilidad garantiza que. Sin una instrucción COMMIT. por ejemplo. y el SGBD bloquea también las partes de la base de datos a las que tiene acceso. De hecho. los datos no comprometidos y los datos inconsistentes corrompan la base de datos. La Figura 12. una a una. las posibilidades de optimización de rendimiento·de SQL2 y las diferentes IÚarcas de SGBD que dependen de ello. puede que el diseñador de la aplicación sepa que todos los accesos de un programa a tablas concretas de la base de datos son de sólo lectura. Por ejemplo. significa que cada usuario de la base de datos puede tener acceso a ella como si ningún otro usuario tuviera acceso a la base de datos de manera concurrente. lo que hace que espere a que se desbloqueen los datos. ya que pudiera intentarse volver a recuperar la fila más adelante en la transacción. El concepto de secuenciabilidad puede ampliarse directamente para abarcar esta situación. Además. Cuando la transacción A de la figura tiene acceso a la base de datos. los bloqueos introducen un problema nuevo ----. Sin embargo. No hace falta utilizar la instwcción SET TRANSACTION para el empleo ocasional de SQL ni para el procesamiento de transacciones de SQL sencillas o de poco volumen. En la práctica. El SGBD desbloquea entonces la transacción B. Supóngase. puede que las particularidades de la aplicación no exijan el aislamiento absoluto entre los programas de usuario que implica el modelo de transacciones de SQL. hay que hacer que las transacciones sean lo más cortas y sencillas posible.10 muestra un esquema de bloqueo sen· cilla y el modo en que maneja la disputa entre dos transacciones simultáneas. parece innecesario utilizar las instrucciones COMMIT. protegiéndola de los efectos de otras transacciones.332 SOL. puede que el diseñador de la aplicación sepa que se ha diseñado el programa de búsqueda de pedidos de modo que nunca intente leer y volver a leer una fila de la base de datos durante cada transacción. debido a la estructura del programa. la implementación de un modelo estricto de transacciones multiusuario puede suponer una sobrecarga considerable en la operación de una base de datos con docenas. Si la transacción B intenta tener acceso a la parte de la base de datos que ha bloqueado la transacción A. para maximizar la cantidad de procesamiento en paralelo que se pueda realizar. Las transacciones deben ser siempre todo lo breves que sea posible. transacciones de SQL. La transacción B sigue adelante en paralelo.-pu~de que haga que una transacción espere un tiempo muy largo mientras los fragmentos de la base de datos a los. si se está ejecutando un número N de transacciones simultáneas. Manual de referencia ~ Capítulo 12: Procesamiento de transacciones 333 I! 1 I 11 :1 Este concepto se conoce como secuenciabilidad de las transacciones. Evitan que las actualizaciones perdidas. el problema de los datos inconsistentes no puede darse. el SOBD debe asegurar que el resultado sea el mismo que si se hubieran ejecutado en una secuencia dada. y el SGBD debe garantizar que se vean los mismos datos. el SGBD bloquea de manera automática cada parte de la base de datos que la transacción recupera. que desea. Esto significa que. sólo que el resultado debe coincidir con el de alguna secuencia. Como los otros usuarios desean actualizar de manera concurrente la base de datos. la técnica de los bloqueos concede de manera temporal a una transacción acceso exclusivo a una parte de la base de datos. resulta útil comprender los cierres y otras técnicas empleadas por los productos de SGBD comerciales para implementar transacciones de SQL multiusuario. No obstante. Si el programador puede transmitir infonnación de este tipo al SGBD. por tanto. pudiera parecer que no hay que preocuparse de las transacciones. ningún otro usuario puede modificar esa fila hasta que concluya la transacción. centenares o millares de usuarios concurrentes. una vez que el programa recupera una fila de la base de datos. Efectivamente. . El estándar SQL2 especificó una nueva instrucción SET TRANSACTION cuya función es especificar el nivel de soporte del modelo de transacciones de SQL que necesita cada aplicación. La transacción B puede bloquear ahora esa parte de la base de datos por sí misma. «COMMIT rápido y COMMIT a menudo» es un buen consejo cuando se emplea SQL para programación. SQL garantiza que los datos recuperados durante una transacción sean autoconsistentes y no se vean afectados por las transacciones de otros usuari"os. De manera alternativa. El estándar SQLl no abordaba este problema del rendimiento de las báses de datos. tener acceso están bloqueados por otras transacciones. los conceptos básicos de los bloqueos y de las transacciones· son muy sencillos.

..-i SELECT.... FOH OFICINAS. ::J'--_.01 j desbloqueada desbloqueada desbloqueada I I I . : I I I • desbloqueada desbloqueada Proceder. Niveles de bloqueo Los bloqueos pueden implementarse en varios niveles de la base de dalos. lo que llevaría a un rendimiento inaceptablemente bajo.. I UPDATE PEDIroS I~ Proced~~ra A ~ Bloqueada para B P d ~UPDATE 12'" . ya que permitiría el acceso si- .......vel de tablas. Dado que las tablas de gran tamaño se extienden a Jo largo de cientos o de millares de páginas. hasta los bloqueos en el nivel de los elementos de datos.. en las que muchos usuarios deben compartir el acceso a las mismas tablas. pero sólo pemiitiría el procesamiento de las transacciones una a una.. puede suponer un problema real con las tablas de pequeño tamaño que contienen registros pequeños. 12:07 12:08 I I I I I I I I I I I I --tof FOH OFICINAS ._. el seguimiento de los bloqueos de fragmentos de la base de datos de longitud variable (en otras palabras. En teoría.------- T ~ Pro--d. como las que modifican la estructura de la base de datos o para consultas complejas que deben explorar muchas tablas de gran tamaño... Por desgracia. o de tablas cuando el número de bloqueos en el nivel de filas de una transacción dada superan cierto límite. Se evita que otras transacciones tengan acceso a las páginas bloqueadas.10.. Esta técnica permite más procesamiento paralelo... En los últimos años la mayor parte de los SaBD comerciales han ido más allá del bloqueo en el nivel de página: hasta los bloqueos en el nivel de filas. En este esquema el SGBD sólo bloquea las tablas a las que tiene acceso una transacción.. esto ofrecería todavía más paralelismo que los bloqueos en el nivel de filas. En este esquema el SGBD bloquea bloques de datos (páginas) desde el disco a medida que una transacción tiene acceso a ellas. aunque las dos filas se hallen en el mismo bloque del disco. la sobrecarga de los bloqueos en el nivel de filas puede ser mayor que las ganancias de rendimiento al permitir más operaciones en paralelo dentro de la base de datos.:::=:.:C.. En su forma más básica... el mejor esquema depende enormemente de las transacciones concretas y de las operaciones de SQL que puedan contener. No obstante. .. Como muestra este ejemplo.--. pero todavía puede llevar a un rendimiento inaceptablemente bajo en aplicaciones como la introducción de pedidos. Si la transacción incluye algún tiempo muerto (como puede ser tiempo para discutir un pedido con un cliente).:. para ciertas transacciones O aplicaciones. Muchos productos de SGBD implementan los bloqueos en el nivel de páginas. en lugar de las páginas de tamaño fijo. dos transacciones que intenten tener acceso a dos fiJas diferentes de una tabla tendrán normalmente acceso a dos páginas diferentes. Otras transacciones pueden tener acceso de manera concurrente a otras tablas.:T_--J1 I I • Figura 12. el bloqueo en el nivel de la base de datos puede resultar adecuado para ciertos tipos de transacciones. Bloqueo con dos transacciones concurrentes. como la tabla OFICINAS de la base de datos de ejemplo... Esta estrategia de bloqueo sería sencilla de implementar. De hecho.. Manual de referencia Capítulo 12: Procesamiento de transacciones 335 Transacción A SGBD Transacción B PRQJ){ICTOS I 12. de filas). Se utilizan frecuentemente tamaños de páginas de 2KB..... En esos casos puede resultar más eficiente realizar rápidamente una única operación de bloqueo.. pero pueden tener acceso (y bloquear para ellas mismas) otras páginas de datos.. I I T I ~ ~ Bloq". Una forma mejorada de bloqueo es el que se produce en eln. Los bloqueos en el nivel de filas ofrecen un grado elevado de ejecución paralela de las transacciones.:OMM=':... Algunos productos de SGBD abordan esta situación promoviendo de manera automática muchos bloqueos en el nivel de tablas a bloqueos en el nivel de páginas. por lo que el mayor paralelismo llega a costa de una lógica de bloqueos más sofisticada y de una mayor sobrecarga. lo que permite que dos transacciones sigan adelante en paralelo. Resulta posible teóricamente ir más allá de los bloqueos en el nivel de filas.~. ejecutar rápidamente la operación y volver a desbloquear la base de datos que bloquear docenas de tablas una a una.. el SGBD podria bloquear toda la base de datos para cada transacción.334 SOL.. todos los demás accesos a la base de datos se bloquearían durante ese tiempo..... Aunque esto pueda parecer una posibilidad remota.d. resulta una tarea mucho más compleja.. Los blo~ queos en el nivel de filas permiten que dos transacciones concurrentes que tienen acceso a dos filas diferentes de una tabla sigan adelante en paralelo.:12::'O::2:.. Bloqueada para A cooo " 1 I Esperar. I 12:05 UPDATE PEDIDOS I~ Proceder 12:06 1UPDATE OFlCINASI~ Proceder 12:07 :'::::""'CO=MM"'=T:---'--+ desbloqueada desbloqueada _:. no ocurre siempre que un nivel de implementación de bloqueos más granular (menor) sea mejor..--J~ Proceder I I I Bloqueada para B + + 1 I T Proceder •1----'-=--. PRODUCTOSI 12:03 SELECT.. de 4KB y de 16KB.

10. la 'sobrecarga del manejo de los bloqueos en el nivel de los datos.(. Los esquemas que utilizan bloqueos compartidos y bloqueos exclusivos resultan bastante frecuentes: • Bloqueo compartido. Sin embargo. Obsérvese que una transacción sólo puede adquirir un bloqueo exclusivo si ninguna otra transacción tiene en ese momento un bloqueo ni compartido ni exclusivo sobre esos datos." I I I I • . Los productos de SGBD maduros y complejos.'"'' • Figura 12. I I "..•• FROM OFICINAS 12:05 Sin bloqueo Bloqueo compartido Bloqueo excusivo UPOATE PEDIDOS I~I Proceder I I 1 Bloqueo companido para A ! DesblOq~eada I I I I I I I i ~12:05 P/oceder I Sin bloqueo Transacción 1 OK OK OK OK OK NO OK NO NO I".11 muestra las reglas de este esquema de bloqueo y las combinaciones de bloqueos permitidas que pueden tener dos transacciones concurrentes.acción A SGBO Transacción B fEllIOQO Desbloqueada ~ Desbloqueada PRODUCTOS Desbloqueada 12:01 1 UPOATE PEDIDOS I~ Bloqueo exclusivo para A Proceder • . se describe en el apartado siguiente. Bloqueos compartidos y exclusivos Para incrementar el acceso simultáneo a las bases de datos. siempre que tuvieran acceso a conjuntos de columnas diferentes.J. y los esquemas de bloqueo utilizados ·en los productos de SGBD comerciales son mucho' más sofisticados que el esquema fundamental aquí descrito." 12:07 UPOATE OFICINAS·I~ I Proceder Bloqueo exclusivo pareA ! A Bloqueo compartido Bloqueo exclusivo I ""'UT 1-1 +-.ECT..11. Utilizado por el SGBD cuando una transacción desea leer datos de la base de datos. los bloqueos constituyen un área de investigación considerable en la tecnología de las bases de d'J-tos.. Si una transacción intema adquirir un bloqueo no permitido por las reglas de la Figura 12. se bloquea hasta que las demás transacciones desbloqueen los datos que necesita. Otra transacción concurrente puede adquirir también un bloqueo compartido sobre los mismos datos. • Bloqueo exclusivo. la mayor parte de los productos de SGBD comerciales utilizan un esquema de bloqueo con más de un tipo de bloqueo. se puede ver el modo en que el nuevo esquema mejora el acceso simultáneo a la base de datos.~ 336 SOL.12 muestra las mismas transacciones que pueden verse en la Figura 12.. ha sobrepasado hasla ahora sus ventajas potenciales..12. Pese a su mayor complejidad. Si se comparan las dos figuras.. L I .Proceder o. B ~ 12:04 Proceder ~ 1 COXMIT SELECT . como DB2. las demás transacciones no pueden adquirir ningún tipo de bloqueo (ni compartido ni exclusivo) sobre esos datos. lo que permite que la otra transacción lea también los datos. Manual de referencia Capítulo 12: Procesamiento de transacciones 337 rnultáneo a la misma fila por dos transacciones diferentes. De hecho. que utiliza bloqueos compartidos y bloqueos exclusivos. Bloqueos compartidos y exclusivos.. La Figura 12. I I I Figura 12.. I I I I I I I I I I I 12:03 S'. Reglas para los bloqueos compartidos y exclusivos. el objetivo de los esquemas de bloqueo sigue siendo el mismo: evitar interferencias no Trans. I ..~. Cuando una transacción tiene un bloqueo exclusivo sobre algunos datos. tienen más de dos tipos de bloqueos y utilizan diferentes técnicas de bloqueo en diferentes niveles de la base de datos.ooucros Bloqueo companido para A. Utilizado por el SGBD cuando una transacción desea actualizar los datos de la base de datos.11. El más directo de estos esquemas avanzados de bloqueo.. FROM OFICINAS ~Iproceder I Bloqueo compar1ido para A ~ Bloqueo exclusivo para B Proceder ~ 12:02 ~ UPDATE PlI. Ningún 'SGBD comercial de SQL utiliza bloqueos en el nivel de los elementos de datos. esta vez empleando bloqueos compartidos y bloqueos exclusivos. La Figura 12.

lo que permite continuar a la vencedora del interbloqueo.13 ilustra una situación de interbloqueo. el programa B actualiza la tabla PRODUCTOS.338 SOL. el empleo de cualquier esquema de bloqueo para albergar las transacciones de SQL concurrentes lleva a un problema denominado interbloqueo. en funci6n del tipo de bloqueo implementado). pero se pueden dar situaciones más complejas en las que tres. por lo que bloquea parte de la tabla. aunque COMMIT y ROLLBACK son las instrucciones de procesamiento de transacciones de SQL. Puede que esto parezca injusto. I I I I I I I I I I tabla. Sin intervención exterior cada programa esperará de manera indefinida a que el otro programa comprometa su transacción y desbloquee los datos. por ejemplo. siempre que sea posible. cuatro o más programas se hallen en un ciclo de bloqueos y cada uno de ellos espere datos que estén bloqueados por alguno de los otros programas. Si se produce un error de pérdida de interbloqueo en SQL interactivo. bloqueando parte de la Transacción A ~ SGBO PROpUqpS Desblo~ueada Transacción B Desbl~ueada 12. resulta posible que otras instrucciones de SQL -una instrucción INSERT. el SGBD escoge de manera arbitraria una de las transacciones como perdedora del interbloqueo y hace que retroceda. pretendiendo en cada caso actualizar una parte de la tabla que ha estado bloqueada previamente por el otro programa (la misma fila o la misma página. Se hace retroceder a la transacción que intenta realizar la instrucción sin que haya cometido ningún error. Técnicas avanzadas de bloqueo * Muchos productos comerciales de bases de datos ofrecen características avanzadas de bloqueo que superan ampliamente las proporcionadas por las transacciones estándar de SQL. Se incluyen: . todo ello con la sobrecarga de bloqueos mínima. sencillamente. Ahora el programa A intenta actualizar la tabla PRODUCTOS y el programa B intenta actualizar la tabla PEDIDOS. algunas de las características de bloqueo avanzadas que se describen en apartados posteriores de este capítulo pueden utilizarse para reducir aún más el número de interbloqueos que se producen. Mientras tanto. al tiempo que ofrecer el mayor acceso simultáneo posible a la hase de datos. Manual de referencia Capítulo 12: Procesamiento de transacciones 339 deseadas entre las transacciones. Para tratar con los interbloqueos. El programa A actualiza la tabla PEDIDOS. Esto libera los bloqueos mantenidos por la transacción perdedora. La probabilidad de los interbloqueos puede reducirse de manera espectacular planificando con cuidado las actualizaciones de la base de datos. Todos los programas que actualizan varias tablas durante una transacción deben. minimizando la posibilidad de interbloqueo. Esto permite a los bloqueos fluir con suavidad por las tablas. el usuario puede. sólo debido al resto de la actividad concurrente de la base de datos.resulten perdedoras de un interbloqueo. los SGBD suelen incluir lógica que comprueba de manera periódica (por ejemplo. La Figura 12. en la práctica.01 1 UPDATE PEDIDOS 1- Proceder Bloqueo exclusivo para A Bloqueo exclusivo para B • I I I I I 12:02 Proceder IUPDATE 12:03 --aJ UPDATE PRODUCTOS 1 PRODUCTOS ~ Esperar 12:04 Esperar ~ UPDATE PEDIDOS -) . pero. Interbloqueos * Por desgracia. Además. Este esquema de rotura de interbloqueos significa que cualquier instrucción de SQL puede devolver un código de error de pérdida de interbloqueo. cada cinco segundos) los bloqueos mantenidos por diferentes transacciones. el programa responderá advirtiendo al usuario o volviendo a intentar la transacción de manera automática. Generalmente. Cuando detecta un interbloqueo.13: Un interbloqueo de transacciones. resulta mucho mejor que las otras dos alternativas -interbloqueos eternos o corrupción de la base de datos. La situación de la figura es un interbloqueo sencillo entre dos programas. o incluso una instrucción SELECT. El programa perdedor recibe un código de error que infonna de que ha perdido un interbloqueo y de que se ha hecho retroceder a su transacción. volver a escribir las instrucciones de SQL. aunque no haya nada erróneo en la instrucción en sí misma. Por tanto. • Figura 12. En SQL para programación el programa de aplicación debe estar preparado para manejar el código de error de pérdida de interbloqueo. hacerlo en el mismo orden.

14. según avance. para bloquear de manera explícita toda una tabla. Se puede indicar al SGBD que un programa concreto no volverá a recuperar datos durante una. A medida que el programa lee cada fila de los resultados de la consulta el SGBD debe bloquear la fila (con un bloqueo compartido) para evitar que las transacciones simultáneas modifiquen ésta. también pueden adquirir bloqueos compartidos). el mecanismo de las. En las bases de datos de IBM se emplea la instrucción LOCK TABLE.manera simultánea afecte a los datos visibles en el curso de la transacción. lleva a cabo la misma consulta de la base de datos por segunda vez. Si una transacción tiene acceso a una tabla repetidas veces. seguirá creando la sobrecarga que supone adquirir bloqueos exclusivos sobre las partes de la tabla que actualice.EXCLUSIVE Figura"12. exacta en un momento dado. t. Oracle también alberga una instrucción LQCK TABLE de tipo DB2. No obstante. optimizar sus técnicas de bloqueo implícito. Sin embargo. como la transacción de actualización masiva puede avanzar mucho más rápidamente. por ejemplo.os sistemas de gestión de bases de datos no admiten en absoluto los bloqueos explícitos. en su lugar. Ninguna otra transacción puede tener acceso a ninguna parte de la tabla por nin- Niveles de aislamiento * Bajo la estricta definición de las transacciones de SQL no se permite que ninguna acción de una transacción que se ejecute de. Manual de referencia· --- Capítulo 12: Procesamiento de transacciones 341 • Bloqueos explícitos. Si el programa lleva a cabo una consulta de la base de datos durante una transacción. las características de los niveles de aislamiento introducidas en DB2 han logrado incorporarse al estándar SQL2.LOCK TABLE nombre-tabla IN ---r-- SHARE .14. Otras transacciones pueden leer partes de la tabla (es decir. Diagrama sintáctico de la instrucción LOCK TABLE. • Niveles de aislamiento. Esta posibilidad de volver a recuperar de manera digna~ de confianza una fila durante una transacción es el nivel de aislamiento más elevado que el programa puede tener respecto de otros programas y usuarios. por si acaso el programa volviera a realizar la consulta. lo que permite al SGBO liberar los bloqueos antes de que concluya la transacción. Se puede lograr el mismo efecto en Ingres con una instrucción diferente. bloqueará toda la tabla. Bloqueos explícitos * gún motivo mientras se mantenga el bloqu~o. posteriormente. De hecho.-J MODE ----. procesar las actualizaciones y luego desbloquear la tabla. Un programa puede bloquear de manera explícita toda una tabla o alguna otra parte de la base de datos si va a tener acceso a ella repetidas veces. el flujo global del SGBD puede incremen·tarse bloqueando la tabla de manera explícita. Es el modo que se suele solicitar para transacciones de actualización masiva. Por supuesto. varias de ellas. El nivel de aislamiento se denomina nivel de aislamiento de la transacción. Ofrece dos modos de bloqueo: • El mod. transacción. pero no pueden actualizar ninguna parte de la tabla. El administrador de la base de datos puede ajustar de manera manual el tamaño del fragmento bloqueable de la base de datos y olros parámetros de bl<:. Este aislamiento absoluto de la transacción respecto de todas las demás transacciones que se ejecutan de manera simultánea resulta muy costoso en términos de bloqueos de la base de datos y de pérdida de simultaneidad de la base de datos. L.340 SOL. lo que la obligaría a reiniciarse. • Elimina la posibilidad de que otra transacción bloquee parte de la tabla e interbloquee la transacción de actualización masiva. Un programa de actualización masiva que recorra cada fila de la tabla. Se trata del modo en que se. la sobrecarga de la adquisición de pequeños bloqueos sobre muchas partes de la tabla puede ser importante. • El modo SHARE adquiere un bloqueo compartido sobre toda la tabla. Estos bloqueos deben mantenerse hasta el final de la transacción.o EXCLUSIVE adquiere un bloqueo exclusivo sobre toda la tabla. aunque no sean estándar. El bloqueo de toda la tabla tiene tres ventajas: • Elimina la sobrecarga de los bloqueos fila a fila (o página a página). suele solicitar si se desea una instantánea de la tabla. Por supuesto. que puede verse en la Figura 12. ·Para este tipo de transacción el programa debería bloquear de manera explícita toda la tabla. y prefieren. Otr. transacciones de SQL garantiza que los datos devueltos por las dos consultas serán idénticos (a ·menos que la transacción que se está llevando a cabo actuara para modificar los datos).. sigue adelante con otra tarea y. • Elimina la posibilidad de que otra transacción bloquee parte ·de la tabla y obligue a la transacción de actualización masiva a esperar. fragmento a fragmento. el bloqueo de la tabla tiene el inconveniente de que· todas las demás transacciones que intenten tener acceso a la tabla deberán esperar mientras se realiza la actualización. si la transacción que emite la instrucción LOCK TABLE actualiza parte de la tabla. Estas características no suelen ser estándar y dependen de cada producto. En mu- .queo para ajustar el rendimiento de los bloqueos. especialmente las introducidas inicialmente en las versiones de DB2 para grandes sistemas hace años. • Parámetros de bloqueo. se han implementado en varios productos comerciales de SQL y han conseguido generalizarse.

si sólo realizará consultas a la base de datos) OREAD WRITE (puede consultar o actualizar la base de datos). por lo que los problemas de la actualización perdida y de los datos no comprometidos no pueden producirse. En este nivel no se permite a la transacción ver actualizaciones de otras transacciones ni comprometidas ni sin comprometer. se debe utilizar el nivel de aislamiento SERIAL!ZABLE.342 SOL Manual de referencia ~ Capítulo 12: Procesamiento de transacciones 343 chos casos. Sin embargo. por ejemplo. Si el programa no depende de la posibilidad de repetir una consulta de varias filas durante una transacción. El SGBD puede emplear esta información. Generalmente. que pueden verse en la Figura 12. El nivel de aislamiento SERIALIZABLE es el nivel más elevado que se ofrece. En este modo. En este modo no se permite que la transacción vea actualizaciones no comprometidas de otras transacciones. de los datos modificados y de la inserción fantasma. el SGBD puede reducir de manera significativa la sobrecarga de bloqueos si conoce con anticipación el modo en que el programa tendrá acceso a la base de datos durante las transacciones. para optimizar .16. A medida que disminuye el nivel de aislamiento (según se baja por las filas de la tabla). las actualizaciones comprometidas por otras transacciones que se ejecuten de manera concurrente pueden hacerse visibles en el curso de la transacción. Se trata de uno de los niveles de aislamiento incluidos en los productos de bases de datos de IBM para grandes sistemas. llevar a cabo una instrucción SELECT de una sola fila dos veces a lo largo de la transacción y hallar que otro usuario ha modificado los datos de la fila. La especificación SQL2 formalizó el concepto de nivel de aislamiento de IBM y lo amplió para incluir cuatro niveles de aislamiento. puede utilizar tranquilamente el nivel de aislamiento READ COMMITTED. Problema de las actualizaciones multiusuario Nivel de aislamiento Actualización perdida Enviado por el Datos no comprometidos Enviado por el Datos inconsistentes Enviado por el Inserción fantasma Enviado por el SERIALIZABLE SGBD REPEATABLE READ Enviado por el SGBD Enviado por el SGBD Enviado por el SGBD Puede producirse Puede producirse SGBD READ COMMITED SGBD Enviado por el SGBD Puede producirse Enviado por el SGBD READ UNCOMMITED Enviado por el SGBD Puede producirse SGBD Puede producirse Puede producirse Figura 12. Se trata del nivel de aislamiento predeterminado especificado en el estándar ANSI/ISO SQL. En este nivel. Si el programa necesita llevar a cabo dos veces la misma consulta de varias filas durante una transacción y que se le garantice que los resultados serán idénticos independientemente del resto de actividades de la base de datos. No obstante. y no se pueden producir problemas por l~ modificación de los datos. el SGBD garantiza que los efectos de la ejecución simultánea de transacciones son exactamente los mismos que si se ejecutaran una después de otra.]5. Si resulta importante que el contenido de la consulta sólo contenga información que. Para obtener esta eficiencia las principales bases de datos para grandes sistemas de IBM añadieron el soporte del concepto de nivel de aislamiento especificado por el usuario. El nivel de aislamiento READ UNCOMMITTED es el nivel más bajo especificado en el estándar SQL. El nivel de aislamiento REPEATABLE READ es el segundo nivel más elevado. puede que una consulta de varias filas ejecutada previamente en la transacción dé r~sultados diferentes que la misma consulta ejecutada posteriormente en la misma transacción (problema de la inserción fantasma). de hecho. que se emplea para establecer el nivel de aislamiento de cada instrucción. la transacción puede verse afectada tanto por actualizaciones comprometidas como por actualizaciones no comprometidas de otras transacciones. ya que es el modo en que se supone que funcionan las bases de datos de SQL. El SGBD sigue evitando el problema de la actualización perdida. el nivel READ UNCOMMITTED sólo resulta adecuado para ciertas aplicaciones de consulta ad hoc en que el usuario puede tolerar el hecho de que el resultado de las consultas pueda contener datos desfasados (algunas marcas de SGBD llaman a este modo de aislamiento «posibilidad de lectura» sucia debido a esta posibilidad). En consecuencia. junto con el nivel de aislamiento. que concede al usuario el control sobre el equilibrio entre aislamiento y eficiencia de procesamiento. que puede verse en la Figura 12. se puede utilizar con seguridad el nivel de aislamiento REPEATABLE READ para mejorar el rendimiento del SGBD sin sacrificar la integridad de los datos. por lo que se pueden producir los problemas de los datos no comprometidos. se ha comprometido con la base de datos. Obsérvese que si el programa intenta actualizar una fila que ya haya actualizado otro usuario. se hará que la transacción retroceda inmediatamente. Niveles de aislamiento y actualizaciones multiusuario. El estándar SQL2 especifica la instrucción SET TRANSACTION. Si el programa no depende de la posibilidad de volver a leer una sola fila de datos durante la transacción y no acumula valores totales ni realiza otro tipo de cálculos que se basen en un conjunto de datos autoconsistente. puede que una fila insertada en la base de datos por otra transacción concurrente se haga visible durante la transacción. La instrucción SET TRANSACTION también permite especificar si la transacción es READ ONLY (es decir. el SGBD aísla al usuario de menos problemas de las actualizaciones multiusuario. El programa podría. Los niveles de aislamiento se relacionan directamente con los problemas fundamentales de actualizaciones multiusuario ya estudiados en este capítulo.15. para evitar que se produzca el problema de la actualización perdida. El nivel de aislamiento READ COMMITTED es el tercer nivel más elevado. el programa no debería utilizar este modo.

pero de una forma diferente. elevándolo para permitir transacciones más complejas o disminuyéndolo para promover una escalada temprana de los bloqueos. que recuerda al valor predeterminado de lectura repetible del esquema de lBM. las bases de datos de IBM para grandes sistemas (DB2 y SQUDS) ofrecían históricamente la opción entre dos niveles de aislamiento -REPEATAELE READ Y READ COMMITTED (denominado CURSOR STAEILITY en la termino~ logía de 1BM). Por ejemplo. en ocasiones. El valor predeterminado de lngres es el bloqueo compartido. muy deseable hacer que una instrucción d. los modos de logres pueden escogerse c. antes de ninguna otra instrucción que afecte al contenido o a la estructura de la base de datos. cambiarse de una consulta a otra. Parámetros de bloqueo el procesamiento de la base de datos. en el paso BIND. * Un SGBD maduro. Obsérvese. el valor predeterminado son las transacciones READ WRITE. de hecho. Puede que el administrador de la base de datos tenga algún control sobre este proceso de escalada. como DB2.· Aunque los modos no constituyan estrictamente parte del lenguaje SQL. El nivel de aislamiento predeterminado es SERIALIZABLE. que los modos de bloqueo de lngres los define una instrucción ejecutable de SQL. Como ya se indicó antes en el apartado «Técnicas avanzadas de bloqueo». no se pueden modificar los niveles de aislamiento ni los modos de lectura y escritura en mitad de una transacción. Si se especifica el nivel de aislamiento READ UNCOMMITTED. El estándar exige. El administrador de la base de datos suele poder definir este limite. El SGBD suele permitir que cada transacción tenga un número finito de bloqueos.uando se ejecuta el programa e. Resulta posible y. • Bloqueo exclusivo. Sin embargo. se da por supuesto que es READ ONLY. Diagrama sintáctico de la instrucción SET TRANSACTION. Inforrnix. a expensas del rendimiento de la base de datos. • Caducidad de los bloqueos. Estos valores predeterminados ofrecen la máxima seguridad para las transacciones.16. muchos de los productos comerciales de SGBD implementaron sus esquemas de bloqueo y de mejora del rendimiento mucho antes de' la publicación del estándar SQL2. Orade. y una funcionalidad similar a la de la inslrucción de IBM LOCK TABLE.el programa se ejecute en un modo y la siguiente en un modo diferente. Obsérvese que la instrucción SET TRANSACTION especificada en el estándar SQL2 es una instrucción de SQL ejecutable. emplea técnicas de bloqueo mucho más complejas que las aquí descritas. pero evitan que los programadores de SQL poco experimentados sufran sin darse cuenta de alguno de los problemas del procesamiento de transacciones multiusuario. • Número de bloqueos. el nivel de filas y otros tamaños de bloqueo. sustituyendo muchos bloqueos de pequeño tamaño por un solo bloqueo de mayor tamaño (por ejemplo. Manual de referencia ~Capítulo 12: Procesamiento de transacciones 345 t-SET TRANSACTION ~ ISQLATIQN LEVELlSERIALIZAB~E REPEATABLE READ READ COMMITTED READ UNCOMMITTED READ WRITE READ ONLY j. Ofrece acceso exclusivo a la tabla durante la consulta. El administrador de la base de datos puede mejorar el rendimiento de estos sistemas definiendo manualmente los parámetros de bloqueo. A diferencia de los modos de lBM. Parecido al modo de IBM REPEATABLE READ que se acaba de describir. que se describe en el Ca~ pltulo 17. El SGBD logres ofrece una posibilidad parecida a los modos de aislamiento de las bases de datos de lBM. En función de cada aplicación concreta puede resultar adecuado un tamaño de bloqueo diferente. la elección del modo afecta mucho a la menera en que se comporta la aplicación y a la manera en que puede utilizar los datos recuperados. y esas estrategias de bloqueo afectan al núcleo de la arquitectura y de la lógica internas de la base de datos. • Bloqueo compartido. incluso. • Aumento del nivel de bloqueo. En las implementaciones de IBM se realiza la opción durante el proceso de desarrollo del programa. o como la primera instrucción de un programa. no obstante. En caso contrario. Algunas marcas de SGBD implementan una característica de . El SGBD aumenta a menudo el nivel de los bloqueos de manera automática. SQUDS.344 SOL. Esto significa que debe ejecutarse como la primera instrucción tras COMMIT o ROLLBACK. • Sin bloqueo. Las opciones son las siguientes: Figura 12. Entre los parámetros que pueden ajustarse normalmente se encuentran: • Tamaño de los bloqueos. el nivel de páginas. sustituyendo muchos bloqueos en el nivel de página por un bloqueo en el nivel de tabla). No resulta sorprendente que la adopción en este terreno de estándar SQL2 haya resultado relativamente lenta en comparación con algunas otras áreas en que la implementación era mucho más sencilla. puede que espere mucho tiempo a que la otra transacción libere sus bloqueos. Sybase o SQL Server. Aunque una transacción no esté interbloqueada con otra. Algunos productos de SGBD ofrecen la posibilidad de elegir el nivel de tablas. Y no se pueden especificar transacciones READ WRITE. Parecido al modo de IBM CURSOR STABILITY que se acaba de describir. que la instrucción 5ET TRAN5ACTION sea la primera ins· trucción de cada transacción. que deben escogerse en el momento de la compilación. Mediante la instrucción SET LOCKMODE los programas de aplicación pueden indicar a logres el tipo de bloqueo que debe utilizar al tratar las consultas a las bases de datos.

La actividad mostrada en la Figura 12. que muestran cien unidades. denominado versiones. Finalmente. (c 139 ®erCANTIDAD ACII 410041 139 I Antes .ACI 1 41004\ 1391 139 1ACI 1410041 . las otras copias de la fila contendrán los nuevos datos de la fila. Lo mismo ocurre pocos segundos más tarde con la transacción D. ya que en este enfoque el SOBO da por hecho de manera implícita que las transacciones simultáneas no interferirán entre sí. ya que. Sin embargo.i Después 3. Ahora la transacción B lleva a cabo una operación CQMMIT. y halla 139 unidades de cables ACI-41004 serie 4 disponibles. este periodo de caducidad puede definirlo el administrador de la base de datos. la transac~ión E intenta leer la fila. el SGBD da por hecho de manera implícita que es probable que las transacciones simultáneas interfieran entre sr. ciendo permanente la actualización de la fila. En los últimos años se ha implementado en diferentes productos de SOBO y ha ido ganando popularidad un enfoque diferente de la concurrencia. El SOBO realiza un seguimiento interno de las transacciones que deben ver cada versión de la fila. con una arquitectura de versiones (optimista). Poco después.17 cumple el requisito de secuenciabilidad del funcionamiento adecuado del SGBD. En consecuencia. o I Leer CANTIDAD . La lransacción B llega a continuación y actualiza la misma fila. si la transacción B vuelve a leer el contenido de la fila. Las versiones a veces se consideran consecuencia positiva de la concurrencia. al bloquear partes de la base de datos.- Antes ¡ . Cuando varios usuarios tienen acceso a la base de datos. I COMMIT Una copia (E 39 COMMIT COMMIT ACI 410041 39 1 Funcionamiento de las versiones * La Figura 12. leyendo una fila de la tabla PRODUCTOS. entre las transacciones concurrentes). previos a la actualización. La serie secuencial de transacciones . La transacción A inicia la acción. Los bloqueos se consideran a veces un consecuencia negativa de la concurrencia. en la que la instrucción de SQL falla con un código de error de SQL si no puede obtener los bloqueos que necesita en un periodo de tiempo determinado. D y E finalizan su actividad en la base de datos con una operación COMMIT. que muestran 139 unidades disponibles. Como todavía no se ha comprometido la actualización de la transacción B. Manual de referencia Capitulo 12: Procesamiento de transacciones 347 caducidad.- ! . I • Las transacciones concurrentes en una arquitectura de versiones. tras la actualización.17. la transacción e llega e intenta leer la misma fila. Normalmente. el SOBO ofrecerá a la transacción E los datos de la nueva copia. ya que refleja el stock actualizado por la transacción B (39 unidades). también verá disponibles 139 unidades. A partir de este momento. el esquema de bloqueos arbitra el acceso a cada fila de datos entre los usuarios (más exactamente. en función de sus niveles de aislamiento. las Transacciones C.Una copia 1 ACI 1 4100411391 ActualizarCANTIDA0=39 139 ® Antes I ACI 14100411391 ¡ í I Después 1ACI 1410041 39 I Leer CANTIDAD .346 SOL. Transacciones Valores de la base de datos Una copia Transacciones t ACI 14100411391 ) j !-~- Versiones * Las técnicas de bloqueo descritas en los apartados anteriores son las más utilizadas para el soporte del procesamiento de transacciones concurrentes multiusuario en los productos de SGBD relacionales. A continuación. el SOBO ofrece a la transacción C los datos de la copia antigua de la fila. ha- COMMIT ••• Figura 12. Leer CANTIDAD I + . el SOBO creará dos o más copias de los datos de cada fila de fa base de datos cuando algún usuario intente actualizarlas.17 muestra en funcionamiento una sencilla arquitectura de versiones. Con una arquitectura de bloqueo (pesimista) el SOBD mantiene internamente una y sólo una copia de los datos de cada fila de la base de datos. reduciendo la cantidad disponible a 39 unidades. el SOBO crea internamente una copia nueva de la fila. ese contenido procederá de esta segunda copia. Con la actualización de la transacción B ya comprometida. Una copia de la fila contendrá los datos viejos..

18. Con este enfoque de varias versiones la tarea de realización del-seguimiento de las_transacciones que deben ver cada versión de la fila. debe esperar a que la transacción B libere su bloqueo. seguirán produciendo problemas. 39 LeerCANTIDAD 1 ~ (E 3. el SGBD mantiene un Transacciones Valores de /a base de dar.¡. La arquitectura de versiones se amplía con facilidad para acoger más actualizaciones concurrentes. evidentemente. hallando 139 unidades de cables ACI-41004 disponibles. Si la transacción A está operando en un nivel de aislamiento menos estricto.a de bloqueo) muestra ahora 39 unidades disponibles. Manual de referencia .de bloqueos. Si la transacción A está operando en un nivel de aislamiento estricto (como REPEATABLE READ). por lo que sólo son necesarias dos copias de la fila actualizada (previa y posterior a la actualización).18. En la Figura 12. Las versiones no eliminan completamente la posibilidad de los interbloqueos en la base de datos. Internamente.18. No se puede decir lo mismo de la implementación típica de los bloqueos.18 hará. bloqueo compartido sobre la fila. Sólo después de que se hayan comprometido los cambios de.17 sólo incluye una transacción de actualización.17 permite que más transacciones concurrentes sigan adelante en paralelo.13. las versiones pueden reducir de manera significativa los bloqueos y los tiempos muertos de bloqueos o interbloqueos asociados con los bloqueos compartidos. diferencia. 'T' I . concediéndole un bloqueo exclusivo sobre la fila y actualizando realmente los datos. la transacción B se verá retenida en este punto. 's 1ACl I 4I0041 LeerCANTIDAD 139 I Actuafi. la transacción B pueden seguir adelante las transacciones C y D. Puede decirse lo mismo de la transacción D.17. la implementación de las versiones proporciona el funcionamiento correcto sin hacer que espere ninguna de las transacciones. merece la pena destacar dos diferencias. la serie A-D-C-B-E también produciría este resultado. la decisión sobre la versión de la fila que debe ser visible para cada transacción concurrente no sólo depende de la secuencia de las operaciones de la base de datos.18 la transacción A vuelve a iniciar la acción. incluso al esquema de versiones. T . En la práctica. 39 I COMMIT 3. el enfoque de las versiones de la Figura 12. La segunda. El ejemplo de la Figura 12. @eerCANTIDAI Esperar bloqueo I bloqueo 1ACl 1 Esperar . . es que el orden efectivo de la ejecución en serie de las transacciones es diferente en las dos figuras. cada una en un orden diferente. Comparando las operaciones de las Figuras 12. '" T. Transacciones concurrentes en una arquitectura. como puede verse en la Figura 12. que dos o más transacciones esperen que otras se completen y liberen sus bloqueos. No obstante. La fila interna de la base de datos (recuérdese que sólo hay una copia de cada de cada fila en esta arquitectur. COMHIT COMHIT COMMIT 1ACl I 410041 39 I T T T I T T Figura 12.--6apítulo 72: Procesamiento de transacciones 349 A-C-D-B-E produciría el mismo resultado que se muestra en la Figura. Por cada intento de actualizar la fila. la transacción B intenta actu·alizarla.) Además. y sobre todo.348 SOL. la secuencia de transacciones A-C-D-B-E produce el resultado. En primer lugar.18. el SGBD puede crear otra fila nueva. con sus intentos entrelazados de actualizar dos tablas diferentes. Obsérvese que ninguna de ellas es correcta. en la Figura 12. El enfoque de los bloqueos de la Figura 12. Las dos transacciones de la Figura 12. Cuando llega la transacción C. el principio de la secuenciabilidad sólo afirma que el resultado producido por el SGBD debe coincidir con alguna secuencia de transacciones en serie. (De hecho. que refleje la actualización. y más sutil. sino también de los niveles de aislamiento solicitados para cada transacción. . el SGBD puede pettniLir que la transacción B siga adelante. I AeI I 41004 ¡ 139 I B/oqueo compartido J T 139 AeI I 41004 I ~ =39 39 Bloqueo exclusivo ® @ LeerCANTlDAD . A continuación. para cargas de trabajo con una mezcla de operaciones READ y operaciones UPDATE de la base de datos. En la Figura 12.17 y 12. a menos que la transacción e esté operando en un nivel de aislamiento muy bajo (READ UNCOMMITTED). Como se ha indicado. la secuencia A-B-C-D-E produce el resultado. en la mayor parte de las circunstancias. ya que no puede adquirir el bloqueo exclusivo nece~ sario. reduciendo el stock a 39 unidades. se vuelve más compleja.

La ejecución simultánea se está haciendo cada vez más importante en las instalaciones de SGBD de gran tamaño. o si la carga de trabajo de la transacción está dominada por operaciones READ en vez de por operaciones UPDATE). Para los productos de SGBD que utilizan las versiones. sobrepasando las ventajas de la simultaneidad. Una sobrecarga anterior es el requisito añadido de memoria del almacenamiento de dos o más copias de las filas que se están actualizando. • Las transacciones son la clave del acceso simultáneo en las bases de datos multiusuario. Si esta asunción resulta exacta (por ejemplo.350 SOL. • Las transacciones son la clave de la recuperación de las bases de datos tras los falios del sistema. haciendo permanentes todas las modificaciones de la base de datos. También es un área en la que las principales marcas de SGBD divergen en sus posibilidades y opciones de ajuste.1 I • La instrucción ROLLBACK pide al SGBD que aborte una transacción. la sobrecarga de la técnica de las versiones tenderá a hacerse muy elevada. puede que un conflicto con otra transacción que se ejecuta de manera simultánea haga que el SGBD obligue a retroceder una transacción sin que ésta tenga ninguna culpa. Estos servidores pueden ejecutar realmente en paralelo muchas aplicaciones de acceso a la base de datos. Resumen Este capítulo describe el mecanismo de las transacciones ofrecido por el lenguaje SQL: • Una transacción es una unidad lógica de trabajo de las bases de datos basadas en SQL. Los programas de aplicación que utilizan SQL deben estar preparados para tratar esta situación si se llega a producir. haciendo retroceder todas las modificaciones de la base de datos. Se garantiza al usuario o programa que su transacción no se verá interferida por otras transacciones concurrentes. distribuyendo la carga de trabajo entre muchos procesadores. • Las sutilezas de la gestión de las transacciones y su consecuencia en el rendimiento de los SGBD son una de las áreas más complejas del empleo y la operación de bases de datos de producción de gran tamaño. la arquitectura de versiones se basa en la asunción implícita de que la mayor parte de las transacciones simultáneas tiende a no interferir entre sí. entonces la sobrecarga añadida del esquema de versiones se compensará con creces por un impulso significativo de la cantidad de trabajo paralelo que puede llevarse a cabo. Consiste en una secuencia de instrucciones de SQL que el SGBD ejecuta de hecho ·como una unidad. En la práctica. . Una sobrecarga aclicional es el seguimiento de las transacciones que deben ver cada copia de las filas. sólo las transacciones comprometidas en el momento del fallo permanecen en la base de datos recuperada. si las transacciones que se ejecutan de manera concurrente tienden a actualizar y tener acceso a las mismas filas). en las circunstancias adecuadas. y los servidores de SGBD de gran tamaño pueden admitir sesenta y cuatro o más procesadores en una configuración de multiprocesamiento simétrico (symmetric multiprocessing. si las transacciones que se ejecutan de manera simultánea actualizan y tienen acceso sobre todo a filas diferentes. Las versiones también se están volviendo más útiles a medida que el número de procesadores en los sistemas informáticos servidores típicos de SGBD aumenta. Para estos productos los ajustes de los parámetros de bloqueo y las instrucciones de bloqueo explícito permiten ajustar el rendimiento del procesamiento de transacciones. puede incrementar de manera significativa el número de transacciones simultáneas que pueden ejecutarse en paralelo. Si la asunción resulta inexacta (por ejemplo. Los servidores que contienen dieciséis O más procesadores se están haciendo cada vez más frecuentes. . • La instrucción COMMIT señala la finalización con éxito de una transacción. especialmente en las que soportan sitios web que pueden tener millares o decenas de millares de usuarios concurrentes. los ajustes en la profundidad del esquema de versiones y en la propia mezcla de transacciones son las claves del ajuste del rendimiento. • Una técnica alternativa de versiones para el manejo de las transacciones simultáneas está ganando popularidad. Manual de referencia Capítulo 12: Procesamiento de transacciones 351 Ventajas e inconvenientes de las versiones * La ventaja de la arquitectura de versiones es que. • Muchas marcas de SGBD utilizan técnicas de bloqueo para manejar las tran· sacciones simultáneas. millares de veces por segundo) y luego liberar la memoria para que se reutilice cuando ya no se necesiten las copias viejas de cada fila. • Ocasionalmente. De manera implícita. SMP). El inconveniente de la arquitectura de las versiones es la sobrecarga interna del SGBD que crea. una sobrecarga más seria es la gestión de memoria exigida para asignar memoria a cada copia temporal de una fila cuando se necesite (potencialmente.

El Capítulo 14 analiza las vistas. El Capítulo 13 explica cómo crear una base de datos y sus tablas. el Capítulo 16 estudia el catálogo del sistema. í 'i lt . Los Capítulos 13 al 16 describen ¡as características de SQL que dan soporte a es.E . Un papel importante de SQL es definir la estructura y organización de una base de datos. Las características de seguridad de SQL que protegen los datos almacenados se describen en el Capítulo 15..~ ~ Parte N ESTRUCTURA DE LA BASE DE DATOS 1" ~ I P . una característica importante de SQL que permite a los usuarios ver organizaciones alternativas de los datos de la base de datos. una colección de tablas del sistema que describen la estructura de una base de datos. Finalmente.te papel.

DELETE. Si se emplea una base de datos multiusuario. bases de datos completas que se compartirán con otros usuarios. Estas instrucciones se denominan colectivamente Lenguaje de manipulación de datos (LMD) de SQL. generalmente denominado Lenguaje de definición de datos (LDD) de SQL. utilizan SQL interactivo o para programación para tener acceso a una base de da· tos de información corporativa o a alguna otra base de datos que haya sido creada por olra persona. INSERT. El lenguaje de definición de datos Las instrucciones SELECT. por ejemplo. Con las instrucciones LDD se puede: 355 . En las bases de datos corporativas típicas. el administrador de la base de datos puede conceder permiso para recuperar y. Este capítulo describe las características del lenguaje SQL que permiten crear bases de datos y tablas y definir su estructura. Las instrucciones LMD pueden modificar los datos almacenados en la base de datos. es seguro que se desearán crear tablas y bases de datos propias para dar soporte a las aplicaciones personales. puede que se deseen crear tablas o. ninguna de estas instrucciones crea ni elimina tablas ni columnas. Si se utiliza una base de datos en una computadora personal. Es probable que a medida que uno se vaya encontrando más cómodo con SQL desee comenzar a crear tablas propias para almacenar datos personales como los resultados de las pruebas de ingeniería o las predicciones de ventas. para actualizar los datos almacenados. UPDATE. COMMIT y ROLLBACK descritas en las Partes TI y ID de este libro están relacionadas con la manipulación de los datos de las bases de datos. Sin embargo. incluso. Las modificaciones de la estructura de la base de datos las maneja un conjunto diferente de instrucciones de SQL.CAPíTULO 13 Creación de bases de datos Muchos usuarios de SQL no tienen que preocuparse de crear llna base de datos. pero no pueden modificar su estructura. el administrador no permitirá a cualquier usuario que cree bases de datos nuevas ni que modifique la estructura de las tablas existentes. Por ejemplo. quizás.

manipular sus datos y eliminarla. de dependencias del sistema operativo y de otras posibilidades propias de cada marca de SOBO. eliminar o modificar. una base de dl. Las bases de datos de DB2 se asocian con una copia en ejecución del software de servidor de DB2 y los usuarios tienen acceso a ellas conectándose al servidor de DB2. Manipulan objetos abstractos de las bases de datos. El estándar SQLl especificaba el lenguaje SQL utilizado para describir la estructura de las bases de datos. En la práctica. las tablas de usuario se ubican siempre en esta única base de datos que abarca todo el sistema. de manera predeterminada. Si un programa o un usuario necesitan una tabla para almacenar sus resultados temporales. lo que permite a los fabricantes conseguir el cumplimiento con la parte de LMD del estándar mediante una capa de SQL ubicada por encima de una base de datos subyacente que no es de SQL. • Controlar. Aunque LDD y LMD son dos partes diferentes del lenguaje SQL. que se denomina según un archivo de configuración de Oracle y se asocia con esa copia concreta del software de servidor de Oracle. De hecho. el almacenamiento físico. Generalmente. Las versiones de Orade más recientes se han ampliado con una instrucción CREATE DATABA5E para la definición de los nombres de las bases de datos.~ 356 SOL. No obstante. El estándar SQL2 sigue diferenciando entre distintos . objeto ya existente de la base de datos. como tablas y columnas. en los que la estructura de la base de datos se fijaba al crear la base de datos. En las instalaciones de SOBD para grupos de trabajo más reducidos puede que se permita a cada usuario crear sus propias bases de datos personales. Por tanto. todas las marcas de SGBD incluyen ampliaciones significativas LDD estándar para tratar estos problemas y otras posibilidades mejoradas de las bases de datos. Por tanto. En su mayor parte. al igual que DB2. ya que cada marca de SOBD había adoptado un enfoque ligeramente diferente. necesariamente. y a las instrucciones de LMD. El núcleo del lenguaje de definición de datos se basa en tres verbos de SQL: • CREATE. las instrucciones LDD y LMD se remiten al SGBD exactamente de la misma manera. Manual de referencia Capítulo 13: Creación de bases de datos 357 • Definir y crear nuevas tablas. el estándar SQLl implica una estricta separación entre LMD y LDD. el LDD no puede evitar completamente aspectos del almacenamiento físico. pueden crearla. la separación sólo es conceptual. en los que había que detener el SGBD antes de poder modificar la estructura de la base de datos. Creación de bases de datos En la instalación de un SGBD en un gran sistema informático (maifljrame) o en un nivel empresarial. • Oracle crea. Nuevamente. instrucciones de datos de SQL e instrucciones de transacciones de SQL. se trata de una importante ventaja respecto de'modelos anteriores de datos. El empleo para producción de las bases de datos puede continuar mientras se añaden tablas y aplicaciones nuevas. El estándar SQL2 sólo especifica las partes LDD que son relativamente independientes de las estructuras de almacenamiento físico. por ejemplo. el estándar SQLl no lo exigra. Elimina un • ALTER. tipos de instrucciones de SQL. Estas diferencias persisten en los productos habituales de SGBD de hoy en día. Modi. y. En su mayor parte. • Modificar la definición de tablas ya existentes. pero no el modo en que se crean las bases de datos. la estructura de la base de datos es dinámica. Las técnicas utilizadas por estos productos de SQL ilustran las diferencias: • DB2 de IBM tiene una estructura de base de datos predeterminada sencilla. en la mayor parte de los productos de SGBD basados en SQL. (Denomina a las instrucciones LDD instruccio· nes de esquema de SQL. las «bases de datos» se definen de hecho mediante la instalación del software de DB2 en un sistema informático concreto. renenarla. y pueden entremezclars~ libremente tanto en las sesiones interactivas de SQL como en las aplicaciones de programación de SQL. las instrucciones LDD aíslan al usuado de los detalles de bajo nivel del modo ~n Rue se almacenan físicamente los datos en las bases de datos. el administrador corporativo de la base de datos es el único responsable de la creación de bases de datos nuevas. El SGBD puede crear. Aunque casi todos los productos comerciales de SQL admiten LDD como parte 'integral del lenguaje SQL. • Eliminar tablas que ya no sean necesarias. de los ~alos por el SGBD. • Establecer controles de seguridad para las bases de datos. En todos los principales productos de SGBD basados en SQL estos tres verbos LDD pueden utilizarse mientras se ejecuta el SGBD. • Crear índices para hacer más rápido el acceso a las tablas. Significa que las bases de datos relacionales pueden crecer y modificarse fácilmente a lo largo del tiempo. pone al estándar en línea con la implementación actual de productos populares de SQL al exigir que las instrucciones LDD se ejecuten de manera interactiva y mediante un programa. • Definir tablas virtuales (o vistas) de los datos. Define y • DROP. Se trata de una importante ventaja de SQL y de las bases de datos relacionales respecto a sistemas anteriores. la definición de las tablas de la base de datos mientras ofrece de manera simultánea acceso a la base de datos a sus usuarios. pero resulta mucho más frecuente que las bases de datos se creen de manera centralizada y luego cada usuario tenga acceso a ellas.fi~a la definición de un objeto de la base de dalas.) No obstante. crea un objeto de la base de daros. las instrucciones y cláusulas LDD que controlan el almacenamiento físico varían de un SGBD a Olro. y habrá que crear personalmente las bases de datos que se utilicen. Las diferencias entre el estándar ANSUISO y la implementación LDD de los productos populares de SQL se describen para cada instrucción de SQL durante este capítulo. lo más probable es ser a la vez el administrador de la base de datos y el usuario.ltos como parte del proceso de instalación del software de Oracle. Si se utiliza un SGBD para computadoras personales.

se pueden crear y destruir tablas para adaptarse a las necesidades propias sin preocuparse por otros usuarios. pero los nombres pueden repetir los de columnas de otras tablas. pero no en otras marcas. En la práctica. • Informix Universal Server alberga también las instrucciones de SQL CREATE y DROP DATABASE.358 SOL. Cuando se ejecuta una instrucción CREATE TABLE. Identifica el tipo de datos que almacena la columna. A medida que se utiliza la base de datos. Cada columna de la tabla debe tener un nombre único. Las diferentes cláusulas de la instrucción especifican los elementos de la definición de la tabla. define una nueva tabla en la base de datos y la prepara para que acepte datos. se permiten los v~lores NULL. como puede verse en los ejemplos anteriores. (Más adelante se ofrece información adicional sobre la estructura de la base de datos especificada por el estándar SQL2. o más permanentes y durar semanas o meses. Esta información adicional se encierra entre paréntesis a continuación de la palabra clave que especifica el tipo de dalos. También indica el número de catálogos que hay y si cada instrucción de SQL que puede tener acceso a los datos desde diferentes catálogos viene definida por la implementación. que puede utilizarse para exigir que la columna contenga valores únicos. Los tipos de dalos se estudiaron en el Capítulo 5. y se utilizan día tras día. Estas tablas pueden ser temporales. DATABASE BASE El estándar SQL2 evita de manera específica la concreción del término base de datos por 10 sobrecargado que se halla de significados contradictorios procedentes de los productos SGBD. con equilibrios entre el rendimiento y la integridad de los datos durante los fallos del sistema. y dice específicamente que depende de la implementación. en caso contrario. SQL2 utiliza el término catálogo para describir un conjunto con nombre de tablas que la mayor parte de las marcas populares de SOBD denomina base de datos. El diagrama sintáctico de la instrucción parece complicado porque hay muchas partes de la definición que especificar y muchas opciones para cada elemento. Además. Las opciones de la instrucción CREATE DATABAS E especifican el dispositivo de E/S en el que hay que ubicar la base de datos. En la práctica. Determina si la columna contiene datos requeridos. El estándar no especifica la forma de crear o destruir catálogos. Los nombres de las bases de datos deben ser únicos en cada instalación de SQL Server. y sólo durar una sesión de SQL interactivo. El estándar SQL2 permite varias partes adicionales a la definición de una columna. y evita que aparezcan valores NULL en la columna. exigen información adicional. y no debe entrar en conflicto con el de ninguna tabla ya existente. Definiciones de tablas La estructura más importante de las bases de datos relacionales es la tabla. Los nombres de estas bases de datos se siguen en una base de datos maestra especial que está asociada con una sola instalación de SQL Server. Manual de referencia CREATE DATA- Capítulo 13: Creación de bases de datos 359 • SQL Server de Microsoft y Sybase incluye una instrucción Creación de tablas (CREATE TABLE) La instrucción CREATE TABLE. para especificar que la columna es una clave primaria o una clave externa o para restringir los valores de los datos que puede contener la columna. como VARCHAR y DECIMAL. Las columnas de la tabla recién creada se definen en el cuerpo de la instrucción Las definiciones de las columnas aparecen en una lista separada por comas encerrada entre paréntesis. pero el SGBD la prepara para que acepte los datos añadidos con la instrucción INSERT. Como se es a la vez usuario y administrador de la base de datos. • Tipo de datos. a la que se le otorga el nombre especificado en la instrucción. Utiliza un valor predeterminado opcional para la columna cuando la instrucción INSERT para la tabla no especifica ningún valor. • Valor predeterminado. En las instrucciones CREATE TABLE admitidas por las principales marcas de SOBD. que puede verse en la Figura 13. El nombre de la tabla debe ser un nombre legal en SQL. las principales tablas suele crearlas una sola vez el administrador de la base de datos. La tabla recién creada está vacía. Se trata de ver- . la creación de tablas nuevas resulta relativamente sencilla. que es un área de almacenamiento de disco controlada por el software de Informix. La instrucción anexa DROP DATABASE destruye anteriormenre las bases de datos ya creadas. Estas instrucciones pueden utilizarse con SQL interactivo o de programación. uno se transforma en el propietario de la tabla recién creada. se suele considerar adecuado definir tablas propias para almacenar datos personales o datos extraídos de otras tablas. cada definición de columna especifica lo siguiente: CREATE TABLE. • Nombre de )a columna. Una opción de la instrucción CREATE DATApermite que se cree la base de datos en un dbspace concreto. muchos de los principales fabricantes de SGBD han acabado utilizando la pareja de instrucciones CREATE DATABAS E/ DROP DATABASE. Otra opción controla el tipo de registro histórico de la base de datos que hay que llevar a cabo con la nueva base de datos. En las bases de datos de computadoras personales. Se utiliza para hacer referencia a la columna en las instrucciones de SQL. El orden de las definiciones de las columnas determina el orden de izquierda a derecha de las columnas en la tabla. En las bases de datos multiusuario de producción. Definición de columnas BASE como parte de su lenguaje de definición de datos. Algunos tipos de datos. • Datos requeridos. algunas de las opciones están disponibles en algunas marcas de SGBD o en el estándar SQL2. como la longitud o el número de posiciones decimales de los datos. en el apartado «Estructura de la base de datos y el estándar ANSI/ISO»). la estructura de tablas resulta todavía más fluida.1.

360

SOL. Manual de referencia

~

Capítulo 13: Creación de bases de datos

361

~ CREATE TABLE

nombre-de-tabla

(Fdefinición-de-columna?T)-'.
definición-de-restricción-de-tabla

siones de una sola columna de capacidades proporcionadas por otras cláusulas de la instrucción CREATE TABLE, y se describen corno parte de esa instrucción en los apartados siguientes. A continuació!1 se ofrecen algunas inslrucciones CREATE TABLE sencillas para las tablas de la base de datos de ejemplo: Definir la tabla OFICINAS y sus columnas.
CREATE TABLE (OFICINA CIUDAD REGION JEF OBJETIVO VENTAS OFICINAS INTEGER NOT NULL, VARCHAR(15) NOT NULL, VARCHAR(10} NOT NULL, INTEGER, MONEY, MONEY NOT NULL)
PEDIDOS

definición-de-columna: - nombre-de-columna tipo-de-dalos

c=

DEE'AULT valor

==--:f L
NOT NULL

3
¡

..

definición-de-restricción-de-labla:

--r---------------., ••-'rrestricción-de-clave-primaria
CQNSTRAINT

..

nombre-de-restricción

restricción-de-c/ave-extema restricción-de-unicidad resrricción-de.comprobación

I

I ,

I

..

,
INITIALLY IMMEDIATE

..
INITIALLY DEFERRED

••
Definir la tabla
CREATE TABLE (NUM_PEDIDO FECHA_PEDIDO CLIENTE REP FAS PRODUCTO CANTIDAD IMPORTE

DEFE:RRABLE

L-

y sus columnas.

restricción-de-cl3ve-primaria:

- - - PRlMARY KEY

( t nombre-~e-columnaT)

••

restricción-de-clave-externa:

- - FOREIGN KEY (~ , mbre-de-columna T ) REFERENCES

de-rebla

nombre-

[ (- nombre-da-columna

c:=,

f JI

PEDIDOS INTEGER NOT NULL, DATE NOT NULL, INTEGER NOT NULL, INTEGER, CHAR(3) NOT NULL, CHAR{S) NOT NULL, INTEGER NOT NULL, MONEY NOT NULL)

MATCH - , - FULL

L
ON OELETE

PARTIAL ;r

----r
CASCAOE

ON

UPDATE

1 1

SET NULL
SET DEFAULT

NO ACTION CASCADE
SET NULL SET DEFAULT NO ACTION


restricclón-de-u nicidad:

La instrucción CREATE TABLE para una tabla dada puede variar ligeramente de un SGBD a otro, ya que cada SGBD alberga su propio conjunto de tipos de datos y emplea sus propias palabras claves para identificarlos en las definiciones de las columnas. Además, el estándar SQL2 permile especificar un dominio en lugar de un tipo de datos dentro de la definición de una columna. (Los dominios se describieron en el Capítulo 11.) Un dominio es un conjunto concreto de valores de datos válidos que se define dentro de"la base de datos y al que se le asigna un nombre. La definición de dominio se basa en uno de los tipos de datos soportados por el SGBD, pero lleva a cabo comprobaciones adicionales del valor de los datos que restringen los valores legales. Por ejemplo, si esta definición de dominio apareciera en una base de datos bajo el estándar SQL2:
CREATE DOMAIN ID_OFICINA_VALIDA INTEGER CHECK (VALUE BETWEEN 11 ANO 99)

- - - UNIQUE

---e T

nombre-de,-columnaT}----...·

entonces la definición de la tabla OFICINAS podría modificarse para que fuera:
restricción-de-comprobaci6n:
- - CHECK

(condición-de-bUsqueda)

...

Definir la tabla OFICINAS y sus columnas.
CREATE TABLE OFICINAS (OFF ICE ID_OFICINA_VALIDA NOT NULL, CIUDAD VARCHAR(15) NOT NULL,

Figura 13.1. "Diagrama sintáctico básico de CREATE TABLE.

362

SOL. Manual de referencia
REGlON VARCHAR{lO) NOT NULL,
JEF INTEGER, OBJETIVO MONEY.

Capítulo 13: Creación de bases de datos

363

Definición de clave primaria y de clave externa

VENTAS MONEY NOT NULL)

y el SGBD comprobaría de manera automática cualquier fila ,recién insertada 'p~a asegurarse de que su número de oficina se hall~ en el ran~o deslgna~o ..Los dommlOs resultan especialmente efectivos cuando se aplican las mIsmas restriCCIOneS de valores válidos a muchas columnas diferentes de la base de datos. En la base de datos de ejemplo, los números de oficina aparecen en la~ ~abl~s OFICINAS, y REPRESENTANTES, Y el dominio ID_OFICINA_VALIDA se utllizana para defimr las ~olumnas de estas dos tablas. En las bases de datos del mundo real puede haber docenas o centenares de columnas de este tipo cuyos datos se extraen del mismo dominio.
Valores ausentes y valores predeterminados

Además de definir las columnas de cada tabla, la instrucción CREATE TABLE idenli. fica la clave primaria y las relaciones de la tabla con otras tablas de la base de datos. Las cláusulas PRlMARY KEY Y FOREIGN KEY tratan estas funciones. SQL de IBM admite estas cláusulas desde hace algún tiempo y se han añadido a la especificación ANSI/ISO. La mayor parte de los principales productos de SQL las admiten. La cláusula PRIMARY KEY especifica las columnas que forman la clave prima· ria de la tabla. Recuérdese del Capítulo 4 que esta columna (o combinación de columnas) sirve de identificado·r único de cada fila de la tabla. El SGBD exige de manera automática que el valor de la clave primaria sea único en cada fila de la tabla. Además, la definición. de las columnas de cada columna de la clave primaria debe especificar que la columna es NOT NULL. La cláusula FOREIGN KEY especifica una clave externa de la tabla y la relación que crea con otra tabla de la base de datos (la tabla padre). La cláusula especifica: • Las columnas que forman la clave externa, ladas las cuales son columnas de la tabla que se está creando. • La tabla a la que la clave externa hace referencia. Se trala de la tabla padre de la relaci6n; la tabla que se está definiendo es la tabla hija. • Un nombre opcional para la relación. El nombre no se utiliza en las instrucciones de manipulación de datos de SQL, pero puede aparecer en mensajes de error y es necesario si se desea poder eliminar la clave externa más adelante. • El modo en que el SGBD debe tratar los valores NULL en una o más columnas de la clave externa al compararla con las filas de la tabla padre. • Una regla opcional de eliminación de la relación (CASCADE, SET NULL, SET DEFAULT o NO ACTION, como se describe en el Capítulo 11), que determina la acción que hay que emprender cuando se elimina una fila padre. • Una regla opcional de actualizaci6n de la relación como se describe en el Capítulo 11, que determina la acci6n que hay que emprender cuando se actualiza parte de la clave principal de una fila padre. • Una restricci6n opcional de comprobación, que restringe los datos de la tabla de modo que sus filas cumplan una condici6n de búsqueda especificada. A continuaci6n se ofrece un instrucci6n CREATE TABLE expandida para la tabla PEDIDOS. que incluye una definición de su clave primaria y de las tres claves externas que contiene:

La definición de cada columna dentro de la tabla indica al SGBD si se permite que los datos de la columna estén ausentes; es decir, si se permite que la columna tenga un valor NULL. En la mayor parte de las principales marcas de SGBD y en el estándar SQL, el valor predeterminado es permitir los daws ausentes en las columnas. Si la columna debe contener un valor legal de los datos en cada fila de la tabla, su definición debe incluir la cláusula NOT NULL. Los productos de SGBD de Sybase y SQL Server de Microsoft utilizan el convenio contrario, dando por supuesto que no se permiten los valores NULL a menos que la columna se declare de m~nera explícita como NULL, O el modo de autorización de valores NULL predetermmado se define para que permita de manera predeterminada valores NULL. El estándar SQL2 y muchos de los principales productos de SGBD de SQL admiten los valores predeterminados de las columnas. Si una columna tiene un valor predeterminado, se especifica en la definición de la columna. Por ejemplo, a continuación se ofrece una instrucción CREATE TABLE para la tabla OFICINAS que especifica los valores predeterminados:

Definir la tabla
CREATE TABLE (OFICINA CIUDAD REGION JEF OBJETIVO VENTAS

OFICINAS

con valores predeterminados (sintaxis ANSI/ISO).

OFICINAS INTEGER NOT NULL. VARCHAR(lSJ NOT NULL. VARCHAR(lOJ NOT NULL DEFAULT 'Este'. INTEGER DEFAULT 106. MONEY DEFAULT NULL. MONEY NOT NULL DEFAULT 0.00)

Con esta definición de tabla sólo hace falta especificar el número de oficina y la ciudad cuando se inserla una oficina nueva. El valor predeterminado de la regi6n es Este; el jefe de la oficina predeterminado es Samuel Clavel (empleado número 106); el valor predeterminado de las ventas es cero, y el valor predeterminado del objetivo es NULL. Obsérvese que el valor predeterminado del objetivo sería NULL aunque no existiera la especificación DEFAULT NULL.

Definir la tabla

PEDIDOS

con su clave primaria y sus claves externas.

CREATE TABLE PEDIDOS (NUM_PEDIDO INTEGER NOT NULL, FECHA_PEDIDO DATE NOT NULL,

364

SOL. Manual de referencia
CLIENTE INTEGER NOT NULL.
REP INTEGER, FAB CHAR(31 NOT NULL. PRODUCTO CHAR(5) NOT NULL.

'-

Capítulo 13:· Creación de bases de datos

365

Tabla CLIENTES
NOM_CLIENTE FORMULADO

CANTIDAD IMPORTE PRlMARY KEY CONSTRAINT FOREIGN KEY REFERENCES ON DELETE CONSTRAINT FOREIGN KEY REFERENCES ON DELETE CQNSTRAINT FOREIGN KEY

INTEGER NOT NULL, MDNEY NOT NULL. (NUM_PEDIDO). FORMULADO (CLIENTE) CLIENTES CASCADE, TRAMITADO (REP) REPRESENTANTES SET NULL, DE (FAB, PRODUCTO)

I EMPRESA

1 21 ,03

I

ACME

U

Tabla REPRESENTANTES
NUM EMPL TRAMITADO
lOS

NOMBRE Bruno Arteaga

REFERENCES PRODUCTOS ON DELETE RESTRICT)

Tabla PRODUCTOS
ID_FAB ACI
\

La Figura 13.2 muestra las tres relaciones creadas por esta instrucción y los nombres que les asigna. En general, conviene asignar un nombre de relación, ya que ayuda a clarificar la relación creada por la clave externa. Por ejemplo, cada pedido lo formuló el cliente cuyo número aparece en la columna CLIENTE de la tabla PEDIDOS. La relación creada por esta columna ha recibido el nombre de FORMULADO. Cuando el SGBD procesa la instrucción CREATE TABLE, contrasta cada defi· nición de clave externa con la definición de la labIa a la que hace referencia. El SOBD se asegura de que la clave externa y la clave primaria de la tabla a la que se hace referencia coincidan en el número de columnas que contienen y en sus tipos de datos. La tabla a la que se hace referencia debe estar ya definida en la base de datos para que esta comprobación tenga éxito. Obsérvese que la cláusula FOREIGN KEY también especifica las reglas de elimi· nación y actualización que hay que hacer cumplir para la relación entre tabla padre y tabla hija que crea. Las reglas de eliminación y de actualización, y las acciones que pueden desencadenarlas, se describen en el Capítulo 11. El SGBD hace que se cumplan las reglas predeterminadas (NO ACTION) si no se especifica ninguna regla de manera explícita. Si se desea crear dos o más tablas en un ciclo referencial (como las tablas OFICINAS y REPRESENTANTES de la base de datos de ejemplo), no se puede incluir la definición de clave externa en la primera instrucción CREATE TABLE, por. que la tabla referenciada no existe aún. El SGBD rechazará la instrucción CREATE TABLE con un error diciendo que la definición de tabla se refiere a una tabla no definida. En su lugar, se debe crear la primera tabla sin la definición de clave externa y añadir la clave externa más tarde usando la instrucción ALTER TABLE. (El estándar SQL2 y varios de los principales productos SGBD ofrecen una solución diferente a este problema con la instrucción CREATE SCHEMA, que crea un conjunto completo de tablas de una vez, Esta instrucción y los otros objetos de la base de datos que se incluyen dentro de un esquema SQL2 se describen más tarde en la sección «Esquemas SQL2».)

ID_PRODUCTO 41004
J

DESCRIPCION Serie 4, cable

--

v

lbla PEDIDOS
HUM PEDIDO
112963

I
2103

I~
FAB

~
'Cl

FECHA...PEDIDO CLIENTE RE' 17-DIC-89
lOS

PRODUCTO
41004

CANTIDAD
28

IMPORTE
3.276.00 €

-Figura 13.2.

-

Nombres de las relaciones de la instrucción CREATE TABLE.

Restricciones de unicidad
El estándar SQL2 especifica que las restricciones de unicidad también se definen en la instrucción CREATE TABLE mediante la cláusula UNIQUE, que puede verse en la Figura 13.1. A continuación se ofrece una instrucción CREATE TABLE para la tabla OFICINAS, modificada para exigir valores únicos de CIUDAD:
Definir la tabla OFICINAS con una restricción de unicidad.
CREATE TABLE (OFICINA CIUDAD REGION JEF OFICINAS INTEGER NOT NULL, VARCHAR(15) NOT NULL, VARCHAR(lO) NOT NULL, INTEGER,

_1

I 1,

I

366

SOL Manual de referencia
OBJETIVO MONEY,

Capítulo 1;J: Creación de bases de datos
OBJETIVO VENTAS PRIMARY KEY CONSTRAINT FOREIGN KEY REFERENCES ON DELETE CHECK MONEY, MaNEY NOT NULL, (OFICINA), JEFEVENTAS (JEF) REPRESENTANTES SET NULL, (OBJETIVO >= 0.00))

367

VENTAS MONEY NOT NULL,
PRIMARY KEY (OFICINA),

CONSTRAINT FOREIGN KEY REFERENCES ON DELETE UNIQUE

JEFEVENTAS (JEF) REPRESENTANTES SET NULL. (CIUDAD))

Si la clave primaria, la clave externa, la restricción de unicidad o la restricción de comprobación afecta a una sola columna, el estándar ANSI/lSO permite una forma abreviada de la definición. Sencillameme, se añade la clave primaria, la clave externa, la restricción de unicidad o la restricción de comprobación al final de la definición de la columna, como se puede ver en este ejemplo:

Definir la tabla
CREATE TABLE (OFICINA CIUDAD REGION JEF INTEGER OBJETIVO VENTAS

OFICINAS con

una restricción de unicidad (sintaxis ANSI/ISOJ.

Se puede especificar de manera opcional un nombre para la restricción de comprobación, que será utilizada por el SGBD cuando comunique .un error si se viola la restricción. A continuación puede verse una restricción de comprobación ligeramente más compleja para que la tabla REPRESENTANTES haga que se cumpla la regla «A los representantes cuya fecha de contratación sea posterior al 1 de enero de 1988 no se les asignarán cuotas superiores a 300.000 En. La instrucción CREATE TABLE denomina a esta restricción TOPE_CUOTA:
CREATE TABLE REPRESENTANTES (NUM_EMPL INTEGER NOT NULL, NOMBRE VARCHAR (15) NOT NULL.

OFICINAS INTEGER NQT NULL PRlMARY KEY, VARCHAR(lS) NOT NULL UNIQUE, VARCHAR(lO) NOT NULL, REFERENCES REPRESENTANTES, MONEY, MONEY NOT NULL)

Varias de las principales marcas de SGBD, incluidas SQL Server, Informix, Sybase y DB2, admiten esta forma abreviada.
Restricciones de comprobación

CONSTRAINT FOREIGN KEY REFERENCES ON DELETE CONSTRAINT

TRABAJAEN (OFICINA_REP) OFICINAS SET NULL TOPE_CUOTA CHECK

((FECHA_CONTRATO < "Ol-JAN-SS") OR (CUOTA <= 300000)))

Otra característica de integridad de datos de SQL2, la restricción de comprobación (que se describe en el Capítulo 11), también se especifica en la instrucción CREATE TABLE. Las restricciones de comprobación especifican una condición de comprobación (idéntica en su forma a las condiciones de búsqueda de las consultas de SQL) que se efectúa cada vez que se realiza un intento de modificación del contenido de la tabla (con una instrucción INSERT, UPDATE o DELETE). Si la condición de comprobación sigue siendo TRUE tras la modificación, se autoriza; en caso contrario, el SGBD frustra el intento de modificar los datos y devuelve un código de error. A continuación puede verse una instrucción CREATE TABLE para la tabla OFICINAS, con una condición de comprobación sencilla para asegurarse de que el OBJETIVO para la oficina sea mayor de 0,00 €.
Definir la tabla
CREATE TABLE (OFICINA CIUDAD REGlaN JEF
OFICINAS

Esta posibilidad de las restricciones de comprobación la admiten muchas de las principales marcas de SGBD.
Definición del almacenamiento físico

*

La instrucción CREATE TABLE suele incluir una o varias cláusulas opcionales que

con una restricción de unicidad.

OFICINAS INTEGER NOT NULL, VARCHAR(15) NaT NULL, VARCHAR(lO) NOT NULL, INTEGER,

especifican las características del almacenamiento físico de la tabla. Generalmente, estas cláusulas sólo las utiliza el administrador de la base de datos para optimizar el rendimiento de las bases de datos de producción. Por su propia naturaleza, estas cláusulas son muy específicas de cada SGBD en concreto. Aunque resultan de poco interés práctico para la mayor parte de los usuarios de SQL, las diferentes estructuras de almacenamiento físico ofrecidas por los diferentes SGBD ilustran las diferentes aplicaciones para las que están diseñados y sus niveles de sofisticación. La mayor parte de las bases de datos de las computadoras personales ofrecen mecanismos de almacenamiento físico muy sencillos. Muchos productos de bases de datos para computadoras personales almacenan toda la base de datos en un solo archivo de Windows, o utilizan un archivo de Windows diferente para cada tabla de la base de datos. Puede que también necesiten que toda la tabla o toda la base de datos se almacenen en un solo volumen de disco físico. Las bases

J

368

SOL. Manual de referencia

-----

Capítulo 13: Creación de bases de datos

369

de datos multiusuario suelen ofrecer esquemas de almacenamiento físico más sofisticados para admitir el rendimiento mejorado de la base de datos. Por ejemplo, logres permite que el administrador de la base de datos defina vari-as ubica~ ciones con nombre, que son directorios físicos en los que pueden almacenarse los datos de la base de dalOs. Las ubicaciones pueden repartirse entre varios volúmenes de disco para aprovechar las operaciones paralelas de entrada y salida de disco. Se pueden especificar de manera opcional una o varias ubicaciones para cada tabla en la instrucción de logres CREATE TABLE:
CREATE TABLE OFICINAS (definición-de-tabla) WITH LOCATIQN ~ {AREA1, AREA2, AREA3)

ello es que estas instrucciones incluyen especificaciones dependientes del sistema operativo de nombres de archivos y de directorios, que varían de un sistema operativo admitido por DB2 a otro. Otras cláusulas especifican el grupo de búfer que hay que usar, la sobrecarga y la tasa de transferencia del medio de almacenamiento y otras características íntimamente relacionadas con el medio de almacenamiento físico. DB2 utiliza esta información en sus algoritmos de optimización del rendimiento.

Eliminación de una tabla (DROP TABLE)
A lo largo del tiempo la estructura de las bases de datos crece y se modifica. Se crean nuevas tablas para que representen entidades nuevas, y algunas tablas viejas dejan de ser necesarias. Se puede eliminar de la base de datos una tabla no necesaria con la instrucción DROP TABLE, que puede verse en la Figura 13.3. El nombre de tabla de la instrucción identifica la tabla de la que se va a prescindir. Normalmente se prescinde de una tabla propia y se utiliza un nombre de tabla no calificado. Con los permisos adecuados, se puede prescin~ir también de tablas poseídas por otros usuarios especificando un nombre de tabla calificado. A continuación se ofrecen unos ejemplos de la instrucción DROP TABLE:
La tabla CLIENTES ha sido sustituida por dos tablas nuevas, INFO_CLIENTE e
INFO_CUENTA, )'

Al especificar varias ubicaciones, se puede dividir el contenido de cada tabla entre varios volúmenes de disco para un mayor acceso paralelo a la tabla. Sybase ofrece un enfoque parecido, que permite al administrador de la base de dalos especificar varios dispositivos lógicos de La base de datos con nombre que se utilizan para almacenar los datos. La correspondencia entre los dispositivos lógicos de Sybase y los discos físicos reales del sistema informático la maneja un programa de utilidad de Sybase, y no el lenguaje SQL. La instrucción de Sybase CREATE DATABASE puede especificar que se almacene la base de datos en uno o varios dispositivos de la base de datos:
CREATE DATABASE DATOSOP ON ARCHIVOBDl, ARCHIVOBD2, ARCHIVOBD3

ya no es necesaria.

Dentro de cada dispositivo de la base de datos, Sybase permite que el adminis~ trador de la base de datos defina segmentos lógicos, utilizando uno de los procedimientos almacenados proporcionados por el sistema de Sybase. Finalmente, la instrucción de Sybase CREATE TABLE puede especificar el segmento en que hay que almacenar los datos de cada tabla:
CREATE TABLE OFICINAS ON SEGMENT SEGIA
(definición-de-tabla)

DROP TABLE CLIENTES

Samuel concede permiso para prescindir de su tabla, denominada
DROP TABLE SAMUEL.CUMPLEA&OS

CUMPLEAÑOS.

DB2 ofrece un esquema general parecido para la administración del almacena~ miento físico, basado en los conceptos de espacios de tablas y de grupos nodales. Los espacios de tablas son contenedores de almacenamiento de nivel lógico, mientras que los grupos nodales se definen más específicamente en términos de almacenamiento físico. Cuando se crea una tabla de DB2 se puede asignar, de manera opcional, a un espacio de tablas concreto:
CREATE TABLE OFICINAS (definici6n-de-tabla) IN ADMINDB.OPSPACE

Cuando la instrucción DROP TABLE elimina una tabla de la base de datos, se pierden su definición y todo su contenido. No hay manera de recuperar los datos, y habría que utilizar una nueva instrucción CREATE TABLE para volver a crear la definición de la tabla. Debido a sus graves consecuencias se debe utilizar la instrucción DROP TABLE con cuidado. El estándar SQL2 exige que la instrucción DROP TABLE incluya CASCADE o RESTRICT, que especifican el efecto de la eliminación de una tabla en los demás

r
Figura 13.3.

DROP TABLE nombre-de-tabfa

r===r"
CASCADE RESTRICT

A diferencia de Sybase, DB2 pone la mayor parte de la administración de estas entidades de almacenamiento en manos del propio lenguaje SQL, mediante las instrucciones CREATE TABLESPACE y CREATE NODEGROUP. Una consecuencia de

Diagrama sintáctico de la instrucción DROP TABLE.

370

SOL. Manual de referencia

Capítulo 13: ·Creación de bases de datos

371

objetos de la base de datos (como las vistas, que se describen en el Capítulo ]4) que dependen de esa labia. Si se especifica CASCADE. la instrucción DROP TABLE falla si otros objetos de la base de datos hacen referencia a la tabla. La mayor parte de los produclOs comerciales de SGBD aceptan la instrucción DROP TABLE sin especificar ninguna opción.

~ ALTER TABLE nombre-de-tabla

ADD

definicián-de-co/umna ------~. •

ALTER nombre-de-

columna
DROP

1 DROP

SET DEFAULT valor
DEFAULT

Cambio de la definición de una tabla (ALTER TABLE)
AnD

Una vez que una tabla ha estado en uso durante algún tiempo; los usuarios suelen descubrir que desean almacenar información adicional sobre las entidades representadas en la tabla. Así, en la base de datos de ejemplo, puede que se desee: • Añadir el nombre y el número de teléfono de una persona principal de contacto a cada fila de la tabla CLIENTES, a medida que se comienza a utilizar para establecer contacto con los clientes. • Añadir una columna de nivel mínimo de inventario a la tabla PRODUCTOS, de modo que la base de datos pueda alertar de manera automática cuando las existencias de un producto determinado sean bajas. • Hacer de la columna REGION de la tabla OFICINAS una clave externa para la tabla REGIONES recién creada. cuya clave principal es el nombre de la región. • Prescindir de la definición de clave externa que vincula la columna CLIENTE de la tabla PEDIDOS con la tabla CLIENTES, sustituyéndola por dos definiciones de clave externa que vinculen la columna CLIENTE a las tablas INFO_CLIENTE e INFO_CUENTA recién creadas. Cada uno de estos cambios, y algunos otros, pueden llevarse a cabo con la instrucción ALTER TABLE, que puede verse en la Figura 13.4. Al igual que con la instrucción DROP TABLE, normalmente se utilizará la instrucción ALTER TABLE con una tabla propia. Con los permisos adecuados, no obstante, se puede especificar un nombre calificado de tabla y alterar la definici6n de una tabla de otro usuario. Como puede verse en la figura, la instrucción ALTER TABLE puede: • • • • • • • Añadir la definición de una columna a la tabla. Eliminar una columna de la tabla. Modificar el valor predeterminado de una columna. Añadir o eliminar la clave primaria de la tabla. Añadir o eliminar una clave externa de la tabla. Añadir o eliminar una restricción de unicidad de la tabla. Añadir o eliminar una restricción de comprobación de la tabla.

1

nombre-decolumna

1 CASCADE RE5TRICT

--===ri

definición-de-clave-primaria ~ definición-de-clave-externa restricción-de-unicidad restricción-de-comprobación

DROP CONSTRAINT

nombre.cfe- [CASCADE columna RESTRICT

f

Figura 13.4. Diagrama sintáctico de la instrucción

ALTER TABLE.

tringe cada instrucción ALTER TABLE a una única modificación de la tabla. Añadir una columna y definir una nueva clave externa, por ejemplo, exige dos instrucciones ALTER TABLE diferentes. Varias marcas de SGBD relajan esta restricción y permiten varias cláusulas de acci6n en cada instrucción ALTER TABLE.

Adición de columnas
El empleo más frecuente de la instrucción ALTER TABLE es la adición de una columna a una tabla ya existente. La cláusula de definición de columnas de la instrucción ALTER TABLE es exactamente igual que la de la instrucción CREATE TABLE, y funciona de la misma manera. La nueva columna se añade al final de las definiciones de columnas de la tabla, y aparece como la columna del extremo derecho de las posteriores consultas. El SGBD suele dar por supuesto un valor NULL para las columnas recién añadidas en todas las filas ya existentes de la tabl~. Si la columna se declara NOT NULL con un valor predetenninado, el SGBD da por supuesto, en su lugar, el valor predeterminado. Obsérvese que no se puede declarar simplemente la nueva columna como NOT NULL, ya que el SGBD dará por supuestos valores NULL para la columna en las filas ya existentes, lo que violaría la restricción de manera inmediata. (Cuando se añade una columna nueva el SGBD, no recorre realmente todas las filas de la tabla ya existentes añadiendo el valor NULL o el valor predeterminado. En vez de eso, detecta el hecho de que una fila ya existente es demasiado corta para la nueva definici6n de la tabla cuando se recupera la fila, y la amplía con el valor NULL o con el valor predeterminado antes de mostrarla o pasarla al programa del usuario.) He aquí algunas instrucciones ALTER TABLE de ejemplo que añaden columnas nuevas a las tablas:

Las cláusulas de la Figura 13.4 se especifican en el estándar SQL. Muchas marcas de SGBD. no admiten algunas de estas cláusulas u ofrecen cláusulas exclusivas de cada SGBD. que alteran otras características de la tabla. El estándar SQL2 res-

372

SOL. Manual de referencia

~

Capítulo 13: Creación de bases de datos

373

Añadir un nombre y un número de teléfollo de contacto a la tabla CLIENTES.
ALTER ADD ALTER ADD TABLE CLIENTES NOMBRE_CONTACTO VARCHAR{30¡ TABLE CLIENTES TELEFONO_CONTACTO CHAR(lOJ
PRODUCTOS.

Añadir una columna de nivel de inventario mínimo a la tabla
ALTER TABLE PRODUCTOS ADD CANTIDAD_MINlMA INTEGER NOT NULL WITH DEFAULT

que sea la clave primaria de alguna relación, las columnas de la clave externa que hagan referencia a la columna eliminada dejan de ser válidas. Un problema parecido puede surgir si se elimina una columna a la que se hace referencia en una res~ (ficción de comprobación: la columna que ofrece el valor de los datos para la comprobación de la restricción ha desaparecido. Se crea un problema parecido en las vistas que se definen con base en la columna eliminada. El estándar SQL2 trala estos problemas del mismo modo que trala los pro-

o

En el primer ejemplo, las columnas nuevas tienen el valor NULL para los clientes ya existentes. En el segundo ejemplo, la columna CANTIDAD_MINIMA tendrá el valor cero (O) para los productos ya existentes, lo que resulta adecuado. Cuando la instrucción ALTER TABLE apareció por primera vez en las implementaciones de SQL, las únicas estructuras importantes dentro de las tablas eran las definiciones de las columnas, y quedaba muy claro lo que significaba la cláu. sula ADD. Desde entonces, las tablas han crecido para incluir definiciones de cia. ves primarias y externas y restricciones, y las cláusulas ADD para estos tipos de objetos especifican el tipo de objeto que se está añadiendo. Por consistencia; con estas otras cláusulas ADD/DROP, el estándar SQL2 incluye la palabra clave opcio. nal COLUMN tras la palabra clave ADD. Con este añadido, el ejemplo anterior se convierte en:
Aiiadir una colulJlna de nivel de inventario mínimo a la tabla
PRODUCTS.

blemas potenciales de integridad de los datos planteados por las instrucciones y UPDATE: con una regla de eliminación (llamada realmente comportamiento de eliminación en el estándar) que opera igual que las reglas de eliminación y de actualizaci6n. Se puede especificar una de estas dos reglas de eliminación:
DELETE
• RESTRICT.

Si algún otro objeto de la base de datos (clave externa, restricci6n, etc.) depende de la columna que se va a eliminar, la instrucción ALTER TABLE falla con un mensaje de error y la columna no se elimina. CASCADE. Cualquier otro objeto de la base de datos (clave externa, restricci6n, etc.) que dependa de la columna se elimina también como efecto de cascada de la instrucción ALTER TABLE.

El efecto CASCADE puede generar modificaciones de la base de datos muy espectaculares; por tanto, se debe utilizar con precaución. Suele ser mejor idea utilizar el modo RESTRICT (eliminar de manera explícita las claves externas y las restricciones dependientes, empleando las instrucciones ALTER o DROP correspondientes) antes de eliminar la columna.
Modificación de las claves primarias y externas

ALTER TABLE PRODUCTOS ADD COLUMN CANTIDAD_HINlMA INTEGER NOT NULL WITH DEFAULT O

Eliminación de columnas

La instrucción ALTER TABLE puede utilizarse para eliminar una o varias columnas de una tabla ya existente cuando ya no se necesitan. A continuación se ofrece un ejemplo que elimina la columna FECHA_CONTRATO de la tabla REPRESENTANTES:

Eliminar una columna de la tabla
ALTER TABLE REPRESENTANTES DROP FECHA_CONTRATO

REPRESENTANTES.

El estándar de SQL2 obliga a formular otra instrucción ALTER TABLE diferente si se desean eliminar varias columnas, pero varias de las principales marcas de SGBD permiten eliminar varias columnas con una sola instrucción. Obsérvese que la eliminación de columnas plantea el mismo tipo de problemas de integridad d~ los datos que se describieron en el Capítulo 11 para las operacio. nes de actualización de las bases de datos. Por ejemplo, si se elimina una columna

El otro empleo común de la instrucción ALTER TABLE es modificar o añadir definiciones de claves primarias o externas a las tablas. Dado que el soporte de las claves primarias y externas se proporciona en las nuevas versiones de varios sistemas de bases de daros basados en SQL, esta modalidad de la instrucción ALTER TABLE resulta especialmente útiL Puede utilizarse para informar al SGBD sobre las rela· ciones entre tablas que ya existen en la base de datos, pero que no se han especificado de manera explícita anteriormente. A diferencia de las definiciones de las columnas, las definiciones de claves primarias y externas pueden añadirse y eliminarse de las tablas con la instrucci6n ALTER TABLE. Las cláusulas que añaden las definiciones de las claves primarias y externas son exactamente las mismas que las de la instrucci6n CREATE TABLE, y funcionan de la misma manera. Las cláusulas que eliminan las claves primarias o externas son directas, como puede verse en los ejemplos siguientes. Obsérvese que s610 se puede eliminar una clave externa si se asignó originalmente un nombre a la relaci6n que crea. Si la relaci6n carecía de nombre, no hay manera de especificarla en la instrucci6n ALTER TABLE. En ese caso, no se puede eliminar la clave externa a menos que se elimine y se vuelva a crear la tabla, mediante el procedimiento descrito para eliminar columnas.

374

SOL. Manual de referencia

Capítulo 13: Creación de bases de datos

375

A continuación se ofrece un ejemplo que añade una definición de clave externa

Asertos
Los asertos son restricciones de la base de datos que limitan el contenido de la base de datos en su conjunto. Al igual que las restricciones de comprobación, los asertos se especifican como condiciones de búsqueda. Pero, a diferencia de las restricciones de comprobación, la condición de búsqueda de los asertos pueden limitar el contenido de varias tablas y las relaciones de datos entre ellas. Por ese motivo, los asertos se especifican como parte de la definición global de la base de datos, mediante la instrucción CREATE ASSERTION de SQL2. Supóngase que se desea restringir el contenido de la base de datos de modo que los pedidos totales de cualquier cliente no puedan superar el límite de crédito de ese cliente. Se puede implementar esa restricción con la instrucción:
CREATE ASSERTION LIMITECRED CHECK ((CLIENTES.NUM_CLI ~ PEDIDOS.CLIENTE) AND (SUM (IMPORTE) <~ LIMITE_CREDITO))

a una tabla ya existente:
Hacer de la columna REGION de la tabla OFICINA una clave externa de la tabla REGIONES recién creada, cuya clave primaria es el nombre de la región.
ALTER TABLE OFICINAS
ADD CQNSTRAINT FOREIGN KEY REFERENCES ENREGION (REGlON) REGIONES

A continuación se ofrece un ejemplo de una instrucción ALTER TABLE que modifica una clave primaria. Obsérvese que la clave externa correspondiente a la clave primaria original debe eliminarse debido a que ya no es una clave externa de la tabla modificada:
Modificar la clave primaria de la tabla OFICINAS.
ALTER TABLE REPRESENTANTES

DROP CONSTRAINT TRABAJAEN FOREIGN KEY (OFICINA_REP) REFERENCES OFICINAS ALTER TABLE OFICINAS DROP PRIMARY KEY

Con el aserto denominado LIMITECRED como parte de la definición de la base de datos, se exige que el SGBD compruebe que el aserto sigue siendo cierto cada vez que una instrucción de SQL intente modificar las tablas CLIENTES o PEDIDOS. Si, posteriormente, se determina que ya no se necesita el aserto, se puede eliminar empleando la instrucción DROP ASSERTION:
DROP ASSERTION LIMITECRED

(CIUDAD)

Definición de restricciones
Las tablas de las bases de datos definen su estructura básica, y en los primitivos productos comerciales de SQL, las definiciones de las tablas eran la única especificación de la estructura de las bases de datos. Con el advenimiento del soporte de las claves primarias y externas en DB2 y en el estándar SQL2, la definición de la estructura de las bases de datos se amplió para incluir las relaciones entre las tablas de cada base de datos. Más recientemente, mediante el estándar SQL2 y la evolución de los productos comerciales, la definición de la estructura de la base de datos se ha ampliado para incluir una nueva área: las restricciones de las bases de datos que limitan los datos que pueden introducirse en la base de datos. Los tipos de restricciones y el papel que desempeñan en el mantenimiento de la integridad de la base de datos se describen en el Capítulo lI. Hay cuatro tipos de restricciones de las bases de datos (restricciones de unicidad, restricciones de claves primarias y externas, y restricciones de comprobación) estrechamente asociadas con una sola tabla de la base de datos. Se especifican como parte de la instrucción CREATE TABLE y pueden modificarse o eliminarse mediante la instrucción ALTER TABLE. Los otros dos tipos de restricciones de la integridad de la base de datos, asertos y dominios, se crean como objetos independientes dentro de cada base de datos, independientemente de cualquier definición de una tabla concreta.

En SQL2 no hay ninguna instrucción ALTER ASSERTION. Para modificar la definición de un aserto hay que descartar la definición antigua y especificar una nueva con otra instrucción CREATE ASSERTION.

Dominios
El estándar SQL2 implementa el concepto formal de dominio como parte de la definición de las bases de datos. Como se describe en el Capítulo 11, un dominio es una colección con nombre de valores de datos que actúa de hecho como otro tipo de datos, para su empleo en las definiciones de las bases de datos. Los dominios se crean con las instrucciones CREATE DOMAIN. Una vez creados, se puede hacer referencia a los dominios en las definiciones de columnas corno si fueran un tipo de datos. A continuación se puede ver el empleo de una instrucción CREATE DOMAIN para la definición de un dominio denominado IDS_EMPL_VALIDOS, que consiste en los números de identificación de empleado válidos de la base de datos de ejemplo. Estos números son enteros de tres cifras del rango 101 a 999, ambos incluidos:
CREATE DOMAIN IDS_EMPL_VALIDOS INTEGER CHECK {VALUE BETWEEN 101 AND 199}

L

~

376

SOL. Manual de referencia

Capítulo 13: Creación de bases de datos

377

Si se deja de necesitar un dominio, se puede eliminar empleando una de las modalidades de la instrucción DROP DOMAIN de SQL2:
OROP DOMAIN IDS_EMPL_VALIDOS CASCADE

Base de datos Tablas de Jorge
;'-

OROP DQMAIN IDS_EMPL_VALID RESTRICT

- -- "
\ I 11

Tablas de Samuel
/-

I

\

;'----------------- ' I ( PRODUCTOS
I I OFICINAS I I FFFf=Ff=I I I l' 1 REPRESENTANTES I 1 PEDIDOS CLIENTES

Tablas del ABD

Las reglas de eliminación CASCADE y RESTRICT operan igual que para la eliminación de columnas. Si se especifica CASCADE, cualquier columna definida en términos del dominio eliminado se elimina a su vez de manera automática. Si se especifica RESTRICT, el intento de eliminación del dominio fallará si se basa en él alguna definición de columna. Antes hay que eliminar o modificar las definiciones de las columnas de modo que ya no dependan del dominio antes de eliminarlo. Esto proporciona un margen de seguridad adicional contra la eliminación accidental de columnas (y, sobre todo, de los datos que contienen).

:EEEI " ITJJ .J
1
11

LLLL.L...LJ

n

:D]
1 \

rn!![]JJ
I \

"

:¡ []TI] WillU []JI: " ~11

FFffR11

1 I I I I I

'1
/

-

... _---------------_ ....

'

I

Alias y sinónimos

(CREATE/DROP ALIAS)

Figura 13,5.

Organización típica de una base de datos de producción.

Las bases de datos de producción suelen organizarse como la copia de la base de datos de ejemplo que aparece en la Figura 13.5, con todas las tablas principales reunidas y de propiedad del administrador de la base de datos. El administrador de la base de datos concede permiso a otros usuarios para que tengan acceso a las tablas, empleando el esquema de seguridad de SQL que se describe en el Capítulo 15. Recuérdese, no obstante, que hay que utilizar nombres de tabla calificados para hacer referencia a las tablas de otros usuarios. En la práctica, esto significa que lodo consulta de las tablas principales de la Figura 13.5 debe utilizar nombres de tabla calificados, lo que hace que consultas como la siguiente sean largas y tediosas de escribir:

Crear sinónimos para dos tablas propiedad de otro usuario.
CREATE ALIAS REPRESENTANTES FOR OP_ADMIN.REPRESENTANTES CREATE ALIAS OFICINAS FOR OP_ADMIN.OFICINAS

Una vez definido un sinónimo o alias, se puede utilizar como si fuera un nombre de tabla en las consultas de SQL. La consulta anterior, por tanto, se transforma en:
SELECT NOMBRE, REPRESENTANTES.VENTAS, FROM REPRESENTANTES, OFICINAS OFICINA. OFICINAS.VENTAS

Hacer U1lQ lista del nombre, ventas, oficina y ventas de la oficina de todos los empleados.
SELECT NOMBRE, OP_ADMIN.REPRESENTANTES.VENTAS, OFICINA, OP_ADMIN.OFICINAS.VENTAS FROM OP_ADMIN.REPRESENTANTES, OP_ADMIN.OFICINAS

Para abordar este problema, muchos productos de SOBD de SQL ofrecen la posibilidad de utilizar un alias o sinónimo. Un sinónimo es un nombre que se define para sustituir el nombre de una tabla. En DB2 los alias se crean utilizando la instrucción CREATE ALIAS. (Las versiones más antiguas de DB2 utilizaban en realidad la instrucción CREATE SYNONYM, y Gracle sigue utilizando esta modalidad de la instrucción, pero tiene el mismo efecto que la instrucción CREATE ALIAS.) Si se fuera el usuario. denominado Jorge, por ejemplo, de la Figura 13.5, se podría utilizar este par de instrucciones CREATE ALIAS:

El empleo de alias no modifica el significado de la consulta, y hay que seguir teniendo permiso para tener acceso a las tablas de otros usuarios. Sin embargo, los sinónimos simplifican las instrucciones de SQL que se utilizan y hacen que parezca que las tablas son propias. Si, más adelante, se decide que ya no se desea utilizar los sinónimos, pueden eliminarse con la instrucción DROP ALIAS:

Eliminar los sinónimos creados a11leriormente.
DROP ALIAS REPRESENTANTES DROP ALIAS OFICINAS

l

378

SOL. Manual de referencia
O

Capítulo 13: Creación de bases de datos

379

DB2, Oracle e Inforrnix admiten los sinónimos dos en el estándar ANSI/ISO para SQL.

alias. No vienen especifica-

índices

(CREATE/DROP INDEX)

Una de las estructuras de almacenamiento físico que proporciona la mayor parte de los sistemas de gestión de bases de datos basados en SQL son los índices, que son una estructura que ofrece un acceso rápido a las filas de las tablas con base en el v~lo~ de una o varias columnas. La Figura J 3.6 muestra la tabla PRODUCTOS y dos mdlces que se han creado para ella. Uno de Jos índices ofrece acceso cón base en la clave primaria de la tabla, que es una combinación de las columnas ID_FAB e
ID_PRODUCTO.

El SOBD utiliza el índice igual que se podría utilizar el índice de un libro. El índice almacena valores de los datos, y punteros hacia las filas en las que se hallan esos valores. En el índice, los valores de los datos se disponen en orden ascendente o descendente, de modo que el SOBD pueda examinarlo rápidamente al buscar un valor concreto. Luego puede seguir el puntero para localizar la fila que contiene ese valor. La presencia o ausencia de índices es completamente transparente para el usuario de SQL que tiene acceso a la tabla. Por ejemplo, considérese esta instrucción
SELECT:

Buscar la cantidad y el precio de los cables de la serie cuatro.
SELECT STOCK, PRECIO FROM PRODUCTOS

WHERE DESCRIPTION

~

'Serie 4,

cable'

Tabla PRODUCTOS

ID FAB

ID PRODUCTO

DESCRIPCION

PRECIO

STOCK

r-;:: ¡..

lMM 'Cl 'Cl

779c
41003 41004

r=:

90-kg brazo
Serie 3, cable Serie 4, cable

1.875,OO€

107,OO€ 117,OO€

9 207
139

ÍNDICE

ÍNDICE

I

'Cl 41003 'Cl 41004

90-kg brazo

I
,

,
,
IMM 779C Serie 3. cable Serie 4, cable

I
,

.
Figura
13.6.

Dos

índices para la tabla PRODUCTOS.

La instrucción no dice si hay un índice de la columna DESCRIPCION, y el SGBD ejecuta la consulta en cualquier caso. Si no hubiera índice de la columna DESCRIPCION, el SOBD se vería obligado a procesar la consulta explorando secuencialmente la tabla PRODUCTOS, fila por fila, examinando la columna DESCRIPCION de cada fila. Para asegurarse de que había encontrado todas las filas que satisfacen la condición de búsqueda, tendría que examinar todas las fijas de la tabla. En tablas de gran tamaño, con millares o millones de filas, el examen de la tabla puede tardar minutos u horas. Con el índice de la columna DESCRIPCION, el SOBD puede hallar los datos solicitados con mucho menos esfuerzo. Examina el índice para hallar el valor solicitado (<<Serie 4, cable») y luego sigue el puntero para encontrar las filas de la tabla solicitadas. La búsqueda en el índice es muy rápida porque el índice está ordenado y sus filas son muy pequeñas. El paso del índice a las filas de la tabla es también muy rápido porque el índice indica al SOBD la ubicación de las filas en el disco. Como muestra este ejemplo, la ventaja de tener un índice radica en que acelera enormemente la ejecución de las instrucciones de SQL, con condiciones de búsqueda que hacen referencia a las columnas indexadas. Un inconveniente de tener un índice es que consume espacio de disco adicional. Otro inconveniente es que hay que actualizar el índice cada vez que se añade una fila a la tabla y cada vez que se actualiza la columna indexada de una fila ya existente. Esto supone una sobrecarga adicional a las instrucciones INSERT y UPDATE de la tabla. En general, resulta una buena idea crear un índice de las columnas que se utilizan con frecuencia en las condiciones de búsqueda. La indexación resulta también más adecuada cuando las consultas a la tabla son más frecuentes que las inserciones y las actualizaciones. La mayor parte de los productos de SGBD establecen siempre un índice de la clave principal de cada tabla, ya que suponen que el acceso a la tabla se realizará con mayor frecuencia mediante la clave primaria. La mayor parte de los productos de SOBD establecen también de manera automática un índice de cada columna (o combinación de columnas) definida con una restricción de unicidad. El SGBD debe comprobar el valor de esas columnas en cada nueva fila que se inserte, o en cualquier actualización de una fila existente,

7. Pero la asignación de los valores a los cajones no conserva el orden de los valores de los datos. como la búsqueda exigida por el operador de comparación de desigualdad o una operación de comprobación de rango (SETWEEN). .7. el SOBD puede hallar ese valor con sólo ubicar el cajón correspondiente y buscar en él. conjuntamente. Diagrama sintáctico básico de la instrucción CREATE INDEX.-de-co/vmna ~ ) •• ~ Figura 13. PRODUCTO) En la mayor parte de los productos de SGBD la cláusula CREATE INDEX incluye cláusulas adicionales específicas del SGBD que detallan la ubicación de disco del índice y parámetros de ajuste del rendimiento. Y que exige que las combinaciones de columnas tengan un valor único. el empleo de índices resulta fundamental para conseguir un rendimiento adecuado en cualquier base de daws de clase empresarial de cieno tamaño. Sybase y DB2) admiten los índices mediante alguna modalidad de la instrucción CREATE INDEX. el tipo de índice que hay que crear. • La columna CLIENTE de la tabla PEDIDOS debe indexarse de manera parecida si Jos pedidos se recuperan a menudo de acuerdo con el cliente que los formuló. Su única opción es la palabra clave UNIQUE. • Las columnas FAB y PRODUCTO. Estas opciones hacen de la instrucción CREATE INDEX bastante dependiente del SOBD en su uso real. • La columna REP de la tabla PEDIDOS debe indexarse si los pedidos se recuperan con frecuencia según el representante que los tramitó. lnformix. la mayor parte de las marcas populares de SGBD (incluidas Gracle. el SOBD puede usar sencillamente el índice para hallar la fila (si es que existe) con el valor en cuestión. que puede verse en la Figura 13. el SGBD tendría que examinar de manera secuencial cada fila de la tabla para comprobar la restricción. Microsoft SQL Server. Sin un índice de esas columnas. si hay diez millones de valores posibles de los datos. • La columna NOMBRE de la tabla REPRESENTANTES debe indexarse si los datos de los representantes se recuperan a menudo por el nombre del representante. CREATE UNIQUE INDEX IND_PROD_PED ON PEDIDOS (FAS. etc. Por ejemplo. de la tabla PEDIDOS deben indexarse si los pedidos se recuperan con frecuencia según el producto encargado. Como cada valor dado de los datos se ubica siempre en el mismo cajón. f-. El estándar SQL2 no menciona los índices ni la manera de crearlos. Un tipo de índice diferente. Manual de referencia Capítulo 13: Creación de bases de datos 381 para cerciorarse de que su valor no duplica un valor ya contenido en la tabla. No obstante. que se utiliza para especificar que la combinación de columnas que se está indexando debe contener un valor único para cada fila de la tabla.~ 380 SOL.-de-tab/a I T nomb. Con un índice. Trata los índices de las bases de datos como un detalle de implementación. lo que supone una operación mucho más rápida que una búsqueda secuencial. Algunos productos de SOBD incluyen dos o más tipos diferentes de índices. La instrucción también especifica las columnas que hay que indexar y si deben indexarse en orden ascendente o descendente.. un índice con quinientos cajones asociativos puede resultar adecuado.. La versión de DB2 de la instrucción CREATE INDEX. que están optimizados para tipos diferentes de acceso a la base de datos. A continuación se ofrece un ejemplo de una instrucción CREATE INDEX que crea un índice de la tabla PEDIDOS con base en las columnas FAB y PRODUCTO.-indice ON nomb. que puede verse en la Figura 13. si debe estar agrupado (una disposición que ubica las filas de datos físicas en el medio del disco en el mismo orden que el índice). los índices en árboles B utilizan una estructura de árbol de entradas de índice y de bloques de índice (grupos de entradas de índice) para organizar los valores de los datos que contiene en orden ascendente o descendente. En la práctica. utilizan una técnica aleatoria para ubicar todos los valores posibles de los datos en un número moderado de cajones dentro del índice.. Con quinientos cajones el número de elementos que hay que buscar se reduce. Los parámetros de rendimiento habituales incluyen el tamaño de las páginas del índice. Por ejemplo.CREATE L UNIQUE =-r INDEX nomb.7. Este tipo de índice ofrece una búsqueda eficiente de un solo valor o de un rango de valores. los índices asociativos. el porcentaje de espacio libre que debe dejar el índice para las filas nuevas. En la base de datos de ejemplo estas columnas son buenas candidatas para índices adicionales: • La columna EMPRESA de la tabla CLIENTES debería indexarse si se recuperan con frecuencia los daLOs de los clientes por el nombre de la empresa. que es ajeno al lenguaje SQL básico y estandarizado. es la más directa. Esto hace que los índices asociativos sean muy rápidos al buscar la coincidencia exacta con un valor de los datos. i Crear un índice de la tabla PEDIDOS. en promedio por un factor de quinientos. La instrucción asigna un nombre al índice y especifica la tabla para la que se ha creado.

una variación de los índices de árboles B. El estándar SQL2 adopta este mismo acuerdo para ocuparse de la creación. Los índices de mapa de bits resultan útiles cuando hay un número de valores de datos posibles relativamente pequeño. CREATE/DROP/ALTER TABLESPACE Espacio de tablas (área de almacenamiento para datos de DB2) CREATE/DROP TRIGGER Disparador de la base de datos Molde para la conversión de tipos de datos Base de datos de Informix con nombre Tipo de datos diferente deflOido por el usuario Función definida por el usuario Tipo de datos opaco definido por el usuario Método de acceso al almacenamiento de disco definido por el usuario Procedimiento almacenado de Informix definido por el usuario Incluidas en Infonnix CREATE/DROP CAST CREATE/DROP DATABASE CREATE/DROP DISTINCT TYPE CREATE/DROP FUNCTION CREATE/DROP OPAQUE TYPE CREATE/DROP OPCLASS CREATE/DROP PROCEDURE (comilllÍa) . destruyen y modifican Otros objetos de la base de datos exclusivos de esa marca concreta de SGBD. b) la siguiente palabra de la instrucción es el tipo de objeto que se está gestionando. está optimizada para las bases de datos residentes en memoria. indica al usuario el lugar del manual de referencia en que debe buscar la descripción de la nueva posibilidad. DROP y ALTER en su LDD ampliado. Más allá de las tres primeras palabras las instrucciones se vuelven muy dependientes de cada SGBD y no siguen ningún estándar. sus asertos. Pese a todo. en DB2 CREATE/DROP ALIAS Gestión de otros objetos de la base de datos Los verbos CREATE. Cuando un SGBD incluye varios tipos de índices.1 muestra el modo en que algunos de los productos más populares de SQL utilizan los verbos CREATE. Esta instrucción elimina el índice creado en el ejemplo anterior: Incluidas en casi todas las marcas de SGBD CREATE/DROP/ALTER TABLE CREATE/DROP/ALTER VIEW CREATE/DROP/ALTER INDEX Tabla Vista Índice Alias para una tabla o visla Eliminar el índice creado anteriormente. sus índices y otras estructuras.382 SOL Manual de referencia Capítulo 13: Creación de bases de datos 383 por lo que no se pueden utilizar los índices asociativos para búsquedas de desigualdades ni de rangos. El acuerdo general de las marcas de SGBD es: a) el empleo de los verbos CREATElDROP/ALTER. lo más probable es que utilice las instrucciones CREATE BLOB. Por ejemplo. La Tabla 13. esta parte común da una sensación uniforme a los diferentes dialectos de SQL. sino que también define su tipo. Otros tipos de índices resultan adecuados para otras situaciones específicas de los SOBD. destrucción y modificación de todos los objelos de las bases de dalos de SQL2. y e) la tercera palabra es el nombre del objeto. otros productos de SGBD añadieron esa posibilidad. fue el primero en emplear disparadores y procedimientos almacenados. Incluida:. la instrucción DROP INDEX elimina el índice de la base de dmos. DROP BL08 Y ALTER 8L08. Sybase añadió las instrucciones CREATE TRIGGER y CREATE PROCEDURE a su dialecto de SQL para definir estas nuevas estructuras de la base de datos. junto con sus tablas. La mayor parte de los productos de SGBD populares basados en SQL utilizan también estos verbos para formar instrucciones LDD adicionales que crean. que debe obede~ cer a los acuerdos de denominaciones de SQL. la instrucción CREATE INDEX no s6lo define y crea el índice. DROP y ALTER forman la piedra angular del lenguaje de definición de datos de SQL. CREATE/DROP/ALTER BUFFERPOOL Conjunto de búferes de E/S utilizados por DB2 Tipo de datos distinto definido por el usuario CREATE/DROP DISTINCT TYPE CREATE/DROP FUNCTION CREATE/DROP/ALTER NODEGROUP DROP PACKAGE CREATE/DROP PROCEDURE CREATE/DROP SCHEMA Función definida por el usuario Grupo de particiones o nodos de la base de datos Módulo de acceso a programas de DB2 Procedimiento almacenado de DB2 definido por el usuario Esquema de la base de datos El SGBD de Sybase. Si se encuentra un nuevo SGBD basado ~n SQL y se sabe que alberga un objeto conocido como BLOB. conocida como índices de árboles T.1. índices y vistas (que se describen en el Capítulo 14). por ejemplo. que se tratan como objetos dentro de las bases de datos de SQL. Tabla 13. junto con sus propias variedades de las instrucciones CREATE TRIGGER y CREATE PROCEDURE. Cuando estas caracteríslicas se popularizaron. Instrucciones LDD de los productos basados en SOL más populares Instrucciones LDD de SQL Objeto gestionado Si se crea un índice para una tabla y más adelante se decide que no es necesario. y las instrucciones DROP correspondientes para eliminarlas cuando ya no se necesiten. Las instrucciones basadas en estos verbos se utilizan en todas las implementaciones de SQL para manipular tablas. Por lo menos.

1. Instrucciones LDD de los productos basados en SOL más populares (Continuación) Instrucciones LDD de SQL CREATE/DROP ROLE CREATE/OROP ROUTINE CREATE/DROP ROW TYPE CREATE SCHEMA CREATE/DROP SYNONYM CREATE/DROP TRIGGER Objeto gestionado Papel del usuario en la base de datos Procedimiento almacenado de lnforrnix definido por el usuario Instrucciones LDD de SQL CREATE SCHEMA Objeto gestionado Esquema de la base de datos CREATE/DROP/ ALTER SÉQUENSE Secuencia de valores definida por el usuario Tabla de resultados de consultas sólo para lectura Sinónimo (alias) para una tabla o una vista CREATE/DROP/ALTER SNAPSHOT CREATE/DROP SYNONYM CREATE/DROP/ALTER TABLESPACE Tipo de fila con nombre (~xtensión de objeto) Esquema de la base de datos Sinónimo (alias) para una tabla o vista Disparador de la base de dalOS Espacio de tablas (área de almacenamiento para datos de Oracle) Disparador de la base de datos Tipo de datos abstfaClO definido por el usuario Métodos para un tipo de datoS abstracto ID de usuario de aracle Incluidas en Microsoft SQL Server CREATE/ OROP / ALTER DATABASE CREATE!DROP DEFAULT CREATE/DROP/ALTER PROCEDURE CREATE/OROP RULE CREATE SCHEMA CREATE/DROP/ALTER TRIGGER CREATE/ OROP / ALTER TRIGGER Base de datos Valor predeterminado de la columna Procedimiento almacenado de SQL Server Regla de integridad de la columna Esquema de la base de datos Disparador almacenado CREATE/DROP TYPE CREATE/DROP TYPE BODY CREATE/DROP/ALTER USER Incluidas en Sybase CREATE/OROP!ALTER DATABASE CREATE/DROP DEFAULT Base de datos Valor predeterminado de la columna Copia local de una tabla remota ya existente Procedimiento almacenado de Sybase Papel del usuario en la base de datos Regla de integridad de la columna Esquema de la base de datos Disparador almacenado Incluidas en Oracle CREATE/DROP CLUSTER CREATE DATABASE CREATE/DROP DATABASE LINK CREATE/DROP DIRECTORY CREATE/DROP/ALTER FUNCTION CREATE/DROP LIBRARY CREATE/DROP/ALTER PACKAGE CREATE/DROP/ALTER PROCEDURE Agrupación de tablas para ajuste del rendimiento Base de datos de aracle con nombre Enlace de red para acceso remoto a las tablas Directorios del sistema operativo para almacenamiento de objetos de gran tamaño Función definida por el usuario Funciones externas que pueden llamarse desde PUSQL Grupo de procedimientos de PUSQL que pueden compartirse Procedimiento almacenado de aracIe definido por el usuario Límites del uso de recursos por la base de datos Papel del usuario en la base de datos Área de almacenamiento para la recuperación de la base de datos CREATE EXISTING TABLE CREATE/DROP PROCEDURE CREATE/DROP/ALTER ROLE CREATE/DROP RULE CREATE SCHEMA CREATE/DROP TRIGGER Especificadas por el estándar ANSI/ISO de SQL CREATE/DROP ASSERTION Restricción de comprobación para todo el esquema Conjunto de caracteres ampliado Secuencia de ordenamiento del conjunto de caracteres Especificación de los valores válidos de los datos Esquema de la base de datos Conversión entre conjuntos de caracteres CREATE/DROP CHARACTER SET CREATE/DROP COLLATION CREATE/DROP/ALTER PROFILE CREATE!OROP/ALTER ROLE CREATE/DROP/ALTER ROLLBACK SEGMENT CREATE/DROP/ALTER DOMAIN CREATE/DROP SCHEMA CREATE/DROP TRANSLATION (continúa) .1./ 384 Capítulo 13: Creación de bases de datos SOL. Manual de referencia 385 Tabla 13. Instrucciones LDD de los productos basados en SOL más populares (Continuación) Tabla 13.

suelen exigir un administrador de la base de datos a tiempo completo. cada una de ellas identificada por un nombre. por ejemplo. Cada usuario de la base de datos tiene un conjunLO de tablas. sí que afectan al modo en que se organizan los datos.8. . Para ilustrar el modo en que las diferentes marcas de SGBD afrontan estos problemas.. Otras marcas de SOBO admiten varias bases de datos en cada computadora. . etc.. que puede verse en la Figura 13. por ejemplo.8. de la contabilidad y de las nóminas se almacenan en tablas de la base de datos. Con los permisos adecuados los usuarios pueden ejecutar consultas que combinen datos de las diferentes aplicaciones.. 1 I I I : 1 : I I ==-=_ . análisis del rendimiento.== . Prácticamente todos los principales productos de SGBD incluyen este esquema...386 SOL.-. :: I I I I I I I I I I J mFICHAJES! I omPEDIDOS ¡ I I I : rnmBOLETIN I I mi ¡ J I PRODUCTOS 1 I I : LlJTISALARIOS: . hay una amplia variabilidad en el modo en que organizan y estructuran las diferentes bases de datos dentro de cada sistema informático.. que son propiedad de ese usuario. incluso. Figura 13. Arquitectura de base de datos única. Los problemas de la gestión de una base de datos de ese tamaño -realización de copias de seguridad. y las aplicaciones pueden utilizar esa relación para calcular las comisiones.. I OFICINAS Tablas de José Tablas de Jorge Tablas de María . por ejemplo.9. Organización de las bases de datos en SOLl. . Otras marcas de SGBD. I Figura 13. o en uso en computadoras personales) no admiten el concepto de propiedad de las tablas. Una ventaja de esta arquitectura es que las tablas de las diferentes aplicaciones pueden hacer referencia con facilidad unas a otras. Las tablas principales de cada aplicaci6n se reúnen y son propiedad de un solo usuario.---------. admiten varias bases de datos en el contexto del sistema de direcrorios de la computadora. o si se reparten en dos bases de datos. . recuperación de datos. si hay va~ias bases de datos. OFICINAS Tablas de Samuel Base de datos única del sistema \ EEEEEE1 PEDIDOS [I]]. I I : I~I I I ¡::::¡::¡::¡::: 1 : []]CUENrASI I . que probablemente sea la persona encargada de esa aplicación en esa computadora.- I 1 I I I AMIGOS I 1 I I I MASCOTAS I I 1 / ITIJ \ CIIIJ I I 1 I I I 1• • 11 I I 1 I I I I I 1 I \ -------------. f I MASCOTAS I I I I I I I \ ELE! PERSONAS . hay que indicar al SGBD la que se desea utilizar..9 muestra la arquitectura de base de datos única en la que el SOBD alberga una base de datos para todo el sistema...--------_ . si se mezclan en una sola base de datos el procesamiento de pedidos y los datos de contabilidad. Algunas marcas dan por supuesta una única base de datos que abarca todo el sistema y almacena todos los datos de ese sistema.. supóngase que se amplía la base de datos de ejemplo para albergar una aplicación de nómina y una aplicaci6n de contabilidad. Manual de referencia Capítufo 13: Creación de bases de datos 387 Estructura de la base de datos El estándar SQL I especificaba una estructura sencilla para el contenido de la base de datos."- ---. Un inconveniente de esta arquitectura es que la base de datos se hace enorme con el transcurso del tiempo.. En esos sistemas todas las tablas de la base de datos son parte de un gran conjunto.. Aunque marcas diferenLes de sistemas de gestión basados en SQL ofrecen la misma estructura dentro de cada base de datos.---------.. Base de datos Tablas de José . aunque algunos (especialmente los centrados en aplicaciones de finalidad especial o incrustadas.. Las bases de datos de los grandes sistemas informáticos y de las minicomputadoras (como la versión para grandes sis~ temas de DB2 y Gracle) han tendido hist6ricamente a utilizar este enfoque.---------. . Son frecuentes las bases de datos de DB2 o de Oracle con varios centenares de tablas. También afectan al modo en que se obtiene acceso inicialmente a la base de datos. . puede contener una clave externa que haga referencia a la tabla OFICINAS. La tabla FICHAJES de la aplicaci6n de nóminas. Los datos del procesamiento de pedidos. Arquitectura de base de datos única La Figura 13. ITl -. ya que cada vez se le añaden más aplicaciones. Sin embargo.. además de las tareas de procesamiento de pedidos que ahora alberga. Estas variaciones no afectan al modo en que se utiliza SQL para tener acceso a los datos de cada base de datos. _------------- m CUMPLE1illOS m PRODUCTOS I I 1 I I I I 1 1 1 I / . \ I I I I Tablas de María /- .

sino también la base de datos que contiene a esa tabla. I I ""1 1 I I 1 1 \ . lngres y otros muchos utilizan este esquema. todos los datos de producción se hallan reunidos en una sola base de datos. con menores preocupaciones respecto de la coordinación global. probablemente se crea una nueva base de dalOs. Cuando llega el momento de agregar una aplicación nueva. puede que impongan una sobrecarga importante o exijan la adquisición al fabricante del SGBD de software distribuido adicional del SGBD.. . debe ampliar los Convenios de denominación de tablas y columnas de SQL. Cada persona responsable de una aplicación puede ser ahora el administrador de su propia base de datos.. Arquitectura de múltiples bases de datos... Generalmente. . cada una de las bases de datos de esta arquitectura suele estar dedicada a una aplicación concreta.. por lo que en un sentido muy real.. (CUENTAS ".. la base de datos suele estar asociada con una sola copia en ejecución del software del SOBD.. 1 :11 1 1 1 1 1 I I BOLETíN I 1 1 I • •• 1 I I \ . . Los nombres calificados de tabla no sólo deben especificar al propietario de la tabla. Cuando se añade una aplicación nueva.... más manejables. Jos usuarios se conectan con el SGBD.. Manual de referencia Capítulo 13: Creación de bases de datos 389 En la arquitectura de base de daros única. Si Un SGBD utiliza una arquitectura de múltiples bases de datos y admite las consultas entre bases de datos. una para trabajo de producción y otra para pruebas. \ Figura 13. \ términos de conexión con Oracle. 1 1 1 1 1 1 I m ITITl .. Es más probable también que los usuarios y los programadores recuerden la estructura global de sus propias bases de datos. ¡'I I 1 LLLLLLJI I PRODUCTO S I I I 1 1 \ [[J]J m PEDIDOS I 1 1 I I [TI] - - . Por ejemplo.-I 1 1 1 1 1 I 1 1 • •• : I []J]SALl\RIOS : : 1 ~ 1 1 .. I .. desconectada de las demás. A menudo el SGBD no admite las consultas que saltan las fronteras de las bases de datos..- 1 1 -. _-----------"" ' Base de datos CONTABILIDAD Tablas de Jorge [J]' m rtm:.. Si se admiten las consultas a varias bases de datos.- mFICHAJES : ~ ----. puede desarrollarse en su propia base de datos. 10 que hace imposible relacionar los datos de dos aplicaciones.- 1 1 1 1 1 I I I I \ . Microsoft SQL Server./ 388 SOL. por lo que no hace falta realizar ninguna elección.. rn 1 I I I 1 1 1 I • •• Arquitectura de múltiples bases de datos La Figura 13. Fundamentalmente. [TI] .. (De hecho. Generalmente. . sin afectar a las bases de datos ya existentes...I . : I 1 1 ".10. más que de conexión con una base de datos concreta. Sybase.... separados Base de datos PEDIDOS Tablas de Maria ------------.. _ . la obtención del acceso es muy sencilla: sólo hay una base de datos. el SGBD amplía la notación con puntos de los nombres de las tablas anteponiendo el nombre de la base de datos al del propietario.. Como puede verse en la figura. la instrucción de SQL para programación que conecta al usuario con una base de datos de Ofucle es CONNECT..10 muestra una arquitectura de múltiples bases de datos en la que cada base de datos tiene asignado un nombre único. y Jos usuarios tienden a hablar en / _ _ _TablasdeJo' _ se I 1 OFICINA: ... ...~. no obstante.. ~--_.... - I /------------. . La principal ventaja de esta arquitectura de múltiples bases de dalOs respecto de la arquitectura de base de datos única es que divide las tareas de gestión de los dalOs en fragmentos de menor tamaño.) Las instalaciones de OfacIe y de DB2 suelen ejecutar dos bases de datos diferentes. El principal inconveniente de la arquitectura de múltiples bases de datos es que cada base de datos puede transformarse en una isla de información. en esta arquitectura.:~---"" Base de datos NOMINAS 1. las tablas de una base de datos no pueden contener referencias en claves externas a tablas de bases de datos diferentes.

390 SOL. cada base de datos tiene un nombre.JORGE.OFICINAS datos de Sybase o de SQL Server. ya que hay que especificar tanto el nombre de la base de datos como su ubicación en la jerarquía de directorios.JOSE. Arquitectura de ubicación múltiple. RdbNMS e lnfonnix) utilizaban este esquema para albergar varias bases de datos. Directorio de nivel superior hace referencia a la tabla OFICINAS propiedad del usuario JOSE de la base de datos de procesamiento de pedidos denominada PEDIDOS.on la base de datos. .JEF = NQMINAS. Resulta especi. Directorio DESARROLLO NQMINAS. en una base esta referencia a una tabla: PEDIDOS. denommado M SYS$ROOT: [DESARROLLO. el SGBD suele ampliar el lenguaje SQL incorporado con una instrucción que conecta al programa con una base de datos concreta. Para Sybase y Microsoft SQL Server. cada aplicación suele estar asignada a su propia base de datos. El programa de SQL interactivo del SOBD suelen mostrar una lista de las bases de datos disponibles o pedir que se introduzca el nombre de la base de datos junto con el nombre de usuario y la contraseña para obtener acceso. Como muestra la Figura 13. La modalidad de lngres para la conexión con la base de datos denominada PEDIDOS es: CONNECT 'PEDIDOS' Figura 13.).OFICINAS. La arquitectura de ubicación múltiple vuelve a hacer más complejo el acceso a las bases de datos. que pueden repartirse por toda la estructura de directorios del sistema. Por ejemplo.JORGE. Con la arquitectura de múltiples bases de datos. el SGBD no suele tener toda la información sobre las bases de datos que se han creado.11 muestra una arquitectura de ubicación múltiple que admite varias bases de datos y utiliza la estructura de directorios del sistema informático para organizarlas. La principal ventaja de la arquitectura de ubicación múltiple es su flexibilidad.NOMBRE FROM PEDIDOS.11. ya que hay que indicar al SGBD la base de datos que se desea utilizar. Al igual que con la arquitectura de múltiples bases de datos.JOSE. y la consulta siguiente vincula la tabla REPRESENTANTES de la base de datos de nóminas con la tabla OFICINAS: SELECT PEDIDOS . Por ejemplo. PRUEBAS]: DECLARE DATABASE FILENAME 'SYS$ROOT: {DESARROLLO. La sintaxis de SQL de VAX para el acceso a las bases de datos de RdbNMS es la instrucción DECLARE DATABASE. la instrucción equivalente es: USE 'PEDIDOS' Arquitectura de ubicación múltiple La Figura 13. esta instrucción DECLARE DATABAS E establece una conexión c. pero es posible que dos bases de datos diferentes en dos directorios distintos tengan el mismo nombre.JOSE.REPRESENTANTES WHERE PEDIDOS. No hay una base de datos maestra que realice un seguimiento de todas las bases de datos.NUM_EMPL Afortunadamente.REPRESENTANTES. denominada PEDIDOS. del directorio de VAXNMS. Varias de las primeras bases de datos para minicomputadoras (entre ellas. Para el acceso mediante programación.JORGE.JOSE . el acceso a las bases de datos se hace algo más complicado. Manual de referencia ~e Capítulo 13: Creación de bases de datos 391 por un punto (.REPRESENTANTES. NOMINAS.PRUEBASl PEDIDOS . estas consultas a varias bases de datos constituyen la excepción y no la norma.OFICINAS. Los inconvenientes de la arquitectura de ubicación múltiple son los mismos que los de la ar quitectura de múltiples bases de datos. y se pueden utilizar generalmente los nombres predeterminados de bases de datos y de usuarios.almente adecuada en aplicaciones como la ingeniería y el diseño. CIUDAD. lo que hace muy difícil la administración centralizada de la base de datos. Además. en las que puede que muchos usuarios sofisticados· del sistema informático deseen utilizar varias bases de datos para estructurar su propia información.11.OFICINAS.

• Catálogos que describen la estructura de la base de datos. En la práctica. En el servidor puede haber varias bases de datos con nombre. En la Figura 13. conceptualmente. que da la casualidad de que tienen el mismo nombre: DECLARE DATABAS E FILENAME DECLARE DATABASE FILENAME PEDIOOSl 'SYSSROOT: (PROOUCCION\]PEDIOOS' PEDIOOS2 'SYS$ROOT: [DESARROLLO. la técnica utilizada con más frecuencia para distinguir entre varias bases de datos son los nombres de tabla supercalificados.392 SOL. el concepto de ubicación de la base de datos incluida en la arquitectura de ubicación múltiple se amplió al concepto de servidor físico de la base de datos. FILENAME 'PEDIDOS' Algunas de las marcas de SGBD que utilizan este esquema permiten tener acceso concurrente a varias bases de datos. puede haber una enorme variedad en el modo en que diferentes marcas de SGBD organizan sus bases de datos y ofrecen acceso a las mismas.12. como puede verse en la Figura 13. La relación entre los nombres de las bases de datos y los archivos físicos o los sistemas de archivos de un servidor la maneja el software del SGBD. sin embargo. el entorno de SQL incluye el código del programa para acceso a la base de datos. parece que la mayoría de los productos de SGBD de hoy en día convergen en una arquitectura de múltiples bases de datos implementada en un servidor (ísico.13 muestra la estructura de alto nivel de la base de datos especificada por el estándar SQL2. El estándar no especifica el modo en que se créan entornos de SQL.. que en la práctica no utilizan la mayor parte de los productos comerciales de SQL. suele ser la primera que se encuentra el usuario cuando intenta tener acceso a una base de datos por primera vez. El estándar define estos componentes de los entornos de SQL: • Software de SGBD que cumpla el estándar SQL2. el estándar SQL2 exige que las instrucciones de definición de datos sean ejecutables por usuarios interactivos de SQL o por programas de SQL. Una de las ventajas de esta separación de LMD y LDD era que el estándar permitía una estructura estática de la base de datos como la utilizada por Jos productos de SGBD antiguos jerárquicos y de red. Uno de los esquemas está asociado con (1a terminología habitual es es propiedad de) un usuario llamado José. y el otro es propiedad de María. • Usuarios con nombre (denominados IDs de autorización en el estándar) que tienen los privilegios para llevar a cabo acciones concretas sobre los datos y las estructuras de la base de datos. denominadas COSAS y LUGARES. la base de datos de ejemplo tiene dos esquemas.t:. Manual de referencia / Capítulo 13: Creación de bases de datos 393 Si la base de datos se halla en el directorio en curso del usuario (lo que suele ocurrir). En su nivel más elevado. . y estos alias se utilizan para calificar los nombres de las tablas en posteriores instrucciones de SQL de VAX. y los definía de hecho como dos lenguajes diferentes. Dado que dos bases de datos de dos directorios diferentes pueden tener el mismo nombre. No importa la manera en que se crean realmente los programas de SQL. La estructura de la base de datos especificada por el estándar SQLI era bastante directa. La Figura 13. El estándar no exigía que las instrucciones del LDD fueran aceptadas por el SGBD durante su operación nor. el concepto de SQLl de esquemas y usuarios (denominado oficialmente IDs de autorización en el estándar) se amplió de manera significativa. Una vez más. resulta posible diferenciarlas porque tienen propietarios diferentes. Las inconsistencias también hacen imposible pasar de manera transparente los programas desarrollados para un SGBD a otro. asociados con usuarios concretos. El estándar SQL2 amplió de manera significativa el concepto de SQLl de definición de base de datos y de esquema de la base de datos. las modificaciones de la estructura de la base de datos pueden hacerse en cualquier momento. la base de datos se asocia con un servidor de la red con nombre. Como muestra esta discusión. Los esquemas de las bases de datos de estilo SQLl están contenidos en estos catálogos. también es necesario introducir un alias de la base de dalos para eliminar toda ambigüedad.L .12. El esquema de José contiene dos tablas. La relación entre los nombres de los servidores y las ubicaciones de los servidores físicos la maneja el software de red. Aunque la base de datos contenga dos tablas denominadas LUGARES. Con esta posibilidad. Se trata de un conjunto conceptual de entidades de la base de datos asociado con una implementación del SGBD que sigue el estándar de SQL2. Estas instrucciones de SQL de VAX abren dos bases de datos diferentes de RdbNMS. PRUEBASj PEDIDOS' Las instrucciones asignan los alias PEDIDOSl y PEDlDOS2 a las dos bases de datos. pese a ello. aunque no incluyan las consultas que atraviesen las fronteras de las bases de datos. eso depende de cada implementación concreta del SOBO. Esta área de SQL es una de las menos normalizadas y. La estructura de la base de datos de nivel superior descrita por el estándar SQL2 es el entorno de SQL. denominadas PERSONAS y LUGARES. El estándar SQL2 especifica la ejecución real de las instrucciones de SQL en términos de un lenguaje de módulos. Como se indicó anteriormente. aunque el proceso de conversión suele resultar más tedioso que complicado. Además.:~:. . la instrucción se reduce a: DECLARE DATABA5E Estructura de la base de datos y el estándar ANSI/ISO El estándar ANSIIISO SQLJ realizaba una distinción tajante entre el lenguaje de manipulación de datos y el lenguaje de definición de datos de SQL. Se definían conjuntos de tablas en el esquema de la base de datos. no sólo al crear la base de datos. el estándar indica que. El esquema de María también contiene dos tablas. Bases de datos en múltiples servidores Con el aumento de los servidores de bases de datos y de las redes de área local. • Módulos de programas que se utilizan para tener acceso a la base de datos.

----/ I LUGARES I I LUGARES I Catálogos en SQL2 En los entornos de SQL."".J .----/ . el concepto es análogo.12. la estructura de la base de datos se-define mediante uno o varios catálogos con nombre. • Datos de la bases de datos.. . por tanto.¡j . el catálogo es un conjunto de esquemas de la base de datos con nombre. El catálogo también contiene un conjunto de tablas del sistema (denominado a menudo. La palabra «catálogo» en este caso se utiliza del mismo modo que se ha utilizado históricamente en los grandes sistemas informáticos: para describir un conjunto de objetos (generalmente archivos). I ..ON~S~I '( Wf -'¡ I I I I I I I I I I I I I I I Programa ¡: de aPliCaCjó:J~ """'"""'" Programa de aplicación J: I ~ SGBD ". que está en un esquema.LDD I. cada uno de los cuales debe tener un nombre diferente.---_/ Base de datos . Manual de referencia Capítulo 73: Creación de bases de datos 395 Fase 1: Crear [a base de datos Fase 11: Utilizar la base de datos Esquema de la base de datos Programa de aplicación I t ¡=='---. /----. es frecuente creer que los datos se contienen en una tabla.Instrucciones de LMD Tablas de José Tablas de Maria Figura 13..' =_1"- Programa creador de bases de datos Tablas de José /----. grosso modo. s Tablas de María [[ID ![ m ! -r: I I I I ¡ :/[]]P~R. Aunque el estándar describe conceptualmente los datos como externos a la estructura de los catálogos. que gestiona el software del SGBD. de manera que induce a error.394 SOL.. una entidad que se describe a sí misma dentro de la base de datos. Indica explícitamente que el mecanismo para la creación y la destrucción de los catálogos viene definido por la im- Base de datos Figura 13.---_/ . Un SGSD con LDD estático. . Estructura de una base de datos según SQL2.. LElTI BJjj LUGARES II LUGARES I I I 11 I I I .. En los sistemas de minicomputadoras y de computadoras personales. que está en un catálogo. \ Instrucciones' . catálogo del sistema) que describe la estructura de la base de datos. ' :: w : : ITID:: BJjj : . En el caso de las bases de datos de SQL2. a los que los usuarios tienen acceso mediante los programas.13. cero o más) catálogos. El catálogo es. a un directorio. El estándar SQL2 describe el papel del catálogo y especifica que cada entorno de SQL puede contener uno o varios (realmente. Esta característica de los catálogos de SQL2 (que ofrecen todos los principales productos de SQL) se describe con detalle en el Capítulo 16._====-. y cuya estructura se describe en los catálogos.

• Privilegios.esquema L nombre-usuario ~ AUTHORIZATION . que puede verse en la Figura 13.. Se trata de tablas virtuales.. • Ordenaciones.. • Vistas. la tilde diacrítica empleada por muchos idiomas europeos o las representaciones de dos bytes de los ideogramas utilizados en muchos idiomas asiáticos) mediante conjuntos de caracteres definidos por el esquema. • Traducciones.. todas ellas.. claves primarias y externas.... tal y como se describe en el Capítulo 14. • Asertos. Diagrama sintáctico de la instrucción CREATE SCHEMA. re$to de lit definición del dominio . Manual de referencia Capítulo 13: Creación de bases de datos 397 plementación. Los esquemas son entidades de la base de datos con nombre e incluyen las definiciones de los elementos siguientes: • Tablas./ 396 SOL. Estas restricciones de integridad de la base de datos restringen las relaciones de los datos entre las tablas del esquema.. Los privilegios de la base de datos controlan las posibilidades que' se otorgan a los diferentes usuarios para el acceso a los datos de la base de datos y su actualización y para la modificaci6n de la estructura de la base de datos. si una sola sesión de usuario con el SGBD puede cruzar las fronteras entre los catálogos )ion. la manera en que se selecciona este catálogo viene definida por la implementación. Las bases de datos soportan diferentes idiomas y gestionan la representación de caracteres no románicos de esos idiomas (por ejemplo. uno de sus catálogos se identifica como catálogo predeterminado de la sesión. INTEGER) LUGARES VARCHAR(30j.14. si una sola transacción de SQL puede abarcar varios catálogos o. como ya se describió en el apartado «Asertos».12: CREATE SCHEMA CREATE TABLE (NOMBRE EDAD CREATE TABLE (CIUDAD ESTADO GRANT ON TO GRANT ON TO ESQUEMAJOSE AUTORIZACION JOSE PERSONAS VARCHAR(30). Junto con sus estructuras asociadas (columnas.$tlt . y la forma en que se realizan las comparaciones de datos de texto de diferentes conjuntos de caracteres. incluso... Controlan el modo en que los datos de texto se convierten de un conjupto de caracteres a otro... A continuación se ofrece la definición de un esquema sencillo de SQL2 para el esquema sencillo de dos tablas del usuario JOS E que puede verse en ¡a Figura 13. ~ .. procedentes de las tablas reales definidas en el esquema. características definidas por la implementación. (Una vez más.).. El estándar indica también que el grado en que el SGBD permite el acceso a otros catálogos viene definido por la implementación.. resto de la definición de lit SfJCUencilt de orOenación. El estándar indica que cuando un usuario o programa establece contacto por primera vez con un entorno de SQL. resto de lit definición de lit V. reslO de /11 definición dI! los privilegios Figura 13.14. • Conjuntos de caracteres.-1 nombre·usuario AUTHORIZATION I L I - DEFAULT CHARACTER SET nombre-eonjunto-caracteres j • CREATE TABLE CREATE VIEW CREATE DOMAIN ••. Específicamente..) Durante el curso de una sesión. resto de lit definición de/ltSfJno . • Dominios...". si una sola instrucción de SQL puede tener acceso a los datos desde varios catálogos.. 1- CREATE scnEMA l:. las tablas siguen siendo los elementos constitutivos básicos de las bases de datos en los esquemas de SQL2. Funcionan como tipos ampliados de datos para la definición de columnas en las tablas del esquema. etc. el catálogo predeterminado puede cambiarse utilizando la instrucción SET CATALOG. Trabajan mano a mano con los conjuntos de caracteres. resto de lit definición de lit lraducción CREATE ASSERTION CREATE CHARACTER SET CREATE COLLATION CREATE TRANSLATION GRANT privilegios - . El esquema de seguridad de SQL creado por estos privilegios se describe en el Capítulo 14. VARCHAR(30jj ALL PRIVILEGES PERSONAS PUSLIC SELECT LUGARES MARIA Esquemas en SQL2 Los esquemas de SQL2 son el contenedor furidamental de alto nivel de los objetos de la estructura de 1.." re$to de lit definición del conjumo de C4rltCfe/'fJ$ . como se describe en el Capítulo 11. restricciones de tabla. definiendo la secuencia de ordenación de cada uno de ellos. Los esquemas se crean con la instrucción CREATE SCHEMA.a base de datos. resto de la definición de la Ubllt .

la instrucción CREATE seHEMA se utiliza generalmente para crear por primera vez un nuevo conjunto de tablas interrelacionadas. aunque hay variaciones significativas entre unas marcas y otras. cada tabla se añade. No obstante. No define ninguna estructura adicional. Informix Universal Server sigue una estructura similar. se supone que todas las tablas con nombre de las instrucciones de manipulación de datos de SQL2 son tablas definidas en este esquema predeterminado. los disparadores y los sinónimos. el nombre utilizado para calificar el nombre de la tabla es el nombre del esquema. Los esquemas de SQL2 que ya no son necesarios pueden eliminarse utilizando la instrucción DROP SCHEMA. Sybase ofrece posibilidades parecidas. había que crear antes una de las tablas sin su definición de la clave externa. f- DROP SCHEMA nombre·de·esquema L RESTRICT ~------_ •• CASCADE --. la regla RESTRICT obliga a eliminar las tablas. Si se especifica CASCADE. una vez creadas las otras tablas. como las vistas o los asertos. pero no las demás estructuras de SQL2. La instrucción de Gracle CREATE SCHEMA permite crear tablas. exige un ID de usuario como nombre del esquema y amplía los objetos incluidos en el esquema para abarcar los índices. y luego había que añadir la definición de la clave externa (con la instrucción ALTER TABLE). Si se escriben en un programa de SQL interactivo el SGBD creará las tablas especificadas en el esqlle· ma predeterminado vigente para la sesión interactiva de SQL. En lugar de eso. Un usuario dado puede ser propietario de varios esquemas con nombres diferentes. de acuerdo con el estándar. La instrucción CREATE SCHENA de SQL2 tiene otra ventaja no tan evidente.J DROP SCHEMA. etc. y el nombre de tabla calificado especifica ese nombre antes del punto. Esto cumple el estándar SQL1.15. el esquema de calificación de las tablas se convierte exactamente en el esquema sencillo que se describe en el Capítulo 5. De acuerdo con el estándar SQL2. que puede verse en la Figura 13. uno de sus esquemas queda identificado como esquema predeterminado de la base de datos. vistas y demás estructuras incluidas en el esquema antes de eliminar el propio esquema. Figura 13. y la práctica de muchos productos comerciales de SGBD en los que conceptualmente hay un esquema por usuario. vistas y privilegios. Se trata de una protección contra eliminaciones accidentales de esquemas que contengan datos o definiciones de bases de datos aún de valor.) se eliminan· de manera automática. La instrucción CREATE SCHENA evita este problema. Además. En este caso. el usuario que ejecuta la instrucción CREATE SCHEMA se transforma de manera automática en propietario del esquema. En cualquier momento. todas las estructuras dentro de la definición del esquema (tablas. Obsérvese que las instrucciones CREATE TABLE de la instrucción CREATE SCHEMA son instrucciones legítimas de SQL por sí mismas. eliminar o alterar estructuras de esquema se aplican de manera implícita a este esquema. pero es independiente de ella.15. En este caso. Por ejemplo. Se recordará de la discusión anterior sobre la instrucción CREATE TABLE que no se podía crear con facilidad un ciclo referencial (dos o más tablas que se hacen referencia entre sí empleando relaciones de claves externas y primarias). vistas. De hecho. si la base de datos de ejemplo se creara como parte de un esquema denominado VENTAS. Diagrama sintáctico de la instrucción Muchas de las principales marcas de SGBD han pasado a adoptar alguna modalidad de la instrucción CREATE SCHENA. El nombre del esquema es el nombre de usuario. mediante instrucciones como ALTER TABLE. elimina o modifica empleando las posibilidades de CREATEf DROP!ALTER TABLE. En cada caso. en aras de la compatibilidad con el estándar SQLl. el estándar SQL2 permite crear esquemas con: • Un nombre de esquema y un ID de usuario (como en el último ejemplo). En la práctica. El estándar SQL2 no especifica ninguna tabla ALTER SCHEMA. bien RESTRICT. Obsérvese que en SQL2 la estructura del esquema se relaciona con la estructura de IDs de usuario. . y exige que el nombre del esquema y el nombre de usuario coincidan. se puede utilizar un nombre de tabla calificado para hacer referencia a las tablas de otros esquemas. las posibilidades ofrecidas cumplen los requisitos de la implementación de nivel Inicial de SQL2. mientras un usuario o un programa tiene acceso a una base de datos de SQL2. el nombre de tabla calificado para la tabla OFICINAS sería: VENTAS. Posteriormente. OFICINAS Si s~ crea un esquema de SQL2 con sólo un ID de usuario como nombre del esquema. • S610 un nombre de esquema. La instrucción exige que se especifique una de las reglas de eliminación para eliminar columnas que ya se han descrito: bien CASCADE. Como se indicaba en el Capítulo 5. ya que el SGBD no comprueba las restricciones de integridad referencial especificadas por el esquema hasta que se hayan creado todas las tablas que define. se puede alterar cada definición de las estructuras incluidas en el esquema. asertos. el nombre del esquema se transforma en la ID de usuario. Si se especifica RESTRICT. El nombre del esquema califica de manera implícita los nombres de todas las tablas utilizadas en las instrucciones de SQL. • Sólo una ID de usuario. 1 . Las instrucciones LDD que se ejecuten para crear.398 SOL Manual de referencia Capítulo 13: Creación de bases de datos 399 El esquema define las dos tablas y concede a otros usuarios concretos permiso para tener acceso a ellas. la instrucción no tendrá éxito si permanece dentro del esquema alguna de estas estructuras. En vez de eso.

• Las instrucciones CREATE INDEX y DROP INDEX definen los índices. utilizadas con objetos específicos de cada SGBD. SQL crea la ilusión de la vista concediendo a las vistas nombres. leran las consultas a las bases de datos. que ace:.1. Para los usuarios de la base de datos la vista tiene la misma apariencia que las tablas verdaderas. definiendo vistas alternativas de los datos. DROP y ALTER. sus claves primarias y sus claves externas. • Las vistas simplifican el acceso a la base de datos presentando la estructura de los datos almacenados de la manera más natural para cada usuario. • La mayor parte de las marcas de SGBD admiten otras instrucciones CREATE. definición de datos de SQL que definen y modifican la estructuras de las bases de datos: • La instrucción CREATE TABLE crea tablas y define sus columnas. con un conjunto de columnas con nombre y filas de datos. Manual de referencia Resumen Este capítulo ha descrito las características del lenguaje de. Las táblas de las bases de datos definen la estructura y organización de los datos. SQL también permite examinar los datos almacenados de otra manera. de tal fonna que usuarios diferentes sólo vean ciertas filas o columnas de una tabla. pero añaden sobrecarga a las actualizaciones de las bases de datos. No obstante. Una vista es una consulta de SQL que se almacena de manera permanente en la base de datos y a la que se le asigna un nombre. Este capítulo describe la manera de crear vistas y el modo de emplearlas para simplificar el procesamiento y mejorar la seguridad de las bases de datos. las vistas no existen en la base de datos corno conjuntos almacenados de valores de datos. de hecho. El resultado de la consulta almacenada es visible mediante la vista. y estas diferencias afectan al modo en que se designan las bases de datos y se obtiene acceso a ellas. Por el contrario. • La instrucción DROP TABLE elimina de la base de datos tablas creadas anteriormente. 401 1 . • La instrucción ALTER TABLE puede utilizarse para añadir columnas a tablas ya existentes y para modificar las definiciones de las claves primarias y externas. Las vistas constituyen una parte importante de SQL por varios motivos: • Las vistas penniten personalizar la apariencia de la base de datos de modo que usuarios diferentes la vean desde diferentes perspectivas./ 400 SOL. las filas y las columnas de datos visibles mediante las vistas son el resultado de una consulta generado por la consulta que define cada vista. a diferencia de las tablas verdaderas. • Las vistas penniten restringir el acceso a los datos. y SQL perriüte el acceso al resultado de esta consulta como si fuera. una tabla auténtica de la base de datos. • El estándar SQL2 especifica un esquema de base de datos que contiene un conjunto de tablas. que se manipula con las instrucciones CREATE SCHEMA y DROP SCHEMA. como se muestra en la Figura 14. Concepto de vista Las vistas son tablas virtuales de la base de datos cuyo contenido viene definido por una consulta. Pero. CAPíTULO 14 Vistas • Las diversas marcas de SGBD utilizan enfoques muy diferentes para la organización de las bases de datos que administran.

OO€ 3S0. la vista tiene el aspecto de una tabla. es decir. y se hace referencia a las columnas de la vista en la instrucción SELECT igual que a las columnas de las tablas verdaderas. EDAD CUOTA VENTAS 'OS Brullo Arteaga '" >O. SELECT NOMBRE.OO€ .DC€ "O Dao.000.DOE DCO. con el fin de modificar los datos visibles mediante la vista.OSO.OO€ 275. VENTAS Los datos de la vista provienen de las tablas REPRESENTANTES y OFICINAS. el SGBD debe ejecutar realmente la consulta que define la vista y almacenar el resultado en una tabla temporal.OO€ >8. Manual de referencia Capítulo 14: Vistas 403 T bl a REPRESENTANTES NUM EMPL NOMBRE . ampliada con el nombre de la ciudad y de la región en . FROM REPRESENTANTES. En el caso de las vistas sencillas puede que el SGBD cree cada vista sobre la marcha.1 es típica.00€ 9aS."eire Neus Azcárate 300.00€ 392 . Se le ha dado el nombre de DATOSREP y viene definida por esta consulta a dos tablas: SELECT NOMBRE. Independientemente del modo en que el SGBD maneja realmente cada vista concreta. busca la definición de la vista almacenada en la base de datos. El SGBD atiende las solicitudes de acceso a la vista desde esa tabla temporal y la descarta cuando ya no es necesaria. Una vez definida una vista.000. la vista puede utilizarse en las instrucciones de SQL como si fuera una tabla verdadera. como si fuera una tabla verdadera. la ciudad y la región de cada uno.00€ . Vista típica con dos tablas fuente. el SGBD debe materializar realmente la vista.DOE 275.OO€ 300. / >O. NULL >O.DOE que trabaja." '" 673.000.00€ REGlaN María Jiménez Sarnuel Clavel Navarra Navarra Caste1l6n Caste1l6n Almeria León León Daimiel .OO€ 865. Esta vista contiene una fila de información por cada representante. y su contenido tiene el mismo aspecto que el resultado de la consulta que se obtendría si se ejecutara la consulta realmente. Para algunas vistas también se pueden utilizar las instrucciones INSERT. a todos los efectos prácticos.000.000. Luego traduce la solicitud que hace referencia a la vista en una solicitud equivalente a'las tablas fuente de la vista y ejecuta la solicitud equivalente. Así. '" >O. y almacenando las definiciones de las vistas en la base de datos.DOO.OO€ 305 15 865.DCO. DELETE y UPDATE.OO€ 594. como en esta consulta: Listar los representantes que han superado su cuota. Figura 14.~ Bernardo Sánchez Caste1l6n Este Este Este Pablo Cruz Daniel Ruidrobo Este Este Este Oeste Oeste Oeste Bruno Arteaga Susana Santos León Fl:. >O.DOE DCO.OO€ 350. se puede utilizar en instrucciones SELECT. '" no >O.000. La vista mostrada en la Figura 14. Por tanto. 042. extrayendo de las tablas fuente los datos de las fijas. CIUDAD.CeE NULL León Freir" " \\ 62 350 DCO. como los nombres de las tablas. igual que las tablas verdaderas.1.OO€ 361 911. El manejo de las vistas por el SGBD Cuando el SGBD encuentra una referencia a una vista en una instrucción de SQL.00. REGION. Como puede verse en la figura. FROM DATOSREP WHERE VENTAS > CUOTA NOMBRE CIUDAD REGlaN 299 912.OSO. Estas tablas se denominan tablas fuente de la vista porque son la fuente de los datos que son visibles mediante la vista.OO€ 286 775. DATOSREP. OFICINAS WHERE OFICINA~REP ~ OFICINA REPRESENTANTES. En el caso de vistas más complejas.OO€ 350.DOE Vista DATOSREP NOMBRE / CIUDAD REGIÓN CUOTA // VENTAS '" .OO€ '" '" '" María Jiménez Samuel Clavel Daniel Ruidrobo Pablo Cruz Bruno Arteaga Susana Santos León Freire Navarra Navarra Castellón Castell6n Almería León León Este Este Este Este Este Oeste Oeste ~ OFICINA CIUDAD 22 Daimiel 13 Navarra 12 Castellón 13 Almeria n León REGIÓN Oeste Este Este Este Oeste '" >O. I~ El nombre de la vista.OO€ 215 DCO.DoE '" 911.125.OO€ 392 725. el SGBD mantiene la ilusión de la vista al tiempo que conserva la integridad de las tablas fuente.OO€ 30S 673. CIUDAD.oaE 300 DCO.000.402 SOL. MlIría Jirnenez Susana Santos Samuel Clavel Bernardo Sánchez D<lniel Ruidrobo Tomás Saz 48 52 33 4S ~~ I < 350 300 350 275 DCO. aparece en la sentencia FROM como si fuera el nombre de una tabla.€ 350.DOE DOO. mostrando el nombre.DOE 594. el resultado es el mismo para los usuarios -se puede hacer referencia a la vista en las instrucciones de SQL exactamente igual que si fuera una tabla verdadera de la base de datos.OO€ 200. CUOTA.

Se puede conceder permiso a cada usuario para que sólo tenga acceso a la base de datos mediante un conjunto reducido de vistas que contengan los datos concretos que ese usuario está autorizado a ver. en la base de datos de ejemplo. Para crear la vista con éxito hay que tener permiso para el acceso a todas las tablas a las que se hace referencia en la consulta. el tipo de datos. . Creación de vistas (CREA TE VIEW) • Seguridad. Aunque todas las vistas se crean de la misma manera. . y se definen para simplificar las peticiones a la base de daLOs. su longitud y otras características de cada columna se obtienen de la definición de las columnas en las tablas fuente. Si se omite la lista de nombres de columna en la instrucción CREATE VIEW. Las vistas pueden presentar una imagen consistente y no modificada de la estructura de la base de datos. En las bases de datos para computadoras personales las vistas suelen ser una comod.2. La instrucción asigna un nombre a la vista y especifica la consulta que define la vista. en la práctica se utilizan normalmente distintos tipos de vista para finalidades diferentes. que puede verse en la Figura 14. pero el SOBD todavía debe traducir las consultas a la vista en consultas a las tablas fuente subyacentes. se reestructuren o cambien de nombre. Manual de referencia Capítulo 14: Vistas 405 Ventajas de las vistas Las vistas ofrecen una gran variedad de ventajas y pueden resultar útiles en muchos tipos diferentes de bases de datos. Las vistas pueden ofrecer a los usuarios una vista personalizada de la estructura de la base de datos. convirtiendo las consultas a varias tablas en consultas a una sola tabla formuladas a la vista. • Aislamiento de las modificaciones. el SOBD puede comprobarlos de manera automática para asegurarse de que cumplen las restricciones de integridad especificadas. cada columna de la vista adopta el nombre de la columna correspondiente de la consulta. Las vistas pueden extraer datos de varias tablas diferentes y presentarlas como si fueran una sola tabla. presentando la base de datos como un conjunto de tablas virtuales que tiene sentido para el usuario. el SGBD debe traducir la solicitud en una actualización de las filas de las tablas fuente subyacentes. • Integridad de los datos. también 'hay dos inconvenientes: principales en el empleo de las vistas en lugar de tablas reales: • Rendimiento. Cuando un usuario intenta actualizar las filas de una vista. Un empleo frecuente de las vistas es limitar el acceso de los usuarios solamente a las filas seleccionadas de las tablas.. Las vistas ofrecen estas ventajas principales: Estos inconvenientes implican que no se pueden definir y utilizar las vistas de manera indiscriminada en lugar de las tablas fuente. se emplea para crear vistas. de manera opcional. Figura 14. Esto es posible para las vistas sencillas. -Los-apartados siguientes examinan estos tipos de vistas y ofrecen ejemplos de la instrucción CREATE VIEW. Las vistas crean el aspecto de tabla. La lista de nombres de columnas debe especificarse si la consulta incluye columnas calculadas o si genera dos columnas con nombres idénticos.-. Si se especifica una lista de nombres de columna. aunque las tablas fuente subyacentes se dividan. son sólo de lectura. • Simplicidad de las consultas.-. restringiendo así el acceso de los usuarios a los datos almacenados. • Restricciones de actualización. La instrucción CREATE VIEW puede asignar. Si se tiene acceso a los datos y se introducen mediante vistas. La instrucción CREATE VIEW. Diagrama sintáctico de la instrucción CREATE VIEW. un nombre a cada columna de la vista recién creada._ pero las vistas más complejas no pueden actualizarse.CREATE VIEW nombre-de-visrsl _(nombre-de-columnaL J t. • Simplicidad estructural. En vez de eso.J AS consufts-+.404 SOL. en cada caso hay que considerar las ventajas ofrecidas por el empleo de las vistas y compararlas con los inconvenientes. Obsérvese que sólo se especifican los nombres de las columnas. puede que sólo se desee permitir a un jefe de ventas ver las filas de la tabla REPRESENTANTES de los representantes de la misma región que el jefe de l. Vistas horizontales Inconvenientes de las vistas Aunque las vistas ofrecen ventajas importantes.idad. Por ejemplo. debe tener el mismo número de elementos que el número de columnas generado por la consulta. En las instalaciones de las bases de datos de producción las bases de datos desempeñan un papel fundamental en la definición de la estructura de la base de datos para los usuarios y en el mantenimiento de la seguridad.2. Si se define la vista mediante una consulta a varias tablas. incluso una consulta sencilla a la vista se transforma en una reunión compleja y puede tardar mucho tiempo en completarse..

Dos vistas horizontales de la tabla REPRESENTANTES. Crear una vista que muestre los representantes de la región Oeste. por tanto. ya que esa información puede ser necesaria para procesar correctamente los pedidos.OO€ 286.000 € en pedidos actualmente en los libros.912. tiene exactamente las mismas columnas que la tabla fuente. 12. que sólo muestra los representantes de la región correspondiente. como se muestra a continuación: Crear una vista que muestre los representantes de la regi6n Este. Las vistas como REPESTE O REPOESTE suelen denominarse vistas horizontales. Por ejemplo. pero sólo algunas de las filas son visibles mediante la vista.00€ 186.911.406 SOL. 13) zontalmente las tablas para crear cada vista.00 € En cada uno de estos ejemplos la vista se ha obtenido de una sola tabla fuente . Todas las columnas de la tabla fuente forman parte de la vista. las vistas horizontales fragmentan hori- Definir una vista para Susana Santos (empleada número 102) que sólo contenga los pedidos formulados por los clientes que tiene asignados.3. Ofrecen una tabla privada para cada usuario. Sin Figura 14.3.00 < (SELECT SUM(IMPORTE) FROM PEDIDOS WHERE CLIENTE: NUM_CLI) Vista REPOESTE NUM_EMPL NOMBRE EDAD 48 62 49 102 Susana Santos 108 León Freire 107 Neus Azcárate if lDS lD9 lD2 106 lD' lDl 110 108 10) lD7 Bruno Arteaga Maria Jiménez Susana Santos Samuel Clavel Bernardo Sám:hez Daniel Ruidrobo Tomás Saz León Freire Pablo Cruz Neus Azcárate 37 31 48 52 33 45 41 I< 62 49 291~ 367 . compuesta únicamente de las filas que ese usuario necesita. 673.985. Las vistas horizontales resultan adecuadas cuando la tabla origen contiene datos que se relacionan con varias organizaciones o usuarios.775. La cláusula WHERE determina las filas de la tabla fuente que son visibles en la vista. 22} CREATE VIEW OFICINASESTE AS SELECT FROM OFICINAS WHERE REGION ~ 'Este' Ahora se puede dar a cada jefe de ventas permiso para que tenga acceso a la vista REPESTE o a la vista REPOESTE y le niegue el permiso para el acceso a la otra vista y a la propia tabla REPRESENTANTES.OO€ 299 . O50. se pueden definir dos vistas. CREATE VIEW REPESTE AS SELECT PROM REPRESENTANTES WHERE OFICINA_REP IN (11.OO€ 361 .00€ 142 .OO€ 392 . Manual de referencia Capítulo 14: Vistas 407 ventas.865. Vistas verticales Otro uso frecuente de las vistas es la limitación del acceso de los usuarios sólo a ciertas columnas de las tablas. el nombre y la asignación de oficina de cada representante. Para conseguirlo.00-€ 474 .00€ '5 .00€ 30S. La vista se define mediante una consulta SELECT * y.594. V'15 t a REPE S TE NUM_EMPL NOMBRE DA 37 31 52 33 45 105 109 106 104 101 103 Bruno Arteaga María Jiménez Samuel Clavel Bernardo Sánchez Daniel Ruidrobo Pablo Cruz }~ 29 }~ Tabla REPRESENTANTES NmLEMPL NOMBRE SD" VENTAS CREATE VIEW GRANDESCLIENTES AS SELECT PROM CLIENTES WHERE 30000. puede que el departamento de procesamiento de pedidos necesite tener acceso al número de empleado.725. CREATE VIEW PEDIDOSSUSANA AS SELECT PROM PEDIDOS WHERE CLIENTE IN (SELECT NUM_CLI FROM CLIENTES WHERE REP_CLI ~ 102) Definir una vista que s610 muestre los clientes que tengan más de 30. A continuación se ofrecen algunos ejemplos más de vistas horizontales: Definir una vista que sólo contenga las oficinas de la región Este. . Como se muestra en la Figura 14. en la base de datos de ejemplo. Esto ofrece de hecho al jefe de ventas una vista personalizada de la tabla REPRESENTANTES. CREATE VIEW RE POESTE AS SELECT PROM REPRESENTANTES WHERE OFICINA_REP IN {21.042.

se restringe de hecho el acceso a los datos delicados de ventas y de cuotas.OoE: 300. San&os S"".OOE: 21S.. clientes y su asignación a los representantes. el número de oficina y la región de cada oficina.00€ lOO. el nombre de la empresa y el lfmite de crédIto de todos los clientes asignados a Bruno Arteaga (empleado número 105).000.-EMPL NOMBRE Bruno Arteaoa l'Iada JiDénez Sllsana Sotntos $aII:lJ. S610 son visibles mediante esta vista las columnas citadas expresamente en la lista de selección de la vista y las columnas que cumplen la condición de selección..00€ 286.-REP 13 11 21 11 12 :L2 21 12 22 PUESTO Representante Representante J[r.00E: 3!12. Vista vertical de la tabla REPRESENTANTES./lI-88 19-KAY-81 20-OCT·86 13-D<E-90 12-oc1'-89 l-MAR-81 14-NO\'-88 m ". Los datos visibles mediante esta vista son un subconjunto de filas y columnas de la tabla CLIENTES.00€ 200. '" ".000.4.00€ 30S. EMPRESA. FROM OFICINAS REGION Al dar al personal de procesamiento de pedidos acceso a esta vista y denegarle el acceso a la tabla REPRESENTANTES.000. el lenguaje SQL no incluye el concepto de vistas horizontales ni verticales. como en este ejemplo: Definir una vista que contenga el número de cliente. compuesta únicamente de las columnas que ese usuario necesita.OO€ '" ".000.911.. NOMBRE. OFICIWJ\EP fuente visibles en la vista. '" '" '" >OS LeÓD m~ .00€ 142.. CIUDAD. y la definición de la vista no incluye ninguna cláusula WHERE.000.86S. ".12S.OO€ l86. ". CREATE VIEW INFOOFICINAS AS SELECT OFICINA.OOO. no hace falta que el personal de procesamiento de pedidos vea las ventas del año corriente de cada representante ni su cuota. SQL no limita al usuario a definir fragmentos puramente horizontales o verticales de las tablas. REP_CLI FROM CLIENTES En cada uno de estos ejemplos la vista se ha obtenido de una sola tabla fuente. Las vistas verticales se hallan generalmente donde los datos almacenados en las tablas los utilizan varios usuarios o grupos de usuarios. las vistas verticales fragmentan las tablas fuente vertical· mente para crear la vista. "." ~..OOE: 361.. Las vistas como INFOREP suelen denominarse vistas verticales.594. Resulta bastante frecuente definir vistas que fragmentan las tablas fue'nte tanto en la dimensión horizontal como en la vertical.00€ C14. Estos conceptos simplemente ayudan a visualizar el modo en que la vista presenta la información de las tablas fuente. Definir una visla de la labla CLIENTES que sólo incluya los nombres de los.00€ 1S. CREATE VIEW SELECT FROM WHERE CLIBRUNO AS NUM_CLI.. LIMIT&_CREDITO CLIENTES REP_CLI = 105 Tomás Su León Freire Pahl0 Cruz Neus Azcárll&e '" '" T """ " 13 " NUH. '" '" ". todas las filas de la tabla fuente están representadas en la vista..nS. ". COO>"A """AS 3S0. OFICINA_REP FROM REPRESENTANTES Ofrecen una tabla privada para cada usuario.00E: >OS 3S0.408 SOL Manual de referencia Capítulo 14: Vistas 409 embargo..042. no '" >OS >OS Bruno Arteaga !'laria Jilrinez sus. Esta vista selectiva de la tabla REPRESENTANTES puede construirse con la vista siguiente: Crear una vista que muestre información seleccionada de cada representante. "8 361.4. " " n " " " 11 13 P'reirlr Pablo Crut NeU5 A%c6rate .el Clavel Ilen>ardo Sánchez Daniel Ruidrobo Tabla REPRESENTANTES ". Como se trata de vistas verticales. 1 . - OFICINA. La lista de selección en la definición de la vista determina las columnas de la tabla Tabla INFO NU!'LDtPL "". De hecho. '" ". CREATE VIEW INFOCLI AS SELECT EMPRESA. """ ~.00€ - Figura 14.CONTADO U-FES-88 U-OCT-89 lO-OIC-86 14-Jt.>r_tante VP V~ws Jefe V.000.00€ 21S..wa Represenwnte Represenwnte Jete ventas Representante Representante - FECH1\..985. CREATE VIEW INFOREP AS SELECT NUM_EMPL. Como puede verse en la Figura 14.0S0.9l2.00€ 3S0.00€ 300. '" 11.000. A continuación se muestran algunos ejemplos de vistas verticales: Definir una vista de la tabla OFICINAS para el personal de procesamiento de pedidos que incluya la ciudad.00€ 299..uel Clavel Bernardo Sánchez D<lniel Ruidrobo 13 11 11 13 13 " Vistas de subconjuntos de filas y columnas Cuando se define una vista..000.613.

por tanto. MAXIMO. Las VIStas de agrupación desempeñan la misma función que las consultas de agrupación. esta consulta genera un informe sencillo que resume los pedidos de cada representante: no son legales en las expresiones de SQL. La vista de agrupación no es s610 un filtro de su tabla fuente que excluye ciertas filas y columnas. agrupan filas de datos relacionadas y generan una fila de resultados de la consulta para cada grupo. el SGBD sigue teniendo información sobre ellas y hace que se cumpla ]a restricción. la columna PROMEDIO. CUANTOS. y las columnas de las vistas de agrupación suelen contener datos calculados. aunque parezca perfectamente razonable.00€ 26.566. a su vez.SO€ 411 Vistas de agrupación GROUP BY. que se obtienen mediante funciones de columna como SUM () y MIN ( ).432. Recuérdese del Capítulo 8 que las funciones de columna anidadas.OO€ B. PEDIDos_paR_REPRESENTANTE NUM_EMPL : QUIEN BY OFICINA_REP Funciones de columna anidadas Mostrar el nombre. Susana Santos 39.132. por tanto. Considérese este ejemplo: Para cada oficina de ventas muéstrese el rango de tamaños promedio de los pedidos de todos los representantes que trabajan en esa oficina. corno: MIN (HIN (A)) Como muestra este ejemplo. SELECT FROM WHERE aRDER NOMBRE NAME. MIN(PROMEDIO) . sino también un resumen de su tabla fuenre. actúan como vistas sólo de lectura.33€ 16 . Una vez que se ha definido esta vista de agrupación. que pueden participar en consultas pero no en actualizaciones. Puede que también especifique un nombre modificado para una columna de agrupación.OO€ Esta consulta produce un error. Por ejemplo.105.321.350.7QO.OO€ 11 . PROMEDIO REPRESENTANTES. porq. COUNT(*)..OO€ 2.OO€ 5 . Las vistas de agrupación pueden utilizarse en consultas igual que Olras vistas más sencillas. 316. El argumento de estas funciones de columna. CUANTOS. MINIMO. se necesita una cantidad considerable de procesamiento del SOBD para mantener la ilusión de la tabla virtual para las vistas de agrupación.----------58.OO€ La consulta especificada en la definición de una vista puede incluir una cláusula Este tipo de vista se denomina vista de agrupación. Se trata de una consulta a dos tablas que agrupa las filas de la vista PEDIDOS_POR-REPRESENTANTE de acuerdo con la oficina a la que está asignado cada representante.419. el importe total de los pedidos y el tamaño medio de los pedidos de cada representante. las filas de las vistas de agrupación no tienen una correspondencia de uno a uno con las filas de la tabla fuente. PEDIDOS_POR_REPRESENTANTE QUIEN : NUM_EMPL BY TOTAL DESC CUANTOS TOTAL PROMEDIO ---------------.816.OO€ 22. no hay manera de traducir la solicitud de actualización a las filas de las tablas fuenle. MIN(IMPORTE) .OO€ 32.694.14€ León Freire 5 3 2 3 2 4 Bruno Arteaga Neus Azcárate Samuel Clavel Daniel Ruidrobo Tomás S.S52.OO€ 7 . Aunque las vistas de agrupación ocultan del usuario las funciones de columna en su lista de selecci6n. Las vistas de agrupación. En este ejemplo.40€ 11 .865.OO€ B . FROM REPRESENTANTES. la columna REP de la tabla PEDIDOS se transforma en la columna QUIEN de la vista PEDIDOS_POR_REPRESENTANTE. PEDIDOS MAX{AVG(IMPORTE)) .176. MAX(IMPORTE) . el resultado de una función de columna. Sin embargo. AVG(IMPORTE) FROM PEDIDOS GROUP BY REP A diferencia de las vistas horizontales o verticales. PROMEDIO) AS SELECT REP. MAX(PROMEDIO) REPRESENTANTES. La consulta «verdadera» que se solicita a SQL es: SELECT OFICINA_REP. SELECT FROH WHERE GROUP Error: OFICINA_REP. TOTAL.os visibles mediante la vista son el resultado de una consulta de agrupacIón. La lista asigna nombres a las columnas de la vista de agrupación. puede utilizarse para simplificar las consultas.OO€ 34.628.ue los dat.. Manual de referencia María Jiménez Pablo Cruz 2 Capítulo 74: Vistas 7.OO€ 23. Las vistas de agrupación también están sometidas a las restricciones de SQL respecto a las funciones de columna anidadas.633. las vistas de agrupación no pueden actualizarse. es. ¿Qué significaría actualizar el tamaño medio de los pedidos del representante número lOS? Como cada fila de una vista de reunión corresponde a un grupo de filas de las tablas fuente. 2 1. que resume los datos de ese grupo. la definición de una vista de agrupación incluye siempre una lista de nombres de columnas.OO€ 3. SUM(IMPORTE) . CREATE VIEW PEDIDos_paR_REPRESENTANTE (QUIEN. Jo que permite llevar a cabo consultas posteriores sobre esos datos. TOTAL. el número de pedidos. A continuación se ofrece un ejemplo de vista de agrupación: Definir una vista que contenga datos resumidos de los pedidos de cada representa1Ue. Pero las funciones de columna MIN () y MAX () de la lista de selecci6n provocan un problema.471. MIN(AVG(IMPORTE»).958. Las vistas d~ agrupación muestran el resultado de estas consultas de agrupaCión en una tabla virtual.410 SOL. El motivo debería ser evidente a partir del ejemplo.--------7 ----------.

Por supuesto. IMPORTE) AS Mostrar los pedidos actuales de mayor tamaño.OO€ 22.3S0. a Samuel no le gusta trabajar con los números de cliente ni de empleado. ejecuta a menudo consultas a la tabla PEDIDOS de la base de datos de ejemplo.OO€ 3. una fila de la tabla CLIENTES y una fila de la tabla REPRESENTANTES. el SGBD debe trabajar lo mismo para generar el resultado de la consulta de una sola tabla a la vista que para generar el resultado de la consulta de tres tablas equivalente. le gustaría poder utilizar una versión de la tabla PEDIDOS que tuviera nombres en lugar de números. EMPRESA.d. CLIENTES.OO€ Vistas de reunión Uno de los motivos más frecuentes de empleo de las vistas es la simplificación de las consultas a varias tablas. de hecho.978. provocar un error si una de las tablas fuente resulta ser una vista de agrupación. A continuación se ofrece una vista que satisface las necesidades de Samuel: Obsérvese que esta consulta es una instrucción SELEeT de una sola tabla. agrupados por representantes: Zeta Producciones J.OO€ 22. resulta mu- . que muestra quiénes los formularon y quiénes los tramitaron. PEDIDOS.OO€ 3.100.P.OO€ lS0.a Producciones Capítulo 14: Vistas 413 WHERE NUM_EMPL = REP GROUP BY REP GROUP BY OFICINA_REP SUM ( IMPORTE l Esta consulta es ilegal debido a !as dos cláusulas GROUP BY y las funciones de columna anidadas. EMPRESA De manera parecida. 3S. supóngase que Samuel Clavel.S00.OO€ 22. el SGBD debe llevar a cabo un poco más de trabajo para tratar la consulta a la vista. Cada fila de la vista se obtiene de una combinación de una fila de la tabla PEDIDOS. EMPRESA.0 tres tablas diferentes y presenta ~l resultado de la consulta como una sola tabla virtual. Sin embargo. exigirían una reunión de dos o tres tablas cada una. que es considerablemente más sencilla que la instrucción SELECT de tres tablas equivalente para las tablas fuente: SELECT NOMBRE. NOMBRE_REP. Por ejemplo. SELECT NOMBRE_REP. Sin embargo.000.OO€ 31.S00. REPRESENTANTES CLIENTE : NUH_CLI ANO REP : NUM_EMPL Esta vista viene definida por una reunión de tres tablas. CLIENTES WHERE REP : NUM_EMPL AND CLIENTE : NUM_CLI GROUP BY NOMBRE.582. el vicepresidente de ventas.500. EMPRESA. Sotoca Chen Asociados Acme Ace Internacional íbero & Sagaz Mostrar los pedidos totales actuales de cada empresa por representante. con esta consulta a la vista: Crear una vista de la tabla CREATE VIEW SELECT FROM WHERE PEDIDOS con nombres en lugar de números.OO€ 3.OO€ 31.OO€ 27. Una vez definida la vista. Al igual que con las vistas de agrupación.A.S00. NOMBRE_REP INFO_PEDIDOS IMPORTE> 20000. resulta fácil generar un informe de los pedidos de mayor tamaño. Filas Henche " López íbero & Sagaz Mejorada Sistemas Orión Lt.745. una instrucción SELECT agrupada perfectamente razonable puede. sólo hay que comprender el motivo del error cuando SQL]o comunique. En vez de eso.00 BY IMPORTE DESC IMPORTE NOMBRE_REP 45.OO€ León Freire Samuel Clavel Neus AzcArate Bruno Arteaga Tomás Saz Daniel Ruidrobo INFO_PEDIDOS (NUM_PEDIDO.925. Zet. NOMBRE. FROM INFO_PEDIDOS SUM{IMPORTE) La vista hace más facd comprobar lo que ocurre en la consulta que si se expresara en la reunión de tres tablas equivalente.412 SOL.OO€ 47. EMPRESA. Al especificar una consulta a dos o tres tablas en la definición de la vista. como muestra este ejemplo. SELECT FROM WHERE aRDER EMPRESA EMPRESA.608. esta vista puede ofrecer algunas ventajas reales. NUH_PEDIDO. ordenados por impone. el procesamiento necesario para crear la ilusión de una tabla virtual para esta vista es considerable. IMPORTE PEDIDOS. Por desgracia. se puede realizar a menudo una consulta de una sola tabla a la vista para solicitudes que. A continuación se ofrece una consulta a la vista que genera un infonne de los pedidos. No hay m'UJcra de prever esta situación. De hecho. de otro modo. se puede crear una vista de reunión que extrae los datos de dos . SUM(IMMPORTE) FROM REPRESENTANTES.00€ 7. Manual de referencia GROUP BY NOMBRE_REP. IMPORTE.S00. Aunque tiene una definición relativamente compleja. para el usuario humano de la base de datos. EMPRESA NOMBRE_REP Bruno Arteaga Bruno Arteaga Daniel Ruidrobo Daniel Ruidrobo Daniel Ruidrobo León Freire León Freire León Freire EMPRESA Acme JCP S.

entonces esa vista debe cumplir estos criterios. no se deben eliminar las filas duplicadas del resultado de la consulta. actualizaría la fila correspondiente de la tabla REPRESENTANTES. tiene sentido hablar de la inserción de una fila en esta vista. eliminar una fila de una vista o actualizar una fila de una vista? Para algunas vistas. significa que la fila nueva debe insertarse en la tabla REPRESENTANTES subyacente de la que se deriva. También tiene sentido eliminar una fila de la vista REPESTE. columnas calculadas ni funciones de columna. COUNT(*l. AVG(IMPORTEl FROM PEDIDOS GROUP BY REP Actualización de vistas ¿Qué significa insertar una fija de datos en una vista. la vista debe tener una sola tabla fuente para la que el usuario ha de contar con los privilegios necesarios. Hay vistas más complejas que REPESTE en las que sigue teniendo sentido actualizar la vista. CREATE VIEW PEDIDos_paR_REPRESENTANTE (QUIEN. y hay vistas menos complejas que PEDIDOS_POR_REPRESENTANTE en las que las actualizaciones no tienen sentido. la acción puede llevarse a cabo contra la fila correspondiente de la tabla fuente. MAXIMO. Por ejemplo. a su vez. es decir. • La consulta no debe incluir ninguna cláusula GROUP BY ni HAVING. • La cláusula WHERE no debe incluir ninguna subconsulta. tal y como se definió anteriormente en el apartado «Vistas de agrupación»: No existe una correspondencia biunívoca entre las filas de esta vista y las filas de la tabla PEDIDOS subyacente.5. es decir. Definir una vista que contenga datos resumidos de los pedidos de cada representante. SUM(IMPORTEj. CUANTOS. el SGBD debe poder realizar un seguimiento de todas las filas de la vista hasta su fila fuente de la tabla fuente. Las vistas RE PESTE y PEDIDos_paR_REPRESENTANTE son dos ejemplos extremos en cuanto a la complejidad de sus definiciones. 12. obtenida a partir de una sola tabla fuente. la lista se selección no puede contener expresiones. 1 . MINIMO. La vista PEDIDOS~POR_REPRESENTANTE no es actualizable. CREATE VIEW REPESTE AS SELECT FROM REPRESENTANTES WHERE OFICINA_REP IN (11. De mane- ba~ Ista REPRESENTANTES NUM EMPL NOMBRE Vista REPESTE NUM EDAD 37 31 46 52 33 EMPL NOMBRE 105 109 106 104 101 103 Bruno Arteaga Mana JlInenez _ Samuel Clavel Bernardo Sanchez Damel RUldrobo Pablo Cruz - UPDATE UPDATE DELETE INSERT ~INSERT 105 109 102 106 ID' 101 110 108 103 107 Bruno Arteaga María Jiménez Susana Santos Samuel Clavel Bernardo sánchez Daniel Ruidrobo Tomás Saz León Freire Pablo Cruz Neus Azcárate I( 45 41 62 29 49 If Figura 14. por lo que no tiene sentido hablar de insertar. Manual de referencia Capítulo 14: Vistas 415 eho más sencillo escribir y comprender la consulta a una sola tabla que hace referencia a la vista. considérese la vista de agrupación PEDIDOS_POR_REPRESENTANTE. No obstante. Actualización de datos mediante una vista. sólo pueden aparecer condiciones de búsqueda sencillas fila a fila. • Cada elemento de selección debe ser una referencia de columna sencilla.5. Como puede verse en la Figura 14. PROMEDIO) AS SELECT REP. las vistas que pueden y no pueden actualizarse han sido un importante problema de investigación sobre las bases de datos relacionales a lo largo de los años. conservando la integridad de la tabla fuente y de la vista. Finalmente. estas operaciones pueden traducirse obviamente en operaciones equivalentes de las tablas fuente de la vista. Si la tabla fuente es. MIN(IMPORTE) . una vista. eliminar ni actualizar filas de esta vista. considérese nuevamente la vista RE PESTE. • La cláusula FROM sólo debe especificar una tabla actualizable. eliminaría la fila correspondiente de la tabla REPRESENTANTES. TOTAL. se trata de una vista de sólo lectura.414 SOL. MAX(IMPORTE) . El concepto fundamental tras estas restricciones es más sencillo de recordar que las propias reglas. las vistas pueden actualizarse si las consultas que las definen cumplen todas estas restricciones: • No se debe especificar DISTINCT. definida anteriormente en este capítulo: Crear una vista que muestre los representantes de la región Este. De hecho. Actualizaciones de vistas y el estándar ANSI/ISO El estándar ANSI/ISO de SQLI especifica las vistas de las de datos que proclaman su cumplimiento del estándar que deben ser actualizables. Según el estándar. 13) Se trata de una vista horizontal directa. tiene sentido la actualización de una fila de la vista REPESTE. Para que las vistas sean actualizables. En cada caso.

12. Muchas vistas se pueden actualizar en teoría. (NUM_EMPL. CREATE VIEW RENDIMIENTO_REPRESENTANTES SELECT NUM_EMPL. FROM RE PESTE NUM_EMPL NOMBRE 105 109 106 104 101 103 Bruno Arteaga María Jiménez Samuel Clavel Bernardo Sánchez Daniel Ruidrobo Pablo Cruz NOMBRE. como las basadas en consultas de agrupación. pero otras no. La mayor parte de las implementaciones comerciales de SQL tienen reglas de actualización de las vistas que resultan considerablemente más permisivas que el estándar de SQL1. VENTAS Y CUOTA porque se obtienen directamente a partir de la tabla fuente. El estándar SQL2 reconoció esto e incluye una definición más amplia de las vistas actualizables junto con una gran posibilidad de variación entre las marcas de SGBD. algunas vistas pueden admitir algunas de las operaciones de actualización. y la fila será visible mediante la vista REPESTE. OFICINA_REP OFICINA_REP 13 11 11 12 12 12 1 . Pero considérese lo que ocurre cuando se añade un representante nuevo con la instrucción INSERT: INSERT INTO REPESTE (NUM_EMPL. 21. DELETE Y UPDATE con significado para la vista en términos de la tabla fuente. Por ejemplo. el SGBD debe poder realizar un seguimiento cada columna que haya que actualizar hasta su columna fuente en la tabla fuente. y suelen ser bastante detalladas. NOMBRE. la vista RE PESTE. 0. En consecuencia. ( VENTAS) El SGBD añadirá la fila nueva a la tabla REPRESENTANTES subyacente. Crear una vista que muestre las ventas. FROM REPRESENTANTES CUOTA. 43. que está en la región Oeste.00) EDAD. no tienen sentido. Comprobación de las actualizaciones en las vistas (CHECK OPTION) Si se define una vista mediante una consulta que incluye una cláusula WHERE. VENTAS. ya que su cuarta columna es una columna calculada. OFICINA_REP. Además. 0. y algunas vistas pueden admitir actualizaciones de ciertas columnas. No obstante. VALUES (113. sólo las filas que cumplan la condición de búsqueda son visibles en la vista. Sin embargo. Por ejemplo. CREATE VIEW REPESTE AS SELECT FROM REPRESENTANTES WHERE OFICINA_REP IN (11. la fila recién insertada no cumple la condición de búsqueda de la vista. si se ejecuta esta consulta inmediatamente después de la instrucción INSERT: SELECT NUM_EMPL. DB2 (y otras implementaciones comerciales de SQL) permite las operaciones DELETE en esta vista. sólo contiene las filas de la tabla REPRESENTANTES con determinados valores de la columna OFICINA_REP: Actualizaciones de vistas en productos SaL comerciales Las reglas del estándar SQLl sobre las actualizaciones de las vistas son muy restrictivas. DB2 no permite la instrucción INSERT para la vista porque la inserción de valores en la columna DIFERENCIA no tendría ningún sentido. Ótras vistas pueden ser actualizables en una marca de SGBD. Las reglas concretas que determinan si una vista puede actualizarse varían de una marca de SGBD a otra. 11. Además. Se trata de una instrucción de SQL perfectamente legal. La mejor manera de aprender sobre la posibilidad qe actualización en cada SGBD es consultar el manual de usuario o experimentar con diferentes tipos de vistas. pero no son visibles mediante la vista. la cuota y la diferencia entre las dos para cada representante. Puede que otras filas estén presentes en las tablas fuentes de las que se obtiene la vista. y el SGBD insertará una nueva fila en la tabla REPRESENTANTES con los valores de las columnas especificados. 47. es posible definir operaciones INSERT.00) EDAD. obsérvese que cada fila de la vista puede seguirse hasta una sola fila de la tabla fuente (REPRESENTANTES). VENTAS) El estándar SQL1 prohíbe las actualizaciones de esta vista. 'Francisco Ruiz'. 13)· Se trata de una vista actualizable para la mayor parte de las implementaciones comerciales de SQL Se puede añadir un nuevo representante con esta instrucción IHEH: INSERT INTO RE PESTE (NUM_EMPL. Por este motivo. El valor (21) de su columna OFICINA_REP especifica la oficina de León. considérese esta vista: Crear una vista que muestre los representantes de la región Este. Si la vista supera esta prueba. OFICINA_REP. Manual de referencia Capítulo 14: Vistas 417 fa parecida. Sólo la columna DIFERENCIA no se puede actualizar. DIFERENCIA) AS (VENTAS . sencillamente. NOMBRE. pero no satisfacen todas las restricciones. que ya se describió en el apartado «Vistas horizontales» de este capítulo. parcialmente actualizables en otra y no actualizables en una tercera. pero no de otras.416 SOL. Algunas vistas. no pueden actualizarse en ningún SGBD porque las operaciones de actualización. VALUES (l14. VENTAS.CUOTA) CUOTA. DB2 permite las operaciones UPDATE de las columnas NUM_EMPL. 'Jacobo Rent'.

la . Otras implementaciones de SQL ofrecían una instrucción OROP VIEW independiente. las vistas subyacentes no se verifican. 12. casi siempre resulta buena idea especificar la opción de comprobación. El estándar SQL2 fonnalizó el soporte del descarte de las vistas mediante la instrucción OROP VIEW. 12. Por ejemplo. Esta opción se aplica cuando se crea la vista. todas las marcas principales de SGBD ofrecen esta posibilidad desde hace algún tiempo. Cuando se crea una vista actualizable como parte de un esquema de seguridad. no están accesibles para el usuario. Evita que las modificaciones hechas a través de la vista afecten a datos que. las dos filas desaparecidas aparecen en una consulta a la tabla subyacente: SELECT NUM_EMPL. incluidas sus tablas y sus vistas. i~nificativa a las operacionéSIÑsERT y UPDATE. 13) Cuando se solicita la opción de comprobación para una vista. Probablemente quede claro de esta discusión que la opción de comprobación puede añadir una sobrecarga . la actualización debe hacerse mediante una vista o tabla base subyacente.. Lo mismo ocurre si se modifica la asignación de oficina de alguno de los representantes que se hallan en la vista. Si una fila insertada o modificada no cumpliera la condición de búsqueda. y la operación no se llevaría a cabo. SQL comprueba de manera automática cada operación INSERT y UPDATE de la vista para asegurarse de que las filas resultantes cumplen el criterio de búsqueda de la definición de la vista. FROM REPRESENTANTES NUM_EMPL NOMBRE 105 Bruno Arteaga 13 OFICINA_REP 109 102 106 104 101 110 108 103 107 114 María Jiménez Susana Santos Samuel Clavel Bernardo Sánchez Daniel Ruidrobo Tomás Saz León Freire Pablo Cruz Neus Azcárate Francisco Ruiz 11 21 11 21 12 NULL 21 12 22 21 ción.. la opción de comprobación desempeña un papel importante en la garantía de la integridad de la base de datos. instrucción INSERT o UPDATE fa El estándar SQL2 especifica un perfeccionamiento más para la opción de comprobación: la opción de aplicación CASCAOED o LOCAL de la opción de comproba- Recuérdese que el estándar SQLI trataba al lenguaje de definición de datos de SQL como una especificación estática de la estructura de las bases de datos. El estándar SQL2 especifica CASCADED como valor predeterminado. sino en una o más vistas. lógicamente. y su definición no se basa en una tabla subyacente. 13) j . Por este motivo. . Las definiciones de estas vistas subyacentes podrían. el SOBD sólo verifica esa vista. si se pretendía aplicar la actualización a datos no visibles mediante la vista o intercambiar de hecho una fila de datos entre dos vistas. Cada una de las vistas subyacentes podrían tener especificada la opción de comprobación. Esta instrucción UPDATE: UPDATE RE PESTE SET OFICINA_REP = 21 WHERE NUM_EMPL = 104 modifica una de las columnas de la fila de Bernardo Sánchez y hace que desaparezca inmediatamente de la vista. La opción de comprobación se especifica en la instrucción CREATE VIEW. especialmente si se actualizan \ islas definidas con base en varias capas de definiciones de vistas subyacentes. Manual de referencia Capítulo 14: Vistas 419 la fila recién añadida no aparece en la vista. cualquier intento de actualizarla hace que el SGBD descienda por toda la jerarquía de definiciones de vistas en la que se basa y procese la opción de comprobación para cada vista en la que esté especificada. etc. También ofrece el control detallado de lo que sucede cuando los usuarios intentan descartar una vista y la definición de otra vista depende de ella. Si se crea la nueva vista WITH LOCAL CHECK OPTION. como puede verse en esta redefinición de la vista REPESTE: CREATE VIEW SELECT FROM WHERE WITH CHECK REPESTE AS REPRESENTANTES OFICINA_REP IN OPTION Eliminación de vistas (DROP VIEW) (11.418 SOL. algunas marcas de SOBD también utilizaban la instrucción DROP TABLE para descartar vistas. como mínimo. si se emplea la cláusula WITH CHECK OPTION sin especificar LOCAL ni CASCADEO. No obstante. No obstante. basarse en otras vistas. El hecho de que las filas desaparezcan de la vista como consecuencia de una instrucción INSERT o UPDATE resulta desconcertante. SQL permite especificar este tipo de verificación de integridad para las vistas creando la vista con una opción de comprobación (Check option). a su vez. Si se crea la nueva vista WITH CASCADED CHECK OPTION. para empezar. el estándar SQLl no ofrecía la posibilidad de descartar las vistas cuando ya no se necesitaban. Después de todo. NOMBRE. Por supuesto. supóngase que se han creado dos vistas de la tabla REPRESENTANTES mediante estas dos instrucciones CREATE VIEW: CREATE VIEW RE PESTE AS SELECT PROM REPRESENTANTES WHERE OFICINA_REP IN (11. Dado que las vistas se comportan corno las tablas y ninguna vista puede tener el mismo nombre que una tabla. Probablemente se desee que el SOBD detecte y evite que este tipo de INSERT o de UPOATE tenga lugar mediante esta vista.

6 muestra este proceso de materialización. Materialización de vistas para el procesamiento de consultas. si la vista es un subconjunto sencillo . cuando se define la visla materializada). el SOBD ejecuta una vez la consulta que define la vista (generalmente. Cuando se define una vista como vista materializada. Es decir. UPDATE o DELETE) se ejecutan siempre de esta manera -traduciendo la operación en una o varias operaciones sobre las tablas fuente. . Por el contrario. Si la definición de la vista es relativamente sencilla (por ejemplo. resulta bastante sencillo para el SGBD la traducción de las operaciones de la base de datos sobre la vista en operaciones sobre las tablas subyacentes. de cada marca de SGBD. el SGBD llevará a cabo la traducción sobre la marcha. la materialización del contenido de las vislas puede ser una operación que suponga una elevada sobrecarga.7 muestra la operación del SGBD con vistas materializadas. el SGBD llevará realmente a cabo la consulta que define la vista y almacenará el resultado de esa consulta en una tabla temporal de la base de datos. y luego mantiene de manera permanente esta copia de los datos de la vista. Evidentemente. ya que la opción RESTRICT indica al SOBD que s610 debe eliminar la vista si ninguna otra depende de ella. de filas y columnas de una sola tabla. en aras de la compatibilidad con versiones anteriores de sus productos distribuidas antes de la publicación del estándar SQL2.'. el SELEC" vista FROH L P". Cuando ha concluido el procesamiento de la consulta. Las vistas materializadas ofrecen un balance entre la eficiencia de las actualizaciones de los datos contenidos en la vista y la -eficiencia de las consultas de los -- SGBO Tablas base Vistas materializadas * Conceptualmente. Esto ofrece una precaución añadida contra los efectos secundarios no deseados de las instrucciones DROP VIEW. En esta situación. o una reunión sencilla basada en relaciones de claves externas). la siguiente instrucción DROP VIEW elimina de la base de datos las dos vistas: RE PESTE. puede que el SGBD necesite materializar realmente la vista para llevar a cabo una consulta sobre ella.420 SOL. en este caso. esta instrucción OROP VIEW: DROP VIEW EASTREPS RESTRICT falla con un mensaje de error. Según el estándar SQL2. La Figura 14. almacena el resultado (es decir. el SOBD debe examinar de manera automática\cada cambio de los datos de las tablas fuente subyacentes y realIzar las modificacibhes en los datos de la vista materializada. Si la definición de la vista es más compleja.. Para conservar la exactitud de los datos de la vista materializada. como procesa las consultas o actualizaciones de la base de datos. Manual de referencia Capítulo 14: Vistas 421 CREATE VIEW REPNAVARRA AS SELECT FROM REPESTE WHERE OFICINA_REP : 11 A modo de ejemplo. La Figura 14. En general. los datos que aparecen en la vista) en la base de datos. sino también todas las vistas que dependan de su definición. SGBD lleva a cabo la consulta solicitada contra la tabla temporal para obteñer el resultado solicitado. una vista es una tabla virtual de la base de datos. Los datos de las filas y columnas de la vista no se almacenan físicamente en la base de datos: se obtienen de datos reales de las tablas fuente subyacentes. Cuando el SGBD debe procesar una consulta sobre la vista materializada ya tiene los datos a mano y puede procesarla con gran eficiencia. sin necesidad de que se especifique una opción de manera explícita. a partir de los datos de la tria temporal • Paso 3: Eliminar la tabla temporal • \ Figura 14. Si la carga de trabajo habitual de una base de dalaS contiene muchas consultas que exigen la materialización de vistas. operación a operación. El estándar SQL2 exige que se especifique RESTRICT o CASCADE. Para afrontar este problema algunos productos comerciales de SGBD incluyen las vistas materializadas. puede reducirse espectacularmente la capacidad total de flujo del SGBD. Entonces. Pero muchos productos comerciales· de SQL admiten una versión de la instrucción DROP VIEW. El comportamiento concreto de las vistas dependientes depende. el SOBO descarta la tabla temporal.6. se define la vista REPNAVARRA e~ términos de la vista aunque también se podría haber definido en términos de la tabla subyacente. DROP VIEW RE PESTE CASCADE La opción CASCADE indica al SGBD que no sólo debe eliminar la vista citada. Crear una tabla lemporal que contenga los datos ~ !'i¡F~fi~" '~ Paso 2: Resultado de fa consulta~ Responder a la consulta . las operaciones que actualizan la base de datos a través de una vista (operaciones INSERT.

datos de la vista. Resumen Las vistas permiten redefinir la estructura de las bases de datos. • Las vistas materializadas pueden mejorar la eficiencia del procesamiento de la base de datos en situaciones en las que hay un elevag.7. • Se puede hacer referencia a las vistas en las instrucciones SELECT. en realidad. igual que las tablas verdaderas. ya que el SGBD debe realizar mucho trabajo sobre la marcha para procesar las consultas. Figura 14. Las vistas materializadas invierten este equilibrio de trabajo. En las vistas no materializadas las actualizaciones de las tablas fuente de la vista no se ven afectadas por la definición de la vista. • Las vistas pueden ser subconjuntos sencillos de filas o columnas de una sola tabla. DELETE o UPDATE igual que a las tablas auténticas. ya que la vista materializada se representa en la base de datos de la misma manera que las tablas verdaderas. Sin embargo. INSERT. Manual de referencia Capítulo 14: Vistas 423 SGBD Tabla base UPDATE SELECT FROM vista Vista ¿\o~ '3\í\''3 \.o'volumen de actividad de consultas y una actividad de actualizaciones rélativamente reducida. ya que el SGBD debe calcular el efecto de esas actualizaciones y modificar la vista materializada a la misma velocidad que las consultas de las tablas verdaderas de la base de datos. • Las vistas suelen emplearse para simplificar la estructura aparente de las bases de datos. Parece que las vistas contienen filas y columnas de datos. el resultado de la consulta. Cuando se define una vista materializada. para simplificar consultas y para proteger ciertas filas o columnas de un acceso no autorizado.. las actualizaciones de las tablas fuente de la vista resultan mucho menos eficientes que las actualizaciones de las tablas normales de la base de datos. dando a cada usuario una vista personalizada de la estructura y del contenido de la base de datos: I J i . siguen adelante a la velocidad de procesamiento normal del SGBD. se trata de vistas de sólo lectura. Por tanto.422 SOL.'0 e' INSERT materializada Actualizacione Paso 1: Resultados de la consulta 1 UPDATE ActualizaCio nes Responder a la consulta a partir de Jos datos de la vista materializada • Las vistas son tablas virtuales definidas por una consulta. las consultas de las vistas no materializadas resultan mucho menos eficientes que las consultas de las tablas normales de la base de datos. las vistas más complejas no pueden actualizarse. Operación con vistas materializadas. pueden resumir tablas (vistas agrupadas) o extraer sus datos de dos o más tablas (vistas de reunión). las vistas materializadas resultan más útiles cuando el volumen de actualizaciones de los datos subyacentes es relativamente pequeño y el volumen de las consultas a la vista es relativamente elevado.0\\. pero los datos visibles mediante las vistas son. Sin embargo.

El lenguaje SQL define un marco general para la seguridad de la base de datos. El SGBD autoriza o prohíbe cada acción en función del usuario que realiza la solicitud. ya que SQL interactivo hace muy sencillo el acceso a las bases de datos. pero debe permitírseles el empleo de programas de aplicación que actualicen esas tablas. • En algunas tablas el acceso debe restringirse por columnas. Cada vez que el SGBD recupera. d~ases segurj~ Conceptos de seguridad en SOL La implementación de un esquema de seguridad y hacer que se cumplan las restricciones de seguridad son responsabilidades del software SGBD. El esquema de seguridad SQL se basa en tres conceptos fundamentales: • Usuarios.CAPíTULO 15 Seguridad en SOL Cuando se confían los datos a un sistema de gestión de datos. elimina o actualiza datos lo hace en nombre de algún usuario. Las exigencias de seguridad de las bases de datos de producción típicas son muchas y variadas: • Los datos de cualquier tabla deben ser accesibles a algunos usuarios. pero se debe evitar el acceso de otros usuarios. La seguridad resul~ ta de especial importancia en los SGBD basados en SQL. 425 . Los aclares de la base de datos. la dad de los datos almacenados es una preocupación importante. El esquema de seguridad de SQL descrito en este capítulo ofrece estos tipos de protección para los datos de las bases de datos relacionales. • Se debe permitir que algunos usuarios actualicen los datos de una tabla concreta. y las instrucciones SQL se utilizan para especificar las restricciones de seguridad. • Se debe negar a algunos usuarios el acceso a algunas tablas mediante SQL interactivo. a otros s6lo debe permitírseles que recuperen datos. inserta.

Al establecer el esquema de seguridad de una base de datos se utiliza la instrucción GRANT de SQL para especificar los usuarios que tienen cada privilegio sobre cada objeto de la base de datos. algunas \columnas León Freire. a continuación se muestra una instrucción GRANT que permite a Samuel Clavel recuperar e insertar datos en la tabla OFICINAS de la base de datos de ejemplo: Dejar que Samuel Clavel recupere e inserle datos en la tabla GRANT SELECT. Por ejemplo. pero también se pueden proteger otros objetos. . las restricciones a los nombres que pueden escogerse como identificadores de usuario varían de implementación a implementación. jefe de la oficina de León ANTES SELECT . Cada instrucción de SQL ejecutada por el SGBD se lleva a cabo en nombre de un identificador de usuario concreto. \. La mayor parte de los usuarios tiene permiso para utilizar algunos objetos de la base de datos. los identificadores de usuario los asigna el administrador de la base de datos. que identifica al usuario que creó y posee la base de datos. como los formularios. h aJg~n/ fila¿ Identificadores de usuario Cada usuario de una base de datos basada en SQL suele tener asignado un identificador de usuario. En las bases de datos de producción. Manual de referencia Capítulo 15: Seguridad en SOL 427 • Objetos de la base de datos. INSERT ON OFICINAS TD SAMUEL OFICINAS. REVOKE: Departamento de procesamiento Retirar los privilegios concedidos anteriormente a Samuel Clavel. los programas de aplicación y bases de datos enteras. en los apartados «Concesión de privilegios» y «Retirada de privilegios».1. pero se les prohibirá el empleo de otros. un nombre corto que identifica al usuario ante el software del SGBD. ~~ SELECT ON OFICINAS FROM SAMUEL \. pero que carezca de permiso para ejecutar DELETE o UPOATE en esa misma tabla. En la práctica. jefe de la oficina de Castellón SE~ t! comPleto~i~ ~ Samuel Clavel VP ventas Gonzalo Walker VP marketing Figura 15. Acceso. Elementos a los que se puede aplicar la protección de la seguridad de SQL. Una vez concedidos. En algunos sistemas SGBD de centrales de LEW Tabla OFICINAS Acceso a todos los datos '-J'-_-"--_-' filas algUnaS~ Bernardo Sánchez. Esquema de seguridad para la base de datos de ejemplo. los privilegios pueden cancelarse posteriormente con la instrucción (SAMUEL). En ¡as bases de datos de propósito especial (por ejemplo. INSERT ~i~ Tabla PEDIOOS SELECT. Puede que cada base de datos de las computadoras personales tenga un solo identificador de usuario. Departamento de cuentas REVOKE SELECT. La seguridad suele aplicarse a las tablas y a las vistas. • Privilegios.1 muestra el modo en que se pueden emplear estos conceptos de seguridad en un esquema de seguridad para la base de datos de ejemplo. Puede que un usuario tenga permiso para ejecutar SELECT e INSERT en las filas de una determinada tabla. por ejemplo. ( I La instrucción GRANT especifica una combinación de identificador de usuario objeto (la tabla OFICINAS) y privilegios (SELECT e INSERT). Acciones que se les permite llevar a cabo a los usuarios con cada objeto de la base de datos. []lITID Disponible para todos los usuarios Acceso completo \ a todos los dalas ' \ ( Tabla CLIENTES Tra~b~la=RE=p~RE=S=ENT~ 1- Las instrucciones GRANT y REVOKE se describen con detalle más adelante en este capítulo. Estas bases de datos suelen operar como si s610 hubiera un identificador de usuario. Los identificadores de usuario se hallan en el corazón de la seguridad de SQL.~. La Figura 15. Puede que otro usuario tenga un conjunto diferente de privilegios. las diseñadas para incrustarse dentro de las aplicaciones o de los sistemas de propósito especial) puede que no haga falta la sobrecarga adicional asociada con la seguridad de SQL. algunas SELECT/ completo \columnas I UPDATE INSERT.426 SOL. El identificador de usuario determina si el SGBD autoriza la ejecución de la instrucción o la prohibe. El estándar SQLl permitía identificadores de usuario de hasta dieciocho caracteres y exigía que fueran nombres de SQL válidos.

las técnicas concretas empleadas. y concluye cuando termina el programa de aplicación. En otras situaciones. En SQL interactivo la sesión comienza cuando se inicia el programa de SQL interactivo. los identificadores de autorización pueden asociarse con programas y grupos de programas. como puede verse a continuación: SQLPLUS SANTI/TIGRE Figura 15.428 SOL Manual de referencia Capítulo 15: Seguridad en SOL 429 computación. en efecto. En los servidores de bases de datos. la práctica más habitual es asignar un identificador de usuario diferente a cada persona. implementan su propia seguridad de identificador de usuario y contraseña. Por ejemplo. Si se utiliza una entrada de datos basada en formularios o un programa de consulta. puede preverse un programa de generación de informes para que se ejecute cada tarde a una hora predeterminada. Generalmente hay que proporcionar tanto un identificador de usuario como la contraseña asociada al comienzo de cada sesión. En cada una de estas situaciones. identificador de autorización es un término más exacto. la sesión comienza cuando el programa de aplicación conecta con el SGBD. se está autorizado a utilizar la identificador de usuario que se proporciona. es conveniente limitar los identificadores de usuario a ocho caracteres o menos. como en la Figura 15. Obsérvese que a todos los usuarios del departamento de procesamiento de pedidos puede asignárseles el mismo identificador de usuario. los identificadores de usuario pueden tener hasta treinta caracteres. identificador de autorización es un término más exacto y que lleva a menos confusión que identificador de usua- rio. Aunque los identificadores de usuario y las contraseñas son frecuentes en la mayor parte de los productos de SQL. Hay situaciones. y dura hasta que se sale del programa. El SGBD comprueba la contraseña para asegurarse de que. para lo cual hay que establecer el identificador de usuario. La Figura 15. En Sybase y SQL Server. En los programas de aplicación que utilizan SQL para programación. El estándar ANSI/ISO de SQL utiliza el término identificador de autorización en lugar de identificador de usuario. ya que se puede tener acceso a las bases de datos de muchas maneras diferentes. hay que establecer el modo en que el SGBD determina el identificador de usuario. el mecanismo concreto para la asociación entre Jos identificadores de usuario y las instrucciones de SQL es ajeno al ámbito del estándar. --L . ya que han de tener los mismos privilegios en la base de datos. No obstante. Finalmente. cuando se escriben instrucciones de SQL en una utilidad de SQL interactivo. Todas las instrucciones de SQL utilizadas durante la sesión se asocian con el identificador de usuario especificado para la sesión. más que con usuarios humanos. y la mayor parte de los SGBD basados en SQL utilizan el término identificador en su documentación.2. Algunas marcas de SGBD.2. especialmente las que están disponibles en muchas plataformas de sistemas operativos diferentes. puede que una sola persona utilice dos o tres identificadores de usuario. ya que el papel del identificador es determinar las autorizaciones o privilegios en la base de datos. Autenticación de usuarios Departamento de procesamiento de pedidos Departamento de cuentas [~~~J Identificador de usuario: USUARIOPP Directores de oficina [JI] Identificador de usuario: USUARIOCU Vicepresidentes Samuel Clavel VP ventas Identificador de usuario: SAMUEL León Freire Identificador de usuario: LEÓN ~ Bernardo Sánchez Identificador de usuario: BERNARDO ~ ~ Gonzalo Walker VP marketing Identificador de usuario: GONZALO ~ El estándar SQL especifica que los identificadores de usuario proporcionan la seguridad de la base de datos. Técnicamente. en la que el identificador de usuario del sistema en que se trabaja de manera activa puede ser diferente del identificador de usuario establecido en el sistema en que reside la base de datos. cuando se utiliza el programa de SQL interactivo de Oracle. hay que establecer cómo se manejan los identificadores de usuario cuando se tiene acceso a la base de datos mediante una red. denominado SQLPLUS. para especificar el identificador de usuario y la contraseña varían de un producto a otro. los identificadores de usuario no pueden tener más de ocho caracteres. situación en la)que no hay ningún usuario humano. y este término se encontrará ocasionalmente en otra documentación sobre SQL. hay que establecer el modo en que el SGBD determina el identificador de usuario que está asociado con cada instrucción. La mayor parte de las implementaciones comerciales de SQL establece un identificador de usuario para cada sesión de la base de datos. Asignación de identificadores de usuario para la base de datos de ejemplo. no obstante. Por ejemplo. Si la portabilidad es importante.2 muestra a varios usuarios que necesitan tener acceso a la base de datos de ejemplo y se les asignan identificadores de usuario típicos. en que tiene sentido asignar el mismo identificador de usuario a diferentes usuarios. hay que especificar un nombre de usuario y la contraseña asociada en el comando que inicia el programa. En las bases de datos de producción.

igual que las dos personas del departamento de cuentas. Los administradores de bases de datos de DB2 pueden configurar DB2 de modo que. simplifican la administración de los privilegios concedidos a los grupos de usuarios. Una vez más. incluidas Sybase y SQL Server. se pueden manejar de dos maneras grupos de usuarios con necesidades parecidas: • Se puede. • Se puede asignar un identificador de usuario diferente a cada persona del grupo. con este esquema. por lo que el SGBD debe determinar y autentificar el identificador de usuario de cada programa de aplicación que intente tener acceso a la base de datos. El SQL interactivo de DB2. Para los programas más especializados o escritos a medida. que trata el SQL para programación. El estándar SQL2 también permite que los programas utilicen identificadores de autorización asociados con conjuntos específicos de instrucciones de SQL (denominados módulos). Varias marcas de SGBD. aunque esos usuarios no se hallen autorizados de otro modo para tener acceso a los datos objetivo. pero adopta otro enfoque. las persa as que comparten el identificador de usuario no pueden distinguirse unas de tras en las pantallas de los operadores del sistema ni en los informes del SGBD. DB2 también alberga los grupos de usuarios. En los grandes sistemas de lBM. 1 El esquema que se escoja depende de los equilibrios entre la base de datos concreta y la aplicación. 10 que hace la administración de la seguridad tediosa y susceptible de errores. Este esquema permite diferenciar los usuarios en los informes generados por el SGBD y permite establecer privilegios diferentes para cada usuario posteriormente. Los identificadores de grupo. Albergan identificadores de grupo. Otras muchas marcas de SGBD. mediante un cuadro de diálogo en la pantalla.2. las tres personas del departamento de procesamiento de pedidos forman un grupo de usuarios natural. también acepta un nombre de usuario y una contraseña. hay que proporcionar un nombre de usuario y una contraseña válidos para UNIX para obtener acceso. Para iniciar la utilidad de SQL interactivo de logres basta con dar el comando: ISQL BnVENTA5 donde BDVENTAS es el nombre de la base de datos de Ingres que se desea emplear. el identificador de usuario puede resultar evidente a partir de la aplicación que hay que ejecutar y venir indicado en el programa. resulta frecuente que el programa pida al usuario el identificador de usuario y la contraseña al comienzo de la sesión. cuando se inicia la sesión en un sistema informático basado en UNIX. por tanto. ya que permite especificar los privilegios de acceso a datos una sola vez par el único identificador de usuario. De acuerdo con el esquema de seguridad de SQL de ANSI/ISO. Las características concretas de la seguridad de SQL para los programas de acceso a la base de datos se describen en el Capítulo 17.430 SOL. En cada caso el SGBD valida el identificador de usuario (SANTI) y la contraseña (TIGRE) antes de comenzar la sesión interactiva de SQL. como los de introducción de datos o los de consulta. Con este mecanismo se puede otorgar a un programa la posibilidad de llevar a cabo operaciones muy concretas en la base de datos en nombre de muchos usuarios diferentes. Se pueden conceder privilegios tanto a los identificadores de usuario individuales como a los identificadores de grupo. Se trata de una posibilidad conveniente que está abriéndose camino en las principales implementaciones de SQL. El nombre de inicio de sesión de TSO se transforma automáticamente en el identificador de usuario de DB2 para la sesión de SQL interactivo. utiliza una técnica parecida. que se ejecuta bajo MVSrrSO. La seguridad de SQL también se aplica al acceso mediante programación a las bases de datos. denominado ISQL. incluidas Ingres e Informix. Manual de referencia Capítulo 15: Seguridad en SOL 431 El programa interactivo de SQL de Sybase. Para los programas de utilidades más utilizados. como puede verse en la Figura 15. No obstante. que identifican los grupos de identificadores de usuario relacionados. cuando se realice la primera conexión a DB2 y se proporcione el identificador de usuario (conocido como identificador de autorización primario). no forman parte del estándar y puede que los diseños de bases de datos que los utilicen no sean portables a otras marcas de SGBD. Ingres obtiene de manera automática el nombre de usuario de UNIX y lo convierte en el identificador de usuario de lngres para esa sesión. tanto primarios como secundarios. Dentro de cada grupo todos los usuarios tienen necesidades idénticas de acceso a los datos y deben tener idénticos privilegios. Por tanto. no hace falta especificar un identificador de usuario y una contraseña diferentes. verifica los de todos los identificadores de autorización. Cuando DB2 comprueba posteriormente los privilegios. asignar el mismo identificador de usuario a todas las personas de un grupo. hay que especificar individualmente los privilegios de cada usuario. No obstante. DB2 busque de manera automática un conjunto de identificadores de usuario adicionales (conocidos como identificadores de autorización secundarios) que se puedan utilizar. en lugar de los identificadores de usuario de las personas que ejecuten el programa. ofrecen una tercera alternativa para el tratamiento de los grupos de usuarios parecidos. utilizan los nombres de usuario del sistema operativo de la computadora anfitriona como identificadores de usuario de la base de datos. con este formato de comando: ISQL IUSER=SANTI /PASSWORD=TIGRE Grupos de usuarios Las grandes bases de dalos de producción suelen tener grupos de usuarios con necesidades parecidas. las técnicas y reglas para el establecimiento del identificador de usuario varían de una marca de SGBD a otra. Por ejemplo. los administradores de bases de datos de DB2 suelen configurar . y los usuarios pueden llevar a cabo acciones en la base de datos si lo autorizan los privilegios de su identificador de usuario o los de su identificador de grupo. No obstante. Este esquema simplifica la administración de la seguridad. En la base de datos de ejemplo.

los procedimientos almacenados son objetos importantes de la base de datos. Añadió nuevas posibilidades a los privilegios INSERT y UPDATE de SQLl. Las ampliaciones de SQL2 de los privilegios INSERT y UPDATE son directas. por ejemplo. pero lo hace sin añadirlos al mecanismo de identificadores de usuario. Los ajustes de la columna VENTAS para los empleados ya existentes se restringirá de manera parecida. Pero debería ser la responsabilidad del VP de ventas definir la columna . esta posibilidad no se necesita realmente. El estándar SQL2 amplió los privilegios básicos de SQLl en varias dimensiones. La base de datos de ejemplo ofrece un ejemplo sencillo del modo en que esta posibilidad puede resultar útil. El estándar SQLl especificaba dos tipos de objetos de seguridad: las tablas y las vistas. El estándar SQL2 no permite que se aplique el privilegio SELECT a columnas concretas.CUOTA de cada empleado nuevo. Con este privilegio se puede especificar la tabla o viJ. el enfoque de DB2 proporciona de hecho identifi~ cadores de grupo. En DB2 de IBM. una vez que se ha concluido el papeleo de la contratación. El estándar SQL2 amplió las protecciones de seguridad para incluir otros objetos. Por tanto. Prácticamente todos los productos comerciales de SQL albergan estos cuatro privilegios. El director de recursos humanos debe proporcionar el número de empleado. • El privilegio INSERT permite insertar filas nuevas en una tabla o vista. como las nuevas posibilidades INSERT y UPDATE. en lugar de aplicarse a toda la tabla. un privilegio SELECT sobre columnas con- . Con el empleo de las nuevas posibilidades de SQL2 se puede implementar este esquema concediendo al director de recursos humanos privilegios INSERT sobre las columnas correspondientes. permitiendo actualizaciones de esas columnas pero impidiéndolas en el resto. Manual de referencia Capítulo 15: Seguridad en SOL 433 los identificadores de autorización secundarios de modo que sean iguales que los nombres de los grupos utilizados por el servicio de control de acceso a recursos (Resource Access C011lrol Facility.se aplica de manera casi universal. secuencias de ordenación y traducciones. El acceso a las tablas o vistas puede permitirse para ciertos identificadores de usuario y prohibirse para otros. el servicio de seguridad para grandes sistemas de IBM. Las demás columnas (como VENTAS y CUOTA) de los empleados recién insertados tendrán inicialmente el valor NULL. El privilegio UPDATE puede restringirse a columnas concretas de la tabla o vista. Los administradores de las bases de datos pueden conR ceder permiso a algunos identificadores de usuario para crear tablas nuevas en un espacio de tablas determinado. La mayor parte de los productos comerciales de SQL albergan los objetos de seguridad adicionales. cada tabla y cada vista pueden protegerse individualmente. También añadió un nuevo privilegio USAGE que controla el acceso a las nuevas estructuras de las bases de datos de SQL2 de dominios. Otras implementaciones de SQL albergan otros objetos de seguridad. No obstante. limitando la vista a columnas concretas )j definiendo luego los privilegios correspondientes sobre la vista. Con este privilegio se puede especificar la tabla o vista de la cláusula FROM d~ una instrucción DELETE. El esquema de seguridad de SQL determina los usuarios que pueden crear y descartar procedimientos almacenados y los usuarios a los que se les permite ejecutarlos. En las bases de datos de SQL Server. ya que se puede conseguir el mismo efecto definiendo una vista de la tabla. • El privilegio DELETE permite eliminar filas de una tabla o vista. Con este privilegio se puede especificar la tabla o vista de la cláusula FROM de una instrucción o subconsulta SELECT. Privifegios ampliados de SQL2 Objetos de seguridad Las protecciones de la seguridad de SQL se aplican a objetos concretos contenidos en las bases de datos. Con el privilegio UPDATE sobre las demás columnas. conjuntos de caracteres. Sin la posibilidad de especificar estos privilegios sobre columnas concretas habría que relajar las restricciones de acceso a las columnas o definir vistas extrañas de la tabla simplemente para restringir el acceso. el nombre y demás información. Añadió un nuevo privilegio REFERENCES que restringe la capacidad de los usuarios para crear referencias a las tablas a partir de claves externas de otras tablas. Por tanto. Estos privilegios pueden concederse ahora para columnas concretas de cada tabla. Teóricamente. incluidos los dominios y los conjuntos de caracteres definidos por el usuario. y denegárselo a otros identificadores de usuario. Privilegios El conjunto de acciones que puede llevar a cabo un usuario con un objeto de la base de datos se denomina privilegios para el objeto. Supóngase que se quisiera conceder al director de recursos humanos la responsabilidad de insertar los empleados nuevos en la tabla REPRESENTANTES. El estándar SQLI especifica cuatro privilegios básicos para tablas y vistas: • El privilegio SELECT permite recuperar datos de una tabla o vista. el VP de ventas puede definir la cuota correspondiente. RACF). el esquema de seguridad de SQL subyacente -de privilegios concretos aplicados a objetos determinados. Con este privilegio se puede especificar la tabla o vista de la cláusula INTO de una instrucción INSERT. No obstante.ta objetivo de una instrucción UPDATE. concedidos o retirados mediante las mismas instrucciones de SQL. los espacios de tablas físicos en que se almacenan las tablas se tratan como objetos de seguridad. • El privilegio UPDATE permite modificar filas)de una tabla o vista.432 SOL. y añadió un nuevo tipo de protección para el acceso a las tablas o vistas. hay que seguir especificándolo para toda la tabla.

El empleado puede crear una tabla nueva. Cuando se crea una vista con la instrucción CREATE VIEW. el SGBD otorga al creador el privilegio SELECT para la vista de manera automática. CHECK ((5ELECT CUOTA FROM REPRESENTANTES WHERE TITLE = 'VP Ventas') BETWEEN 400000 AND 500000)) tiene el privilegio REFERENCES para esa columna. Una tabla nueva definida con una restricción de comprobación en una columna puede crear problemas todavía más serios. Conserva más sencilla la estructura de la base de datos (menos definiciones de vistas) y concentra el esquema de seguridad más estrictamente en un solo sitio (las instrucciones GRANT). Otros privilegios Debido a la restricción de la columna vinculada con un valor de la tabla REsi esta instrucción tiene éxito. supóngase que el empleado intenta ejecutar esta instrucción CREATE TABLE: CREATE TABLE XYZ (PROBAR DINERO. el estándar SQL2 especifica el privilegio USAGE para controlar el acceso a los dominios (conjuntos de valores legales para las columnas). Podría suponerse que. El nuevo privilegio REFERENCES de SQL2 trata con un problema de seguridad de SQL más sutil planteado por las posibilidades de las claves externas y las restricciones de comprobación de SQL2. INSERT. Las instrucciones INSERT que tengan éxito indicarán al empleado que ha descubierto un número de empleado válido. UPDATE y cualesquiera otros privilegios albergados por el SGBD). significa que el VP de ventas tiene una cuota en el rango especificado. para identificadores de usuario individuales. además de los privilegios básicos SELECT. Privilegios de propiedad Cuando se crea una tabla con la instrucción CREATE TABLE. con una columna que se defina como clave externa de la tabla REPRESENTANTES. Para crear la vista con éxito. Los demás usuarios no tienen inicialmente ningún privilegio sobre la tabla recién creada. hay que otorgarles privilegios de manera explícita. a la simplificación de la administración de las grandes bases de datos corporativas que utilizan y modifican muchos equipos de desarrollo diferentes. Oracle y las bases de datos de grandes sistemas de IBM albergan los privilegios ALTER e INDEX para las tablas. No suelen presentar el mismo tipo de problemas de seguridad que los privilegios de acceso a tablas y columnas. incluidas Sybase y SQL Server. con el privilegio USAGE sobre un dominio. Si hay que concederles acceso a la tabla. se puede definir una tabla nueva con una columna cuyo tipo de datos se defina como ese dominio. como objetivo de una referencia de clave externa o en una restricción de comprobación. no hay manera· de que determine los números de empleado utilizados ni si se ha contratado a algún empleado nuevo. DELETE. Varias de las principales marcas de SOBD. Sin el privilegio no se puede crear una definición de columna de ese tipo. Empleando la base de datos de ejemplo como modelo. Al igual que los privilegios INSERT y UPDATE. DELETE y UPDATE). de los conjuntos de caracteres definidos por los usuarios. el usuario que la crea se transforma en el propietario de la vista. permiten especificar privilegios SELECT sobre columnas concretas. hasta que haya determinado la cuota correspondiente. DELETE y UPDATE. utilizando la misma sintaxis que para las instrucciones UPDATE e INSERT sobre columnas concretas. el estándar SQL2 especifica el nuevo privilegio REFERENCES. dado este esquema de seguridad. el SOBO sólo otorga el privilegio sobre la vista si ya se tiene ese mismo privilegio sobre todas las tablas fuente de la vista. los usuarios con el privilegio INDEX pueden crear un índice para esa tabla con la instrucción CREATE INDEX. esto no es estrictamente cierto. Estos privilegios están dirigidos.) Con esta nueva tabla el empleado puede intentar simplemente insertar filas nuevas con valores diferentes en la columna de la clave externa. pero no recibe necesariamente privilegios plenos sobre ella. las que fallen. representarán números de empleado no válidos. El usuario sólo está autorizado a crear tablas nuevas que hagan referencia de alguna manera a una columna ya existente (por ejemplo. Para eliminar este acceso clandestino a los datos. empleando la instrucción GRANT. supóngase que un empleado tiene la posibilidad de crear una tabla nueva en la base de datos (por ejemplo. Manual de referencia Capítulo 15: Seguridad en SOL 435 cretas puede ser un enfoque mucho más directo. el privilegio REFERENCES se concede para columnas concretas de la tabla. Si no tiene éxito. como en los ejemplos anteriores) si PRESENTANTES. Muchos productos comerciales de SOBO ofrecen privilegios adicionales sobre tablas y vistas. sobre todo. El privilegio USAGE es un conmutador sencillo que permite o impide el empleo de estos objetos de las bases de datos de SQL2. el usuario que la crea se transforma en su propietario y recibe privilegios plenos para la tabla (SELECT. . sólo el propietario puede utilizar las instrucciones ALTER TABLE Y CREATE INDEX. por tanto. En las bases de datos que todavía no implementan el privilegio REFERENCES pero admiten claves externas o restricciones de comprobac~ón. Por ejemplo. Por ejemplo. Los usuarios con el privilegio ALTER sobre una tabla concreta pueden utilizar la instrucción ALTER TABLE para modificar la definición de esa tabla. No obstante. Finalmente. Para cada uno de los demás privilegios (INSERT. se utiliza a ve_ces con esta función el privilegio SELECT. El estándar SQL2 incluye una nota que indica que se pretende considerar también esta posibilidad para futuras actualizaciones del estándar. una tabla que contenga información sobre los productos nuevos) pero no tiene acceso a la información sobre empleados de la tabla REPRESENTANTES. hay que tener ya el privilegio SELECT sobre cada una de ¡as tablas fuente de la vista. el empleado puede seguir probando instrucciones CREATE TABLE parecidas. de las secuencias de ordenación y de las traducciones. En las marcas de SOBO que no admiten los privilegios ALTER e INDEX. por el nombre. Por ejemplo. números de empleado válidos-. INSERT. (Recuérdese que esto significa que los únicos valores legales para esta columna son los valores de la clave primaria de la tabla REPRESENTANTES --es decir.434 SOL.

las vistas también desempeñan un papel fundamental en la seguridad de SQL.4... Manual de referencia Capítulo 15: Seguridad en SOL 437 Con frecuencia se admiten privilegios adicionales para los objetos de seguridad del SGBD distintos de las tablas y las vistas.' .' 13 11 11 ./.// x Sin acceso .OO€ 186.ooo./" NUlLEMPL /"..Iinte LeOa Freire " '" " 33 n " " . y luego conceder a cada jefe de oficina acceso a la vista correspondiente. Este ejemplo utiliza una vista vertical para restringir el acceso a columnas concretas. el privilegio USE....""."'S. REPRESENTANTES Los jefes de ventas de cada región deben rener acceso completo a los dalOs de de los representantes asignados a esa región. Sybase y SQL Server admiten el privilegio EXECUTE para los procedimientos almacenados.OOO. VENTAS 102 106 ".865. Empleo de vistas para restringir el acceso a columnas."/ .00€ JOO.Ca€ 350000.".00€ 142.. USUARlOOCU \ ~ 1J O SELECT Vista INFOREP N!Jl'l DlP¡' ~.00€ 15. La utilidad de las vistas para la implementación de la seguridad de SQL queda limitada por las dos restricciones fundamentales ya descritas en el Capítulo 14: • Restricciones de actualización../.OO€ 392125. el cual determina si el usuario está autorizado a ejecutar ese procedimiento almacenado.'./lria Ji..OO€ 299. DB2 admite.// El personal del departamento de cuentas debe poder recuperar los números de empleado. /"'.OS 3DS. las vistas pueden ser mucho más complejas que los meros subconjuntos de filas y columnas de una sola tabla que pueden verse en estos ejemplos./ I.00€ 474./. . Las vistas horizontales también son efectivas para hacer que se cumplan las reglas de seguridad.000./.. pero no a sus tablas fuente.OO€ 22 RepresC1Itanta Rl!present. Por tanto.'" .436 SOL.. se puede conceder a los REPOESTE./" /. /~' .} 110 102 lO' RIOCU..OOO./'/ .-.ante U-NOV·88 10' '" Tabla REPRESENTANTES Figura 15. lO' Aneaga l\. Por ejemplo.~iel llui4robo Toais su Pabl<o en:: Neus Az<:.OO€ 361.3. Daniel Ruidrobo Tom!S Su León Freíre Pablo Cruz Neus Azcáute NOLL 11 21 11 12 12 12 21 / / '" /' 22 ".OO€ Representante Representante Jefa venUS "..' NOMBRE Bruno ~/ /// ". Esta regla de seguridad se puede implementar definiendo una vista de la manera siguiente: CREATE VIEW INFOREP AS SELECT NUM_EMPL. se puede restringir de manera efectiva el acceso de los usuarios únicamente a las columnas y a las filas seleccionadas. Las vistas también pueden combinar datos de dos o más tablas..OO€ 286.nS.REP '" ". Mediante una definición cuidadosa de las vistas y otorgando a los usuarios permiso para tener acceso a las vistas..De€ ~c .59<l.."'.. como la siguiente: '" '" '" Bernardo Sbehz oa. FROM REPRESENTANTES OFICINA_REP / ". Las vistas y la seguridad en SOL Además de las restricciones al acceso a las tablas proporcionadas por los privilegios de SQL.Cae 300 DOO.912. sa:md eh". usuarios acceso a datos resumidos../" ".~ OnCIlIA RE P PUESTO f~CO~ 11-FEB-Se 12-OCT-88 lO-DIe-ae JEFE CUO'rJ.613...0n.DOO.OO€ 3S0.../'" //' ..000...DaE 368911. pero no deben tener disponibles los datos de ventas ni de cuotas. los nombres y los números de oficina de la tabla REPRESENTANTES. '" 350000. Al definir una vista con una consulta de agrupación. 101 ns. Por ejemplo. ". El privilegio SELECT puede utilizarse con vistas de sólo lectura para limitar la recuperación de datos. pero los privilegios . que determina si el usuario puede crear tablas en un espacio de tablas determinado. pero no a las fijas detalladas de la tabla subyacente. para los espacios de tablas.3.. y·concediendo el privilegio SELECT de la vista al identificador de usuario USUAcomo puede verse en la Figura 15."" /"..'" /.DeE 3aO. '" '" lO' lOO 102 106 110 ". proporcionando exactamente los datos que necesita un usuario concreto y negándole el acceso al resto de los datos. supóngase que se desea hacer cumplir esta regla de seguridad en la base de datos de ejemplo: OFICINA. " H Representante Representanta VI' 21 Representllnta ventn 14-JUN-Be 19-MAY-88 20-0C'1'-88 1J-ENE-88 12-OCT-88 Dl-KAR-88 ~c 12 Jefe vntas 12 12 21 ~C ". REPESTE y que contienen datos de REPRESENTANTES de cada una de las dos regiones.0S0..1' Bruno Arteaga liada Jl_M:l 13 Susana santOS samu"l Clavel Bernardo ~nche:¡. ". se pueden definir dos vistas. NOMBRE./' ..00€ 275...onn SUsana santo.OO€ 20D.// ". Como puede verse en la Figura 15. las vistas ofrecen una manera de ejercer un control muy preciso de los datos que resultan visibles para cada usuario. Por supuesto.

.GRANT SELECT----¡ DELETE~ ... que pu'ede verse en la Figura 15.. Los usuarios de cuentas deben poder recuperar los datos de los clientes y añadir clientes nuevos a la tabla CLIENTES. Y UPDATE carecen de sentido para estas vistas.. REFERENCES-l .... • Rendimiento.. ". Empleo de vistas para restringir el acceso a las filas. INSERT. la instrucción GRANT incluye una lista específica de los privilegios que se van a conceder.4.. ¿ ON nombre-fabla INSERT DELETE lO' Karía Jiménez lO' Samuel Clavel UPDATE • ..inombre-eO!Umnar-I '-------. Si un usuario tiene que actualizar los datos visibles en una vista de sólo lectura.. -------' ALL PRIVILEGES .5. DELETE La instrucción GRANT que puede verse en el diagrama sintáctico cumple el estándar ANSIIISO de SQL. .. Muchas marcas de SGBD siguen la sintaxis de DB2 para la instrucción GRANT.=. - Figura 15. Las vistas no se pueden utilizar de manera indiscriminada para restringir el acceso a la base de datos sin hacer que sufra el rendimiento general de la base de datos. pero los usuarios de procesamiento de pedidos sólo deben tener acceso de lectura. 1-. el nombre de la tabla a la que se aplican esos privilegios y el identificador de usuario al que se le conceden.. GRANT SELECT.J J WrTH GRANT OPTION • . 1 \\1 1 /1' 11 ... Como puede verse en la figura. DELETE y UPDATE que hacen referencia a esas tablas. UPDATE Concesión de privilegios (GRANT) La instrucción GRANT básica.5.os 108 León Freire 107 Neus Azcárate 5/ // /{ / / 1 11 1 11 11 11 /. A continuación se ofrecen algunos ejemplos de instrucciones GRANT sencillas para la base de datos de ejemplo: Conceder a los usuarios de procesamiento de pedidos acceso completo a la tabla PEDIDOS.::BLI:.\ ' \ \ 105 Bruno Arteaga \..' Sin acceso "" ..=. l' ---nno~~"-"'~'¡°ITT L. . Diagrama sintáctico de la instrucción GRANT.. que es más flexible. /. La sintaxis de DB2 permite especificar una lista de identificadores de usuario y una lista de talas. Figura 15. lo que hace más sencilla la concesión simultánea de muchos privilegios. INSERT. Normalmente. hay que concederle permiso para actualizar las tablas subyacentes y debe utilizar las instrucciones INSERT.. se utiliza para conceder privilegios de seguridad sobre los objetos de la base de datos a usuarios concretos. Como el SGBD traduce cada acceso a la vista en el acceso correspondiente a sus tablas fuente. \ INSERT-----. \\ ' Tabla REPRESENTANTES \ \ \\ NmLEMPL NOMBRE . INSERT ON CLIENTES TO USUARIOCU . Manual de referencia Capítulo 15: Seguridad en SOL 439 V·IS t a R EPESTE NUM EMPL NOMBRE SELECT 105 Bruno Arteaga 104 Bernardo Sánchez 101 Daniel Ruidrobo 103 Pablo Cruz . ON PEDIDOS TO USUARIOPP DELETE. GRANT SELECT.>-.438 SOL. 1/ /1 I 1 / I 'y"v.. las vistas pueden añadir una sobrecarga significativa a las operaciones de la base de datos.---r----------. la instrucción GRANT es utilizada por el propietario de una tabla o vista para conceder acceso a los datos a otros usuarios. 1'. 102 Susana Santos lO' samuel Clavel 104 Bernardo SAnchez 101 Daniel Ruidrobo ~ 110 TaDás Saz 108 León Freire 103 Pablo Cruz 107 Neus Azcárate lO' María Jiménez ') I USAGE O N ¡ D O M A I N nombre-dominio CHARACTER SET no~~~~rt~e~O' COLLATION nombre-secuencia TRANSLATION nombre-traducción 1> TO IS SELECT • aR EMPL NOMBRE INSERT DELETE UPDATE 102 Susana Sant. UPDATE---I---'-_.

No obstante. En la práctica. A continuación puede verse una instrucción GRANT que permite al departamento de procesamiento de pedidos actualizar sólo las columnas del nombre de la empresa y del representante asignado de la columna CLIENTES: . DELETE ON OFICINAS Tü SAMUEL Si se omite la lista de columnas. En lugar de hacer un listado de todos los privilegios disponibles para cada objeto concreto. la instrucción GRANT ofrece dos atajos que se pueden utilizar al conceder muchos privilegios o al concedérselos a muchos usuarios. los clientes..-. La instrucción GRANT concede a Sarnuel Clavel. Cuando s