当前位置: 首页 > news >正文

实验三 多表查询和子查询

世界很大                

     世界也很小

一、实验目的和要求 

  1. 了解查询的概念和方法;

  2. 掌握查询分析器的使用方法;

  3. 掌握SELECT语句在单表查询中的应用;

  4. 掌握复杂查询的使用方法;

  5. 掌握多表连接的方法;

  6. 掌握SELECT语句在多表查询中的应用;

  7. 掌握子查询语句。

二、实验内容和步骤 

(一)多表查询

        数据库的各个表中存放着不同的数据,用户经常需要用多个表中的数据来组合提炼出所需要的信息,如果一个查询需要对多个表进行操作,就称为联表查询,联表查询的结果集或结果表称为表之间的连接。联表查询实际上是通过各各表之间共同列的关联来查询数据的,它是关系数据库查询最基本的特征。
        按照下表所示,分别在数据库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

三、结语

        希望这篇文章能帮助到正在进行类似作业的同学,一些有错误的地方还请大家指出,期待与你的下次相见

相关文章:

  • js的es6模块中 暴露的使用方法简介
  • 鸿蒙开发01
  • 三周年创作纪念日
  • WinForm真入门(15)——NumericUpDown控件详解
  • 《灵活的接口设计:如何支持多种后端数据存取实现》
  • Java 在人工智能领域的突围:从企业级架构到边缘计算的技术革新
  • 软考高级系统架构设计师-第11章 系统架构设计
  • c# AI编程助手 — Fitten Code
  • 分布式微服务系统架构第106集:jt808,补充类加载器
  • 车载软件架构 ---单个ECU的AUTOSAR开发流程
  • 如何通过技术手段降低开发成本
  • c语言jni实战,双系统
  • springboot和springcloud的区别
  • 【Linux】Linux下的gcc/g++编译器与动静态库
  • #3 物联网 的标准
  • 巴法云平台-TCP设备云-微信小程序实时接收显示数据-原理
  • 生态环境影响评价技术体系构建与图件智能化实现‌‌—以内蒙古风电场建设项目为例
  • MySQL ROUND(number, decimals)
  • 访问不到服务器上启动的llamafactory-cli webui
  • 使用命令打开电脑的[服务]窗口
  • 科普书单·新书|鸟界戏精观察报告
  • 解放日报:128岁的凤凰自行车“双轮驱动”逆风突围
  • 大学2025丨浙大哲学院院长王俊:文科的价值不在于直接创造GDP
  • 电动自行车新国标将于9月1日落地,首批6家检测机构出炉
  • 全国类脑智能产业创新发展推进会在上海召开
  • 海南一男子涨潮时赶海与同伴走散,警民协同3小时将其救上岸