El documento introduce el lenguaje SQL y su clasificación en DDL y DML. Explica que el DDL se utiliza para definir objetos en la base de datos, como tablas, índices y permisos, mientras que el DML maneja los datos almacenados, como seleccionar, insertar, actualizar y eliminar filas. A continuación proporciona ejemplos de sentencias SQL comunes pertenecientes a cada lenguaje y una tabla que resume los tipos de datos soportados por SQL. Finalmente, explica cómo se escriben las sentencias CREATE TABLE,
1. INTRODUCCION DEL LENGUAJE DE DEFINICIÓN DE DATOS
Terminología
SQL
Structured Query Language o Lenguaje de Consultas
Estructurado. Es el lenguaje que permite la
comunicación con el Sistema Gestor de Bases de Datos
(Oracle en nuestro caso).
El SQL es un lenguaje unificado
Lo utilizan todo tipo de usuarios, desde el administrador
de la base de datos, DBA, hasta el usuario final.
El SQL es un lenguaje no procedimental.
El usuario especifica Qué quiere, no Cómo ni Dónde
conseguirlo.
El SQL es relacionalmente completo.
Permite la realización de cualquier consulta de datos.
SQL= DDL + DML
Las sentencias del SQL se clasifican como parte del
DDL o del DML.
Lenguaje de Definición de Datos, DDL
sentencias del SQL que permiten definir los objetos de la
Base de Datos (create, revoke, grant, alter, etc.).
Cuando se definen dichos objetos se almacenan en el
diccionario de datos.
Lenguaje de Manipulación de Datos, DML
sentencias del SQL que se utilizan para manejar los datos
de la base de datos (select, insert, update, delete,
etc).
commit/rollback
cada vez que se realiza alguna operación en la base de
datos se realiza no sobre la tabla en sí, sino sobre una
copia local de la misma. Así, si queremos que los
resultados de la modificación se trasladen a la base de
datos y perduren en el tiempo hay que confirmar dicha
operación con el comando commit. También se puede
impedir que los últimos cambios lleguen a efectuarse con
rollback, aunque existen algunas sentencias SQL que
se 'autoconfirman' y no se pueden volver atrás.
Diccionario de la Base de Datos
Guarda la definición de todos los objetos almacenados
en la base de datos; sus características, restricciones,
privilegios, relaciones entre ellos, etc.
2. INTRODUCCION DEL LENGUAJE DE DEFINICIÓN DE DATOS
2 Tipos de Sentencias
Las sentencias SQL pertenecen a dos categorías principales:
Lenguaje de Definición de Datos, DDL y Lenguaje de
Manipulación de Datos, DML. Estos dos lenguajes no son
lenguajes en sí mismos, sino que es una forma de clasificar las
sentencias de lenguaje SQL en función de su cometido. La
diferencia principal reside en que el DDL crea objetos en la base
de datos y sus efectos se pueden ver en el diccionario de la base
de datos; mientras que el DML es el que permite consultar,
insertar, modificar y eliminar la información almacenada en los
objetos de la base de datos.
Cuando se ejecutan las sentencias DDL de SQL, el SGBD
confirma la transacción actual antes y después de cada una de
las sentencias DDL. En cambio, las sentencias DML no llevan
implícito el commit y se pueden deshacer. Existe pues un
problema al mezclar sentencias DML con DDL, ya que estas
últimas pueden confirmar las primeras de manera involuntaria e
implicita, lo que en ocasiones puede ser un problema.
A continuación se presenta una tabla con las sentencias SQL
más comunes, clasificadas según el lenguaje al que pertenecen.
Sentencia
Objetivo
DDL
Alter
Recompilar un procedimiento almacenado.
procedure
Añadir o redefinir una columna, modificar
Alter Table
la asignación de almacenamiento.
Recoger estadísticas de rendimiento sobre
Analyze los objetos de la BD para utilizarlas en el
optimizador basado en costes.
Create
Crear una tabla.
Table
Create
Crear un índice.
Index
Drop Table Eliminar una tabla.
Drop Index Eliminar un índice.
Conceder privilegios o papeles, roles, a un
Grant
usuario o a otro rol.
Truncate Eliminar todas las filas de una tabla.
Revoke Retirar los privilegios de un usuario o rol de
3. INTRODUCCION DEL LENGUAJE DE DEFINICIÓN DE DATOS
la base de datos.
Sentencia
Objetivo
DML
Insert Añadir filas de datos a una tabla.
Delete Eliminar filas de datos de una tabla.
Update Modificar los datos de una tabla.
Select Recuperar datos de una tabla.
Confirmar como permamentes las
Commit
modificaciones realizadas.
Deshacer todas las modificaciones
Rollback
realizadas desde la última confirmación.
Las sentencias que forman parte del DML (Data Management Language) lenguaje de
manipulación de datos, todas esas sentencias sirven para recuperar, insertar, borrar,
modificar los datos almacenados en la base de datos; lo que veremos en este tema son
las sentencias que afectan a la estructura de los datos.
El DDL (Data Definition Language) lenguaje de definición de datos es la parte
del SQL que más varía de un sistema a otro ya que esa área tiene que ver con cómo
se organizan internamente los datos y eso, cada sistema lo hace de una manera u
otra.
Así como el DML de Microsoft Jet incluye todas las sentencias DML que nos
podemos encontrar en otros SQLs (o casi todas), el DDL de Microsoft Jet en cambio
contiene menos instrucciones que otros sistemas.
CREATE TABLE
La sentencia CREATE TABLE sirve para crear la estructura de una tabla no para
rellenarla con datos, nos permite definir las columnas que tiene y ciertas
restricciones que deben cumplir esas columnas.
La sintaxis es la siguiente:
nbtabla: nombre de la tabla que estamos definiendo
nbcol: nombre de la columna que estamos definiendo
Tipo: tipo de dato de la columna, todos los datos almacenados en la columna
deberán ser de ese tipo. Para ver qué tipos de datos se pueden emplear haz clic aquí
Estos son los tipos de datos que soporta el SQL de Microsoft® Jet versión 4.0
4. INTRODUCCION DEL LENGUAJE DE DEFINICIÓN DE DATOS
Los sinónimos son palabras equivalentes al tipo de dato indicado.
El tamaño indica cuánto ocupará una columna del tipo indicado.
Tipo de dato Sinónimos Tamaño Descripción
BINARY VARBINARY 1 byte por Se puede almacenar cualquier tipo de datos en un campo de este
BINARY VARYING carácter tipo. Los datos no se traducen (por ejemplo, a texto). La forma en
BIT VARYING que se introducen los datos en un campo binario indica cómo
aparecerán al mostrarlos.
BIT BOOLEAN 1 byte Valores Sí y No, y campos que contienen solamente uno de dos
LOGICAL valores.
LOGICAL1
YESNO
TINYINT INTEGER1 1 byte Un número entero entre 0 y 255.
BYTE
COUNTER AUTOINCREMENT Se utiliza para campos contadores cuyo valor se incrementa
automáticamente al crear un nuevo registro.
MONEY CURRENCY 8 bytes Un número entero comprendido entre
– 922.337.203.685.477,5808 y 922.337.203.685.477,5807.
DATETIME DATE 8 bytes Una valor de fecha u hora entre los años 100 y 9999
TIME
UNIQUEIDENTIFIER GUID 128 bits Un número de identificación único utilizado con llamadas a
procedimientos remotos.
DECIMAL NUMERIC 17 bytes Un tipo de datos numérico exacto con valores comprendidos entre
DEC 1028 - 1 y - 1028 - 1. Puede definir la precisión (1 - 28) y la escala
(0 - precisión definida). La precisión y la escala predeterminadas
son 18 y 0, respectivamente.
REAL SINGLE 4 bytes Un valor de coma flotante de precisión simple con un intervalo
FLOAT4 comprendido entre – 3,402823E38 y – 1,401298E-45 para valores
IEEESINGLE negativos, y desde 1,401298E-45 a 3,402823E38 para valores
positivos, y 0.
FLOAT DOUBLE 8 bytes Un valor de coma flotante de precisión doble con un intervalo
FLOAT8 comprendido entre – 1,79769313486232E308 y –
IEEEDOUBLE 4,94065645841247E-324 para valores negativos, y desde
NUMBER
4,94065645841247E-324 a 1,79769313486232E308 para valores
positivos, y 0.
SMALLINT SHORT 2 bytes Un entero corto entre – 32.768 y 32.767.
INTEGER2
INTEGER LONG 4 bytes Un entero largo entre – 2.147.483.648 y 2.147.483.647.
INT
INTEGER4
IMAGE LONGBINARY Lo que se Desde cero hasta un máximo de 2.14 gigabytes.
GENERAL requiera Se utiliza para objetos OLE.
OLEOBJECT
TEXT LONGTEXT 2 bytes por Desde cero hasta un máximo de 2.14 gigabytes.
LONGCHAR carácter.
MEMO (Consulte las
NOTE
NTEXT
notas).
CHAR TEXT(n) 2 bytes por Desde cero a 255 caracteres.
ALPHANUMERIC carácter.
CHARACTER (Consulte las
STRING
VARCHAR
notas).
CHARACTER VARYING
NCHAR
5. INTRODUCCION DEL LENGUAJE DE DEFINICIÓN DE DATOS
NATIONAL CHARACTER
NATIONAL CHAR
NATIONAL CHARACTER
VARYING
NATIONAL CHAR VARYING
Notas:
Un campo LONGTEXT se almacena siempre en el formato de representación
Unicode.
Si se utiliza el nombre del tipo de datos TEXT sin especificar la longitud opcional
(TEXT(25), por ejemplo), se crea un campo LONGTEXT. Esto permite escribir
instrucciones CREATE TABLE que producirán tipos de datos coherentes con
Microsoft SQL Server.
Un campo CHAR se almacena siempre en el formato de representación Unicode,
que es el equivalente del tipo de datos NATIONAL CHAR del SQL de ANSI.
Si se utiliza el nombre del tipo de datos TEXT y se especifica la longitud opcional
(TEXT(25), por ejemplo), el tipo de datos del campo es equivalente al tipo de datos
CHAR. De ese modo, se mantiene la compatibilidad con versiones anteriores para la
mayoría de las aplicaciones de Microsoft Jet, a la vez que se habilita el tipo de datos
TEXT (sin especificación de longitud) para la alineación con Microsoft SQL Server.
Los caracteres de los campos definidos como TEXT (también conocidos como
MEMO) o CHAR (también conocidos como TEXT(n) con una longitud específica) se
almacenan en el formato de representación Unicode. Los caracteres Unicode
requieren siempre dos bytes para el almacenamiento de cada carácter. Para las
bases de datos de Microsoft Jet ya existentes que contengan principalmente datos de
tipo carácter, esto puede significar que el tamaño del archivo de base de datos sea
casi el doble cuando se convierta al formato Microsoft Jet 4.0. Sin embargo, la
representación Unicode de muchos juegos de caracteres, antes denominados juegos
de caracteres de un solo byte (SBCS), puede comprimirse fácilmente a caracteres de
un solo byte. Si define una columna CHAR con el atributo COMPRESSION, los datos
se comprimirán automáticamente a medida que se almacenen y se descomprimirán
cuando se recuperen de la columna.
En ACCESS 2000 se utiliza el formato de representación de caracteres Unicode, los
caracteres Unicode requieren siempre dos bytes para cada carácter lo que permite
una gama más amplia de caracteres.
Para las bases de datos de Microsoft® Jet ya existentes que contengan principalmente
datos de tipo carácter, esto puede significar que el tamaño del archivo de base de datos
sea casi el doble cuando se convierta al formato Microsoft Jet versión 4.0. Sin embargo,
la representación Unicode de muchos juegos de caracteres, antes denominados juegos
de caracteres de un solo byte (SBCS), puede comprimirse fácilmente a caracteres de un
solo byte. Si se define una columna CHARACTER con el atributo WITH COMPRESSION
(propiedad Compresión Unicode), los datos se comprimirán automáticamente cua
Los caracteres Unicode y su compresión.
6. INTRODUCCION DEL LENGUAJE DE DEFINICIÓN DE DATOS
ndo se almacenen y se descomprimirán cuando se recuperen de la columna.
Las columnas MEMO también pueden ser definidas de modo que almacenen datos
en formato comprimido. No obstante, existe una restricción. Sólo se comprimirán las
instancias de columnas MEMO que, tras la compresión, ocupen 4.096 bytes o menos.
El resto de instancias de columnas MEMO quedarán sin comprimir. Esto significa que,
dentro de una tabla determinada, para una columna MEMO dada, algunos datos
pueden estar comprimidos y otros no.
Fuente: Datos extraidos de la ayuda de Microsoft Access2000
Una restricción consiste en la definición de una característica adicional que tiene
una columna o una combinación de columnas, suelen ser características como
valores no nulos (campo requerido), definición de índice sin duplicados, definición de
clave principal y definición de clave foránea (clave ajena o externa, campo que sirve
para relacionar dos tablas entre sí).
restricción1: una restricción de tipo 1 es una restricción que aparece dentro de la
definición de la columna después del tipo de dato y afecta a una columna, la que se
está definiendo.
restricción2: una restricción de tipo 2 es una restricción que se define después de
definir todas las columnas de la tabla y afecta a una columna o a una combinación
de columnas.
Para escribir una sentencia CREATE TABLE se empieza por indicar el nombre de
la tabla que queremos crear y a continuación entre paréntesis indicamos separadas
por comas las definiciones de cada columna de la tabla, la definición de una
columna consta de su nombre, el tipo de dato que tiene y podemos añadir si
queremos una serie de especificaciones que deberán cumplir los datos
almacenados en la columna, después de definir cada una de las columnas que
compone la tabla se pueden añadir una serie de restricciones, esas restricciones
son las mismas que se pueden indicar para cada columna pero ahora pueden afectar
a más de una columna por eso tienen una sintaxis ligeramente diferente.
Una restricción de tipo 1 se utiliza para indicar una característica de la
columna que estamos definiendo, tiene la siguiente sintaxis:
La cláusula NOT NULL indica que la columna no podrá contener un valor nulo,
7. INTRODUCCION DEL LENGUAJE DE DEFINICIÓN DE DATOS
decir que se deberá rellenar obligatoriamente y con un valor válido (equivale a
del campo).
La cláusula CONSTRAINT sirve para definir una restricción que se podrá elim
columna. A cada restricción se le asigna un nombre que se utiliza para identificar
Como restricciones tenemos la de clave primaria (clave principal), la de índice
la de clave foránea.
La cláusula PRIMARY KEY se utiliza para definir la columna como clave princ
no puede contener valores nulos ni pueden haber valores duplicados en esa col
el mismo valor en esa columna.
En una tabla no pueden haber varias claves principales, por lo que no podem
una vez, en caso contrario la sentencia da un error. No hay que confundir la d
definición de una clave principal compuesta por varias columnas, esto último sí
de tipo 2.
La cláusula UNIQUE sirve para definir un índice único sobre la columna. U
valores duplicados, es decir que si una columna tiene definida un restricción d
mismo valor en esa columna. Se suele emplear para que el sistema compruebe
existen, por ejemplo si en una tabla de clientes queremos asegurarnos que dos
tabla tiene como clave principal un código de cliente, definiremos la columna dni
La cláusula NOT NULL indica que la columna no puede contener valores nulos
no puede contener el valor nulo lo podemos hacer sin poner la cláusula
CONSTRAINT.
La última restricción que podemos definir sobre una columna es la de clave f
conjunto de columnas que contiene un valor que hace referencia a una fila de otr
definir con la cláusula REFERENCES, después de la palabra reservada
opcionalmente podemos indicar entre paréntesis el nombre de la columna dond
defecto coge la clave principal de la tabla2, si el valor que tiene que buscar se en
debemos inidicar el nombre de esta columna entre paréntesis, además sólo pod
con una restricción de UNIQUE, si la columna2 que indicamos no está definid
dará un error. Si quieres repasar conceptos de clave foránea e integridad referen
Conceptos básicos de integridad referencial.
La integridad referencial es un sistema de reglas que utilizan la mayoría
asegurarse que los registros de tablas relacionadas son válidos y que no se bo
accidental produciendo errores de integridad.
Primero repasemos un poco los tipos de relaciones.
Tipos de relaciones.
Entre dos tablas de cualquier base de datos relacional pueden haber dos
relaciones uno a muchos:
Relación Uno a Uno: Cuando un registro de una tabla sólo puede estar relac
y viceversa.
Por ejemplo: tenemos dos tablas una de profesores y otra de departamento
qué departamento, tenemos una relación uno a uno entre las dos tablas ya q
profesor puede ser jefe de un solo departamento.
Relación Uno a Varios: Cuando un registro de una tabla (tabla secundaria
8. INTRODUCCION DEL LENGUAJE DE DEFINICIÓN DE DATOS
registro de la otra tabla (tabla principal) y un registro de la tabla principal pued
tabla secundaria, en este caso se suele hacer referencia a la tabla principal com
tabla 'hijo', entonces la regla se convierte en 'un padre puede tener varios hijos
fácil de recordar).
Por ejemplo: tenemos dos tablas una con los datos de diferentes poblacion
puede tener más de un habitante, pero un habitante pertenecerá (estará emp
caso la tabla principal será la de poblaciones y la tabla secundaria será la de h
habitantes pero un habitante pertenece a una sola población. Esta relación se
columna que se corresponde con la clave principal de la tabla 'padre', esta co
clave ajena o clave externa).
Una clave foránea es pues un campo de una tabla que contiene una refere
nuestro ejemplo en la tabla habitantes tenemos una columna población que con
empadronado el habitante, esta columna es clave ajena de la tabla habitant
columna codigo de poblacion clave principal de la tabla.
Relación Varios a Varios: Cuando un registro de una tabla puede estar re
tabla y viceversa. En este caso las dos tablas no pueden estar relacionadas
entre las dos que incluya los pares de valores relacionados entre sí.
Por ejemplo: tenemos dos tablas una con los datos de clientes y otra con los
cliente podrá realizar un pedido con varios artículos, y un artículo podrá ser vend
No se puede definir entre clientes y artículos, hace falta otra tabla (por ejem
clientes y con artículos. La tabla pedidos estará relacionada con cliente por u
relacionada con artículos por un relación uno a muchos.
Integridad referencial
Cuando se define una columna como clave foránea, las filas de la tabla pued
nulo (ningún valor), o bien un valor que existe en la otra tabla, un error sería a
está en la tabla de poblaciones. Eso es lo que se denomina integridad re
referencian otros (claves foráneas) deben ser correctos. La integridad referenc
datos se asegure de que no hayan en las claves foráneas valores que no estén
La integridad referencial se activa en cuanto creamos una clave foránea y a
vez que se modifiquen datos que puedan alterarla.
¿ Cuándo se pueden producir errores en los datos?
Cuando insertamos una nueva fila en la tabla secundaria y el valor de la c
9. INTRODUCCION DEL LENGUAJE DE DEFINICIÓN DE DATOS
insertamos un nuevo habitante y en la columna poblacion escribimos un códi
poblaciones (una población que no existe).
Cuando modificamos el valor de la clave principal de un registro que tiene
sustituimos el valor que tenía (1) por un nuevo valor (10), si Valencia tenía
habitantes, no pueden seguir teniendo el codigo de población 1 porque la pob
alternativas, no dejar cambiar el codigo de Valencia o bien cambiar el codig
Valencia y asignarles el código 10.
Cuando modificamos el valor de la clave foránea, el nuevo valor debe
cambiamos la población de un habitante, tenía asignada la población 1 (porqu
se le asigna la población 2 porque cambia de lugar de residencia. La población 2
Cuando queremos borrar una fila de la tabla principal y ese registro tie
población 1 (Valencia) si existen habitantes asignados a la población 1, estos
columna población porque tendrían asignada una población que no existe. En e
borrar la población 1 de la tabla de poblaciones, o bien borrarla y poner a valor n
Asociada a la integridad referencial están los conceptos de actualizar los r
cascada.
Actualización y borrado en cascada
El actualizar y/o eliminar registros en cascada, son opciones que se definen
indican al sistema gestor qué hacer en los casos comentados en el punto anterio
Actualizar registros
Esta opción le indica al sistema gestor de la base de datos que cuando se c
principal, automáticamente cambiará el valor de la clave foránea de los reg
Por ejemplo, si cambiamos en la tabla de poblaciones (la tabla principal) el va
clave principal), automáticamente se actualizan todos los habitantes (en la ta
campo poblacion (en la clave ajena) dejando 10 en vez de 1.
Si no se tiene definida esta opción, no se puede cambiar los valores de la
caso, si intentamos cambiar el valor 1 del codigo de la tabla de poblaciones
devuelve un error o un mensaje que los registros no se han podido modificar por
Eliminar registros
Esta opción le indica al sistema gestor de la base de datos que cuando s
automáticamente se borran también los registros relacio
Por ejemplo: Si borramos la población Onteniente en la tabla de poblaciones
Onteniente se borrarán de la tabla de habitantes.
Si no se tiene definida esta opción, no se pueden borrar registros de la tabla p
en la tabla secundaria. En este caso, si intentamos borrar la población Ontenien
devuelve un error o un mensaje que los registros no se han podido eliminar por
Para seguir con la instrucción CREATE TABLE pasa a la siguiente página...
Ejemplo:
CREATE TABLE
tab1 (
col1 INTEGER
10. INTRODUCCION DEL LENGUAJE DE DEFINICIÓN DE DATOS
CONSTRAINT pk
PRIMARY KEY,
col2 CHAR(25)
NOT NULL,
col3 CHAR(10)
CONSTRAINT uni1
UNIQUE,
col4 INTEGER,
col5 INT
CONSTRAINT fk5
REFERENCES
tab2 );
Con este ejemplo
estamos creando la
tabla tab1
compuesta por: una
columna llamada
col1 de tipo entero
definida como clave
principal, una
columna col2 que
puede almacenar
hasta 25 caracteres
alfanuméricos y no
puede contener
valores nulos, una
columna col3 de
hasta 10 caracteres
que no podrá
contener valores
repetidos, una
columna col4 de
tipo entero sin
ninguna restricción,
y una columna col5
de tipo entero clave
foránea que hace
referencia a valores
de la clave principal
de la tabla tab2.