SELECT中的多表连接
MySQL多表连接查询
连接(join):将一张表中的行按照某个条件(连接条件)和另一张表中的行连接起来形成一个新行的过程。
根据连接查询返回的结果,分3类:
内连接(inner join)
外连接(outer join)
交叉连接(cross join)
根据连接条件所使用的操作符,分2类:
相等连接(使用等号操作符)
不等连接(不使用等号操作符)
标准的连接语法:
注意:
在连接查询中,一个列可能出现在多张表中,为了避免引起歧义,通常在列名前面加上表名或表别名作为前缀(例:s.sid、x.sid)---使用表别名作为前缀,可以使得SQL代码较短,使用的内存更少(例:stu s,xuanke as x)。
搭建环境:模拟选课
mysql> select * from stu; +------+--------+---------+ | sid | sname | sphonum | +------+--------+---------+ | 1 | 张三 | 110 | | 2 | 李四 | 120 | | 3 | 王五 | 130 | +------+--------+---------+ 3 rows in set (0.00 sec)mysql> select * from tea; +------+-----------+---------+ | tid | tname | tphonum | +------+-----------+---------+ | 1113 | 相老师 | 1111 | | 1114 | 冯老师 | 1112 | +------+-----------+---------+ 2 rows in set (0.00 sec)mysql> select * from course; +------+--------+ | cid | cname | +------+--------+ | 1 | linux | | 2 | mysql | | 3 | hadoop | +------+--------+ 3 rows in set (0.00 sec)mysql> select * from xuanke; +------+------+------+--------+ | sid | tid | cid | xuefen | +------+------+------+--------+ | 1 | 1113 | 2 | 2 | | 1 | 1114 | 1 | 4 | | 1 | 1113 | 3 | 6 | | 2 | 1113 | 2 | 2 | | 2 | 1114 | 1 | 2 | | 2 | 1113 | 3 | 2 | +------+------+------+--------+ 6 rows in set (0.00 sec)
1、内连接inner join
只返回两张表中所有满足连接条件的行,即使用比较运算符根据每个表中共有的列的值匹配两个表中的行。(inner关键字是可省略的)
①传统的连接写法:
在FROM子句中列出所有要连接的表的名字(进行表别名),以逗号分隔;
连接条件写在WHERE子句中;
注意:一旦给表定义了别名,那么原始的表名就不能在出现在该语句的其它子句中
mysql> select s.sname,c.cname,t.tname,x.xuefen-> from stu s,tea t,course c,xuanke x-> where s.sid=x.sid and t.tid=x.tid and c.cid=x.cid; +--------+--------+-----------+--------+ | sname | cname | tname | xuefen | +--------+--------+-----------+--------+ | 张三 | linux | 冯老师 | 4 | | 李四 | linux | 冯老师 | 2 | | 张三 | mysql | 相老师 | 2 | | 李四 | mysql | 相老师 | 2 | | 张三 | hadoop | 相老师 | 6 | | 李四 | hadoop | 相老师 | 2 | +--------+--------+-----------+--------+ 6 rows in set (0.08 sec)
②使用on子句(常用):笔者比较喜欢的方法,因为觉得结构清晰明了。
mysql> select s.sname,t.tname,c.cname,x.xuefen-> from stu s-> join xuanke x-> on s.sid=x.sid-> join tea t-> on x.tid=t.tid-> join course c -> on c.cid=x.cid;结果如上……
表之间的关系以JOIN指定,ON的条件与WHERE条件相同。
③使用using子句
mysql> select s.sname,t.tname,c.cname,x.xuefen-> from stu s-> join xuanke x-> using(sid)-> join tea t-> using(tid)-> join course c-> using(cid); 结果如上……
表之间的关系以join指定,using(连接列)进行连接匹配,类似于on。(相对用的会比较少)
2、外连接outer join
使用外连接不但返回符合连接和查询条件的数据行,还返回不符合条件的一些行。
在MySQL数据库中外连接分两类(不支持全外连接):
左外连接、右外连接。(outer关键字可省略)。
共同点:都返回符合连接条件和查询条件(即:内连接)的数据行
不同点:
①左外连接还返回左表中不符合连接条件,但符合查询条件的数据行。(所谓左表,就是写在left join关键字左边的表)
②右外连接还返回右表中不符合连接条件,但符合查询条件的数据行。(所谓右表,就是写在right join关键字右边的表)
mysql> select s.sname,x.xuefen-> from stu s-> left join xuanke x-> on s.sid=x.sid; +--------+--------+ | sname | xuefen | +--------+--------+ | 张三 | 2 | | 张三 | 4 | | 张三 | 6 | | 李四 | 2 | | 李四 | 2 | | 李四 | 2 | | 王五 | NULL | +--------+--------+ 7 rows in set (0.00 sec)
解析:stu表是左表,xuanke表是右表:left join是左连接,stu表中”王五”没有选课,在xueke表中没有数据行,不符合连接条件,返回符合查询条件的数据行,所以xuefen为null。
mysql> select s.sname,x.xuefen-> from xuanke x-> right join stu s -> on x.sid=s.sid;结果如上(用的是右连接的方式)
给连接查询附加条件:
1、写在WHERE子句中
2、使用AND和连接条件写在一起
!!!但是:
对于内连接,两种写法结果相同;
对于外连接,两种写法结果不同。
mysql> select s.sname,x.xuefen-> from stu s-> left join xuanke x-> on x.sid=s.sid-> where sname='张三'; +--------+--------+ | sname | xuefen | +--------+--------+ | 张三 | 2 | | 张三 | 4 | | 张三 | 6 | +--------+--------+ 3 rows in set (0.01 sec)mysql> select s.sname,x.xuefen -> from (select * from stu where sname='张三') s-> left join xuanke x-> on x.sid=s.sid; +--------+--------+ | sname | xuefen | +--------+--------+ | 张三 | 2 | | 张三 | 4 | | 张三 | 6 | +--------+--------+ 3 rows in set (0.00 sec)
①先连接后过滤
select ……from ……
left join ……
on 连接条件
where 过滤条件;
②先过滤后连接
select ……from (select ……from ……where 过滤条件)
left join ……
on 连接条件;
3、交叉连接—笛卡尔积
因为没有连接条件,所进行的表与表间的所有行的连接。
特点:
①连接查询没有写任何连接条件
②结果集中的总行数就是两张表中总行数的乘积(笛卡尔积)
注意:在实际中,应该要避免产生笛卡尔积的连接,特别是对于大表
mysql> select * from stu,tea,course,xuanke;………… 108 rows in set (0.00 sec)
若是想专门产生笛卡尔积,可以使用交叉连接
mysql> select *-> from stu-> crosss join tea; +------+--------+---------+------+-----------+---------+ | sid | sname | sphonum | tid | tname | tphonum | +------+--------+---------+------+-----------+---------+ | 1 | 张三 | 110 | 1113 | 相老师 | 1111 | | 1 | 张三 | 110 | 1114 | 冯老师 | 1112 | | 2 | 李四 | 120 | 1113 | 相老师 | 1111 | | 2 | 李四 | 120 | 1114 | 冯老师 | 1112 | | 3 | 王五 | 130 | 1113 | 相老师 | 1111 | | 3 | 王五 | 130 | 1114 | 冯老师 | 1112 | +------+--------+---------+------+-----------+---------+ 6 rows in set (0.00 sec)
转载于:https://www.cnblogs.com/geaozhang/p/6753190.html
SELECT中的多表连接相关推荐
- MySQL中的多表连接
MySQL中的多表连接 当查询的数据并不是来源一个表时,需要使用多表链接操作完成查询.根据不同表中的数据之间的关系查询相关联的数据. 一.语法结构 使用一个表在多个表中查询数据: Where子句中写连 ...
- mysql表连接_SELECT中的多表连接
MySQL多表连接查询 连接(join):将一张表中的行按照某个条件(连接条件)和另一张表中的行连接起来形成一个新行的过程. 根据连接查询返回的结果,分3类: 内连接(inner join) 外连接( ...
- mysql中两个表连接_SQL语句中两个表的连接
展开全部 一.外连接 1.左连接 left join 或 left outer join SQL语句:select * from student left join score on student ...
- oracle中的多表连接
2019独角兽企业重金招聘Python工程师标准>>> 简单连接: 简单连接仅仅是通过select子句和from子句来连接多个表,其查询结果是一个通过笛卡尔积所生成的表.在实际需求中 ...
- ORACLE中的多表连接查询
这篇文章讲述了多表之间连接,包括内连接.外连接,如有错误或者不妥之处,还请各位大佬批评指正. 连表 SQL中操作多个表,以便可以查询到所需数据,其中包括内连接.外链接.等值连接.非等值连接.左连接.右 ...
- oracle 表名拼接_Oracle之3种表连接方式(排序合并连接、嵌套循环、哈希连接)...
排序合并连接 1.2.4.2.1 排序合并连接 排序合并连接(Sort Merge Join)是一种两个表在做表连接时用排序操作(Sort)和合并操作(Merge)来得到连接结果集的表连接方法. 如 ...
- [Mysql] 多表连接查询
在之前的学习当中,我们查询使用的都是一张表,而在实际的数据分析业务中,经常会使用多张表.将多张表连接起来就是多表连接(从一个表扩展为两个表,也可以更多个表) 多表连接查询 当查询结果的列来源于多张表时 ...
- 【SqlServer系列】表连接
1 概述 1.1 已发布[SqlServer系列]文章 [SqlServer系列]SQLSERVER安装教程 [SqlServer系列]数据库三大范式 [SqlServer系列]表单查询 [Sq ...
- 多表连接查询详细解析(详细版)
前言:写SQL语句:(先找出表的数据)找哪2个表,什么字段,过滤条件.(最后思考过滤条件,过滤条件肯定是2张表都有关联的字段,不一定是同名的字段,思考:表1哪个字段和表2哪个字段有关联) 1.为什么要 ...
- Mysql基础篇(1)—— 基础概念、DML基本语法和表连接
前言 Mysql基础篇相关的内容是看了康师傅的视频做的笔记吧 数据库相关概念 DB: 数据库(Database) 存储数据的仓库,本质是一个文件系统.它保存了一系列有组织的数据. DBMS:数据库 ...
最新文章
- eclipse左侧框不见了怎么办
- plsql(轻量版)-存储函数存储过程
- 联邦学习:保护用户数据隐私
- 如果诸葛亮用C++写出师表。。。。
- pyqt5 自定义控件_PyQt5学习笔记(十六)Pyinstaller打包与SQLite数据库
- fit函数 model_深度学习与Tensorflow学习笔记2 ——回调函数callbacks和Tensorboard
- Spring 4 xml 注解配置谅解 spring
- Windows Server 2008 配置使用动态IP和备用地址
- 基于JAVA+SpringBoot+Mybatis+MYSQL的课程评价系统
- qpushbutton 添加本地文件图标_1.PyQt5实现多文件调用以及UI和逻辑分离
- 使用 AppFuse 快速构建 J2EE 应用
- Kotlin — 协程简介与使用
- HDU 2056 Rectangles
- mysql存储过程 定时任务
- 高等数学(第七版)同济大学 习题1-10 个人解答
- Win7手工查找notepad.exe的IAT
- 浅析重复线性渐变repeating-linear-gradient如何使用
- OCCT培训笔记(刘星讲)--第1天
- 初学01-夜神模拟器连接Android Studio
- Excel设置自动恢复功能以及数据恢复教程
热门文章
- java的Date.getTime()转换成C#的Datetime.ticks
- 还在为保研和研究生毕业发愁吗?呐,给你推荐最近的几个保底的会议~
- 美团在ACL2021上提出基于对比学习的文本表示模型,效果提升8%
- UniDrop:一种简单而有效的Transformer提升技术
- 【Linux】很实用的 Linux 高级命令,老码农一定要懂
- Highway Networks
- PyTorch学习—8.模型创建步骤与nn.Module属性
- Kubernetes入门——从零搭建k8s集群
- 几点Java程序必须满足的基本规则
- GNU宣言——Ubuntu*操作系统将ubuntu精神带到了软件世界