查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***r33@sina.com2年前 (2018-09-11)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值