Documentos de Académico
Documentos de Profesional
Documentos de Cultura
SQL Avanzado.
SQL es un lenguaje que se utiliza para interactuar con base datos de hecho ,
sql trabaja con un tipo especifico de base de datos denominado base de datos
relacionales .
CONTROL DE ACCESO
SQL puede utilizarse para restringirla capacidad del usuario para recuperar
añadir y modificar datos, protegiendo así los datos almacenados contra los
accesos no utilizados
Consultas simples
SELECT
Empezaremos por estudiar la sentencia SELECT, que permite recuperar datos de una o varias
tablas. La sentencia SELECT es con mucho la más compleja y potente de las sentencias SQL.
Empezaremos por ver las consultas más simples, basadas en una sola tabla.
Esta sentencia forma parte del DML (lenguaje de manipulación de datos), en este tema veremos
cómo seleccionar columnas de una tabla, cómo seleccionar filas y cómo obtener las filas
ordenadas por el criterio que queramos.
El resultado de la consulta es una tabla lógica, porque no se guarda en el disco sino que está en
memoria y cada vez que ejecutamos la consulta se vuelve a calcular.
Cuando ejecutamos la consulta se visualiza el resultado en forma de tabla con columnas y filas,
pues en la SELECT tenemos que indicar qué columnas queremos que tenga el resultado y qué
filas queremos seleccionar de la tabla origen.
FROM
Con la cláusula FROM indicamos en qué tabla tiene que buscar la información. En este capítulo
de consultas simples el resultado se obtiene de una única tabla. La sintaxis de la cláusula es:
Una especificación de tabla puede ser el nombre de una consulta guardada (las que aparecen en
la ventana de base de datos), o el nombre de una tabla que a su vez puede tener el siguiente
formato:
Alias tabla es un nombre de alias, es como un segundo nombre que asignamos a la tabla, si en
una consulta definimos un alias para la tabla, esta se deberá nombrar utilizando ese nombre y no
su nombre real, además ese nombre sólo es válido en la consulta donde se define. El alias se
suele emplear en consultas basadas en más de una tabla que veremos en el tema siguiente. La
palabra AS que se puede poner delante del nombre de alias es opcional y es el valor por defecto
por lo que no tienen ningún efecto.
Ejemplo: SELECT ......FROM oficinas ofi ; equivalente a SELECT ......FROM oficinas AS ofi esta
sentencia me indica que se van a buscar los datos en la tabla oficinas que queda renombrada en
esta consulta con ofi.
En una SELECT podemos utilizar tablas que no están definidas en la base de datos (siempre que
tengamos los permisos adecuados claro), si la tabla no está en la base de datos activa, debemos
indicar en qué base de datos se encuentra con la cláusula IN.
En la cláusula IN el nombre de la base de datos debe incluir el camino completo, la extensión
(.mdb), y estar entre comillas simples
Se utiliza el asterisco * en la lista de selección para indicar 'todas las columnas de la tabla'.
Tiene dos ventajas:
Si añadimos una columna nueva en la tabla, esta nueva columna saldrá sin tener que modificar la
consulta.
Se puede combinar el * con el nombre de una tabla (ej. oficinas.*), pero esto se utiliza más cuando
el origen de la consulta son dos tablas.
Las columnas se pueden especificar mediante su nombre simple (nbcol) o su nombre cualificado
(nbtabla.nbcol, el nombre de la columna precedido del nombre de la tabla que contiene la
columna y separados por un punto).
El nombre cualificado se puede emplear siempre que queramos y es obligatorio en algunos casos
que veremos más adelante.
Cuando el nombre de la columna o de la tabla contiene espacios en blanco, hay que poner el
nombre entre corchetes [ ] y además el número de espacios en blanco debe coincidir. Por ejemplo
[codigo de cliente] no es lo mismo que [ codigo de cliente] (el segundo lleva un espacio en blanco
delante de código)
Alias de columna
Cuando se visualiza el resultado de la consulta, normalmente las columnas toman el nombre que
tiene la columna en la tabla, si queremos cambiar ese nombre lo podemos hacer definiendo un
alias de columna mediante la cláusula AS será el nombre que aparecerá como título de la columna
Además de las columnas que provienen directamente de la tabla origen, una consulta SQL puede
incluir columnas calculadas cuyos valores se calculan a partir de los valores de los datos
almacenados.
Para solicitar una columna calculada, se especifica en la lista de selección una expresión en vez de
un nombre de columna. La expresión puede contener sumas, restas, multiplicaciones y divisiones,
concatenación & , paréntesis y también funciones predefinidas).
Para ordenar las filas del resultado de la consulta, tenemos la cláusula ORDER BY.
Con esta cláusula se altera el orden de visualización de las filas de la tabla pero en ningún caso
se modifica el orden de las filas dentro de la tabla. La tabla no se modifica.
Podemos indicar la columna por la que queremos ordenar utilizando su nombre de columna
(nbcolumna) o utilizando su número de orden que ocupa en la lista de selección (Nºcolumna).
Ejemplo:
SELECT nombre, oficina, contrato
FROM empleados
ORDER BY oficina
es equivalente a
ORDER BY 2
Por defecto el orden será ascendente (ASC) (de menor a mayor si el campo es numérico, por
orden alfabético si el campo es de tipo texto, de anterior a posterior si el campo es de tipo
fecha/hora, etc
Al incluir la cláusula DISTINCT en la SELECT, se eliminan del resultado las repeticiones de filas.
Si por el contrario queremos que aparezcan todas las filas incluidas las duplicadas, podemos
incluir la cláusula ALL o nada, ya que ALL es el valor que SQL asume por defecto.
Por ejemplo queremos saber los códigos de los directores de oficina.
Lista los códigos de los directores de las oficinas. El director 108 aparece en cuatro oficinas, por lo
tanto aparecerá cuatro veces en el resultado de la consulta.
En este caso el valor 108 aparecerá una sola vez ya que le decimos que liste los distintos valores
de directores
La cláusula WHERE
La cláusula WHERE selecciona unicamente las filas que cumplan la condición de selección
especificada.
En la consulta sólo aparecerán las filas para las cuales la condición es verdadera (TRUE),
SELECT nombre
FROM empleados
WHERE oficina = 12 AND edad > 30
Lista el nombre de los empleados de la oficina 12 que tengan más de 30 años. (oficina igual a 12 y
edad mayor que 30)
Una condición de selección puede dar como resultado el valor verdadero TRUE, falso FALSE o
nulo NULL.
Cuando una columna que interviene en una condición de selección contiene el valor nulo, el
resultado de la condición no es verdadero ni falso, sino nulo, sea cual sea el test que se haya
utilizado.
Por eso si queremos listar las filas que tienen valor en una determinada columna, no podemos
utilizar el test de comparación, la condición oficina = null devuelve el valor nulo sea cual sea el
valor contenido en oficina. Si queremos preguntar si una columna contiene el valor nulo debemos
utilizar un test especial, el test de valor nulo.
Tiene la
Lista los empleados asignados a alguna oficina (los que tienen un valor en la columna oficina).
Consultas multitabla
La unión de tablas
Esta operación se utiliza cuando tenemos dos tablas con las mismas columnas y queremos
obtener una nueva tabla con las filas de la primera y las filas de la segunda. En este caso la tabla
resultante tiene las mismas columnas que la primera tabla (que son las mismas que las de la
segunda tabla).
Por ejemplo tenemos una tabla de libros nuevos y una tabla de libros antiguos y queremos una
lista con todos los libros que tenemos. En este caso las dos tablas tienen las mismas columnas,
lo único que varía son las filas, además queremos obtener una lista de libros (las columnas de
una de las tablas) con las filas que están tanto en libros nuevos como las que están en libros
antiguos, en este caso utilizaremos este tipo de operación.
Cuando hablamos de tablas pueden ser tablas reales almacenadas en la base de datos o tablas
lógicas (resultados de una consulta), esto nos permite utilizar la operación con más frecuencia ya
que pocas veces tenemos en una base de datos tablas idénticas en cuanto a columnas. El
resultado es siempre una tabla lógica.
La composición de tablas
La composición de tablas consiste en concatenar filas de una tabla con filas de otra. En este caso
obtenemos una tabla con las columnas de la primera tabla unidas a las columnas de la segunda
tabla, y las filas de la tabla resultante son concatenaciones de filas de la primera tabla con filas de
la segunda tabla.
A diferencia de la unión la composición permite obtener una fila con datos de las dos tablas, esto
es muy útil cuando queremos visualizar filas cuyos datos se encuentran en dos tablas.
Por ejemplo queremos listar los pedidos con el nombre del representante que ha hecho el pedido,
pues los datos del pedido los tenemos en la tabla de pedidos pero el nombre del representante
está en la tabla de empleados y además queremos que aparezcan en la misma línea; en este
caso necesitamos componer las dos tablas (Nota: en el ejemplo expuesto a continuación, hemos
seleccionado las filas que nos interesan).
Existen distintos tipos de composición, aprenderemos a utilizarlos todos y a elegir el tipo más
apropiado a cada caso.
. El producto cartesiano
. El INNER JOIN
. El LEFT / RIGHT JOIN
El operador UNION
El operador UNION sirve para obtener a partir de dos tablas con las mismas columnas, una
nueva tabla con las filas de la primera y las filas de la segunda.
La sintaxis es la siguiente:
El INNER JOIN
El INNER JOIN es otro tipo de composición de tablas, permite emparejar filas de distintas tablas
de forma más eficiente que con el producto cartesiano cuando una de las columnas de
emparejamiento está indexada. Ya que en vez de hacer el producto cartesiano completo y luego
seleccionar la filas que cumplen la condición de emparejamiento, para cada fila de una de las
tablas busca directamente en la otra tabla las filas que cumplen la condición, con lo cual se
emparejan sólo las filas que luego aparecen en el resultado.
La sintaxis es la siguiente:
Ejemplo:
SELECT *
FROM pedidos INNER JOIN clientes ON pedidos.clie = clientes.numclie
Ejemplo:
SELECT *
FROM pedidos INNER JOIN clientes ON pedidos.clie = clientes.numclie
tabla1 y tabla2 son especificaciones de tabla (nombre de tabla con alias o no, nombre de
consulta guardada), de las tablas cuyos registros se van a combinar.
Pueden ser las dos la misma tabla, en este caso es obligatorio definir al menos un alias de tabla.
Observar que dentro de la cláusula ON los nombres de columna deben ser nombres cualificados
(llevan delante el nombre de la tabla y un punto).
Las columnas de emparejamiento deben contener la misma clase de datos, las dos de tipo texto,
de tipo fecha etc... los campos numéricos deben ser de tipos similares. Por ejemplo, se puede
combinar campos AutoNumérico y Long puesto que son tipos similares, sin embargo, no se
puede combinar campos de tipo Simple y Doble. Además las columnas no pueden ser de tipo
Memo ni OLE.
comp representa cualquier operador de comparación ( =, <, >, <=, >=, o <> ) y se utiliza para
establecer la condición de emparejamiento.
Se pueden definir varias condiciones de emparejamiento unidas por los operadores AND y OR
poniendo cada condición entre paréntesis. Ejemplo:
Las composiciones vistas hasta ahora (el producto cartesiano y el INNER JOIN) son
composiciones internas ya que todos los valores de las filas del resultado son valores que están
en las tablas que se combinan.
Con una composición interna sólo se obtienen las filas que tienen al menos una fila de la otra
tabla que cumpla la condición, veamos un ejemplo:
Queremos combinar los empleados con las oficinas para saber la ciudad de la oficina donde
trabaja cada empleado, si utilizamos un producto cartesiano tenemos:
SELECT empleados.*,ciudad
FROM empleados, oficinas
WHERE empleados.oficina = oficinas.oficina
Consultas Sumarias
Subconsultas
Una subconsulta es una sentencia SELECT que aparece dentro de otra sentencia SELECT que
llamaremos consulta principal.
Se puede encontrar en la lista de selección, en la cláusula WHERE o en la cláusula HAVING de
la consulta principal.
Una subconsulta tiene la misma sintaxis que una sentencia SELECT normal exceptuando que
aparece encerrada entre paréntesis, no puede contener la cláusula ORDER BY, ni puede ser la
UNION de varias sentencias SELECT, además tiene algunas restricciones en cuanto a número
de columnas según el lugar donde aparece en la consulta principal. Estas restricciones las iremos
describiendo en cada caso.
Cuando se ejecuta una consulta que contiene una subconsulta, la subconsulta se ejecuta por
cada fila de la consulta principal.
Las consultas que utilizan subconsultas suelen ser más fáciles de interpretar por el usuario.
Referencias externas
A menudo, es necesario, dentro del cuerpo de una subconsulta, hacer referencia al valor de una
columna en la fila actual de la consulta principal, ese nombre de columna se denomina referencia
externa.
Una referencia externa es un nombre de columna que estando en la subconsulta, no se refiere a
ninguna columna de las tablas designadas en la FROM de la subconsulta sino a una columna de
las tablas designadas en la FROM de la consulta principal. Como la subconsulta se ejecuta por
cada fila de la consulta principal, el valor de la referencia externa irá cambiando.
Ejemplo:
SELECT numemp, nombre, (SELECT MIN(fechapedido) FROM pedidos WHERE rep = numemp)
FROM empleados;
Si quitamos la cláusula WHERE de la subconsulta obtenemos la fecha del primer pedido de todos
los pedidos no del empleado correspondiente.
Anidar subconsultas
Las subconsultas pueden anidarse de forma que una subconsulta aparezca en la cláusula
WHERE (por ejemplo) de otra subconsulta que a su vez forma parte de otra consulta principal. En
la práctica, una consulta consume mucho más tiempo y memoria cuando se incrementa el
número de niveles de anidamiento. La consulta resulta también más difícil de leer , comprender y
mantener cuando contiene más de uno o dos niveles de subconsultas.
Ejemplo:
Muchos SQLs no permiten que una subconsulta aparezca en la lista de selección de la consulta
principal pero eso no es ningún problema ya que normalmente se puede obtener lo mismo
utilizando como origen de datos las dos tablas. El ejemplo anterior se puede obtener de la
siguiente forma:
En la cláusula FROM
En la cláusula FROM se puede encontrar una sentencia SELECT encerrada entre paréntesis
pero más que subconsulta sería una consulta ya que no se ejecuta para cada fila de la tabla
origen sino que se ejecuta una sola vez al principio, su resultado se combina con las filas de la
otra tabla para formar las filas origen de la SELECT primera y no admite referencias externas.
En la cláusula FROM vimos que se podía poner un nombre de tabla o un nombre de consulta,
pues en vez de poner un nombre de consulta se puede poner directamente la sentencia SELECT
correspondiente a esa consulta encerrada entre paréntesis.
Ejemplo:
En este ejemplo listamos el número y nombre de los empleados cuya fecha de contrato sea igual
a la primera fecha de todos los pedidos de la empresa.
En una cláusula WHERE / HAVING tenemos siempre una condición y la subconsulta actúa de
operando dentro de esa condición.
ANY.
ALL.
EXISTS.
Con este test la subconsulta puede tener varias columnas, no importa ya que el test se fija no en
los valores devueltos sino en si hay o no fila en la tabla resultado de la subconsulta.
Cuando se utiliza el test de existencia en la mayoría de los casos habrá que utilizar unareferencia
externa.
Si no se utiliza una referencia externa la subconsulta devuelta siempre será la misma para todas
las filas de la consulta principal y en este caso se seleccionan todas las filas de la consulta
principal (si la subconsulta genera filas) o ninguna (si la subconsulta no devuelve ninguna
Actualización de datos
La actualización de esos datos, es decir insertar nuevas filas, borrar filas o cambiar el contenido
de las filas de una tabla. Estas operaciones modifican los datos almacenados en las tablas pero
no su estructura, ni su definición.
La inserción de nuevos datos en una tabla se realiza añadiendo filas enteras a la tabla, la
sentencia SQL que lo permite es la orden INSERT INTO.
La inserción se puede realizar de una fila o de varias filas de golpe, veremos las dos opciones por
separado y empezaremos por la inserción de una fila.
La sintaxis es la siguiente:
Esta sintaxis se utiliza para insertar una sola fila cuyos valores indicamos después de la palabra
reservada VALUES. En castellano la sentencia se leería: INSERTA EN destino...VALORES ....
Destino es el nombre de la tabla donde vamos a insertar la fila también se puede utilizar un
nombre de consulta, consulta que tenga como origen de datos una única tabla. Al nombre de la
tabla se le puede añadir la cláusula IN si la tabla se encuentra en otra base de datos (en una
base de datos externa).
La palabra reservada VALUES se puede sustituir por la palabra SELECT ( en otros SQLs se
emplea únicamente VALUES).
A continuación de la palabra VALUES, entre paréntesis se escriben los valores que queremos
añadir. Estos valores se tienen que escribir de acuerdo al tipo de dato de la columna donde se
van a insertar (encerrados entre comillas simples ' ' para valores de tipo texto, entre # # para
valores de fecha...) la asignación de valores se realiza por posición, el primer valor lo asigna a la
primera columna, el segundo valor a la segunda columna, así sucesivamente...
Cuando la tabla tiene una columna de tipo contador (AutoNumber), lo normal es no asignar valor
a esa columna para que el sistema le asigne el valor que le toque según el contador, si por el
contrario queremos que la columna tenga un valor concreto, lo indicamos en la lista de valores.
Cuando no se indica ninguna lista de columnas después del destino, se asume por
El mismo orden que las columnas que enunciamos. Como no enunciamos las columnas oficina y
director se rellenarán con el valor nulo (porque es el valor que tienen esas columnas como valor
predeterminado).
El utilizar la opción de poner una lista de columnas podría parecer peor ya que se tiene que
escribir más pero realmente tiene ventajas sobre todo cuando la sentencia la vamos a almacenar
y reutilizar:
Integridad de datos
El primer paso de la especificación de los dominios de una tabla consiste en determinar los tipos de
datos de las columnas. Un dominio es el conjunto de todos los valores permitidos en una columna.
El dominio no sólo incluye el concepto del tipo de datos aplicables, sino también los valores
permitidos en la columna. Por ejemplo, el dominio de la columna Color de la tabla Production.
Product incluye el tipo de datos nvarchar y un límite de tamaño de 15 caracteres. El dominio
también podría especificar las cadenas de caracteres admitidas en la columna, como Red, Blue,
Green, Yellow, Brown, Black, White, Teal, Gray y Silver. Para obtener más información, vea Tipos
de datos (motor de base de datos).
Dos pasos importantes en el diseño de las tablas son la identificación de valores válidos para una
columna y la determinación de cómo forzar la integridad de los datos en la columna. La integridad
de datos pertenece a una de las siguientes categorías:
• Integridad de entidad
• Integridad de dominio
• Integridad referencial
• Integridad definida por el usuario
Integridad de entidad
La integridad de entidad define una fila como entidad única para una tabla determinada. La
integridad de entidad exige la integridad de las columnas de los identificadores o la clave principal
de una tabla, mediante índices y restricciones UNIQUE, o restricciones PRIMARY KEY.
Valores NULL
Las columnas pueden aceptar o rechazar valores NULL. NULL es un valor especial en las bases
de datos que representa el concepto de un valor desconocido. NULL es diferente de un carácter en
blanco ó 0. En realidad, el carácter en blanco es un carácter válido y 0 es un número válido. NULL
simplemente representa la idea de que este valor no se conoce. NULL tampoco es lo mismo que
una cadena de longitud cero. Si la definición de una columna contiene la cláusula NOT NULL, no
se pueden insertar filas que tengan el valor NULL en dicha columna. Si la definición de una
columna sólo tiene la palabra clave NULL, acepta valores NULL.
La aceptación de valores NULL en una columna puede aumentar la complejidad de las
comparaciones lógicas que utilicen la columna. El estándar ISO determina que las comparaciones
con valores NULL no se evalúan como TRUE o FALSE, sino como UNKNOWN.Esto introduce una
lógica de tres valores en los operadores de comparación, que puede ser difícil de controlar
correctamente.
Para mantener los dos tipos de integridad, se utilizan los objetos siguientes:
• Restricciones
• Reglas
• Valores predeterminados
• Desencadenadores DML
Restricciones
Las restricciones le permiten definir la manera en que Database Engine (Motor de base de datos)
exigirá automáticamente la integridad de una base de datos. Las restricciones definen reglas
relativas a los valores permitidos en las columnas y constituyen el mecanismo estándar para exigir
la integridad. El uso de restricciones es preferible al uso de Desencadenadores DML, reglas y
valores predeterminados.El optimizador de consultas también utiliza definiciones de restricciones
para generar planes de ejecución de consultas de alto rendimiento.
Clases de restricciones
SQL Server admite las siguientes clases de restricciones:
• NOT NULL especifica que la columna no acepta valores NULL. Para obtener más
información, vea Permitir valores NULL.
• Las restricciones CHECK exigen la integridad del dominio mediante la limitación de los
valores que se pueden asignar a una columna. Para obtener más información, vea
Restricciones CHECK.
Una restricción CHECK especifica una condición de búsqueda booleana (se evalúa como
TRUE, FALSE o desconocido) que se aplica a todos los valores que se indican en la
columna. Se rechazan todos los valores que se evalúan como FALSE. En una misma
columna se pueden especificar varias restricciones CHECK. En el siguiente ejemplo se
muestra la creación de la restricción chk_id. Esta restricción aumenta las exigencias del
dominio de la clave principal asegurándose de que se indiquen para la clave solamente los
números comprendidos en un intervalo especificado.
CREATE TABLE cust_sample
(
cust_id int PRIMARY KEY,
cust_name char(50),
cust_address char(50),
cust_credit_limit money,
CONSTRAINT chk_id CHECK (cust_id BETWEEN 0 and 10000 )
)
Las restricciones PRIMARY KEY identifican la columna o el conjunto de columnas cuyos valores
identifican de forma exclusiva cada una de las filas de una tabla. Para obtener más información,
vea Restricciones PRIMARY KEY.
Dos filas de la tabla no pueden tener el mismo valor de clave principal. No se pueden asignar
valores NULL a ninguna de las columnas de una clave principal. Se recomienda utilizar una
columna pequeña de tipo entero como clave principal. Todas las tablas tienen que tener una clave
principal. Una columna o combinación de columnas certificada como valor de clave principal se
denomina clave candidata.
En el siguiente ejemplo se crea la tabla part_sample y especifica el campo part_nmbr como clave
principal.
Copiar código
CREATE TABLE part_sample
(part_nmbr int PRIMARY KEY,
part_name char(30),
part_weight decimal(6,2),
part_color char(15) );
Las restricciones FOREIGN KEY identifican y exigen las relaciones entre las tablas. Para
obtener más información, vea Restricciones FOREIGN KEY.
Una clave externa de una tabla apunta a una clave candidata de otra tabla. En el siguiente
ejemplo, la tabla order_part establece una clave externa que hace referencia a la tabla
part_sample previamente definida.
Copiar código
CREATE TABLE order_part
(order_nmbr int,
part_nmbr int
FOREIGN KEY REFERENCES part_sample(part_nmbr)
ON DELETE NO ACTION,
qty_ordered int);
GO
No se puede insertar una fila que tenga un valor de clave externa, excepto NULL, si no hay una
clave candidata con dicho valor. La cláusula ON DELETE controla las acciones que se llevarán a
cabo si intenta eliminar una fila a la que apuntan las claves externas existentes. a cláusula ON
DELETE tiene las siguientes opciones:
• SET DEFAULT especifica que todas las filas con claves externas que apuntan a la
fila eliminada se establecen en sus valores predeterminados. Para obtener más
información, vea Valores predeterminados.
La cláusula ON UPDATE define las acciones que se llevarán a cabo si intenta actualizar un valor
de clave candidata a la que apuntan las claves externas existentes. Esta cláusula también admite
las opciones NO ACTION, CASCADE, SET NULL y SET DEFAULT
.
La regla de actializacion indica al DBMS lo que debe hacer cuando un usuario intente eliminar una
fila de la tabla padre. Se pueden especificar cuatro reglas de eliminación
Al igual que la regla de eliminación indica al DBMS lo que debe hacer cuando un usuario untente
eliminar una fila de la tabla padre, la regla de actualización indica al DBMS lo que debe hacer
cuando un usuario intente actualizar el valor de una de las columnas de la clave primaria de la
tabla padre , hay cuatro posibiñidade que recuerdan a las disponibles para las reglas de
eliminación:
DEPT:
EMP:
Si se quiere ver el contenido de toda la tabla EMP, puede sustituirse toda la lista de columnas por
un asterisco:
En los ejemplos, para facilitar la lectura, se escriben los comandos en diversas líneas, pero puede
hacerse en una sola línea, por ejemplo:
SELECT * FROM DEPT; Headers(); PrintAll;
1. No todas las consultas pueden expresarse en SQL, ya que SQL no dispone del poder
expresivo de un lenguaje de propósito general. Así, existen consultas que se pueden
expresar en lenguajes como Pascal, C, Cobol o Fortran y que no se pueden expresar en
SQL. Para formular consultas de este tipo, podemos utilizar SQL dentro de un lenguaje
más potente. SQL está diseñado de tal forma que las consultas formuladas puedan
optimizarse automáticamente y ejecutarse de manera eficiente (al proporcionar toda la
potencia de un lenguaje de programación, la optimización automática es extremadamente
difícil.
La norma SQL define la utilización de SQL dentro de varios lenguajes de programación, tales como
C, Cobol, Pascal, Java, PL/I y Fortran. Un lenguaje en el cual se introducen consultas SQL se
denomina lenguaje anfitrión y las estructuras SQL que se admiten
en el lenguaje anfitrión constituyen SQL incorporado.
Para identificar las consultas de SQL incorporado, se utiliza la instrucción EXEC SQL, que tiene la
siguiente forma:
EXEC SQL <instrucción de SQL incorporado>
END-EXEC
La sintaxis exacta de las consultas en SQL incorporado depende del lenguaje dentro del que se
utilicen.
El sistema previsto por el estándar para crear los espacios separados de nombres consiste en usar
las instrucciones SQL "CREATE SCHEMA". A menudo, dicho sistema no se usa (o por lo menos
no con los fines y el significado previstos por el estándar), pero cada DBMS prevé un
procedimiento propietario para crear una base de datos. Normalmente, se amplía el lenguaje SQL
introduciendo una instrucción no prevista en el estándar: "CREATE DATABASE".
La sintaxis empleada por PostgreSQL, pero también por las DBMS más difundidas, es la siguiente:
Con PostgreSQL está a disposición una orden invocable por shell Unix (o por shell del sistema
usado), que ejecuta la misma operación:
createdb biblio
Una vez creada la base de datos, se pueden crear las tablas que la componen. La instrucción SQL
propuesta para este fin es:
nombre_columna: es el nombre de la columna que compone la tabla. Sería mejor no exagerar con
la longitud de los identificadores de columna, puesto que SQL Entry Level prevé nombres con no
más de 18 caracteres. Consúltese, de todos modos, la documentación de la base de datos
específica. Los nombres tienen que comenzar con un carácter alfabético.
tipo_columna: es la indicación del tipo de dato que la columna podrá contener. Los principales tipos
previstos por el estándar SQL son:
• CHARACTER(n)
Una cadena de longitud fija con exactamente n caracteres. CHARACTER se puede
abreviar con CHAR
• CHARACTER VARYING(n)
Una cadena de longitud variable con un máximo de n caracteres. CHARACTER VARYING
se puede abreviar con VARCHAR o CHAR VARYING.
• INTEGER
Un número estero con signo. Se puede abreviar con INT. La precisión, es decir el tamaño
del número entero que se puede memorizar en una columna de este tipo, depende de la
implementación de la DBMS en cuestión.
• SMALLINT
Un número entero con signo y una precisión que no sea superior a INTEGER.
• FLOAT(p)
Un número con coma móvil y una precisión p. El valor máximo de p depende de la
implementación de la DBMS. Se puede usar FLOAT sin indicar la precisión, empleando,
por tanto, la precisión por defecto, también ésta dependiente de la implementación. REAL y
DOUBLE PRECISION son sinónimo para un FLOAT con precisión concreta. También en
este caso, las precisiones dependen de la implementación, siempre que la precisión del
primero no sea superior a la del segundo.
• DECIMAL(p,q)
Un número con coma fija de por lo menos p cifras y signo, con q cifras después de la
coma. DEC es la abreviatura de DECIMAL. DECIMAL(p) es una abreviatura de
DECIMAL(p,0). El valor máximo de p depende de la implementación.
• INTERVAL
Un periodo de tiempo (años, meses, días, horas, minutos, segundos y fracciones de
segundo).
donde valor es un valor válido para el tipo con el que la columna se ha definido.
vínculos_de_columna: son vínculos de integridad que se aplican a cada atributo concreto. Son:
• NOT NULL, que indica que la columna no puede tomar el valor NULL.
• PRIMARY KEY, que indica que la columna es la llave primaria de la tabla.
• una definición de referencia con la que se indica que la columna es una llave externa hacia
la tabla y los campos indicados en la definición. La sintaxis es la siguiente:
Las cláusulas ON DELETE y ON UPDATE indican qué acción hay que ejecutar en el caso
en que una tupla en la tabla referenciada sea eliminada o actualizada. De hecho, en dichos
casos en la columna referenciante (que es la que se está definiendo) podría haber valores
inconsistentes. Las acciones pueden ser:
• un control de valor, con el que se permite o no asignar un valor a la columna en función del
resultado de una expresión. La sintaxis que se usa es:
CHECK (expresión_condicional)
vínculo_de_tabla: son vínculos de integridad que se pueden referir a más columnas de la tabla.
Son:
PRIMARY KEY ( columna1 [ , columna2 ... ] ) Véase que en este caso, a diferencia de la
definición de la llave primaria como vínculo de columna, ésta se puede formar con mas de
un atributo.
• un control de valor, con la misma sintaxis y significado que el que se puede usar como
vínculo de columna.
Para aclarar mejor el uso de la instrucción CREATE TABLE, veamos algunas órdenes que
implementan la base de datos bibliográfica ejemplificada.
La instrucción anterior crea la tabla Publication, formada por las dos columna ID de tipo INTEGER,
y type de tipo CHAR(18). ID es la llave primaria de la relación. En el atributo type hay un vínculo de
no nulidad.
Crea la relación Book, formada por nueve atributos. La llave primaria es el atributo ID, que es
también una llave externa hacia la relación Publication. Sobre los atributos title, publisher y
pub_year hay vínculos de no nulidad. Además, el atributo publisher es una llave externa hacia la
tabla Publisher.
Crea la relación Author, compuesta por dos atributos: publicationID y personID. La llave primaria en
este caso está formada por la combinación de los dos atributos, como está indicado por el vínculo
de tabla PRIMARY KEY. PublicationID es una llave externa hacia la relación Publication, mientras
que personID lo es hacia la relación Person.
El archivo create_biblio.sql contiene todas las órdenes necesarias para crear la estructura de la
base de datos bibliográfica ejemplificada.
SQL dinámico
VISTAS
Una vista es una tabla derivada de otras tablas (básicas o virtuales).Una vista se caracteriza
porque:
Las vistas ofrecen una gran variedad de ventajas y pueden resultar utiles en muchos tipos
diferentes de bases de datos. En las bases de datos para computadoras personales las vistas
suelen ser una comodidad , y se definen para simplificar las peticiones a la base de datos, las
vistas ofrecen esta ventajas principales:
• SEGURIDAD: Se puede conceder permiso a cada usuario para que solo tenga acceso a
la base de datos concretos que ese usuario esta autorizado a ver , restringiendo asi el
acceso de los usuarios a los datos almacenados.
• SIMPLICIDAD DE LAS CONSULTAS: Las vistas pueden extraer datos de varias tablas
diferentes y presentarlas como si fueran una sola tabla , convirtiéndolo las consultas a
varias tablas en consultas a una sola tabla formuladas a la vista.
• SIMPLICIDAD ESTRUCTURAL: las vistas pueden ofrecer a los usuarios una vista
personalizada de la estructura de la base de datos, presentando la base de datos como un
conjunto de tablas virtuales que tiene sentido para el usuario.
• AISLAMIENTO DE LAS MODIFICACIONES: Las vistas pueden presentar una imagen
consistente y no nodificada de las estructura dr la base de datos, aunque las tablas
fuentes subyacentes se dividan , se restructuren o cambien de nombre.
• INTEGRIDAD DE LOS DATOS: Si se tiene acceso a los datos y se introducen mediante
vistas, el DBMS pueden comprobarlos de manera automática para asegurarse de que
cumplen las restricciones de integridad especificadas.
Creacion de vistas
CREATE VIEW es la orden que permite la creación de la vista. vista es el nombre de la tabla virtual
que se va a crear.(comalista_columna) son los nombres de los atributos de la tabla y es opcional,Si
no se especifica, el nombre coincide con el nombre de los atributosresultantes en expresión_tabla.
es obligatorio si algún atributo de expresión_tabla es el resultado de una función de agregación o
una operación aritmética.
La sintaxis para la creación de vistas en SQL es la siguiente:
Reglas Evento-Condición-Acción.
Forma de una regla de actividad:
Evento - Condición - Acción
acción que el sistema ejecuta cuando como respuesta a la ocurrencia de
un evento cuando cierta condición se satisface:
• evento: operación de actualización
• condición: expresión lógica del SQL. Sólo se ejecutará la acción si
esta condición existe y es verdadera.
• acción: procedimiento escrito en un lenguaje de programación que
incluye instrucciones de manipulación de la BD.
Disparadores en SQL.
definición_regla::=
{CREATE | REPLACE} TRIGGER nombre_regla
{BEFORE | AFTER | INSTEAD OF} evento [disyunción_eventos]
ON {nombre_relación | nombre_vista}
[ [REFERENCING OLD AS nombre_referencia
[NEW AS nombre_referencia] ]
[FOR EACH {ROW | STATEMENT} [WHEN ( condición ) ] ]
bloque PL/SQL
disyunción_eventos ::= OR evento [disyunción_eventos]
evento ::= INSERT | DELETE | UPDATE [OF comalista_nombre_atributo]
EVENTOS
{BEFORE | AFTER | INSTEAD OF} evento [disyunción_eventos]
ON {nombre_relación | nombre_vista}
disyunción_eventos ::= OR evento [disyunción_eventos]
evento ::=
INSERT | DELETE | UPDATE [OF comalista_nombre_atributo]
EVENTOS
Parametrización de eventos:
– los eventos de las reglas FOR EACH ROW están parametrizados pametrización implícita:
• evento INSERT o DELETE: n (n grado de la relación)
• evento UPDATE: 2*n
– nombre de parámetros:
• evento INSERT: NEW
• evento DELETE: OLD
• evento UPDATE: OLD y NEW
– se pueden usar en la condición de la regla
Disparadores en SQL.
ACCIONES
bloque PL/SQL
– bloque escrito en el lenguaje de programación de Oracle PL/SQL
– sentencias de manipulación de la BD: INSERT, DELETE, UPDATE,
SELECT ... INTO ...
– sentencias de programa: asignación, selección, iteración
– sentencias de manejo de errores
– sentencias de entrada/salida.
Lenguaje de reglas:
• Creación: CREATE TRIGGER nombre_regla ...
• Eliminación: DROP TRIGGER nombre_reglas
• Modificación: REPLACE TRIGGER nombre_regla ...
• Recompilación: ALTER TRIGGER nombre_regla COMPILE
• Des/Habilitar regla: ALTER TRIGGER nombre_regla [ENABLE | DISABLE]
• Des/Habilitar todas las reglas sobre una relación:
Estructura básica
La estructura básica de una expresión para consulta SQL consta de tres cláusulas:
• SELECT
• FROM
• WHERE
La cláusula SELECT se usa para listar los atributos que se desean en el resultado de una consulta.
La cláusula FROM lista las relaciones que se van a examinar en la evaluación de la expresión
La cláusula WHERE costa de un predicado que implica atributos de las relaciones que aparecen en
la cláusula FROM.
Una consulta básica en SQL tiene la forma:
SELECT A1,A2,...,An
FROM r1,r2,...,rn
WHERE P
Donde Ai = atributo ( Campo de la tabla )
ri = relación ( Tabla )
P = predicado ( condición )
Ejemplo 2.1 : Seleccionar todos los nombres de las personas que tengan el apellido MARQUESI de
la tabla persona
SELECT nombre
FROM persona
WHERE apellido = " MARQUESI"
ANSWER NOMBRE
1 MARTIN
2 PABLO
El resultado de una consulta es por supuesto otra relación. Si se omite la cláusula WHERE, el
predicado P es verdadero. La lista A1, A2,..., An puede sustituirse por un asterisco (*) para
seleccionar todos los atributos de todas las relaciones que aparecen en la cláusula FROM, aunque
no es conveniente elegir esta ultima opción salvo que sea necesario pues desperdiciamos mucho
tiempo en obtenerlo
Alias
Es posible renombrar los atributos y las relaciones, a veces por conveniencia y otras veces por ser
necesario, para esto usamos la clausula AS como en el siguiente ejemplo.
Ejemplo 2.2
SELECT P.nombre AS [PRIMER NOMBRE]
FROM persona P
WHERE apellido = "MARQUESI"
1 MARTIN
2 PABLO
En este ejemplo cabe destacar un par de cosas. Cuando nos referimos a un atributo como es el
caso de nombre, podemos referirnos a este usando la relación ( o el alias en este ejemplo ) a la
que pertenece el atributo seguido de un punto seguido del atributo <P.nombre>, a veces esta
notación será necesaria para eliminar ambigüedades. Los corchetes los usamos cuando usamos
espacios en blancos o el caratér (–) en el nombre de atributo o alias.
Usar alias en los atributos nos permite cambiar el nombre de los atributos de la respuesta a la
consulta.
Cuando asociamos un alias con una relación decimos que creamos una variable de tupla. Estas
variables de tuplas se definen en la cláusula FROM después del nombre de la relación.
En las consultas que contienen subconsultas, se aplica una regla de ámbito a las variables de
tupla. En una subconsulta esta permitido usar solo variables de tupla definidas en la misma
subconsulta o en cualquier consulta que tenga la subconsulta.
3. Predicados y conectores
• AND
• OR
• NOT
La lógica de estos conectores es igual que en cualquier lenguaje de programación y sirven para
unir predicados.
Las operaciones aritméticas en SQL son:
• + ( Suma )
• - ( Resta )
• * ( Multiplicación )
• / ( División )
También incluye el operador de comparación BETWEEN, que se utiliza para valores comprendidos
Ejemplo 3.1 encontrar todos los nombres y dni de las personas cuyos dni sea mayor que 26
millones y menor a 28 millones
SELECT nombre, dni
FROM persona
WHERE dni BETWEEN 26000000 and 28000000
1 MARTIN 26125988
2 ESTEFANIA 27128064
3 MELISA 27456224
4 BETANIA 27128765
Estos modelos se expresan usando el operador de comparación LIKE. Un error muy frecuente es
tratar de utilizar los modelos mediante el operador de igualdad ( = ) lo cual es un error de sintaxis.
Ejemplo 3.2 : encontrar los nombres que comiencen con la letra p o el nombre tenga exactamente
6 caracteres de la relación persona
SELECT nombre
FROM persona
WHERE (nombre LIKE "P%") OR (nombre LIKE "_ _ _ _ _ _")
ANSWER NOMBRE
1 MARTIN
2 PABLO
3 MELISA
4 SANDRA
ASWER APELLIDO
1 MARQUESI
2 SANCHEZ
3 GUISSINI
4 ALEGRATO
5 BRITTE
6 ARDUL
7 MICHELLI
8 MUSACHEGUI
9 SERRAT
Si observamos la tabla original de la relación persona veremos que el apellido marquesi aparecía
dos veces, pero debido al uso de DISTINCT en la consulta la relación respuesta solo lista un solo
marquesi.
Operaciones de conjunto.
SQL incluye las operaciones de conjuntos UNION, INTERSECT, MINUS, que operan sobre
relaciones y corresponden a las operaciones del álgebraunión, intersección y resta de conjuntos
respectivamente. Para realizar esta operación de conjuntos debemos tener sumo cuidado que las
relaciones tengan las mismas estructuras.
Incorporemos ahora una nueva relación, llamada jugadores que representa las personas que
juegan al fútbol, sus atributos serán DNI, puesto y nro_camiseta. Supongamos que esta nueva
tabla esta conformada de la siguiente manera
2 25485699 MEDIO 5
3 28978845 ARQUERO 1
4 29789854 DEFENSOR 3
Ejemplo 4.2 : Obtener todos los nombres de la relación persona cuyos apellidos sean Marquesi o
Serrat
SELECT nombre
FROM PERSONA
WHERE apellido = "MARQUESI"
UNION
SELECT nombre
FROM PERSONA
WHERE apellido = "SERRAT"
1 MARTIN
2 PABLO
3 JUAN
Ejemplo 4.3 : Obtener todos los DNI de los que juegan al fútbol y, además, están en la lista de la
relación persona
SELECT dni
FROM persona
INTERSECT
SELECT dni
FROM jugadores
ANSWER DNI
1 26125988
2 25485699
3 28978845
Por omisión, la operación de union elimina las tuplas duplicadas. Para retener duplicados se debe
escribir UNION ALL en lugar de UNION.
Pertenencia a un conjunto
El conector IN prueba si se es miembro de un conjunto, donde el conjunto es una colección de
valores producidos en lo general por una cláusula SELECT. Análogamente el conector NOT IN
prueba la no pertenencia al conjunto
Ejemplo 4.4 : Encontrar los nombres de las personas que juegan al fútbol y, además, se
encuentran en la relación persona
SELECT nombre, apellido
FROM persona
WHERE dni IN
(SELECT dni
FROM jugadores)
s
MARTIN MARQUESI
1
2 PABLO MARQUESI
3 JUAN SERRAT
Es posible probar la pertenencia de una relación arbitraria SQL usa la notación de elementos
<v1,v2,...,vn> para representar una tupla de elementos de n que contiene los valores v1,v2,...,vn.
Comparación de conjuntos
En conjuntos la frase << mayor que algún >> se representa en SQL por ( >SOME ), también podría
entenderse esto como << mayor que el menor de >>, su sintaxis es igual que la del conector IN.
SQL también permite las comparaciones ( >SOME ),( =SOME ) ( >=SOME ), ( <=SOME ) y
( <>SOME ).
También existe la construcción ( >ALL ), que corresponde a la frase << mayor que todos >>. Al
igual que el operador SOME, puede escribirse ( >ALL ),( =ALL ) ( >=ALL ), ( <=ALL ) y ( <>ALL ).
En ocasiones podríamos querer comparar conjuntos para determinar si un conjunto contiene los
miembros de algún otro
conjunto. Tales comparaciones se hacen usando las construcciones CONTAINS y NOT
CONTAINS
La construcción EXISTS devuelve el valor TRUE si la subconsulta del argumento no esta vacía, y
la construcción NOT EXISTS devuelve TRUE si la consulta es vacía.
Ejemplo 5.1 : encontrar todos los nombre y apellidos de la relación persona si es que en la relación
jugadores existe un jugador con el numero de dni 27128055
SELECT nombre, apellido
FROM persona
WHERE EXISTS
(SELECT dni
FROM jugadores
WHERE dni = 27128055 )
ANSWER NOMBRE APELLIDO
Como el dni = 27128055 no existe en la relación jugadores, la condición es FALSE y por lo tanto la
respuesta es vacía
SQL ofrece al usuario cierto control sobre el orden en el que se va a presentar las tuplas en una
relación. La cláusula ORDER BY hace que las tupla en el resultado dé una consulta en un orden
especifico.
Por omisión SQL lista los elementos en orden ascendente. Para especificar el tipo de ordenación,
podemos especificar DESC para orden descendente o ASC para orden ascendente.
También es posible ordenar los resultados por mas de una atributo
Ejemplo 6.1 : encontrar todos los nombres y apellido de la relación persona y ordenar los
resultados por apellido y nombre en forma descendente
SELECT apellido, nombre
FROM persona
ORDER BY apellido DESC, nombre DESC
1 SERRAT JUAN
2 SANCHEZ ROBERTO
3 MUSACHEGUI BETANIA
4 MICHELLI SOLEDAD
5 MARQUESI PABLO
6 MARQUESI MARTIN
7 GUISSINI ESTEFANIA
8 BRITTE SANDRA
9 ARDUL MELISA
10 ALEGRATO RUBEN
Funciones de agregación
SQL ofrece la posibilidad de calcular funciones en grupos de tuplas usando la cláusula GROUP
BY, también incluye funciones para calcular
• Promedios AVG
• Mínimo MIN
• Máximo MAX
• Total SUM
• Contar COUNT
Para los próximos ejemplos incorporamos una nueva relación llamada PRO que representara los
jugadores profesionales de fútbol, sus atributos serán dni, años_pro, club, valor_actual. Y los
valores son los siguientes:
Ejemplo 6.2: determinar el valor total en jugadores así como también la cantidad de jugadores de
cada club en la relación pro
SELECT club, SUM(valor_actual) AS VALOR_TOTAL,
COUNT(club) AS NRO_JUGADORES
FROM pro
GROUP BY CLUB
2 LANUS 18.950,00 3
Ejemplo 6.3: Determinar por cada club cual es el valor_actual del jugador mas caro de la relación
pro
2 LANUS 12000
Hay ocasiones en la que los duplicados deben eliminarse antes de calcular una agregación.
Cuando queremos eliminar los duplicados del calculo usamos la palabra clave DISTINCT
antepuesto al atributo de agregación que queremos calcular, como por ejemplo COUNT(DISTINCT
club).
Hay ocasiones en las que es útil declara condiciones que se aplican a los grupos mas que a las
tuplas. Para esto usamos la cláusula HAVING de SQL.
Ejemplo 6.4: Determinar por cada club cual es el valor_actual del jugador mas caro, pero con la
condición de que este sea mayor a 10000 de la relación pro
SELECT club, MAX(valor_actual) AS JUG_MAS_CARO
FROM pro
GROUP BY CLUB
HAVING MAX(valor_actual) > 10000
1 LANUS 12000
Si en la misma consulta aparece una cláusula WHERE y una cláusula HAVING, primero se aplica
el predicado de la cláusula WHERE, las tupla que satisfacen el predicado WHERE son colocadas
en grupos por la cláusula GROUP BY. Después se aplica la cláusula HAVING a cada grupo.
Eliminación
Una solicitud de eliminación se expresa casi de igual forma que una consulta. Podemos suprimir
solamente tuplas completas, no podemos suprimir valores solo de atributos.
DELETE FROM r
WHERE P
Donde P presenta un predicado y r representa una relación. Las tuplas t en r para las cuales P(t) es
verdadero, son eliminadas
de r.
Si omitimos la cláusula WHERE se eliminan todas las tuplas de la relación r ( un buen
sistemadebería buscar confirmación del usuario antes de ejecutar una acción tan devastadora )
Ejemplo 7.1 : Eliminar todas las tuplas de la relación persona en donde apellido sea igual a
"BRITTE"
DELETE FROM persona
WHERE apellido = "BRITTE"
Inserción
Para insertar datos en una relación, especificamos una tupla que se va a insertar o escribimos una
consulta cuyo resultado es un conjunto de tuplas que se van a insertar. La inserción de tuplas la
realizamos mediante las sentencias
INSERT INTO r1
VALUES (v1,v2,...,v)
Ejemplo 7.2 : Insertar una tupla con los mismos valores de la tupla eliminada en el ejemplo anterior
en la relación persona.
INSERT INTO persona
VALUES ("SANDRA","BRITTE",25483669)
En este ejemplo, los valores se especifican en el orden en que se listan los atributos
correspondientes en el esquema de relación. Para poder ingresar los datos en un orden diferente
podríamos haber escrito
INSERT INTO persona(DNI, NOMBRE, APELLIDO)
VALUES (25483669,"SANDRA","BRITTE")
Actualizaciones
En ciertas ocasiones podemos desear cambiar los valores de una tupla sin cambiar todos los
valores en dicha tupla. Para este propósito usamos la sentencia
UPDATE r1
SET A1 = V1, A2 = V2,...,An = Vn
WHERE P
Donde r1 es la relación Ai el atributo a modificar Vi el valor que se le asignara a Ai y P es el
predicado.
Ejemplo 7.3 : En la relación jugadores actualizar la posición de los jugadores que posean la
camiseta numero 5 y asignarles la camiseta numero 7.
UPDATE jugadores
SET nro_camiseta = 7
WHERE nro_camiseta = 5
1 25485699 MEDIO 5
8. Valores nulos
Es posible que para las tuplas insertadas se den valores únicamente a algunos atributos del
esquema. El resto de los atributos son asignados a valores nulos representados por NULL. Para
esto colocamos la palabra reservada NULL como valor del atributo.
Ejemplo 7.4 : Insertar en la relación jugadores un jugador con dni = 26356312, puesto = defensor, y
al cual aun no le han asignado un nro_camiseta.
INSERT INTO jugadores
VALUES(26356312,"DEFENSOR", NULL)
9. Definición de datos
Creación
Una relación en SQL se define usando la orden
CREATE TABLE r(A1 D1, A2 D3,...,An Dn)
Donde r es el nombre de la relación, cada Ai es el nombre de un atributo del esquema de la
relación r y Di es el tipo de dato de Ai. Una relación recién creada esta vacía. La orden INSERT
puede usarse para cargar la relación
Ejemplo 9.1 : crear la relación lesionado con los atributos nombre, apellido ambos de tipo char y
tiempo_inhabilit de tipo entero
CREATE TABLE "lesionado.db" (
NOMBRE CHAR(20),
APELLIDO CHAR(20),
TIEMPO_INHABILT INTEGER)
Eliminación
Para eliminar una relación usamos la orden DROP TABLE r, esta orden elimina toda la información
sobre la relación sacada de la base de datos, esta orden es mas fuerte que DELET FROM r ya que
esta ultima elimina todas las tuplas pero no destruye la relación, mientras que la primera si.
Ejemplo 9.2 : eliminar la relación persona
DROP TABLE persona
Actualizacion
La orden ALTER TABLE se usa para añadir atributos a una relación existente. A todas las tuplas
en la relación se les asigna NULL como valor de atributo. La sintaxis de ALTER TABLE es la
siguiente:
ALTER TABLE r1 ADD A1 D1
Ejemplo 9.3 : agregar los atributos de tipo char nombre y apellido a la relación jugadores
ALTER TABLE jugadores ADD NOMBRE CHAR(20)
ALTER TABLE jugadores ADD APELLIDO CHAR(20)
1.-SQL Avanzado.
1.1 Recuperación de datos
1.1.1 Conceptos básicos de SQL
1.1.2 Consultas simples
1.1.3 Consultas multitabla
1.1.4 Consultas sumarias
1.1.5 Subconsultas
1.2 Actualización de datos
1.2.1 Actualizaciones de bases de datos
1.2.2 Integridad de datos
1.3 Estructura de una base de datos
1.3.1 Creación de una base de datos
1.3.2 Vistas
1.4 Programación con SQL
1.4.1 SQL incorporado
1.4.2 SQL dinámico
1.4.3 API de SQL
2. Mejoramiento (Tunning).