实验三 多表查询和子查询
世界很大
世界也很小
一、实验目的和要求
-
了解查询的概念和方法;
-
掌握查询分析器的使用方法;
-
掌握SELECT语句在单表查询中的应用;
-
掌握复杂查询的使用方法;
-
掌握多表连接的方法;
-
掌握SELECT语句在多表查询中的应用;
-
掌握子查询语句。
二、实验内容和步骤
(一)多表查询
数据库的各个表中存放着不同的数据,用户经常需要用多个表中的数据来组合提炼出所需要的信息,如果一个查询需要对多个表进行操作,就称为联表查询,联表查询的结果集或结果表称为表之间的连接。联表查询实际上是通过各各表之间共同列的关联来查询数据的,它是关系数据库查询最基本的特征。
按照下表所示,分别在数据库test中构造student、course和student_course三张表,并写入记录。
在此之前,我们先进行一下准备工作,将需要的信息和表格准备好
CREATE TABLE student(
学号 VARCHAR(8),
学生姓名 VARCHAR(8),
性别 VARCHAR(2),
年龄 SMALLINT,
班级号 CHAR(6),
入学时间 DATE,
家庭住址 VARCHAR(40)
);
CREATE TABLE Course(
课程号 char(10),
课程名称 VARCHAR(20),
课程总学时 TINYINT,
课程学分 TINYINT
);
CREATE TABLE Student_course(
课程号 char(10),
学号 char(20),
成绩 TINYINT
);
INSERT INTO student VALUES
('20230101', '张三', '男', 20, 'jk1', '2023-09-01', '北京市海淀区'),
('20230102', '李四', '女', 21, 'dx2', '2023-09-01', '上海市徐汇区'),
('20230103', '王五', '男', 19, 'dx1', '2024-03-01', '广东省广州市'),
('20230104', '赵六', '女', 22, 'jk1', '2022-09-01', '天津市南开区'),
('20230105', '钱七', '男', 20, 'dx2', '2023-09-01', '山东泰安'),
('20230106', '孙八', '女', 21, 'dx1', '2024-03-01', '浙江省杭州市'),
('20230107', '周九', '男', 19, 'jk1', '2022-09-01', '江苏省南京市'),
('20230108', '吴十', '女', 23, 'dx2', '2021-09-01', '北京市昌平区');
INSERT INTO course (课程号, 课程名称, 课程总学时, 课程学分)
VALUES
('CS1001', '计算机导论', 32, 3),
('CS1002', '数据结构', 48, 4),
('CS1003', '操作系统', 40, 3),
('CS1004', '计算机网络', 36, 3),
('CS1005', '数据库原理', 44, 4),
('CS1006', '编译原理', 50, 4),
('CS1007', '人工智能', 42, 3),
('CS1008', '算法分析与设计', 40, 4);
INSERT INTO student_course (课程号, 学号, 成绩)
VALUES
('CS1001', '20230101', 85),
('CS1002', '20230101', 88),
('CS1003', '20230101', 90),
('CS1002', '20230102', 92),
('CS1004', '20230102', 85),
('CS1005', '20230102', 80),
('CS1003', '20230103', 78),
('CS1005', '20230103', 85),
('CS1007', '20230103', 70),
('CS1001', '20230104', 87),
('CS1004', '20230104', 75),
('CS1008', '20230104', 92),
('CS1005', '20230105', 95),
('CS1006', '20230105', 80),
('CS1007', '20230105', 78),
('CS1006', '20230106', 88),
('CS1008', '20230106', 84),
('CS1002', '20230106', 77),
('CS1001', '20230107', 80),
('CS1003', '20230107', 83),
('CS1007', '20230107', 75),
('CS1004', '20230108', 92),
('CS1005', '20230108', 85),
('CS1008', '20230108', 89);
1.进行多表查询
从student、course和student_course三张表中检索选修了课程的学生的学号、姓名、课程号、课程名及成绩。
SELECT a.`学号`,a.`学生姓名`,b.课程号,b.课程名称,c.成绩
FROM student a,course b,student_course c
WHERE c.`学号` = a.`学号` AND b.`课程号`=c.`课程号`
2.用GROUP子句进行查询
如果要在数据检索时对表中数据按照一定条件进行分组汇总或求平均值,就要在SELECT语句中与GROUP BY子句一起使用集合函数。使用GROUP BY子句进行数据检索可得到数据分类的汇总统计、平均值或其他统计信息。
(1)使用不带HAVING的GROUP BY子句。 汇总出student_course表中的学生的学号及总成绩
SELECT 学号, SUM(成绩) '总成绩'
FROM Student_course
GROUP BY `学号`
⑵ 使用带HAVING 的GROUP BY子句。汇总出student_course表中总分大于240分的学生的学号及总成绩
SELECT 学号, (SUM(成绩)) '总成绩'
FROM Student_course
GROUP BY `学号`
HAVING 总成绩 > 240
(二)子查询
1.使用IN或NOT IN关键字
SELECT a.`学号`,c.`课程号`,c.`成绩`
FROM student a,course b,student_course c
WHERE a.`学号`=c.`学号` AND b.`课程号` = c.`课程号` AND
a.`班级号` IN('jk1','dx2','dx1') AND
a.`性别` = '男'
ORDER BY a.`班级号`
2.使用EXISTS 或NOT EXISTS关键字
使用EXISTS关键字查询出‘jk1’班选修‘数据结构’课程的学生的学号、姓名;使用NOT EXISTS查询出‘jk1’班没有选修‘数据结构’课程的学生的学号、姓名。
SELECT a.`学号`,a.`学生姓名`
FROM student a, course b,student_course c
WHERE a.`学号` = c.`学号` AND b.`课程号` = c.`课程号`
AND b.`课程名称` = '数据结构'
AND EXISTS (
SELECT *
FROM student a2
WHERE a2.`学号` = a.`学号`
AND a2.`班级号` = 'jk1'
);
NOT EXISTS :
SELECT a.`学号`,a.`学生姓名`
FROM student a, course b,student_course c
WHERE a.`学号` = c.`学号` AND b.`课程号` = c.`课程号`
AND a.`班级号` = 'jk1'
AND NOT EXISTS (
SELECT 1
FROM student aa, course bb,student_course cc
WHERE aa.`学号` = cc.`学号` AND bb.`课程号` = cc.`课程号`
AND aa.`学号` = a.`学号`
AND bb.`课程名称`='数据结构'
);
小结:在用 EXISTS 时,需要注意,它的后面是接一个检测语句,只要它后面的 ( ) 内的命令能查询到一条数据,那么就认为他是EXISTS
三、结语
希望这篇文章能帮助到正在进行类似作业的同学,一些有错误的地方还请大家指出,期待与你的下次相见