Documentos de Académico
Documentos de Profesional
Documentos de Cultura
1] notas previas
[1.1.1]versión de SQL
La pretensión de estos apuntes es la de ser guía para el aprendizaje del lenguaje SQL.
Aunque SQL posee un estándar aprobado por la agencia ISO, la realidad es que cada
producto comercial de base de datos utiliza su propia variante.
En este sentido todo el SQL del libro se ha probado en la versión 11g R2 del sistema
Oracle Database. Aunque en algunos apartados se hacen ciertos comentarios sobre las
diferencias sobre el SQL estándar aprobado por la agencia ISO, el manual se basa en el
aprendizaje del SQL de la empresa Oracle.
La realidad es que Oracle ha sido puntero en incorporar nuevas funcionalidades al
lenguaje SQL y por ello, aprendiendo el SQL de Oracle es fácil aprender cualquier otro
dialecto de SQL y también el estándar y esa es para mí la razón fundamental para elegir
Oracle como sistema de aprendizaje de SQL.
A fin de probar el SQL hay que tener en cuenta que existe una versión de Oracle que es
gratuita para un uso sin ánimo de lucro llamada Oracle 11g Express Edition1.
La razón de utilizar Oracle como base de trabajo se debe a su respeto por SQL estándar,
aunque, desde luego, lejos del estricto respeto del estándar de otros sistemas (por
ejemplo el que hace el sistema PostgreSQL) y porque Oracle sigue siendo el Sistema
Gestor de Bases de Datos (SGBD) más importante e influyente.
Los ejemplos sirven para escenificar una instrucción concreta, la sintaxis se utiliza para
indicar las forma de utilizar un comando.
Para indicar la sintaxis de un comando se usan símbolos especiales. Los símbolos que
utiliza este libro (de acuerdo con la sintaxis que se utiliza normalmente en cualquier
documentación de este tipo) son:
PALABRA. Cuando en la sintaxis se utiliza una palabra coloreada en azul y en
negrita, significa que es una palabra que hay que escribir literalmente (aunque
sin importar si en mayúsculas o minúsculas).
texto. El texto que aparece en color normal sirve para indicar que no hay que
escribirle literalmente, sino que se refiere a un tipo de elemento que se puede
utilizar en el comando. Ejemplo:
SELECT columna FROM tabla;
El texto columna hay que cambiarlo por un nombre concreto de columna (como
edad, apellidos,...), al igual que tabla se refiere a un nombre de tabla concreto.
símbolos. Los símbolos coloreados en azul y negrita, hay que escribirles de
forma literal, aunque no sean palabras reservadas del lenguaje.
[ ] (corchetes). Los corchetes (en color rojo) sirven para encerrar texto que no es
obligatorio en la instrucción. Es decir, para indicar una parte opcional de la
instrucción.
| (barra vertical). Este símbolo (|), la barra vertical, indica opción. Cuando hay
diferentes palabras o secciones en la instrucción separadas por la barra, se está
indicando que solo podremos elegir una de las opciones (son opciones, por lo
tanto, excluyentes).
... (puntos suspensivos) Indica que la sección anterior a los puntos suspensivos,
se puede repetir una y otra vez.
{} (llaves) Las llaves sirven para indicar secciones obligatorias. Normalmente se
usa con la barra vertical para indicar que solo se puede elegir una opción, pero es
obligatorio elegir una. Ejemplo:
SELECT { * | columna | expresión }
FROM tabla;
Las instrucciones SQL se colocan como parte del código de otro lenguaje que se
considera anfitrión (C, Java, Pascal, Visual Basic,...). El código anfitrión se debe de
compilar o interpretar mediante software adecuado, el cual detectará el código SQL y
podrá lanzarle hacia el servidor SQL a través de una interfaz especial, como JDBC u
ODBC por ejemplo.
ejecución a través de clientes gráficos
Se trata de software que permite conectar a la base de datos a través de un software que
permite abstraerse del lenguaje SQL. El software permite manejar de forma gráfica la
base de datos y las acciones realizadas son traducidas a SQL y enviadas al servidor. Los
resultados recibidos vuelven a ser traducidos de forma gráfica para un manejo más
cómodo
ejecución dinámica
[1.3.2]normas de escritura
En SQL no se distingue entre mayúsculas y minúsculas (salvo en los textos
literales; es decir, en los datos).
Las instrucciones finalizan con el signo de punto y coma
Cualquier comando SQL (SELECT, INSERT,...) puede ser partidos por
espacios o saltos de línea antes de finalizar la instrucción. Se usa para mejorar la
legibilidad de las instrucciones.
También se pueden tabular líneas para facilitar la lectura si fuera necesario.
Lo que no podemos es partir en varias líneas una palabra.
Los comentarios en el código SQL comienzan por /* y terminan por */ (excepto
en algunos SGBD). En Oracle, como en otros sistemas, existe también el
comentario de una línea mediante los símbolos --:
/*
Comentario
que ocupa varias
líneas */
--Comentario de una línea
SELECT * FROM personas; --Instrucción
Nota: Estas son también las propiedades que debe cumplir cualquier nombre de objeto
en una base de datos (nombres de vistas, columnas, restricciones,…)
[2.3.2]comando CREATE TABLE
Es la orden SQL que permite crear una tabla. Por defecto será almacenada en el espacio
y esquema del usuario que crea la tabla. Sintaxis:
CREATE TABLE [esquema.] nombreDeTabla (
nombreDeLaColumna1 tipoDeDatos [DEFAULT valor]
[restricciones] [, ...]
);
Ejemplo:
CREATE TABLE proveedores (nombre VARCHAR(25));
Se puede indicar un valor por defecto para el atributo mediante la cláusula DEFAULT.
Ejemplo:
CREATE TABLE Proveedores (
nombre VARCHAR(25),
localidad VARCHAR(30) DEFAULT ‘Palencia’
);
Texto
CHARACTER(n)
Texto de anchura fija CHAR(n)
CHAR(n)
VARCHAR (n)
NATIONAL CHARACTER(n)
Texto de anchura fija
para caracteres NATIONAL CHAR(n) NCHAR(n)
nacionales
NCHAR(n)
NATIONAL CHARACTER
Texto de anchura VARYING(n)
variable para caracteres NVARCHAR2(n)
NATIONAL CHAR VARYING(n)
nacionales
NCHAR VARYING(n)
Números
Enteros pequeños
SMALLINT
(2 bytes)
BIGINT
Enteros largos (en realidad no es estándar, pero es
(8 bytes) muy utilizado en muchas bases de
datos)
Enteros
NUMBER(n)
precisión decimal
FLOAT
NUMERIC(m,d)
Decimal de coma fija NUMBER(m,d)
DECIMAL(m,d)
Fechas
INTERVAL DAY TO
INTERVALE DAY TO SECOND
SECOND
Booleanos y binarios
BOOLEAN
Booleanos (Lógicos)
BOOL
BIT
Binarios BIT VARYING
VARBIT(n)
Especiales
A partir de este punto, todos los ejemplos y explicaciones utilizarán los tipos de datos
de Oracle
[2.4.1]textos
Para almacenar texto, Oracle dispone de los siguientes tipos
VARCHAR2 . Utilizado para textos de longitud variable. En este tipo, para cada
valor, Oracle almacena primero el tamaño del texto y luego almacena el texto.
De esa forma un texto corto ocupa en disco menos que un texto largo.
Cuando se indica VARCHAR2 como tipo, se debe de indicar también un número
entre paréntesis que indicará el tamaño máximo del texto.
Para Oracle las palabras VARCHAR y VARCHAR2 son equivalentes. Pero se
aconseja utilizar VARCHAR2.
Se admiten textos que ocupen hasta 4000 bytes como máximo.
CHAR. Para textos de longitud fija. En las columnas que usen este tipo de
datos, los valores siempre ocuparán el mismo tamaño. Por ejemplo, si hemos
indicado como tipo CHAR(20), todos los textos ocuparán 20 caracteres, sean del
tamaño que sean.
El tipo CHAR, como mucho puede indicar un tamaño de 2000 bytes.
NCHAR. Uno de los problemas en todas las bases de datos tiene que ver con la
codificación del texto. A veces ocurre que la forma de codificar general de la
base de datos usa una tabla de códigos concreta (por ejemplo la ISO-88591-1 o
la propia de los sistemas de Windows conocida como WIN-1252).
El tipo NCHAR permite utilizar un segundo juego de caracteres para poder
almacenar textos usando la configuración regional de cada país. De hecho,
NCHAR usa la tabla Unicode.
Actualmente es un tipo en desuso en cuanto Unicode (en su formato UTF-8 que
Oracle llama AL32UTF8) se ha convertido en un estándar mundial. Es decir, el
tipo principal habitual hoy en día en los servidores Oracle Database es
AL32UTF8.
El resto de detalles de este tipo son los mismos que los del tipo CHAR.
NVARCHAR2. La idea es la misma que en el caso anterior, pero ahora
pensando en el almacenamiento de caracteres de longitud variable.
En todos estos tipo, conviene indicar suficiente espacio para almacenar los valores. En
el caso de los VARCHAR2, no se malgasta espacio por poner más espacio del deseado
ya que si el texto es más pequeño que el tamaño indicado, el resto del espacio se ocupa:
aunque también es conveniente ajustar ya que evita que se pueden introducir más
caracteres de los necesarios en la base de datos.
A la hora de introducir valores de tipo texto, hay que tener en cuenta que los textos
literales se entrecomillan en todas las instrucciones SQL. Ejemplo:
INSERT INTO Personas(cod_persona,nombre)
VALUES (1,‘Juan Luis’);
q’[O’Hara]’
O’Hara es un texto que tiene dentro un apostrofe (es decir, una comilla simple). Tras el
operador q, y entre comillas simples, se indican los nuevos delimitadores del texto (en
el ejemplo son los corchetes) y dentro de ellos el texto que, evidentemente, no puede
contener ninguno de los nuevos delimitadores (es decir, no puede contener corchetes).
[2.4.2]números
En Oracle, el tipo NUMBER es un tipo muy versátil que permite representar todo tipo
de números.
Su rango permite almacenar números de entre 10-130 y 9,99999999999 * 10128. Si
intentamos añadir un número fuera de este rango, Oracle produciría un error.
números de coma fija
Son los números más utilizados en las bases de datos. Indicando este tipo, se nos
permite almacenar números decimales de forma exacta,
Su desventaja es que ocupan más que los números de coma flotante y que, además, las
computadoras no saben operar con estos números de forma nativa, por lo que los
cálculos con ellos son más lentos (aunque más precisos).
Los números decimales (números de coma fija) se indican mediante el formato:
NUMBER(p,s)
Donde p es la precisión máxima del número y s es la escala (número de decimales a la
derecha de la coma). Por ejemplo, NUMBER (8,3) indica que se representan números
de ocho cifras de precisión y tres decimales. Los decimales en Oracle se presenta con el
punto y no con la coma.
Para números enteros se indica NUMBER(p) donde p es el número de dígitos. Eso es
equivalente a NUMBER(p,0).
Para números de coma flotante (equivalentes a los float o double de muchos lenguajes
de programación) simplemente se indica el texto NUMBER sin precisión ni escala.
precisión y escala
En definitiva, la precisión debe incluir todos los dígitos del número (puede llegar hasta
38 dígitos). La escala solo indica los decimales que se respetarán del número, pero si es
negativa indica ceros a la izquierda del decimal.
enteros
Oracle también permite almacenar números enteros. En este caso se indica la palabra
NUMBER seguida del número máximo de cifras que podrán almacenarse. Por ejemplo
NUMBER(8) permitiría almacenar números sin decimales de hasta ocho cifras.
números en coma flotante
Se indican simplemente con la palabra NUMBER, sin indicar número alguno después.
Como se ha indicado anteriormente, los números en coma flotante permiten almacenar
números decimales que se operan muy rápido por parte de las computadoras, pero que
no almacenan los números con exactitud absoluta. Tienen una precisión limitada.
[2.4.3]fechas y horas
almacenamiento de fechas y horas
Las fechas y las horas en Oracle (como en otros sistemas) se almacenan internamente en
un formato especial (realmente es un formato numérico). Sin embargo, las personas
representamos las fechas indicando años, meses, día del mes, hora, minutos y segundos.
Por lo tanto hay que tener en cuenta que el formato en el que se muestran las fechas por
pantalla cuando consultamos datos, es una conversión para que las personas entendamos
las fechas. Internamente se almacenan de otra forma.
Oracle posee cuatro tipos de datos relacionados con fechas.
tipo DATE
El tipo DATE permite almacenar fechas sin tener en cuenta las horas, minutos y
segundos. Oracle posee la función SYSDATE para obtener la fecha actual.
Las fechas no se pueden manipular directamente y se debe usar la función TO_DATE
(que se detallará en temas posteriores) para pasar un texto que representa fechas a la
fecha correspondiente. Ejemplo:
TO_DATE(‘3/5/2007’,’DD/MM/YYYY’)
Este tipo de datos almacena intervalos que abarcan, como mucho, años y meses.
Para indicar intervalos (por ejemplo para añadir o modificar datos de intervalos) se debe
utilizar la palabra INTERVAL. Ejemplos de uso para este tipo de intervalos son:
/* 123 años y seis meses */
INTERVAL ‘123-6’ YEAR TO MONTH
/* 123 años */
INTERVAL ‘123’ YEAR TO MONTH
/* 6 meses */
INTERVAL ‘6’ MONTH TO MONTH
Representa intervalos de tiempo que expresa días, horas, minutos y/o segundos. A la
hora de crear tablas, podemos indicar la precisión de los días indicando un número tras
la palabra DAY. Por ejemplo:
CREATE TABLE (....
intervalo INTERVAL DAY(3) TO SECOND,...
);
Se crearía una tabla en la que una columna llamada intervalo, serviría para indicar
intervalos de días, horas, minutos y segundos en el que se pueden usar hasta tres cifras
para los días.
También tras los segundos se pueden indicar números:
CREATE TABLE (....
intervalo INTERVAL DAY(3) TO SECOND(3),...
);
En este caso, se indica que en los intervalos se puede llegar hasta indicar hasta tres
decimales en los segundos.
Para indicar intervalos de este tipo al añadir o modificar datos, se utiliza la misma
palabra INTERVAL. Ejemplos de indicación de datos de intervalo son:
/* 4 días 10 horas 12 minutos y 7 con 352 segundos */
INTERVAL ‘4 10:12:7,352’ DAY TO SECOND(3)
/* 4 días 10 horas 12 minutos */
INTERVAL ‘4 10:12’ DAY TO MINUTE
/* 4 días 10 horas */
INTERVAL ‘4 10’ DAY TO HOUR
/* 4 días*/
INTERVAL ‘4’ DAY
/*10 horas*/
INTERVAL ‘10’ HOUR
/*25 horas*/
INTERVAL ‘253’ HOUR
/*12 minutos*/
INTERVAL ‘12’ MINUTE
/*30 segundos */
INTERVAL ‘30’ SECOND
/*8 horas y 50 minutos */
INTERVAL ‘8:50’ HOUR TO MINUTE;
/*7 minutos 6 segundos*/
INTERVAL ‘7:06’ MINUTE TO SECOND;
/*8 horas 7 minutos 6 segundos*/
INTERVAL ‘8:07:06’ HOUR TO SECOND;
[2.4.5]dominios
En SQL estándar tenemos la posibilidad de crear dominios. La instrucción que realiza
esta labor es CREATE DOMAIN. Sintaxis:
CREATE DOMAIN name [AS] data_type
[ DEFAULT expression ]
[ restricciones [ ... ] ]
Ejemplo:
CREATE DOMAIN Tdireccion AS VARCHAR(3);
Muestra una tabla con diversas columnas, entre ellas la columna TABLE_CATALOG
indica el catálogo en el que está la tabla, TABLE_SCHEMA el esquema en el que está
la tabla y TABLE_NAME el nombre de la tabla.
La información sobre las columnas de las tablas se consultan a través de
INFORMATION_SCHEMA.COLUMNS.
diccionario de datos de Oracle
Muchos SGBD respetan el estándar para consultar el diccionario de datos. Pero Oracle
no.
Oracle utiliza diversas vistas para mostrar las tablas de la base de datos y estas vistas
están accesibles desde cualquier esquema. Solo necesitamos disponer de los permisos
suficientes para consultar dichas vistas.
Así la vista USER_TABLES contiene una lista de las tablas del usuario actual. Por lo
tanto si deseamos consultar qué tablas posee nuestro usuario, lanzaremos la instrucción:
SELECT * FROM USER_TABLES;
[2.5.2]comando DESCRIBE
El comando DESCRIBE, permite obtener la estructura de una tabla. Ejemplo:
DESCRIBE existencias;
Y aparecerán los campos de la tabla proveedores. Esta instrucción no es parte del SQL
estándar, pero casi es considerada así ya que casi todos los SGBD la utilizan. Un
ejemplo del resultado de la orden anterior (en Oracle) sería:
CANTIDAD NUMBER(7)
La palabra PURGE hace que el borrado de la tabla sea irreversible porque la tabla no
pasa a la papelera de reciclaje (por lo tanto hay que ser muy cuidadoso en el uso de esta
opción).
Pero por coherencia es mejor hacerlo de la primera forma (la del estándar).
[2.7.3]añadir columnas
Sintaxis:
Permite añadir nuevas columnas a la tabla. Se deben indicar su tipo de datos y sus
propiedades si es necesario (al estilo de CREATE TABLE).
Las nuevas columnas se añaden al final, no se puede indicar otra posición (hay que
recordar que el orden de las columnas no importa).
Ejemplo:
[2.7.4]borrar columnas
ALTER TABLE nombreTabla DROP(columna [,columnaSiguiente,...]);
Al igual que en el caso anterior, en SQL estándar se puede escribir el texto COLUMN
tras la palabra DROP.
[2.7.5]modificar columnas
Permite cambiar el tipo de datos y propiedades de una determinada columna. Sintaxis:
ALTER TABLE nombreTabla MODIFY(columna tipo [propiedades]
[columnaSiguiente tipo [propiedades] ...]
[2.7.6]renombrar columna
Esto permite cambiar el nombre de una columna. Sintaxis
ALTER TABLE nombreTabla
RENAME COLUMN nombreAntiguo TO nombreNuevo
Ejemplo:
ALTER TABLE facturas RENAME COLUMN fecha TO fechaYhora;
Podemos consultar nuestras columnas marcadas como sin uso, de esta forma:
SELECT * FROM USER_UNUSED_COL_TABS;
Finalmente podemos eliminar las columnas marcadas como sin uso, de esta forma:
ALTER TABLE personas DROP UNUSED COLUMNS;
o UK. UNIQUE
Por ejemplo para hacer que la clave principal de la tabla Alumnos sea el código del
alumno, el nombre de la restricción podría ser alu_cod_pk.
Lo malo es que, incluso con este método, el nombre se puede repetir y además, en tablas
complejas, no es tan fácil recordar el protocolo.
Otra opción, menos compleja, es indicar las restricciones en el esquema lógico de la
base de datos. Una forma muy habitual es poner el nombre de la tabla seguida del tipo
de la restricción y un número que indique el número de ese tipo de restricción en la
tabla. Por ejemplo si observamos este esquema
[2.8.3]prohibir nulos
La restricción NOT NULL permite prohibir los nulos en una determinada tabla. Eso
obliga a que la columna tenga que tener obligatoriamente un valor para que sea
almacenado el registro.
Se puede colocar durante la creación (o modificación) del campo añadiendo la palabra
NOT NULL tras el tipo:
CREATE TABLE cliente(
dni VARCHAR2(9) CONSTRAINT clientes_nn1 NOT NULL
);
La restricción NOT NULL es la única que solo se puede poner seguida al nombre de la
columna a la que se aplica. La razón es que NOT NULL solo se puede aplicar a una
columna a la vez.
[2.8.4]valores únicos
Las restricciones de tipo UNIQUE obligan a que el contenido de una o más columnas
no puedan repetir valores en distintas filas. Ejemplo:
CREATE TABLE cliente(
dni VARCHAR2(9) CONSTRAINT clientes_nn1 UNIQUE
);
La coma tras la definición del campo cod_pelicula hace que la restricción sea
independiente de ese campo. Eso obliga a que, tras UNIQUE se indique la lista de
campos a los que se aplica la restricción.
Incluso para un solo campo se puede colocar la restricción al final de la lista en lugar de
definirlo a continuación del nombre y tipo de la columna.
Sobre las columnas con restricciones UNIQUES, automáticamente Oracle crea un
índice interno (lo que acelera las labores de búsqueda y ordenación sobre esas
columnas).
Hay que recordar que las claves alternativas en las tablas relacionales deben llevar
restricciones UNIQUE y NOT NULL.
[2.8.5]clave primaria
La clave primaria de una tabla la forman las columnas que indican a cada registro de la
misma. La clave primaria hace que los campos que la forman no puedan quedar vacíos
ni repetir valores. Además pasan a formar parte del índice principal de la tabla, que se
usa para acceder más rápidamente a estos datos.sean NOT NULL (sin posibilidad de
quedar vacíos) y que los valores de los campos sean de tipo UNIQUE (sin posibilidad
de repetición).
Si la clave está formada por un solo campo basta con:
Significa esta instrucción (en cuanto a claves foráneas) que el campo dni se relaciona
con la columna dni de la tabla clientes y el cod_película con la columna cod de la tabla
películas.
Si el campo al que se hace referencia es la clave principal, se puede obviar el nombre
del campo:
CREATE TABLE alquileres(
dni VARCHAR2(9)
CONSTRAINT alquileres_fk1 REFERENCES clientes,
cod_pelicula NUMBER(5)
CONSTRAINT alquileres_fk2 REFERENCES peliculas,
CONSTRAINT alquileres_pk PRIMARY KEY(dni,cod_pelicula)
);
En este caso se entiende que los campos hacen referencia a las claves principales de las
tablas. Si la relación está formada por más de una columna, el orden de los campos debe
de ser el mismo: aunque, en este caso, es mejor indicar explícitamente el nombre.
De hecho, cuando una relación la forman más de una columna, se debe (como siempre
ocurre en las restricciones de más de una columna) tras la lista de columnas de la tabla.
Aunque cualquier restricción (sea de una sola columna o no), se puede indicar también
al final. Ejemplo:
CREATE TABLE existencias(
tipo CHAR2(9),
modelo NUMBER(3),
n_almacen NUMBER(1)
cantidad NUMBER(7),
CONSTRAINT existencias_fk1 FOREIGN KEY(tipo,modelo)
REFERENCES piezas,
CONSTRAINT existencias_fk2 FOREIGN KEY(n_almacen)
REFERENCES almacenes,
CONSTRAINT existencias_pk
PRIMARY KEY(tipo,modelo,n_almacen)
);
[2.8.7]restricciones de validación
Son restricciones que dictan una condición que deben cumplir los contenidos de una
columna. Una misma columna puede tener múltiples CHECKS en su definición (se
pondrían varios CONSTRAINT seguidos, sin comas).
Ejemplo:
CREATE TABLE ingresos(
cod NUMBER(5) PRIMARY KEY,
concepto VARCHAR2(40) NOT NULL,
importe NUMBER(11,2) CONSTRAINT ingresos_ck1
CHECK (importe>0)
CONSTRAINT ingresos_ck2
CHECK (importe<8000)
);
En este caso las restricciones CHECK prohíbe añadir datos cuyo importe no esté entre 0
y 8000.
Aunque sería más cómodo de esta forma:
CREATE TABLE ingresos(
cod NUMBER(5) PRIMARY KEY,
concepto VARCHAR2(40) NOT NULL,
importe NUMBER(11,2) CONSTRAINT ingresos_ck1
CHECK (importe>0 AND importe<8000)
);
Para poder hacer referencia más de una columna dentro de una restricción CHECK, hay
que indicar (como siempre) la restricción tras la lista de columnas de la tabla.
CREATE TABLE ingresos(
cod NUMBER(5) PRIMARY KEY,
concepto VARCHAR2(40) NOT NULL,
importe_max NUMBER(11,2),
importe NUMBER(11,2),
CONSTRAINT ingresos_ck1 CHECK (importe<importe_max)
);
[2.8.9]borrar restricciones
Sintaxis:
ALTER TABLE tabla
DROP {PRIMARY KEY | UNIQUE(listaColumnas) |
CONSTRAINT nombreRestricción} [CASCADE]
ERROR en línea 1:
ORA-12991: se hace referencia a la columna en una restricción de
multicolumna
El error se debe a que no es posible borrar una columna que forma parte de la definición
de una instrucción. La solución es utilizar el sufijo CASCADE CONSTRAINT al
eliminar la columna.
Así, se eliminan las restricciones en las que la columna a borrar estaba implicada:
ALTER TABLE curso DROP(fecha_inicio)
CASCADE CONSTRAINTS;
Solo se permite volver a activar si los valores de la tabla cumplen la restricción que se
activa. Si hubo desactivado en cascada, habrá que activar cada restricción
individualmente..
Tipo de restricción:
C. De tipo CHECK o NOT NULL
CONSTRAINT_TYPE P. PRIMARY KEY
R. FOREIGN KEY
U. UNIQUE
CONSTRAINT-
OWNER TABLE-NAME COLUMN-NAME POSITION
NAME