SQL
SQL
SUBDIRECCIÓN ACADÉMICA
UNIDAD 6
12/11/12
Índice
No. Página.
Puede contener parámetros tanto de entrada como de salida (parámetros pasados por
referencia), así como devolver un valor de retorno.
Son precompilados al ejecutarse por primera vez, y no vuelven a ser compilados con las
subsiguientes ejecuciones, lo que proporciona una cierta mejora en el rendimiento.
Una de las principales ventajas de este tipo de objetos, es que al residir en la propia base de
datos son compartibles por todos los usuarios, pudiendo de esta manera beneficiarse de los
distintos cachés del servidor. Al mismo tiempo al ser código externo a la aplicación puede ser
alterado sin que exista siempre la necesidad de modificar el código de la misma.
Al ser objetos de la base de datos se hallan sujetos a los esquemas de seguridad determinados
por el administrador de la misma:
Existen diversas clases de procedimientos almacenados, entre los que se encuentra los
procedimientos almacenados del sistema, que sirven de herramientas para la realización de
distintas tareas de administración.
Un procedimiento almacenado se crea con la sentencia CREATE PROCEDURE, que debe serla
única dentro de un mismo batch. La creación de un procedimiento almacenado puede ser
realizada bien desde el ISQL_W ,o bien desde la opción Manage Stored Procedures del
Enterprise Manager (SQL Server), o bien desde la propia ventana donde se muestran los objetos
de la base de datos, en el grupo correspondiente a los procedimientos almacenados, dentro de
esta última herramienta.
1
Un procedimiento almacenado puede devolver un valor de retorno de tipo integer, no nulo,
que puede ser rescatado por el código llamador para tener conocimiento del resultado del
proceso de dicho procedimiento.
Los valores -1 al -99 están reservados por el sistema, así como el 0 que se interpreta como
“finalizado con éxito”.
Si no se proporciona un código definido por el usuario, se utilizan los del sistema. De la misma
forma los definidos por el usuario tienen prioridad sobre los definidos por el sistema.
Código Significado
-2 Error de tipo de datos
-4 Error de permisos
-5 Error de sintaxis
-13 Base de datos corrupta
Disparadores (Triggers).
Las operaciones que pueden “disparar” un trigger son las correspondientes a las instrucciones
SQL , INSERT , UPDATE y DELETE.
Puede definirse un trigger para cada una de ellas, o bien definir un trigger asociado a una
combinación de las mismas.
El hecho de tener algún trigger asociado a una tabla, incide de forma negativa en cuanto al
rendimiento se refiere, si bien la mayor parte del tiempo empleado en su ejecución
corresponde al acceso a las diferentes tablas implicadas en los chequeos de integridad.
2
En relación a la creación de los triggers, las herramientas disponibles son las mismas que en el
caso de los procedimientos almacenados, si bien deberán utilizarse las opciones
correspondientes.
La instrucción que permite la creación de un trigger es: CREATE TRIGGER , y su sintaxis es la
siguiente:
INSERT
Instrucción de inserción de filas.
UPDATE
Instrucción de actualización de filas.
DELETE
Instrucción de eliminación de filas.
Sentencias_SQL
Cualquier tipo de sentencia SQL, a excepción de las siguientes:
•Cualquier instrucción CREATE
•Cualquier instrucción DROP
•ALTER TABLE y ALTER DATABASE
•SELECT INTO
•GRANT y REVOKE
3
Reglas (Sintácticas).
Nota: Los campos de tipo auto numérico no se pueden incluir en la lista de nombres de los
campos que almacenarán los valores que se insertan. Cuando no existen campos de tipo auto
numérico en la estructura de la tabla, la lista de campos puede omitirse, pero el orden de los
valores deben listarse en el mismo orden que se usó para crear la tabla.
Nota: Cuando existen campos de tipo auto numérico, la tabla queda vacía y al insertarse nuevos
registros se toma como referencia para agregar nuevos registros el valor siguiente al último
valor que fue registrado antes de eliminar todos los registros.
4
TRUNCATE <nombre de tabla>
- Eliminar valores de registros de una tabla que cumplan con ciertas condiciones:
DELETE FROM <nombre de la tabla> WHERE <nombre campo><operador
condicional><nombre campo o valor>
Nota: Cuando se incluyen todos los campos de las tablas pueden utilizarse el símbolo * en lugar
del nombre de campos.
En caso de que existan campos con el mismo nombre en distintas tablas referenciadas, debe
anteponerse al nombre del campo, el nombre o alias de la tabla correspondiente seguido de un
punto y el nombre del campo.
Los alias son cadenas que se utilizan para sustituir el nombre de la tabla en la consulta.
La clave primaria se utiliza para identificar en forma única cada fila en la tabla. Puede ser parte
de un registro real, o puede ser un campo artificial (uno que no tiene nada que ver con el
registro real).
Una clave primaria puede consistir en uno o más campos en una tabla. Cuando se utilizan
múltiples campos como clave primaria, se los denomina claves compuestas.
Las claves primarias pueden especificarse cuando se crea la tabla (utilizando CREATE TABLE) o
cambiando la estructura existente de la tabla (utilizando ALTER TABLE).
En “MySQL”:
CREATE TABLE Customer
(SID integer,
Last_Name varchar(30),
First_Name varchar(30),
PRIMARY KEY (SID));
5
En “Oracle”:
CREATE TABLE Customer
(SID integer PRIMARY KEY,
Last_Name varchar(30),
First_Name varchar(30));
En “SQL Server”:
CREATE TABLE Customer
(SID integer PRIMARY KEY,
Last_Name varchar(30),
First_Name varchar(30));
En “MySQL”:
ALTER TABLE Customer ADD PRIMARY KEY (SID);
En “Oracle”:
ALTER TABLE Customer ADD PRIMARY KEY (SID);
En “SQL Server”:
ALTER TABLE Customer ADD PRIMARY KEY (SID);
Nota: Antes de utilizar el comando ALTER TABLE para agregar una clave primaria, necesitará
asegurarse de que el campo esté definido como 'NOT NULL' -- en otras palabras, NULL no puede
aceptarse como valor para ese campo.
Una clave externa es un campo (o campos) que señala la clave primaria de otra tabla.
Por ejemplo, digamos que tenemos dos tablas, una tabla comprador que incluye todos los
datos del comprador, y la tabla órdenes que incluyen los pedidos del comprador.
La restricción aquí es que todos los pedidos deben asociarse con un comprador que ya se
encuentra en la tabla comprador.
En este caso, colocaremos una clave externa en la tabla órdenes y la relacionaremos con la
clave primaria de la tabla comprador.
6
De esta forma, nos aseguramos que todos los pedidos en la tabla órdenes estén relacionadas
con un comprador en la tabla comprador. En otras palabras, la tabla órdenes no puede contener
información de un comprador que no se encuentre en la tabla comprador.
Tabla Comprador
Tabla Órdenes
En “MySQL”:
CREATE TABLE ORDENES
(Id_orden integer,
Fecha_orden date,
Id_comprador integer,
Monto double,
Primary Key (Id_orden),
Foreign Key (Id_comprador) references COMPRADOR(Id));
En “Oracle”:
CREATE TABLE ORDENES
(Id_orden integer primary key,
Fecha_orden date,
Id_comprador integer references COMPRADOR(Id),
Monto double);
7
En “SQL Server”:
CREATE TABLE ORDENES
(Id_orden integer primary key,
Fecha_orden datetime,
Id_comprador integer references COMPRADOR(Id),
Monto double);
En “MySQL”:
ALTER TABLE ORDENES
ADD FOREIGN KEY (Id_comprador) REFERENCES COMPRADOR(Id);
En “Oracle”:
ALTER TABLE ORDENES
ADD (CONSTRAINT fk_orders1) FOREIGN KEY (Id_comprador) REFERENCES COMPRADOR (Id);
En “SQL Server”:
ALTER TABLE ORDENES
ADD FOREIGN KEY (Id_comprador) REFERENCES COMPRADOR(Id);
La restricción CHECK se utiliza para limitar el rango de valores que puede ser colocado en una
columna.
1.- Si se define una restricción CHECK en una columna sólo permitirá ciertos valores de esa
columna.
2.- Si se define una restricción CHECK en una tabla puede limitar los valores de ciertas
columnas basándose en los valores de otras columnas en la fila.
La restricción CHECK especifica que la columna "p_id" sólo debe incluir enteros mayores que 0.
8
En “MySQL”:
Para aplicar una restricción CHECK en la columna “P_Id” cuando la tabla ya está creada, usamos
la siguiente sentencia SQL:
9
Restricción CHECK en DROP TABLE en SQL
En “MySQL”
ALTER TABLE Persons
DROP CHECK chk_Person
En forma predeterminada, una columna puede ser NULL. Si no desea permitir un valor NULL en
una columna, querrá colocar una restricción en esta columna especificando que NULL no es
ahora un valor permitido.
Las columnas “SID” y “Last_Name” no incluyen NULL, mientras que “First_Name” puede incluir
NULL.
Restricción (Unique)
La restricción UNIQUE asegura que todos los valores en una columna sean distintos.
La columna “SID” no puede incluir valores duplicados, mientras dicha restricción no se aplica
para columnas “Last_Name” y “First_Name”.
10
Por favor note que una columna que se especifica como clave primaria también puede ser
única. Al mismo tiempo, una columna que es única puede o no ser clave primaria.
Si al insertar registros no se especifica un valor para un campo que admite valores nulos, se
ingresa automáticamente "null" y si el campo está declarado "identity", se inserta el siguiente
de la secuencia. A estos valores se les denomina valores por defecto o predeterminados.
Un valor por defecto se inserta cuando no está presente al ingresar un registro y en algunos
casos en que el dato ingresado es inválido.
Para campos de cualquier tipo no declarados "not null", es decir, que admiten valores nulos, el
valor por defecto es "null". Para campos declarados "not null", no existe valor por defecto, a
menos que se declare explícitamente con la cláusula "default".
Para todos los tipos, excepto los declarados "identity", se pueden explicitar valores por defecto
con la cláusula "default".
Podemos establecer valores por defecto para los campos cuando creamos la tabla. Para ello
utilizamos "default" al definir el campo. Por ejemplo, queremos que el valor por defecto del
campo "autor" de la tabla "libros" sea "Desconocido" y el valor por defecto del campo
"cantidad" sea "0":
Si al ingresar un nuevo registro omitimos los valores para el campo "autor" y "cantidad", Sql
Server insertará los valores por defecto; el siguiente valor de la secuencia en "codigo", en
"autor" colocará "Desconocido" y en cantidad "0".
Entonces, si al definir el campo explicitamos un valor mediante la cláusula "default", ése será el
valor por defecto.
También se puede utilizar "default" para dar el valor por defecto a los campos en sentencias
"INSERT", por ejemplo:
La sentencia anterior almacenará un registro con los valores predeterminados para cada uno de
sus campos.
Vistas (Views).
La “Instrucción SQL” puede ser cualquiera de las instrucciones SQL que hemos descripto en esta
guía de referencia.
Utilicemos un ejemplo simple para ilustrar. Supongamos que tenemos la siguiente tabla:
Tabla Customer
(First_Name char(50),
Last_Name char(50),
Address char(50),
City char(50),
Country char(25),
Birth_Date date)
y deseamos crear una vista denominada V_Customer que contiene sólo las columnas
First_Name, Last_Name y País de esta tabla, ingresaríamos
View V_Customer
(First_Name char(50),
Last_Name char(50),
Country char(25))
Podemos utilizar también una vista para aplicar uniones a dos tablas. En este caso, los usuarios
sólo ven una vista en vez de dos tablas, y la instrucción SQL que los usuarios necesitan emitir se
vuelve mucho más simple. Digamos que tenemos las siguientes dos tablas:
Tabla Store_Information
Tabla Geography
region_name store_name
East Boston
East New York
West Los Angeles
West San Diego
Y deseamos construir una vista que tenga ventas organizadas según la región. Colocaríamos la
siguiente instrucción SQL:
Esto nos brinda una vista, V_REGION_SALES, que se ha definido para las ventas de los negocios
según los registros de la región. Si deseamos saber el contenido de esta vista, ingresamos,
REGION SALES
East 700 €
West 2050 €
Índices (indexes).
Los índices nos ayudan a obtener datos de las tablas en forma más rápida.
Utilicemos un ejemplo para ilustrar este punto: Digamos que estamos interesados en leer en un
libro de jardinería acerca de cómo cultivar pimientos.
En vez de leer el libro desde el comienzo hasta que encontremos una sección sobre pimientos,
es mucho más rápido para nosotros ir a la sección índice al final del libro, ubicar qué páginas
contienen la información sobre pimientos, y luego dirigirnos a esas páginas directamente.
El mismo principio se aplica para la obtención de datos desde una tabla de base de datos. Sin
un índice, el sistema de base de datos lee a través de toda la tabla (este proceso se denomina
“escaneo de tabla”) para localizar la información deseada.
Con el índice correcto en su lugar, el sistema de base de datos puede entonces primero dirigirse
al índice para encontrar de dónde obtener los datos, y luego dirigirse a dichas ubicaciones para
obtener los datos necesarios. Esto es mucho más rápido.
Por lo tanto, generalmente se recomienda crear índices en tablas. Un índice puede cubrir una o
más columnas. La sintaxis general para la creación de un índice es:
Tabla Customer
(First_Name char(50),
Last_Name char(50),
Address char(50),
City char(50),
Country char(25),
Birth_Date date) 14
Si deseamos crear un índice tanto en Ciudad como en País, ingresaríamos,
No hay una regla estricta respecto de cómo nombrar un índice. El método generalmente
aceptado es colocar un prefijo, tal como “IDX_”, antes del nombre de un índice para evitar la
confusión con otros objetos de la base de datos.
También es una buena idea brindar información sobre qué tabla y columna(s) se utilizará el
índice.
Por favor note que la sintaxis exacta para CREATE INDEX puede ser distinta según las diferentes
bases de datos. Debería consultar con su manual de referencia de base de datos para obtener
la sintaxis precisa.
15
Referencias (Bibliografía):
- Clave primaria –
4.- http://www.1keydata.com/es/sql/sql-clave-primaria.php
- Clave foránea –
5.- http://www.1keydata.com/es/sql/sql-clave-externa.php
- Restricciones –
6.- http://www.w3schools.com/sql/sql_check.asp
7.- http://www.1keydata.com/es/sql/sql-constraint.php#check
- Valores predeterminados –
8.- http://www.sqlserverya.com.ar/temarios/descripcion.php?cod=27&punto=21
- Vistas –
9.- http://www.1keydata.com/es/sql/sql-create-view.php
- Índices –
10.- www.1keydata.com/es/sql/sql-create-index.php
16