Lenguaje SQL
Lenguaje SQL
Mdulo 2. El lenguaje SQL ...................................................................................................................... 2 1. Bases de datos .................................................................................................................................... 2 2. Normalizacin de datos ....................................................................................................................... 2 3. SQL...................................................................................................................................................... 4 4. El lenguaje DML .................................................................................................................................. 4 4.1. Consultas. SELECT ...................................................................................................................... 4 4.1.1. Consultas simples. ................................................................................................................. 4 4.1.2. WHERE .................................................................................................................................. 6 4.1.3. ORDER BY............................................................................................................................. 9 4.1.4. GROUP BY ............................................................................................................................ 9 4.1.5. HAVING .................................................................................................................................. 9 4.1.6. Subconsultas .......................................................................................................................... 9 4.1.7. JOIN ..................................................................................................................................... 10 4.1.8. Combinaciones de consultas ............................................................................................... 12 4.1.9. UNION .................................................................................................................................. 12 4.1.10. TOP .................................................................................................................................... 13 4.1.11. ANY, SOME, ALL ............................................................................................................... 14 4.1.12. EXISTS............................................................................................................................... 15 4.2. Insercin de datos. INSERT ....................................................................................................... 15 4.3. Modificar Datos. UPDATE .......................................................................................................... 17 4.4. Borrar Datos. DELETE................................................................................................................ 18 4.5. Vistas. Uso .................................................................................................................................. 19 5. Programacin con SQL. Scripts ....................................................................................................... 21 5.1. Sintaxis ....................................................................................................................................... 21 5.1.1. Sentencias ............................................................................................................................ 21 5.1.2. Variables .............................................................................................................................. 22 5.1.3. Operadores y funciones del sistema .................................................................................... 23 5.1.4. Estructuras Condicionales ................................................................................................... 24 5.1.5. Estructuras iterativas o bucles ............................................................................................. 26 5.1.6. Cursores ............................................................................................................................... 27 5.1.7. Tablas temporales ................................................................................................................ 30 5.2. Funciones ................................................................................................................................... 31 5.3. Procedimientos almacenados ..................................................................................................... 34 5.4. Desencadenadores o Triggers ................................................................................................... 36 5.5. Errores ........................................................................................................................................ 41 6. El lenguaje DDL ................................................................................................................................. 42 6.1. Base de datos ............................................................................................................................. 42 6.2. Tablas ......................................................................................................................................... 42 6.2.1. Create Table......................................................................................................................... 42 6.2.1.1. Tipos de datos ............................................................................................................... 42 6.2.1.2. Permitir/ prohibir valores nulos ..................................................................................... 43 6.2.1.3. Valores por defecto. DEFAULT ..................................................................................... 43 6.2.1.4. Clave primaria e identidad. PRIMARY KEY, IDENTITY ............................................... 43 6.2.1.5. Columnas sin repeticiones. UNIQUE ............................................................................ 43 6.2.1.6. Restricciones. CHECK () ............................................................................................... 43 6.2.1.7. Claves externas ............................................................................................................. 44 6.2.1.8. Columnas calculadas .................................................................................................... 44 6.2.2. Alter Table ........................................................................................................................ 45 6.2.3. Drop Table............................................................................................................................ 46 6.3. Vistas .......................................................................................................................................... 46 6.3.1. Create view .......................................................................................................................... 46 6.3.2. Alter view .............................................................................................................................. 47 6.3.3. Drop view ............................................................................................................................. 47 6.4. ndices ......................................................................................................................................... 47 6.4.1. Create index ......................................................................................................................... 47 6.4.2. Alter index ............................................................................................................................ 48 6.4.3. Drop index ............................................................................................................................ 49
SQL
Pgina 1
Tabla
Tabla
Los datos se agrupan en entidades llamadas tablas con alguna relacin entre s. Las tablas, a su vez tambin se pueden relacionar entre ellas formando DB. Y por encima de estas se encuentra el SGBD que se encarga de gestionar el almacenamiento, acceso y gestin de los datos. En las tablas los datos se organizan en filas y columnas. Las columnas representan los tipos de datos introducidos, por ejemplo el nombre, los apellidos, el DNI, etc. Mientras, en cada fila se guardan los datos concretos. ID Cliente 123 456 789 Nombre Rachel James Mara Apellido Ingram Wright Fernndez
2. Normalizacin de datos
Para facilitar el trabajo con las tablas y su manipulacin, se definen una serie de reglas que se conocen como formas normales. Aunque existen 5 formas o grados de normalizacin, en la mayora de aplicaciones basta con llegar hasta la tercera. La normalizacin permite la disminucin de las redundancias y evitar la duplicacin innecesaria de datos. Las tres primeras dicen: 1. Una relacin est en primera forma normal si, y slo si, todos los dominios de la misma contienen valores atmicos, es decir, no hay grupos repetitivos. Cada fila de la tabla debe tener un nico campo (clave primaria) que lo identifique, en cada campo slo ha de haber un dato y no tienen que repetirse las filas. 2. Una relacin est en segunda forma normal si, y slo si, est en 1FN y, adems, cada atributo que no est en la clave primaria es completamente dependiente de la clave primaria.
La 2FN se aplica a las relaciones que tienen claves primarias compuestas por dos o ms atributos. Si una relacin est en 1FN y su clave primaria es simple (tiene un solo atributo), entonces tambin est en 2FN. Las relaciones que no estn en 2FN pueden sufrir anomalas cuando se realizan actualizaciones. 3. Una relacin est en tercera forma normal si, y slo si, est en 2FN y, adems, cada atributo que no est en la clave primaria no depende transitivamente de la clave primaria. Esta norma consiste en eliminar las columnas que no dependan de la clave principal. Ejemplo: Nombre Raquel Pere Pere Mara Apellido Prez Guardiola Guardiola Fernndez Telfono 935478892 912345567 665333559 658244123,931246678 TipoTelfono fijo fijo Mvil Mvil, fijo
Si observamos la tabla vemos que no se cumple la primera norma porque en los campos tipotelfono y telfono hay ms de un dato por celda, se repiten filas y no hay una clave que pueda identificar sin error las filas. Para solucionarlo se parte la tabla en dos: Tabla cliente: IDC 1 2 3 Tabla telfono: Telfono 935478892 912345567 665333559 658244123 931246678 IDC 1 2 2 3 3 TipoTelfono fijo fijo Mvil Mvil fijo Nombre Raquel Pere Mara Apellido Prez Guardiola Fernndez
Si analizamos ambas tablas vemos que en la segunda hay datos que aparecen repetidos y que adems no tienen nada que ver directamente con la clave telfono. Por tanto volveremos a dividir esta tabla en dos. Tabla telfono: Telfono 935478892 912345567 665333559 658244123 931246678 Tabla TipoTelfono: IDC 1 2 2 3 3 IDTT 1 1 2 2 1
IDTT 1 2
Finalmente tendramos una estructura de relaciones entre tablas como la que sigue:
cliente PK idc nombre apellidos PK FK1 FK2 Telfono telefono idc idtt TipoTelfono PK idtt tipotelefono
3. SQL
SQL es un lenguaje interactivo y de programacin estndar que permite manipular y obtener informacin de una base de datos y actualizarla. Aunque el SQL es un estndar tanto ANSI como ISO, muchos SGDB de datos soportan el SQL con extensiones propias del lenguaje estndar. Para MS SQL Server se llama Transact-SQL SQL se divide en dos lenguajes: DDL (Data Description Language o Lenguaje de Descripcin de Datos) que sirve para crear y manipular las bases de datos, tablas, vistas, etc. DML (Data Manipulation Languatge o Lenguaje de Manipulacin de Datos) que sirve para consultar y modificar los datos.
4. El lenguaje DML
DML nos permite interactuar con los datos almacenados en una DB. Las operaciones bsicas que se pueden realizar son: Seleccionar datos SELECT Aadir datos nuevos INSERT Borrar datos DELETE Modificar datos UPDATE
4.1. Consultas. SELECT Las consultas SELECT permiten extraer subconjuntos de datos de una o ms tablas segn unos criterios preestablecidos. Sintaxis: SELECT [ALL | DISTINCT] select_list [ INTO new_table ] [ FROM table_source ] [ WHERE search_condition ] [ GROUP BY group_by_expression ] [ HAVING search_condition ] [ ORDER BY order_expression [ ASC | DESC ] ] 4.1.1. Consultas simples. La consulta ms simple que se puede hacer es de la forma: SELECT Lista_ columnas FROM nombre_tabla En caso que se quieran seleccionar todas las filas de una tabla, la sintaxis ser SELECT * FROM nombre_tabla
Ejemplo: Tabla_direcciones_empleados id 1 2 3 4 DNI 23987739A 45623890F 43567893D 23456789G Apellidos Garca Lpez Macas Garca Nombre Antonio Juan Jordi Laura Direccion C. Mayor 2 Pl. Ayuntamiento C. Bull C. Lepant Poblacion Valencia Alicante Sant Cugat Gav Provincia Valencia Alicante Barcelona Barcelona
SELECT * FROM Tabla_direcciones_empleados Seleccin de slo algunas columnas, todos los registros: SELECT ID,DNI,Nombre,Apellidos FROM Tabla_direcciones_empleados id 1 2 3 4 DNI 23987739A 45623890F 43567893D 23456789G Nombre Antonio Juan Jordi Laura Apellidos Garca Lpez Macas Garca
Funciones y operaciones sobre columnas Tambin es posible hacer clculos sobre alguna de las columnas devueltas. Para ello se utilizarn las funciones y operaciones que permite SQL. Ej.: select id,Nombre + ' ' + apellidos from tabla_direcciones_empleados. Esta sentencia devolvera 1 2 3 4 Antonio Garca Juan Lpez Jordi Macas Laura Garca
select id,Nombre,LEN(Nombre ) from tabla_direcciones_empleados. Esta sentencia devuelve id, el nombre y el nmero de caracteres del nombre 1 2 3 4 Otras operaciones de columna son: MIN: Calcula el valor mnimo de una columna. MAX: Calcula el valor mximo de una columna. AVG: Calcula la media aritmtica de una columna. SUM: Calcula la suma de todos los campos de una columna. COUNT: Cuenta el n de filas de una columna. AS En el caso anterior se puede asignar un nombre a la columna o alias usando la palabra reservada AS a la columna donde se calcula la longitud del nombre select id,Nombre,LEN(Nombre) as LongitudNombre from tabla_direcciones_empleados Antonio Juan Jordi Laura 7 4 5 5
id 1 2 3 4
LongitudNombre 7 4 5 5
Tambin se puede canviar el nombre de una columna por otro cualquiera. DISTINCT Distinct sirve para devolver todos los registros de una tabla pero sin duplicados. Por ejemplo en la sentencia select Provincia from tabla_direcciones_empleados seleccionaramos las provincias de los trabajadores Provincia Valencia Alicante Barcelona Barcelona Como vemos, Barcelona se repite. Si slo quisiramos las provincias sin repeticiones se usara DISTINCT. select distinct(Provincia) from tabla_direcciones_empleados Provincia Valencia Alicante Barcelona ALL ALL sirve para ver todos los registros (filas) incluidas las repeticiones. select ALL Provincia from tabla_direcciones_empleados Esta expresin es equivalente a: select Provincia from tabla_direcciones_empleados Provincia Valencia Alicante Barcelona Barcelona 4.1.2. WHERE Con las sentencias que hemos usado hasta ahora no es posible seleccionar un conjunto de datos segn una condicin concreta. Para ello se utiliza WHERE select * from tabla_direcciones_empleados where Nombre>'c' 2 3 4 45623890F 43567893D 23456789G Lpez Macas Garca Juan Jordi Laura Pl. Ayuntamiento C. Bull C. Lepant Alicante Sant Cugat Gav Alicante Barcelona Barcelona
< search_condition > ::= { [ NOT ] <predicate> | ( <search_condition> ) } [ { AND | OR } [ NOT ] { <predicate> | ( <search_condition> ) } ] [ ,...n ]
<predicate> ::= { expression { = | < > | ! = | > | > = | ! > | < | < = | ! < } expression | string_expression [ NOT ] LIKE string_expression [ ESCAPE 'escape_character' ] | expression [ NOT ] BETWEEN expression AND expression | expression IS [ NOT ] NULL | CONTAINS ( { column | * } , '< contains_search_condition >' ) | FREETEXT ( { column | * } , 'freetext_string' ) | expression [ NOT ] IN ( subquery | expression [ ,...n ] ) | expression { = | < > | ! = | > | > = | ! > | < | < = | ! < } { ALL | SOME | ANY} ( subquery ) | EXISTS ( subquery ) } Argumentos <search_condition> Especifica las condiciones de las filas devueltas en el conjunto de resultados de una instruccin SELECT, una expresin de consulta o una subconsulta. En una instruccin UPDATE, especifica las filas que se van a actualizar. En una instruccin DELETE, especifica las filas que se van a eliminar. No hay lmite en el nmero de predicados que se pueden incluir en una condicin de bsqueda de una instruccin Transact-SQL. NOT Niega la expresin booleana que especifica el predicado. AND Combina dos condiciones y se evala como TRUE cuando ambas condiciones son TRUE. OR Combina dos condiciones y se evala como TRUE cuando alguna de las condiciones es TRUE. < predicate > Es una expresin que devuelve TRUE, FALSE o UNKNOWN. expression Es un nombre de columna, una constante, una funcin, una variable, una subconsulta escalar o cualquier combinacin de nombres de columna, constantes y funciones conectados mediante uno o varios operadores o una subconsulta. La expresin tambin puede contener la expresin CASE. = Es el operador que se utiliza para probar la igualdad entre dos expresiones. <> Es el operador que se utiliza para probar si dos expresiones no son iguales entre s. != Es el operador que se utiliza para probar si dos expresiones no son iguales entre s. > Es el operador que se utiliza para probar si una expresin es mayor que la otra. >= Es el operador que se utiliza para probar si una expresin es mayor o igual que la otra expresin. !> Es el operador que se utiliza para probar si una expresin no es mayor que la otra expresin. < Es el operador que se utiliza para probar si una expresin es menor que la otra. <= Es el operador que se utiliza para probar si una expresin es menor o igual que la otra expresin. !< Es el operador que se utiliza para probar si una expresin no es menor que la otra expresin. string_expression Es una cadena de caracteres y caracteres comodn. [ NOT ] LIKE Indica que la siguiente cadena de caracteres se utilizar con la coincidencia de patrn. ESCAPE 'escape_ character' Permite buscar un carcter comodn en una cadena de caracteres en lugar de funcionar como un comodn. escape_character es el carcter que se coloca delante del carcter comodn para indicar su uso especial. [ NOT ] BETWEEN Especifica un intervalo inclusivo de valores. Utilice AND para separar los valores inicial y final. IS [ NOT ] NULL
Especifica una bsqueda de valores NULL o de valores que no son NULL, en funcin de las palabras clave utilizadas. Una expresin que contenga un operador bit a bit o aritmtico se evala como NULL si uno de los operandos es NULL. CONTAINS Busca en columnas que contengan datos basados en caracteres coincidencias precisas o menos precisas (parciales) con palabras o frases, a una cierta distancia las unas de las otras y coincidencias ponderadas. Esta opcin slo puede usarse con instrucciones SELECT. FREETEXT Proporciona una forma sencilla de realizar consultas en lenguaje natural al buscar, en columnas con datos basados en caracteres, valores que coincidan con el significado en lugar de con las palabras exactas del predicado. Esta opcin slo puede usarse con instrucciones SELECT. [ NOT ] IN Especifica la bsqueda de una expresin, basada en si la expresin est incluida en una lista o excluida de ella. La expresin de bsqueda puede ser una constante o un nombre de columna, y la lista puede ser un conjunto de constantes o, ms normalmente, una subconsulta. Encierre la lista de valores entre parntesis. subquery Se puede considerar como una instruccin SELECT restringida y es similar a <query_expresssion> en la instruccin SELECT. No se permiten la clusula ORDER BY, la clusula COMPUTE ni la palabra clave INTO. ALL Se utiliza con un operador de comparacin y una subconsulta. Devuelve TRUE para <predicate> si todos los valores obtenidos de la subconsulta satisfacen la operacin de comparacin, o FALSE si no todos los valores satisfacen la comparacin o cuando la subconsulta no devuelve filas a la instruccin externa. { SOME | ANY } Se utiliza con un operador de comparacin y una subconsulta. Devuelve TRUE para <predicate> si algn valor obtenido de la subconsulta satisface el operador de comparacin, o FALSE si ningn valor de la subconsulta satisface la comparacin o cuando la subconsulta no devuelve filas a la instruccin externa. En caso contrario, la expresin es UNKNOWN. EXISTS Se utiliza con una subconsulta para probar la existencia de filas devueltas por la subconsulta. Ejemplos: select * from tabla_direcciones_empleados where Nombre>'c' and Apellidos>'j' 2 3 45623890F 43567893D Lpez Macas Juan Jordi Pl. Ayuntamiento C. Bull Alicante Sant Cugat Alicante Barcelona
select * from tabla_direcciones_empleados where Nombre like 'j%' 2 3 45623890F 43567893D Lpez Macas Juan Jordi Pl. Ayuntamiento C. Bull Alicante Sant Cugat Alicante Barcelona
select * from tabla_direcciones_empleados where Nombre like '%or%' 3 43567893D Macas Jordi C. Bull Sant Cugat Barcelona
select * from tabla_direcciones_empleados where Provincia between 'A' and 'M' 2 45623890F Lpez Juan Pl. Ayuntamiento Alicante Alicante
3 4
43567893D 23456789G
Macas Garca
Jordi Laura
C. Bull C. Lepant
Barcelona Barcelona
select * from tabla_direcciones_empleados where Provincia in ('Alicante','Madrid','Valencia') 1 2 23987739A 45623890F Garca Lpez Antonio Juan C. Mayor 2 Pl. Ayuntamiento Valencia Alicante Valencia Alicante
4.1.3. ORDER BY ORDER BY sirve para escoger el orden de las filas de la consulta. Su sintaxis es: ORDER BY col1 [ASC | DESC], col2 [ASC | DESC] Por defecto el orden siempre es ascendente select * from tabla_direcciones_empleados order by apellidos asc, Nombre Desc 4 1 2 3 23456789G 23987739A 45623890F 43567893D Garca Garca Lpez Macas Laura Antonio Juan Jordi C. Lepant C. Mayor 2 Pl. Ayuntamiento C. Bull Gav Valencia Alicante Sant Cugat Barcelona Valencia Alicante Barcelona
4.1.4. GROUP BY Agrupa un conjunto de filas seleccionado en un conjunto de filas de resumen de acuerdo con los valores de una o ms columnas o expresiones. Se devuelve una fila para cada grupo. No se puede poner en GROUP BY un campo que no se haya incluido en la sentencia SELECT. select COUNT(id) as empleadosProvincia, Provincia from tabla_direcciones_empleados group by provincial empleadosProvincia Provincia 1 Alicante 2 Barcelona 1 Valencia 4.1.5. HAVING Especifica una condicin de bsqueda para un grupo o agregado. HAVING slo se puede utilizar con la instruccin SELECT. Normalmente, HAVING se utiliza en una clusula GROUP BY. Cuando no se utiliza GROUP BY, HAVING se comporta como una clusula WHERE. select COUNT(id) as empleadosProvincia, Provincia from tabla_direcciones_empleados group by provincia having Provincia <> 'Alicante' empleadosProvincia 2 1 Provincia Barcelona Valencia
4.1.6. Subconsultas Una subconsulta es una consulta dentro de otra. Por ejemplo imaginemos ahora que tenemos una segunda tabla provincias con los siguientes datos: id 1 2 3 4 provincia lava Albacete Alicante Almera
5 6 7
Si queremos sacar la lista de provincias que empiezan por a hacemos: select provincia from provincia where provincia like 'A%' Albacete Alicante Almera Ahora queremos sacar de la tabla tabla_direcciones_empleados la lista de empleados que viven en una de las provincias de la consulta anterior. select id, Nombre, Apellidos, Provincia from Tabla_direcciones_empleados where Provincia in ( select provincia from provincia where provincia like 'A%' ) 2 Juan Lpez Alicante
4.1.7. JOIN Las combinaciones externas devuelven todas las filas de una de las tablas o vistas mencionadas en la clusula FROM, como mnimo, siempre que tales filas cumplan con alguna de las condiciones de bsqueda de WHERE o HAVING. Todas las filas se recuperarn de la tabla izquierda a la que se haya hecho referencia con una combinacin externa izquierda, y de la tabla derecha a la que se haya hecho referencia con una combinacin externa derecha. En una combinacin externa completa, se devuelven todas las filas de ambas tablas. SQL Server usa las siguientes palabras clave ISO para las combinaciones externas especificadas en una clusula FROM: LEFT OUTER JOIN o LEFT JOIN RIGHT OUTER JOIN o RIGHT JOIN FULL OUTER JOIN o FULL JOIN
LEFT JOIN Imagine una combinacin de la tabla Product y de la tabla ProductReview en sus columnas ProductID. Los resultados muestran solamente los productos para los que se han escrito revisiones. Para incluir todos los productos, independientemente de si se ha escrito una revisin para alguno de ellos, utilice una combinacin externa izquierda ISO. sta es la consulta: USE AdventureWorks; GO SELECT p.Name, pr.ProductReviewID FROM Production.Product p LEFT OUTER JOIN Production.ProductReview pr ON p.ProductID = pr.ProductID LEFT OUTER JOIN incluye en el resultado todas las filas de la tabla Product, tanto si hay una coincidencia en la columna ProductID de la tabla ProductReview como si no la hay. Observe que en
10
los resultados donde no hay un Id. de revisin de producto coincidente para un producto, la fila contiene un valor nulo en la columna ProductReviewID. select t1.id, Nombre, Apellidos, t2.provincia from Tabla_direcciones_empleados as t1 left join provincia as t2 on t1.id_provincia = t2.id order by t1.id 1 2 3 4 Antonio Juan Jordi Laura Garca Lpez Macas Garca Valencia Alicante Barcelona Barcelona
RIGHT JOIN Imagine una combinacin de la tabla SalesTerritory y de la tabla SalesPerson en sus columnas TerritoryID. Los resultados pueden mostrar cualquier territorio de ventas asignado a un vendedor. El operador ISO de combinacin externa derecha, RIGHT OUTER JOIN, indica que todas las filas de la segunda tabla se deben incluir en los resultados, con independencia de si hay datos coincidentes en la primera tabla. Para incluir a todos los vendedores en los resultados, independientemente de si estn asignados a un territorio de ventas, utilice una combinacin externa derecha ISO. A continuacin se muestra la consulta Transact-SQL y los resultados de la combinacin externa derecha: USE AdventureWorks; GO SELECT st.Name AS Territory, sp.SalesPersonID FROM Sales.SalesTerritory st RIGHT OUTER JOIN Sales.SalesPerson sp ON st.TerritoryID = sp.TerritoryID ; Una combinacin externa puede restringirse ms mediante el uso de un predicado. Este ejemplo contiene la misma combinacin externa derecha, pero slo incluye los territorios de ventas con un volumen de ventas inferior a 2.000.000 de dlares: USE AdventureWorks; GO SELECT st.Name AS Territory, sp.SalesPersonID FROM Sales.SalesTerritory st RIGHT OUTER JOIN Sales.SalesPerson sp ON st.TerritoryID = sp.TerritoryID WHERE st.SalesYTD < $2000000;Para obtener ms informacin acerca de estos predicados, vea WHERE (Transact-SQL). FULL OUTER JOIN Para retener la informacin que no coincida al incluir las filas no coincidentes en los resultados de una combinacin, utilice una combinacin externa completa. SQL Server proporciona el operador de combinacin externa completa, FULL OUTER JOIN, que incluye todas las filas de ambas tablas, con independencia de que la otra tabla tenga o no un valor coincidente. Imagine una combinacin de la tabla Product y de la tabla SalesOrderDetail en sus columnas ProductID. Los resultados slo muestran los productos para los que se han efectuado pedidos de venta. El operador ISO de combinacin externa completa, FULL OUTER JOIN, indica que todas las filas de ambas tablas se van a incluir en los resultados, con independencia de que haya datos coincidentes en las tablas. Puede incluir una clusula WHERE con una combinacin externa completa para devolver solamente las filas donde no hay datos coincidentes entre las tablas. La siguiente consulta slo devuelve los productos que no tienen pedidos de venta que coincidan, as como los pedidos de venta que no
11
coinciden con ningn producto (aunque todos los pedidos de venta, en este caso, coincidan con un producto). 4.1.8. Combinaciones de consultas Adems de JOIN se pueden hacer consultas con DB relacionales juntando dos o ms tablas de la siguiente manera: select t1.id,nombre,apellidos,provincia from Tabla_direcciones_empleados as t1, provincia where id_provincia=provincia.id order by id 1 2 3 5 Garca Lpez Macas Garca Antonio Juan Jordi Laura Barcelona Alicante Barcelona Barcelona
Sin embargo realizar este tipo de consultas es ms lento que usar la clusula JOIN. 4.1.9. UNION Combina los resultados de dos o ms consultas en un solo conjunto de resultados que incluye todas las filas que pertenecen a las consultas de la unin. La operacin UNION es distinta de la utilizacin de combinaciones de columnas de dos tablas. A continuacin se muestran las reglas bsicas para combinar los conjuntos de resultados de dos consultas con UNION: El nmero y el orden de las columnas deben ser idnticos en todas las consultas. Los tipos de datos deben ser compatibles. Sintaxis { <query_specification> | ( <query_expression> ) } UNION [ ALL ] <query_specification | ( <query_expression> ) [ UNION [ ALL ] <query_specification> | ( <query_expression> ) [ ...n ] ] Argumentos <query_specification> | ( <query_expression> ) Es una especificacin o expresin de consulta que devuelve datos que se van a combinar con los datos de otra especificacin o expresin de consulta. No es preciso que las definiciones de las columnas que forman parte de una operacin UNION sean iguales, pero deben ser compatibles a travs de una conversin implcita. Cuando los tipos de datos difieren, el tipo de datos resultante se determina segn las reglas de prioridad de tipos de datos. Cuando los tipos son los mismos pero varan en cuanto a precisin, escala o longitud, el resultado se determina segn las mismas reglas para combinar expresiones. UNION Especifica que se deben combinar varios conjuntos de resultados para ser devueltos como un solo conjunto de resultados. ALL Agrega todas las filas a los resultados. Incluye las filas duplicadas. Si no se especifica, las filas duplicadas se quitan. Ejemplo: Aadamos ahora a nuestra BD una tabla de pases
12
1 2 3 4 5 6
Para extraer la lista conjunta de pases y provincias utilizaremos la consulta: select provincia from provincia union select pais from pais provincia lava Albacete Alemania Alicante Almera Barcelona Blgica Dinamarca Espaa Francia Lugo Portugal 4.1.10. TOP Especifica que slo se devolver el primer conjunto de filas del resultado de la consulta. El conjunto de filas puede ser un nmero o un porcentaje de las filas. La expresin TOP se puede usar en instrucciones SELECT, INSERT, UPDATE, MERGE y DELETE. Sintaxis [ TOP (expression) [PERCENT] [ WITH TIES ] ] Argumentos expression Es la expresin numrica que especifica el nmero de filas que se devolvern. El valor expression se convierte implcitamente a un valor float si se especific PERCENT; de lo contrario, se convierte a bigint. Si la consulta contiene una clusula ORDER BY, se devolvern las primeras filas de expression o el porcentaje de filas de expression ordenadas por la clusula ORDER BY. Cuando la consulta no tiene una clusula ORDER BY, el orden de las filas es arbitrario. PERCENT Indica que la consulta devuelve slo el primer porcentaje de filas de expression del conjunto de resultados. WITH TIES Especifica que las filas adicionales se devolvern del conjunto de resultados base con el mismo valor en las columnas ORDER BY que el que aparece en la ltima de las filas de TOP n (PERCENT). TOP...WITH TIES slo se puede especificar en instrucciones SELECT y siempre que haya una clusula ORDER BY especificada.
13
El orden devuelto de los registros que se vinculan es arbitrario. ORDER BY no afecta a esta regla. Ejemplo: En el ejemplo siguiente se obtiene el 10% de los empleados que tienen los salarios ms altos y los devuelve en orden descendente de acuerdo con el salario base. La especificacin de WITH TIES garantiza que tambin se incluyan los empleados con salarios iguales al salario ms bajo en el conjunto de resultados, aun cuando esto exceda el 10% de los empleados. USE AdventureWorks; GO SELECT TOP(10) PERCENT WITH TIES c.FirstName, c.LastName, e.Title, e.Gender, r.Rate FROM Person.Contact AS c INNER JOIN HumanResources.Employee AS e ON c.ContactID = e.ContactID INNER JOIN HumanResources.EmployeePayHistory AS r ON r.EmployeeID = e.EmployeeID ORDER BY Rate DESC; Ejemplo 2: Seleccionar las 3 primeras provincias de la tabla provincias: select top 3 provincia from provincia lava Albacete Alicante 4.1.11. ANY, SOME, ALL Compara un valor escalar con un conjunto de valores de una sola columna. SOME y ANY son equivalentes. Sintaxis scalar_expression { = | < > | ! = | > | > = | ! > | < | < = | ! < } { SOME | ANY| ALL } ( subquery ) Argumentos scalar_expression Es cualquier expresin vlida. { = | <> | != | > | >= | !> | < | <= | !< } Es cualquier operador de comparacin vlido. SOME | ANY | ALL Especifica que se debe realizar una comparacin. subquery Es una subconsulta con un conjunto de resultados de una columna. El tipo de datos de la columna devuelta debe ser el mismo que el de scalar_expression. Notas Una expresin ANY, SOME es cierta si la es para algn valor de los que devuelve la Subconsulta (subquery). Una expresin ALL es cierta si la es para todos los valores que devuelve la Subconsulta (subquery). Tipos de resultado Boolean Ejemplo:
14
id 1 2 3 4
edad 21 34 23 26
Selecciona todos los empleados que no tengan derecho a premio por pasar de la edad premiada. select t1.id, nombre, Apellidos, edad from Tabla_direcciones_empleados as t1 where edad > all (select edad from premio ) 2 Lpez Juan 34
Selecciona todos los empleados que tengan derecho a premio por su edad. select t1.id, nombre, Apellidos, edad from Tabla_direcciones_empleados as t1 where edad = any (select edad from premio ) 1 3 Garca Macas Antonio Jordi 21 23
4.1.12. EXISTS Se define para comprobar la existencia o ausencia del valor devuelto por una subconsulta. Una expresin con EXIST devuelve Cierto si la subconsulta nos devuelve al menos un valor. Ejemplo: devolver empleados que trabajan en una provincia que empiece por B o superior select nombre, apellidos from Tabla_direcciones_empleados as t1 where exists ( select provincia from provincia where provincia.id=t1.id_provincia and provincia>'B' ) Garca Macas Garca Antonio Jordi Laura
Nota: se puede obtener el mismo resultado con otras expresiones como join o in. 4.2. Insercin de datos. INSERT La clusula INSERT sirve para aadir una o varias nuevas filas a una tabla o una vista. Sintaxis INSERT [ INTO ]
15
table_or view_name [ ( column_list ) ] VALUES ( { DEFAULT | NULL | expression } [ ,...n ] ) [ ,...n ] INTO Es una palabra clave opcional que se puede utilizar entre INSERT y la tabla de destino. table_or view_name Es el nombre de la tabla o la vista que va a recibir los datos. Se puede utilizar una variable table en su mbito como origen de tabla en una instruccin INSERT. ( column_list ) Es una lista de una o ms columnas en las que se insertarn los datos. column_list se debe incluir entre parntesis y delimitar con comas. Si la columna no se incluye en column_list, Database Engine (Motor de base de datos) debe ser capaz de proporcionar un valor basado en la definicin de la columna; en caso contrario, no se puede cargar la fila. Database Engine (Motor de base de datos) proporciona automticamente un valor para la columna si esta: Tiene una propiedad IDENTITY. Se usa el valor de identidad incremental siguiente. Tiene un valor predeterminado. Se usa el valor predeterminado de la columna. Tiene un tipo de datos timestamp. Se utiliza el valor actual de marca de tiempo. Acepta valores NULL. Se usa un valor NULL. Es una columna calculada. Se utiliza el valor calculado.
Se debe utilizar column_list y la lista VALUES al insertar valores explcitos en una columna de identidad. La opcin SET IDENTITY_INSERT debe ser ON para la tabla. VALUES Presenta la lista o listas de valores de datos que se van a insertar. Debe haber un valor de datos por cada columna en column_list, si se especifica, o en la tabla. La lista de valores debe ir entre parntesis. Si los valores de la lista VALUES no estn en el mismo orden que las columnas de la tabla o no contienen un valor para cada columna de la tabla, se debe usar column_list para especificar de forma explcita la columna que almacenar cada valor de entrada. SQL Server 2008 incorpora el constructor de filas de Transact-SQL (que tambin se denomina constructor con valores de tabla) para especificar varias filas en una nica instruccin INSERT. El constructor de filas se compone de una nica clusula VALUES con varias listas de valores escritos entre parntesis y separados por una coma. La insercin de varias filas de valores requiere que la lista VALUES est en el mismo orden que las columnas de la tabla, para tener un valor en cada columna, o que en column_list se especifique de forma explcita la columna en la que se almacena cada uno de los valores de entrada. El nmero mximo de filas que se pueden insertar en una instruccin INSERT nica es 1000. Para insertar ms de 1000 filas, cree varias instrucciones INSERT, o realice una importacin masiva de datos mediante la utilidad bcp o la instruccin BULK INSERT. Nota: Cuando se hace referencia a los tipos de datos de caracteres Unicode nchar, nvarchar y ntext, debe agregarse como prefijo la letra mayscula 'N' a 'expression'. Si no se especifica 'N', SQL Server convierte la cadena a la pgina de cdigos que se corresponde con la intercalacin predeterminada de la base de datos o columna. Los caracteres que no se encuentren en esta pgina de cdigos se perdern. Ejemplo. Insertar los siguientes datos en la tabla provincias: Ciudad Real, Soria, Teruel, Cdiz.
16
use alumnetarda insert into provincia (provincia) values ('Ciudad Real'), ('Soria'), ('Teruel'), ('Cdiz') id 1 2 3 4 5 6 7 8 9 10 11 provincia lava Albacete Alicante Almera Barcelona Lugo Valencia Ciudad Real Soria Teruel Cdiz
Aadir un nuevo empleado con los siguientes datos: Raquel Bustamante, DNI 45367953F, C. del Pollo Frito, L'Hospitalet, Barcelona, edad 20. use alumnetarda insert into Tabla_direcciones_empleados (DNI,Nombre,Apellidos,Direccion,Poblacion,id_provincia,edad) values ('45367953F','Raquel','Bustamante','C. del Pollo Frito','Hospitalet',5,20) 1 2 3 5 6 23987739A 45623890F 43567893D 23456789G 45367953F Garca Lpez Macas Garca Raquel Antonio Juan Jordi Laura Bustamante C. Mayor 2 Pl. Ayuntamiento C. Bull C. Lepant C. del Pollo Frito Valencia Alicante Sant Cugat Gav Hospitalet 7 3 5 5 5 21 34 23 26 20
4.3. Modificar Datos. UPDATE Cambia los datos de una tabla o vista. Sintaxis UPDATE table SET { column_name = { expression | DEFAULT | NULL } | column_name { += | -= | *= | /= | %= | &= | ^= | |= } expression } [ ,...n ] [ WHERE { <search_condition> }] [;] SET Especifica la lista de nombres de variable o de columna que se van a actualizar. Table Nombre de la tabla a modificar column_name Es una columna que contiene los datos que se van a cambiar. column_name debe existir en table_or view_name. Las columnas de identidad no se pueden actualizar.
17
expression Es una variable, un valor literal, una expresin o una instruccin de subseleccin entre parntesis que devuelve un solo valor. El valor devuelto por expression sustituye al valor existente en column_name o @variable. DEFAULT Especifica que el valor predeterminado definido para la columna debe reemplazar al valor existente en esa columna. Esta operacin tambin puede utilizarse para cambiar la columna a NULL si no tiene asignado ningn valor predeterminado y se ha definido para aceptar valores NULL. { += | -= | *= | /= | %= | &= | ^= | |= } Operador de asignacin compuesta: += Sumar y asignar -= Restar y asignar *= Multiplicar y asignar /= Dividir y asignar %= Mdulo y asignar &= AND bit a bit y asignar ^= XOR bit a bit y asignar |= OR bit a bit y asignar
WHERE Especifica las condiciones que limitan las filas que se actualizan. <search_condition> Especifica la condicin que debe cumplirse para que se actualicen las filas. La condicin de bsqueda tambin puede ser la condicin en la que se basa una combinacin. El nmero de predicados que pueden incluirse en una condicin de bsqueda no tiene lmite. Ejemplo: Modifica la poblacin de Raquel Bustamante y cambia LHospitalet por Viladecans use alumnetarda update Tabla_direcciones_empleados set Poblacion='Viladecans' where Nombre='Raquel' AND Apellidos='Bustamante' Id 1 2 3 5 6 DNI 23987739A 45623890F 43567893D 23456789G 45367953F Nombre Garca Lpez Macas Garca Raquel Apellidos Antonio Juan Jordi Laura Bustamante Direccion C. Mayor 2 Pl. Ayuntamiento C. Bull C. Lepant C. del Pollo Frito Poblacion Valencia Alicante Sant Cugat Gav Viladecans id_provincia 7 3 5 5 5 edad 21 34 23 26 20
4.4. Borrar Datos. DELETE Quita filas de una tabla o vista. Sintaxis DELETE [ FROM < table_or view_name > ] [ WHERE { <search_condition} ] [; ] FROM Se trata de una palabra clave opcional que se puede utilizar entre la palabra clave DELETE y el destino table_or_view_name o rowset_function_limited. table_or view_name
18
Es el nombre de la tabla o vista cuyas filas se deben quitar. En este mbito, se puede utilizar una variable table como origen de tabla en una instruccin DELETE. WHERE Especifica las condiciones utilizadas para limitar el nmero de filas que se van a eliminar. Si no se proporciona una clusula WHERE, DELETE quita todas las filas de la tabla. <search_condition> Especifica las condiciones restrictivas de las filas que se van a eliminar. No hay lmite en el nmero de predicados que se pueden incluir en una condicin de bsqueda. Para obtener ms informacin, vea Condiciones de bsqueda (Transact-SQL). Ejemplo: Eliminar los datos de Raquel Bustamante use alumnetarda delete from Tabla_direcciones_empleados where Nombre='Raquel' AND Apellidos='Bustamante' 4.5. Vistas. Uso Una vista es una consulta SQL almacenada en el SGDB que simplifica la obtencin de datos. Son adecuadas para acceder y trabajar con consultas complejas o que se usan repetidamente. Una vez definidas se comportan como una tabla y se pueden realizar bsqueda. La operacin de insercin depender de que haya datos para todos los campos de las tablas que forman la vista que no acepten nulos. La modificacin queda restringida a datos que afecten a una nica tabla de las que forman la vista. El borrado a vistas que no implique ms de una tabla. Para crearlas, se puede hacer con el entorno grfico en vistas del explorador de objetos. La manera de usar la interficie es similar a crear relaciones. La sintaxis pera crear una vista se explicar en el tema dedicado a DDL.
Para el ejemplo se ha usado una base de datos llamada SistemaSolar que consta de dos tablas relacionadas planeta y satelite. Tabla Satelite id nombre id_planeta
19
1 2 3 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 Tabla Planeta id 1 3 4 5 6 7 9 10 11 nombre Mercurio Venus Tierra Marte Jpiter Saturno Urano Neptuno Pluton
Luna Fobos Deimos Io Europa Ganmedes Calisto Mimas Enclado Tetis Dione Rea Titn Hiperin Jpeto Febe Titania Obern Umbriel Ariel Miranda Tritn Proteo Nereida Caronte
4 5 5 6 6 6 6 7 7 7 7 7 7 7 7 7 9 9 9 9 9 10 10 10 11
situacion I I I I E E E E E
La consulta que usaremos para definir la vista, PlanetasySatelites, es: SELECT TOP (100) PERCENT dbo.satelite.id, dbo.satelite.nombre AS satellite, dbo.planeta.nombre AS planeta, dbo.planeta.situacion, dbo.planeta.distancia, dbo.planeta.periodo FROM dbo.planeta INNER JOIN dbo.satelite ON dbo.planeta.id = dbo.satelite.id_planeta ORDER BY planeta, satellite Esta consulta devuelve un listado con los planetas aparecen. id satellite planeta 1 Luna Tierra 8 Io Jpiter 9 Europa Jpiter 10 Ganmedes Jpiter 11 Calisto Jpiter que tienen satlites. Los planetas sin satlite no situacion I E E E E distancia 1 5,2 5,2 5,2 5,2 periodo 1 11,86 11,86 11,86 11,86
20
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 37 38
Mimas Enclado Tetis Dione Rea Titn Hiperin Jpeto Febe Titania Obern Umbriel Ariel Miranda Tritn Proteo Nereida Caronte Fobos Deimos
Saturno Saturno Saturno Saturno Saturno Saturno Saturno Saturno Saturno Urano Urano Urano Urano Urano Neptuno Neptuno Neptuno Pluton Marte Marte
E E E E E E E E E E E E E E E E E E I I
9,54 9,54 9,54 9,54 9,54 9,54 9,54 9,54 9,54 19,22 19,22 19,22 19,22 19,22 30,06 30,06 30,06 39,48 1,52 1,52
29,46 29,46 29,46 29,46 29,46 29,46 29,46 29,46 29,46 84,01 84,01 84,01 84,01 84,01 164,79 164,79 164,79 247,992 1,88 1,88
21
La palabra reservada GO sirve para marcar el final de un bloque de instrucciones. Si a continuacin se pone un entero, el bloque se repite las veces indicadas. Despus de GO se reinicia la consola y y se pierden todos los valores de tablas temporales y variables definidas. Ejemplo: En la base de datos de planetas se va a ejecutar 3 veces la consulta que busca los satelites de Marte: select satelite, planeta from PlanetasySatellites where planeta='marte' go 3 La palabra reservada PRINT sirve para mostrar en pantalla resultados. Equivale en VB a System.Console.Write(). Ejemplo: mostrar en pantalla la suma de dos nmeros declare @a int = 2 declare @b int = 3 select @a += @b print 'La suma vale ' + cast(@a as varchar) Comentarios Una lnea: -- Esto es un comentario de una lnea Multilnea: /* comentario multilnea */ 5.1.2. Variables Declaracin de varibles DECLARE @nombre_variable tipo_variable; Asignacin de valores Para valores constantes no calculados: SET @nombre_variable = literal_valor; SELECT @nombre_variable = literal_valor; Para cualquier otra expresin SELECT @nombre_variable = literal_valor; Declaracin con asignacin DECLARE @nombre_variable tipo_variable = literal_valor; Ejemplos: declare @a int; set @a=2; declare @b int = 2; declare @c varchar = 'La casa'; declare @fecha datetime = '2009-05-09'; Tipos Los tipos son los mismos que tenemos para definir los campos de la DB Numricos exactos: bigint, numeric, bit, smallint, decimal, smallmoney, int, tinyint, money Numricos coma flotante: float, real Fecha y hora Ejemplo 12:35:29. 1234567 Formato estndar de entrada hh:mm:ss hh:mm[:ss][.fracciones de segundo]
Tipo time
22
08/05/2007 08/05/2007 12:35 2007-05-08 12:35:29.123 2007-05-08 12:35:29. 1234567 2007-05-08 12:35:29.1234567 +12:15
AAAA-MM-DD YYYYMMDD Hora 0-24 AAAA-MM-DDThh:mm:ss[.mmm] AAAAMMDDThh:mm:ss[.mmm] Extensin datetime Datetime con zona horaria
Cadenas de caracteres: char, varchar, text Cadenas de caracteres Unicode: nchar, nvarchar, ntext Cadenas binarias Datos binarios de longitud fija con una longitud de n bytes, donde n es un valor que oscila entre 1 y 8.000. El tamao de almacenamiento es de n bytes. Datos binarios de longitud variable. n puede ser un valor que oscila entre 1 y 8.000.
binary varbinary
5.1.3. Operadores y funciones del sistema Con Transact, tambin se pueden realizar operaciones matemticas. Las ms comunes son +, -, * , / aunque tambin disponemos de funciones varias para realizar distintas operaciones. Ejemplos: declare @b int=2; set @b +=1 set @b -=1 set @b *=2 set @b /=3 print @b Funciones matemticas. ABS, DEGREES, RAND, ACOS, EXP, ROUND, ASIN, FLOOR, SIGN, ATAN, LOG, SIN, ATN2, LOG10, SQRT, CEILING, PI, SQUARE, COS, POWER, TAN, COT, RADIANS Ejemplo: En la base de datos de planetas se devuelve la lista de planetas y se aade una nueva columna calculada segn la formula: dist = log distancia 150000000
select nombre, LOG(distancia * 150000000) dist from planeta Funciones de fecha y hora. CURRENT_TIMESTAMP, GETDATE ( ). Devuelve un valor datetime que contiene la fecha y hora del equipo en el que la instancia de SQL Server se est ejecutando. El ajuste de zona horaria no est incluido GETUTCDATE ( ). Devuelve un valor datetime que contiene la fecha y hora del equipo en el que la instancia de SQL Server se est ejecutando. La fecha y hora se devuelven como una hora universal coordinada (UTC). DAY, MONTH, YEAR, ISDATE Ejemplo: Obtener la fecha y hora actuales del sistema print SYSDATETIME() print SYSDATETIMEOFFSET() print SYSUTCDATETIME() print CURRENT_TIMESTAMP print GETDATE() print GETUTCDATE()
23
Resultado: 2009-05-11 10:47:54.3582912 2009-05-11 10:47:54.3582912 +02:00 2009-05-11 08:47:54.3582912 May 11 2009 10:47AM May 11 2009 10:47AM May 11 2009 8:47AM Imprimir con formato hh:mm:ss dd-mm-yyyy a fecha '2004-05-11 12:00:06' declare @fecha datetime = CURRENT_TIMESTAMP declare @str varchar(30); select @str = convert(varchar,@fecha,108) + ' ' + convert(varchar,@fecha,105); print @str Ms informacin de conversin de formatos con CAST y CONVERT en: http://msdn.microsoft.com/es-es/library/ms187928.aspx Funciones de cadena. ASCII, NCHAR, SOUNDEX, CHAR, PATINDEX, SPACE, CHARINDEX, QUOTENAME, STR, DIFFERENCE, REPLACE, STUFF, LEFT, REPLICATE, SUBSTRING, LEN, REVERSE, UNICODE, LOWER, RIGHT, UPPER, LTRIM, RTRIM Funciones del cursor. Devuelven informacin acerca de los cursores. @@CURSOR_ROWS, CURSOR_STATUS, @@FETCH_STATUS Funciones del sistema. Realizan operaciones y devuelven informacin sobre valores, objetos y configuraciones de SQL Server. COLUMNS_UPDATED, CURRENT_TIMESTAMP, CURRENT_USER, DATALENGTH, @@ERROR, ERROR_LINE, ERROR_MESSAGE, ERROR_NUMBER, ERROR_PROCEDURE, HOST_ID, HOST_NAME, @@IDENTITY, ISDATE, ISNULL, ISNUMERIC, @@ROWCOUNT, ROWCOUNT_BIG, SERVERPROPERTY, SESSIONPROPERTY, SESSION_USER, SYSTEM_USER, USER_NAME Funciones de conjuntos de filas. Devuelven un objeto que se puede utilizar, en instrucciones Transact-SQL, en lugar de una referencia a una tabla. CONTAINSTABLE, OPENQUERY, FREETEXTTABLE, OPENROWSET, OPENDATASOURCE, OPENXML Funciones de configuracin. Devuelven informacin acerca de las opciones de configuracin actuales. @@DATEFIRST, @@OPTIONS, @@LANGID, @@SERVERNAME, @@LANGUAGE, @@SERVICENAME, @@LOCK_TIMEOUT, @@SPID, @@MAX_CONNECTIONS, @@TEXTSIZE, @@MAX_PRECISION, @@VERSION Funciones de metadatos. Devuelven informacin acerca de la base de datos y de los objetos de la misma. Funciones de seguridad. Devuelven informacin til para la administracin de la seguridad. 5.1.4. Estructuras Condicionales IFELSE IF Boolean_expression { sql_statement | statement_block } [ ELSE { sql_statement | statement_block } ] Ejemplo: en la DB del sistema solar extraer un listado diferente de la tabla planeta dependiendo de un valor asignado a una variable. declare @dis float = 50; if @dis > 30 select nombre, distancia from planeta else
24
select nombre, periodo,situacion from planeta En Transact-SQL no existe elseif, pero si se pueden hacer if anidados Ejemplo 2: condiciones anidadas declare @dis float = 20; declare @per float = 1; if @dis > 30 if @per>= 5 print 'dis y per mayores' else print 'dis mayor y per menor' else if @per>= 5 print 'dis menor y per mayor' else print 'dis y per menores' CASE Evala una lista de condiciones y devuelve una de las varias expresiones de resultado posibles. CASE admite un argumento ELSE opcional. CASE se puede utilizar en cualquier instruccin o clusula que permite una expresin vlida. Por ejemplo, puede utilizar CASE en instrucciones como SELECT, UPDATE, DELETE y SET, y en clusulas como select_list, IN, WHERE, ORDER BY y HAVING. SQL Server slo permite 10 niveles de anidamiento en las expresiones CASE. Sintaxis CASE input_expression WHEN expression THEN result_expression [ ...n ] [ ELSE else_result_expression ] END Ejemplo: En la BD sistema solar sacar un listado de planetas. Sustituir el campo situacin por exterior si vale E e interior si vale I select nombre,situacion= case situacion when 'E' then 'Exterior' else 'Interior' end ,periodo, distancia from planeta Ejemplo: En la BD sistema solar sacar un listado de planetas. Aadir un campo DistanciaAlSol que valga Muy lejano si distancia es mayor que 80, Lejano si distancia entre 1 y 80, y Prximo si distancia <=1 select nombre,periodo, distancia, DistanciaAlSol = case when distancia <=1 then 'Prximo' when distancia > 1 and distancia <= 30 then 'Lejano' else 'Muy lejano' -- distancia > 30 end from planeta order by distancia nombre Mercurio periodo 0,241 distancia 0,38 DistanciaAlSol Prximo
25
Venus Tierra Marte Ceres Jpiter Saturno Urano Neptuno Pluton Haumea Makemake Eris 5.1.5. Estructuras iterativas o bucles WHILE
0,615 1 1,88 4,599 11,86 29,46 84,01 164,79 247,992 285,4 309,9 557
0,72 1 1,52 2,77 5,2 9,54 19,22 30,06 39,48 43,335 45,792 67,668
Prximo Prximo Lejano Lejano Lejano Lejano Lejano Muy lejano Muy lejano Muy lejano Muy lejano Muy lejano
Establece una condicin para la ejecucin repetida de una instruccin o bloque de instrucciones SQL mientras la condicin especificada sea verdadera. Se puede controlar la ejecucin de instrucciones en el bucle WHILE con las palabras clave BREAK y CONTINUE. Sintaxis WHILE Boolean_expression BEGIN { sql_statement | statement_block | BREAK | CONTINUE } END Argumentos Boolean_expression Es una expresin que devuelve TRUE o FALSE. Si la expresin booleana contiene una instruccin SELECT, la instruccin SELECT debe ir entre parntesis. {sql_statement | statement_block} Se trata de cualquier instruccin o grupo de instrucciones Transact-SQL definidas con un bloque de instrucciones. Para definir un bloque de instrucciones, utilice las palabras clave de control de flujo BEGIN y END. BREAK Produce la salida del bucle WHILE ms interno. Se ejecutan las instrucciones que aparecen despus de la palabra clave END, que marca el final del bucle. CONTINUE Hace que se reinicie el bucle WHILE y omite las instrucciones que haya despus de la palabra clave CONTINUE. Si dos o ms bucles WHILE estn anidados, la instruccin BREAK interna sale al siguiente bucle ms externo. Todas las instrucciones que se encuentran despus del final del bucle interno deben ejecutarse primero y despus se reinicia el siguiente bucle ms externo. Ejemplos : suma los 100 primeros nmeros enteros: declare @sum int = 0; declare @i int = 1; while @i<=100 begin select @sum += @i set @i += 1
26
end print @sum 5.1.6. Cursores Los cursores sirven para manipular datos obtenidos de consultas y realizar operaciones con ellos. Cuando se crea un cursor se devuelve una tabla de resultados como consecuencia de hacer una consulta select. Declaracin de cursores Existen dos sintaxis posibles, la ISO y la de SQL Server que difieren un poco. ISO Syntax DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR FOR select_statement [ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ] [;] Transact-SQL Extended Syntax DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ] [ FORWARD_ONLY | SCROLL ] [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] [ TYPE_WARNING ] FOR select_statement [ FOR UPDATE [ OF column_name [ ,...n ] ] ] [;] cursor_name Es el nombre del cursor de servidor de Transact-SQL definido. cursor_name debe cumplir las reglas de los identificadores. INSENSITIVE Define un cursor que hace una copia temporal de los datos que utiliza. SCROLL Especifica que estn disponibles todas las opciones de recuperacin (FIRST, LAST, PRIOR, NEXT, RELATIVE, ABSOLUTE). Si no se especifica SCROLL en una instruccin DECLARE CURSOR de ISO, la nica opcin de recuperacin que se admite es NEXT. No es posible especificar SCROLL si se incluye tambin FAST_FORWARD. select_statement Es una instruccin SELECT estndar que define el conjunto de resultados del cursor. Las palabras clave COMPUTE, COMPUTE BY, FOR BROWSE e INTO no estn permitidas en la instruccin select_statement de una declaracin de cursor. READ ONLY Evita que se efecten actualizaciones a travs de este cursor. UPDATE [OF column_name [,...n]] Define las columnas actualizables en el cursor. Si se especifica OF column_name [,...n], slo las columnas enumeradas admiten modificaciones. Si se especifica UPDATE sin indicar una lista de columnas, se pueden actualizar todas las columnas. FORWARD_ONLY Especifica que el cursor slo se puede desplazar de la primera a la ltima fila. FETCH NEXT es la nica opcin de recuperacin admitida. Si se especifica FORWARD_ONLY sin las palabras clave STATIC, KEYSET o DYNAMIC, el cursor funciona como un cursor DYNAMIC. Cuando no se especifica FORWARD_ONLY ni tampoco SCROLL, FORWARD_ONLY es la opcin predeterminada,
27
salvo que se especifiquen las palabras clave STATIC, KEYSET o DYNAMIC. Los cursores STATIC, KEYSET y DYNAMIC utilizan SCROLL como valor predeterminado. STATIC Define un cursor que hace una copia temporal de los datos que va a utilizar. DYNAMIC Define un cursor que, al desplazarse por l, refleja en su conjunto de resultados todos los cambios realizados en los datos de las filas. FAST_FORWARD Especifica un cursor FORWARD_ONLY, READ_ONLY con las optimizaciones de rendimiento habilitadas. No se puede especificar FAST_FORWARD si se especifica tambin SCROLL o FOR_UPDATE. READ_ONLY Evita que se efecten actualizaciones a travs de este cursor. No es posible hacer referencia al cursor en una clusula WHERE CURRENT OF de una instruccin UPDATE o DELETE. Esta opcin reemplaza la capacidad predeterminada de actualizar el cursor. SCROLL_LOCKS Especifica que se garantiza que las actualizaciones o eliminaciones posicionadas realizadas a travs del cursor sern correctas. SQL Server bloquea las filas cuando se leen en el cursor para garantizar que estarn disponibles para futuras modificaciones. No es posible especificar SCROLL_LOCKS si se especifica tambin FAST_FORWARD o STATIC. Ejemplo: Declarar un cursor con la sentencia select nombre, distancia, posicion from planeta declare fila scroll cursor for select nombre,distancia,periodo from planeta; o declare @fila cursor; set @fila = cursor for select nombre,distancia,periodo from planeta; Uso de cursores Para trabajar con cursores se sigue la siguiente estructura: Declarar variable cursor Establecer la consulta SQL Leer la primera fila Mientras no ltima fila de la consulta Hacer alguna operacin con los datos Liberar memoria cursor Para leer las filas se usa la orden FETCH Sintaxis FETCH [ [ NEXT | PRIOR | FIRST | LAST | ABSOLUTE { n | @nvar } | RELATIVE { n | @nvar } ] FROM ] [ INTO @variable_name [ ,...n ] ] Argumentos
28
NEXT | PRIOR | FIRST | LAST | ABSOLUTE { n | @nvar } | RELATIVE { n | @nvar } indican cmo es el avance: NEXT: siguiente fila. La primera vez que se usa devuelve la primera fila y la ltima fin del cursor. PRIOR: fila anterior. Si es la primera vez no devuelve nada y se pone en la primera fila. FIRST: Devuelve la primera fila del cursor y la convierte en la fila actual. LAST: Devuelve la ltima fila del cursor y la convierte en la fila actual. ABSOLUTE { n | @nvar} : Si n o @nvar es positivo, se devuelve la fila n desde el principio del cursor y la fila devuelta se convierte en la nueva fila actual. Si n o @nvar es negativo, se devuelve la fila n anterior al final del cursor y la fila devuelta se convierte en la nueva fila actual. Si n o @nvar es 0, no se devuelven filas. n debe ser una constante entera y @nvar debe ser smallint, tinyint o int. RELATIVE { n | @nvar}: Si n o @nvar es positivo, se devuelve la fila n posterior a la fila actual y la fila devuelta se convierte en la nueva fila actual. Si n o @nvar es negativo, se devuelve la fila n anterior a la fila actual y la fila devuelta se convierte en la nueva fila actual. Si n o @nvar es 0, se devuelve la fila actual.
INTO @variable_name[ ,...n] Permite colocar en variables locales los datos de las columnas de una recuperacin. Todas las variables de la lista, de izquierda a derecha, estn asociadas a las columnas correspondientes del conjunto de resultados del cursor. El tipo de datos de cada variable tiene que coincidir o ser compatible con la conversin implcita del tipo de datos de la columna correspondiente del conjunto de resultados. El nmero de variables debe coincidir con el nmero de columnas de la lista de seleccin del cursor. Para saber si se ha ledo alguna fila con FETCH o si el cursor est vaci se usa la funcin @@FETCH_STATUS que informa del estado de la ltima instruccin FETCH. Ejemplo 1: En la BD del sistema solar, se va a definir un cursor que devuelva la lista de planetas con la distancia y el periodo. En esta ocasin, el resultado se imprimir en pantalla con la orden print. -- declarar variables declare @distancia float; declare @periodo float; declare @nombre varchar(20); declare @fila cursor; -- establecer consulta para cursor set @fila = cursor for select nombre,distancia,periodo from planeta; -- abrir la consulta open @fila -- leer 1a fila fetch next from @fila into @nombre,@distancia,@periodo -- comprobamos si hay datos if @@FETCH_STATUS <> 0 print 'no hay datos' -- leemos los datos while @@FETCH_STATUS =0 --comprobar condicin begin print @nombre + ', ' + CAST(@distancia as varchar(20)) + ', ' + CAST(@periodo as varchar(20)) -- leer nueva fila fetch next from @fila into @nombre,@distancia,@periodo end -- liberar cursor deallocate @fila; Ejemplo 2: En la BD del sistema solar, se va a definir un cursor que devuelva la lista de planetas con la distancia y el periodo. Se usar un cursor con la opcin Scroll y se recorrer en orden inverso. -- declarar variables
29
declare @nombre varchar(20), @distancia float, @periodo float; declare fila scroll cursor for select nombre,distancia,periodo from planeta order by nombre asc; -- abrir la consulta open fila -- leer 1a fila fetch last from fila into @nombre,@distancia,@periodo -- comprobamos si hay datos if @@FETCH_STATUS <> 0 print 'no hay datos' -- leemos los datos while @@FETCH_STATUS =0 --comprobar condicin begin print @nombre + ', ' + CAST(@distancia as varchar(20)) + ', ' + CAST(@periodo as varchar(20)) -- leer nueva fila fetch prior from fila into @nombre,@distancia,@periodo end -- liberar cursor deallocate fila; 5.1.7. Tablas temporales Los objetos Table sirven para crear tablas temporales, con las mismas caractersticas que las permanentes, que una vez terminado el procedimiento desaparecen. Se utiliza principalmente para el almacenamiento temporal de un conjunto de filas devuelto como el conjunto de resultados de una consulta. Sintaxis table_type_definition ::= TABLE ( { column_definition | table_constraint } [ ,...n ] ) column_definition ::= column_name scalar_data_type [ [ DEFAULT constant_expression ] | IDENTITY [ ( seed , increment ) ] ] table_constraint ::= { { PRIMARY KEY | UNIQUE } ( column_name [ ,...n ] ) | CHECK ( logical_expression ) } Argumentos table_type_definition Se definen de la misma manera que se usa para crear tablas con DDL. La sintaxis es la misma que la de CREATE TABLE. La declaracin de tabla incluye definiciones de columna, nombres, tipos de datos y restricciones. Slo se permiten los tipos de restricciones PRIMARY KEY, UNIQUE KEY y NULL. Se puede hacer referencia a las variables table por nombre en la clusula FROM de un lote, segn se muestra en el siguiente ejemplo: SELECT Employee_ID, Department_ID FROM @MyTableVar Fuera de una clusula FROM, se debe hacer referencia a las variables table mediante un alias, segn se muestra en el siguiente ejemplo: SELECT EmployeeID, DepartmentID FROM @MyTableVar m JOIN Employee on (m.EmployeeID =Employee.EmployeeID AND m.DepartmentID = Employee.DepartmentID)
30
No se permite la operacin de asignacin entre variables table. Ejemplo: En la BD del sistema solar, se va a definir un cursor que devuelva la lista de planetas con la distancia y el periodo; los resultados se guardarn en una tabla temporal. declare @TMP_planeta table( id int identity(1,1) primary key, nombre varchar(20), distancia float, periodo float ) declare @distancia float, @periodo float; declare @nombre varchar(20); -- declara i asignar sql a cursor declare fila cursor for select nombre,distancia,periodo from planeta where distancia < 100.0 order by distancia; -- abrir la consulta open fila -- leer 1a fila fetch next from fila into @nombre,@distancia,@periodo -- comprobamos si hay datos if @@FETCH_STATUS <> 0 print 'no hay datos' -- leemos los datos while @@FETCH_STATUS =0 --comprobar condicin begin insert into @TMP_planeta (nombre,distancia,periodo) values (@nombre,@distancia,@periodo) -- leer nueva fila fetch next from fila into @nombre,@distancia,@periodo end deallocate fila; -- ensear resultados select * from @TMP_planeta 5.2. Funciones Al igual que las funciones en los lenguajes de programacin, las funciones definidas por el usuario de Transact-SQL son rutinas que aceptan parmetros, realizan una accin, como un clculo complejo, y devuelven el resultado de esa accin como un valor. El valor devuelto puede ser un valor escalar nico o un conjunto de resultados. Las funciones definidas por el usuario se almacenan de forma permanente en la DB como las tablas o las vistas. Las funciones se modifican con ALTER FUNCTION y se quitan con DROP FUNCTION. Tambin existe un editor grfico de funciones. Sintaxis 1. Funciones que devuelven valores escalares (nmeros, varchar, fechas...) CREATE FUNCTION function_name ( [ { @parameter_name [ AS ] parameter_data_type [ = default ] [ READONLY ] } [ ,...n ] ] ) RETURNS return_data_type [ WITH <function_option> [ ,...n ] ] [ AS ]
31
BEGIN function_body RETURN scalar_expression END [;] 2. Funciones que devuelven tablas CREATE FUNCTION function_name ( [ { @parameter_name [ AS ] parameter_data_type [ = default ] [ READONLY ] } [ ,...n ] ] ) RETURNS TABLE [ WITH <function_option> [ ,...n ] ] [ AS ] RETURN [ ( ] select_stmt [ ) ] [;] 4. Funciones que devuelven valores de tabla de mltiples instrucciones CREATE FUNCTION function_name ( [ { @parameter_name [ AS ] parameter_data_type [ = default ] [READONLY] } [ ,...n ] ] ) RETURNS @return_variable TABLE <table_type_definition> [ WITH <function_option> [ ,...n ] ] [ AS ] BEGIN function_body RETURN END [;] Argumentos @ parameter_name Es un parmetro de la funcin definida por el usuario. Es posible declarar uno o varios parmetros. Una funcin puede tener un mximo de 2.100 parmetros. El usuario debe proporcionar el valor de cada parmetro declarado cuando se ejecuta la funcin, a menos que se defina un valor predeterminado para el parmetro. parameter_data_type Es el tipo de datos del parmetro y, de forma opcional, el esquema al que pertenece. [ = default ] Es un valor predeterminado para el parmetro. Si se define un valor default, la funcin se puede ejecutar sin especificar un valor para ese parmetro. Cuando un parmetro de la funcin tiene un valor predeterminado, se debe especificar la palabra clave DEFAULT al llamar a la funcin para recuperar el valor predeterminado. READONLY Indica que el parmetro no se puede actualizar ni modificar en la definicin de la funcin. Si el tipo de parmetro es un tipo de tabla definido por el usuario, se debe especificar READONLY. return_data_type
32
Es el valor devuelto de una funcin escalar definida por el usuario. function_body Especifica que una serie de instrucciones Transact-SQL, que juntas no producen ningn efecto secundario (como, por ejemplo, modificar una tabla), definen el valor de la funcin. function_body solamente se utiliza en funciones escalares y funciones con valores de tabla de mltiples instrucciones. scalar_expression Especifica el valor escalar que devuelve la funcin escalar. TABLE Especifica que el valor devuelto de la funcin con valores de tabla es una tabla. Solamente se pueden pasar constantes y @local_variables a las funciones con valores de tabla. En el caso 2, el valor devuelto de TABLE se define mediante una nica instruccin SELECT. En el caso 3, @return_variable es una variable de TABLE, que se utiliza para almacenar y acumular las filas que se deben devolver como valor de la funcin. @return_variable solamente se puede especificar para funciones Transact-SQL. select_stmt Es la instruccin SELECT individual que define el valor devuelto de una funcin insertada con valores de tabla. ORDER (<order_clause>) Especifica el orden en que los resultados se devuelven de la funcin con valores de tabla. <table_type_definition> ( { <column_definition> <column_constraint> | <computed_column_definition> } [ <table_constraint> ] [ ,...n ] ) Define el tipo de datos de tabla para una funcin Transact-SQL. La declaracin de tabla incluye definiciones de columna y restricciones de columna o de tabla. La tabla se coloca siempre en el grupo de archivos principal. Llamada a funciones Para ejecutar una funcin se utliza: 1. caso 1. SELECT nombre_funcin(parmetros) [AS alias] 2. casos 2 y 4. SELECT columnas FROM nombre_funcin(parmetros) [AS alias]
Ejemplo 1: En la DB sistema solar definiremos una funcin que devuelva el nmero de satelites que tiene un planeta determinado. create function numSatelites (@planeta varchar(20)) returns int begin declare @Nsat int select @Nsat = Nsat from PlanetasNumSat where planeta = @planeta return @Nsat end Llamada funcin: use SistemaSolar select dbo.numSatelites('ceres') Ejemplo 2: En la DB sistema solar definiremos una funcin que devuelva la lista de satelites que tiene un planeta determinado. Usaremos el caso 2, devolviendo resultados de una tabla o vista.
33
create function ListaSatelites (@planeta varchar(20)) returns table as return ( select satelite from PlanetasySatellites where planeta = @planeta ); Llamada funcin: select * from dbo.ListaSatelites('marte') Ejemplo 3: En la DB sistema solar definiremos una funcin que devuelva la lista de satelites que tiene un planeta determinado. Usaremos el caso 3, devolviendo una tabla temporal creada al efecto. -- funcin que devuelve una lista de los satelites para un planeta determinado create function satelites(@planeta varchar(20)) returns @listasatelites table (satelite varchar(20)) as begin insert into @listasatelites select satelite from PlanetasySatellites where planeta=@planeta return end Para llamar a la funcin usaremos: select * from satelites('Marte') 5.3. Procedimientos almacenados Los procedimientos almacenados permiten la ejecucin de bloques de cdigo de forma sistemtica. En Visual Basic equivaldran a los procedimientos SUB. Los procedimientos admiten parmetros de entrada y de salida. Los procedimientos definidos por el usuario se almacenan de forma permanente en la DB como las tablas, vistas o funciones. Los procedimientos se modifican con ALTER PROCEDURE y se quitan con DROP PROCEDURE. Tambin existe un editor grfico de procedimientos almacenados. Sintaxis CREATE { PROC | PROCEDURE } procedure_name [ { @parameter data_type } [ VARYING ] [ = default ] [ OUT | OUTPUT ] [READONLY] ] [ ,...n ] AS { <sql_statement> [;][ ...n ] | <method_specifier> } [;] <sql_statement> ::= { [ BEGIN ] statements [ END ] } Argumentos procedure_name Es el nombre del nuevo procedimiento almacenado. Los nombres de los procedimientos deben cumplir las reglas de los identificadores y deben ser exclusivos en el esquema. @ parameter Es un parmetro del procedimiento. El usuario debe proporcionar el valor de cada parmetro declarado cuando se llama al procedimiento, a menos que se haya definido un valor predeterminado
34
para el parmetro o se haya establecido en el mismo valor que otro parmetro. Un procedimiento almacenado puede tener un mximo de 2.100 parmetros. data_type Es el tipo de datos del parmetro y el esquema al que pertenece. default Es un valor predeterminado para el parmetro. Si se define un valor default, el procedimiento se puede ejecutar sin especificar un valor para ese parmetro. El valor predeterminado debe ser una constante o puede ser NULL. Si el procedimiento utiliza el parmetro con la palabra clave LIKE, puede incluir los siguientes caracteres comodn: % _ [] y [^]. OUTPUT Indica que se trata de un parmetro de salida. El valor de esta opcin puede devolverse a la instruccin EXECUTE que llama. Utilice los parmetros OUTPUT para devolver valores al autor de la llamada del procedimiento. READONLY Indica que el parmetro no se puede actualizar ni modificar en el cuerpo del procedimiento. Si el tipo de parmetro es un tipo de tabla definido por el usuario, se debe especificar READONLY. <sql_statement> Una o ms instrucciones Transact-SQL que se van a incluir en el procedimiento. Para obtener ms informacin sobre algunas limitaciones aplicables, vea la seccin de Notas. Ejecucin EXEC nombre_procedimiento parametros Ejemplo 1. En la DB sistema solar definiremos un procedimiento que ensee la lista de satelites que tiene un planeta determinado. create procedure ProcListaSatelites @planeta varchar(20) as begin select satelite,planeta from dbo.PlanetasySatellites where planeta= @planeta order by satelite end Llamada procedimiento exec dbo.ProcListaSatelites 'Jpiter' o exec dbo.ProcListaSatelites @planeta='Jpiter' Ejemplo 2. En la DB sistema solar definiremos un procedimiento que borre un planeta. Borrar Ceres. create procedure BorrarPlaneta @planeta varchar(20) as begin if @planeta<>'' begin delete from planeta where nombre= @planeta print @planeta + ' se ha borrado correctamente' end else print No se ha borrado ningn planeta
35
end Llamada procedimiento exec BorrarPlaneta 'ceres' Ejemplo 3. En la DB sistema solar definiremos un procedimiento que borre un planeta y devuelva un mensaje. Borrar Eris. create procedure BorrarPlaneta2 @planeta varchar(20) = '', @mensaje varchar(50) OUTPUT as begin if @planeta<>'' begin delete from planeta where nombre= @planeta SELECT @mensaje = @planeta + ' se ha borrado correctamente' end else SELECT @mensaje = 'No se ha borrado ningn planeta' end Llamada procedimiento declare @str varchar(50) exec dbo.BorrarPlaneta2 'eris' ,@str output print @str 5.4. Desencadenadores o Triggers Los desencadenadores sirven para ejecutar un determinado cdigo cuando se produce una operacin de insercin, modificacin o borrado de datos en una tabla o vista de una DB. Los dos tipos de desencadenadores que podemos encontrar son: AFTER (despus de) o el cdigo se ejecuta despus de una operacin INSERT, UPDATE, DELETE. o Slo se pude utilizar en tablas. INSTEAD OF (en lugar de) o el cdigo se ejecuta antes de una operacin INSERT, UPDATE, DELETE. En concreto se reemplaza el cdigo original por otro que se ejecuta en su lugar. o Se puede usar en tablas y vistas.
Sintaxis CREATE TRIGGER trigger_name ON { table | view } { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] } AS { sql_statement [ ; ] [ ,...n ] } Argumentos trigger_name Es el nombre del desencadenador. El parmetro trigger_name debe cumplir con las reglas de los identificadores, con la excepcin de que trigger_name no puede comenzar con los smbolos # o ##. FOR | AFTER AFTER especifica que el desencadenador DML slo se activa cuando todas las operaciones especificadas en la instruccin SQL desencadenadora se han ejecutado correctamente. Adems, todas las acciones referenciales en cascada y las comprobaciones de restricciones deben ser correctas para que este desencadenador se ejecute.
36
AFTER es el valor predeterminado cuando slo se especifica la palabra clave FOR. Los desencadenadores AFTER no se pueden definir en las vistas. INSTEAD OF Especifica que se ejecuta el desencadenador DML en vez de la instruccin SQL desencadenadora, por lo que se suplantan las acciones de las instrucciones desencadenadoras. Como mximo, se puede definir un desencadenador INSTEAD OF por cada instruccin INSERT, UPDATE o DELETE en cada tabla o vista. No obstante, en las vistas es posible definir otras vistas que tengan su propio desencadenador INSTEAD OF. { [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] } Especifica las instrucciones de modificacin de datos que activan el desencadenador DML cuando se intenta en esta tabla o vista. Se debe especificar al menos una opcin. En la definicin del desencadenador se permite cualquier combinacin de estas opciones, en cualquier orden. Para los desencadenadores INSTEAD OF, no se permite la opcin DELETE en tablas que tengan una relacin de integridad referencial que especifica una accin ON DELETE en cascada. Igualmente, no se permite la opcin UPDATE en tablas que tengan una relacin de integridad referencial que especifica una accin ON UPDATE en cascada. sql_statement Son las condiciones y acciones del desencadenador. Los desencadenadores pueden incluir cualquier nmero y clase de instrucciones Transact-SQL, con excepciones. Para obtener ms informacin, vea la seccin Notas. Notas Los desencadenadores DML se utilizan frecuentemente para imponer las reglas de negocios y la integridad de los datos. SQL Server proporciona integridad referencial declarativa (DRI) mediante las instrucciones ALTER TABLE y CREATE TABLE. Sin embargo, DRI no proporciona integridad referencial entre bases de datos. La integridad referencial se refiere a las reglas acerca de la relacin entre la clave principal y la clave externa de las tablas. Para exigir la integridad referencial, utilice las restricciones de tipo PRIMARY KEY y FOREIGN KEY en ALTER TABLE y CREATE TABLE. Si existen restricciones en la tabla de desencadenadores, se comprueban despus de la ejecucin del desencadenador INSTEAD OF y antes de la de AFTER. Si se infringen las restricciones, se revierten las acciones del desencadenador INSTEAD OF y el desencadenador AFTER no se ejecuta. Un desencadenador AFTER se ejecuta slo despus de ejecutar correctamente la instruccin SQL desencadenadora. La ejecucin correcta incluye todas las acciones referenciales en cascada y las comprobaciones de restricciones asociadas con el objeto actualizado o eliminado. Limitaciones de los desencadenadores La misma accin del desencadenador puede definirse para ms de una accin del usuario (por ejemplo, INSERT y UPDATE) en la misma instruccin CREATE TRIGGER. Los desencadenadores INSTEAD OF DELETE/UPDATE no pueden definirse en una tabla con una clave externa definida en cascada en la accin DELETE/UPDATE. Cuando se activa un desencadenador, los resultados se devuelven a la aplicacin que llama, exactamente igual que con los procedimientos almacenados. Para impedir que se devuelvan resultados a la aplicacin debido a la activacin de un desencadenador, no incluya las instrucciones SELECT que devuelven resultados ni las instrucciones que realizan una asignacin variable en un desencadenador. Las siguientes instrucciones Transact-SQL no estn permitidas en un desencadenador DML: ALTER DATABASE LOAD DATABASE RESTORE DATABASE CREATE DATABASE LOAD LOG RESTORE LOG DROP DATABASE RECONFIGURE
37
Adems, las siguientes instrucciones Transact-SQL no se permiten en el cuerpo de un desencadenador DML cuando ste se utiliza en la tabla o vista que es objeto de la accin desencadenadora. CREATE INDEX (incluidos CREATE SPATIAL INDEX y ALTER INDEX CREATE XML INDEX) DBCC DBREINDEX ALTER PARTITION FUNCTION ALTER TABLE cuando se utiliza para hacer lo siguiente: Agregar, modificar o quitar columnas. Cambiar particiones. Agregar o quitar restricciones de tipo PRIMARY KEY o UNIQUE. Tablas especiales creadas automticamente al iniciar un desencadenador Cuando se inicia un trigger se crean dos tablas, inserted y deleted, donde se guardan los valores introducidos/ modificados / borrados. Los campos de las tablas son los mismos que los de las tablas donde se ejecuta la sentencia SQL. El funcionamiento es el siguiente: INSERT se guardan en inserted las filas introducidas. DELETE se guardan en deleted las filas borradas. UPDATE la fila vieja (antes de modificar) se guarda en deleted y la nueva en inserted. Borrar desencadenadores DROP TRIGGER nombre Modificar desencadenadores ALTER TRIGGER trigger_name ON ( table | view ) ( FOR | AFTER | INSTEAD OF ) { [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] } AS { sql_statement [ ; ] [ ...n ] } Activar/desactivar desencadenadores {ENABLE | DISABLE} TRIGGER {[schema_name.] trigger_name [ ,...n ] | ALL} ON {object_name} [;] Argumentos schema_name Es el nombre del esquema al que pertenece el desencadenador. schema_name no se puede especificar para desencadenadores DDL o logon. trigger_name Es el nombre del desencadenador que se va a habilitar. ALL Indica que todos los desencadenadores del mbito de la clusula ON estn habilitados. object_name Es el nombre de la tabla o vista en la que se cre el desencadenador DML trigger_name para su ejecucin. Usos Los usos ms habituales son: DROP INDEX DROP TABLE
38
Insertar datos en una vista. Verificar datos antes de insertarlos. Esto tambin se puede hacer aplicando restricciones a la tabla. Hacer algn clculo complejo o guardar datos del usuario y la hora de insercin de los datos. Enviar correos electrnicos, etc
Ejemplo 1: Insertar datos en una vista. En la DB del sistema solar se va a crear un desencadenador instead of para insertar datos de un planeta y su satelite en la vista PlanetasySatellites CREATE TRIGGER InsertarPlanetasySatelites ON dbo.PlanetasYSatellites INSTEAD OF INSERT AS BEGIN declare @idp int=0, @ids int=0; declare @satelite varchar(20), @planeta varchar(20), @situacion varchar(1); declare @distancia float,@periodo float; declare fila cursor for select planeta, satelite, situacion, distancia, periodo from inserted open fila fetch next from fila into @planeta, @satelite, @situacion, @distancia, @periodo while @@FETCH_STATUS = 0 -- no ltima fila begin -- 1. comprobamos si el planeta est en la tabla planetas -- en caso que no devuelva nada @idp valdr NULL select @idp = (select id from planeta where nombre = @planeta) if @idp > 0 begin -- 2.1. Planeta Existe -- Existe el satelite? select @ids = (select id from satelite where nombre=@satelite) if @ids is null begin -- no existe --> insertar nuevo satelite insert into satelite (nombre,id_planeta) values (@satelite,@idp) end -- else -- s existe --> no hacer nada end else -- @idp is null --> no existe el planeta begin -- 2.2. No existe --> insertamos el planeta y luego los datos del satelite -- 2.2.1. insertamos nuevo planeta insert into planeta (nombre, situacion, distancia, periodo) values (@planeta, @situacion, @distancia, @periodo) -- 2.2.2. insertamos nuevo satelite -- @@identity contiene el ltimo valor introducido en la db insert into satelite (nombre,id_planeta) values (@satelite,@@identity) end fetch next from fila into @planeta, @satelite, @situacion, @distancia, @periodo end deallocate fila; END Si intentamos ejecutar una sentencia insert en la vista veremos como se crean nuevos planetas si es necesario y se aaden los satelites: insert into PlanetasySatellites (satelite,planeta,situacion,distancia,periodo)
39
values ('sevilla', 'andalucia', 'E', 23.5,12.9), ('granada', 'andalucia', 'E', 28.5,23.9) Ejemplo 2: Envia run correo electrnico a una direccin. Nota: este cdigo no funcionar si no se configuran correctamente el servidor SQL y el cortafuegos de windows. CREATE TRIGGER aviso ON planeta AFTER INSERT, UPDATE, DELETE AS begin EXEC msdb.dbo.sp_send_dbmail @profile_name = 'Sistema ', @recipients = '[email protected]', @body = 'Se ha modificado correctamente la tabla planetas', @subject = 'SQL server mensaje'; end Ms informacin en http://technet.microsoft.com/es-es/library/ms190307.aspx Ejemplo 3: Borrar datos en una vista. En la DB del sistema solar se va a crear un desencadenador instead of para borrar datos de un planeta y su satelite en la vista PlanetasySatellites CREATE TRIGGER [dbo].[BorrarPlanetasySatelites] ON [dbo].[PlanetasySatellites] INSTEAD OF DELETE AS BEGIN -- 1. se pase lo que se pase al leer la tabla deleted obtendremos el planeta. -- 2. Ante la incapacidad de saber que se ha pasado se opta por borrar siempre el planeta. -- 3. Por integridad referencial, al borrar el planeta se borran los satlites correspondientes declare @satelite varchar(20), @planeta varchar(20); declare fila cursor for select planeta, satelite from deleted open fila fetch next from fila into @planeta, @satelite while @@FETCH_STATUS = 0 -- no ltima fila begin if @planeta is not null delete from planeta where nombre = @planeta fetch next from fila into @planeta, @satelite end deallocate fila; END Ejemplo 4: Modificar datos en una vista. En la DB del sistema solar se va a crear un desencadenador instead of para moodificar los datos de un planeta y su satelite en la vista PlanetasySatellites. CREATE TRIGGER [dbo].[ModificarPlanetasySatelites] ON [dbo].[PlanetasySatellites] INSTEAD OF UPDATE AS BEGIN -- Slo se harn los cambios si el planeta y el satlite existen -- en la DB. En cualquier otro caso no se har nada -- necesitamos dos cursores, uno paara los valores antguos y otro para los modernos
40
declare @idp int=0, @ids int=0; declare @inssatelite varchar(20), @insplaneta varchar(20), @inssituacion varchar(1); declare @insdistancia float,@insperiodo float; declare @delsatelite varchar(20), @delplaneta varchar(20), @delsituacion varchar(1); declare @deldistancia float,@delperiodo float; -- dades noves declare insfila cursor for select planeta, satelite, situacion, distancia, periodo from inserted open insfila fetch next from insfila into @insplaneta, @inssatelite, @inssituacion, @insdistancia, @insperiodo -- dades antigues declare delfila cursor for select planeta, satelite, situacion, distancia, periodo from deleted open delfila fetch next from delfila into @delplaneta, @delsatelite, @delsituacion, @deldistancia, @delperiodo while @@FETCH_STATUS = 0 -- no ltima fila begin -- comprobamos si el planeta, satelite est en las tabla planeta, satelite -- en caso que no devuelva nada @idp, @ids valdrn NULL select @idp = (select id from planeta where nombre = @delplaneta) select @ids = (select id from satelite where nombre = @delsatelite) if @idp > 0 and @ids > 0 begin -- existen el planeta y el satelite --> modificar datos update planeta set nombre = @insplaneta, situacion = @inssituacion, distancia = @insdistancia, periodo = @insperiodo where id = @idp update satelite set nombre = @inssatelite where id = @ids end fetch next from insfila into @insplaneta, @inssatelite, @inssituacion, @insdistancia, @insperiodo fetch next from delfila into @delplaneta, @delsatelite, @delsituacion, @deldistancia, @delperiodo end deallocate insfila; deallocate delfila; END 5.5. Errores Para concer el resultado de una consulta se dispone d edos variables del sistema: @@ROWCOUNT. Devuelve el nmero de filas afectadas por la ltima instruccin. Si es 0 no se hacho ninguna operacin @@ERROR. Devuelve el nmero de error de la ltima instruccin ejecutada. Si es 0 no se ha producido error. Para obtener ms informacin sobre una lista de mensajes de error (y sus nmeros) que SQL Server puede devolver, vea las columnas de descripcin y error de la tabla de sistema sysmessages en la base de datos master de SQL Server.
Ejemplo: borrar satelite bujero delete from satelite where nombre = 'bujero' if @@ERROR <> 0 print 'Error de sintaxis en DELETE'
41
else begin if @@ROWCOUNT=0 print 'no existe el satelite en la tabla' else print 'se ha borrado correctamente el satlite' end
6. El lenguaje DDL
DDL, Data Definition Language o lenguaje de definicin de datos, es un conjunto de instucciones de SQL que sirve para crear, modificar y borrar bases de datos, tablas, vistas, ndices, funciones y procedimientos. Las principales rdenes son: CREATE crear ALTER modificar DROP borrar. Drop no borra datos, borra elementos de la base de datos
Todas las rdenes que veremos en este tema se pueden realizar desde el entorno grfico de SQL Server. 6.1. Base de datos CREATE DATABASE database_name [;] ALTER DATABASE database_name MODIFY NAME = new_database_name [;] DROP DATABASE database_name [;] Argumentos database_name, new_database_name Es el nombre de la nueva base de datos. Los nombres de base de datos deben ser nicos en una instancia de SQL Server y cumplir las reglas de los identificadores. database_name puede tener 123 caracteres como mximo ms 5 ms reservados por defecto parav el nombre de archivo lgico. Ejemplo: creamos la base de datos del sistema solar CREATE DATABASE SistemaSolar 6.2. Tablas 6.2.1. Create Table Sintaxis CREATE TABLE [nom_base_dades]. nom_taula ( nombre_columna tipo, nombre_columna tipo, nombre_columna tipo ) [;] 6.2.1.1. Tipos de datos Los tiposde datos de las tablas son los mismos que se explicaron al hablar de tipos de variables de programacin con SQL. Ejemplo: create table SistemaSolar.planeta
42
( nombre varchar(20), distancia float ) 6.2.1.2. Permitir/ prohibir valores nulos create table SistemaSolar.planeta ( nombre varchar(20) NOT NULL, distancia float, /* no poner nada equivale a poner que se admiten nulos*/ periodo float NULL ) 6.2.1.3. Valores por defecto. DEFAULT DEFAULT da un valor por defecto cuando se inserta una nueva columna. Esto es independiente de si en la columna se admiten o no nulos. create table planeta3 ( nombre varchar(20) NOT NULL, distancia float NOT NULL, periodo float DEFAULT 3.2, radio float NULL, habitable varchar(1) NOT NULL DEFAULT 'N' ) 6.2.1.4. Clave primaria e identidad. PRIMARY KEY, IDENTITY Con PRIMARY KEY e IDENTITY (inicio, incremento) se marca una clave primaria como autonumrica. create table planeta4 ( id int PRIMARY KEY IDENTITY (1,1), nombre varchar(20) NOT NULL, distancia float NOT NULL, periodo float DEFAULT 3.2, radio float NULL, habitable varchar(1) NOT NULL DEFAULT 'N' ) 6.2.1.5. Columnas sin repeticiones. UNIQUE create table planeta5 ( id int PRIMARY KEY IDENTITY (1,1), nombre varchar(20) UNIQUE NOT NULL, distancia float NOT NULL, periodo float DEFAULT 3.2, radio float NULL, habitable varchar(1) NOT NULL DEFAULT 'N' ) 6.2.1.6. Restricciones. CHECK () Las restricciones permiten acotar los valores posibles para las columnas. Por ejemplo, no tiene sentido hablar de distancias negativas o habitable slo puede valer S o N. create table planeta6 ( id int PRIMARY KEY IDENTITY (1,1), nombre varchar(20) UNIQUE NOT NULL, distancia float NOT NULL check (distancia>=0), periodo float DEFAULT 3.2 check (periodo>=0), radio float NULL check (radio>=0),
43
habitable varchar(1) NOT NULL DEFAULT 'N' check (habitable in ('N','S')) ) 6.2.1.7. Claves externas Las claves externas sirven para definir relaciones entre tablas. Ejemplo: clave externa de satelite que relaciona la tabla planetas y la tabla satelite create table satelite2 ( id int PRIMARY KEY IDENTITY (1,1), nombre varchar(20) UNIQUE NOT NULL, id_planeta int NOT NULL REFERENCES planeta(id) ON DELETE CASCADE ON UPDATE CASCADE -- o -- id_planeta int NOT NULL FOREIGN KEY REFERENCES planeta(id) -- ON DELETE CASCADE ON UPDATE CASCADE ) o alternativamente: create table satelite7 ( id int PRIMARY KEY IDENTITY (1,1), nombre varchar(20) UNIQUE NOT NULL, id_planeta int NOT NULL, CONSTRAINT FK_Planeta_Satelite7 FOREIGN KEY (id_planeta) REFERENCES planeta(id) ON DELETE CASCADE ON UPDATE CASCADE ) Restricciones para las claves externas: ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } NO ACTION El Database Engine (Motor de base de datos) produce un error y se revierte la accin de eliminacin de la fila de la tabla primaria. CASCADE Se eliminan las filas correspondientes de la tabla a la que se hace referencia si la fila se elimina de la tabla primaria. SET NULL Todos los valores que forman la clave externa se establecen en NULL si se elimina la fila correspondiente de la tabla primaria. Para ejecutar esta restriccin, las columnas de clave externa deben admitir valores NULL. SET DEFAULT Todos los valores que forman la clave externa se establecen en los valores predeterminados si se elimina la fila correspondiente de la tabla primaria. Para ejecutar esta restriccin, todas las columnas de clave externa deben tener valores predeterminados. Si la columna admite valores NULL y no hay ningn valor predeterminado establecido de forma explcita, NULL se convierte en el valor predeterminado implcito de la columna. 6.2.1.8. Columnas calculadas Tambin es posible definir una columna como calculada a partir de otras columnas de la tabla. Es una expresin que define el valor de una columna calculada. Una columna calculada es una columna virtual que no est almacenada fsicamente en la tabla, a menos que la columna est marcada con PERSISTED. La columna se calcula a partir de una expresin que utiliza otras columnas de la misma tabla. La expresin puede ser un nombre de columna no calculada, una
44
constante, una funcin, una variable o cualquier combinacin de estos elementos conectados mediante uno o ms operadores. La expresin no puede ser una subconsulta ni contener tipos de datos de alias. Las columnas calculadas se pueden utilizar en listas de seleccin, clusulas WHERE, clusulas ORDER BY u otras ubicaciones en que se puedan utilizar expresiones regulares, con las siguientes excepciones: Una columna calculada no puede utilizarse como definicin de restriccin DEFAULT o FOREIGN KEY ni como definicin de restriccin NOT NULL. Una columna calculada no puede ser el destino de una instruccin INSERT o UPDATE. create table planeta6 ( id int PRIMARY KEY IDENTITY (1,1), nombre varchar(20) UNIQUE NOT NULL, distancia float NOT NULL check (distancia>=0), periodo float DEFAULT 3.2 check (periodo>=0), radio float NULL check (radio=0), habitable varchar(1) NOT NULL DEFAULT 'N' check (habitable in ('N','S')), Len_planeta AS LEN(nombre) ) 6.2.2. Alter Table Cambiar el nombre de una tabla EXEC sp_rename nombre_antiguo, nombre_nuevo[;] Aadir columnas Alter table nombre_tabla add nombre_columna tipo restricciones Ejemplo: alter table satelite add radio float not null; Eliminar columnas Alter table nombre_tabla drop nombre_columna Ejemplo: alter table satelite add radio float not null; Una columna no puede quitarse cuando: Se utiliza en un ndice. Se utiliza en una restriccin CHECK, FOREIGN KEY, UNIQUE o PRIMARY KEY. Est asociada con un valor predeterminado definido con la palabra clave DEFAULT o enlazada a un objeto predeterminado. Est enlazada a una regla.
Alterar columnas Alter table nombre_tabla ALTER COLUMN nombre_col nuevo_tipo restricciones Slo se puede cambiar el tipo o las restricciones. La columna modificada no puede ser ninguna de las siguientes: Ser una columna con un tipo de datos timestamp. Ser una columna calculada ni utilizarse en una columna calculada. Una que se use en un ndice, a menos que la columna sea del tipo de datos varchar, nvarchar o varbinary, el tipo de datos no se cambie, el nuevo tamao sea igual o mayor que el tamao anterior, y el ndice no sea el resultado de una restriccin PRIMARY KEY.
45
Una que se use en las estadsticas generadas por la instruccin CREATE STATISTICS a menos que la columna sea del tipo de datos varchar, nvarchar o varbinary, el tipo de datos no se cambie y el nuevo tamao sea igual o mayor que el tamao anterior, o si la columna se cambia de NOT NULL a NULL. Utilizarse en una restriccin PRIMARY KEY o [FOREIGN KEY] REFERENCES. Utilizarse en una restriccin CHECK o UNIQUE. Sin embargo, se permite el cambio de longitud de una columna de longitud variable en una restriccin CHECK o UNIQUE.
Ejemplo: aadir una clave externa a la tabla satelite alter table satelite add CONSTRAINT FK_Planeta_Satelite2 FOREIGN KEY (id_planeta) REFERENCES planeta(id) ON DELETE CASCADE ON UPDATE CASCADE Ejemplo: aadir una restriccin a la tabla planeta alter table planeta add CONSTRAINT CK_Planeta_distancia check (distancia>=0) Renombrar columnas EXEC sp_rename tabla.nom_columna, 'nuevo_nombre', 'COLUMN'; Ejemplo: EXEC sp_rename 'satelite.nombre, 'nom', 'COLUMN'; Activar/ desactivar trigger ALTER TABLE nom_taula [ENABLE | DISABLE] TRIGGER nombre_trigger; Tambin se pueden poner y quitar ndices, restricciones check, claves externas, etc. 6.2.3. Drop Table Quita una o varias definiciones de tabla y todos los datos, ndices, desencadenadores, restricciones y especificaciones de permisos de esas tablas. Las vistas o procedimientos almacenados que hagan referencia a la tabla quitada se deben quitar explcitamente con DROP VIEW o DROP PROCEDURE. DROP TABLE [ database_name . [ schema_name ] . | schema_name . ] table_name [ ,...n ] [ ; ] No se puede utilizar DROP TABLE para quitar una tabla a la que haga referencia una restriccin FOREIGN KEY. Primero se debe quitar la restriccin FOREIGN KEY o la tabla de referencia. Si la tabla de referencia y la tabla que tiene la clave principal se van a quitar en la misma instruccin DROP TABLE, la tabla de referencia debe aparecer primero. Ejemplo: Drop table satelite 6.3. Vistas 6.3.1. Create view CREATE VIEW [ schema_name . ] view_name AS select_statement [ ; ] Ejemplo: create view PlanetasySatellites as SELECT TOP (100) PERCENT dbo.satelite.id, dbo.satelite.nombre AS satelite, dbo.planeta.nombre AS planeta, dbo.planeta.situacion, dbo.planeta.distancia, dbo.planeta.periodo FROM dbo.planeta INNER JOIN dbo.satelite ON dbo.planeta.id = dbo.satelite.id_planeta ORDER BY planeta, satelite
46
6.3.2. Alter view ALTER VIEW [ schema_name . ] view_name AS select_statement [ ; ] Ejemplo: ALTER VIEW PlanetasySatellites AS SELECT TOP (100) PERCENT dbo.satelite.id, dbo.satelite.nombre AS satelite, dbo.planeta.nombre AS planeta, dbo.planeta.situacion, dbo.planeta.distancia, dbo.planeta.periodo FROM dbo.planeta INNER JOIN dbo.satelite ON dbo.planeta.id = dbo.satelite.id_planeta ORDER BY planeta, satelite 6.3.3. Drop view DROP VIEW view_name Ejemplo: Dropp View PlanetasySatellites 6.4. ndices Los ndices son objetos que van ligados a las tablas o vistas y sirven para agilizar las bsquedas en las tablas. Cuando se realiza una bsqueda en una tabla por una columna no ordenada, esta se ha de hacer recorriendo todas las filas de la tabla hasta el final Si estuvieran ordenadas, la bsqueda sera ms rpida ya que se podran aplicar algoristmos de bsqueda. Con los ndices, se crea una estructura asociada a la taabla original donde se guardan nicamente las columnas indizadas de forma ordenada. La presencia de ndices mejora mucho el rendimiento en bsquedas, pero penaliza el resto de operaciones (borrado, insercin y modificacin). En tablas con pocos datos, no es conveniente indexar porque no se gana mucha eficiencia. Directrices generales para disear ndices: http://msdn.microsoft.com/es-es/library/ms191195.aspx 6.4.1. Create index CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name ON <object> ( column [ ASC | DESC ] [ ,...n ] ) [ INCLUDE ( column_name [ ,...n ] ) ] [;] <object> ::= { [ database_name. [ schema_name ] . | schema_name. ] table_or_view_name }
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name ON <object> ( column_name [ ASC | DESC ] [ ,...n ] ) <object> ::= { [ database_name. [ owner_name ] . | owner_name. ] table_or_view_name } Argumentos UNIQUE
47
Crea un ndice nico en una tabla o vista. Un ndice nico es aquel en el que no se permite que dos filas tengan el mismo valor de clave del ndice. El ndice clster de una vista debe ser nico. Las columnas que se utilizan en un ndice nico se deben establecer en NOT NULL, dado que varios valores NULL se consideran duplicados cuando se crea un ndice nico. CLUSTERED Crea un ndice en el que el orden lgico de los valores de clave determina el orden fsico de las filas correspondientes de la tabla. El nivel inferior, u hoja, de un ndice clster contiene las filas de datos reales de la tabla. Una tabla o vista permite un ndice clster al mismo tiempo. Si no se especifica CLUSTERED, se crea un ndice no clster. NONCLUSTERED Crea un ndice que especifica la ordenacin lgica de una tabla. Con un ndice no clster, el orden fsico de las filas de datos es independiente del orden indizado. El valor predeterminado es NONCLUSTERED. index_name Es el nombre del ndice. Los nombres de ndice deben ser nicos en una tabla o vista, pero no es necesario que sean nicos en una base de datos. column Es la columna o columnas en las que se basa el ndice. Especifique dos o ms nombres de columna para crear un ndice compuesto sobre los valores combinados de las columnas especificadas. Enumere las columnas que desee incluir en el ndice compuesto (en orden de prioridad) entre parntesis despus de table_or_view_name. [ ASC | DESC ] Determina la direccin ascendente o descendente del orden de la columna de ndice determinada. El valor predeterminado es ASC. INCLUDE ( column [ ,... n ] ) Especifica las columnas sin clave que se agregarn en el nivel hoja del ndice no clster. El ndice no clster puede ser nico o no nico. Ejemplo: Crear un ndice no agrupado con el ttulo de la tabla cancin. CREATE NONCLUSTERED INDEX ix_titulo ON dbo.cancion (titulo ASC) 6.4.2. Alter index Modifica un ndice existente de una tabla o una vista (relacional o XML) mediante su deshabilitacin, regeneracin o reorganizacin, o mediante el establecimiento de sus opciones. Sintaxis ALTER INDEX { index_name | ALL } ON table_or_view_name { REBUILD | DISABLE | REORGANIZE | SET ( <set_index_option> [ ,...n ] ) } [;] Argumentos index_name Es el nombre del ndice. Los nombres de ndice deben ser nicos en una tabla o vista, pero no es necesario que sean nicos en una base de datos. ALL
48
Especifica todos los ndices asociados a la tabla o vista independientemente del tipo de ndice. table_or_view_name Es el nombre de la tabla o vista asociada al ndice. REBUILD Especifica que el ndice se volver a generar con unas columnas, un tipo de ndice, un atributo de unicidad y un criterio de ordenacin idnticos. El proceso de volver a generar un ndice quita y vuelve a crear el ndice. Quita la fragmentacin, utiliza espacio en disco al compactar las pginas segn el valor de factor de relleno especificado o existente y vuelve a ordenar las filas del ndice en pginas contiguas. Cuando se especifica ALL, todos los ndices de la tabla se quitan y se vuelven a generar en una nica transaccin. DISABLE Marca el ndice como deshabilitado y no disponible para Database Engine (Motor de base de datos). Cualquier ndice puede estar deshabilitado. La deshabilitacin de un ndice evita que los usuarios obtengan acceso al ndice y, en los ndices clster, a los datos de la tabla subyacente. REORGANIZE Especifica que el nivel hoja del ndice se va a reorganizar. No es posible especificar REORGANIZE para un ndice deshabilitado o con ALLOW_PAGE_LOCKS establecido en OFF. La reorganizacin de un ndice utiliza muy pocos recursos del sistema. Desfragmenta el nivel hoja de los ndices clster y no clster de las tablas y las vistas al volver a ordenar fsicamente las pginas de nivel hoja para que coincidan con el orden lgico de los nodos hoja, de izquierda a derecha. La reorganizacin tambin compacta las pginas de ndice. 6.4.3. Drop index DROP INDEX ix_titulo ON cancion
49