Mysql之join
介绍
MySQL 中的join可以分为如下三类:
- INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录。
- LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录。
- RIGHT JOIN(右连接): 与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
语法
... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditiona
实例
使用的测试数据库:
mysql> select * from student;
+-----------+----------+
| name | classNum |
+-----------+----------+
| huyanshi | 5 |
| hublanker | 5 |
+-----------+----------+
2 rows in set (0.00 sec)
mysql> select * from student_grade;
+----------+-------+
| name | grade |
+----------+-------+
| huyanshi | 100 |
| hahhh | 80 |
+----------+-------+
2 rows in set (0.00 sec)
mysql>
1. 内连接
对上述两张表进行内连接,连接条件为name字段相等.
会返回在两张表中都存在的数据.
mysql> select * from student join student_grade on student.name = student_grade.name ;
+----------+----------+----------+-------+
| name | classNum | name | grade |
+----------+----------+----------+-------+
| huyanshi | 5 | huyanshi | 100 |
+----------+----------+----------+-------+
1 row in set (0.00 sec)
mysql>
当没有连接条件时,join相当于cross join,即求笛卡尔积.
mysql> select * from student join student_grade;
+-----------+----------+----------+-------+
| name | classNum | name | grade |
+-----------+----------+----------+-------+
| huyanshi | 5 | huyanshi | 100 |
| hublanker | 5 | huyanshi | 100 |
| huyanshi | 5 | hahhh | 80 |
| hublanker | 5 | hahhh | 80 |
+-----------+----------+----------+-------+
4 rows in set (0.00 sec)
mysql>
笛卡尔积在一些场景中有应用,比如:A表示所有学生的记录,B表是所有课程的记录,那么AB两张表的笛卡尔积可以表示所有可能的选课情况.
2.左外连接
对上述两张表进行左外连接,连接条件为name相等.可以看到,当huyanshi
有相同的字段在第二张表时,显示连接后的所有信息,第二张表没有符合条件的信息时,相关字段为空.
mysql> select * from student left join student_grade on student.name = student_grade.name ;
+-----------+----------+----------+-------+
| name | classNum | name | grade |
+-----------+----------+----------+-------+
| huyanshi | 5 | huyanshi | 100 |
| hublanker | 5 | NULL | NULL |
+-----------+----------+----------+-------+
2 rows in set (0.00 sec)
mysql>
3.右外连接
与左外连接相反.
mysql> select * from student right join student_grade on student.name = student_grade.name ;
+----------+----------+----------+-------+
| name | classNum | name | grade |
+----------+----------+----------+-------+
| huyanshi | 5 | huyanshi | 100 |
| NULL | NULL | hahhh | 80 |
+----------+----------+----------+-------+
2 rows in set (0.00 sec)
mysql>
注意事项
1. 当外连接的连接条件有对单表进行限定的时候,先进行单表的过滤,之后进行连接.但是并不影响结果的行数.
mysql> select * from student left join student_grade on student.name = student_grade.name and student_grade.grade = 80 ;
+-----------+----------+------+-------+
| name | classNum | name | grade |
+-----------+----------+------+-------+
| huyanshi | 5 | NULL | NULL |
| hublanker | 5 | NULL | NULL |
+-----------+----------+------+-------+
2 rows in set (0.00 sec)
mysql>
这个例子中,先对第二张表进行了grade=80的过滤,然后才进行了连表.但是在过滤后,并没有和第一张表中相同name的值了,因此第二张表全部为null.
完。
ChangeLog
2018-12-12 完
以上皆为个人所思所得,如有错误欢迎评论区指正。
欢迎转载,烦请署名并保留原文链接。
联系邮箱:huyanshi2580@gmail.com
更多学习笔记见个人博客——>呼延十
var gitment = new Gitment({ id: 'Mysql之join', // 可选。默认为 location.href owner: 'hublanker', repo: 'blog', oauth: { client_id: '2297651c181f632a31db', client_secret: 'a62f60d8da404586acc965a2ba6a6da9f053703b', }, }) gitment.render('container')
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- Day44:翻转单词顺序列
- Day45:扑克牌顺子
- 3分钟短文:Laravel 模型一对一关联关系这俩啥区别
- Day46:孩子们的游戏(圆圈中最后剩下的数)
- 3分钟短文:Laravel 检查记录是否被软删除
- Day47:求1+2+3+……+n
- 3分钟短文:Laravel 使用DB门面操作原生SQL
- Day48:不用加减乘除做加法
- Day49:将字符串转换成整数
- Day50:数组中重复的数字
- 3分钟短文:Laravel模型OR查询避坑指南
- Day51:构建乘积数组
- 3分钟短文:Laravel ORM 模型用法纲要
- Day52:正则表达式匹配
- 3分钟短文:Laravel 模型查询数据库的几个关键方法