文章目錄
SQL
- Instructor(ID, name, dept_name, salary)
- Deptment(dept_name, building, budget)
- Student(ID, name, dept_name, tot_cred)
- Course(course_ID, title, dept_name, credts)
- Takes(ID, Course_ID, semester, year, grade)
Create
create table Student(
ID char(5),
name varchar(20),
dept_name varchar(20),
tot_cred int,
primary key (ID),
foreign key (dept_name) references Department
)
create table Takes(
ID char(5),
Course_ID varchar(20),
semester varchar(20),
years int,
grade int,
primary key (ID,Course_ID,semester,years,grade),
foreign key (ID) references Student,
foreign key (Course_ID) references Course
)
Select
// 普通查詢
select * from Instructor
where salary > 20000
order by salary
// 聚集
select dept_name, count(*)
from Student
group by dept_name
having avg(tot_cred) > 60
// 嵌套查詢 1
select * from Takes
where Course_ID IN (
select Course_id from Course
where dept_name='CS' and credits > 2
)
// 嵌套查詢 2
select course_id
from section as S
where semester = ’Fall’ and year= 2009 and exists (
select * from section as T
where semester = ’Spring’ and year= 2010 and S.course_id = T.course_id);
Insert
insert into
Student
values(ID,name,dept_name,salary)
Update
update Instructor
set name = "瓜娃娃"
where id = 18899174
Delete
delete from Instructor
where id = 18899174
Set operate
並、交、補
(select * from course where dept_name='CS')
union
(select * from course where dept_name='Communication')
(select * from course where credts > 2)
intersect
(select * from course where credts < 4)
(select * from course where credts > 2)
except
(select * from course where credts < 4)
join
// 自然連接
course natural full outer join prereq
// 左連接
course left outer join prereq on course.course_id = prereq.course_id
// 右連接
course natural right outer join prereq;
Grant & Revoke
Grant aLl priviliges on Student to user1,user2
// 權限 select、update、delete、insert
Grant select on Student to user1
Revoke aLl priviliges on Student from user1,user2
// 權限 select、update、delete、insert
Revoke select on Student from user1
Role
create role DB_manager
View
create view faculty as
select ID, name, dept_name
from instructor
Procedure
// 定義存儲過程 create procedure func_name() begin ... end
create procedure func(in input varchar(20),out output varchar(20))
begin
select count(*) into output
from instructor
where instructor.dept_name = func.input
end
// 聲明變量 declare
declare output integer;
// 調用 call
call func("CS building", output);
Trigger
create trigger trigger_name before / after of tableName on (Attribute)
referencing new row as nrow
referencing old row as orow
for each row
when //condition
begin atomic
...
end;
// example:
create trigger credits_earned after update of takes on (grade)
referencing new row as nrow
referencing old row as orow
for each row
when nrow.grade <> ’F’ and nrow.grade is not null
and (orow.grade = ’F’ or orow.grade is null)
begin atomic
update student
set tot_cred= tot_cred +
(select credits
from course
where course.course_id= nrow.course_id)
where student.id = nrow.id;
end;
Cursor
SQL是集合處理方式。
一般的C、C++、Java、C#、python(宿主語言)是單記錄處理方式。
那麼宿主語言和SQL如何協調?遊標cursor的引入!!!
遊標:
- 一個數據緩衝區,存放SQL語句的結果。
- 每個遊標有對應的結果。
- 用戶通過遊標逐一的獲取記錄,賦予主變量,然後交予宿主語言處理。
declare cursor_v cursor for
select ID, name from student
where tot_cred > 80
Index
普通索引:查找到滿足條件的第一個記錄後,需要查找下一個記錄,直到結束。
唯一索引:由於索引定義了唯一性,查找到第一個滿足條件的記錄後,就會停止繼續檢索
create index index_name on student(name)
create unique index index_name on instructor(ID)