建表
create table student(
sno numeric(9) primary key,
sex char(2) check(sex in('男','女')),
varchar(100) not null,
sage smallint unique ,
check (sex=“女” or sname not like 'Ms.%')
);
create table sc(
sno char(9) not null,
cno char(4) not null,
grade smallint check(grade>=0 and grde<=100),
primary key(sno,cno)m
foreign kery(sno) references student(sno)
);
完整性约束命名句子
create table Student(
Sno numeric(6)
constraint c1 check(sno betweent 1000 and 9999),
sname char(20)
constraint c2 not null,
constraint StudnetKey primary key(sno)
);
修改表中的完整性限制
alter table student drop constraint c1;
alter table student add constraint c1 check(sno between 100 and 300);
域中的完整性限制
建立一个性别域GenderDomain,并对其中的限制命名
create DOMAIN GenderDomian CHAR(2)
contraint GD check(value in ('男','女')
);
修改数据
将学生2002的年龄改为22岁
update student set sage=22 where sno='2002';
将所有学生的年龄加1
update student set sage=sage+1;
带子查询的修改语句
update sc set grade=0 where 'cs'=(
select sdept from student where student.sno=sc.sno);
修改表
向student表中增加“入学时间”列,其数据类型为日期型
alter table student add S_entrance date;
将年龄的数据类型由字符类型由字符型改为整型。
alter table student
alter column sage int;
增加课程名称必须取唯一值的约束条件
alter table course add unique(cname);
插入
insert into student(sno,sname,ssex,sdept,sage)values('2001','blue'.'male','IS',18);
insert into sc(sno,cno) values('2002','1');
insert into scvalues('2002','1',null);
插入子查询结果
对每一个系,求学生的平均年龄,并把结果存入数据库
insert into Dept_age(Sdept,Av_age) selcet Sdept,AVG(Sage) from student group by student;
删除
删除学号为111的学生记录
delete from student where sno="111";
删除所有的学生选课记录
delete from sc;
删除计算机系所有学生的选课记录
delete from sc where 'sc'=(
select sdept from student where student.sno=sc.sno);
单表查询
查询全体学生的学号和姓名
select sno,sname from student;
查询所有学生的详细信息
select * from student;
查询经过计算的值
查询全体学生的姓名及其出生年份
selecet sname,2004-sage from student;
查询全体学生的姓名、出生年份、和所在的郧西,并要求用小写字母标识所有系名。
select sname,'Year of Birth':,2004-sage,lower(sdept) from student;
用户可以通过制定别名来改变查询结果(Birth不存在,会自动创建)
select sname Name,'Year of Birth:' Birth,2004-sage BIRTHDAY,lower(sdept) DEPARTMENT from student;
查询不重复的数据
select distinct sname from student;
查询重复数据
select All sname from student;//all是默认的格式,可以不加
查询计算机系学生的名单
select sname from student where sdept="CS";
查询所有年龄在20岁以下的学生
select * from student where sage<20;
查询年龄在20-30之间的学生
select * from student where sage between 20 and 30;
查询年龄不在20-30之间的学生
select * from tudent where sage not betweent 20 and 30;
确定集合
查询计算机系(CS)和数学系(MA)学生。
select * from student where sdept in('CS','MA');
与in相对应的是not in
查询计不是算机系(CS)和数学系(MA)学生。
select * from student where sdept not in('cs','ma');
字符匹配
查询学号为200215121的学生的详细信息
select * from student where sno like '200215121';
查询以列开头的字符
查询所有姓刘的学生
select * from student where sname like '刘%';
查询一个汉字两个字符
查询姓‘欧阳’且全名为3个汉字的学生的姓名
select sname from student where sname like '欧阳__';
查询名字中第2个字为“阳”字的学生的姓名和学号。
select sname.sno from student where sname like'__阳%';
查询所有不姓刘的学生
select * from student where sname not like'刘%';
字符转义
查询DB_Dsign课程的课程号和学分
select cno ,ccredit from course where cname like 'DB\_Design' escape '\';
查询以"DB_"开头,且倒数第 3个字符为i的课程的详细情况
select * from course where cname like 'DB\_%i__' escape '\';
查询缺少成绩的学生
select * from student where grade is null;
查询有成绩的学生
select * from student where grade is not null;
查询计算机系年龄在20岁以下的学生
select sname from student where sdept="cs" and sage<20;
order by字句
查询选修了3号课的学生的成绩并降序显示
select * from sc where cno=3 order by grade desc;
查询选修了3号课的学生的成绩并按系升序,同系降序显示
select * from sc where cno=3 order by sdept,grade desc;
聚集函数
查询学生总数
select count(*) from sc;
查询选修了课程的人数
select count(distinct sno) from sc;
计算1号课程的学生的平均成绩
select avg(grade) from sc where cno='1';
查询学生200215012选修课程的总学分数
select sum(ccredit) from sc,course where sno='200215012' and sc.cno=course.cno;
group by 字句
求各个课程号及相应的选课人数
select cn,count(sno) from sc group by cno;
查询选修了3门以上课程的学生学号
select sno from sc group by sno having count(*)>3;
多表连接
查询每个学生及其选修课程的情况
select student.*,sc.* from student,sc where student.sno =sc.sno;
若在等值连接中把目标列中重复的属性列去掉则为自然连接
自身连接
查询每一门课的间接先修课
select first.con,second.cpno from course first course second where fisrt.cpno=second.cno;
外连接
select student.sno,sname,ssex,sage,sdept,cno,grade
from student left join sc on (student.sco=sc.sno);
符合条件连接
查询选修2号课程且成绩在90分以上的所有学生
select student.sno,sname from student.sc where student.sno=sc.sno and sc.cno='2' and sc.grade>90;
多表连接
查询每个学生的学号、姓名、选修的课程名及成绩
select Student.sno,sname,cname,grade from student,sc,course where student.sno=sc.sno=course.sno;
嵌套查询
select snane from student wher sno in(
select sno from sc where
cno='2');
查询与“刘晨”在同一个系学习的学生。
select sno,sname,sdept from student where sdept in (
select sdept from student where sname="刘晨");
另一种写法:二
select sno,sname,sdept from student where sdept in ("CS");
另一种写法:三
select s1.sno,s1.sname,s1.sdept from student s1.student s2 where s1.sdept=d2.sdept and s2.snmae="刘晨";
查询讯修了课程名为信息系统“”的学生学号和姓名。
select sno,sname from studnet where sno in(
select sno where cno in(
相关子查询
select sno,sname,sdept from student where sdept(
select sdept from studnet where sname="刘晨");
找出每个学生超过他选修课程平均成绩的课程号
select sno,cno
from sc x
where grader>=(
select avg(grade)
from sc y
where y.sno=x.sno;
带有any或all谓词的子查询
查询其他系中比计算机系某一学生年龄小的学生姓名和年龄
select sname,sage from student where sage<ANY(
select sage from student where sdept="cs");
查询其他系中比计算机系所有学生年龄小的学生姓名和年龄
select sname,sage from student where sage<ALL(
select sage from student where sdept="cs");
查询所有选修了1号课程的学生姓名
select sname from student where exists(
select * from sc where sno=student.sno and cno='1');
查询没有选修了1号课程的学生姓名
select sname from student where not exists(
select * from sc where sno=student.sno and cno='1');
视图
定义视图
建立信息系学生的视图
create view IS_Student
as
select sno,sname,sage from student where sdept="IS";
建立信息系学生的视图,并要求进行修改和插入操作时仍需要保证该视图只有信息系的学生
create view IS_Student
as select sno,sname,sage from studnet where sdept="IS"
WITH CHECK ON;
视图上建立视图
create view IS_S2
as
select sno,sname,grade from IS_S1 where grade>=90;
删除视图
drop view IS_S1;
查询视图
在信息里学生的视图中找出年龄小于20岁的学生。
select sno,sage from IS_Student where sage<20;
更新视图
update IS_Student
set Sname="刘辰" wher sno='2002';
增删改查的操作都与表相同。
授权与回收
授予
把查询student表的权限授给用户U1
grant select
on talbe student
to u1;
把对student表和course表的全部操作权限授予用户U2和U3
grant all privileges
on talbe studnet,course
to U1,U3;
把对表Sc的查询权限授予所有用户
grant select on table sc to public;
把对表SC的insert权限授予U5用户,并允许将此权限再授予其他用户。
grant insert on table sc
to U5
with grant option;
回收
把用户U4修改学生学号的权限收回
revoke update(sno) on table Student from U4;
收回所有用户对表SC的查询权限
revoke select on tallbe sc xfrom public;
把用户U5对SC表的insert权限回收
revoke insert on table sc from U5 cascade;
审计
对修改Sc表结构或修改SC表数据的操作进行审计
audit alter,update on sc;
取消对SC表的一切审计
noaudit alter,update on sc;
建立触发器自动更新数据
create table sal_log(
Eno numeric(4) references teacher(Eno),
Sal numeric(7,2),
Username char(10),
Date timedstamp
);
create TRIGGER inser_sal
AFTER INSERT ON teacher
FOR EACH ROW
AS BEGIN
insert into sal_log values(new.Eno,new.Sal,CURRENT_USER,CURRENT_TIMESTAMP);
END;
create TRIGGER update_sal
AFTER UPDATE ON teacher
FOR EACH ROW
AS BEGIN
IF(new.Sal<>old.Sal)THEN
insert into sal_log values(
new.Eno,new.Sal,CURRENT_USER,CURRENT_TIMESTAMP);
END IF;
END;
删除触发器
drop trigger inser_sal on teacher;