SQL代码整理
Beyond大舌头之SQL代码整理。
诶,数据库要考试了,脑子一团浆糊。花了一点时间整理代码,这儿的肯定不全。希望对大家有所帮助。(上个学期写的)
好啦,现在又在学习Oracle的数据库了,发现很多知识点我以前没有记录,现在补充一点吧。
该版本基本完善了所有的SQL的基础语言。

  • 初稿2016-05-22 23:00:00
  • 一改2016-10-11 14:41:00

注意sql语言不分大小写,所以我没有同一大小写。

【建数据库】

1
2
3
4
create database TS
go
use TS
go

【建表-主键外键】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
create table Student
(
Sno varchar(10) constraint pk_stu primary key,------主键
Sname varchar(20),
Ssex varchar(2),
Sage int,
Sdept varchar(2)
)
Go
create table Course
(
Cno int constraint pk_cou primary key,
Cname varchar(20),
Cpno int constraint fk_cou_cpno references Course(Cno),----外键
Ccredit int
)
Go
create table SC
(
Sno varchar(10) constraint fk_sc_sno references Student(Sno),
Cno int constraint fk_sc_cno references Course(Cno),
Grade numeric(4,1),
constraint pk_sc primary key(Sno,Cno), -------联合主键
)
go

【插入-更新-删除-连接-查找】

1
2
insert into Student
values('200215121','李勇','男',20,'CS')

1
2
3
update Student
set Sage=21
where Sno = 200215121


1
2
update Student
set Sage=21

改表格字加列

1
Alter table Student add S_entrance Date

改表格之改类型

1
2
Alter table Student
Alter column Sage int

改表格之约束条件

1
Alter table Student Alter Unique(Cname)

删除

删一条信息

1
2
Delete from Student
Where Sno=200215121

删表

1
drop database test

连接

1
2
Select Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
From Student LEFT OUTER JOIN SC ON(Student.Sno=SC.Sno)

左外连接,显示左边的所有元素。同理右外连接。

查找

1
2
select * from student
where birthday NOT BETWEEN TO_DATE ('19910101','YYYYMMDD') AND ('19911231','YYYYMMDD')

【统计函数-排序】

COUNT

1
2
select COUNT(DISTNCT 产地)
from 商品信息 where 单价>800

MIN_MAX

1
2
select MAX(成绩) as 最高成绩 , MIN(成绩) as 最低成绩
from 学生成绩

SUM

1
2
select SUM(成绩) as 成绩总和
from 学生成绩

AVG

1
2
select AVG(成绩) as 平均成绩
from 学生成绩

ORDER BY

降序

1
2
select * from 学生成绩
ORDER BY 数学成绩 DESC

升序

1
2
select * from 学生成绩
ORDER BY 数学成绩


【分组】

GROUP BY

  • select子句后只有两种表达式:统计函数和进行分组的列名
  • 没有出现在GROUP BY 之后的列名不能出现在SELECT子句中,但是GROUP BY子句后面的列名何可不出现在SELECT子句中
  • 如果用了where子句,分组的数据必须满足where子句的条件
  • 系统默认是升序,可以用order by改成降序

统计函数对查询出的每一组数据进行分类统计

1
2
3
select 供应商编号,COUNT(*) as 商品种类
from 商品信息
GROUP BY 供应商编号

错误示例

1
2
select 供应商编号 ,COUNT(*) as 商品种类 , 产地
from 商品信息 GROUP BY 供应商编号

与第一条注意事项冲突,在Group by 后加上‘产地,’就可以


【条件】

WHERE

突然懒得写了。

HAVING

WHERE子句只能接受FROM的子句输出
HAVING子句可以 接受来自GROUP BY,WHERE,FROM子句输入

1
2
3
4
5
select 产地,供应商编号,COUNT(商品名称) as 商品种类
from 商品信息
where 单价>800
group by (产地,供应商编号)
having count(商品名称)>=2

上例
HACING子句是将要应用的表达式中最后的一个子句,并且它与分组数据有关,而与单个的行无关。


【存储过程】

普通

1
2
3
4
5
6
7
8
9
10
CREATE PROCEDURE proc_StudentLoadByPrimaryKey
(
@Sno varchar(10)
)
AS
BEGIN
Select * from student where sno=@sno
END
GO
exec proc_StudentLoadByPrimaryKey '200215122'

有返回值

1
2
3
4
5
6
7
8
9
10
11
12
13
create proc proc_Query_Code
(
@ad_num integer,
@ad_code varchar(10) output
)
as
begin
select @ad_code=[Ad-code] from Administrator where [Ad-num]=@ad_num
end
Go
declare @temp varchar(10)
exec proc_Query_Code 1178,@temp output
print @temp

【备份-恢复】

全库备份

全库备份的是数据

1
2
3
4
5
backup database test
to disk='d:\test-total'
restore database test
from disk='d:\test-total'
with norecovery -----此行关键字表示数据库还没有完全恢复,此时数据库不可用

日志备份

日志备份的是操作

1
2
3
4
5
backup log test
to disk='d:\test-log1'
restore database test
from disk='d:\test-log1'
with norecovery

差异备份

备份的是数据

1
2
3
4
5
6
backup database test
to disk='d:\test-dif'
with differential
restore database test
from disk='d:\test-dif'
with norecovery

Tips:若要恢复差异备份,在此次差异备份到上次全库备份之间的其它备份操作都不用恢复。

例:7:00全库备份、8:00日志备份、9:00差异备份。

恢复全库备份后恢复差异备份,数据库即恢复到9:00的状态。


【索引】

1
2
create nonclustered index idx_s_c
on s_c(c_num) include(s_num)

多项非聚簇索引

1
2
create clustered index idx_stu
on stu(num)

聚簇索引

1
2
create nonclustered index idx_stu_name
on stu(name)

普通非聚簇索引

1
2
create ndex idx_stu_name
on stu(name)

普通索引


【安全-权限】

授权

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Grant select on table Student
To u1
With grant option
-----u1 可以授权其它用户
Grant all privileges on table Student,Course
To u2,u3
-------授权所有权限
Grant select on table SC
To public
-------授权所有用户

收权

1
2
3
4
5
6
7
Revoke update(Sno)
On table Student
From u4
Revoke insert on table SC
From u5
Cascade
-----联级收回,比如u5以前授权给u6,u6给u7,这会儿他们全没权限了。传说中的连根拔起。