面试总结4-关于多表操作的SQL语句

面试总结4-关于多表操作的SQL语句

mysql> select * from card;
+------+---------------------+-------+
| cnum | time(订单日期)      | state(状态) |
+------+---------------------+-------+
|    1 | 2019-02-19 13:25:17 |    11 |
|    2 | 2019-02-19 13:25:17 |    11 |
|    3 | 2019-02-19 12:56:02 |    12 |
|    4 | 2019-02-19 12:56:02 |    12 |
+------+---------------------+-------+

mysql> select * from detail;
+------+--------+-------+
| dnum | id(身份证号) | state(状态) |
+------+--------+-------+
|    1 | 340806 |    11 |
|    2 | 340816 |    11 |
|    3 | 340816 |    12 |
|    4 | 340826 |    12 |
+------+--------+-------+
两张表,card和detail通过cnum和dnum关联;

问题1:查询detail表中id为340806订单的创建日期。

思考:通过内连接(笛卡尔积)将表联在一起,因为是一一对应的关系,所以cnum=dnum;再通过where条件设置id的值


mysql> select time from card inner join detail on card.cnum=detail.dnum where detail.id=340806;
+---------------------+
| time                |
+---------------------+
| 2019-02-19 12:56:02 |
+---------------------+

问题2:查询身份证号和身份证号出现的次数要求次数大于1并且按照身份证号的降序排序。

知识点1:聚合函数后面不能使用where条件

知识点2:SQL语句的编写顺序S-F-W-G-H-O

思考:首先了解使用聚合函数count(id),并且不能使用where语句,然后需要考虑到使用分组group by,这里如果不分组的话,count就会将所有的id出现的次数计算出来,只有分组了才会计算出每个id出现的次数。最后通过count(id)>1 筛选出数据,然后用order by排序!

mysql> select id,count(id) from detail group by id having count(id)>1 order by id desc;
+--------+-----------+
| id     | count(id) |
+--------+-----------+
| 340816 |         2 |
+--------+-----------+

猜你喜欢

转载自blog.csdn.net/qq_38238296/article/details/87869726