Bases de Datos Relacionales
description
Transcript of Bases de Datos Relacionales
Bases de Datos Relacionales
Preparó: Ismael Castañeda FuentesFuentes: Manuales Sybase
Manuales SQL ServerManuales Oracle
BATCHS
Ambiente de ejecución
• El código se puede ejecutar en:– Cliente– Servidor
• Ventajas de programar en el lado cliente– Atiende usuarios finales con diferentes necesidades– Evita tráfico en la red– Se distribuye una parte del procesamiento– Puede facilitar la interacción del usuario
• Ventajas de programar en el lado servidor– Se tiene concentración de los recursos– Uniformisa la aplicación de las reglas del negocio– Se puede actualizar más fácilmente el código
Batch
• Una o más sentencias enviadas y ejecutadas como una sola
• Ejemplo:
delete saleswhere stor_id = "5023"and ord_num = "AB-123-DEF-425-1Z3"
delete salesdetailwhere stor_id = "5023"and ord_num = "AB-123-DEF-425-1Z3"
select * from sales where stor_id = "5023"
select * from salesdetail where stor_id = "5023"
go
Restriciones de los batch
• Esta sentencias deben tener su propio batch:– create default– create rule– create procedure– create trigger– declare cursor
• No se puede borrar y recrear un objeto en el mismo batch
• sentencia use
• No se puede asignar una regla o default a una columna e insertarle valores en el mismo batch
Comentarios
• Porción de código ignorado por el servidor
• Usados para documentar
• Dos formas: -- comentario hasta el final de una línea /* comentario multilínea */
Variables locales
• Variable local: nombre de una posición de memoria para almacenar un valor
• Uso típico de las variables locales– Para facilitar el uso repetido de valores constantes– Para ejecutar bifurcamiento en código SQL– Para capturar mensajes que contienen información variable– Para intercambio de información con stored procedures– Para evitar el uso de subquerys
Variables locales - Asignación con select y expresiones
• Sintaxis simplificada:select variable_name = expression
[, variable_name = expression ...]
• Ejemplos:declare @number int,
@copy int,@sum int
select @number = 10
select @copy = @number,@sum = @number + 100
• Si select no retorna valores, la variable no cambia su valor
Variables locales - Asignación con select y valores de tabla
• Sintaxis simplificada:select variable_name = column_name
from table_name[where condition]
• Ejemplos:declare @AD_id char(11)select @AD_id = au_id
from authorswhere au_fname = "Ann" and au_lname = "Dull"
• Si el select retorna múltiples valores, solamente toma el último
Variables locales - Asignación con update
• Sintaxis simplificada:update table_name
set {column_name | variable_name } = expression [, {column_name | variable_name } = expression ... ][where condition]
• Ejemplos:declare @pub_name varchar(40)update publishers
set city = "Escanaba",state = "MI",@pub_name = pub_name
where pub_id = "0736"
• Si update modifica múltiples filas, solamente el último asignado permanece en la variable
Variables locales – Declaración - Ejemplo
• Las variables se deben declarar antes de usarlas
• Ejemplo:select pub_id
from publishersselect @myvar = total_sales
from titleswhere title_id = "BU2075"
select @myvar
Server Message: Number 137, Severity 15Line 3:Must declare variable '@myvar'.
Variables locales – Concordancia - Ejemplo
• Los valores de las variables deben de concordar con el tipo de dato de la variable
• Ejemplo:declare @myvariable int
select @myvariable = titlefrom titleswhere title_id = "BU2075"
select @myvariable
Server Message: Number 257, Severity 16Line 2:Implicit conversion from datatype 'VARCHAR' to'INT' is not allowed. Use the CONVERT function torun this query.
Variables locales – Retorno de un select - Ejemplo
• Si el select no retorna valores, la variable no cambia
• Ejemplo:declare @value int
select @value = total_sales from titleswhere title_id = "BU2075"
select @value as "BU2075 sales"
select @value = total_sales from titleswhere title_id = "BU11" -- should be "BU1111"
select @value as "BU1111 sales"
Primer query: Segundo query:BU2075 sales BU1111 sales------------ ------------
18722 18722
Variables locales - Alcance -Ejemplo
• Las variables locales se borran al terminar el batch que las crea
-- Declare a local variable:declare @pub_var char(4)
-- Assign the variable a value from a table:select @pub_var = pub_id
from pubs2..publisherswhere pub_name = "New Age Books"
-- View the variable’s value:select @pub_var
--- Use the variable in a select statement:select title_id, title, pub_id
from pubs2..titleswhere pub_id = @pub_var
-- Execute the batch. (Users of SQL Advantage do -- not need to enter "go" to complete this step):
go
Variables globales
• Variable global: nombre de una posición de memoria para almacenar un valor definido y mantenido por el servidor
Variables globales - Ejemplo
• Ejemplo_1:delete from titleswhere type = "popular_comp"select @@rowcount
------3
• Ejemplo_2:delete from titleswhere type = "popular_comp"select @@error
------0
Variables globales – Ejemplo con @@error
• Ejemplo:-- The word "from" is misplaceddelete titles from
where type = "psychology"
Server Message: Number 156, Severity 15Line 4:Incorrect syntax near the keyword 'where'.
select @@error
------ 156
Variables globales – Ejemplo con @@error
• Crear una tabla:select * into mytitles
from pubs2..titles
• Intentar borrar una tabla inexistente @@error:delete from no_tableselect @@error
• Ejecutar un delete con una condición que nunca se cumple:delete from mytitles
where 1 = 2select @@error
• ¿El segundo delete generate un error? ¿Por qué o por qué no?
• Borrar los objetos de bases de datos creados:drop table mytitles
Sentencias de control de flujo
• Por default los servidores ejecutan las sentencias en el orden en que ellas aparecen• Las siguientes son sentencias de control de flujo:
– if...else– begin...end– if exists– while– break– continue– return
if...else
• Sintaxis simplificada:if condition
block_to_execute_when_condition_is_true[ else
block_to_execute_when_condition_is_false ]
• Ejemplo:delete from titles
where type = "mod_cook"if @@error <> 0
select "An error has occurred!"else
select "The delete was successful."
Condiciones anidadas
• Ejemplo:delete from titles where type = "mod_cook"if @@rowcount = 0
select "No rows were deleted."else
if @@rowcount = 1select "One row was deleted."
elseselect "Multiple rows were deleted."
begin...end
• Sintaxis:begin statement statement ...end
• Ejemplo:...if @temp_id = "TC4203"
begin select @temp_type = "trad_cook" delete titles where type = "trad_cook"end
elsebegin select "Title has already been deleted"end
if exists
• Sintaxis simplificada:if [ not ] exists ( select_statement )code_to_execute_when_condition_is_true[ elsecode_to_execute_when_condition_is_false ]
• Ejemplo_1:if exists (select * from titles where price > $50.00)update titles set price = price * $0.90elseselect "All titles priced under $50.00“
• Ejemplo_2:if exists (select * from sysobjectswhere name = "vw_utah_authors"and type = "V")drop view vw_utah_authorsgocreate view vw_utah_authorsasselect * from authorswhere state = "UT"with check option
Sentencias if
• Ejemplo:if (select avg(price) from pubs2..titles) > $25
select "These books are expensive."else
select "These books are a bargain."
• Ejemplo :drop table mysales
• Ejemplo :if exists (select * from sysobjects where name = "mysales“ and type = "U")
drop table mysales
while• Sintaxis:
while conditionblock_to_execute
• Ejemplo_1:while (select avg(price) from titles) < $40
beginupdate titlesset price = price + $2
end
• Ejemplo_2:declare @price moneyselect @price = price
from titleswhere title_id = "PS1372"
while @price < $30begin
update titlesset price = price * $1.10where title_id = "PS1372"
end
-- The loop updates the price of PS1372, but-- never updates the value of @price. Because-- the loop condition is based on @price,-- execution of the loop would never terminate.
break
• Ejemplo:-- While the average price is greater than-- $20, this loop cuts all prices in half.-- However, if the maximum price falls below-- $40, the loop is immediately terminated.
while (select avg(price) from titles) > $20begin update titles
set price = price / 2 if (select max(price) from titles) < $40
breakend
continue
• Ejemplo:-- While @price is less than $20, this loop adds-- $1 to @price. If there are 5 or more titles-- at @price, it restarts the loop. Otherwise,-- it increases all books priced at @price by 10%....while @price < $20.00 begin
select @price = @price + $1.00if (select count(price) from titles where price = @price) >=
5 continueelse update titles set price = price * $1.10 where price =
@priceend
return
• Ejemplo:-- @avg_price is declared and set to the average-- price in titles. If the average is less than-- $10, execution exits the entire batch.-- Otherwise, it continues execution.
declare @avg_price moneyselect @avg_price = avg(price) from titlesif @avg_price < $10
returnwhile @avg_price < $20
beginupdate titles set price = price * $0.95select @avg_price = avg(price) from titles
end
Ciclos while• Ejemplo:
declare @x moneyselect @x = $0while @x < (select max(price) from pubs2..titles)
beginselect @x = @x + $1select "Titles less than $", @xselect price, title from pubs2..titles where price < @x
end
select
• Sintaxis simplificada:select { "user_message" | variable_name | column_list }
• Ejemplo:select "The average price is too low."
select "The average price is ", @avg_price
select "The average price is ", avg(price) from titles
• Puede retornar texto, valores variables, y datos de tabla en cualquier combinación