sql 语句的关联查询
左关联: left join ... on ...
右关联: right join... on ...
格式:
select 字段 from 表1 left join 表2 on 条件 (一般为表1与表2的关联条件)
查询用户的所有订单信息 :
user 用户表
orders 订单表
select * from user left join orders on user.id = orders.user_id
稍微复杂点 统计用户的订单数量 (需要分组,通过用户的id)
select user.username,orders.id,count(*) from user right join orders on user.id = orders.user_id GROUP BY user.id;
mysql> select user.username,orders.id,count(*) from user right join orders on user.id = orders.user_id GROUP BY user.id;
+----------+----+----------+
| username | id | count(*) |
+----------+----+----------+
| 王五 | 3 | 2 |
| 张三 | 5 | 1 |
+----------+----+----------+
2 rows in set (0.07 sec)
这里显示名为王五(id=3)的用户有2个订单 张三(id=5)1个订单
这里是右关联查询,用右关联查询是有道理的, 因为左关联和有关联 是有差别的查询,区别:left join on 左边的表为主表 right join on 右边的表为主表
这个统计订单的查询有一个问题 就是 用户表中有用户新信息,但是这个用户没有订单信息
请看下面的查询;
---------------------
单表查询
---------------------
mysql> select * from user;
+----+----------+------------+------+----------+
| id | username | birthday | sex | address |
+----+----------+------------+------+----------+
| 1 | 王五 | 2017-11-25 | 3 | 南阳 |
| 10 | 张三 | 2014-07-10 | 1 | 北京市 |
| 16 | 张小明 | NULL | 1 | 河南郑州 |
| 22 | 陈小明 | NULL | 1 | 河南郑州 |
| 24 | 张三丰 | NULL | 1 | 河南郑州 |
| 25 | 陈小明 | NULL | 1 | 河南郑州 |
| 26 | 王五 | NULL | NULL | NULL |
| 29 | 小黑 | 2017-11-26 | NULL | NULL |
| 30 | 抖森 | 2017-11-25 | 1 | 山村 |
+----+----------+------------+------+----------+
9 rows in set (0.03 sec)
mysql> select * from orders;
+----+---------+---------+---------------------+------+
| id | user_id | number | createtime | note |
+----+---------+---------+---------------------+------+
| 3 | 1 | 1000010 | 2015-02-04 13:22:35 | NULL |
| 4 | 1 | 1000011 | 2015-02-03 13:22:41 | NULL |
| 5 | 10 | 1000012 | 2015-02-12 16:13:23 | NULL |
+----+---------+---------+---------------------+------+
3 rows in set (0.03 sec)
--------------------------
关联查询
-------------------------
左关联
------------------------
mysql> select user.* ,orders.number from user left join orders on user.id = orders.user_id;
+----+----------+------------+------+----------+---------+
| id | username | birthday | sex | address | number |
+----+----------+------------+------+----------+---------+
| 1 | 王五 | 2017-11-25 | 3 | 南阳 | 1000010 |
| 1 | 王五 | 2017-11-25 | 3 | 南阳 | 1000011 |
| 10 | 张三 | 2014-07-10 | 1 | 北京市 | 1000012 |
| 16 | 张小明 | NULL | 1 | 河南郑州 | NULL |
| 22 | 陈小明 | NULL | 1 | 河南郑州 | NULL |
| 24 | 张三丰 | NULL | 1 | 河南郑州 | NULL |
| 25 | 陈小明 | NULL | 1 | 河南郑州 | NULL |
| 26 | 王五 | NULL | NULL | NULL | NULL |
| 29 | 小黑 | 2017-11-26 | NULL | NULL | NULL |
| 30 | 抖森 | 2017-11-25 | 1 | 山村 | NULL |
+----+----------+------------+------+----------+---------+
10 rows in set (0.04 sec)
-----------------------------
右关联
-----------------------------
mysql> select user.* ,orders.number from user right join orders on user.id = orders.user_id;
+----+----------+------------+-----+---------+---------+
| id | username | birthday | sex | address | number |
+----+----------+------------+-----+---------+---------+
| 1 | 王五 | 2017-11-25 | 3 | 南阳 | 1000010 |
| 1 | 王五 | 2017-11-25 | 3 | 南阳 | 1000011 |
| 10 | 张三 | 2014-07-10 | 1 | 北京市 | 1000012 |
+----+----------+------------+-----+---------+---------+
3 rows in set (0.05 sec)
很明显此处错误的选择left会导致查出不必要的数据,可以说是垃圾信息,因为是要查出订单信息(携带用户信息)没有订单的用户就不必要查询出来。
Narule
Narule
jun***[email protected]年前 (2018-09-11)