详细讲述MySQL中的子查询操作

2019-01-05 09:57:38王振洲

201541491840216.png (485×217)

我们可以在where和having子句中使用子查询,将子查询得到的结果作为判断的条件。
使用比较进行子查询

一个子查询会返回一个标量(就一个值)、一个行、一个列或一个表,这些子查询称之为标量、行、列和表子查询。

当一个子查询返回一个标量时,我们就可以在where或者having子句中使用比较符与子查询得到的结果进行直接判断。比如,我现在要得到比用户tx订单数多的customer_id、city和订单数,这个sql语句怎么写。

先来说说,我写sql的一般步骤:

    读懂需求;     得到比用户tx订单数多的customer_id、city和对应的订单数。     看看最终需要得到哪些字段信息;     最终需要得到customer_id、city和订单数信息。     分析这些字段信息涉及到哪几个表;     涉及到表table1和表table2。     这几个表是如何关联的;     表table1和表table2的关联就在于customer_id字段。     分解需求,得到一个个小的需求;         需要得到tx用户的订单数;         需要得到其它用户的订单数;         比较订单数。     确认每一个小需求的过滤条件;     得到每个小需求的结果,进行组装,得到最终结果。

最终,我会写出一下的sql语句:

select table1.customer_id,city,count(order_id) from table1 join table2 on table1.customer_id=table2.customer_id where table1.customer_id <> 'tx' group by customer_id having count(order_id) > (select count(order_id) from table2 where customer_id='tx' group by customer_id);

上面的查询中使用了子查询,外部查询与子查询得到的结果进行了比较判断。如果子查询返回一个标量值(就一个值),那么外部查询就可以使用:=、>、<、>=、<=和<>符号进行比较判断;如果子查询返回的不是一个标量值,而外部查询使用了比较符和子查询的结果进行了比较,那么就会抛出异常。
使用ANY进行子查询

上面使用比较符进行子查询,规定了子查询只能返回一个标量值;但是,如果子查询返回的是一个集合,怎么办?

没问题,我们可以使用:any、in、some或者all来和子查询的返回结果进行条件判断。这里先总结使用any进行子查询。

any关键词必须与上面总结的比较操作符一起使用;any关键词的意思是“对于子查询返回的列中的任何一个数值,如果比较结果为TRUE,就返回TRUE”。