Advanced SQL
:material-circle-edit-outline: 约 133 个字 :fontawesome-solid-code: 92 行代码 :material-clock-time-two-outline: 预计阅读时间 2 分钟
JDBC and ODBC省略
Procedural Constructs in SQL
SQL Functions
create function dept_count (dept_name varchar(20))
returns integer
begin
declare d_count integer;
select count (* ) into d_count
from instructor
where instructor.dept_name = dept_name
return d_count;
end
select dept_name, budget
from department
where dept_count (dept_name ) > 1
Table Functions
create function instructors_of (dept_name char(20) )
returns table ( ID varchar(5),
name varchar(20),
dept_name varchar(20),
salary numeric(8,2))
select *
from table (instructors_of (‘Music’)
SQL Procedures
create procedure dept_count_proc (in dept_name varchar(20), out d_count integer)
begin
select count(*) into d_count
from instructor
where instructor.dept_name = dept_count_proc.dept_name
end
declare d_count integer;
call dept_count_proc( ‘Physics’, d_count);
Procedural Constructs
While
and repeat
statements :
declare n integer default 0;
while n < 10 do
set n = n + 1
end while
repeat
set n = n – 1
until n = 0
end repeat
For
loop: Permits iteration over all results of a query
declare n integer default 0;
for r as
select budget from department
where dept_name = ‘Music’
do
set n = n - r.budget
end for
Conditional statements (\(if-then-else\))
if boolean expression
then statement or compound statement
elseif boolean expression
then statement or compound statement
else statement or compound statement
end if
Recursive Queries
find which courses are a prerequisite, whether directly or indirectly, for a specific course
with recursive rec_prereq(course_id, prereq_id) as (
select course_id, prereq_id
from prereq
union
select rec_prereq.course_id, prereq.prereq_id,
from rec_prereq, prereq
where rec_prereq.prereq_id = prereq.course_id
)
select ∗
from rec_prereq;
This example view, rec_prereq
, is called the transitive closure of the prereq relation
Triggers
A trigger is a statement that is executed automatically by the system as a side effect of a modification to the database.
- Trigger - ECA rule
- E: Event ( insert, delete ,update)
- C: Condition
- A: Action
account_log(account, amount, datetime)
-- event
create trigger account_trigger after update of account on balance
referencing new row as nrow -- for deletes and updates
referencing old row as orow -- for inserts and updates
-- condition
for each row
when nrow.balance - orow.balance > =200000 or
orow.balance -nrow.balance >=50000
-- action
begin
insert into account_log values (nrow.account-number,
nrow.balance-orow.balance , current_time() )
end
Statement Level Triggers
- Use for each statement instead of for each row
- Use referencing old table or referencing new table to refer to temporary tables (called transition tables) containing the affected rows