多表查询(JOIN)

news/2024/11/8 18:44:15/

数据准备

我们需要两个表 student 和 student_score 

CREATE TABLE `student` (`student_id` int NOT NULL,`name` varchar(45) NOT NULL,PRIMARY KEY (`student_id`)
);CREATE TABLE `student_score` (`student_id` int NOT NULL,`subject` varchar(45) NOT NULL,`score` int NOT NULL
);

然后插入数据

INSERT INTO `student` (`student_id`, `name`)
VALUES (1,'Tim'),(2,'Jim'),(3,'Lucy');INSERT INTO `student_score` (`student_id`, `subject`, `score`)
VALUES (1,'English',90),(1,'Math',80),(2,'English',85),(2,'Math',88),(5,'English',92);

表结构

 交叉连接(CROSS JOIN)

交叉连接返回两个集合的笛卡尔积。也就是两个表中的所有的行的所有可能的组合。这相当于内连接没有连接条件或者连接条件永远为真。

如果一个有 m 行的表和另一个有 n 行的表,它们交叉连接将返回 m * n 行数据。

假如有a b c三个数据 交叉连接 e f g三个数据 就是a分别连e f g,b分别连e f g,c分别连e f g;

示例:

SELECT student.*,student_score.* FROM student CROSS JOIN student_score;

平时SELECT后面可以加列,但是现在我们多表联查,总要区分是哪个表的列不是,所以是表名.列名表示列

同时简写的话就是

SELECT student.*,student_score.* FROM student CROSS JOIN student_score;

运行结果:

内连接(INNER JOIN)

内连接将第一个表的每一行与第二个表的每一行进行比较,如果满足给定的连接条件,则将两个表的行组合在一起作为结果集中的一行。

SELECT 
student.*,student_score.* 
FROM 
student INNER JOIN student_score 
ON 
student.student_id = student_score.student_id;

内连接基于连接条件组合两个表中的数据。内连接相当于加了过滤条件的交叉连接。

所以这行代码也等价于

SELECT 
student.*,student_score.* 
FROM 
student,student_score 
WHERE 
student.student_id = student_score.student_id;

如果我们只需要相同列名进行等值匹配也可以用USING

SELECTstudent.*,student_score.*
FROMstudentINNER JOIN student_score USING(student_id);

外连接分为左外连接和右外连接 

左连接

左连接是左外连接的简称,左连接需要连接条件。

两个表左连接时,第一个表称为左表,第二表称为右表。例如 A LEFT JOIN BA 是左表,B 是右表。

左连接以左表的数据行为基础,根据连接匹配右表的每一行,如果匹配成功则将左表和右表的行组合成新的数据行返回;如果匹配不成功则将左表的行和 NULL 值组合成新的数据行返回。

SELECTstudent.*,student_score.*
FROMstudentLEFT JOIN student_scoreON student.student_id = student_score.student_id;

首先啊 这些行不是一一对应的关系,以student表为主体,那么每条student表的行可以匹配多行student_score的数据,用自然思维考虑嘛! score表中有多个student_id和student中的student_id相等,你说咱能要哪条不要哪条吗?那肯定全要啊

 我们可以看到 student_score中的student_id有一个5 这个5在student表中没有对应的 所以是NULL填充的

这个ON仍可以用USING替换(在查询列名相同的时候),所以说这个替换针对的是ON而非具体某种连接

右连接

逻辑和左连接相同,只是这次以右边的参数为主体而已

甚至说 A LEFT JOIN B 等价于 B RIGHT JOIN A


http://www.ppmy.cn/news/665747.html

相关文章

小程序的行驶证 OCR 识别

ocr.vehicleLicense:基于小程序的行驶证 OCR 识别(https调用) choseImage() { //直接使用this会获取不到数据;所以把this对象复制到临时变量thatvar that this;//利用手机拍照,或者相册选择照片wx.chooseImage({count…

html给文字设置自己下载的字体

在项目文件里新建一个文件夹fonts(存放自定义字体) 把下载的字体放入文件夹,可以看到html界面出现 1. 在head下的style里用font-face标签, font-family里自己随意给字体命名(这里我命名为ziti) src里放字…

css自定义字体

文章目录 载入字体使用字体 载入字体 font-family:字体名 src 字体文件地址 例如: font-face {font-family: al-Bold;src: url(Alibaba-PuHuiTi-Bold.ttf); }font-face {font-family: al-Medium;src: url(Alibaba-PuHuiTi-Medium.ttf); }使用字体 元素的font-fam…

百度识别文字接口(银行卡/行驶证/驾驶证/文字识别等)

$url ‘https://aip.baidubce.com/oauth/2.0/token’; $post_data[‘grant_type’] ‘client_credentials’; $post_data[‘client_id’] ‘client_id’; $post_data[‘client_secret’] ‘client_secret’; o " " ; f o r e a c h ( o ""; foreach …

CSS自定义字体,在线字体格式转换

在线字体格式转换地址:https://www.fontke.com/tool/convfont/ font-face { font-family: YourWebFontName; src: url(YourWebFontName.eot); /* IE9 Compat Modes */ src: url(YourWebFontName.eot?#iefix) format(embedded-opentype), /* IE6-IE8 */ url(YourW…

【批量行驶证识别】如何批量行驶证OCR识别行驶本行车本图片或复印件并导出至excel表格或文本格式,下面教你方法

继上一期,后台有人留言,是否有批量行驶证的识别导出表格 那么经过几个礼拜的研究,决定出一个批量行驶证的照片识别并导出Excel还有可以输出文本的 有的人叫行车本这个无所谓,我还特意去查了行车本就叫行驶本 下面对作品使用做一…

行驶证OCR识别,信息提取

司机朋友还在为办理车险、财险以及汽车相关业务时,不断录入行驶证信息而烦恼吗?广大交警朋友还为执法时,一个又一个需要手动登记的行驶证而头疼吗?不要紧,你们的福音来啦!可以集成于移动端的行驶证识别SDK“…

基于Opencv和Tesseract的行驶证识别系统设计

张伟超, 肖中俊, 严志国. 基于Opencv和Tesseract的行驶证识别系统设计[J]. 齐鲁工业大学学报, 2020, 34(1): 47-52. DOI: 10.16442/j.cnki.qlgydxxb.2020.01.009 ZHANG W C, XIAO Z J, YAN Z G. Design of Vehicle License Identification System Based on OpenCV and Tesser…