数据库原理实验(openGauss)交互式SQL语句
Posted BkbK-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库原理实验(openGauss)交互式SQL语句相关的知识,希望对你有一定的参考价值。
交互式SQL语句
文章目录
一、数据准备
(1)向Departments中写入数据
由于是一个空表,先所有Dheadno
置为空
INSERT INTO Departments (Dno, Dname, Dheadno) VALUES
('CS','计算机',NULL),
('MA', '数学', NULL),
('PH', '物理', NULL),
('CH', '化学', NULL);
SELECT * FROM Departments;
(2)向Teachers中写入数据
INSERT INTO Teachers (Tno, Tname, Sex, Birthday, Title, Dno) VALUES
('05001', '张海峰','男', '1969-02-21', '教授', 'CS'),
('05002', '刘晓明','男', '1978-10-06', '副教授', 'CS') ,
('05003', '王梅','女', '1972-02-25', '副教授', 'CS'),
('05004', '赵青山','男', '1981-05-18', '讲师', 'CS'),
('06001', '朱杰','男', '1963-01-30', '教授', 'MA'),
('06002', '欧阳梅','女', '1970-8-11', '副教授', 'MA');
SELECT * FROM Teachers;
-
修改院系的Dheadno
UPDATE Departments SET Dheadno='05001' WHERE Dno='CS';
UPDATE Departments SET Dheadno='06001' WHERE Dno='MA';
(3)向Students中写入数据
INSERT INTO Students (Sno, Sname, Sex, Birthday, Speciality, Dno) VALUES
('201705001', '张华','男', '1999-12-16', '计算机', 'CS') ,
('201705002', '李玉','女', '1998-10-17', '计算机', 'CS') ,
('201705003', '欧阳山','男', '1999-05-24', '计算机', 'CS') ,
('201706001', '林艳', '女','1998-09-20', '数学', 'MA'),
('201706002', '高山','男','1997-08-16', '数学', 'MA') ,
('201706003', '王海洋','男', '1997-01-30', '数学', 'MA');
SELECT * FROM Students;
(4)向Courses中写入数据
INSERT INTO Courses (Cno, Cname, Period, Credit) VALUES
('CS101', '计算科学导论', 2, 1 ),
('CS102', 'C语言', 4, 3 ),
('CS201', '数据结构', 4, 3) ,
('CS202', '离散数学', 4, 3 ),
('CS301', '数据库原理', 4, 3);
SELECT * FROM Courses;
(5)向Teaches中写入数据
INSERT INTO Teaches (Tno, Cno,Tcscore) VALUES
('05001', 'CS101', 95 ),
('05002', 'CS101', 92) ,
('05003', 'CS101', 90 ),
('05004', 'CS102', 95 );
SELECT * FROM Teaches;
(6)向SC中写入数据
INSERT INTO SC(Sno, Cno, Grade) VALUES
('201705001', 'CS101', 89 ),
('201705002', 'CS101', 91 ),
('201705003', 'CS101', 80 ),
('201705001', 'CS102', 90 ),
('201705002', 'CS102', 87 ),
('201705003', 'CS102', 82 ),
('201705001', 'CS201', 88 ),
('201705002', 'CS201', 89 ),
('201705003', 'CS201', 90 ),
('201705001', 'CS202', 86 ),
('201705002', 'CS202', 85 ),
('201705001', 'CS301', 92 );
SELECT * FROM SC;
二、查询操作
SELECT 语句的一般形式如下:
1.不带 WHERE 的简单查询
-
查询所有课程的信息
SELECT Cno , Cname, Period, Credit FROM Courses;
SELECT * FROM Courses;
-
显示每位学生的年龄:
SELECT Sname, 2021-date_part('year',Birthday) AS Age FROM Students;
2.带 WHERE 的查询
<1>WHERE表达式
-
查询职称 (Title) 为讲师的全体教师的姓名和性别。
SELECT Tname, Sex FROM Teachers WHERE Title='讲师';
-
查询考试成绩不及格的学生的学号。
SELECT DISTINCT Sno FROM SC WHERE Grade<60;
-
查询出生年份在 1997~1999 年的学生的姓名和专业。
SELECT Sname , Speciality FROM Students WHERE date_part('year',Birthday) BETWEEN 1997 AND 1999;
SELECT Sname , Speciality FROM Students WHERE date_part('year',Birthday)>=1997 AND date_part('year',Birthday)<=1999;
-
查询出生年份不在 1997~1999 年的学生的姓名和专业。
SELECT Sname , Speciality FROM Students WHERE date_part('year',Birthday) NOT BETWEEN 1997 AND 1999 ;
SELECT Sname , Speciality FROM Students WHERE date_part('year',Birthday)<1997 OR date_part('year',Birthday)>1999;
<2>IN 表达式
-
查询计算机和软件工程专业的学生的学号和姓名。
SELECT Sno , Sname FROM Students WHERE Speciality IN ('计算机', '软件工程') ;
-
查询既不是计算机,也不是软件工程专业的学生的学号和姓名。
SELECT Sno , Sname FROM Students WHERE Speciality NOT IN ('计算机', '软件工程') ;
<3>LIKE 表达式
-
查询所有以“数据“开头的课程名。
SELECT Cname FROM Courses WHERE Cname LIKE '数据%';
<4>NULL 表达式
-
查询院长号为空的院系号和院系名。
SELECT Dno , Dname FROM Departments WHERE Dheadno IS NULL;
3.排序和分组
<1>排序
-
查询每位学生 CS202 课程的成绩,并将查询结果按成绩降序排序。
SELECT* FROM SC WHERE Cno='CS202' ORDER BY Grade DESC;
-
查询每位学生的每门课程的成绩,并将查询结果按课程号升序、成绩降序排序。
SELECT * FROM SC ORDER BY Cno, Grade DESC;
<2>聚集函数
-
查询选修了 CS101 课程的学生的人数。
SELECT COUNT(*) FROM SC WHERE Cno='CS101';
-
查询 CS101 课程成绩最低分、平均分和最高分。
SELECT MIN (Grade), AVG (Grade) , MAX (Grade) FROM SC WHERE Cno ='CS101';
<3>分组
-
查询每个学生的平均成绩,输出学生的学号和平均成绩。
SELECT Sno,AVG(Grade) FROM SC GROUP BY Sno;
-
查询每个学生的平均成绩,并输出平均成绩大于85分的学生学号和平均成绩。
SELECT Sno,AVG(Grade) FROM SC GROUP BY Sno HAVING AVG(Grade)>85;
4.连接查询
-
查询学号为 201705001 的学生的各科成绩,对每门课程显示课程名和成绩。
SELECT Cname,Grade FROM SC,Courses WHERE Sno='201705001' AND SC.Cno=Courses.Cno;
-
查询选修 CS202 课程,并且成绩在 90 分以上的所有学生的学号、姓名和成绩。
SELECT SC.Sno,Sname,Grade FROM SC,Students WHERE Cno='CS202' AND Grade>90 AND SC.Sno=Students.Sno;
-
查询每个学生选修的每门课程的成绩,要求列出学号、姓名、课程名和成绩。
SELECT Students.Sno, Sname, Cname, Grade
FROM Students, SC, Courses
WHERE Students.Sno = SC. Sno AND SC.Cno = Courses.Cno;
-
查询每个学生的平均成绩,并输出平均成绩大于 85 分的学生学号、姓名和平均成绩。
SELECT Students.Sno, Sname, AVG (Grade) FROM SC, Students WHERE Students.Sno = SC. Sno GROUP BY Students.Sno, Sname HAVING AVG (Grade) >85;
-
查询和林艳出生年份相同的学生的姓名
SELECT S2.Sname FROM Students S1,Students S2 WHERE S1.Sname='林艳' AND date_part('year',S1.Birthday)=date_part('year',S2.Birthday) AND S2.Sname <>'林艳';
5.嵌套查询
<1>IN 引出的子查询
-
查询和林艳在同一个专业学习的男同学的学号与姓名。
SELECT Sno , Sname FROM Students WHERE Sex='男' AND Speciality IN (SELECT Speciality FROM Students WHERE Sname ='林艳') ;
<2>集合的比较引出的子查询
-
查询比计算机专业所有学生都大的其他专业的学生的学号、姓名、专业和出生日期。
SELECT Sno , Sname, Speciality, date_part('year',Birthday) FROM Students WHERE Speciality <>'计算机' AND date_part('year',Birthday)<ALL (SELECT date_part('year',Birthday) FROM Students WHERE Speciality ='计算机');
SELECT Sno , Sname, Speciality, date_part('year',Birthday) FROM Students WHERE Speciality <>'计算机' AND date_part('year',Birthday)<ALL (SELECT MIN(date_part('year',Birthday)) FROM Students WHERE Speciality ='计算机');
-
查询平均成绩最高的课程的课程号和平均成绩。
SELECT Cno , AVG(Grade) FROM SC GROUP BY Cno HAVING AVG(Grade) >= ALL (SELECT AVG(Grade) FROM SC GROUP BY Cno) ;
<3>存在量词引出的子查询
-
查询所有选修了 CS101 课程的学生的学号和姓名。
SELECT Sno, Sname FROM Students S WHERE EXISTS (SELECT * FROM SC WHERE Sno=S.Sno AND Cno='CS101');
-
查询选修了全部课程的学生的学号和姓名。
SELECT Sno , Sname FROM Students S WHERE NOT EXISTS (SELECT * FROM Courses C WHERE NOT EXISTS (SELECT * FROM SC WHERE SC . Sno= S . Sno AND SC . Cno= C. Cno)) ;
-
查询至少选修了学号为 201705002学生选修的全部课程的学生的学号和姓名。
SELECT Sno , Sname FROM Students S WHERE NOT EXISTS (SELECT * FROM SC SC1 WHERE SC1.Sno = '201705002 'AND NOT EXISTS (SELECT * FROM SC SC2 WHERE SC2.Sno=S.Sno AND SC2 . Cno=SC1. Cno));
6.集合运算
并 (UNION
) 、交 (INTERSECT
) 差 (EXCEPT
)
-
查询选修 CS101 号课程或者选修 CS102 号课程 学生的学号。
SELECT Sno FROM SC WHERE Cno= ' CS101' UNION SELECT Sno FROM SC WHERE Cno= 'CS102';
三、更新操作
1.插入
INSERT INTO Students
VALUES ('201905001', 'BK','男', '2000-01-01','2019',' 计算机','CS');
2.修改
UPDATE Students
SET Birthday='2000-11-11'
WHERE Sno='20190501';
SELECT * FROM Students;
3.删除
DELETE FROM Students
WHERE Sno='201905001';
SELECT * FROM Students;
以上是关于数据库原理实验(openGauss)交互式SQL语句的主要内容,如果未能解决你的问题,请参考以下文章