#LyX 2.3 created this file. For more info see http://www.lyx.org/ \lyxformat 544 \begin_document \begin_header \save_transient_properties true \origin unavailable \textclass book \use_default_options true \maintain_unincluded_children false \language spanish \language_package default \inputencoding auto \fontencoding global \font_roman "default" "default" \font_sans "default" "default" \font_typewriter "default" "default" \font_math "auto" "auto" \font_default_family default \use_non_tex_fonts false \font_sc false \font_osf false \font_sf_scale 100 100 \font_tt_scale 100 100 \use_microtype false \use_dash_ligatures true \graphics default \default_output_format default \output_sync 0 \bibtex_command default \index_command default \paperfontsize default \spacing single \use_hyperref false \papersize default \use_geometry false \use_package amsmath 1 \use_package amssymb 1 \use_package cancel 1 \use_package esint 1 \use_package mathdots 1 \use_package mathtools 1 \use_package mhchem 1 \use_package stackrel 1 \use_package stmaryrd 1 \use_package undertilde 1 \cite_engine basic \cite_engine_type default \biblio_style plain \use_bibtopic false \use_indices false \paperorientation portrait \suppress_date false \justification true \use_refstyle 1 \use_minted 0 \index Index \shortcut idx \color #008000 \end_index \secnumdepth 3 \tocdepth 3 \paragraph_separation indent \paragraph_indentation default \is_math_indent 0 \math_numbering_side default \quotes_style french \dynamic_quotes 0 \papercolumns 1 \papersides 1 \paperpagestyle default \listings_params "basicstyle={\ttfamily},breaklines=true,breakatwhitespace=true" \tracking_changes false \output_changes false \html_math_output 0 \html_css_as_file 0 \html_be_strict false \end_header \begin_body \begin_layout Standard \series bold SQL \series default ( \emph on \lang english Structured Query Language \emph default \lang spanish , lenguaje estructurado de consulta) es un el primer lenguaje de bases de datos relacionales de alto nivel. Fue diseñado e implementado en los años 70 en el \emph on \lang english IBM Research Laboratory \emph default \lang spanish en San José, California, para el SGBD relacional System R. \end_layout \begin_layout Standard Es un estándar \series bold ANSI \series default ( \emph on \lang english American National Standards Institute \emph default \lang spanish ) e \series bold ISO \series default ( \emph on \lang english International Standardization Organization \emph default \lang spanish ). La primera versión del estándar fue SQL1 o ANSI 1986, del que hubo una revisión en 1989 llamada SQL-89. Después se creó SQL2 o SQL-92. SQL:1999 incluye extensiones de orientación a objetos, disparadores (también llamados \emph on triggers \emph default o reglas activas), etc., y SQL:2003 incluye conceptos como XML. \end_layout \begin_layout Standard Nos centramos en SQL-92. Hay 3 niveles de compatibilidad con el estándar: \emph on Entry SQL \emph default , \emph on Intermediate SQL \emph default y \emph on Full SQL \emph default , y los proveedores suelen incluir características no estandarizadas. El código SQL se puede incorporar dentro de código en un lenguaje de programaci ón de propósito general. \end_layout \begin_layout Standard Los comandos se organizan en: \end_layout \begin_layout Itemize \series bold Lenguaje de definición de datos \series default ( \series bold LDD \series default ): Para crear, modificar o eliminar estructuras de datos como tablas o vistas. \end_layout \begin_layout Itemize \series bold Lenguaje de manipulación de datos \series default ( \series bold LMD \series default ): Para introducir, actualizar, eliminar y consultar datos. \end_layout \begin_layout Standard En SQL, las tablas no contienen un conjunto de filas sino un \series bold multiconjunto \series default o \series bold saco \series default ( \emph on bag \emph default ), en el que puede haber varias filas idénticas. Las columnas están ordenadas por orden de creación, y una clave ajena puede referenciar a una alternativa. \end_layout \begin_layout Standard Se describe un subconjunto de la gramática de SQL, en ABNF y omitiendo los espacios en blanco por simplicidad \begin_inset Foot status open \begin_layout Plain Layout En concreto, si \family typewriter \size normal W = (WSP / CR / LF) \family default y \family typewriter ALNUM = (ALPHA / DIGIT / \begin_inset Quotes qld \end_inset _ \begin_inset Quotes qrd \end_inset ) \family default , entonces hay \family typewriter *W \family default entre dos términos que, en el código, se separaran por espacio, o \family typewriter 1*W \family default si, además, alguno de los términos está en \family typewriter 1*ALNUM \family default . \end_layout \end_inset . \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout sql-statement = (ddl-stmt / dml-stmt / tcl-stmt) \begin_inset Quotes cld \end_inset ; \begin_inset Quotes crd \end_inset \end_layout \begin_layout Plain Layout id = ALPHA*(ALPHA|DIGIT| \begin_inset Quotes cld \end_inset _ \begin_inset Quotes crd \end_inset ) \end_layout \begin_layout Plain Layout sid = [id \begin_inset Quotes cld \end_inset . \begin_inset Quotes crd \end_inset ] id \end_layout \begin_layout Plain Layout uint = 1*DIGIT \end_layout \begin_layout Plain Layout expr = number-expr / string-expr \end_layout \begin_layout Plain Layout number-expr = term *(( \begin_inset Quotes cld \end_inset + \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset - \begin_inset Quotes crd \end_inset ) term) \end_layout \begin_layout Plain Layout term = primary-expr *(( \begin_inset Quotes cld \end_inset * \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset / \begin_inset Quotes crd \end_inset ) primary-expr) \end_layout \begin_layout Plain Layout string-expr = primary-expr 1*( \begin_inset Quotes cld \end_inset || \begin_inset Quotes crd \end_inset primary-expr) \end_layout \begin_layout Plain Layout primary-expr = literal / [sid \begin_inset Quotes cld \end_inset . \begin_inset Quotes crd \end_inset ] id / set-function / \begin_inset Quotes cld \end_inset ( \begin_inset Quotes cld \end_inset query \begin_inset Quotes cld \end_inset ) \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset ( \begin_inset Quotes cld \end_inset expr \begin_inset Quotes cld \end_inset ) \begin_inset Quotes crd \end_inset \end_layout \begin_layout Plain Layout literal = number-literal / string-literal \end_layout \begin_layout Plain Layout number-literal = [ \begin_inset Quotes cld \end_inset + \begin_inset Quotes crd \end_inset / \begin_inset Quotes crd \end_inset - \begin_inset Quotes crd \end_inset ]uint[ \begin_inset Quotes cld \end_inset . \begin_inset Quotes crd \end_inset uint] \end_layout \begin_layout Plain Layout string-literal = \begin_inset Quotes cld \end_inset ' \begin_inset Quotes crd \end_inset *(nonquote-character/ \begin_inset Quotes cld \end_inset '' \begin_inset Quotes crd \end_inset ) \begin_inset Quotes cld \end_inset ' \begin_inset Quotes crd \end_inset \end_layout \end_inset \end_layout \begin_layout Standard \family typewriter || \family default es la concatenación de cadenas, y la secuencia \family typewriter ' \begin_inset ERT status open \begin_layout Plain Layout {} \end_layout \end_inset ' \family default en una cadena indica una \family typewriter ' \family default . \end_layout \begin_layout Section Transacciones \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout tcl-stmt = ( \begin_inset Quotes cld \end_inset COMMIT \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset ROLLBACK \begin_inset Quotes crd \end_inset ) [ \begin_inset Quotes cld \end_inset WORK \begin_inset Quotes crd \end_inset ] \end_layout \end_inset \end_layout \begin_layout Standard Una \series bold transacción \series default es la unidad lógica de procesamiento, una secuencia de operaciones realizadas sobre una base de datos de forma que, si una falla, la base de datos vuelve a su estado anterior al comienzo de la transacción. En SQL, toda operación se hace dentro de una transacción. \family typewriter COMMIT \family default confirma los cambios de la transacción actual, pasando a una nueva transacción, y \family typewriter ROLLBACK \family default deshace todos los cambios de la transacción actual. \end_layout \begin_layout Section Lenguaje de definición de datos \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout ddl-stmt = schema-def / drop-schema-stmt / table-def / alter-table-stmt / drop-table-stmt / view-def / drop-view-stmt / assertion-def / drop-assertion- stmt / set-constraints-stmt \end_layout \end_inset \end_layout \begin_layout Subsection Esquemas \end_layout \begin_layout Standard Un \series bold esquema \series default agrupa tablas, vistas, dominios, permisos o privilegios, asertos, etc., como los del mismo usuario o aplicación. \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout schema-def = \begin_inset Quotes cld \end_inset CREATE \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset SCHEMA \begin_inset Quotes crd \end_inset id \begin_inset Quotes cld \end_inset AUTHORIZATION \begin_inset Quotes crd \end_inset id \end_layout \end_inset \end_layout \begin_layout Standard El segundo \family typewriter id \family default indica el usuario o cuenta propietario del esquema. En \family typewriter sid \family default , se puede indicar un esquema \series bold explícito \series default indicando \family typewriter \emph on esquema \emph default . \emph on elemento \family default \emph default o un esquema \series bold implícito \series default como \family typewriter \emph on elemento \family default \emph default , donde se supone el esquema activo en la cuenta del usuario actual. \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout drop-schema-stmt = \begin_inset Quotes cld \end_inset DROP \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset SCHEMA \begin_inset Quotes crd \end_inset id [drop-behavior] \end_layout \begin_layout Plain Layout drop-behavior = \begin_inset Quotes cld \end_inset CASCADE \begin_inset Quotes crd \end_inset | \begin_inset Quotes cld \end_inset RESTRICT \begin_inset Quotes crd \end_inset \end_layout \end_inset \end_layout \begin_layout Standard Elimina un esquema. \family typewriter RESTRICT \family default , el \family typewriter drop-behavior \family default por defecto, destruye el esquema solo si no contiene ningún elemento, y \family typewriter CASCADE \family default destruye también todos los elementos del esquema. \end_layout \begin_layout Standard Desde SQL-92, los esquemas se organizan en \series bold catálogos \series default , conjuntos de todos los esquemas de base de datos en el mismo entorno, con un esquema especial, \family typewriter INFORMATION_SCHEMA \family default , que almacena la definición de todos los elementos de todos los esquemas del catálogo, de modo que se pueden compartir elementos entre esquemas del mismo catálogo pero solo pueden definirse restricciones de integridad referencial entre tablas de un mismo catálogo. \end_layout \begin_layout Subsection Crear una tabla \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout table-def = \begin_inset Quotes cld \end_inset CREATE \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset TABLE \begin_inset Quotes crd \end_inset sid \begin_inset Quotes cld \end_inset ( \begin_inset Quotes cld \end_inset table-elements \begin_inset Quotes cld \end_inset ) \begin_inset Quotes crd \end_inset \end_layout \begin_layout Plain Layout table-elements = table-element *( \begin_inset Quotes cld \end_inset , \begin_inset Quotes crd \end_inset table-element) \end_layout \begin_layout Plain Layout table-element = column-def / table-constraint \end_layout \begin_layout Plain Layout column-def = id type [default-clause] *column-constraint \end_layout \end_inset \end_layout \begin_layout Standard Un \family typewriter create-table-stmt \family default crea una tabla con una serie de columnas, cada una con el tipo indicado, que quedan en orden de aparición. Las filas no están ordenadas salvo que la tabla sea \family typewriter HEAP \family default , en cuyo caso quedan en orden de inserción. \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout type = number-type / string-type / time-type \end_layout \begin_layout Plain Layout number-type = \begin_inset Quotes cld \end_inset INTEGER \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset INT \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset SMALLINT \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset REAL \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset DOUBLE \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset PRECISION \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset FLOAT \begin_inset Quotes crd \end_inset [ \begin_inset Quotes cld \end_inset ( \begin_inset Quotes cld \end_inset uint \begin_inset Quotes cld \end_inset ) \begin_inset Quotes crd \end_inset ] / ( \begin_inset Quotes cld \end_inset NUMERIC \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset DECIMAL \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset DEC \begin_inset Quotes crd \end_inset ) [ \begin_inset Quotes cld \end_inset ( \begin_inset Quotes cld \end_inset uint [ \begin_inset Quotes cld \end_inset , \begin_inset Quotes crd \end_inset uint] \begin_inset Quotes cld \end_inset ) \begin_inset Quotes crd \end_inset ] \end_layout \begin_layout Plain Layout string-type = ( \begin_inset Quotes cld \end_inset CHAR \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset BIT \begin_inset Quotes crd \end_inset ) [ \begin_inset Quotes cld \end_inset ( \begin_inset Quotes cld \end_inset uint \begin_inset Quotes cld \end_inset ) \begin_inset Quotes crd \end_inset ] / ( \begin_inset Quotes cld \end_inset VARCHAR \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset BIT VARYING \begin_inset Quotes crd \end_inset ) \begin_inset Quotes cld \end_inset ( \begin_inset Quotes cld \end_inset uint \begin_inset Quotes cld \end_inset ) \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset NCHAR \begin_inset Quotes crd \end_inset [ \begin_inset Quotes cld \end_inset ( \begin_inset Quotes cld \end_inset uint \begin_inset Quotes cld \end_inset ) \begin_inset Quotes crd \end_inset ] \end_layout \begin_layout Plain Layout time-type = \begin_inset Quotes cld \end_inset DATE \begin_inset Quotes crd \end_inset / ( \begin_inset Quotes cld \end_inset TIME \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset TIMESTAMP \begin_inset Quotes crd \end_inset ) [ \begin_inset Quotes cld \end_inset WITH \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset TIME \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset ZONE \begin_inset Quotes crd \end_inset ] / \begin_inset Quotes cld \end_inset INTERVAL \begin_inset Quotes crd \end_inset ( \begin_inset Quotes cld \end_inset YEAR \begin_inset Quotes crd \end_inset [ \begin_inset Quotes cld \end_inset ( \begin_inset Quotes cld \end_inset uint \begin_inset Quotes cld \end_inset ) \begin_inset Quotes crd \end_inset ] \begin_inset Quotes cld \end_inset TO \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset MONTH \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset DAY \begin_inset Quotes crd \end_inset [ \begin_inset Quotes cld \end_inset ( \begin_inset Quotes cld \end_inset uint \begin_inset Quotes cld \end_inset ) \begin_inset Quotes crd \end_inset ] \begin_inset Quotes cld \end_inset TO \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset SECOND \begin_inset Quotes crd \end_inset [ \begin_inset Quotes cld \end_inset ( \begin_inset Quotes cld \end_inset uint \begin_inset Quotes cld \end_inset ) \begin_inset Quotes crd \end_inset ]) \end_layout \end_inset \end_layout \begin_layout Standard \family typewriter INTEGER \family default o \family typewriter INT \family default y \family typewriter SMALL INT \family default son tipos enteros. \family typewriter REAL \family default indica punto flotante de precisión simple, \family typewriter DOUBLE PRECISION \family default de doble precisión, y \family typewriter FLOAT( \emph on p \emph default ) \family default de precisión \family typewriter \emph on p \family default \emph default . \family typewriter NUMERIC \family default , \family typewriter DECIMAL \family default o \family typewriter DEC \family default recibe como parámetros opcionales el número de dígitos a almacenar y, opcionalm ente, un factor de escala. \family typewriter CHAR \family default y \family typewriter BIT \family default indican una cadena de caracteres o bits de una cierta longitud fija, por defecto 1. \family typewriter VARCHAR \family default y \family typewriter BIT VARYING \family default son similares, pero pueden contener elementos de menor longitud. \family typewriter DATE \family default indica una fecha en formato \family typewriter YYYY-MM-DD \family default ; \family typewriter TIME \family default una hora en formato \family typewriter hh:mm:ss \family default ; \family typewriter TIMESTAMP \family default una marca de tiempo con fecha, hora, fracción de segundo y, si se incluye \family typewriter WITH TIME ZONE \family default , una zona horaria. \end_layout \begin_layout Standard \family typewriter INTERVAL \family default indica un periodo de tiempo. Los intervalos \family typewriter YEAR TO MONTH \family default contienen los parámetros año y mes, con el tamaño opcionalmente indicado para el año, y los \family typewriter DAY TO SECOND \family default contienen día, hora, minuto y segundo, con el tamaño opcionalmente indicado para el día y la fracción de segundo. \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout column-constraint = ([ \begin_inset Quotes cld \end_inset NOT \begin_inset Quotes crd \end_inset ] \begin_inset Quotes cld \end_inset NULL \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset PRIMARY \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset KEY \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset CHECK \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset ( \begin_inset Quotes cld \end_inset bool-expr \begin_inset Quotes cld \end_inset ) \begin_inset Quotes crd \end_inset / fk-clause) [constraint-attribute] \end_layout \begin_layout Plain Layout default-clause = \begin_inset Quotes cld \end_inset DEFAULT \begin_inset Quotes crd \end_inset (literal / \begin_inset Quotes cld \end_inset NULL \begin_inset Quotes crd \end_inset ) \end_layout \end_inset \end_layout \begin_layout Standard En las restricciones de columna, \family typewriter NULL \family default indica que la columna puede contener \family typewriter NULL \family default , y \family typewriter NOT NULL \family default que no. Por defecto se asume \family typewriter NULL \family default salvo para las componentes de una clave primaria, para las que se asume \family typewriter NOT NULL \family default . El resto de restricciones equivalen a las restricciones de tabla correspondient es, sin nombre y con lista de columnas solo con la columna actual. \end_layout \begin_layout Standard Cuando se crea una fila en la tabla sin indicar el valor de una columna, se usa el valor por defecto, indicado en la \family typewriter default-clause \family default , o si esta no aparece, \family typewriter NULL \family default , dando error si la columna era \family typewriter NOT NULL \family default . \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout table-constraint = [ \begin_inset Quotes cld \end_inset CONSTRAINT \begin_inset Quotes crd \end_inset sid] (( \begin_inset Quotes cld \end_inset PRIMARY \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset KEY \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset UNIQUE \begin_inset Quotes crd \end_inset ) column-list / \begin_inset Quotes cld \end_inset CHECK \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset ( \begin_inset Quotes cld \end_inset bool-expr \begin_inset Quotes cld \end_inset ) \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset FOREIGN \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset KEY \begin_inset Quotes crd \end_inset column-list fk-clause) [constraint-attribute] \end_layout \begin_layout Plain Layout column-list = \begin_inset Quotes cld \end_inset ( \begin_inset Quotes cld \end_inset id *( \begin_inset Quotes cld \end_inset , \begin_inset Quotes crd \end_inset id) \begin_inset Quotes cld \end_inset ) \begin_inset Quotes crd \end_inset \end_layout \end_inset \end_layout \begin_layout Standard Con \family typewriter CONSTRAINT \family default , se puede dar un nombre a una restricción, que se guarda en el espacio de nombres global del esquema junto con los nombres de tablas y vistas para poder manejar la restricción en el futuro. \end_layout \begin_layout Standard Una \series bold restricción de clave candidata \series default \family typewriter PRIMARY KEY \family default o \family typewriter UNIQUE \family default indica que las columnas en la lista forman una clave primaria o alternativa, respectivamente. Una \series bold de comprobación \series default \family typewriter CHECK \family default indica que, para cada fila de la tabla, la expresión, en la que cada identifica dor de columna se refiere al correspondiente valor en la fila, evalúa a verdadero. \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout fk-clause = \begin_inset Quotes cld \end_inset REFERECES \begin_inset Quotes crd \end_inset sid column-list *( \begin_inset Quotes cld \end_inset ON \begin_inset Quotes crd \end_inset ( \begin_inset Quotes cld \end_inset DELETE \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset UPDATE \begin_inset Quotes crd \end_inset ) ( \begin_inset Quotes cld \end_inset SET \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset NULL \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset SET \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset DEFAULT \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset CASCADE \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset NO \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset ACTION \begin_inset Quotes crd \end_inset )) \end_layout \end_inset \end_layout \begin_layout Standard Una \series bold restricción de clave ajena \series default o \series bold externa \series default \family typewriter FOREIGN KEY \family default indica que las columnas en la primera lista forman una clave ajena hacia la tabla indicada justo tras \family typewriter REFERENCES \family default , concretamente a las columnas de la tabla en la segunda lista de columnas, de igual tamaño y en el mismo orden, que deben formar una clave primaria o alternativa. \end_layout \begin_layout Standard Las cláusulas \family typewriter ON DELETE \family default y \family typewriter ON UPDATE \family default indican qué hacer si se borra la fila a la que hace referencia la clave ajena o si se modifica el valor de la clave primaria o alternativa. \family typewriter SET NULL \family default establece el valor de la clave ajena a \family typewriter NULL \family default , \family typewriter SET DEFAULT \family default lo establece a su valor por defecto, \family typewriter CASCADE \family default hace el mismo cambio en la fila con la clave ajena (borrándola o cambiando el valor de la clave ajena), y \family typewriter NO ACTION \family default produce un fallo. \end_layout \begin_layout Subsection Modificar una tabla \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout alter-table-stmt = \begin_inset Quotes fld \end_inset ALTER \begin_inset Quotes frd \end_inset \begin_inset Quotes fld \end_inset TABLE \begin_inset Quotes frd \end_inset sid [alter-column / alter-constraint] \end_layout \begin_layout Plain Layout alter-column = \begin_inset Quotes fld \end_inset ADD \begin_inset Quotes frd \end_inset column-def / \begin_inset Quotes fld \end_inset ALTER \begin_inset Quotes frd \end_inset id ( \begin_inset Quotes cld \end_inset SET \begin_inset Quotes crd \end_inset default-clause / \begin_inset Quotes cld \end_inset DROP \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset DEFAULT \begin_inset Quotes crd \end_inset ) / \begin_inset Quotes fld \end_inset DROP \begin_inset Quotes frd \end_inset \begin_inset Quotes fld \end_inset COLUMN \begin_inset Quotes frd \end_inset id drop-behavior \end_layout \begin_layout Plain Layout alter-constraint = \begin_inset Quotes fld \end_inset ADD \begin_inset Quotes frd \end_inset table-constraint / \begin_inset Quotes cld \end_inset DROP \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset CONSTRAINT \begin_inset Quotes crd \end_inset sid drop-behavior \end_layout \end_inset \end_layout \begin_layout Standard Permite añadir columnas, modificar su valor por defecto o eliminarlas, y añadir o eliminar restricciones. Una columna no se puede eliminar si una restricción hace referencia a ella, pero si se indica \family typewriter CASCADE \family default , se eliminan también estas restricciones. \end_layout \begin_layout Subsection Eliminar una tabla \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout drop-table-stmt = \begin_inset Quotes fld \end_inset DROP \begin_inset Quotes frd \end_inset \begin_inset Quotes fld \end_inset TABLE \begin_inset Quotes frd \end_inset sid [drop-behavior] \end_layout \end_inset \end_layout \begin_layout Standard Elimina las filas y la definición. Sin \family typewriter CASCADE \family default , solo se elimina la tabla si ninguna restricción de integridad externa le hace referencia. \end_layout \begin_layout Subsection Asertos \end_layout \begin_layout Standard La información almacenada debe cumplir en todo momento las reglas existentes. Una regla de integridad se compone de: \end_layout \begin_layout Enumerate Un nombre, que aparece en los mensajes de error por intentar incumplir la regla. \end_layout \begin_layout Enumerate Una expresión booleana que indica cuándo se satisface la regla. \end_layout \begin_layout Enumerate Una respuesta a un intento de incumplimiento. Por defecto es fallar con un mensaje de error, pero podría ser un procedimiento de complejidad arbitraria. \end_layout \begin_layout Standard Las reglas de identidad son parte de los metadatos, y el \series bold subsistema de integridad \series default controla que estas no se incumplan. Una base de datos está en un \series bold estado de integridad \series default o es \series bold correcta \series default si no incumple ninguna regla de identidad. Hay 3 tipos de reglas: \end_layout \begin_layout Enumerate \series bold De dominio \series default : Define el dominio de una columna. \end_layout \begin_layout Enumerate \series bold De tabla \series default : Incluida en la definición de una tabla. \end_layout \begin_layout Enumerate \series bold Generales \series default ( \series bold asertos \series default ): Al mismo nivel que una tabla o vista, no incluidas en la definición de ninguna tabla. \end_layout \begin_layout Standard Ya hemos visto las de dominio y las de tabla. \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout assertion-def = \begin_inset Quotes cld \end_inset CREATE \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset ASSERTION \begin_inset Quotes crd \end_inset sid \begin_inset Quotes cld \end_inset CHECK \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset ( \begin_inset Quotes cld \end_inset bool-expr \begin_inset Quotes cld \end_inset ) \begin_inset Quotes crd \end_inset [constraint-attribute] \end_layout \begin_layout Plain Layout drop-assertion-stmt = \begin_inset Quotes cld \end_inset DROP \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset ASSERTION \begin_inset Quotes crd \end_inset sid \end_layout \end_inset \end_layout \begin_layout Standard En la condición de un aserto, se suele usar que \begin_inset Formula $\forall x,P(x)\equiv\nexists x:\neg P(x)$ \end_inset . No se puede crear una regla de identidad si el estado actual de una base de datos no la cumple. \end_layout \begin_layout Standard La mayoría de SGBDs no soportan asertos, y en su lugar se usan formas no declarativas de expresar estas restricciones como procedimientos o funciones almacenados y \emph on triggers \emph default . \end_layout \begin_layout Subsection Vistas \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout view-def = \begin_inset Quotes cld \end_inset CREATE \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset VIEW \begin_inset Quotes crd \end_inset sid [column-list] \begin_inset Quotes cld \end_inset AS \begin_inset Quotes crd \end_inset query [ \begin_inset Quotes cld \end_inset WITH \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset CHECK \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset OPTION \begin_inset Quotes crd \end_inset ] \end_layout \end_inset \end_layout \begin_layout Standard Una \series bold vista \series default es una presentación de datos de una o más \series bold tablas base \series default (otras tablas o vistas) como si fuera una tabla. No contiene información, sino que refleja el estado de las tablas base. Las vistas permiten almacenar consultas complejas, simplificar las sentencias, presentar los datos con otra perspectiva distinta a la de las tablas base, proporcionar seguridad (restringiendo el acceso a las tablas base forzando a acceder a ellas a través de vistas con información limitada), ocultar la complejidad y aislar a las aplicaciones de los cambios en la definición de las tablas base. \end_layout \begin_layout Standard La \family typewriter column-list \family default permite dar nuevos nombres a las columnas de la vista, siendo esto obligatorio cuando alguna columna de la consulta no se expresa como nombre de columna de una tabla base. Si una vista se define con \family typewriter SELECT * \family default y se añaden columnas a las tablas base, estas no se añaden a la vista. \end_layout \begin_layout Standard Una vista puede aparecer en una consulta ( \family typewriter dql-stmt \family default ) como una tabla. Es \series bold actualizable \series default si la \family typewriter query \family default es un \family typewriter select-stmt \family default sin agrupación que referencia una sola tabla base en la \family typewriter from-clause \family default y contiene una clave candidata de dicha tabla en las \family typewriter derived-column \family default . Solo se puede usar un \family typewriter dml-stmt \family default distinto de \family typewriter dql-stmt \family default en una vista si esta es actualizable, en cuyo caso la sentencia se traduce a una equivalente sobre la tabla base. \end_layout \begin_layout Standard Al insertar o actualizar filas de la tabla base desde una vista, puede que estas no aparezcan en la vista por no cumplirse la \series bold condición de definición \series default , la condición de la \family typewriter query \family default que indica si una fila de la tabla base aparece o no en la vista. \family typewriter WITH CHECK OPTION \family default hace que un \family typewriter insert-stmt \family default o \family typewriter update-stmt \family default sobre la vista falle si esto ocurre. \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout drop-view-stmt = \begin_inset Quotes cld \end_inset DROP \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset VIEW \begin_inset Quotes crd \end_inset sid [drop-behavior] \end_layout \end_inset \end_layout \begin_layout Standard Elimina una vista. Sin \family typewriter CASCADE \family default , solo la elimina si ninguna regla de integridad le hace referencia. \end_layout \begin_layout Subsection Modos de comprobación de restricciones \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout constraint-attribute = [ \begin_inset Quotes cld \end_inset INITIALLY \begin_inset Quotes crd \end_inset ( \begin_inset Quotes cld \end_inset DEFERRED \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset IMMEDIATE \begin_inset Quotes crd \end_inset )] [[ \begin_inset Quotes cld \end_inset NOT \begin_inset Quotes crd \end_inset ] \begin_inset Quotes cld \end_inset DEFERRABLE \begin_inset Quotes crd \end_inset ] \end_layout \end_inset \end_layout \begin_layout Standard Una restricción puede estar en modo \family typewriter IMMEDIATE \family default , comprobándose inmediatamente después de cada sentencia, o \family typewriter DEFERRED \family default ( \series bold diferida \series default ), comprobándose al final de la transacción. \family typewriter INITIALLY \family default indica el modo de la restricción al comienzo de cada transacción, que por defecto es \family typewriter IMMEDIATE \family default , y \family typewriter DEFERRABLE \family default indica si la restricción es \series bold diferible \series default , esto es, si puede pasar a modo \family typewriter DEFERRED \family default . Si el modo inicial es \family typewriter IMMEDIATE \family default , por defecto la restricción es \family typewriter NOT DEFERRABLE \family default , y si es \family typewriter DEFERRED \family default , por defecto es \family typewriter DEFERRABLE \family default y no se puede indicar \family typewriter NOT DEFERRABLE \family default . \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout set-constraints-stmt = \begin_inset Quotes cld \end_inset SET \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset CONSTRAINTS \begin_inset Quotes crd \end_inset (sid *( \begin_inset Quotes cld \end_inset , \begin_inset Quotes crd \end_inset sid) / \begin_inset Quotes cld \end_inset ALL \begin_inset Quotes crd \end_inset ) ( \begin_inset Quotes cld \end_inset DEFERRED \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset IMMEDIATE \begin_inset Quotes crd \end_inset ) \end_layout \end_inset \end_layout \begin_layout Standard Cambia el modo de una o varias restricciones, siendo \family typewriter ALL \family default todas las restricciones diferibles. Pasar una restricción de \family typewriter DEFERRED \family default a \family typewriter IMMEDIATE \family default falla si la restricción no se cumple. Al comienzo de un \family typewriter COMMIT \family default se ejecuta implícitamente \family typewriter SET CONSTRAINTS ALL IMMEDIATE \family default . \end_layout \begin_layout Section Lenguaje de manipulación de datos \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout dml-stmt = insert-stmt / delete-stmt / update-stmt / dql-stmt \end_layout \end_inset \end_layout \begin_layout Subsection Inserción de filas \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout insert-stmt = \begin_inset Quotes cld \end_inset INSERT \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset INTO \begin_inset Quotes crd \end_inset sid [column-list] query \end_layout \end_inset \end_layout \begin_layout Standard Inserta las filas resultado de la \family typewriter query \family default en la tabla \family typewriter sid \family default , equiparando cada columna del resultado, en orden, con la correspondiente de la \family typewriter column-list \family default o, de omitirse, de la lista ordenada de columnas de la tabla. Normalmente la \family typewriter query \family default es de la forma \family typewriter VALUES ( \emph on expr \emph default , \family default ... \family typewriter ) \family default para insertar una fila. Cada columna no indicada toma el valor en la \family typewriter default-clause \family default de su definición o, en su defecto, \family typewriter NULL \family default , fallando si esto no es posible. \end_layout \begin_layout Subsection Eliminación \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout delete-stmt = \begin_inset Quotes cld \end_inset DELETE \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset FROM \begin_inset Quotes crd \end_inset sid [ \begin_inset Quotes cld \end_inset WHERE \begin_inset Quotes crd \end_inset bool-expr] \end_layout \end_inset \end_layout \begin_layout Standard Borra las filas de la tabla que satisfacen la condición, o todas si no se especifica condición. \end_layout \begin_layout Subsection Actualización \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout update-stmt = \begin_inset Quotes cld \end_inset UPDATE \begin_inset Quotes crd \end_inset sid \begin_inset Quotes cld \end_inset SET \begin_inset Quotes crd \end_inset set-clause *( \begin_inset Quotes cld \end_inset , \begin_inset Quotes crd \end_inset set-clause) [ \begin_inset Quotes cld \end_inset WHERE \begin_inset Quotes crd \end_inset bool-expr] \end_layout \begin_layout Plain Layout set-clause = id \begin_inset Quotes cld \end_inset = \begin_inset Quotes crd \end_inset (expr / \begin_inset Quotes cld \end_inset NULL \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset DEFAULT \begin_inset Quotes crd \end_inset ) \end_layout \end_inset \end_layout \begin_layout Standard En cada fila de la tabla que cumple la condición, o en su defecto, en todas, cada columna \family typewriter id \family default se establece, bien al valor de la expresión en la \family typewriter set-clause \family default , en la que se puede referenciar a las columnas de la fila, bien a \family typewriter NULL \family default , bien al valor por defecto. \end_layout \begin_layout Section Consulta \end_layout \begin_layout Standard El lenguaje de consulta forma parte del lenguaje de manipulación de datos. \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout dql-stmt = query [order-by-clause] \end_layout \begin_layout Plain Layout query = query-term *(( \begin_inset Quotes cld \end_inset UNION \begin_inset Quotes crd \end_inset [ \begin_inset Quotes cld \end_inset ALL \begin_inset Quotes crd \end_inset ] / \begin_inset Quotes cld \end_inset EXCEPT \begin_inset Quotes crd \end_inset ) query-term) \end_layout \begin_layout Plain Layout query-term = primary-query *( \begin_inset Quotes cld \end_inset INTERSECT \begin_inset Quotes crd \end_inset primary-query) \end_layout \begin_layout Plain Layout primary-query = select-stmt / table-value / \begin_inset Quotes cld \end_inset ( \begin_inset Quotes cld \end_inset query \begin_inset Quotes cld \end_inset ) \begin_inset Quotes crd \end_inset \end_layout \begin_layout Plain Layout table-value = \begin_inset Quotes cld \end_inset VALUES \begin_inset Quotes crd \end_inset row-value *( \begin_inset Quotes cld \end_inset , \begin_inset Quotes crd \end_inset row-value) \end_layout \begin_layout Plain Layout row-value = expr-or-null / \begin_inset Quotes cld \end_inset ( \begin_inset Quotes cld \end_inset expr-or-null *( \begin_inset Quotes cld \end_inset , \begin_inset Quotes crd \end_inset expr-or-null) \begin_inset Quotes cld \end_inset ) \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset ( \begin_inset Quotes cld \end_inset query \begin_inset Quotes cld \end_inset ) \begin_inset Quotes crd \end_inset \end_layout \begin_layout Plain Layout expr-or-null = expr / \begin_inset Quotes cld \end_inset NULL \begin_inset Quotes crd \end_inset \end_layout \end_inset \end_layout \begin_layout Standard Una consulta construye y devuelve una tabla. \family typewriter UNION \family default , \family typewriter EXCEPT \family default e \family typewriter INTERSECT \family default tratan las tablas devueltas por los operandos como conjuntos de filas y devuelven, respectivamente, su unión, diferencia e intersección. \family typewriter UNION ALL \family default hace la unión de multiconjuntos, que incluye repeticiones. \end_layout \begin_layout Subsection Cláusulas \family typewriter SELECT \family default y \family typewriter FROM \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout select-stmt = \begin_inset Quotes cld \end_inset SELECT \begin_inset Quotes crd \end_inset [ \begin_inset Quotes cld \end_inset DISTINCT \begin_inset Quotes crd \end_inset ] ( \begin_inset Quotes cld \end_inset * \begin_inset Quotes crd \end_inset / derived-column ( \begin_inset Quotes cld \end_inset , \begin_inset Quotes crd \end_inset derived-column)) from-clause [where-clause] [group-by-clause [having-clause]] \end_layout \begin_layout Plain Layout derived-column = expr [[ \begin_inset Quotes cld \end_inset AS \begin_inset Quotes crd \end_inset ] id] \end_layout \begin_layout Plain Layout from-clause = table-ref *( \begin_inset Quotes cld \end_inset , \begin_inset Quotes crd \end_inset table-ref) \end_layout \begin_layout Plain Layout table-ref = sid [id] / \begin_inset Quotes cld \end_inset ( \begin_inset Quotes cld \end_inset query \begin_inset Quotes cld \end_inset ) \begin_inset Quotes crd \end_inset id / joined-table \end_layout \end_inset \end_layout \begin_layout Standard \family typewriter SELECT ... FROM \emph on tabla \family default \emph default devuelve una tabla con una columna para cada \family typewriter \emph on derived-column \family default \emph default con nombre \family typewriter \emph on id \family default \emph default o, en su defecto, \family typewriter \emph on expr \family default \emph default , y que para cada fila de la \family typewriter \emph on tabla \family default \emph default contiene una fila con el resultado de evaluar cada expresión \family typewriter \emph on derived-column \family default \emph default con el nombre de cada \family typewriter \emph on columna \family default \emph default y \family typewriter \emph on tabla \emph default . \emph on columna \family default \emph default establecido a su valor en la fila. \family typewriter * \family default equivale a listar todas las columnas de la \family typewriter \emph on tabla \family default \emph default , en orden. \family typewriter SELECT DISTINCT \family default elimina los duplicados. \end_layout \begin_layout Standard Si se indican varias \family typewriter \emph on table-ref \family default \emph default , se usa su producto cartesiano, que contiene, para cada fila de la primera tabla y cada fila de la segunda (si hay más de dos tablas, se usa la asociativi dad), una fila que contiene los valores de las columnas de la primera y los de la segunda. \end_layout \begin_layout Standard Si hay columnas de igual nombre en dos de las tablas indicadas, se deben referenciar como \family typewriter \emph on tabla \emph default . \emph on columna \family default \emph default . También se puede indicar un alias para la tabla con \family typewriter \emph on tabla alias \family default \emph default , y entonces no se establece \family typewriter \emph on tabla \emph default . \emph on columna \family default \emph default sino \family typewriter \emph on alias \emph default . \emph on columna \family default \emph default , permitiendo usar el producto cartesiano de una tabla consigo misma indicando la misma tabla con distintos alias. \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout joined-table = qualified-join / \begin_inset Quotes cld \end_inset ( \begin_inset Quotes cld \end_inset joined-table \begin_inset Quotes cld \end_inset ) \begin_inset Quotes crd \end_inset \end_layout \begin_layout Plain Layout qualified-join = table-ref [join-type] \begin_inset Quotes cld \end_inset JOIN \begin_inset Quotes crd \end_inset table-ref [ \begin_inset Quotes cld \end_inset ON \begin_inset Quotes crd \end_inset bool-expr] \end_layout \begin_layout Plain Layout join-type = \begin_inset Quotes cld \end_inset INNER \begin_inset Quotes crd \end_inset / ( \begin_inset Quotes cld \end_inset LEFT \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset RIGHT \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset FULL \begin_inset Quotes crd \end_inset ) [ \begin_inset Quotes cld \end_inset OUTER \begin_inset Quotes crd \end_inset ] / \begin_inset Quotes cld \end_inset NATURAL \begin_inset Quotes crd \end_inset \end_layout \end_inset \end_layout \begin_layout Standard Una \series bold reunión \series default o \emph on join \emph default es el uso de varias tablas en \family typewriter FROM \family default para obtener el producto cartesiano, y se puede hacer separando las tablas por comas o con \family typewriter joined-table \family default . \end_layout \begin_layout Standard El \family typewriter join-type \family default por defecto es \family typewriter INNER JOIN \family default , que toma las filas del producto cartesiano que satisfacen \family typewriter bool-expr \family default , la \series bold condición de reunión \series default , o todas si esta se omite. \family typewriter OUTER JOIN \family default es similar, pero cuando para una fila de la tabla a la izquierda ( \family typewriter LEFT \family default ), a la derecha ( \family typewriter RIGHT \family default ) o cualquiera de las dos ( \family typewriter FULL \family default ) no tiene una fila al otro lado con la que la condición de reunión se cumpla, se añade una fila en el resultado que en ese otro lado tiene todos los campos a \family typewriter NULL \family default . \end_layout \begin_layout Standard \family typewriter NATURAL JOIN \family default no incluye cláusula \family typewriter ON \family default , asume como condición de reunión que las columnas de igual nombre en ambas tablas coincidan y solo incluye una de las dos columnas de igual nombre en el resultado. Tras esto, no se puede calificar una columna de reunión con el nombre de la tabla original. \end_layout \begin_layout Subsection Cláusula \family typewriter WHERE \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout where-clause = \begin_inset Quotes cld \end_inset WHERE \begin_inset Quotes crd \end_inset bool-expr \end_layout \end_inset \end_layout \begin_layout Standard Indica que, de la tabla indicada en \family typewriter FROM \family default , solo aparezcan en el resultado las filas que cumplen la condición. \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout bool-expr = bool-term *( \begin_inset Quotes cld \end_inset OR \begin_inset Quotes crd \end_inset bool-term) \end_layout \begin_layout Plain Layout bool-term = bool-factor *( \begin_inset Quotes cld \end_inset AND \begin_inset Quotes crd \end_inset bool-factor) \end_layout \begin_layout Plain Layout bool-factor = \begin_inset Quotes cld \end_inset NOT \begin_inset Quotes crd \end_inset (predicate / \begin_inset Quotes cld \end_inset ( \begin_inset Quotes cld \end_inset bool-expr \begin_inset Quotes cld \end_inset ) \begin_inset Quotes crd \end_inset ) \end_layout \begin_layout Plain Layout predicate = compare-pred / null-pred / like-pred / in-pred / quantified-compare- pred / exists-pred \end_layout \begin_layout Plain Layout compare-pred = row-value comp-op row-value \end_layout \begin_layout Plain Layout comp-op = \begin_inset Quotes cld \end_inset = \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset <> \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset < \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset <= \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset > \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset >= \begin_inset Quotes crd \end_inset \end_layout \begin_layout Plain Layout null-pred = row-value \begin_inset Quotes cld \end_inset IS \begin_inset Quotes crd \end_inset [ \begin_inset Quotes cld \end_inset NOT \begin_inset Quotes crd \end_inset ] \begin_inset Quotes cld \end_inset NULL \begin_inset Quotes crd \end_inset \end_layout \begin_layout Plain Layout like-pred = string-expr [ \begin_inset Quotes cld \end_inset NOT \begin_inset Quotes crd \end_inset ] \begin_inset Quotes cld \end_inset LIKE \begin_inset Quotes crd \end_inset string-expr \end_layout \end_inset \end_layout \begin_layout Standard Las operaciones sobre tuplas ( \family typewriter row-value \family default ) consideran una sola expresión como una tupla de un elemento. \family typewriter NULL \family default indica desconocimiento de información, por lo que comparar con \family typewriter NULL \family default en un \family typewriter compare-pred \family default siempre devuelve \family typewriter FALSE \family default o \family typewriter UNKNOWN \family default , y en su lugar se usa un \family typewriter null-pred \family default . Un \family typewriter like-pred \family default compara una cadena de caracteres con otra, donde la de la derecha puede tener caracteres reservados o \series bold comodines \series default , como \family typewriter % \family default que representa una cantidad cualquiera de caracteres o \family typewriter _ \family default que representa un caracter. \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout in-pred = row-value [ \begin_inset Quotes cld \end_inset NOT \begin_inset Quotes crd \end_inset ] \begin_inset Quotes cld \end_inset IN \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset ( \begin_inset Quotes cld \end_inset (expr *( \begin_inset Quotes cld \end_inset , \begin_inset Quotes crd \end_inset expr)) / query \begin_inset Quotes cld \end_inset ) \begin_inset Quotes crd \end_inset \end_layout \begin_layout Plain Layout quantified-compare-pred = row-value comp-op [ \begin_inset Quotes cld \end_inset SOME \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset ANY \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset ALL \begin_inset Quotes crd \end_inset ] \begin_inset Quotes cld \end_inset ( \begin_inset Quotes cld \end_inset query \begin_inset Quotes cld \end_inset ) \begin_inset Quotes crd \end_inset \end_layout \begin_layout Plain Layout exists-pred = \begin_inset Quotes cld \end_inset EXISTS \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset ( \begin_inset Quotes cld \end_inset query \begin_inset Quotes cld \end_inset ) \begin_inset Quotes crd \end_inset \end_layout \end_inset \end_layout \begin_layout Standard Una subconsulta o \series bold consulta anidada \series default es una consulta en la \family typewriter where-clause \family default de otra consulta. Es \series bold correlacionada \series default si referencia a valores que dependen de la fila de la consulta en la que se encuentra, lo que debe evitarse porque en general supone ejecutar una consulta por cada fila considerada en la consulta externa. \end_layout \begin_layout Standard Un \family typewriter in-pred \family default comprueba si un valor o tupla está en cierta lista de valores o tuplas, que puede ser el resultado de una consulta anidada. \end_layout \begin_layout Standard Un \family typewriter quantified-compare-pred \family default devuelve \family typewriter TRUE \family default si en el resultado de la subconsulta alguna fila \family typewriter \emph on r \family default \emph default cumple \family typewriter \emph on row-value comp-op r \family default \emph default (con \family typewriter SOME \family default o \family typewriter ANY \family default ) o todas lo cumplen (con \family typewriter ALL \family default ), aunque la mayoría de SGBDs permiten usar una lista \family typewriter expr *( \begin_inset Quotes qld \end_inset , \begin_inset Quotes qrd \end_inset expr) \family default en vez de una subconsulta. \end_layout \begin_layout Standard Un \family typewriter exists-pred \family default comprueba si la subconsulta ha devuelto alguna fila. \end_layout \begin_layout Subsection Cláusulas \family typewriter GROUP BY \family default y \family typewriter HAVING \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout group-by-clause = \begin_inset Quotes cld \end_inset GROUP \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset BY \begin_inset Quotes crd \end_inset [sid \begin_inset Quotes cld \end_inset . \begin_inset Quotes crd \end_inset ] id *( \begin_inset Quotes cld \end_inset , \begin_inset Quotes crd \end_inset [sid \begin_inset Quotes cld \end_inset . \begin_inset Quotes crd \end_inset ] id) \end_layout \end_inset \end_layout \begin_layout Standard Agrupa las filas en las que los valores de las columnas indicadas coinciden. \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout set-function = \begin_inset Quotes cld \end_inset COUNT \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset ( \begin_inset Quotes cld \end_inset \begin_inset Quotes cld \end_inset * \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset ) \begin_inset Quotes crd \end_inset / set-function-type \begin_inset Quotes cld \end_inset ( \begin_inset Quotes cld \end_inset [ \begin_inset Quotes cld \end_inset DISTINCT \begin_inset Quotes crd \end_inset ] expr \begin_inset Quotes cld \end_inset ) \begin_inset Quotes crd \end_inset \end_layout \begin_layout Plain Layout set-function-type = \begin_inset Quotes cld \end_inset AVG \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset MAX \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset MIN \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset SUM \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset COUNT \begin_inset Quotes crd \end_inset \end_layout \end_inset \end_layout \begin_layout Standard \family typewriter COUNT(*) \family default devuelve el número de filas del grupo, y \family typewriter COUNT( \emph on expr \emph default ) \family default devuelve el número de filas para las que \family typewriter \emph on expr \family default \emph default no es \family typewriter NULL \family default . \family typewriter SUM \family default calcula la suma de los valores de \family typewriter \emph on expr \family default \emph default para cada fila para la que \family typewriter \emph on expr \family default \emph default no es \family typewriter NULL \family default , y \family typewriter MAX \family default y \family typewriter MIN \family default hacen lo propio para el máximo y el mínimo. Si aparece \family typewriter DISTINCT \family default , se consideran las filas tras eliminar duplicados. \end_layout \begin_layout Standard Las \family typewriter set-function \family default o \series bold funciones de agregados \series default pueden aparecer en \family typewriter derived-column \family default y en \family typewriter having-clause \family default . Si aparece en una \family typewriter derived-column \family default de un \family typewriter select-stmt \family default sin \family typewriter group-by-clause \family default , se agrupan todas las filas resultado en un mismo grupo. \end_layout \begin_layout Standard Si las filas resultado están agrupadas, las \family typewriter derived-column \family default y, de haberla, la \family typewriter having-clause \family default , solo pueden referenciar columnas que no aparecen en la \family typewriter group-by-clause \family default (o columnas en general si no hay \family typewriter group-by-clause \family default ) dentro de funciones de agregados. \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout having-clause = \begin_inset Quotes cld \end_inset HAVING \begin_inset Quotes crd \end_inset bool-expr \end_layout \end_inset \end_layout \begin_layout Standard Indica que, de los grupos de filas, solo aparezcan en el resultado los que cumplan la condición. \end_layout \begin_layout Subsection Cláusula \family typewriter ORDER BY \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout order-by-clause = \begin_inset Quotes cld \end_inset ORDER \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset BY \begin_inset Quotes crd \end_inset sort-spec *( \begin_inset Quotes cld \end_inset , \begin_inset Quotes crd \end_inset sort-spec) \end_layout \begin_layout Plain Layout sort-spec = [sid \begin_inset Quotes cld \end_inset . \begin_inset Quotes crd \end_inset ] id [ \begin_inset Quotes cld \end_inset ASC \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset DESC \begin_inset Quotes crd \end_inset ] \end_layout \end_inset \end_layout \begin_layout Standard Una \family typewriter order-by-clause \family default indica el orden de las columnas. Se usa la primera \family typewriter sort-spec \family default , en caso de empate la segunda, etc., ordenando las filas según la columna de la tabla resultado indicada en orden ascendente ( \family typewriter ASC \family default , por defecto) o descendente ( \family typewriter DESC \family default ). La mayoría de SGBDs interpretan la \family typewriter order-by-clause \family default como un parámetro de \family typewriter select-stmt \family default y no de \family typewriter dql-stmt \family default . \end_layout \begin_layout Subsection Consideraciones de eficiencia \end_layout \begin_layout Standard Se han de evitar anidamiento correlacionado y el ordenamiento por su coste. Para operar sobre relaciones, de mayor a menor elegancia \begin_inset Foot status open \begin_layout Plain Layout Según el criterio subjetivo de los profesores de la asignatura. \end_layout \end_inset tenemos \family typewriter IN \family default , \family typewriter EXISTS \family default y \family typewriter JOIN \family default , y de mayor a menor eficiencia \begin_inset Foot status open \begin_layout Plain Layout Esto es muy dependiente de las optimizaciones del gestor de bases de datos. \end_layout \end_inset tenemos \family typewriter IN \family default sin correlación, \family typewriter JOIN \family default y \family typewriter EXISTS \family default . \end_layout \begin_layout Section Álgebra relacional \end_layout \begin_layout Standard El \series bold álgebra relacional \series default es un lenguaje definido por Ted Codd en 1972 para expresar operaciones sobre relaciones. \end_layout \begin_layout Standard Podemos ver una relación como una tupla \begin_inset Formula $(R,T,N)$ \end_inset donde \begin_inset Formula $T=:(T_{1},\dots,T_{n})$ \end_inset es una tupla de conjuntos o \series bold dominios \series default , \begin_inset Formula $N=:(N_{1},\dots,N_{n})$ \end_inset es una tupla de \series bold nombres \series default distintos dos a dos y \begin_inset Formula $R\subseteq(T_{1}\dot{\cup}\{\mathtt{NULL}\})\times\dots\times(T_{n}\dot{\cup}\{\mathtt{NULL}\})$ \end_inset es el \series bold estado \series default . Decimos que las relaciones son \series bold homogéneas \series default porque todos los elementos del estado son del mismo tipo. \end_layout \begin_layout Standard Llamamos \series bold grado \series default de una relación \begin_inset Formula $(R,T,N)$ \end_inset a \begin_inset Formula $\text{gr}R\coloneqq |T|$ \end_inset y \series bold dominio \series default del atributo \begin_inset Formula $N_{i}$ \end_inset a \begin_inset Formula $\text{dom}R_{i}\coloneqq T_{i}$ \end_inset . Las relaciones \begin_inset Formula $R$ \end_inset y \begin_inset Formula $S$ \end_inset son \series bold compatibles en tipo \series default si \begin_inset Formula $\text{gr}R=\text{gr}S$ \end_inset y para \begin_inset Formula $i\in\{1,\dots,n\}$ \end_inset , \begin_inset Formula $\text{dom}R_{i}=\text{dom}S_{i}$ \end_inset . \end_layout \begin_layout Standard Las relaciones se expresan por un nombre o como resultado de una operación. Si \begin_inset Formula $(R,T,N)$ \end_inset y \begin_inset Formula $(S,U,M)$ \end_inset son relaciones con grados respectivos \begin_inset Formula $n$ \end_inset y \begin_inset Formula $m$ \end_inset y \begin_inset Formula \[ (a_{1},\dots,a_{n})*(b_{1},\dots,b_{m}):=(a_{1},\dots,a_{n},b_{1},\dots,b_{m}), \] \end_inset los operadores son: \end_layout \begin_layout Enumerate \series bold Unión \series default : Si \begin_inset Formula $T=U$ \end_inset , \begin_inset Formula $R\cup S\coloneqq (R\cup S,T,N)$ \end_inset . \end_layout \begin_layout Enumerate \series bold Intersección \series default : Si \begin_inset Formula $T=U$ \end_inset , \begin_inset Formula $R\cap S\coloneqq (R\cap S,T,N)$ \end_inset . \end_layout \begin_layout Enumerate \series bold Diferencia \series default : Si \begin_inset Formula $T=U$ \end_inset , \begin_inset Formula $R-S\coloneqq (R\setminus S,T,N)$ \end_inset . \end_layout \begin_layout Enumerate \series bold Producto cartesiano ampliado \series default : Si \begin_inset Formula $N$ \end_inset y \begin_inset Formula $M$ \end_inset son disjuntos, \begin_inset Formula \[ R\times S:=(\{r*s\}_{r\in R,s\in S},T*U,N*M). \] \end_inset Cuando \begin_inset Formula $N$ \end_inset y \begin_inset Formula $M$ \end_inset no son disjuntos, sean \begin_inset Formula $L:N\to N\amalg M$ \end_inset y \begin_inset Formula $R:M\to N\amalg M$ \end_inset inclusiones, entonces \begin_inset Formula $R\times S\coloneqq (R,T,L(N))\times(S,U,R(M))$ \end_inset . Una forma de hacer esto es prefijar los nombres de atributos con el nombre de su tabla. \end_layout \begin_layout Enumerate \series bold Restricción \series default : Una \series bold condición \series default sobre \begin_inset Formula $R$ \end_inset se define por la gramática \begin_inset Formula $S\to(S)\mid S\text{ AND }S\mid S\text{ OR }S\mid\text{NOT }S\mid TOC\mid TOT$ \end_inset , \begin_inset Formula $O\to=\mid<\mid\leq\mid>\mid\geq\mid<>$ \end_inset , \begin_inset Formula $T\to N_{1}\mid\dots\mid N_{n}$ \end_inset . Entonces, si \begin_inset Formula $C$ \end_inset es una condición, \begin_inset Formula $\sigma_{C}(R)\coloneqq (\{r\in R\mid C(r)\},T,N)$ \end_inset , donde \begin_inset Formula $C(r)$ \end_inset se define con su significado habitual, teniendo en cuenta que \begin_inset Formula $\mathtt{NULL}\neq\mathtt{NULL}$ \end_inset . \end_layout \begin_deeper \begin_layout Standard La restricción es conmutativa: \begin_inset Formula $\sigma_{C}(\sigma_{D}(R))=\sigma_{D}(\sigma_{C}(R))=\sigma_{C\text{ AND }D}(R)$ \end_inset . \end_layout \end_deeper \begin_layout Enumerate \series bold Proyección \series default : Sea \begin_inset Formula $\iota:\{N_{i}\}_{i}\to\{1,\dots,n\}$ \end_inset la inversa de \begin_inset Formula $N$ \end_inset , si \begin_inset Formula $M$ \end_inset es una tupla de \begin_inset Formula $m$ \end_inset nombres distintos dos a dos con \begin_inset Formula $\{M_{i}\}_{i}\subseteq\{N_{i}\}_{i}$ \end_inset , entonces \begin_inset Formula \[ \pi_{M}(R):=(\{(r_{\iota(M_{1})},\dots,r_{\iota(M_{n})})\}_{r\in R},(T_{\iota(M_{1})},\dots,T_{\iota(M_{n})}),M). \] \end_inset \end_layout \begin_layout Enumerate \series bold Reunión \series default : Una \series bold condición de reunión \series default sobre \begin_inset Formula $R$ \end_inset y \begin_inset Formula $S$ \end_inset se define por la gramática \begin_inset Formula $S\to T\mid T\text{ AND }S$ \end_inset , \begin_inset Formula $T\to AOB$ \end_inset , \begin_inset Formula $O\to=\mid<\mid\leq\mid>\mid\geq\mid<>$ \end_inset , \begin_inset Formula $A\to N_{1}\mid\dots\mid N_{n}$ \end_inset , \begin_inset Formula $B\to M_{1}\mid\dots\mid M_{m}$ \end_inset , salvo que si contiene \begin_inset Formula $N_{i}\theta M_{j}$ \end_inset con \begin_inset Formula $O\to\theta$ \end_inset , debe ser \begin_inset Formula $\text{dom}R_{i}=\text{dom}S_{j}$ \end_inset . Entonces, si \begin_inset Formula $C$ \end_inset es una condición de reunión, \begin_inset Formula $R\bowtie_{C}S\coloneqq \sigma_{C}(R\times S)$ \end_inset . Si todos los operadores de \begin_inset Formula $C$ \end_inset son la igualdad, hablamos de una \series bold equi-reunión \series default . Definimos también \begin_inset Formula $R\bowtie S\coloneqq R\times S$ \end_inset . \end_layout \begin_deeper \begin_layout Standard El producto cartesiano ampliado y la reunión son asociativas, y son conmutativas salvo orden de los atributos. \end_layout \end_deeper \begin_layout Enumerate \series bold Reunión natural \series default : Sea \begin_inset Formula $\{j_{1},\dots,j_{p}\}\coloneqq \{j\mid M_{j}\notin\{N_{i}\}\}$ \end_inset , si para \begin_inset Formula $i,j\in\{1,\dots,n\}\times\{1,\dots,m\}$ \end_inset con \begin_inset Formula $N_{i}=M_{j}$ \end_inset es \begin_inset Formula $T_{i}=U_{j}$ \end_inset , entonces \begin_inset Formula \[ R\hexstar S:=(\{r*(s_{j_{1}},\dots,s_{j_{p}})\mid r\in R,s\in S,\forall i,j,(N_{i}=M_{j}\implies r_{i}=s_{j})\},T*U,N*M). \] \end_inset \end_layout \begin_layout Enumerate \series bold Reunión externa \series default : Sea \begin_inset Formula $N_{k}\coloneqq \{\mathtt{NULL}\}^{k}$ \end_inset . Definimos la \series bold reunión externa izquierda \series default de \begin_inset Formula $R$ \end_inset y \begin_inset Formula $S$ \end_inset como \begin_inset Formula $R]\bowtie_{C}S\coloneqq R\bowtie_{C}S\cup(\{r\in R\mid \nexists s\in S\mid C(r,s)\}\times N_{m})$ \end_inset , la \series bold reunión externa derecha \series default como \begin_inset Formula $R\bowtie[_{C}S\coloneqq R\bowtie_{C}S\cup(N_{n}\times\{s\in S\mid \nexists r\in R\mid C(r,s)\})$ \end_inset y la \series bold reunión externa completa \series default como \begin_inset Formula $R]\bowtie[_{C}S\coloneqq (R]\bowtie_{C}S)\cup(R\bowtie[_{C}S)$ \end_inset . \end_layout \begin_layout Enumerate \series bold División \series default : Si \begin_inset Formula $N\coloneqq (N_{1},\dots,N_{n},M_{1},\dots,M_{m})$ \end_inset , entonces \begin_inset Formula \[ R\div S:=(\{r\mid \forall s\in S,r*s\in R\},(T_{1},\dots,T_{n}),(N_{1},\dots,N_{n})). \] \end_inset \end_layout \begin_layout Enumerate \series bold Funciones de agregados \series default : Son SUMA, PRODUCTO, MÁXIMO, MÍNIMO y CUENTA, correspondientes a \begin_inset Formula $\sum$ \end_inset , \begin_inset Formula $\prod$ \end_inset , \begin_inset Formula $\max$ \end_inset , \begin_inset Formula $\min$ \end_inset y \begin_inset Formula $|\cdot|$ \end_inset . Si \begin_inset Formula $O$ \end_inset es el nombre de una de estas funciones, definimos la función de agregados \begin_inset Formula $O_{N_{i}}(R)\coloneqq O_{r\in R,r_{i}\neq\mathtt{NULL}}r_{i}$ \end_inset . \end_layout \begin_deeper \begin_layout Standard Dada una tupla \begin_inset Formula $(F_{1},\dots,F_{m})$ \end_inset de funciones de agregados, \begin_inset Formula $_{N_{i_{1}},\dots,N_{i_{n}}}\mathbf{F}_{F_{1},\dots,F_{m}}(R)$ \end_inset es una relación que contiene, para cada clase de equivalencia \begin_inset Formula $[r]$ \end_inset de \begin_inset Formula $R$ \end_inset respecto de la relación \begin_inset Formula $r\equiv s:\iff(r_{i_{1}},\dots,r_{i_{n}})=(s_{i_{1}},\dots,s_{i_{s}})$ \end_inset , una fila \begin_inset Formula $(r_{i_{1}},\dots,r_{i_{n}},F_{1}([r]),\dots,F_{m}([r]))$ \end_inset . El tipo es \begin_inset Formula $(T_{i_{1}},\dots,T_{i_{n}},X_{1},\dots,X_{m})$ \end_inset , donde \begin_inset Formula $X_{i}$ \end_inset es el rango de \begin_inset Formula $F_{i}$ \end_inset , y los nombres de los atributos son \begin_inset Formula $(N_{i_{1}},\dots,N_{i_{n}},F_{1},\dots,F_{n})$ \end_inset . \end_layout \end_deeper \begin_layout Standard Además, si la expresión \emph on expr \emph default toma el valor \begin_inset Formula $(S,T,M)$ \end_inset con \begin_inset Formula $\text{gr}S=n$ \end_inset , la expresión \begin_inset Formula $R(N_{1},\dots,N_{n})\gets\emph{{expr}}$ \end_inset establece \begin_inset Formula $R$ \end_inset a \begin_inset Formula $(S,T,\{N_{1},\dots,N_{n}\})$ \end_inset . \end_layout \begin_layout Section Cálculo relacional \end_layout \begin_layout Standard El \series bold cálculo relacional \series default es un lenguaje formal basado en la lógica predicados de primer orden que describe la información que se desea obtener de forma declarativa. Existen el \series bold cálculo relacional de tuplas \series default (CRT), el que veremos, creado por Codd en 1972, y el \series bold de dominios \series default , creado por Lacroix y Pirotte en 1977. \end_layout \begin_layout Standard Las expresiones tienen forma \begin_inset Formula \[ \{t_{1}.a_{11},\dots,t_{1}.a_{1m_{1}},\dots,t_{n}.a_{n1},\dots,t_{n}.a_{nm_{n}}\mid\text{COND}(t_{1},\dots,t_{n})\}, \] \end_inset donde cada \begin_inset Formula $t_{i}$ \end_inset es una \series bold variable de tupla \series default y recorre una cierta relación y cada \begin_inset Formula $a_{ij}$ \end_inset es un nombre de atributo de dicha relación. \end_layout \begin_layout Standard Un \series bold átomo \series default es una expresión de la forma \begin_inset Formula $R(t_{i})$ \end_inset , \begin_inset Formula $t_{i}.a\,op\,t_{j}.b$ \end_inset , \begin_inset Formula $t_{i}.a\,op\,c$ \end_inset o \begin_inset Formula $c\,op\,t_{j}.b$ \end_inset , donde \begin_inset Formula $R$ \end_inset es una relación, \begin_inset Formula $t_{i}$ \end_inset y \begin_inset Formula $t_{j}$ \end_inset son variables de tupla, \begin_inset Formula $a$ \end_inset es un atributo de la relación recorrida por \begin_inset Formula $t_{i}$ \end_inset , \begin_inset Formula $b$ \end_inset uno de la recorrida por \begin_inset Formula $t_{j}$ \end_inset y \begin_inset Formula $c$ \end_inset es una constante. \end_layout \begin_layout Standard Una \series bold fórmula bien formada \series default (f.b.f) es un átomo o, si \begin_inset Formula $\alpha$ \end_inset y \begin_inset Formula $\beta$ \end_inset son f.b.f. y \begin_inset Formula $x$ \end_inset es una variable, \begin_inset Formula $(\alpha\text{ and }\beta)$ \end_inset , \begin_inset Formula $(\alpha\text{ or }\beta)$ \end_inset , \begin_inset Formula $\text{not}(\alpha)$ \end_inset , \begin_inset Formula $(\alpha\to\beta)$ \end_inset , \begin_inset Formula $(\forall x)\alpha$ \end_inset y \begin_inset Formula $(\exists x)\alpha$ \end_inset . Una ocurrencia de una variable \begin_inset Formula $x$ \end_inset es \series bold ligada \series default si está en una fórmula de la forma \begin_inset Formula $(\forall x)\alpha$ \end_inset o \begin_inset Formula $(\exists x)\alpha$ \end_inset , y es \series bold libre \series default en caso contrario. \end_layout \begin_layout Standard El valor de verdad de una fórmula puede ser TRUE (verdadero) o FALSE (falso). El de \begin_inset Formula $R(t_{i})$ \end_inset es TRUE si y sólo si \begin_inset Formula $t_{i}\in R$ \end_inset . Una fórmula bien formada es \series bold cerrada \series default si toda variable es ligada, en cuyo caso su valor de verdad puede ser TRUE o FALSE, y es \series bold abierta \series default en caso contrario, en cuyo caso representa una consulta. \end_layout \begin_layout Standard \begin_inset Formula $\text{COND}(t_{1},\dots,t_{n})$ \end_inset es una f.b.f. con variables libres \begin_inset Formula $t_{1},\dots,t_{n}$ \end_inset , y se cumple para las tuplas que, al ligar a las variables \begin_inset Formula $t_{1},\dots,t_{n}$ \end_inset , la fórmula evalúa a TRUE. \end_layout \begin_layout Standard Llamamos \series bold dominio \series default de una expresión a la unión de los dominios de las relaciones que aparecen nombradas en la condición y las constantes que aparecen en la condición. Una expresión es \series bold segura \series default si toda tupla para la que la condición se cumple tiene sus elementos en el dominio de la expresión. Entonces la expresión segura \begin_inset Formula $\{T\mid\text{COND}(t_{1},\dots,t_{n})\}$ \end_inset con dominio \begin_inset Formula $D$ \end_inset se refiere al conjunto \begin_inset Formula $\{T\mid t_{1},\dots,t_{n}\in\bigcup_{n\in\mathbb{N}}D^{n}\land\text{COND}(t_{1},\dots,t_{n})\}$ \end_inset . El cálculo relacional con expresiones seguras tiene la misma potencia que el álgebra relacional. \end_layout \begin_layout Section Índices \end_layout \begin_layout Standard Buscar las filas de una tabla que satisfacen una condición es la operación más común en consultas SQL. La búsqueda secuencial implica un gran número de lecturas de \series bold bloques \series default o \series bold páginas \series default , las unidades a nivel físico en las que el SGBD almacena las filas de tablas. \end_layout \begin_layout Standard Un \series bold índice \series default es una estructura de datos auxiliar para acelerar el acceso a las filas de una tabla según el valor de un \series bold campo de indexación \series default , generalmente una o más columnas. Contiene una serie de \series bold entradas \series default o \series bold registros \series default con cada valor de los existentes en el campo de indexación y un puntero al bloque del fichero de datos que contiene la fila con dicho valor. Las entradas están ordenadas según el valor de este campo \begin_inset Foot status open \begin_layout Plain Layout Normalmente se usan variantes de árboles B. \end_layout \end_inset , permitiendo hacer búsqueda binaria. \end_layout \begin_layout Standard Se recomienda crear un índice cuando un campo se usa frecuentemente en condicion es de selección ( \family typewriter where-clause \family default ) o de reunión, así como en todas las claves primarias y alternativas. \end_layout \begin_layout Standard Los índices no forman parte del estándar SQL, pero existe un estándar de facto. \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout ddl-stmt =/ index-def / drop-index-stmt \end_layout \begin_layout Plain Layout index-def = \begin_inset Quotes cld \end_inset CREATE \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset INDEX \begin_inset Quotes crd \end_inset sid \begin_inset Quotes cld \end_inset ON \begin_inset Quotes crd \end_inset sid \begin_inset Quotes cld \end_inset ( \begin_inset Quotes cld \end_inset index-part *( \begin_inset Quotes cld \end_inset , \begin_inset Quotes crd \end_inset index-part \begin_inset Quotes cld \end_inset ) \begin_inset Quotes crd \end_inset \end_layout \begin_layout Plain Layout index-part = (id / expr) [ \begin_inset Quotes cld \end_inset ASC \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset DESC \begin_inset Quotes crd \end_inset ] \end_layout \end_inset \end_layout \begin_layout Standard Un \family typewriter index-def \family default crea un índice en una tabla, con ordenación similar a \family typewriter ORDER BY \family default . \begin_inset Foot status open \begin_layout Plain Layout Algunas bases de datos permiten también índices parciales, en los que se añade una \family typewriter where-clause \family default al final de la \family typewriter index-def \family default y solo se indexan las filas que cumplen la condición. \end_layout \end_inset Además, se crea un índice por cada restricción \family typewriter PRIMARY KEY \family default o \family typewriter UNIQUE \family default con las columnas de la clave. \end_layout \begin_layout Standard \begin_inset Newpage newpage \end_inset \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout drop-index-stmt = \begin_inset Quotes cld \end_inset DROP \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset INDEX \begin_inset Quotes crd \end_inset sid \end_layout \end_inset \end_layout \begin_layout Standard Elimina un índice. Esto puede hacerse porque ya no se espera realizar consultas basadas en el campo de indexación, o porque este no acelera las consultas al ser la tabla muy pequeña o contener muchas filas pero pocas entradas en el índice. \end_layout \begin_layout Section SQL del software privativo Oracle Database \begin_inset Foot status open \begin_layout Plain Layout Si bien este es el SGBD que vemos en clase, lo cierto es que, según lo visto en clase, es bastante limitado (por ejemplo, en el tratamiento de claves ajenas y en conformidad con el estándar), y es difícil de instalar. Para un SGBD fácil de instalar y usar, véase SQLite. Para uno más acorde al estándar pero con muchas características adicionales, véase PostgreSQL. \end_layout \end_inset \end_layout \begin_layout Standard Cada comando del LDD realiza un \family typewriter COMMIT \family default implícito antes y después de su ejecución, y también se hace un \family typewriter COMMIT \family default implícito al salir correctamente de una herramienta como el \lang english software \lang spanish privativo Oracle SQL Developer o el software privativo Oracle SQL*Plus. Cuando la terminación es anormal o con error, se hace un \family typewriter ROLLBACK \family default implícito. \end_layout \begin_layout Standard Los índices se implementan con el estándar de facto. \end_layout \begin_layout Subsection Esquemas \end_layout \begin_layout Standard El software privativo Oracle Database solo soporta un esquema por cuenta de usuario, que solo se puede borrar borrando la cuenta (no soporta \family typewriter drop-schema-stmt \family default ). \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout schema-def = \begin_inset Quotes cld \end_inset CREATE \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset SCHEMA \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset AUTHORIZATION \begin_inset Quotes crd \end_inset id \end_layout \end_inset \end_layout \begin_layout Standard No hace nada. Además, en vez de \family typewriter INFORMATION_SCHEMA \family default hay un \emph on Data Dictionary \emph default . \end_layout \begin_layout Subsection Tipos \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout type =/ raw-type / large-type / rowid-type \end_layout \begin_layout Plain Layout number-type =/ \begin_inset Quotes cld \end_inset NUMBER \begin_inset Quotes crd \end_inset [ \begin_inset Quotes cld \end_inset ( \begin_inset Quotes cld \end_inset uint [ \begin_inset Quotes cld \end_inset , \begin_inset Quotes crd \end_inset uint] \begin_inset Quotes cld \end_inset ) \begin_inset Quotes crd \end_inset ] / \begin_inset Quotes cld \end_inset BINARY_FLOAT \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset BINARY_DOUBLE \begin_inset Quotes crd \end_inset \end_layout \begin_layout Plain Layout string-type =/ \begin_inset Quotes cld \end_inset CHAR \begin_inset Quotes crd \end_inset [ \begin_inset Quotes cld \end_inset ( \begin_inset Quotes cld \end_inset uint [ \begin_inset Quotes cld \end_inset BYTE \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset CHAR \begin_inset Quotes crd \end_inset ] \begin_inset Quotes cld \end_inset ) \begin_inset Quotes crd \end_inset ] / \begin_inset Quotes cld \end_inset VARCHAR2 \begin_inset Quotes crd \end_inset [ \begin_inset Quotes cld \end_inset ( \begin_inset Quotes cld \end_inset uint [ \begin_inset Quotes cld \end_inset BYTE \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset CHAR \begin_inset Quotes crd \end_inset ] \begin_inset Quotes cld \end_inset ) \begin_inset Quotes crd \end_inset ] / \begin_inset Quotes cld \end_inset NVARCHAR2 \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset ( \begin_inset Quotes cld \end_inset uint \begin_inset Quotes cld \end_inset ) \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset LONG \begin_inset Quotes crd \end_inset \end_layout \begin_layout Plain Layout time-type =/ \begin_inset Quotes cld \end_inset TIMESTAMP \begin_inset Quotes crd \end_inset [ \begin_inset Quotes cld \end_inset ( \begin_inset Quotes cld \end_inset uint \begin_inset Quotes cld \end_inset ) \begin_inset Quotes crd \end_inset ] \begin_inset Quotes cld \end_inset WITH \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset LOCAL \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset TIME \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset ZONE \begin_inset Quotes crd \end_inset \end_layout \begin_layout Plain Layout raw-type = \begin_inset Quotes cld \end_inset RAW \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset ( \begin_inset Quotes cld \end_inset uint \begin_inset Quotes cld \end_inset ) \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset LONG \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset RAW \begin_inset Quotes crd \end_inset \end_layout \begin_layout Plain Layout large-type = \begin_inset Quotes cld \end_inset BLOB \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset CLOB \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset NCLOB \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset BFILE \begin_inset Quotes crd \end_inset \end_layout \begin_layout Plain Layout rowid-type = \begin_inset Quotes cld \end_inset ROWID \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset UROWID \begin_inset Quotes crd \end_inset [ \begin_inset Quotes cld \end_inset ( \begin_inset Quotes cld \end_inset uint \begin_inset Quotes cld \end_inset ) \begin_inset Quotes crd \end_inset ] \end_layout \end_inset \end_layout \begin_layout Standard \begin_inset ERT status open \begin_layout Plain Layout \backslash begin{sloppypar} \end_layout \end_inset \family typewriter NUMBER \family default equivale a \family typewriter NUMERIC \family default , con parámetros por defecto 38 y 0. \family typewriter INTEGER \family default equivale a \family typewriter NUMBER(38,0) \family default , \family typewriter BINARY_FLOAT \family default a \family typewriter REAL \family default y \family typewriter BINARY_DOUBLE \family default a \family typewriter DOUBLE PRECISION \family default . \family typewriter CHAR( \emph on n \emph default CHAR) \family default equivale a \family typewriter CHAR( \emph on n \emph default ) \family default y \family typewriter CHAR( \emph on n \emph default BYTE) \family default a \family typewriter BIT( \emph on 8n \emph default ) \family default . \family typewriter VARCHAR2 \family default equivale a \family typewriter VARCHAR \family default o a \family typewriter BIT VARYING \family default , con las mismas consideraciones. \begin_inset ERT status open \begin_layout Plain Layout \backslash end{sloppypar} \end_layout \end_inset \end_layout \begin_layout Standard Los \family typewriter raw-type \family default y \family typewriter BLOB \family default contienen secuencias de bits, siendo \family typewriter BLOB \family default preferible a \family typewriter LONG RAW \family default . Los \family typewriter large-type \family default contienen objetos grandes ( \emph on Large OBjects \emph default ), y \family typewriter BFILE \family default referencia un objeto almacenado fuera de la base de datos. \end_layout \begin_layout Subsection Tablas \end_layout \begin_layout Standard Se puede crear una tabla inicializada a los resultados de una consulta: \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout table-def =/ \begin_inset Quotes cld \end_inset CREATE \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset TABLE \begin_inset Quotes crd \end_inset sid \begin_inset Quotes cld \end_inset AS \begin_inset Quotes crd \end_inset query \end_layout \end_inset \end_layout \begin_layout Standard Hay más posibilidades en \family typewriter ALTER TABLE \family default : \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout ddl-stmt =/ rename-stmt \end_layout \begin_layout Plain Layout rename-stmt = \begin_inset Quotes fld \end_inset RENAME \begin_inset Quotes frd \end_inset id \begin_inset Quotes fld \end_inset TO \begin_inset Quotes frd \end_inset id \end_layout \begin_layout Plain Layout alter-table-clause = \begin_inset Quotes fld \end_inset ADD \begin_inset Quotes frd \end_inset \begin_inset Quotes fld \end_inset ( \begin_inset Quotes fld \end_inset column-def *( \begin_inset Quotes fld \end_inset , \begin_inset Quotes frd \end_inset column-def) \begin_inset Quotes fld \end_inset ) \begin_inset Quotes frd \end_inset / \begin_inset Quotes fld \end_inset RENAME \begin_inset Quotes frd \end_inset \begin_inset Quotes fld \end_inset COLUMN \begin_inset Quotes frd \end_inset id \begin_inset Quotes fld \end_inset TO \begin_inset Quotes frd \end_inset id / \begin_inset Quotes fld \end_inset RENAME \begin_inset Quotes frd \end_inset \begin_inset Quotes fld \end_inset TO \begin_inset Quotes frd \end_inset id / \begin_inset Quotes fld \end_inset DROP \begin_inset Quotes frd \end_inset \begin_inset Quotes fld \end_inset COLUMN \begin_inset Quotes frd \end_inset id / \begin_inset Quotes fld \end_inset DROP \begin_inset Quotes frd \end_inset \begin_inset Quotes fld \end_inset ( \begin_inset Quotes fld \end_inset id *( \begin_inset Quotes fld \end_inset , \begin_inset Quotes frd \end_inset id) \begin_inset Quotes fld \end_inset ) \begin_inset Quotes frd \end_inset [ \begin_inset Quotes fld \end_inset CASCADE \begin_inset Quotes frd \end_inset \begin_inset Quotes fld \end_inset CONSTRAINTS \begin_inset Quotes frd \end_inset ] / \begin_inset Quotes fld \end_inset MODIFY \begin_inset Quotes frd \end_inset id (type / column-constraint) *column-constraint / alter-constraint-clause \end_layout \end_inset \end_layout \begin_layout Standard \family typewriter ALTER TABLE \emph on name \emph default RENAME TO \emph on newName \family default \emph default equivale a \family typewriter RENAME \emph on name \emph default TO \emph on newName \family default \emph default , y cambia el nombre de una tabla. \family typewriter ADD \family default tiene otra sintaxis y permite añadir varias columnas a la vez. \family typewriter DROP COLUMN \family default tiene una sintaxis alternativa para eliminar más de una columna a la vez, y \family typewriter CASCADE CONSTRAINTS \family default es como \family typewriter CASCADE \family default en SQL. \family typewriter MODIFY \family default cambia la definición de una columna. \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout alter-constraint = \begin_inset Quotes cld \end_inset ADD \begin_inset Quotes crd \end_inset 1*table-constraint / \begin_inset Quotes cld \end_inset MODIFY \begin_inset Quotes crd \end_inset ( \begin_inset Quotes cld \end_inset CONSTRAINT \begin_inset Quotes crd \end_inset id / \begin_inset Quotes cld \end_inset PRIMARY \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset KEY \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset UNIQUE \begin_inset Quotes crd \end_inset column-list) constraint-state [ \begin_inset Quotes cld \end_inset CASCADE \begin_inset Quotes crd \end_inset ] / \begin_inset Quotes cld \end_inset RENAME \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset CONSTRAINT \begin_inset Quotes crd \end_inset id \begin_inset Quotes cld \end_inset TO \begin_inset Quotes crd \end_inset id / 1*drop-constraint-clause / enable-or-disable-clause \end_layout \begin_layout Plain Layout constraint-state = 1*([ \begin_inset Quotes cld \end_inset NOT \begin_inset Quotes crd \end_inset ] \begin_inset Quotes cld \end_inset DEFERRABLE \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset INITIALLY \begin_inset Quotes crd \end_inset ( \begin_inset Quotes cld \end_inset IMMEDIATE \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset DEFERRED \begin_inset Quotes crd \end_inset ) / \begin_inset Quotes cld \end_inset RELY \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset NORELY \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset ENABLE \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset DISABLE \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset VALIDATE \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset NOVALIDATE \begin_inset Quotes crd \end_inset ) \end_layout \begin_layout Plain Layout drop-constraint-clause = \begin_inset Quotes cld \end_inset DROP \begin_inset Quotes crd \end_inset (( \begin_inset Quotes cld \end_inset PRIMARY \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset KEY \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset UNIQUE \begin_inset Quotes crd \end_inset column-list) [ \begin_inset Quotes cld \end_inset CASCADE \begin_inset Quotes crd \end_inset ] [( \begin_inset Quotes cld \end_inset KEEP \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset DROP \begin_inset Quotes crd \end_inset ) \begin_inset Quotes cld \end_inset INDEX \begin_inset Quotes crd \end_inset ] / \begin_inset Quotes cld \end_inset CONSTRAINT \begin_inset Quotes crd \end_inset id [ \begin_inset Quotes cld \end_inset CASCADE \begin_inset Quotes crd \end_inset ]) \end_layout \begin_layout Plain Layout enable-or-disable-clause = ( \begin_inset Quotes cld \end_inset ENABLE \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset DISABLE \begin_inset Quotes crd \end_inset ) [ \begin_inset Quotes cld \end_inset VALIDATE \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset NOVALIDATE \begin_inset Quotes crd \end_inset ] ( \begin_inset Quotes cld \end_inset UNIQUE \begin_inset Quotes crd \end_inset column-list / \begin_inset Quotes cld \end_inset PRIMARY \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset KEY \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset CONSTRAINT \begin_inset Quotes crd \end_inset id) [ \begin_inset Quotes cld \end_inset CASCADE \begin_inset Quotes crd \end_inset ] [( \begin_inset Quotes cld \end_inset KEEP \begin_inset Quotes crd \end_inset / \begin_inset Quotes cld \end_inset DROP \begin_inset Quotes crd \end_inset ) \begin_inset Quotes cld \end_inset INDEX \begin_inset Quotes crd \end_inset ] \end_layout \end_inset \end_layout \begin_layout Standard \family typewriter ENABLE \family default o \family typewriter DISABLE \family default permiten activar o desactivar una restricción. Una clave primaria o alternativa referenciada por claves ajenas no se puede desactivar salvo que se indique \family typewriter CASCADE \family default , en cuyo caso se desactivan también las claves ajenas. \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout drop-table-stmt = \begin_inset Quotes cld \end_inset DROP \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset TABLE \begin_inset Quotes crd \end_inset [id \begin_inset Quotes cld \end_inset . \begin_inset Quotes crd \end_inset ] id [ \begin_inset Quotes cld \end_inset CASCADE \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset CONSTRAINTS \begin_inset Quotes crd \end_inset ] [ \begin_inset Quotes cld \end_inset PURGE \begin_inset Quotes crd \end_inset ] \end_layout \end_inset \end_layout \begin_layout Standard \family typewriter CASCADE CONSTRAINTS \family default es como \family typewriter CASCADE \family default , y \family typewriter PURGE \family default libera el espacio ocupado por la tabla inmediatamente, sin situar la tabla y sus objetos dependientes en la papelera de reciclaje. \end_layout \begin_layout Subsection Reglas de integridad \end_layout \begin_layout Standard La expresión en una restricción \family typewriter CHECK \family default debe ser booleana y no puede: \end_layout \begin_layout Itemize Contener subconsultas. \end_layout \begin_layout Itemize Llamar a \family typewriter SYSDATE \family default , \family typewriter SYSTIMESTAMP \family default , \family typewriter CURRENT_DATE \family default , \family typewriter CURRENT_TIMESTAMP \family default , \family typewriter DBTIMEZONE \family default , \family typewriter LOCALTIMESTAMP \family default , \family typewriter SESSIONTIMEZONE \family default , \family typewriter UID \family default , \family typewriter USER \family default , \family typewriter USERENV \family default o funciones definidas por el usuario. \end_layout \begin_layout Itemize Referenciar columnas de otras tablas. \end_layout \begin_layout Itemize Contener constantes de tipo fecha no totalmente especificadas. \end_layout \begin_layout Itemize Contener las pseudocolumnas \family typewriter LEVEL \family default , \family typewriter ROWNUM \family default , \family typewriter NEXTVAL \family default y \family typewriter CURRVAL \family default . \end_layout \begin_layout Standard La cláusula \family typewriter ON UPDATE \family default para claves ajenas no está soportada, con lo que siempre se asume \family typewriter NO ACTION \family default , y \family typewriter ON DELETE \family default solo puede ser \family typewriter CASCADE \family default o \family typewriter SET NULL \family default , y si no aparece se asume \family typewriter NO ACTION \family default . \end_layout \begin_layout Subsection Vistas \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout view-def = \begin_inset Quotes cld \end_inset CREATE \begin_inset Quotes crd \end_inset [ \begin_inset Quotes cld \end_inset OR \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset REPLACE \begin_inset Quotes crd \end_inset ] [[ \begin_inset Quotes cld \end_inset NO \begin_inset Quotes crd \end_inset ] \begin_inset Quotes cld \end_inset FORCE \begin_inset Quotes crd \end_inset ] \begin_inset Quotes cld \end_inset VIEW \begin_inset Quotes crd \end_inset sid [column-list] \begin_inset Quotes cld \end_inset AS \begin_inset Quotes crd \end_inset query [ \begin_inset Quotes cld \end_inset WITH \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset CHECK \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset OPTION \begin_inset Quotes crd \end_inset [ \begin_inset Quotes cld \end_inset CONSTRAINT \begin_inset Quotes crd \end_inset sid] / \begin_inset Quotes cld \end_inset READ \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset ONLY \begin_inset Quotes crd \end_inset ] \end_layout \end_inset \end_layout \begin_layout Standard \family typewriter OR REPLACE \family default permite cambiar la definición de la vista. \family typewriter FORCE \family default crea la vista aunque no existan las tablas base o el propietario de la vista no tenga permisos sobre ellas. \family typewriter WITH READ ONLY \family default hace que la vista no sea actualizable. \family typewriter CONSTRAINT \emph on sid \family default \emph default da un nombre como restricción a la condición \family typewriter WITH CHECK OPTION \family default . \end_layout \begin_layout Standard \begin_inset listings inline false status open \begin_layout Plain Layout drop-view-stmt = \begin_inset Quotes cld \end_inset DROP \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset VIEW \begin_inset Quotes crd \end_inset sid [ \begin_inset Quotes cld \end_inset CASCADE \begin_inset Quotes crd \end_inset \begin_inset Quotes cld \end_inset CONSTRAINTS \begin_inset Quotes crd \end_inset ] \end_layout \end_inset \end_layout \begin_layout Standard \family typewriter CASCADE CONSTRAINTS \family default es como \family typewriter CASCADE \family default . \end_layout \begin_layout Subsection Consultas \end_layout \begin_layout Standard El operador \family typewriter EXCEPT \family default se llama \family typewriter MINUS \family default . \family typewriter SELECT UNIQUE \family default es sinónimo de \family typewriter SELECT DISTINCT \family default . Aunque esta característica es estándar, en el software privativo Oracle Database, la inclusión de una subconsulta en una \family typewriter from-clause \family default se llama Oracle Online View. \end_layout \end_body \end_document