aboutsummaryrefslogtreecommitdiff
path: root/bd/n6.lyx
diff options
context:
space:
mode:
authorJuan Marín Noguera <juan.marinn@um.es>2020-05-31 16:23:52 +0200
committerJuan Marín Noguera <juan.marinn@um.es>2020-05-31 16:23:52 +0200
commit0014b59bf2fd36fb21d21850717996ad722fc235 (patch)
treeb863851fb226c35e03aaac96578b8029704b6a78 /bd/n6.lyx
parentd403a9f36b9205f30d24920673cacd40c83e3649 (diff)
SQL
Diffstat (limited to 'bd/n6.lyx')
-rw-r--r--bd/n6.lyx7148
1 files changed, 7148 insertions, 0 deletions
diff --git a/bd/n6.lyx b/bd/n6.lyx
new file mode 100644
index 0000000..cc3be9e
--- /dev/null
+++ b/bd/n6.lyx
@@ -0,0 +1,7148 @@
+#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
+ (
+\lang english
+International Standardization Organization
+\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 como
+ índices.
+ 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 clave 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
+
+\family typewriter
+{}
+\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
+
+
+\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 / table-element
+\begin_inset Quotes cld
+\end_inset
+
+,
+\begin_inset Quotes crd
+\end_inset
+
+ table-elements
+\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 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 el número de dígitos a almacenar y, opcionalmente,
+ 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
+
+NULL
+\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
+
+ /
+\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 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
+ y
+\family typewriter
+UNIQUE
+\family default
+ indican 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-table-clause
+\end_layout
+
+\begin_layout Plain Layout
+
+alter-table-clause =
+\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 /
+\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, un 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] / query 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 listas 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 tabla
+ 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
+ o
+\family typewriter
+\emph on
+tabla
+\emph default
+ AS
+\emph on
+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
+orden-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 expresar 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:=|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}:=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:=(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:=(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:=(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:=(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):=(\{r\in R: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:=\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:=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}\}:=\{j: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: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
+: Sean
+\begin_inset Formula $N_{k}:=\{\mathtt{NULL}\}^{k}$
+\end_inset
+
+,
+\begin_inset Formula $n:=\text{gr}R$
+\end_inset
+
+ y
+\begin_inset Formula $m:=\text{gr}S$
+\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:=R\bowtie_{C}S\cup(\{r\in R:\nexists s\in S: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:=R\bowtie_{C}S\cup(N_{n}\times\{s\in S:\nexists r\in R:C(r,s)\})$
+\end_inset
+
+ y la
+\series bold
+reunión externa completa
+\series default
+ como
+\begin_inset Formula $R]\bowtie[_{C}S:=(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:=(N_{1},\dots,N_{n},M_{1},\dots,M_{m})$
+\end_inset
+
+, entonces
+\begin_inset Formula
+\[
+R\div S:=(\{r:\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):=O(\{r_{i}\}_{r\in R}\setminus\{\mathtt{NULL}\})$
+\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:t_{1},\dots,t_{n}\in\bigcup_{n\in\mathbb{N}}D^{n}\land\text{COND}(t_{1},\dots,t_{n})\}$
+\end_inset
+
+.
+\end_layout
+
+\begin_layout Standard
+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
+\series bold
+búsqueda secuencial
+\series default
+ 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
+
+\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
+Un
+\family typewriter
+index-def
+\family default
+ crea un índice en una tabla, con ordenación similar a
+\family typewriter
+ORDER BY
+\family default
+, y un
+\family typewriter
+drop-index-stmt
+\family default
+ lo elimina.
+\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 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.
+ 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
+
+\family typewriter
+NUMBER
+\family default
+ equivale a
+\family typewriter
+NUMERIC
+\family default
+, pero 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.
+\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
+RENAME
+\emph on
+name
+\emph default
+ TO
+\emph on
+newName
+\family default
+\emph default
+ equivale a
+\family typewriter
+ALTER TABLE
+\emph on
+name
+\emph default
+ RENAME 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-clause =
+\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 a 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 la cláusula
+\family typewriter
+FROM
+\family default
+ se llama Oracle Online View.
+\end_layout
+
+\end_body
+\end_document