查mysql数据_MySQL 查询数据

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)

你可能感兴趣的:(查mysql数据)