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中的多表连接相关推荐

  1. MySQL中的多表连接

    MySQL中的多表连接 当查询的数据并不是来源一个表时,需要使用多表链接操作完成查询.根据不同表中的数据之间的关系查询相关联的数据. 一.语法结构 使用一个表在多个表中查询数据: Where子句中写连 ...

  2. mysql表连接_SELECT中的多表连接

    MySQL多表连接查询 连接(join):将一张表中的行按照某个条件(连接条件)和另一张表中的行连接起来形成一个新行的过程. 根据连接查询返回的结果,分3类: 内连接(inner join) 外连接( ...

  3. mysql中两个表连接_SQL语句中两个表的连接

    展开全部 一.外连接 1.左连接  left join 或 left outer join SQL语句:select * from student left join score on student ...

  4. oracle中的多表连接

    2019独角兽企业重金招聘Python工程师标准>>> 简单连接: 简单连接仅仅是通过select子句和from子句来连接多个表,其查询结果是一个通过笛卡尔积所生成的表.在实际需求中 ...

  5. ORACLE中的多表连接查询

    这篇文章讲述了多表之间连接,包括内连接.外连接,如有错误或者不妥之处,还请各位大佬批评指正. 连表 SQL中操作多个表,以便可以查询到所需数据,其中包括内连接.外链接.等值连接.非等值连接.左连接.右 ...

  6. oracle 表名拼接_Oracle之3种表连接方式(排序合并连接、嵌套循环、哈希连接)...

    排序合并连接 1.2.4.2.1  排序合并连接 排序合并连接(Sort Merge Join)是一种两个表在做表连接时用排序操作(Sort)和合并操作(Merge)来得到连接结果集的表连接方法. 如 ...

  7. [Mysql] 多表连接查询

    在之前的学习当中,我们查询使用的都是一张表,而在实际的数据分析业务中,经常会使用多张表.将多张表连接起来就是多表连接(从一个表扩展为两个表,也可以更多个表) 多表连接查询 当查询结果的列来源于多张表时 ...

  8. 【SqlServer系列】表连接

    1   概述 1.1  已发布[SqlServer系列]文章 [SqlServer系列]SQLSERVER安装教程 [SqlServer系列]数据库三大范式 [SqlServer系列]表单查询 [Sq ...

  9. 多表连接查询详细解析(详细版)

    前言:写SQL语句:(先找出表的数据)找哪2个表,什么字段,过滤条件.(最后思考过滤条件,过滤条件肯定是2张表都有关联的字段,不一定是同名的字段,思考:表1哪个字段和表2哪个字段有关联) 1.为什么要 ...

  10. Mysql基础篇(1)—— 基础概念、DML基本语法和表连接

    前言 Mysql基础篇相关的内容是看了康师傅的视频做的笔记吧 数据库相关概念 DB: 数据库(Database) ​ 存储数据的仓库,本质是一个文件系统.它保存了一系列有组织的数据. DBMS:数据库 ...

最新文章

  1. eclipse左侧框不见了怎么办
  2. plsql(轻量版)-存储函数存储过程
  3. 联邦学习:保护用户数据隐私
  4. 如果诸葛亮用C++写出师表。。。。
  5. pyqt5 自定义控件_PyQt5学习笔记(十六)Pyinstaller打包与SQLite数据库
  6. fit函数 model_深度学习与Tensorflow学习笔记2 ——回调函数callbacks和Tensorboard
  7. Spring 4 xml 注解配置谅解 spring
  8. Windows Server 2008 配置使用动态IP和备用地址
  9. 基于JAVA+SpringBoot+Mybatis+MYSQL的课程评价系统
  10. qpushbutton 添加本地文件图标_1.PyQt5实现多文件调用以及UI和逻辑分离
  11. 使用 AppFuse 快速构建 J2EE 应用
  12. Kotlin — 协程简介与使用
  13. HDU 2056 Rectangles
  14. mysql存储过程 定时任务
  15. 高等数学(第七版)同济大学 习题1-10 个人解答
  16. Win7手工查找notepad.exe的IAT
  17. 浅析重复线性渐变repeating-linear-gradient如何使用
  18. OCCT培训笔记(刘星讲)--第1天
  19. 初学01-夜神模拟器连接Android Studio
  20. Excel设置自动恢复功能以及数据恢复教程

热门文章

  1. java的Date.getTime()转换成C#的Datetime.ticks
  2. 还在为保研和研究生毕业发愁吗?呐,给你推荐最近的几个保底的会议~
  3. 美团在ACL2021上提出基于对比学习的文本表示模型,效果提升8%
  4. UniDrop:一种简单而有效的Transformer提升技术
  5. 【Linux】很实用的 Linux 高级命令,老码农一定要懂
  6. Highway Networks
  7. PyTorch学习—8.模型创建步骤与nn.Module属性
  8. Kubernetes入门——从零搭建k8s集群
  9. 几点Java程序必须满足的基本规则
  10. GNU宣言——Ubuntu*操作系统将ubuntu精神带到了软件世界