博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL连接查询
阅读量:5807 次
发布时间:2019-06-18

本文共 9249 字,大约阅读时间需要 30 分钟。

hot3.png

MySQL连接查询

MySql表连接查询,两个表之间的连接查

tb_order表

orderId orderNo personId
1 12345 3
2 23456 3
3 34567 1
4 45678 1
5 56789 2

tb_person表

personId last_name first_name address city
1 hh aa ee dd
2 qq ww ee rr
3 yy ii kk nn
4 tr rt hg mn
5 sdf sd sd ds

 

1.内连接

内连接(inner join)是应用程序中用的普遍的"连接"操作,它一般都是默认连接类型。

mysql> select a.*,b.* from tb_person as a inner join tb_order as b;+----------+-----------+------------+---------+------+---------+---------+----------+| personId | last_name | first_name | address | city | orderId | orderNo | personId |+----------+-----------+------------+---------+------+---------+---------+----------+|        1 | hh        | aa         | ee      | dd   |       1 |   12345 |        3 ||        2 | qq        | ww         | ee      | rr   |       1 |   12345 |        3 ||        3 | yy        | ii         | kk      | nn   |       1 |   12345 |        3 ||        4 | tr        | rt         | hg      | mn   |       1 |   12345 |        3 ||        5 | sdf       | sd         | sd      | ds   |       1 |   12345 |        3 ||        1 | hh        | aa         | ee      | dd   |       2 |   23456 |        3 ||        2 | qq        | ww         | ee      | rr   |       2 |   23456 |        3 ||        3 | yy        | ii         | kk      | nn   |       2 |   23456 |        3 ||        4 | tr        | rt         | hg      | mn   |       2 |   23456 |        3 ||        5 | sdf       | sd         | sd      | ds   |       2 |   23456 |        3 ||        1 | hh        | aa         | ee      | dd   |       3 |   34567 |        1 ||        2 | qq        | ww         | ee      | rr   |       3 |   34567 |        1 ||        3 | yy        | ii         | kk      | nn   |       3 |   34567 |        1 ||        4 | tr        | rt         | hg      | mn   |       3 |   34567 |        1 ||        5 | sdf       | sd         | sd      | ds   |       3 |   34567 |        1 ||        1 | hh        | aa         | ee      | dd   |       4 |   45678 |        1 ||        2 | qq        | ww         | ee      | rr   |       4 |   45678 |        1 ||        3 | yy        | ii         | kk      | nn   |       4 |   45678 |        1 ||        4 | tr        | rt         | hg      | mn   |       4 |   45678 |        1 ||        5 | sdf       | sd         | sd      | ds   |       4 |   45678 |        1 ||        1 | hh        | aa         | ee      | dd   |       5 |   56789 |        2 ||        2 | qq        | ww         | ee      | rr   |       5 |   56789 |        2 ||        3 | yy        | ii         | kk      | nn   |       5 |   56789 |        2 ||        4 | tr        | rt         | hg      | mn   |       5 |   56789 |        2 ||        5 | sdf       | sd         | sd      | ds   |       5 |   56789 |        2 |+----------+-----------+------------+---------+------+---------+---------+----------+25 rows in set

内连接使用ON子句指定两个表的连接条件,WHERE子句来指定条件子句。

mysql> select a.*,b.* from tb_person as a inner join tb_order as b on a.personId=b.personId;+----------+-----------+------------+---------+------+---------+---------+----------+| personId | last_name | first_name | address | city | orderId | orderNo | personId |+----------+-----------+------------+---------+------+---------+---------+----------+|        3 | yy        | ii         | kk      | nn   |       1 |   12345 |        3 ||        3 | yy        | ii         | kk      | nn   |       2 |   23456 |        3 ||        1 | hh        | aa         | ee      | dd   |       3 |   34567 |        1 ||        1 | hh        | aa         | ee      | dd   |       4 |   45678 |        1 ||        2 | qq        | ww         | ee      | rr   |       5 |   56789 |        2 |+----------+-----------+------------+---------+------+---------+---------+----------+5 rows in set

上面sql语句的作用就是查询出所有人的订单。其实上面那条查询等价于:

mysql> select * from tb_person a,tb_order b where a.personId=b.personId;

 

2.左外连接

使用ON子句指定两个表的连接条件,WHERE子句来指定条件子句

LEFT JOIN 关键字会从左表那里返回所有的行,即使在右表中没有匹配的行。

查询personId为1的人的名字和所有的订单号

mysql> select a.orderNo,b.last_name from tb_order as a left join tb_person as b on a.personId=b.personId where b.personId=1;+---------+-----------+| orderNo | last_name |+---------+-----------+|   34567 | hh        ||   45678 | hh        |+---------+-----------+2 rows in set

左外连接不加查询条件,这条sql语句作用:查询所有人的订单

mysql> select a.orderNo,b.last_name from tb_order as a left join tb_person as b on a.personId=b.personId;+---------+-----------+| orderNo | last_name |+---------+-----------+|   12345 | yy        ||   23456 | yy        ||   34567 | hh        ||   45678 | hh        ||   56789 | qq        |+---------+-----------+5 rows in set

 

3.右外连接

使用ON子句指定两个表的连接条件,WHERE子句来指定条件子句 。

mysql> select * from tb_order as a right join tb_person as b on a.personId=b.personId;+---------+---------+----------+----------+-----------+------------+---------+------+| orderId | orderNo | personId | personId | last_name | first_name | address | city |+---------+---------+----------+----------+-----------+------------+---------+------+|       3 |   34567 |        1 |        1 | hh        | aa         | ee      | dd   ||       4 |   45678 |        1 |        1 | hh        | aa         | ee      | dd   ||       5 |   56789 |        2 |        2 | qq        | ww         | ee      | rr   ||       1 |   12345 |        3 |        3 | yy        | ii         | kk      | nn   ||       2 |   23456 |        3 |        3 | yy        | ii         | kk      | nn   || NULL    | NULL    | NULL     |        4 | tr        | rt         | hg      | mn   || NULL    | NULL    | NULL     |        5 | sdf       | sd         | sd      | ds   |+---------+---------+----------+----------+-----------+------------+---------+------+7 rows in set

可以看到左边的表中的记录都被查询出来了

sql-1

mysql> select * from tb_order as a right join tb_person as b on a.personId=b.personId and a.orderId=1;+---------+---------+----------+----------+-----------+------------+---------+------+| orderId | orderNo | personId | personId | last_name | first_name | address | city |+---------+---------+----------+----------+-----------+------------+---------+------+| NULL    | NULL    | NULL     |        1 | hh        | aa         | ee      | dd   || NULL    | NULL    | NULL     |        2 | qq        | ww         | ee      | rr   ||       1 |   12345 |        3 |        3 | yy        | ii         | kk      | nn   || NULL    | NULL    | NULL     |        4 | tr        | rt         | hg      | mn   || NULL    | NULL    | NULL     |        5 | sdf       | sd         | sd      | ds   |+---------+---------+----------+----------+-----------+------------+---------+------+5 rows in set

通过该结果我们可以猜想到这条sql语句是这样工作的:

从右表中读出一条记录,选出所有与on匹配的右表纪录(n条)进行连接,但没有符合连接条件(a.personId=b.personId and a.orderId=1)的记录,所以匹配为空记录。当personId = 3 时,根据连接条件有一条记录匹配。。

sql-2

mysql> select * from tb_order as a right join tb_person as b on a.personId=b.personId and a.orderId=1 where b.personId=1;+---------+---------+----------+----------+-----------+------------+---------+------+| orderId | orderNo | personId | personId | last_name | first_name | address | city |+---------+---------+----------+----------+-----------+------------+---------+------+| NULL    | NULL    | NULL     |        1 | hh        | aa         | ee      | dd   |+---------+---------+----------+----------+-----------+------------+---------+------+1 row in set

这条语句比上一条语句多了一个限定条件。

 

4.完全连接

只要其中某个表存在匹配,FULL JOIN 关键字就会返回行。

注:MySQL lacks support for FULL OUTER JOIN。

 

5.交叉连接

使用ON子句指定两个表的连接条件

sql-1

mysql> select * from tb_order as a cross join tb_person as b on a.personId=b.personId;+---------+---------+----------+----------+-----------+------------+---------+------+| orderId | orderNo | personId | personId | last_name | first_name | address | city |+---------+---------+----------+----------+-----------+------------+---------+------+|       3 |   34567 |        1 |        1 | hh        | aa         | ee      | dd   ||       4 |   45678 |        1 |        1 | hh        | aa         | ee      | dd   ||       5 |   56789 |        2 |        2 | qq        | ww         | ee      | rr   ||       1 |   12345 |        3 |        3 | yy        | ii         | kk      | nn   ||       2 |   23456 |        3 |        3 | yy        | ii         | kk      | nn   |+---------+---------+----------+----------+-----------+------------+---------+------+5 rows in set

sql-2

mysql> select * from tb_order as a cross join tb_person as b where a.personId = b.personId;+---------+---------+----------+----------+-----------+------------+---------+------+| orderId | orderNo | personId | personId | last_name | first_name | address | city |+---------+---------+----------+----------+-----------+------------+---------+------+|       3 |   34567 |        1 |        1 | hh        | aa         | ee      | dd   ||       4 |   45678 |        1 |        1 | hh        | aa         | ee      | dd   ||       5 |   56789 |        2 |        2 | qq        | ww         | ee      | rr   ||       1 |   12345 |        3 |        3 | yy        | ii         | kk      | nn   ||       2 |   23456 |        3 |        3 | yy        | ii         | kk      | nn   |+---------+---------+----------+----------+-----------+------------+---------+------+5 rows in set

交叉连接时使用where语句过滤结果。

====END====

转载于:https://my.oschina.net/xinxingegeya/blog/225635

你可能感兴趣的文章
10分钟看懂动态代理设计模式
查看>>
Java 读写锁 ReentrantReadWriteLock 源码分析
查看>>
关于前端模块化 CommonJS、AMD、CMD、ES6中模块加载
查看>>
老铁,一起来开Party(三) —— 声网Agora SDK趟坑记
查看>>
Android adb命令的一些实际运用
查看>>
ABAP和Java的单元测试Unit Test
查看>>
前端js调试技巧
查看>>
No ViewHolder!!! 一个非官方的纯java版 databinding(拒绝xml配置).
查看>>
浅谈编译代码时用的居中方法
查看>>
关于BFC理解
查看>>
Android开源数据库 GreenDao实践
查看>>
React & TypeScript
查看>>
Android音视频(二)音频AudioRecord和AudioTrack
查看>>
OSI七层模型和TCP/IP参考模型学习笔记
查看>>
一个util带你解决动态申请权限问题
查看>>
项目实战之gradle在实际项目中的使用
查看>>
为什们不喜欢viper和spring的设计
查看>>
VR全景图片浏览实现
查看>>
flutter packages get - pub get failed (1)解决方案
查看>>
Android面试 纸上谈兵系列
查看>>