mysql表连接_SELECT中的多表连接
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中的多表连接相关推荐
- 小记mysql备份同库中一张表的历史记录
mysql备份同库中一张表的历史记录 insert into -select 需求 如今有个这么一个需求.mysql中有个表.数据增长的非常快.可是呢这个数据有效期也就是1个月,一个月曾经的记录不太重 ...
- mysql inserted表_触发器中的inserted表和deleted表
触发器语句中使用了两种特殊的表:deleted 表和 inserted 表.Microsoft? SQL Server 2000 自动创建和管理这些表.可以使用这两个临时的驻留内存的表测试某些数据修改 ...
- mysql对应systables_mysql5.7中的sys表详解(转)
在说明系统数据库之前,先来看下MySQL在数据字典方面的演变历史: MySQL4.1 提供了information_schema 数据字典.从此可以很简单的用SQL语句来检索需要的系统元数据了. My ...
- mysql sys_config表_mysql5.7中的sys表详解(转)
在说明系统数据库之前,先来看下MySQL在数据字典方面的演变历史: MySQL4.1 提供了information_schema 数据字典.从此可以很简单的用SQL语句来检索需要的系统元数据了. My ...
- mysql 回表查询优化_MySQL中的回表查询与索引覆盖:一次百万级别分页查询使用Limit 从90秒到0.6毫秒的优化...
这里写目录标题 事故现场 解决方案 提到的"回表查询" InnoDB的索引 什么是回表查询 怎么优化回表查询 事故现场 数据库使用的MySQL,有一个日志表,需要进行分页查询,于是 ...
- mysql数据表案例_mysql中库和表的简单操作案例
mysql中库和表的简单操作案例 发布时间:2020-12-05 09:54:06 来源:亿速云 阅读:71 作者:小新 这篇文章主要介绍mysql中库和表的简单操作案例,文中介绍的非常详细,具有一定 ...
- 实战:从Mysql数据库frm文件中,提取表结构创建SQL语句
需求 在某些特殊的场景下,例如你的mysql数据库无法启动,需要你将表的ibd文件拷贝到另一个数据库中,恢复业务数据库,恢复业务数据的前提,是你需要在另一个数据库中,创建好一模一样的表结构.这时你就需 ...
- mysql 分区合并_mysql中的合并表和分区表详解(经常使用的概念)
分区表是mysql5.1之后的新特性,合并表已经存在很长时间了.这篇文章主要介绍这两个概念以及他们基本的操作. 一.合并表 合并表说实话是一种将要被淘汰的技术,但是掌握了合并表的概念再去看分区表就比较 ...
- mysql 排除字段_mysql中select某表时排除个别字段,shell实现
在使用mysql的日常生活中,偶尔会有一些奇奇怪怪的需求,例如实现类似:select * EXCEPT password,address from users; 要想从users信息表中查询用户信息, ...
最新文章
- 2022-2028年中国抗菌不锈钢行业研究及前瞻分析报告
- OpenGL mipmap filters贴图过滤的实例
- 数据结构--图(Graph)详解(四)
- 力扣59-螺旋矩阵(C++)
- centos7 安装java 8_CentOS 7.8下安装完美安装配置Rosetta
- Abp vnext Web应用程序开发教程 9 —— 作者:用户界面
- java .class参数_java – 将.getClass()转换为类型参数
- 4-算法冒泡排序 插入排序
- 拓端tecdat|R语言空间可视化:绘制英国脱欧投票地图
- 泰山游记:厕所竟然没水,可想而知
- Birth-Death process 生灭过程
- 监控行业常见视频格式
- 每天做好一件事,坦然微笑地面对生活
- 获取颜色值 抓取颜色值 获取颜色代码RGB
- TiDB at ZaloPay Infrastructure Lesson Learned
- 电脑开机时,需选择启动项f1/f2/f5, 需按f1才能正常启动计算机
- OpenStack创建,分发并初始化rings
- 智能化转型浪潮下,百度EasyDL的“AI普惠”之路
- 亚马逊跨境电商美国站店铺产品运营是什么?亚马逊美国站店铺产品开发主要做什么?
- 7.Unity中c#代码学习(物理系统刚体+碰撞检测(爆炸效果实现))