--department(dNo,dName,officeRoom,homepage)
--student(sNo,sName,sex,age,dNo)
--course(cNo,cName,cPNo,credit,dNo)
--sc(sNo,cNo,score,recordDate)
CREATE TABLE department(
dNo CHAR(2) NOT NULL UNIQUE,
dName VARCHAR(20),
officeRoom VARCHAR(40),
homePage VARCHAR(80),
PRIMARY KEY(dNo)
);
CREATE TABLE student(
sNo CHAR(6) NOT NULL UNIQUE,
sName VARCHAR(20) NOT NULL,
sex CHAR(2) CHECK (sex IN('男','女')),
age INT,
dNo CHAR(2),
PRIMARY KEY(sNo),
FOREIGN KEY (dNo) REFERENCES department(dNo)
);
CREATE TABLE course(
cNo CHAR(6) NOT NULL UNIQUE,
cName VARCHAR(20) NOT NULL,
cPNo CHAR(6),
credit INT,
dNo CHAR(2),
PRIMARY KEY(cNo),
FOREIGN KEY (cPNo) REFERENCES course(cNo),
FOREIGN KEY (dNo) REFERENCES department(dNo)
);
CREATE TABLE sc(
sNo CHAR(6) NOT NULL,
cNo CHAR(6) NOT NULL,
score INT,
recordDate date DEFAULT current_date,
PRIMARY KEY(sNo,cNo),
FOREIGN KEY (sNo) REFERENCES student(sNo),
FOREIGN KEY (cNo) REFERENCES course(cNo)
);
INSERT INTO department VALUES('01','信息学院','行政楼409','www.xxx.edu.cn');
INSERT INTO department VALUES('02','软件学院',null,null);
INSERT INTO department VALUES('03','理学院',null,null);
INSERT INTO department VALUES('04','文学院',null,null);
INSERT INTO department VALUES('05','外国语学院',null,null);
INSERT INTO student VALUES('170101','宁灿', '女',19,'01');
INSERT INTO student VALUES('170102','尹江月','女',19,'01');
INSERT INTO student VALUES('170103','杨佳伟','男',null,null);
INSERT INTO student VALUES('170104','杨何宇','男',19,'01');
INSERT INTO student VALUES('170105','胡耀斌','男',19,null);
INSERT INTO student VALUES('170106','李杨阳','女',20,'01');
INSERT INTO student VALUES('170107','杜利俊','女',18,'01');
INSERT INTO student VALUES('170108','钱多多','女',17,'01');
INSERT INTO student VALUES('170109','李佳伟','女',null,'01');
INSERT INTO student VALUES('170110','吴莫愁','女',21,'01');
INSERT INTO student VALUES('170201','安相成','男',19,'02');
INSERT INTO student VALUES('170202','曹师好','男',null,'02');
INSERT INTO student VALUES('170203','雷霆', '男',18,'02');
INSERT INTO student VALUES('170204','刘书敏','男',20,'02');
INSERT INTO student VALUES('170205','王兵', '男',21,'02');
INSERT INTO student VALUES('170206','李佳成','男',19,null);
INSERT INTO student VALUES('170207','唐玉迎','女',17,'02');
INSERT INTO student VALUES('170208','杨曼婷','女',19,'02');
INSERT INTO student VALUES('170301','张望', '男',21,'03');
INSERT INTO student VALUES('170302','王芳', '女',18,'03');
INSERT INTO student VALUES('170303','赵四海','男',19,'03');
INSERT INTO student VALUES('170401','孙敏', '女',null,null);
INSERT INTO student VALUES('170402','李忠国','男',null,'04');
INSERT INTO student VALUES('170403','钱紧', '男',17,'04');
INSERT INTO student VALUES('170404','钱多多','女',20,'04');
INSERT INTO student VALUES('170405','管八方','男',21,'04');
INSERT INTO student VALUES('170406','王兵', '男',19,'04');
INSERT INTO student VALUES('170407','张三丰','男',100,null);
INSERT INTO course VALUES('030101','高等数学',null,2,'03');
INSERT INTO course VALUES('030102','线性代数',null,2,'03');
INSERT INTO course VALUES('030201','矩阵论','030102',3,'03');
INSERT INTO course VALUES('030202','概率论','030101',2,'03');
INSERT INTO course VALUES('030301','数理统计','030202',3,'03');
INSERT INTO course VALUES('010101','信号与系统',null,2,'01');
INSERT INTO course VALUES('010102','数字电路','010101',2,'01');
INSERT INTO course VALUES('010103','数字信号处理','030301',3,'01');
INSERT INTO course VALUES('010201','模式识别','010103',3,'01');
INSERT INTO course VALUES('020101','离散数学',null,2,'02');
INSERT INTO course VALUES('020102','程序设计基础',null,2,'02');
INSERT INTO course VALUES('020201','计算机组成原理','020101',3,'02');
INSERT INTO course VALUES('020202','面向对象程序设计','020102',2,'02');
INSERT INTO course VALUES('020203','编译原理','020101',2,'02');
INSERT INTO course VALUES('020301','数据结构','020202',3,'02');
INSERT INTO course VALUES('020302','操作系统','020201',3,'02');
INSERT INTO course VALUES('020401','数据库系统','020301',3,'02');
INSERT INTO course VALUES('020402','算法设计与分析','020301',3,'02');
INSERT INTO course VALUES('020403','形式语言与自动机','020203',3,'02');
INSERT INTO course VALUES('020501','移动计算','020102',2,'02');
INSERT INTO course VALUES('040101','中国传统文化',null,1,'04');
INSERT INTO course VALUES('040102','近代世界史',null,1,'04');
INSERT INTO course VALUES('040103','现代文学',null,1,'04');
INSERT INTO course VALUES('040201','古典文学欣赏','040101',2,'04');
INSERT INTO course VALUES('040202','世界文学','040103',2,'04');
INSERT INTO course VALUES('040301','中国诗词欣赏','040201',2,'04');
INSERT INTO sc VALUES ('170101','030101',91,to_date('2016-01-08','yyyy-mm-dd'));
INSERT INTO sc VALUES ('170101','030102',83,to_date('2016-07-10','yyyy-mm-dd'));
INSERT INTO sc VALUES ('170101','020101',88,to_date('2016-07-02','yyyy-mm-dd'));
INSERT INTO sc VALUES ('170101','020102',92,to_date('2017-01-10','yyyy-mm-dd'));
INSERT INTO sc VALUES ('170101','020201',70,to_date('2017-01-10','yyyy-mm-dd'));
INSERT INTO sc VALUES ('170101','020202',80,to_date('2017-01-10','yyyy-mm-dd'));
INSERT INTO sc VALUES ('170101','020203',null,null);
INSERT INTO sc VALUES ('170101','020301',null,null);
INSERT INTO sc VALUES ('170101','020302',null,null);
INSERT INTO sc VALUES ('170101','020401',null,null);
INSERT INTO sc VALUES ('170101','020402',null,null);
INSERT INTO sc VALUES ('170102','030101',88,to_date('2016-01-08','yyyy-mm-dd'));
INSERT INTO sc VALUES ('170102','030102',86,to_date('2016-07-10','yyyy-mm-dd'));
INSERT INTO sc VALUES ('170102','030201',58,null);
INSERT INTO sc VALUES ('170102','030202',90,null);
INSERT INTO sc VALUES ('170102','030301',70,null);
INSERT INTO sc VALUES ('170102','010101',85,null);
INSERT INTO sc VALUES ('170102','010102',68,null);
INSERT INTO sc VALUES ('170102','010103',80,null);
INSERT INTO sc VALUES ('170102','010201',78,null);
INSERT INTO sc VALUES ('170103','030101',88,default);
INSERT INTO sc VALUES ('170103','030102',80,default);
INSERT INTO sc VALUES ('170103','030202',76,default);
INSERT INTO sc VALUES ('170103','010101',90,default);
INSERT INTO sc VALUES ('170103','010102',83,null);
INSERT INTO sc VALUES ('170103','010103',55,null);
INSERT INTO sc VALUES ('170103','010201',77,null);
INSERT INTO sc VALUES ('170104','030101',null,null);
INSERT INTO sc VALUES ('170105','030101',null,null);
INSERT INTO sc VALUES ('170108','030101',90,null);
INSERT INTO sc VALUES ('170108','030102',87,null);
INSERT INTO sc VALUES ('170108','030202',78,null);
INSERT INTO sc VALUES ('170108','010101',57,null);
INSERT INTO sc VALUES ('170108','010102',56,null);
INSERT INTO sc VALUES ('170108','010103',54,null);
INSERT INTO sc VALUES ('170108','010201',50,null);
INSERT INTO sc VALUES ('170110','030101',90,default);
INSERT INTO sc VALUES ('170110','030102',90,default);
INSERT INTO sc VALUES ('170110','010101',88,default);
INSERT INTO sc VALUES ('170110','010102',88,default);
INSERT INTO sc VALUES ('170110','010103',77,default);
INSERT INTO sc VALUES ('170201','030101',88,null);
INSERT INTO sc VALUES ('170201','030102',83,null);
INSERT INTO sc VALUES ('170201','020101',79,null);
INSERT INTO sc VALUES ('170201','020102',84,null);
INSERT INTO sc VALUES ('170201','020201',75,null);
INSERT INTO sc VALUES ('170201','020202',80,null);
INSERT INTO sc VALUES ('170201','020301',82,null);
INSERT INTO sc VALUES ('170201','020302',53,null);
INSERT INTO sc VALUES ('170201','020401',78,null);
INSERT INTO sc VALUES ('170201','020402',58,null);
INSERT INTO sc VALUES ('170202','030101',86,null);
INSERT INTO sc VALUES ('170202','030102',82,null);
INSERT INTO sc VALUES ('170202','020101',90,null);
INSERT INTO sc VALUES ('170202','020102',85,null);
INSERT INTO sc VALUES ('170202','020201',80,null);
INSERT INTO sc VALUES ('170202','020202',78,null);
INSERT INTO sc VALUES ('170202','020203',75,null);
INSERT INTO sc VALUES ('170202','020301',70,null);
INSERT INTO sc VALUES ('170202','020302',68,null);
INSERT INTO sc VALUES ('170202','020401',80,null);
INSERT INTO sc VALUES ('170202','020402',56,null);
INSERT INTO sc VALUES ('170203','030101',null,null);
INSERT INTO sc VALUES ('170203','030102',null,null);
INSERT INTO sc VALUES ('170205','030101',80,null);
INSERT INTO sc VALUES ('170205','030102',55,null);
INSERT INTO sc VALUES ('170205','020101',50,null);
INSERT INTO sc VALUES ('170205','020102',96,null);
INSERT INTO sc VALUES ('170205','020201',80,null);
INSERT INTO sc VALUES ('170205','020202',85,null);
INSERT INTO sc VALUES ('170205','020203',60,null);
INSERT INTO sc VALUES ('170205','020301',88,null);
INSERT INTO sc VALUES ('170205','020302',92,null);
INSERT INTO sc VALUES ('170205','020401',65,null);
INSERT INTO sc VALUES ('170205','020402',70,null);
INSERT INTO sc VALUES ('170205','020501',80,null);
INSERT INTO sc VALUES ('170207','030101',null,null);
INSERT INTO sc VALUES ('170207','030102',null,null);
INSERT INTO sc VALUES ('170208','030101',60,null);
INSERT INTO sc VALUES ('170208','030102',null,null);
INSERT INTO sc VALUES ('170208','020101',null,null);
INSERT INTO sc VALUES ('170208','020102',null,null);
INSERT INTO sc VALUES ('170208','020201',null,null);
INSERT INTO sc VALUES ('170208','020202',null,null);
INSERT INTO sc VALUES ('170208','020301',null,null);
INSERT INTO sc VALUES ('170208','020302',null,null);
INSERT INTO sc VALUES ('170208','020401',null,null);
INSERT INTO sc VALUES ('170208','020402',null,null);
INSERT INTO sc VALUES ('170208','020501',null,null);
INSERT INTO sc VALUES ('170303','030101',90,null);
INSERT INTO sc VALUES ('170303','030102',88,null);
INSERT INTO sc VALUES ('170303','030201',92,null);
INSERT INTO sc VALUES ('170303','030202',93,null);
INSERT INTO sc VALUES ('170303','030301',94,null);
INSERT INTO sc VALUES ('170401','040101',82,null);
INSERT INTO sc VALUES ('170401','040102',80,null);
INSERT INTO sc VALUES ('170401','040103',83,null);
INSERT INTO sc VALUES ('170401','040201',89,null);
INSERT INTO sc VALUES ('170401','040202',70,null);
INSERT INTO sc VALUES ('170401','040301',null,null);
INSERT INTO sc VALUES ('170403','040201',95,null);
INSERT INTO sc VALUES ('170403','040202',88,null);
INSERT INTO sc VALUES ('170403','040301',80,null);
INSERT INTO sc VALUES ('170404','040101',95,null);
INSERT INTO sc VALUES ('170404','040102',91,null);
INSERT INTO sc VALUES ('170404','040103',89,null);
INSERT INTO sc VALUES ('170404','040201',93,null);
INSERT INTO sc VALUES ('170404','040202',92,null);
INSERT INTO sc VALUES ('170404','040301',88,null);
INSERT INTO sc VALUES ('170405','040102',70,null);
INSERT INTO sc VALUES ('170405','040201',58,null);
INSERT INTO sc VALUES ('170405','040202',66,null);
INSERT INTO sc VALUES ('170405','040301',77,null);
INSERT INTO sc VALUES ('170406','040101',55,null);
INSERT INTO sc VALUES ('170406','040102',65,null);
INSERT INTO sc VALUES ('170406','040301',75,null);
select sno,sname
from student
where age >= 20;
select sno,sname,2020-age
from student
where sname like '钱%' and sex = '男';
LIKE操作符的模式匹配
select cname
from course
where credit > 3;
select sname
from student
where dno is null;
select dname
from department
where homepage is null;
select avg(age)
from student
group by dno;
select sno,avg(score)
from sc
group by sno
having avg(score) is not null
order by avg(score) desc;
order by 列名 序;
select cno,avg(score)
from sc
group by cno
having avg(score) is not null
order by avg(score) desc;
select dno,count(cno)
from course
where cno is not null
group by dno
order by count(cno) desc;
select cno,count(sno)
from sc
where cno is not null and sno is not null
group by cno
order by count(sno) desc;
select sno,sname
from student
where dno in (select distinct dno
from department
where dname = '信息学院'
);
select cno,cname
from course
where dno in (select dno
from department
where dname = '软件学院'
);
select sno,sname
from student
where dno in (select dno
from student
where sname = '陈丽'
);
select sno,sname
from student
where age in (select age
from student
where sname = '张三'
);
select sno,sname
from student
where age in (select age
from student
where sname = '张三'
)
and dno not in (select dno
from student
where sname = '张三'
);
select cname
from course
where credit > (select credit
from course
where cname = '离散数学'
);
select count(sno)
from sc
where cno = (select cno
from course
where cname = '组合数学'
);
select sname
from student
where sno not in (select sno
from sc
where cno in (select cno
from course
where cname = '离散数学'
)
);
select cname
from course
where credit not in (select credit
from course
where cname = '算法设计与分析' or cname = '移动计算'
);
select cname
from course
where cno in (select cno
from sc
group by cno
having avg(score) >= 90
);
语句:select 表1/2.某,表1/2.某 … from (查询结果1) 表1 join (查询结果2) 表2 on (连接条件)
需要注意的是,自然连接是特殊的等值连接,等值连接只需指定两个属性相等,而自然连接是必须同名属性。本题中本来应该采取自然连接,但是postgreSQL不支持自然连接,所以这里其实是等值连接完成后在select里不选重复列。
select nametable.sno,sname,score
from (select sno,sname from student where sno in
(select sno from sc where cno in
(select cno from course where cname = '离散数学'))) nametable
join
(select sno,score from sc where cno in
(select cno from course where cname = '离散数学')) scoretable
on
(nametable.sno = scoretable.sno);
解法二:多个表一起查询,查询完之后就是一个新表,注意把各个字段串联起来的条件
select student.sno,student.sname,sc.score
from student,sc
where student.sno = sc.sno
and
sc.cno in (select course.cno
from course
where course.cname = '离散数学'
);
select course.cname,sc.score
from course,sc
where course.cno = sc.cno
and
sc.sno in (select student.sno
from student
where student.sname = '王兵'
);
select student.sname,course.cname,sc.score
from student,course,sc
where student.sno = sc.sno
and
sc.score < 60
and
course.cno = sc.cno;
select student.sname
from student
where student.sno in (select sno
from sc
where cno in (select cno
from course
where dno in (select dno
from department
where dname = '文学院'
)
)
);
select student.sname,course.cname
from student,course,sc
where student.dno in (select dno
from department
where dname = '信息学院'
)
and
sc.sno = student.sno
and
course.cno = sc.cno
and
course.dno in (select dno
from department
where dname = '信息学院'
);
select t1.sno,t2.cno
from (select student.sno
from student
) t1
left join
(select sc.sno,sc.cno
from sc
) t2
on
(t1.sno = t2.sno);
select t2.cname
from course t1,course t2
where t1.cname = '形式语言与自动机'
and
t2.cno = t1. cpno;
select t3.cname
from course t1,course t2,course t3
where t1.cname = '形式语言与自动机'
and
t2.cno = t1.cpno
and
t3.cno = t2.cpno;
select t2.cname
from course t1,course t2
where t1.cname = '编译原理'
and
t2.cpno = t1.cno;
select t3.cname
from course t1,course t2,course t3
where t1.cname = '离散数学'
and
t2.cpno = t1.cno
and
t3.cpno = t2.cno;
select cname
from course
where cpno is null;
select sname
from student
where sno not in (select sno
from sc
where cno in (select cno
from course
where cname = '形式语言与自动机'
)
)
select sname
from student
where sno in (select sno
from sc
where cno in (select cno
from course
where cname = '形式语言与自动机'
)
)
and
sno not in (select sno
from sc
where cno in (select cpno
from course
where cno in (select cno
from course
where cname = '形式语言与自动机'
)
)
);
select student.sname,sum(course.credit)
from student,course,sc
where student.sno = sc.sno
and
sc.cno = course.cno
group by student.sname
having sum(course.credit) >= 28;
select student.sno,student.sname
from student
where student.sno in (select sc.sno
from sc
group by sc.sno
having count(sc.cno) > 3
)
and
student.sno not in (select sc.sno
from sc
where score <= 85
);
select sname
from student
where sno in (select sno
from sc
where sno not in (select sno
from sc
where score < 60
)
group by sno
having count(cno) = 3
);
select department.dname,count(student.sno)
from department,student
where department.dno = student.dno
group by department.dno
having count(student.sno) > 6;
select sname
from student
where sno in (select sno
from sc
group by sno
having avg(score) > all(select avg(score)
from sc
group by sno
having sno in (select sno
from student
where sname = '王兵'
)
)
);
select sname
from student
where student.sno in (select sno
from sc
where cno in (select cno
from course
where cname = '离散数学'
)
)
and
student.sno in (select sno
from sc
where cno in (select cno
from course
where cname = '编译原理'
)
);
select avg(score)
from sc
where sno in (select sno
from student
where dno in (select dno
from department
where dname = '软件学院'
)
)
and
sno in (select sno
from sc
where cno in (select cno
from course
where cname = '离散数学'
)
);
select student.sname,student.age,department.dname
from student,department
where student.age not in (select age
from student
where dno in (select dno
from department
where dname = '软件学院'
)
)
and
department.dno = student.dno;
select department.dname,course.cname,count(sc.sno)
from department,course,sc,student
where department.dno = student.dno
and
sc.sno = student.sno
and
course.cno = sc.cno
group by department.dname,course.cname
having count(sc.sno) > 4;
group by不仅可以对一个字段进行聚合,还可以对多个字段的组合进行聚合
这里需要注意的是join的用法。join在inner join时可以不写,用字段相等的条件来代替,但是在出现left/right/full join 时就不能不用join了,此处有一个人的dno为null,如果再找dname的话就少了一行。
select t1.sno,t1.sname,t2.dname
from (select student.sno,student.sname,student.dno
from student
where student.sno in (select sno
from sc
where sc.cno in (select cno
from course
where course.cname = '高等数学'
)
)
and
student.sno not in (select sno
from sc
where sc.cno in (select cno
from course
where course.cname != '高等数学'
)
)
) t1
left join
department t2
on t1.dno = t2.dno;
查询结果和查询条件在同一个关系中——单表查询
查询结果在一个关系中,但查询条件用到了另一个关系——子查询,连接
查询结果不在同一个关系中——连接
select student.sname
from student
where student.sno in (select sno
from (sc
left join
course
on sc.cno = course.cno
) t1
group by sno
having (sum(t1.score*t1.credit)/sum(t1.credit)) < 70
);
in 与 exists的区别,某字段 in (某字段集合);exist (某查询结果集合是否为空),exist 可以表示一个存在量词,一般也只是遇到全称量词或者全称量词蕴含式时才会用到
※关系除法可以用exist来完成(仅考虑特殊的全称量词):
没有一门信息学院开设的课是他不选的——>不存在(信息学院开设的(不在他的选课单里面的))课
select student.sname
from student
where not exists (select *
from department,course
where (department.dname = '信息学院'
and
course.dno = department.dno
)
and
not exists (select *
from sc
where sc.sno = student.sno
and
course.cno = sc.cno
)
);
select t1.sname
from student t1
where not exists (select *
from sc t2
where (t2.sno in (select t3.sno
from student t3
where t3.sname = '杨佳伟'
)
and
not exists (select *
from sc t4
where t4.sno = t1.sno
and
t2.cno = t4.cno
)
)
);
create table press(
pno text primary key,
pname text,
address text,
pn text
);
create table books(
bno text primary key,
bname text,
aname text,
isbn text unique,
pno text references press(pno),
ver text,
pdate date
);
drop table books;
drop table press;
--外键中发起引用的表先删,被引用的表后删
create table press(
pno text,
pname text,
address text,
pn text
);
create table books(
bno text,
bname text,
aname text,
isbn text,
pno text,
ver text,
pdate date
);
alter table press
add primary key(pno);
alter table books
add primary key(bno),
add unique(isbn),
add foreign key(pno) references press(pno);
insert into press values('某出版社1','某出版社','某地','20001023'),
('某出版社2','某出版社','某地','20001023');
insert into books values('某编号1','某书','某人','某ISBN号1','某出版社1','某版本','2000-10-23'),
('某编号2','某书','某人','某ISBN号2','某出版社1','某版本','2000-10-23');
update press set address = '中国' where pno = '某出版社1';
delete from books;
delete from press;
对视图的更新可以唯一的转化为对于基本表的更新,那么更新是可以的
视图涉及聚集函数,那么更新一般是不被允许的
create view st as (select student.sname
from student,department,sc,course
where student.dno in (select dno
from department
where department.dname = '软件学院'
)
and
sc.sno = student.sno
and
sc.cno in (select cno
from course
where cname = '离散数学'
)
)
with check option;
insert into st values('刘铭帅');
这种更新即为非法的,为什么呢?因为我在这里给view加入了with check option的条件,这里view插入一个新的数据后,这个数据在表中的其他字段实际上是null,是不符合view的筛选条件的,所以不应该出现在view中。
运行结果:
这里按照题意就取消掉with check option了
create view avgs as (select course.cno,t1.avgg
from course left join (select sc.cno,avg(sc.score) as avgg
from sc
group by sc.cno
) t1
on
course.cno = t1.cno
);
在数据库中,向数据库中插入数据,使用insert into关键字。在数据库中插入数据有三种方法。
1)插入单个字段的情况
insert into table_name(列名) values(值);
2)插入多个字段的情况
2.1) 插入两个字段以上
insert into table_name(列名1,列名2,列名3,) values(值1,值2,值3);
2.2)插入全部所有字段
insert into table_name values(值1,值2,值3);//值要和表中的字段顺序类型一致
3)使用子查询向表中插入数据
insert into table_name 子查询select语句;//需要注意的是不能违反表table_name的约束条件,以及需要和table_name的字段一致,或者少于它,但是不能多于它。
create table s_score(sNo text unique not null,
sName text,
avgscore numeric(6,4)
);
insert into s_score (select student.sno,student.sname,t1.avgg
from student left join (select sc.sno,avg(sc.score) as avgg
from sc
group by sc.sno
) t1
on
t1.sno = student.sno
);
select * from s_score;
尝试将多条SQL语句组成一个事务执行,体验提交和回滚操作。
一个事务transaction由begin…commit包含的语句构成,回滚可以使用rollback语句。