【狂神】MySQL - 连表查询 Join On 详解

news2024/11/27 22:28:17

1. 连表查询详解

 市面上有 7 种连表查询, 总共归为三大类 : 

  • 左查询 LEFT JOIN    -- 以左表为基准
  • 右查询 RIGHT JOIN   --  以右表为基准
  • 交叉查询 INNER JOIN  -- 查询两表都有的数据
操作描述
inner  join如果表中至少有一个匹配, 就返回行
left  join会从左表中返回所有的值, 即使右表中没有匹配
right  join会从右表中返回所有的值, 即使左表中没有匹配

【测试数据】

1. 创建并使用 school 数据库.

CREATE DATABASE if NOT EXISTS `school`;

USE DATABASE;

2. 创建 grade 表 (年级表 ) 并构造数据.

DROP TABLE IF EXISTS `grade`;

CREATE TABLE `grade`(
    `GradeID` INT(11) NOT NULL AUTO_INCREMENT COMMENT '年级编号', 
    `GradeName` VARCHAR(50) NOT NULL COMMENT '年纪名称',
    PRIMARY KEY (`GradeID`)
) ENGINE = INNODB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

INSERT INTO grade(GradeID,GradeName) VALUES(1,'大一');
INSERT INTO grade(GradeID,GradeName) VALUES(2,'大二');
INSERT INTO grade(GradeID,GradeName) VALUES(3,'大三');
INSERT INTO grade(GradeID,GradeName) VALUES(4,'大四');
INSERT INTO grade(GradeID,GradeName) VALUES(5,'预科班');

3.  创建 result 表 (成绩表) 并构造数据.

DROP TABLE IF EXISTS `result`;

CREATE TABLE `result`(
    `StudentNo` INT(4) NOT NULL COMMENT '学号',
    `SubjectNo` INT(4) NOT NULL COMMENT '课程编号',
    `ExamDate` DATETIME NOT NULL COMMENT '考试时间',
    `StudentResult` INT(4) NOT NULL COMMENT '考试成绩',
    KEY `SubjectNo` (`subjectNo`)
)ENGINE=INNODB DEFAULT CHARSET = utf8;

INSERT INTO `result`(`studentno`,`subjectno`,`examdate`,`studentresult`)
VALUES
(1000,1,'2023-06-25 09:00:00',85),
(1000,2,'2013-06-26 09:00:00',70),
(1000,3,'2013-06-27 09:00:00',68),
(1000,4,'2013-06-28 16:00:00',98),
(1000,5,'2013-06-29 16:00:00',68),
(1001,6,'2013-06-30 16:00:00',78),
(1002,7,'2013-07-01 16:00:00',88);

4. 创建 student 表 (学生表) 并构造数据.

DROP TABLE IF EXISTS `student`;

CREATE TABLE student(
    `StudentNo` INT(4) NOT NULL COMMENT '学号' ,
    `Loginpwd` VARCHAR(20) DEFAULT NULL COMMENT '密码',
    `StudentName` VARCHAR(20) DEFAULT NULL COMMENT '学生姓名',
    `Sex` TINYINT DEFAULT NULL COMMENT '性别,0/1',
    `Gradeid` INT(11) DEFAULT NULL COMMENT '年纪编号',
    `Phone` VARCHAR(50) NOT NULL COMMENT '联系电话,不允许为空', 
    `Address` VARCHAR(255) NOT NULL COMMENT '地址,不允许为空', 
    `BornDate` DATETIME DEFAULT NULL COMMENT '出生时间', 
    `Email` VARCHAR(50) NOT NULL COMMENT '邮箱账号,不允许为空',
    `IdentityCard` VARCHAR(18) DEFAULT NULL COMMENT '身份证号', 
    PRIMARY KEY (`StudentNO`),  -- 主键
    UNIQUE KEY `IdentityCard` (`IdentityCard`), -- 唯一索引
    KEY `Email` (`Email`)        -- index索引
) ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO `student` (`studentno`,`loginpwd`,`studentname`,`sex`,`gradeid`,`phone`,`address`,`borndate`,`email`,`identitycard`)
VALUES
(1000,'123456','张伟',0,2,'13800001234','北京朝阳','1980-1-1','text123@qq.com','123456434334011234'),
(1001,'123456','郭德',0,2,'13832343234','北京朝阳','1980-1-1','text123@qq.com','123456194001011234'),
(1002,'123456','李振',0,2,'13854325234','北京朝阳','1980-1-1','text123@qq.com','123456123001011234'),
(1003,'123456','刘强',0,2,'12130021234','北京朝阳','1980-1-1','text123@qq.com','123456193141011234'),
(1004,'123456','马云',0,2,'13832131234','北京朝阳','1980-1-1','text123@qq.com','123454332001011234'),
(1005,'123456','赵青',0,2,'13545441234','北京朝阳','1980-1-1','text123@qq.com','123456142101011234'),
(1006,'123456','赵强',1,3,'13805445222','广东深圳','1990-1-1','text111@qq.com','123132131301011233');

5. 创建 subject 表 (学科表)  并构造数据.

CREATE TABLE `subject`(
    `SubjectNo` INT(11) NOT NULL AUTO_INCREMENT COMMENT '课程编号',
    `SubjectName` VARCHAR(50) DEFAULT NULL COMMENT '课程名称',
    `ClassHour` INT(4) DEFAULT NULL COMMENT '学时',
    `GradeID` INT(4) DEFAULT NULL COMMENT '年纪编号',
    PRIMARY KEY(`SubjectNo`)
) ENGINE = INNODB DEFAULT CHARSET=utf8;

INSERT INTO `subject`(`subjectno`,`subjectname`,`classhour`,`gradeid`)VALUES
(1,'高等数学-1',110,1),
(2,'高等数学-2',110,2),
(3,'高等数学-3',100,3),
(4,'高等数学-4',130,4),
(5,'C语言-1',110,1),
(6,'C语言-2',110,2),
(7,'C语言-3',100,3),
(8,'C语言-4',130,4),
(9,'Java程序设计-1',110,1),
(10,'Java程序设计-2',110,2),
(11,'Java程序设计-3',100,3),
(12,'Java程序设计-4',130,4),
(13,'数据库结构-1',110,1),
(14,'数据库结构-2',110,2),
(15,'数据库结构-3',100,3),
(16,'数据库结构-4',130,4),
(17,'C#基础',130,1);

2. 连表查询示例

1. 查询参加了考试的同学 (查询列 : 学号, 姓名, 科目编号, 分数) -- 两表

【思路】

1. 分析查询的字段来自哪些表.

2. 确定使用哪种连接查询. 

3. 确定交叉点 (这两个表中哪些数据是相同的).

4. 写判断条件 : 学生表中的 StudentNo = 成绩表中的 StudentNo.

5. 根据需求增加 where 等值查询. (可有可无)

  • 上述字段分别来自 student 表 (学号,姓名) 和 result 表 (科目编号,分数)
  • 因为需要查询参加考试的同学, 而学生表中有些学生是没有参加考试的, 所以以成绩表为基准, 所以使用右连接查询.

【SQL 实现】

-- RIGHT JOIN
SELECT s.StudentNo,StudentName,SubjectNo,StudentResult
FROM `student` s
RIGHT JOIN `result` r
ON s.StudentNo = r.StudentNo;

 

 如果使用左查询, 将会把没有参加考试的同学的行也查询出来, 就不符合题目要求 (查询参加考试的同学).

2.  查询缺考的同学 (学号, 姓名, 科目编号, 分数) -- 两表

【思路】

1. 分析查询的字段来自哪些表.

2. 确定使用哪种连接查询. 

3. 确定交叉点 (这两个表中哪些数据是相同的).

4. 写判断条件 : 学生表中的 StudentNo = 成绩表中的 StudentNo.

5. 根据需求增加 where 等值查询 (可有可无).

  • 上述字段分别来自 student 表 (学号,姓名) 和 result 表 (科目编号, 分数)
  • 因为题目需要查询未参加考试的同学, 而成绩表中只有参加了考试的同学, 所以以左表为基准, 所以使用左连接查询.

【SQL 实现】

-- LEFT JOIN
SELECT s.StudentNo,StudentName,SubjectNo,StudentResult
FROM `student` s
LEFT JOIN `result` r
ON s.StudentNo = r.StudentNo
WHERE StudentResult IS NULL;

3. 查询参加考试的同学信息(学号, 学生姓名, 科目名称, 分数)-- 三表

【思路】

1. 分析查询的字段来自哪些表.

2. 确定使用哪种连接查询. 

3. 确定交叉点 (这两个表中哪些数据是相同的).

4. 写判断条件 : 学生表中的 StudentNo = 成绩表中的 StudentNo.  成绩表中的 SubjectNo = 学科表中的 SubjectNo.

5. 根据需求增加 where 等值查询 (可有可无).

  • 上述字段分别来自 student 表 (学号,姓名) ,result 表 (分数) 和 subject 表 (科目名称)
  • 先查 student , rersult 两张表, 再连 subject 第三张表.
  • 对于 student 和 result 表, 要查询参加考试的同学, 使用右连接, 而对于这两张表查询出来的结果和 subject 进行连表查询时, 没有以哪张表为基准, 所以使用 inner join 就可以了.

【SQL 实现】

1. 先查 student 表 和 result 表

SELECT s.StudentNo,StudentName,SubjectNo,StudentResult
FROM student s
RIGHT JOIN result r
ON s.StudentNo = r.StudentNo;

2. 再拿着查询结果与 subject 表进行连表查询

完整 SQL :

SELECT s.StudentNo '学号',StudentName '姓名',
	SubjectName '科目名称',StudentResult '考试成绩'
FROM student s
RIGHT JOIN result r
ON s.StudentNo = r.StudentNo
INNER JOIN `subject` sub
ON sub.SubjectNo = r.SubjectNo;

【总结】

整体查询思路 : 

1. 我要查询哪些数据  -> SELECT ...

2. 需要从哪几张表中查数据  -> FROM 表  XXX Join 连接的表 on  交叉条件.

3. 假设存在多张表 (> 2) 的查询,  先连接两张表进行查询, 再慢慢增加其他表.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/720006.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于django的数据可视化展现

今天给大家简单分享一下一个基于python的django的框架写的一个数据可视化的项目。 主要涉及技术:django基础,python基础,前端(html,echars)基础。 这个项目自然而然是基于python逻辑语言处理的&#xff0…

好选客干货分享:化纤长丝找外贸客户

化纤长丝概述 化纤长丝是将聚合物材料(如:聚酯、聚酰胺、聚酰胺酯等)通过化学反应和纺丝工艺转化制成的连续的细长纤维,具有低成本、高强度、高弹性的优点,与天然纤维相比,其抗皱性和耐磨性也更胜一筹&…

隐秘的角落——proxychains代理工具

互联网只因你太美,自千禧年之后影响了数十年,无数的弄潮儿和狂热者为你痴迷,也有不尽的黑子们就安全问题而争议。直到现在,HTTPS、SSH、SOCKS、VPN、IPsec等技术逐渐为大众所接受,无法割舍。而这次,我将介绍…

防止网络断联,双机热备这么部署就对了

你们好,我的网工朋友。 防火墙的基本功能、配置案例、怎么提升网络的可靠性,给你说过不少。 但有小友留言说,双机热备的知识点,好像没有系统讲过,我去翻了翻,还真是。 为了保证网络的不间断传输&#xf…

浅谈有源电力滤波器及配电能效平台在污水处理厂中的应用

【摘要】为减少污水处理设备产生的各次谐波,通过确定主要谐波源,检测和计算谐波分量,采用有源电力滤波器进行谐波治理,大幅降低了电力系统中的三相电流畸变率,提高了电能质量;抑制了谐波分量,减…

顺序表与链表

思维导图: 顺序表与链表都是两种线性表,但是两者之间又有着许多的不同。顺序表是一种连续的空间,实际上就是数组。链表是不连续的空间,链表的空间是一块一块的开辟出来的。 两者的优点与缺点: 顺序表: 优点…

86、基于STM32的电动车 小车蓄电池锂电池充电桩系统设计(程序+原理图+PCB源文件+硬件资料+元器件清单等)

单片机主芯片选择方案 方案一:AT89C51是美国ATMEL公司生产的低电压,高性能CMOS型8位单片机,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元&a…

云计算——虚拟化层架构

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​ 前言 本章将会讲解云计算的虚拟化层架构,了解云计算虚拟化层都有哪些架构模式…

23. 销售额完成任务指标的商品

文章目录 题目需求存在的疑问实现一题目来源 题目需求 商家要求每个商品每个月需要售卖出一定的销售总额 假设1号商品销售总额大于21000,2号商品销售总额大于10000,其余商品没有要求 请写出SQL从订单详情表中(order_detail)查询连…

多元分类预测 | Matlab基于深度置信网络DBN的分类预测,多特征输入模型,DBN分类预测

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述

MySQL的match函数在sp中使用的BUG解析

一、问题发现 在一次开发中在sp中使用MySQL PREPARE以后,使用match AGAINST语句作为prepare stmt的参数后,发现执行第二遍call会导致数据库crash,于是开始动手调查问题发生的原因。 注:本次使用的 MySQL 数据库版本为最新的debug…

文件改名神器!简体中文一键翻译为繁体中文并智能保存到指定文件夹!

在这个简繁转换教程中,您将学习如何使用简单的方法将简体中文文件快速翻译为繁体中文,并将其保存至指定的文件夹中。无需复杂的翻译软件或多步操作,只需跟随以下步骤,您就能实现简繁转换的便捷保存。 首先第一步,我们…

机器学习一:线性回归

1 知识预警 1.1 线性代数 ( A T ) T A (A^\mathrm{T})^\mathrm{T}A (AT)TA$ ( A B ) T A T B T (AB)^\mathrm{T}A^\mathrm{T}B^\mathrm{T} (AB)TATBT ( λ A ) T λ A T (\lambda A)^\mathrm{T}\lambda A^\mathrm{T} (λA)TλAT ( A B ) T B T A T (AB)^\mathrm{T}B^…

C#加载 ToolBlock简单示例

可以用visionpro的VPPVersion.exe 工具查看文件格式。 在安装路径最后一个 官方示例文件路径 简单实例 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; …

Spark学习(二)---Spark运行架构和核心概念

1.Spark运行架构 Spark框架的核心是一个计算引擎,它采用了master-slave的结构。 图形中的 Driver 表示 master, 负责管理整个集群中的作业任务调度。图形中的 Executor 则是 slave,负责实际执行任务。 1.1 核心组件 由此可以得出&#xf…

接口(Interface)

接口 基本介绍 接口就是给出一些没有实现的方法,封装到一起,到某个类要使用的时候,再根据具体情况把这些方法写出来。 class 类名 implements 接口{自己属性;自己方法;必须实现的接口的抽象方法; // 只需要重写抽象方法即可 }接口中的方法…

硬盘接口损坏换电路板

1.有一块西数1T的蓝盘,SATA接口L形塑料掰断了,顾换块板解决接触不良问题 2.买板子,看好板子上印刷的版号,2060-771829-005 REV A,tb上买一片通型号的,十几块 3.用烙铁焊下原来烂板的8个脚的BIOS芯片&…

java.lang.noclassdeffounderror: com/fasterxml/jackson/core/util/jacksonfeature

建议直接查看我的原博 1.问题 环境&#xff1a; springboot2.3.10.RELEASE jdk1.8 elasticsearch8.8.1 根据官网&#xff0c;使用es时pom文件需要引入json工具&#xff0c;这里使用了jackson-databind&#xff1a; <dependency><groupId>co.elastic.clients…

栈(单位数计算器)

方法&#xff1a; 判断优先级 判断字符还是数字 计算方法 查看栈顶元素 思路 个位数计算器的代码&#xff1a; package calculator;public class Calculator {public static void main(String[] args) {String exp "78*9-2";Stack num new Stack(10);Stack op…

【CSS】浮动

&#x1f4dd;个人主页&#xff1a;爱吃炫迈 &#x1f48c;系列专栏&#xff1a;HTMLCSS &#x1f9d1;‍&#x1f4bb;座右铭&#xff1a;道阻且长&#xff0c;行则将至&#x1f497; 文章目录 浮动浮动的规则浮动的案例浮动的清除 浮动 float属性可以指定一个元素应沿其容器的…