SQL語句

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)
發佈了57 篇原創文章 · 獲贊 55 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章