You are on page 1of 22

Curso SQL Server 2000 Captulo 7

CURSO SQL SERVER 2000


Dictado por Horacio Peafiel

Mdulo 7: Introduccin a la programacin con T-SQL

FAGDUT

CCI

Curso SQL Server 2000 Captulo 7

MDULO 7 INTRODUCCIN A LA PROGRAMACIN CON TRANSACT-SQL La tarea de programacin con Transact-SQL es una de las tareas ms comunes que debe enfrentar un programador bajo SQL Server 2000. Luego de completar este mdulo, estaremos en condiciones de: Diferenciar cules con las principales construcciones de lenguaje Transact-SQL. Comprender cules con las instrucciones DCL de SQL Server 2000. Conocer las instrucciones DDL de SQL Server 2000. Comprender cmo funcionan las instrucciones DML de SQL Server 2000.

7.1 - REFERENCIAS A OBJETOS TRANSACT-SQL Podemos referirnos a objetos de SQL Server de varias formas. Podemos especificar el nombre completo del objetos (su nombre completo calificado fully qualified name), o especificar slo parte del nombre del objetos y dejar que SQL Server determine el resto del nombre en el contexto en que estemos trabajando. Nombres completos calificados El nombre completo calificado de un objeto SQL Server incluye cuatro identificadores: nombre de servidor, nombre de base de datos, propietario, y el nombre del objeto en el siguiente formato: Servidor.base de datos.propietario.objeto Un nombre que especificar las cuatro partes es conocido como un nombre completo calificado. Cada objeto creado en SQL Server debe tener un nombre completo calificado nico. Por ejemplo, dos tablas pueden ser nombradas como Ordenes en la misma base de datos, siempre y cuando pertenezcan a diferentes propietarios. A su vez, los nombres de columna deben ser nicos dentro de la tabla o vista. Nombres parciales Cuando referenciamos un objeto, no siempre deberemos especificar un servidor, la base de datos y el propietario. Podemos omitir los identificadores iniciales. Tambin podemos omitir identificadores intermedios siempre y cuanto su posicin sea indicada con puntos. Los formatos de nombres vlidos seran los siguientes: Servidor.base de datos.propietario.objeto Servidor.base de datos..objeto Servidor..propietario.objeto Servidor..objeto Base de datos.propietario.objeto Propietario.objeto Objeto Cuando creamos un objeto, SQL Server usa los siguientes valores por defecto para las distintas partes del nombre no especificadas: El servidor por defecto es el servidor local. La base de datos por defecto es la base de datos actual. Los propietarios por defecto son los nombres de usuario asociados con el Inicio de Sesin de la conexin actual.

Un usuario que es miembro de una funcin puede explcitamente especificar una funcin como propietario. Un usuario que es miembro de las funciones db_owner o db_ddladmin puede especificar dbo como cuenta de usuario que es propietario de un objeto.

FAGDUT

CCI

Curso SQL Server 2000 Captulo 7

Esta prctica es recomendada ya que simplifica la administracin cuando todos los objetos son posedos por la misma cuenta de usuario. El siguiente ejemplo crea la tabla Historial_de_ordenes en la base de datos Northwind: CREATE TABLE Northwind.dbo.Historial_de_ordenes ( NroOrden INT , IDProducto int , PrecioUnitario money , Cantidad int , Descuento decimal ) La mayora de las referencias usan nombres de tres partes y toman por defecto el servidor actual. Los nombres de cuatro partes son generalmente usados para consultas distribudas o llamadas a procedimientos almacenados remotos.

7.2 ELEMENTOS DE TRANSACT-SQL Variables Locales Las variables con elementos del lenguaje que pueden almacenar un valor. Se define una variable con un nombre y un tipo (en el Mdulo 3 vimos los distintos tipos de datos que posee SQL Server, y son los mismos que pueden tomar las variables). Una variable local es definida en una sentencia DECLARE, se le asigna un valor inicial en un comando SET, y es usada dentro de la sentencia, lote o procedimiento almacenado donde es declarada. Un nombre de variable local siempre comienza con el smbolo @ precediendo a su nombre. Sintaxis DECLARE {@nombre_variable tipo_de_dato} [,...n] SET @nombre_variable = expresin Ejemplos El siguiente cdigo creala variable local @lvnombre, le asigna un valor, y luego consulta la base de datos para seleccionar el registro que contiene el valor de la variable. DECLARE @lvnombre char(20) SET @lvnombre = 'Dodsworth' SELECT LastName, FirstName, Title FROM Northwind..Employees WHERE LastName = @lvnombre En el siguiente ejemplo guardamos el ID de empleado ms alto en la variable @EmpIDVariable: DECLARE @EmpIDVariable int SELECT @EmpIDVariable = MAX(EmployeeID) FROM Northwind..Employees Si el SELECT retorna mltiples filas, entonces la variable es establecida al valor de la ltima fila retornada por el SELECT. El siguiente ejemplo guarda el ID de producto del ltimo producto retornado por el SELECT sobre la tabla Products en una variable llamada @ProdIDVariable:

FAGDUT

CCI

Curso SQL Server 2000 Captulo 7

DECLARE @ProdIDVariable int SELECT @ProdIDVariable = ProductID FROM Northwind..Products Nota: Versiones previas a la 7.0 de SQL Server tenamos objetos llamados Variables Globales. Estos valores globales retornaban informacin del sistema. No eran usados como variables porque no podamos modificar sus valores. Los nombres de esas variables comenzaban con @@. A partir de SQL Server 7.0, estos valores todava se encuentran disponibles pero se denominan Funciones. Especficamente, estas funciones son parte del grupo de funciones llamadas Funciones Escalares. Operadores Los operadores son smbolos que realizan operaciones en uno o ms valores llamados operandos. Las operaciones que pueden ser realizadas incluyen clculos matemticos, concatenacin de strings, operaciones lgicas, y comparaciones entre columnas, constantes y variables. Pueden ser combinados en expresiones y condiciones de bsqueda. Cuando combinamos operadores, el orden en el cual son procesados est basado en una precedencia predefinida. Tipos de operadores SQL Server 2000 soporta seis tipos de operadores ms comunmente utilizados: Operador de Asignacin: Transact-SQL soporta el simple operador de asignacin, el signo igual (=). Operadores Aritmticos: Los operadores aritmticos realizan cmputos con columnas numricas o constantes. Transact-SQL soporta la multiplicacin (*), divisin (/), adicin (+), y resta (-). El operador mdulo (%), que retorna un resto enterno proveniente de una divisin entera, tambin es soportado. Operadores Unarios: Los operadores unarios realizan una operacin en una sla expresin numrica. Son el + (positivo), - (negativo), y ~ (NOT). Un operador unario es ubicado comunmente ante de la expresin sobre la que opera. Operadores de Comparacin: Estos operadores comparan dos expresiones. Se pueden comparar variables, columnas, y expresiones del mismo tipo. Los operadores de comparacin incluyen el menor que (<), mayor que (>), igual a (=), y distinto de (<>). Operadores de Concatenacin de Strings: El operador (+) concatena valores de cadenas de caracteres. Toda otra manipulacin de strings es realizada a travs de funciones especficas. Por defecto, un string vaco () es interpretado como un string vaco en sentencias INSERT sobre datos varchar. Cuando concatenamos datos varchar, char, nvarchar, nchar, text o ntext, la cadena vaca es interpretada como tal. Por ejemplo, abc + + def es convertida a abcdef. La cadena vaca nunca es evaluada como un valor nulo. Operadores Lgicos: Los operadores lgicos son AND, OR, y NOT. AND y OR son usados para conectar condiciones de bsqueda en clusulas WHERE. NOT revierte el resultado de una condicin de bsqueda.

Niveles de precedencia de los operadores Si usamos mltiples operadores (lgicos o aritmticos) para combinar expresones, SQL Server procesa estos operadores en orden de precedencia, lo que puede afectar el valor resultante. Los operadores tienen el siguiente orden de precedencia (desde mayor precedencia a menor precedencia). + (Positivo), - (Negativo), ~ (NOT) * (Multiplicacin), / (Divisin), % (Modulo) + (Sumar), (+ Concatenar), - (Restar) =, >, <, >=, <=, <>, !=, !>, !< (Operadores de comparacin) ^ (OR Exclusivo), & (AND), | (OR) NOT
4 CCI

FAGDUT

Curso SQL Server 2000 Captulo 7

AND ALL, ANY, BETWEEN, IN, LIKE, OR, SOME = (Asignacin)

Deberemos usar parntesis para cambiar la precedencia predefinida de los operadores en una expresin. SQL Server procesa la expresin que est ms anidada primero. Cuando dos operadores en una expresin tienen el mismo nivel de precedencia, son procesados en orden de izquierda a derecha. Funciones Transact-SQL proporciona una gran cantidad de funciones que retornan informacin. Las funciones retornan valores que pueden ser utilizados en expresiones. Algunas funciones toman parmetros de entreda mientras que las otras retornan valores sin ninguna entrada. Las funciones pueden ser agrupadas en tres tipos: Funciones de Rowset, que retornan un objeto que puede ser utilizado en lugar de una tabla en sentencias Transact-SQL. Funciones agregadas, que retornan un solo elemento sumarizador desde un conjunto de valores. Funciones escalares. Las funciones escalares toman ninguno, uno o ms argumentos de entrada. La siguiente tabla lista las distintas categoras de las funciones escalares.

Categora Configuracin Cursor Fecha y Hora Matemtica Meta datos Seguridad Strings Sistema Estadsticas Texto e Imgenes Sintaxis

Funcin Retornan informacin de la configuracin actual. Retornan informacin acerca de cursores. Realizan operaciones de Fecha y Hora. Realizan clculos matemticos sobre los valores de entrada y devuelven valores de salida. Retornan informacin acerca de las bases de datos o objetos de las bases de datos. Retornan informacin de usuarios, funciones de usuario, y permisos. Realizan operaciones sobre Strings y devuelven Strings como argumentos de salida. Realizan operaciones, como ser conversin de tipos, y retornan informacin acerca de valores, objetos, o seteos de SQL Server. Retornan informacin estadstica del servidor. Realizan operaciones sobre campos de texto e imgenes, y retornan informacin acerca de sus argumentos.

La sintaxis de la mayora de las funciones es similar a la siguiente: Nombre_de_Funcin( argumentos ) , o sino: @@Nombre_de_Funcin

EJEMPLOS DE FUNCIONES Ejemplo 1 El siguiente ejemplo muestra el uso de la funcin @@VERSION para obtener informacin de la versin del software SQL Server 2000:

FAGDUT

CCI

Curso SQL Server 2000 Captulo 7

SELECT @@VERSION Microsoft SQL Server 2000 - 8.00.194 (Intel X86) Aug 6 2000 00:57:48 Copyright (c) 1988-2000 Microsoft Corporation Developer Edition on Windows NT 5.1 (Build 2600: ) Ejemplo 2 El siguiente fragmento de cdigo usa la funcin @@TRANCOUNT para determinar si alguna transaccin queda abierta antes de ejecutar una consulta o procedimiento almacenado. La funcin @@TRANCOUNT retorna un nmero que representa el nmero de transacciones que tenemos abiertas en ese momento. IF (@@TRANCOUNT > 0) BEGIN RAISERROR ( 'La tarea no puede ser ejecutada sin una transaccin.', 10, 1) RETURN END Ejemplo 3 El siguiente script actualiza el apellido del empleado. Cuando cambiamos el apellido, podemos desear confirmar si hay filas donde realizar el update. Si no se encuentran filas a modificar, es preferible ser notificado que el cambio no tuvo xito y tomar las medidas necesarias. La funcion @@ROWCOUNT returna un valor que representa el nmero de filas afectadas por la ltima consulta. USE Northwind UPDATE Empleados SET Apellido = 'Rodriguez' WHERE Apellido = Perez IF (@@ROWCOUNT = 0) BEGIN PRINT Advertencia: no se actualizaron filas RETURN END El resultado de este script es el siguiente: Advertencia: no se actualizaron filas Las funciones son comunmente utilizadas para convertir datos de fechas desde el formato de un pas al de otro. Para cambiar formatos de fecha, usaremos la funcin CONVERT con la opcin de estilo para determinar el formato de fecha que ser retornado. Ejemplo 4 Este ejemplo demuestra cmo podemos usar la funcin CONVERT para convertir un valor DateTime retornado por la funcin GETDATE a un string varchar usando diferentes estilos. La funcin GETDATE retorna la fecha y hora del servidor. SELECT 'ANSI:', CONVERT(varchar(30), GETDATE(), 102) AS Style UNION SELECT 'Japons:', CONVERT(varchar(30), GETDATE(), 111) UNION SELECT 'Europeo:', CONVERT(varchar(30), GETDATE(), 113)

FAGDUT

CCI

Curso SQL Server 2000 Captulo 7

El resultado es el siguiente: Style -----------------------------25 Feb 2006 19:29:44:893 25/02/2006 25.02.2006

--------Europeo: Japons: ANSI:

(3 filas(s) afectadas) Ejemplo 5 El siguiente ejemplo retorna el nombre de usuario logueado y el nombre de la aplicacin que est utilizando para la conexin actual: SELECT SUSER_SNAME(), APP_NAME() El resultado sera: ----------------------- -----------------------------WXPPROF\Administrador Analizador de Consultas de SQL (1 fila(s) afectadas)

ELEMENTOS DE CONTROL DE FLUJO DE TRANSACT-SQL Transact-SQL contiene varios elementos de lenguaje que controlan el flujo de ejecucin de sentencias en scripts, lotes, y procedimientos almacenados. Bloques BEGINEND Un bloque BEGINEND enciera una serie de sentencias Transact-SQL que se tomarn como una unidad dentro del bloque. Sintaxis: BEGIN {Sentencia SQL | Bloque} END Bloques IFELSE Un bloque IF contiene una condicin. Si la condicin se evala como verdadera, entonces la sentencia o bloque siguiente a la palabra clave IF es ejecutado; de otra manera, la sentencia o bloque que sigue a la palabra clave ELSE es ejecutado. La palabra clave ELSE es opcional. Sintaxis: IF Expresin_Booleana {Sentencia_SQL | Bloque} [ELSE {Sentencia_SQL | Bloque} Ejemplo: Este ejemplo determina si un cliente tiene rdenes antes de eliminar el mismo de la lista de clientes:
FAGDUT 7 CCI

Curso SQL Server 2000 Captulo 7

USE Northwind GO IF EXISTS (SELECT OrderID FROM Orders WHERE CustomerID = 'frank') PRINT '*** No se puede eliminar el cliente ***' ELSE BEGIN DELETE Customers WHERE CustomerID = 'frank' PRINT '*** Customer eliminado ***' END Construcciones WHILE Las construcciones WHILE ejecutan una sentencia o bloque de sentencias SQL repetidamente siempre y cuando la condicin que albergan sea verdadera. Las sentencias BREAK y CONTINUE dentro de un bloque controlan la operacin de las sentencias dentro del bucle WHILE. Una sentencia BREAK transfiere la ejecucin a la primera sentencia siguiente del final del bucle (sentencia END). Una sentencia CONTINUE transfiere la ejecucin de vuelta al inicio del bucle, saltndose las sentencias que siguen al CONTINUE. Sintaxis: WHILE Expresin_Booleana {Sentencia_SQL | Bloque} [BREAK | CONTINUE | Sentencia_SQL | Bloque ] [n] END Ejemplo: Este ejemplo crea una tabla temporaria y luego declara una variable local, la cual es utilizada como un contador para insertar filas con valores incrementados en un bucle WHILE. La sentencia BREAK termina el bucle antes de que el contador llegue a su valor mximo. CREATE TABLE #Test (Counter int, DateCreated datetime) GO DECLARE @counter int SET @counter = 1 WHILE @counter <= 10 BEGIN INSERT #Test VALUES (@counter, GETDATE()) IF (SELECT COUNT(*) FROM #Test) > 8 BEGIN PRINT 'Se lleg al mximo de filas' BREAK END SET @counter = @counter + 1 END Sentencia RETURN La sentencia RETURN sale incondicioalmente de una consulta o procedimiento. La ejecucin de RETURN es inmediata, y puede ser utilizada en cualquier punto para salir del procedimiento, lote, o bloque. Las sentencias siguientes a RETURN no son ejecutadas.

FAGDUT

CCI

Curso SQL Server 2000 Captulo 7

Sintaxis: RETURN [Expresin_entera] , donde Expresin_entera es un valor opcional de retorno. Los procedimientos almacenados de sistema retornan un valor de 0, a menos que se especifique lo contrario. Un valor no cero es usualmente utilizado para indicar algn error. Ejemplo: En este ejemplo, usamos RETURN para salir si no se encontraron productos con su PrecioUnitario mayor que 30: USE Northwind GO SELECT NombreProd, PrecioUnitario FROM Productos WHERE PrecioUnitario > 30 IF @@ROWCOUNT = 0 RETURN . . . cdigo para procesar la filas seleccionadas. Comentarios Los comentarios son cadenas de caracteres de texto que no se ejecutan y estn ubicados en el medio de las sentencias SQL para describir la accin que la senencia realiza. Los comentarios pueden ser utilizados en dos formas distintas en linea con una sentencia SQL o como un bloque de comentarios. Comenarios en linea Podemos crear comentarios en linea usando dos guiones (--) para establecer un comentario aparte de una sentencia SQL. Transact-SQL ignora el texto a la derecha de los caracteres de comentario. Un comentario en linea puede ser utilizado de la misma forma que una sentencia, a continuacin de una sentencia o al inicio de la lnea a comentar. Si deseamos ms de un comenario en un bloque, deberemos repetir los guiones (--) en cada lnea. Ejemplo 1 El siguiente ejemplo muestra el uso de comentarios en una linea para explicar que se realiza un clculo: SELECT ProductName , (UnitsInStock - UnitsOnOrder) Calcula Inventario , SupplierID FROM Northwind..Products Ejemplo 2 Este ejemplo usa el segundo comentario para evitar la ejecucin de una seccin del lote: SELECT ProductName , (UnitsInStock - UnitsOnOrder) Calcula Inventario -, SupplierID FROM Northwind..Products

FAGDUT

CCI

Curso SQL Server 2000 Captulo 7

Comentarios en bloque Creamos comentarios en bloque ubicando el par de comentario (/*) al inicio del texto de comentario, y luego concluyendo el comentario con el par de comentario (*/) para cerrar el comentario. Utilizaremos en este caso comentarios de mltiples lneas. Ejemplo 3 Este ejemplo muestra un caso de comentarios multilneas o en bloque: /* ** Este cdigo recupera todas las filas de la tabla Product ** y muestra el precio unitario, el precio unitario aumentado ** en 10%, el nombre del producto. */ SELECT UnitPrice, (UnitPrice * 1.1), ProductName FROM Northwind..Products

7.3 - DCL - LENGUAJE DE CONTROL DE DATOS Las sentencias DCL son utilizadas para cambiar los permisos asociados a una base de datos o funcin de usuario. La siguiente tabla describe los elementos DCL:

Sentencia GRANT DENY

Descripcin Crea una entrada en el sistema de seguridad que permite a un usuario el trabajar con datos o ejecutar ciertos comandos Trasact-SQL. Crea una entrada en el sistema de seguridad negando un permiso de una cuenta de seguridad y previene que el usuario, grupo, o funcin herede el permiso a travs de su pertenencia en grupos y funciones.

Nota: Por defecto, slo miembros de las funciones sysadmin, dbcreator, db_owner, o db_securityadmin pueden ejecutar sentencias DCL. Ejemplo Este ejemplo garantiza el permiso de consulta sobre la tabla Productos a la funcin public: USE Northwind GRANT SELECT ON Products TO public

FAGDUT

10

CCI

Curso SQL Server 2000 Captulo 7

7.4 DML LENGUAJE DE MANIPULACIN DE DATOS Las sentencias DML son las encargadas de manipular los datos. Bsicamente tenemos cuatro sentencia Transact-SQL bsicas de DML: SELECT, INSERT, UPDATE y DELETE:

SELECT Una sentencia SELECT en Transact-SQL nos permite recuperar datos existentes en una base de datos SQL Server. La mayora de las sentencias SELECT describen las siguientes propiedades del conjunto de resultados: Las columnas a ser includas en el conjunto de resultados. Las tablas desde donde el conjunto de resultados es obtenido. Las condiciones que las filas deben cumplir para ser includas en el conjunto de resultados. La secuencia de ordenamiento de las filas en el conjunto de resultados.

Por ejemplo, la siguiente sentencia SELECT obtiene el ID de producto, nombre, y precio unitario de todos los productos en la tabla Productos, cuyo precio unitario exceda los $40: SELECT ProductID, ProductName, UnitPrice FROM Products WHERE UnitPrice > 40 ORDER BY UnitPrice ASC La sentencia SELECT en el ejemplo previo, define cules valores de columna deben ser recuperados, y en la clusula FORM identifica la tabla que contiene estas columnas. La clusula WHERE limita el conjunto de resultados a los productos cuyo precio unitario (UnitPrice) sea mayor que $40. La clusula ORDER BY especifica que el conjunto de resultados deber ser ordenado en forma ascendente, basndose en los valores del campo UnitPrice. La sentencia SELECT de Transact-SQL bsicamente tiene la siguiente sintaxis: SELECT lista_select [INTO nuevo_nombre_de_tabla] FROM lista_de_tablas [WHERE condiciones_de_bsqueda] [GROUP BY lista_agrupamientos] [HAVING condiciones_de_bsqueda] [ORDER BY lista_ordenamiento [ASC | DESC] ] La clusula SELECT La clusula SELECT incluye la palabra clave SELECT en la lista de seleccin. La lista de seleccin es una serie de expresiones separadas por comas. Cada expresin define una columna en el conjunto de resultados. Las columnas en el conjunto de resultados aparecern en el mismo orden que la secuencia de expresiones en la lista de seleccin. La lisa de seleccin puede contener las siguientes palabras clave: DISTINCT TOP n AS

FAGDUT

11

CCI

Curso SQL Server 2000 Captulo 7

Distinct La palabra clave DISTINCT elimina filas duplicadas del conjunto de resultados. Por ejemplo, la tabla Orders de la base de datos Northwind contiene valores duplicados en la columna ShipCity. Para obtener una lista de los valores de ShipCity sin los valores duplicados, ingresaremos el siguiente cdigo: SELECT DISTINCT ShipCity, ShipRegion FROM Orders ORDER BY ShipCity TOP n La palabra clave TOP n especifica que las primeras n filas de un conjunto de resultados sean retornados. Si se especifica ORDER BY, las filas son seleccionadas luego de que el conjunto de resultados es ordenado. n especifica el nmero de filas a retornar (a menos que usemos la palabra clave PERCENT). PERCENT especifica que el n por ciento de las filas en el conjunto de resultados sea retornado. Por ejemplo, el siguiente ejemplo retorna las primeras 10 ciudades en orden alfabtico de la tabla Orders: SELECT DISTINCT TOP 10 ShipCity, ShipRegion FROM Orders ORDER BY ShipCity La palabra clave AS Podemos mejora la legibilidad de nuestras sentencias SELECT usando la palabra clave AS. Utilizando AS asignamos alias a nuestras tablas en la seccin FROM. El siguiente ejemplo muestra el uso de AS: USE pubs SELECT p.pub_id, p.pub_name FROM publishers AS p Nota: Si se especifica un alias para una tabla en una sentencia SELECT, todas las referencias a dicha tabla en la sentencia Transact-SQL deben referenciar este alias en particular. La clusula INTO La clusula INTO nos permite especificar que el conjunto de resultados ser usado para crear una nueva tabla con el nombre definido en la clusula. Una sentencia SELECT..INTO puede ser usado para combinar datos de varias tablas o vistas en uns sla tabla. Tambin podemos usarla para crear una nueva tabla que contenga datos seleccionados de un servidor vinculado. El siguiente ejemplo usa una sentencia SELECT para obtener datos de las columnas FirstName y LastName de la tabla Employees: SELECT FirstName, LastName INTO EmployeeNames FROM Employees El conjunto de resultados que es generado por la sentencia crea una tabla llamada EmployeeNames. La nueva tabla contendr la columnas FirstName y LastName, y estas columnas contendrn los valores de la tabla Employees. El conjunto de resultados no es mostrado en el panel de resultados a menos que especficamente consultemos la nueva tabla.

FAGDUT

12

CCI

Curso SQL Server 2000 Captulo 7

La clusula FROM La clusula FORM es requerida en cada sentencia SELECT en donde los datos son obtenidos de tablas o vistas. Podemos utilizar la clusula FORM para listar las tablas y vistas conteniendo las columnas referenciadas en la lista de seleccin y en la clusula WHERE. Podemos dar a la tabla o vista alias de nombres usando la clusula AS. Tambien podemos usar la clusula FORM para realizar joins de tablas especificando las condiciones de Join en la clusula ON. La clusula FORM tiene la forma de una lista separada por coma, conteniendo nombres de tablas, vistas, y clusulas JOIN. El siguiente SELECT usa la clusula FORM para especificar la tabla Shippers: SELECT * FROM Shippers Tambin podemos usar la clusula FORM para especificar joins entre dos tablas o vistas. Ms adelante veremos este caso. Las clusulas WHERE, GROUP BY y HAVING Las clusulas WHERE y HAVING en una sentencia SELECT controlan las filas que son utilizadas para construir el conjunto de resultados. Las clusulas WHERE y HAVING son filtros. Especifican una serie de condiciones de bsqueda, y slo aquellas filas que cumplen con los trminos de las condiciones de bsqueda son utilizados para construir el conjunto de resultados. Estas filas que cumplen las condiciones de bsqueda se dicen que son calificadas para participar en el conjunto de resultados. Por ejemplo, en el siguiente SELECT, la clusula WHERE retorna slo filas cuya regin sea el estado de Washington: SELECT CustomerID, CompanyName FROM Northwind.dbo.Customers WHERE Region = 'WA' La clusula HAVING es tpicamente utilizada en conjunto con la clusula GROUP BY, aunque puede ser especificada sin un GROUP BY. La clusula HAVING especifica ms filtros que son aplicados luego que una clusula WHERE ha realizado su accin de filtrado. La siguiente sentencia SELECT incluye una clusula WHERE, una clusula GROUP BY y una HAVING: SELECT OrdD1.OrderID AS OrderID, SUM(OrdD1.Quantity) AS "Units Sold", SUM(OrdD1.UnitPrice * OrdD1.Quantity) AS Revenue FROM [Order Details] AS OrdD1 WHERE OrdD1.OrderID in (SELECT DISTINCT OrdD2.OrderID FROM [ Order Details] AS OrdD2 WHERE OrdD2.UnitPrice > $100) GROUP BY OrdD1.OrderID HAVING SUM(OrdD1.Quantity) > 100 En esta sentencia SELECT, la clusula WHERE retorna slo las rdenes que se hayan hecho sobre un producto cuyo precio unitario excede $100, y la clusula HAVING restringe an ms el resultado mostrando slo aquellas rdenes que incluyen ms de 100 unidades. La clusula GROUP BY limita las filas para cada valor diferente de la columna OrderID. La clusula ORDER BY La clusula ORDER BY ordena el conjunto de resultado por una o ms columnas (con un mximo de 8060 bytes). Un ordenamiento puede ser ascendente (ASC) o descendente (DESC). Si no se especifica el tipo de ordenamiento, se asume ASC. Si ms de una columna es nombrada en la clusula ORDER BY, los ordenamientos son anidados.
FAGDUT 13 CCI

Curso SQL Server 2000 Captulo 7

El siguiente SELECT ordena las filas de la tabla Title, primero por editorial (publisher), en orden desdendente, luego por tipo, en orden ascendente para cada editorial, y finalmente por precio (tambin ascendente), ya que DESC no es especificado. USE Pubs GO SELECT Pub_id, Type, Title_id, Price FROM Titles ORDER BY Pub_id DESC, Type, Price JOINS Usando Joins, podemos obtener datos de dos o ms tablas basndonos en relaciones lgicas entre las tablas. Los Joins indican cmo SQL Server debera usar datos de una tabla para seleccionar filas en otra. Los Joins pueden ser especificados ya sea en la clusula FROM como en la WHERE. Las condiciones de join se combinan con las condiciones WHERE y HAVING para controlar qu filas sern seleccionadas de las tablas referenciadas por el FROM. Especificando las condiciones de join en la clusula FROM, sin embargo, las separa de otras condiciones de bsqueda que podran ser especificadas en el WHERE, y es el mtodo ms recomendado para especificar joins. Cuando mltiples tablas son referenciadas en una sla consulta, todas las referencias de columnas deben ser no ambiguas. El nombre de tabla debe ser usado para calificar cualquier nombre de columna que est duplicada en dos o ms tablas referenciadas por la misma consulta. La lista seleccionada por un join puede referenciar todas las columnas en las tablas unidas o cualquier subconjunto de las columnas. La lista seleccionada no requiere contener columnas para cada tabla en el join. Por ejemplo, en un join de tres tablas, slo una tabla puede ser utilizada como puente desde una a otra tabla, y ninguna de las columnas de la tabla del medio debe ser especificada en la lista de seleccin. Aunque las condiciones de join normalmente usan signos de igual como operador de comparacin, otros operadores pueden ser especificados. Las columnas usadas en la condicin de join no necesitan tener el mismo nombre o ser del mismo tipo de datos. Si los tipos de datos no son idnticos, sin embargo, deben entonces ser compatibles o ser de tipos que SQL Server pueda convertir implcitamente. Si los tipos de datos no pueden ser implcitamente convertidos, la condicin de join debe explcitamente convertir los tipos de datos usando la funcin CAST. Inner Joins Un inner join es un join en el cual los valores de las columnas que son unidas son comparados a travs de un operador de comparacin. En el estndar SQL-92, los inner joins pueden ser especificados tanto en el FROM como en el WHERE. Los inner joins son el nico tipo joins que la especificacin SQL-92 soporta tanto en el FROM como en el WHERE. Los joins especificados en el WHERE se llaman old-style joins (joins estilo antiguo). El siguiente SELECT usa un inner join para obtener datos de la tabla Publishers y la tabla Titles en la base de datos Pubs:

FAGDUT

14

CCI

Curso SQL Server 2000 Captulo 7

SELECT t.Title, p.Pub_name FROM Publishers AS p INNER JOIN Titles AS t ON p.Pub_id = t.Pub_id ORDER BY Title ASC La sentencia SELECT obtiene los datos de la columna Title de la tabla Titles (t) y de la columna Pub_name de la tabla Publishers (p). Ya que el SELECT usa un inner join, retornar slo aquellas filas para las cuales haya un valor igual de las columnas unidas (p.pub_id y t.pub_id). Outer Joins SQL Server soporta tres tipos de outer joins: left, right y full. Todas las filas obtenidas de la tabla de la izquierda son referenciadas con un left outer join, y todas las filas de la tabla de la derecha son referenciadas en un right outer join. En un full outer join, todas las filas de ambas tablas son retornadas. SQL Server supports three types of outer joins: left, right, and full. All rows retrieved from the left table are referenced with a left outer join, and all rows from the right table are referenced in a right outer join. All rows from both tables are returned in a full outer join. Left Outer Joins Un conjunto de resultados generado por una sentencia SELECT que incluya un left outer join incluye todas las filas de la tabla referenciada del lado izquierdo. Las nicas filas obtenidas del lado derecho son las que cumplen con la condicin de join. En el siguiente SELECT, un left outer join es utilizado para obtener el nombre y apellido del autor, y (cuando sea aplicable), los nombres de todos los editores (publishers) que se guardan en la misma ciudad de los autores: USE Pubs GO SELECT a.Au_fname, a.Au_lname, p.Pub_name FROM Authors a LEFT OUTER JOIN Publishers p ON a.City = p.City ORDER BY p.Pub_name ASC, a.Au_lname ASC, a.Au_fname ASC El conjunto de resultados de esta consulta lista el nombre de cada autor en la tabla Authors. El mismo incluir slo aquellos editores (publishers) que estn ubicados en las mismas ciudades que los autores. Si un editor no est ubicado en la misma ciudad que un autor, se retorna un valor nulo para la columna pub_name del conjunto de resultados. Right Outer Joins Un resultado generado por una sentencia SELECT que incluye un Right Outer Join, incluye todas las filas de la tabla referenciada a la derecha del RIGHT OUTER JOIN. Slo las filas que cumplen la condicin de join son devueltas del lado izquierdo. En el siguiente SELECT, un Right Outer Join es usado para recuperar una lista de editoriales (publishers) y los nombres y apellidos de los autores (Authors), si dichos autores se encuentran ubicados en las mismas ciudades que los editores:

FAGDUT

15

CCI

Curso SQL Server 2000 Captulo 7

USE Pubs GO SELECT a.Au_fname, a.Au_lname, p.Pub_name FROM Authors a RIGHT OUTER JOIN Publishers p ON a.City = p.City ORDER BY p.Pub_name ASC, a.Au_lname ASC, a.Au_fname ASC El conjunto de resultados de esta consulta listar el nombre de cada uno de los editores en la tabla Publishers. El mismo incluir slo los autores ubicados en la misma ciudad que los editores. Si un autor no se encuentra en una ciudad de editores, un valor null es retornado para las columnas au_fname y au_lname. Full Outer Joins Un conjunto de resultados generado por un SELECT que incluye un Full Outer Join incluye todas las filas de ambas tablas, a pesar de que las tablas no tengan un valor en comn definido en la condicin de join. En la siguiente sentencia SELECT, se usa un full outer join para obtener la lista de los editores y los nombres y apellidos de los autores. USE Pubs GO SELECT a.Au_fname, a.Au_lname, p.Pub_name FROM Authors a FULL OUTER JOIN Publishers p ON a.City = p.City ORDER BY p.Pub_name ASC, a.Au_lname ASC, a.Au_fname ASC

SUBCONSULTAS Una subconsulta es una sentencia SELECT que retorna un solo valor y que se encuentra anidada dentro de una instruccin SELECT, INSERT, UPDATE o DELETE, o dentro de otra subconsulta. Una subconsulta puede ser usada en cualquier lugar donde se espera una expresin. En el siguiente ejemplo, una subconsulta es anidada en la clusula WHERE de la sentencia SELECT principal: USE Northwind GO SELECT ProductName FROM Products WHERE UnitPrice = ( SELECT UnitPrice FROM Products WHERE ProductName = 'Sir Rodney''s Scones' ) La sentencia SELECT embebida primero identifica el precio unitario para Sir Rodneys Scones el cual es de $10. El valor de $10 es entonces usado en la consulta exterior para retornar el nombre de producto cuyo precio equivale a $10.Si una tabla aparece slo en la subconsulta y no en la consulta exterior, entonces las columnas de esta tabla no pueden aparecer en la lista del SELECT de la consulta exterior.

FAGDUT

16

CCI

Curso SQL Server 2000 Captulo 7

En algunas sentencias Transact-SQL, la subconsulta puede ser evaluada como si fuera una consulta independiente. Conceptualmente, la subconsulta puede ser substituda dentro de una consulta exterior (aunque no es necesariamente cmo SQL Server realmente procesa las sentencias Transact-SQL que tienen subconsultas). Tipos de Subconsultas Las subconsultas pueden ser especificadas en varios lugares dentro de la sentencia SELECT. Las sentencias que incluyen una subconsulta pueden tomar uno de estos formatos: WHERE <expresin> [NOT] IN (<subconsulta>) WHERE <expresin> <op_de_comparacin> [ANY | ALL] (<subconsulta>) WHERE [NOT] EXISTS (<subconsulta>)

Subconsultas que usan IN El resultado de una subconsulta introducida con IN (o con NOT IN) es una lista de cero o ms valores. Luego de que la subconsulta devuelva el resultado, la consulta exterior hace uso del mismo. En el siguiente ejemplo, una subconsulta es anidada dentro de la clusula WHERE, y la palabra clave IN es utilizada: USE Pubs GO SELECT Pub_name FROM Publishers WHERE Pub_id IN ( SELECT Pub_id FROM Titles WHERE Type = 'business' ) Podemos evaluar esta sentencia en dos pasos. Primero, la consulta interior retorna los nmeros de identificacin de los editores (publishers) que tienen publicado libros (1389 y 0736). Segundo, esos valores son substitudos en la consulta exterior, la cual encuentra los nombres que concuerdan con los nmeros de identificacin de la tabla Publishers. Las subconsultas generadas con las palabras clave NOT IN tambin retornan una lista de cero o ms valores. La consulta es exactamente igual que las de IN, excepto que NOT IN reemplaza a IN. Subconsultas que usan operadores de comparacin Los operadores de comparacin que introduce una subconsulta pueden ser modificados por las palabras clave ALL o ANY. Las subconsultas introducidas con un operador de comparacin modificado retornarn una lista de cero o ms valores y pueden incluir una clusula GROUP BY o HAVING. Estas subconsultas pueden ser reescritas usando EXISTS. Las palabras clave ALL y ANY comparan un valor escalar con un conjunto de valores de una columna. La palabra clave ALL se aplica a cualquier valor, y ANY aplica a al menos un valor.

FAGDUT

17

CCI

Curso SQL Server 2000 Captulo 7

En el siguiente ejemplo, el operador (>) es usado con la palabra clave ANY: USE Pubs GO SELECT Title FROM Titles WHERE Advance > ANY ( SELECT Advance FROM Publishers INNER JOIN Titles ON Titles.Pub_id = Publishers.Pub_id AND Pub_name = 'Algodata Infosystems' ) Esta sentencia encuentra todos los ttulos que recibieron un avance ms grande que el mnimo avance pagado por Algodata Infosystems (el cual es de $5000). La clusula WHERE en el SELECT exterior contiene una subconsulta que usa un join para recuperar los montos de los avances para Algodata Infosystems. Este monto mnimo es usado para determinar cules titulos recuperar de la tabla Titles. Subconsultas que usan EXISTS y NOT EXISTS Cuando aparece una subconsulta con la palabra clave EXISTS, esta funciona como un test de existencia. La clusula WHERE de la consulta exterior comprueba la existencia de filas retornadas por la subconsulta. La subconsulta no produce datos, realmente; en cambio, retorna un valor TRUE o FALSE. En el siguiente ejemplo, la clusula WHERE en la sentencia SELECT exterior contiene la subconsulta y usa la palabra clave EXISTS: USE Pubs GO SELECT Pub_name FROM Publishers WHERE EXISTS ( SELECT * FROM Titles WHERE Titles.Pub_id = Publishers.Pub_id AND Type = 'business' ) Para determinar el resultado de esta consulta, consideremos cada nombre de editor por turno. En este caso, el primer editor (publisher) es Algodata Infosystems, el cual tiene un nmero de identificacin de 1389. Hay filas en la tabla Titles en las que pub_id sea 1389 y el tipo sea business? Si es as, Algodata Infosystems debera ser uno de los valores seleccionados. El mismo proceso es repetido para cada uno de los otros editores (publishers). Las palabras claves NOT EXISTS funcionan en forma anloga a EXISTS, excepto que la clusula WHERE en la cual NOT EXISTS es utilizada es satisfecha si la subconsulta no devuelve ninguna fila.

FAGDUT

18

CCI

Curso SQL Server 2000 Captulo 7

INSERT La sentencia INSERT agrega una o ms filas a una tabla. En su forma simplificada, una sentencia INSERT tiene la siguiente forma: INSERT [INTO] tabla_o_vista [(lista_de_columnas)] datos Este comando causa que los valores de datos (datos) sean insertados como una o ms filas en la tabla o vista especificada. La lista de nombres de columna (lista_de_columnas), las cuales se encuentran separadas, pueden ser usadas para especificar las columnas a las que se insertarn datos. Si slo una lista parcial es especificada, un valor NULL o un valor del default correspondiente (si existe un DEFAULT) es insertada en cada columna no especificada en la lista. Todas las columnas no especificadas en la lista de columnas deben permitir nulos o tener un default asociado. A su vez, una sentencia INSERT no especifica valores para los siguientes tipos de columnas (SQL Server genera automticamente los mismos): Columnas con la propiedad IDENTITY. Columnas con una definicin de DEFAULT que usa la funcin NEWID(). Columnas computadas.

Nota: La palabra clave INTO de una sentencia INSERT es opcional y es utilizado slo para hacer el cdigo ms claro. Los valores de datos se especifican en la lista de columnas. Al definir un INSERT, podemos usar la clusula VALUES para especificar los valores de datos para una fila, o podemos usar una subconsulta SELECT para especificar los valores de datos para una o ms filas. Uso de INSERT para agregar datos La clusula VALUES nos permite especificar los valores de una fila en una tabla. Los valores son especificados como una lista de expresiones escalares separadas por comas. Si no se especifica una lista de columnas, los valores debern ser especificados en la misma secuencia de las columnas de la tabla o vista. Por ejemplo, supongamos que creamos la siguiente tabla en la base de datos Pubs: USE Pubs GO CREATE TABLE NewBooks ( BookID INT IDENTITY(1,1) NOT NULL, BookTitle VARCHAR(80) NOT NULL, BookType CHAR(12) NOT NULL CONSTRAINT [booktype_df] DEFAULT ('Undecided'), PubCity VARCHAR(50) NULL

Una vez creada la tabla, decidimos agregar datos a la misma. La siguiente sentencia INSERT usa una clusula VALUES para insertar una nueva fila en la tabla NewBooks. USE Pubs GO INSERT INTO NewBooks (BookTitle, PubCity) VALUES ('Life Without Fear', 'Chicago')

FAGDUT

19

CCI

Curso SQL Server 2000 Captulo 7

En esta sentencia, los valores son definidos para las columnas BookTitle y PubCity. No necesitaremos incluir la columna BookID en el INSERT, ya que dicha columna fue especificada como IDENTITY. Por lo tanto, los valores de esta columna son generados automticamente. A su vez, ya que no definimos un valor para la columna BookType, SQL Server automticamente inserta el valor por defecto en la columna cuando corremos el INSERT. Usar una subconsulta para agregar datos Podemos usar una subconsulta SELECT dentro de un INSERT para agregar valores a una tabla desde una o ms tablas o vistas. Una subconsulta nos permite agregar ms de una fila por vez. Nota: Una subconsulta SELECT es usada para agregar subconjuntos de datos existentes a una tabla, mientras que la clusula VALUES es utilizada en sentencias INSERT para agregar nuevos datos a una tabla. La siguiente sentencia INSERT usa una subconsulta SELECT para insertar filas en la tabla NewBooks: USE Pubs GO INSERT INTO NewBooks (BookTitle, BookType) SELECT Title, Type FROM Titles WHERE Type = 'mod_cook' Esta sentencia INSERT usa la salida del SELECT para proporcionar los datos que sern insertados en la tabla NewBook.

UPDATE El comando UPDATE puede cambiar valores de datos en filas, grupos de filas, o en todas las filas de una tabla o vista. Tambin podemos usar este comando para actualizar filas en un servidor remoto usando un servidor vinculado o las funciones OPENROWSET, OPENDATASOURCE y OPENQUERY. Un UPDATE que referencia una tabla o vista puede cambiar los datos en una sla tabla base por vez. Nota: Un UPDATE se considera exitoso slo si el nuevo valor es compatible con el tipo de datos de la columna seleccionada, y si tambin se adhiere a todas las restricciones que se aplican a esa columna. La sentencia UPDATE tiene tres clusulas principales: SET WHERE FROM

Usando SET para modificar datos La clusula SET especifica las columnas que sern cambiadas y los nuevos valores de las columnas. Los valores en las columnas especficas son actualizadas con los valores datos en la clusula SET en todas las filas que cumplan la condicin del WHERE. Si no se especifica un WHERE, todas las filas sern modificadas. Por ejemplo, el siguiente UPDATE incluye la clusula SET necesaria para incrementar los precios de los libros en la tabla NewBooks por un 10 por ciento.

FAGDUT

20

CCI

Curso SQL Server 2000 Captulo 7

USE Pubs GO UPDATE NewBooks SET Price = Price * 1.1 En esta sentencia, no se especific la clusula WHERE, por lo que todos las filas de la tabla sern actualizadas (a menos que la columna Price contenga un valor nulo (null). Usando WHERE para modificar datos La clusula WHERE realiza dos funciones: Especifica las filas a actualizar. Indica las filas de las tablas de origen que califican para suministrar valores para la actualizacin si se especifica una clusula FROM. Si no se especifica un WHERE, todas las filas de la tabla son modificadas. En el siguiente UPDATE, la clusula WHERE es usada para limitar la actualizacin a slo aquellas filas que cumplen con la condicin dada por el mismo: USE Pubs GO UPDATE NewBooks SET BookType = 'popular' WHERE BookType = 'popular_comp' Usando FROM para modificar datos Podemos usar la clusula FROM para obtener datos de una o ms tablas o vista y actualizar una tabla que deseemos. Por ejemplo, en el siguiente UPDATE, la clusula FROM incluye un inner join que une las tablasTitles y NewBooks: USE Pubs GO UPDATE NewBooks SET Price = Titles.Price FROM NewBooks JOIN Titles ON NewBooks.BookTitle = Titles.Title En esta sentencia UPDATE, los valores de Precio (Price) de la tabla NewBooks son actualizados con los mismos valores de la tabla Titles.

DELETE Una sentencia DELETE remueve una o ms filas de una tabla o vista. La siguiente es la sintaxis simplificada de un DELETE: DELETE tabla_o_vista FROM tabla WHERE condicion_de_busqueda En tabla_o_vista nombramos la tabla o vista a la que se le eliminarn filas. Todas las filas en una tabla que cumplen con el WHERE son eliminadas. Si no se especifica WHERE, todas las filas sern eliminadas. La clusula FROM especifica tablas adicionales o vistas y condiciones de join que pueden ser usadas como predicados en la clusula WHERE para calificar las filas a ser eliminadas por el DELETE. Las filas no son eliminadas en las tablas nombradas por la clusula FROM, slo las tablas nombradas en la clusula DELETE.
FAGDUT 21 CCI

Curso SQL Server 2000 Captulo 7

Una tabla que tiene todas sus filas removidas permanece en la base de datos. Para eliminar una tabla usaremos DROP TABLE. Consideremos el siguiente DELETE: USE Pubs GO DELETE NewBooks FROM Titles WHERE NewBooks.BookTitle = Titles.Title AND Titles.Royalty = 10 En esta sentencia, las filas son eliminadas de la tabla NewBooks si el Royalty de cada libro es del 10%. Uso de TRUNCATE TABLE La sentencia TRUNCATE TABLE es un mtodo rpido y no logueado en el registro de transacciones. El mtodo es casi siempre ms rpido que la sentencia DELETE sin condiciones, ya que DELETE registra cada eliminacin, mientras que TRUNCATE TABLE registra slo la liberacin de las pginas de datos. TRUNCATE TABLE libera inmediatamente todo el espacio ocupado por una tabla y sus ndices. La siguiente sentencia TRUNCATE TABLE elimina todas las filas de la tabla NewBooks en la base de datos Pubs: USE Pubs GO TRUNCATE TABLE NewBooks Como con una sentencia DELETE, la definicin de la tabla permanece en la base de datos luego de usar TRUNCATE TABLE (as como sus indices y otros objetos asociados). La sentencia DROP TABLE es necesaria para eliminar una tabla por completo.

FAGDUT

22

CCI

You might also like