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 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 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
|