Updated December 26, 2018
结构化查询语言(Structured Query Language)是关系数据库的标准语言
定义基本表
-- 建立一个学生表Student
create table Student(
Sno char(9) primary key,
Sname char(20) unique,
Ssex char(2),
Sage smallint,
Sdept char(20)
);
-- 建立学生选课表SC
create table SC(
Sno char(9),
Cno char(4),
Grade smallint,
primary key(Sno, Cno),
foreign key(Sno) references Student(Sno),
foreign key(Cno) references Student(Cno)
);
修改基本表
-- 向Student表增加入学时间列, 其数据类型为日期型
alter table Student add S_entrance date;
-- 将年龄的数据类型由字符型改为整数
alter table Student alter column Sage int;
-- 增加课程名称必须取唯一值条件
alter table Course add unique(Cname);
删除Student表
drop table Student cascade;
/**若选择restrict, 则欲删除的基本表不能被其他表的约束所引用, 不能有视图, 不能有触发器, 如果有, 则此表不能被删除
若选择cascade, 在删除基本表的同时, 相关的依赖对象, 比如视图, 都将被一起删除**/
索引的建立与删除
当表的数据量比较大时, 查询操作会比较耗时, 建立索引是加快查询速度的有效手段
-- 为SC表建立唯一索引, 按照学号升序和课程号降序
create unique index SCno on SC(Sno asc, Cno desc);
-- 将SC表的SCno索引名改为SCSno
alter index SCno rename to SCSno;
-- 删除Student表的Stusname索引
drop index Stusname;
选择表中的若干列
-- 查询全体学生的详细记录
select * from Student;
-- 查询全体学生的姓名, 出生年份(取别名为birthday), 所在院系(用小写字母表示系名)
select Sname, 2019-Sage birthday, lower(Sdept) from Student;
选择表中的若干元祖
-- 查询选了课程的学生学号并去重
select distinct Sno from SC;
-- 查询考试成绩不合格的学生的学号
select distinct Sno from SC where Grade < 60;
-- 查询年龄不在20~30岁之间的学生的姓名
select Sname from Student where Sage not between 20 and 23;
-- 查询既不是计算机科学系, 数学系, 也不是信息系的学生的姓名
select Sname from Student where Sdept not in ('CS', 'MA', 'IS');
-- 查询所有不姓刘的学生的姓名
select Sname from Student where Sname not like '刘%';
-- 查询名字中第二个字为阳的学生的姓名
select Sname from Student where Sname like '_阳%';
-- 查询所有有成绩的学生的学号
select Sno from Student where Grade is not null;
order by子句: 对查询结果按照一个或多个属性排序
-- 查询全体学生情况, 查询结果按所在系的系号升序排列, 同一系中的学生按年龄降序排列
select * from Student order by Sdept, Sage desc;
聚集函数: 只能用于select子句和group by中的having子句
-- 查询选修了课程的学生人数
select count(distinct Sno) from SC;
-- 计算选修1号课程的学生的平均成绩
select avg(Grade) from SC where Cno = '1';
group by子句: 将查询结果按某一列或多列的值分组
-- 查询选修了三门以上课程的学生的学号
select Sno from SC group by Sno having count(*) > 3;
等值与非等值连接查询
-- 查询每个学生及其选修课程的情况
select Student.*, SC.* from Student, SC where Student.Sno = SC.Sno;
自身连接
-- 查询每一门课的间接先修课
select first.Cno, second.Cno from Course first, Course second where first.Cpno = second.Cno;
外连接
左外连接
右外连接
带有in的子查询
-- 查询与刘晨在同一个系学习的学生
select Sno from Student where Sdept in (select Sdept from Student where Sname = '刘晨');
带有比较运算符的子查询
-- 查询与刘晨在同一个系学习的学生
select Sno from Student where Sdept = (select Sdept from Student where Sname = '刘晨');
带有any, all的子查询
-- 查询比计算机科学系任意一个学生年龄小的学生姓名和年龄
select Sname, Sage from Student where Sage > any(select Sage from Student where Sdept = 'CS');
带exists的子查询
-- 查询没有选修1号课程的学生的姓名
select Sname from Student where not exists(select * from SC where Sno = Student.Sno and Cno = '1');
-- 查询计算机科学系的学生和年龄不大于19岁的学生
select * from Student where Sdept = 'cs'
union select * from Student where Sage <= 19;
-- 查询计算机科学系的学生和年龄不大于19岁的学生的交集
select * from Student where Sdept = 'cs'
intersect
select * from Student where Sage <= 19;
-- 查询计算机科学系的学生与年龄不大于19岁的学生的差集
select * from Student where Sdept = 'cs'
except
select * from Student where Sage <= 19;
-- 查询所有选修了1号课程的学生的姓名
select Sname from Student, (select Sno from SC where Cno = '1') SC1 where Student.Sno = SC1.Sno;
插入元组
-- 将一个新学生元组插入到Student表中
insert into Student(Sno, Sname, Ssex, Sdept, Sage)values('20180215', '陈辰', '男', 'IS', 18);
插入子查询结果
insert into Table1(Sdept, Sage) select Sdept, Sage from Student group by Sdept;
-- 将所有学生的年龄增加1岁
update Student set Sage = Sage + 1;
-- 删除学号为'20180215'的学生记录
delete from Student where Sno = '20180215';
-- 将学生表置空
delete from Student;
视图与基本表不同, 是一个虚表. 数据库只存放视图的定义, 而不存放视图对应的数据
-- 定义一个反映学生出生年份的视图
create view BT_S(Sno, Sname, Sbirth) as select Sno, Sname, 2019-Sage from Student;