十一、mysql连接查询
一、前言
我们使用SQL查询不能只使用很简单、最基础的SELECT语句查询。如果想从多个表查询比较复杂的信息,就会使用高级查询实现。常见的高级查询包括多表连接查询、内连接查询、外连接查询与组合查询等,今天我们先来学习最常用、面试也很容易被问到的连接查询。
我们今天以一个简单的学生信息表(学生ID、学生姓名、学生性别)与一个学生成绩表(学生ID、学生成绩、成绩等级)作演示:
student_info表:
student_score表:
二、概念的引出
有时候我们希望,查询的结果由多张表组成,即查询结果由多张表中的列组成。
无论是子查询还是联合查询,可以在一个查询语句中涉及到多个表,比如这个查询语句:
SELECT * FROM student_score WHERE student_score .student_id= (SELECT student_info .student_id FROM student_info WHERE student_name = '小苍');
但是子查询中对于student_info
表的查询结果只是作为外层查询的一个搜索条件,换句话说,子查询的结果只是整个查询的一个中间状态,最后的查询结果中的列还是外层查询的查询列表上填写的列,本例中的外层查询列表是*
,也就是student_score
表中的所有列,所以整个查询语句的最后结果中,只有student_score
表中的所有列。
所以为了在一个查询语句的结果中得到多个表的信息,我们需要引入一种全新的查询方式 — 连接。
三、内连接(INNER JOIN)
INNER JOIN(也可以省略 INNER 使用 JOIN,效果一样
其实在一个查询语句中同时得到多个表中的数据的方式十分简单,直接把多个表名放到FROM语句之后,用逗号,分隔开就好了,就是这样:
SELECT * FROM student_score,student_info 由于student_score、student_info 是两个独立的表,而展示结果的时候又需要展示到一起,所以在展示结果的时候谁都不能偏袒,只好把每个表中的记录全部都组合一遍,这种把一个表中的记录和另一个表中的记录连起来的过程称为表的连接,一个表中的每一条记录与另一个表中的每一条记录得到全部可能的组合的过程称之为生成笛卡尔积;
因此上面两个表连接后的记录条数为:5*4=20
下边这几种方式产生的效果是一样的:
方式一:
SELECT * FROM t1, t2;
方式二:
SELECT * FROM t1 INNER JOIN t2;
方式三:
SELECT * FROM t1 JOIN t2;
这些连接方式统统都被称为内连接
,我们在之后说外连接的时候再详细唠叨内和外的区别。虽然内连接有很多种书写方式,我们熟悉一种就好了。
如果我们乐意,我们可以连接任意数量张表,但是如果没有任何限制条件的话,这些表连接起来产生的笛卡尔积可能是非常巨大的,所以在连接的时候过滤掉特定组合是有必要的。
增加过滤条件后得到的结论为如下阴影部分的数据,即符合条件的数据。
1、等值连接
概述:指使用等号"="比较两个表的连接列的值,相当于两表执行笛卡尔后,取两表连结列值相等的记录。
语法:
SELECT 列
FROM 表1 INNER JOIN 表2
ON 表1.列 = 表2.列
示例:
SELECT A.*, B.* FROM student_info A inner join student_score B ON A.student_id = B.student_id
结果:
2、非等值连接
概述:指使用大于号">“或小于号”<"等关系运算符比较两个表的连接列的值,相当于两表执行笛卡尔后,取一个表大于或小于另一个表的连结列值的记录。
语法:
SELECT 列
FROM 表1 INNER JOIN 表2
ON 表1.列 <> 表2.列
示例:
SELECT A.*, B.* FROM student_info A inner join student_score B ON A.student_id > B.student_id
结果:
四、外联接
1、左外连接(LEFT OUTER JOIN)
概述:返回的结果除内连接的结果,还有左表不符合条件的记录,并在右表相应列中填NULL。–左表的所有记录与右表符合条件的记录
示例:
SELECT A.*, B.* FROM student_info A left join student_score B ON A.student_id = B.student_id
结果:
2、右外连接(RIGHT OUTER JOIN)
概述:与左外连接相反,返回的结果除内连接的结果,还有右表不符合条件的记录,并在左表相应列中填NULL–将右表的所有记录与左表符合条件的记录
示例:
SELECT A.*, B.* FROM student_info A right join student_score B ON A.student_id = B.student_id
结果:
3、全外连接(FULL JOIN)——MySQL不支持
概述:指将左表所有记录与右表所有记录进行连接,返回的结果除内连接的结果,还有左表与右表不符合条件的记录,并在左表与右表相应列中填NULL。
4、注意事项
1、外连接中on关键字后面的条件必填,否则报语法错误。
2、on关键字后需连接2个表,否则结果不是预期,如:
SELECT * FROM student_info LEFT JOIN student_score ON student_info.sex=‘女’;
五、自然连接(NATURAL JOIN)
概述:指自动将表中相同名称的列进行记录匹配。
示例:
SELECT A.*, B.* FROM student_info A natural join student_score B
结果:
六、自连接
概述:指用表的别名实现表自身的连接。
示例:
SELECT B.*
FROM student_score A, student_score B
WHERE A.student_id = B.student_id
AND B.student_score > 80
结果:
SELECT B.*
FROM student_score A join student_score B
on A.student_id = B.student_id
AND B.student_score > 80;
十一、mysql连接查询相关推荐
- MySQL外键关联(一对多)MySQL连接查询
MySQL外键关联(一对多) 外键说明 什么是外键? 1)表A中有字段(如身份证号)做了主键,表B中也有这个字段(身份证号),这里的身份证号一定来自表A同样字段里的内容,但再B表中身份证号对应id可以 ...
- 二、MySQL连接查询学习笔记(多表连接查询:内连接,外连接,交叉连接详解)
MySQL连接查询(多表连接查询:内连接,外连接,交叉连接详解) 6:多表连接查询 笛卡尔乘积:如果连接条件省略或无效则会出现 解决办法:添加上连接条件 连接查询的分类: 1.按年代分类:1)sql ...
- mysql连接查询on_MySql 连接查询中 on 和 where 的区别
MySql 连接查询时,on 后面跟的是连接条件,再跟 and 关键就可以继续加过滤条件,这样看来是不是可以免用 where 增加过滤条件了呢?开始我也是这样以为的(老师是这么教的,且使用 on 的情 ...
- Mysql连接查询主要分为三种:内连接、外连接、交叉连接
Mysql 连接查询主要分为三种:内连接.外连接.交叉连接 内连接 使用比较运算符(包括=.>.<.<>.>=.<=.!>和!<)进行表间的比较操作,查 ...
- Mysql连接查询详解
前言 记得刚工作几年的时候,就写了一篇关于Mysql连接查询的博客文章,里面简单的认为先对关联表的记录进行笛卡尔积,然后再根据where条件过滤,现在看来有点贻笑大方了.正好最近看了<mysql ...
- MySQL连接查询(内连接,外连接,全连接)
对比分析MySQL连接查询(内连接,外连接,全连接) 内连接 等值连接 非等值连接 ==自连接== 外连接 左外连接 右外连接 全外连接 交叉连接 首先建三个数据表 sql文件下载 https://w ...
- MySQL连接查询 内连接和外连接的区别
MySQL 连接查询 @ sunRainAmazing 1.使用连接查询的场景 将多张表进行记录的连接查询(按照某个字段指定的条件进行数据的拼接):进行数据的拼接(两张表的内容显示在一个结果表中 使用 ...
- MySQL连接查询——MySQL 基础查询你会了吗?
前言: 由于大一学习数据库不扎实,学到后面有点吃力,所以回过头来认真学习一边,写一些学习总结,提醒自己.也要告诫读者,把基础打扎实.读者觉得有用的话可以收藏点赞哦! 上一篇:MySQL函数查询--My ...
- MySql 连接查询中 on 和 where 的区别
大家可以先看MySQL:left join 避坑指南 看过之后再接着看下面 在多表查询时,ON和where都表示筛选条件,on先执行,where后执行. on 后跟连接条件,然后再加的筛选条件只针对关 ...
- MySQL连接查询-笛卡尔乘积
MySQL连接查询 前言 一.笛卡尔积 二.SQL92(支持内连接) 三.SQL99(内.外.交叉) 1.内连接 2.外连接 2.1.左右外连接 2.2.全外连接 3.交叉连接(MySQL支持) 总结 ...
最新文章
- 使用 JSONP 实现跨域通信,第 2 部分: 使用 JSONP、jQuery 和 Yahoo! 查询语言构建 mashup...
- STM32 电机教程 18 - MC Workbench生成工程代码的电机调试
- Java交换两个Integer-一道无聊的题的思考
- 设计模式之桥接模式实例
- 3 种发布策略,解决 K8s 中快速交付应用的难题
- n76e885_新唐N76E003,N76E616烧录,调试各种问题集【坑集】
- Bootstrap-组件-3
- 2016全国计算机二级题,2016全国计算机二级考生试题及答案
- idea生成单元测试后运行报错:java.net.ConnectException: Connection refused:
- VMware 提示与 Device/Credential Guard 不兼容
- TokenInsight:反映区块链行业整体表现的TI指数较昨日同期下降3.29%
- 计算机组装 毕业设计,毕业设计(论文)--计算机组装与维护 .doc
- django orm 中表与表之间建关系 视图层 路由层 django请求生命周期...
- Xero系列之 中小企业会计宝
- 叙述码农和程序员的不同之处
- mysql合并两个表_MYSQL如何合并两个表
- C++11线程中的几种锁
- 读书笔记12 《新周刊485期 三商:智商、情商、时间商》
- flv播放器V2.6.5官方版【免费的FLV视频播放器】
- 第21节--非线性回归(下)
热门文章
- 〖大前端 - 基础入门三大核心之CSS篇②〗- CSS选择器之标签选择器、id选择器、class选择器与原子类
- 计算机中文核心期刊-概述一二
- Oracle 中LONG RAW BLOB CLOB类型介绍
- CUDA+pytorch+DGL安装
- java数组列表_java – 如何显示数组列表中的所有元素?
- vector erase
- 抖音视频SEO排名获客软件。
- c语言 多字节合并拼接(4个uchar 组合成 ulong)
- TLS certificate verification has been disabled!
- 移动端js触摸touch详解(附带案例源码)