当前位置:Gxlcms > 数据库问题 > MYSQL 学习笔记记录整理之三:子查询

MYSQL 学习笔记记录整理之三:子查询

时间:2021-07-01 10:21:17 帮助过:3人阅读

1、利用子查询进行过滤 eg:假如需要列出订购物品TNT2的所有客户,具体步骤: 检索包含物品TNT2的所有订单编号 检索具有前一步骤列出的订单编号的所有客户的ID 检索前一步骤返回的所有客户ID的客户信息 上述每个步骤都可以单独作为一个查询来执行,可以把一条SELECT语句返回的结果用于另一条SELECT语句的WHERE语句。也可以使用子查询把3个查询组合成一条语句。 select order_num FROM orderitems WHERE prod_id=‘TNT2‘; 输出结果为: order_num:20005,20007   下一步,查询具有订单20005和20007的客户ID。 SELECT cust_id from orders where order_num IN(20005,20007); 输出结果: cust_id:10001,10004   现在,把第一个查询(返回订单号的那一个)变为子查询组合两个查询。请看: SELECT cust_id from orders where order_num IN(select order_num FROM orderitems WHERE prod_id=‘TNT2‘); 输出结果为: cust_id:10001,10004   分析:在SELECT语句中,子查询总是从内向外处理。在处理上面的语句时,mysql 实际执行了两个操作。   现在得到了订购物品TNT2的所有客户ID,下一步是检索这些客户ID的客户信息,检索两列的SQL语句为: SELECT cust_name ,cust_contact from customers where cust_Id in(10001,10004); 上面,可以把其中的where子句转换为子查询而不是硬编码这些客户ID。 SELECT cust_name ,cust_contact from customers where cust_Id IN(SELECT cust_id from orders where order_num IN(select order_num FROM orderitems WHERE prod_id=‘TNT2‘));   分析:为了执行上面的select 语句,mysql实际上必须执行3条SELECT语句。最里边的子查询返回订单号列表,此列表用于其外面的子查询的WHERE子句。外面的子查询返回客户ID列表,此客户ID列表用于最外层查询的WHERE子句。最外层查询确实返回所需的数据。 不过,在实际使用时由于性能的限制,不能嵌套太多的子查询。 注意:列必须匹配。在WHERE子句中使用子查询,应该保证SELECT语句具有与WHERE子句中相同数目的列,通常,子查询将返回单个列并且与单个列匹配,但如果需要也可以使用多个列。虽然子查询一般与IN操作符结合使用,但也可以用于测试等于(=)、不等于(<>)等。   2、作为计算字段使用子查询 使用子查询的另一种方法就是创建计算字段。假如需要显示customers表中每个客户的订单总数,为了执行这个操作,遵循下面的步骤: 从customers表中检索客户列表 对于检索出的每个客户,统计其在orders表中的订单数目。   例如:下面的代码对客户10001的订单进行计数。 SELECT COUNT(*) AS orders FROM orders WHERE cust_id=10001;   为了对每个客户执行COUNT(*)计算,应该将COUNT(*)作为一个子查询,请看下面:   SELECT cust_name,cust_state, (SELECT COUNT(*) FROM orders WHERE orders.cust_id=customers.cust_id) AS orders from customers order by cust_name; 分析:这条SELECT 语句对customers表中的每个客户返回3列: cust_name,cust_state,orders。orders是一个计算字段,它是由圆括号的子查询建立,该子查询对检索出的每个客户执行一次。在此例子汇总,该子查询执行了5次,因此检索出了5个客户。   小结:子查询最常见的使用是在WHERE子句的IN操作符中,以及用来填充计算列。

MYSQL 学习笔记记录整理之三:子查询

标签:客户   需要   学习   nta   customers   子查询   tac   rom   count   

人气教程排行