- DDL (Data Definition Language). - DML (Data Manipulation Language). Lenguaje DML Sentencia DML Objetivo Insert Aadir filas de datos a una tabla. Delete Eliminar filas de datos de una tabla. Update Modificar los datos de una tabla. Select Recuperar datos de una tabla. Lenguaje DDL Sentencia DDL Objetivo Alter procedure Recompilar un procedimiento almacenado. Alter Table Aadir o redefinir una columna, modificar la asignacin de almacenamiento. Analyze Recoger estadsticas de rendimiento sobre los objetos de la BD para utilizarlas en el optimizador basado en costes. Create Table Crear una tabla. Create Index Crear un ndice. Drop Table Eliminar una tabla. Drop Index Eliminar un ndice. Grant Conceder privilegios o papeles, roles, a un usuario o a otro rol. Truncate Eliminar todas las filas de una tabla. Revoke Retirar los privilegios de un usuario o rol de la base de datos. Sentencias DML de Extraccin Select Sintaxis. Select Campos From Tablas Where Condicin Group by Criterio de agrupamiento Having Condiciones para las agrupaciones Order by Criterio de ordenamiento
Predicados Predicado Descripcin ALL Devuelve todos los campos de la tabla TOP Devuelve un determinado nmero de registros de la tabla DISTINCT Omite los registros cuyos campos seleccionados coincidan totalmente DISTINCTROW Omite los registros duplicados basndose en la totalidad del registro y no slo en los campos seleccionados. ALL Select all from tabla Es equivalente a: Select * from Tabla.
TOP Select Top 4 from Tabla_ejemplo order by Saldo desc Selecciona las 4 cuentas con saldo mas alto. - los registros a extraer dependern del orden que se le de en la clusula Order by
Distinct / Distinctrow Select distinct id_cliente from Tabla_ejemplo Tabla_Ejemplo id_cliente id_cuenta saldo 1234 1234-01 200000 2345 2345-01 754000 3456 3456-01 300000 4567 4567-01 100000 5678 5678-01 2000000 6789 6789-01 2333 1234 1234-02 3000 2345 2345-02 40000 id_cliente 1234 2345 3456 4567 5678 6789 Select distinctrow id_cliente from Tabla_ejemplo id_cliente 1234 2345 3456 4567 5678 6789 1234 Clusula Where Esta clusula determina los registros que se extraern con la Query, adems de contener los Inner Join. Si no se especifican valores en esta clusula la Query retornara todos los datos. Si se usan do tablas en la clusula From y no se especifica Join dentro del Where (ni fuera de este inner, left o rigth) se obtendr el producto cartesiano de ambas tablas.
Group by Esta clusula agrupa con valores idnticos, en la lista de campos especificados, en un solo registro. Es utilizada conjuntamente con alguna funcion SQL agregada, por ejemplo : count () o sum(). Ejemplo de Group by Select id_cliente , count(1) as cantidad from tabla_ejemplo group by id_cliente Tabla_Ejemplo id_clie n t e id_cuenta saldo 1234 1234-01 200000 2345 2345-01 754000 3456 3456-01 300000 4567 4567-01 100000 5678 5678-01 2000000 6789 6789-01 2333 1234 1234-02 3000 2345 2345-02 40000 id_cliente cantidad 1234 2 2345 2 3456 1 4567 1 5678 1 6789 1 Having Su funcin es similar a Where, ya que permite realizar filtros, pero respecto de las agrupaciones hechas con la clusula Group by. Ejemplo Having Select id_cliente , count(1) as cantidad from tabla_ejemplo group by id_cliente having count(1) > 1 id_cliente cantidad 1234 2 2345 2 Clusula compute Permite Totalizar el resultado de las consultas de acuerdo a un corte especifico.
Ejemplo Compute Select id_cliente ,cuenta, saldo from tabla_ejemplo COMPUTE sum(saldo) by id_cliente id_cliente cuenta saldo 1234 1234-01 200000 1234 2345-02 3000 sum 203000 2345 2345-01 754000 2345 1234-02 40000 sum 794000 3456 3456-01 300000 sum 300000 4567 4567-01 100000 sum 100000 5678 5678-01 2000000 sum 2000000 6789 6789-01 2333 sum 2333 Subconsultas Las Subconsultas son instrucciones Select anidadas y puden utilizarse tres formas. Comparacin [ANY | ALL | SOME] (instruccin SQL). Expresin [NOT] in (instruccin SQL). [Not] EXISTS (instruccin SQL). ANY/SOME ANY y SOME son sinnimos y se utilizan para retornar registros de la consulta principal que satisfagan la comparacin con cualquier registro recuperado de la . ALL recupera aquellos registros que satisfacen la comparacin con todos los registros recuperados de la subconsulta. [NOT] EXISTS Se utiliza para determinar si la subconsulta devuelve algn registro. Ejemplo: Select id_cliente from tabla_clientes as c where EXISTS (select 1 from tabla_ejemplo as e where c.id_cliente = e.id_cliente) Retornara todos los cid_cliente que tengan una cuenta asociada en la tabla Tabla_ejemplo. [NOT] IN Se utiliza para extraer los registros que coincidan con al menos uno del subconjunto extrado por la subconsulta o de una lista de valores separadas por coma. por lo tanto el ejemplo anterior se podra escribir de la siguiente manera: Select id_cliente from tabla_clientes as c where c.id_cliente in (select e.id_cliente from tabla_ejemplo as e where c.id_cliente = e.id_cliente) INNER JOIN INNER JOIN. Sintaxis Select campos from tabla1 INNER JOIN tabla2 on tabla1.campo1 = tabla2.campo1. Es Equivalente a : Select campos from tabla1 , tabla2 where tabla1.campo1 = tabla2.campo1.
LEFT JOIN Sintaxis Select campos from tabla1 LEFT JOIN tabla2 on tabla1.campo1 = tabla2.campo1
Ejemplo Left Join Clientes id_cliente Nombre 1234 Juan 2345 Lus 3456 Gabriel 4567 Martn 5678 Pedro 6789 Fernando 1234 Roberto 2345 Rodrigo 7891 Felipe 8793 Hctor 9862 Hernn Cuentas id_cliente id_cuenta saldo 1234 1234-01 200000 2345 2345-01 754000 3456 3456-01 300000 4567 4567-01 100000 5678 5678-01 2000000 6789 6789-01 2333 1234 1234-02 3000 2345 2345-02 40000 1111 0000-00 0 Select * from cliente LEFT JOIN cuentas on cliente.id_cliente = cuenta.is_cliente id_cliente Nombre id_cliente id_cuenta saldo 1234 Juan 1234 1234-01 200000 2345 Lus 2345 2345-01 754000 3456 Gabriel 3456 3456-01 300000 4567 Martn 4567 4567-01 100000 5678 Pedro 5678 5678-01 2000000 6789 Fernando 6789 6789-01 2333 1234 Roberto 1234 1234-02 3000 2345 Rodrigo 2345 2345-02 40000 7891 Felipe NULL NULL NULL 8793 Hctor NULL NULL NULL 9862 Hernn NULL NULL NULL Ejemplo Left Join Clientes id_cliente Nombre 1234 Juan 2345 Lus 3456 Gabriel 4567 Martn 5678 Pedro 6789 Fernando 1234 Roberto 2345 Rodrigo 7891 Felipe 8793 Hctor 9862 Hernn Cuentas id_cliente id_cuenta saldo 1234 1234-01 200000 2345 2345-01 754000 3456 3456-01 300000 4567 4567-01 100000 5678 5678-01 2000000 6789 6789-01 2333 1234 1234-02 3000 2345 2345-02 40000 1111 0000-00 0 Select * from cliente LEFT JOIN cuentas on cliente.id_cliente = cuenta.is_cliente and saldo > 40000 id_cliente Nombre id_cliente id_cuenta saldo 1234 Juan 1234 1234-01 200000 2345 Lus 2345 2345-01 754000 3456 Gabriel 3456 3456-01 300000 4567 Martn 4567 4567-01 100000 5678 Pedro 5678 5678-01 2000000 6789 Fernando NULL NULL NULL 1234 Roberto NULL NULL NULL 2345 Rodrigo NULL NULL NULL 7891 Felipe NULL NULL NULL 8793 Hctor NULL NULL NULL 9862 Hernn NULL NULL NULL RIGHT JOIN Sintaxis Select campos from tabla1 RIGHT JOIN tabla2 on tabla1.campo1 = tabla2.campo1 Ejemplo RIGTH JOIN Clientes id_cliente Nombre 1234 Juan 2345 Lus 3456 Gabriel 4567 Martn 5678 Pedro 6789 Fernando 1234 Roberto 2345 Rodrigo 7891 Felipe 8793 Hctor 9862 Hernn Cuentas id_cliente id_cuenta saldo 1234 1234-01 200000 2345 2345-01 754000 3456 3456-01 300000 4567 4567-01 100000 5678 5678-01 2000000 6789 6789-01 2333 1234 1234-02 3000 2345 2345-02 40000 1111 0000-00 0 Select * from cliente RIGTH JOIN cuentas on cliente.id_cliente = cuenta.is_cliente id_cliente Nombre id_cliente id_cuenta saldo NULL NULL 111 0000-0 0 TSQL Transac SQL es una extensin del lenguaje SQL, bsicamente esta extensin consisti en incorporar: Uso de variables locales. Soporte funciones adicionales para el procesamiento de cadenas, datos, matemtica, etc. Un lenguaje de control de flujos. Procedimientos Almacenados. Procedimientos almacenados Son grupos de instrucciones SQL y lenguaje de control de flujo. Sintaxis: create procedure procedure_name [[ (]@parameter_name datatype [= default] [output] [, @parameter_name datatype [= default] [output]]...[)]] as sql_statements Ejecucion de un SP execute nombre_sp valor_arg1, valor_arg2 exec nombre_sp valor_arg execute nombre_sp @nombre_arg = valor arg execute GATEWAY.pubs2.dbo.nombre_sp valor_arg Nombre_sp valor_arg
Nota: El ltimo formato de sintaxis, sin exec ni execute , es aceptable siempre que la instruccin sea la nica o la primera de un lote. Valores por Default Al Ejecutar un SP, se le deben pasar todos los valores de sus argumentos, a menos que en la creacin se especifiquen valores por defecto. Ejemplo: Create procedure busca_cuenta (@cliente = 0) as if (cuenta = 0 ) select idcliente, cuenta from cuentas else select id_ciliente. Cuenta from cuentas where id_cliente = client Nota: es posible usar NULL como valor por defecto
WITH RECOMPILE Esta opcin se puede utilizar tanto al crear un SP como al ejecutarlo. create procedure ver_cuenta @cliente numeric (12) as Select cuenta from cuentas where id_cliente = @cliente with recompile El efecto de esta opcin es que no se guardar un plan de ejecucin para este SP. WITH RECOMPILE Si el SP no ha sido creado con with recompile
Execute ver_cuenta 12566910 with recompile
Obliga a crear un nuevo plan de ejecucin que ser utilizado para posteriores ejecuciones.
Tablas Temporales En un SP se puede crear y utilizar tablas temporales, esta slo existir mientras dure la ejecucin del SP. En un SP podemos: Crear una tabla temporal. Insertar, actualizar o eliminar datos de la tabla temporal. Ejecutar consultas sobre la tabla temporal. Llamar a otros procedimientos que hacen referencia a la tabla temporal. Ejemplo de uso Cree la tabla temporal que precisa con una instruccin create table. create table #tempstores (stor_id char(4), amount money) Crear el o los procedimientos que utilizaran la tabla (pero no el que la genera). create procedure inv_amounts as select stor_id, "Total Due" =sum(amount) from #tempstores group by stor_id Eliminar la tabla temporal: drop table #tempstores Cree el procedimiento que genera la tabla y llama a los procedimientos creados en el paso 2: create procedure inv_proc as create table #tempstores (stor_id char(4), amount money) insert #tempstores select stor_id, sum(qty*(100-discount)/100*price) from salesdetail, titles where salesdetail.title_id = titles.title_id group by stor_id, salesdetail.title_id exec inv_amounts Argumentos de Salida Para determinar si un argumento es de salida, se debe utilizar la sentencia output luego de la declaracin del argumento al momento de ser creado el SP. Ejemplo: create procedure mathtutor @mult1 int, @mult2 int, @result int output as select @result = @mult1 * @mult2 Control de Flujo - IF Sintaxis if boolean_expression statement [else [if boolean_expression ] statement ] Como resultado de If solo puede hacer una accin, esto es statement corresponde a una instruccin.
Begin.. End - Se utilizan para agrupar una serie de instrucciones de tal manera que sean tratadas como una unidad por las estructuras de control.
Ejemplo: if (select avg(price) from titles) < $15 begin update titles set price = price * 2 select title, price from titles where price > $28 end Control de Flujo Control de Flujo While Y Break...Continue while se utiliza para definir una condicin para la ejecucin repetida de una instruccin o un bloque de instrucciones. break y continue controlan el funcionamiento de las instrucciones dentro de un bucle while . break permite salir del bucle while . continue hace que while omita cualquier instruccin despus de continue dentro de while Sintaxis: while boolean expression begin statement [ statement ]... break [ statement ]... continue [ statement ]... end Control de Flujo Ejemplo: while (select avg(price) from titles) > $20 begin update titles set price = price / 2 if (select max(price) from titles) < $40 break else if (select avg(price) from titles) < $20 continue print "Average price still over $20" end Control de Flujo Goto La palabra clave goto origina una bifurcacin incondicional a un rtulo definido por el usuario Sintaxis label : goto label Control de Flujo Ejemplo: declare @count smallint select @count = 1 restart: print "yes" select @count = @count + 1 while @count <=4 goto restart Cursores Un cursor es el nombre simblico asociado a una instruccin select Transact-SQL mediante una instruccin de declaracin. Pueden declararse como solo lectura (read only) o para actualizacin (for update). Cursores Declaracin: Sintaxis: declare cursor_name cursor for select_statement [for {read only | update [of column_name_list ]}] Ejemplo: declare authors_crsr cursor for select au_id, au_lname, au_fname from authors where state != 'CA' Cursores Si no se especifica el tipo de cursor en la declaracin, el motor asume que se trata de for update.
Cursores Esto ocurre excepto, en las siguientes circunstancias:
Opcin distinct Clusula group by Funcin agregada Subconsulta Operador union
Esto se debe a que el motor esta obligado a crear una tabla temporal ya sea para ordenar o manipular los datos. Ejemplo de Uso Cursores create procedure au_sales (@author_id id) as /*declarar variables locales usadas para recobrar */ declare @title_id tid declare @title varchar(80) declare @ytd_sales int declare @msg varchar(120) /* declarar el cursor para recobrar los libros ** escritos por un autor concreto */ declare author_sales cursor for select ta.title_id, t.title, t.total_sales from titleauthor ta, titles t where ta.title_id = t.title_id and ta.au_id = @author_id open author_sales fetch author_sales into @title_id, @title, @ytd_sales if (@@sqlstatus = 2) begin print "no se encontraron datos." close author_sales return end /* si el conjunto de resultados del cursor no est ** vaco, procesar cada fila de informacin */ while (@@sqlstatus = 0) begin if (@ytd_sales = NULL) begin select @msg = @title + " ." print @msg end else if (@ytd_sales < 500) begin select @msg = @title + " ." print @msg end else if (@ytd_sales < 1000) begin select @msg = @title + "." print @msg end else begin select @msg = @title + " ." print @msg end fetch author_sales into @title_id, @title, @ytd_sales end /* si se genera un error, llamar al manipulador ** designado */ if (@@sqlstatus = 1) exec error_handle close author_sales deallocate cursor author_sales return Where Current of Esta clusula se usa para la actualizacin de los registros de un cursor con opcin for Update. Ejemplo: update publishers set city = "Pasadena", state = "CA" where current of pubs_crsr Sql dinmico Permite construir procedimientos almacenados capaces de cambiar una vez compilados. Por ejemplo un SP que actualice un campo de una tabla pasando como argumento el nombre del campo, la tabla y las condiciones. Sql dinmico Versiones 12.0 y posteriores En versin 12.0 utilice el nuevo comando exec( ) de Transact-SQL. Por ejemplo, -- @SQL contendr el SQL a ejecutar declare @SQL varchar(255)
-- @TABLE contiene el nombre de una tabla select @SQL = "create table " + @TABLE + " ( a1 int ) "
-- Ejecucin del comando contenido en @SQL: exec ( @SQL ) go Sql dinmico Versiones 11.5.x, 11.9.x y posteriores Antes de poder ejecutar sentencias SQL dinmicas, es necesario realizar las siguientes labores de configuracin: Habilitar los Servicios de Integracin de Componentes, CIS: sp_configure "enable cis", 1 go NOTA: El servidor debe ser reiniciado para que el cambio entre en efecto. Definir un servidor loopback, utilizando el procedimiento almacenado sp_addserver. Por ejemplo: sp_addserver loopback, ASEnterprise, server go Sql dinmico Usando el procedimiento almacenado del sistema sp_remotesql. La sintaxis del procedimiento almacenado sp_remotesql es la siguiente: sp_remotesql server, query [ , query2, ... , query254 ] Este procedimiento permite ejecutar hasta 254 sentencias SQL, de 255 caracteres cada uno. Ejemplo: -- @SQL contendr el SQL a ejecutar declare @SQL varchar(255)
-- @TABLE contiene el nombre de una tabla select @SQL = "create table " + @TABLE + " ( a1 int ) "
-- Ejecucin del SQL contenido en @SQL execute sp_remotesql loopback, @SQL go Consejos Evite los bloqueos a nivel de tabla. Esto tiene un efecto adverso sobre grandes volmenes de informacin. Mantenga las transacciones SQL tan cortas como le sea posible. El mantener bloqueos por largos perodos de tiempo impide que otros usuarios completen sus transacciones. Evite por completo la interaccin de usuario dentro de una transaccin, de tal manera que la duracin de los bloqueos no se encuentre bajo el control humano. Para un mejor rendimiento en bases de datos sometidas a frecuentes operaciones de update, considere disear la base de datos para que ocurran operaciones de "actualizacin en sitio" (update in place). La siguientes condiciones se deben cumplir: La tabla no puede tener triggers de update. Las columnas que se actualicen no pueden ser de longitud variable ni aceptar valores nulos. Las columnas que se actualicen no pueden formar parte del ndice utilizado en el plan de ejecucin del optimizador. El update solamente puede afectar una fila a la vez y esta debe poder ser determinada por el optimizador en el plan de consulta (por ejemplo, utilice un argumento de bsqueda que corresponda al ndice nico).