MySQL多表连接查询

连接(join):将一张表中的行按照某个条件(连接条件)和另一张表中的行连接起来形成一个新行的过程。

根据连接查询返回的结果,分3类:

内连接(inner join)

外连接(outer join)

交叉连接(cross join)

根据连接条件所使用的操作符,分2类:

相等连接(使用等号操作符)

不等连接(不使用等号操作符)

标准的连接语法:

注意:

在连接查询中,一个列可能出现在多张表中,为了避免引起歧义,通常在列名前面加上表名或表别名作为前缀(例:s.sid、x.sid)---使用表别名作为前缀,可以使得SQL代码较短,使用的内存更少(例:stu s,xuanke as x)。

搭建环境:模拟选课

mysql> select * fromstu;+------+--------+---------+

| sid | sname | sphonum |

+------+--------+---------+

| 1 | 张三 | 110 |

| 2 | 李四 | 120 |

| 3 | 王五 | 130 |

+------+--------+---------+

3 rows in set (0.00sec)

mysql> select * fromtea;+------+-----------+---------+

| tid | tname | tphonum |

+------+-----------+---------+

| 1113 | 相老师 | 1111 |

| 1114 | 冯老师 | 1112 |

+------+-----------+---------+

2 rows in set (0.00sec)

mysql> select * fromcourse;+------+--------+

| cid | cname |

+------+--------+

| 1 | linux |

| 2 | mysql |

| 3 | hadoop |

+------+--------+

3 rows in set (0.00sec)

mysql> select * fromxuanke;+------+------+------+--------+

| 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> selects.sname,c.cname,t.tname,x.xuefen-> fromstu 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> selects.sname,t.tname,c.cname,x.xuefen-> fromstu 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> selects.sname,t.tname,c.cname,x.xuefen-> fromstu 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> selects.sname,x.xuefen-> fromstu 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> selects.sname,x.xuefen-> fromxuanke x->right join stu s -> on x.sid=s.sid;

结果如上(用的是右连接的方式)

给连接查询附加条件:

1、写在WHERE子句中

2、使用AND和连接条件写在一起

!!!但是:

对于内连接,两种写法结果相同;

对于外连接,两种写法结果不同。

mysql> selects.sname,x.xuefen-> fromstu s->left join xuanke x-> on x.sid=s.sid->   where sname='张三';+--------+--------+

| sname | xuefen |

+--------+--------+

| 张三 | 2 |

| 张三 | 4 |

| 张三 | 6 |

+--------+--------+

3 rows in set (0.01sec)

mysql> selects.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 * fromstu,tea,course,xuanke;

……

……108 rows in set (0.00 sec)

若是想专门产生笛卡尔积,可以使用交叉连接

mysql> select *

-> fromstu->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)

mysql表连接_SELECT中的多表连接相关推荐

  1. 小记mysql备份同库中一张表的历史记录

    mysql备份同库中一张表的历史记录 insert into -select 需求 如今有个这么一个需求.mysql中有个表.数据增长的非常快.可是呢这个数据有效期也就是1个月,一个月曾经的记录不太重 ...

  2. mysql inserted表_触发器中的inserted表和deleted表

    触发器语句中使用了两种特殊的表:deleted 表和 inserted 表.Microsoft? SQL Server 2000 自动创建和管理这些表.可以使用这两个临时的驻留内存的表测试某些数据修改 ...

  3. mysql对应systables_mysql5.7中的sys表详解(转)

    在说明系统数据库之前,先来看下MySQL在数据字典方面的演变历史: MySQL4.1 提供了information_schema 数据字典.从此可以很简单的用SQL语句来检索需要的系统元数据了. My ...

  4. mysql sys_config表_mysql5.7中的sys表详解(转)

    在说明系统数据库之前,先来看下MySQL在数据字典方面的演变历史: MySQL4.1 提供了information_schema 数据字典.从此可以很简单的用SQL语句来检索需要的系统元数据了. My ...

  5. mysql 回表查询优化_MySQL中的回表查询与索引覆盖:一次百万级别分页查询使用Limit 从90秒到0.6毫秒的优化...

    这里写目录标题 事故现场 解决方案 提到的"回表查询" InnoDB的索引 什么是回表查询 怎么优化回表查询 事故现场 数据库使用的MySQL,有一个日志表,需要进行分页查询,于是 ...

  6. mysql数据表案例_mysql中库和表的简单操作案例

    mysql中库和表的简单操作案例 发布时间:2020-12-05 09:54:06 来源:亿速云 阅读:71 作者:小新 这篇文章主要介绍mysql中库和表的简单操作案例,文中介绍的非常详细,具有一定 ...

  7. 实战:从Mysql数据库frm文件中,提取表结构创建SQL语句

    需求 在某些特殊的场景下,例如你的mysql数据库无法启动,需要你将表的ibd文件拷贝到另一个数据库中,恢复业务数据库,恢复业务数据的前提,是你需要在另一个数据库中,创建好一模一样的表结构.这时你就需 ...

  8. mysql 分区合并_mysql中的合并表和分区表详解(经常使用的概念)

    分区表是mysql5.1之后的新特性,合并表已经存在很长时间了.这篇文章主要介绍这两个概念以及他们基本的操作. 一.合并表 合并表说实话是一种将要被淘汰的技术,但是掌握了合并表的概念再去看分区表就比较 ...

  9. mysql 排除字段_mysql中select某表时排除个别字段,shell实现

    在使用mysql的日常生活中,偶尔会有一些奇奇怪怪的需求,例如实现类似:select * EXCEPT password,address from users; 要想从users信息表中查询用户信息, ...

最新文章

  1. 2022-2028年中国抗菌不锈钢行业研究及前瞻分析报告
  2. OpenGL mipmap filters贴图过滤的实例
  3. 数据结构--图(Graph)详解(四)
  4. 力扣59-螺旋矩阵(C++)
  5. centos7 安装java 8_CentOS 7.8下安装完美安装配置Rosetta
  6. Abp vnext Web应用程序开发教程 9 —— 作者:用户界面
  7. java .class参数_java – 将.getClass()转换为类型参数
  8. 4-算法冒泡排序 插入排序
  9. 拓端tecdat|R语言空间可视化:绘制英国脱欧投票地图
  10. 泰山游记:厕所竟然没水,可想而知
  11. Birth-Death process 生灭过程
  12. 监控行业常见视频格式
  13. 每天做好一件事,坦然微笑地面对生活
  14. 获取颜色值 抓取颜色值 获取颜色代码RGB
  15. TiDB at ZaloPay Infrastructure Lesson Learned
  16. 电脑开机时,需选择启动项f1/f2/f5, 需按f1才能正常启动计算机
  17. OpenStack创建,分发并初始化rings
  18. 智能化转型浪潮下,百度EasyDL的“AI普惠”之路
  19. 亚马逊跨境电商美国站店铺产品运营是什么?亚马逊美国站店铺产品开发主要做什么?
  20. 7.Unity中c#代码学习(物理系统刚体+碰撞检测(爆炸效果实现))

热门文章

  1. Noip2016day2
  2. BootStrap-
  3. webstrom中使用git
  4. TComboBox动态创建
  5. hlsl之ambient
  6. 网页微信协议分析(一)——登录
  7. Session【常见问题请见下图】
  8. 《大道至简》第二章读后感
  9. hdu 5144 NPY and shot(三分)
  10. mongodb batchInsert