Sunteți pe pagina 1din 52

Curso introductorio a SQL

SQL se divide en dos lenguajes .



- 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).

S-ar putea să vă placă și