数据库原理实验(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语句的主要内容,如果未能解决你的问题,请参考以下文章

数据库原理实验(openGauss)实验报告

数据库原理实验(openGauss)金融场景化实验

数据库原理实验(openGauss)金融场景化实验

数据库原理实验(openGauss)视图

数据库原理实验(openGauss) 使用JDBC连接数据库

数据库原理实验(openGauss) 使用JDBC连接数据库