数据库SQL使用子查询(subquery)

一、子查询

查询(query)任何SQL语句都是查询。但此术语一般指SELECT语句。

SELECT语句是SQL查询。迄今为止我们所看到的所有SELECT语句都是简单查询,即:从单个数据库表中检索数据的单条语句。

 

子查询(subquery)即:嵌套在其他查询中的查询。

1、利用子查询进行过滤

每个步骤都可以单独作为一个查询来执行。可以把一条SELECT语句返回的结果用于另一条SELECT语句的WHERE子句。

 

输入:SELECT vend_id

             FROM Products

             WHERE vend_id='RG001';

 

下一步

输入:SELECT cust_id

             FROM Orders

             WHERE vend_id IN(2007,2008);

 

现在组合一下,变为子查询组合两个查询。

 

输入:SELECT cust_id

             FROM Orders

             WHERE vend_id IN

(

             SELECT vend_id

             FROM Products

             WHERE vend_id='RG001'

);

 

在SELECT语句中,子查询总是从内向外处理。在处理SELECT语句时,DBMS实际上执行了两个操作。

 

格式化SQL:

包含子查询的SELECT语句难以阅读和调试,特别是它们较为复杂时更是如此。把子查询分界为多行并且适当的进行缩进,能极大的简化子查询的使用。

 

输入: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='RGAN01'

));

 

为了执行上述SELECT语句,DBMS实际上要执行3条SELECT语句,最里面的字查询返回订单列表,此列表用于其外面的子查询的WHERE子句。外面的子查询返回客户ID列表,此客户ID列表用于最外层查询的WHERE子句。最外层查询确实返回所需的数据。

 

可见,在WHERE子句中使用子查询能够编写出功能很强并且很灵活的SQL语句。对于能嵌套的子句查询的数目没有限制,不过在实际使用时由于性能的限制,不能嵌套太多的子查询。

 

只能是单列:作为子查询的SELECT语句只能查询单个列,企图检索多个列将返回错误。

 

 

2、作为计算字段使用子查询

使用子查询的另一种方法是创建计算字段。假如需要显示Customers表中的每个客户的订单总数,订单与相应的客户ID储存在Order表中。

为了执行这样的操作:

1\从Customers表中检索客户列表

2\对于检索出的每个客户,统计其在Orders表中的订单数目。

 

先使用SELECT COUNT(*)对表中的行进行计数,并通过WHERE语句来过滤某个特定的用户ID。

 

输入:SELECT COUNT(*) AS orders

             FROM Orders

             WHERE  cust_id='10001';

 

为了对每一个客户执行COUNT(*),应该将它作为一个子查询。

 

输入:SELECT cust_name,cust_state,

             FROM Orders

(

SELECT COUNT(*)

FROM Orders

WHERE orders.cust_id=Customers.cust_id

)

AS Orders

FROM Customers

ORDER BY cust_name;            

 

这条SELECT语句对Customers表中每一个客户都返回三列:orders是一个计算字段,它是由圆括号中的子查询建立的,该子查询对检索出的每个客户执行一次。5个客户就执行了5次。

 

子查询中的WHERE子句与前面使用的WHERE子句稍有不同,因为它使用了完全限定列名。它告诉SQL比较Order表中的cust_id与当前正从Customers表中检索的cust_id;

 

WHERE Order.cust_id=Customers.cust_id

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
子查询Subquery)是指嵌套在主查询或其他子查询中的查询语句。在MySQL数据库中,子查询可以嵌套多层,可以用在SELECT、WHERE、FROM和HAVING等语句中。常用的子查询类型包括标量子查询、列子查询和行子查询。 1. 标量子查询 标量子查询是指返回单个值的子查询,通常是用在SELECT语句中作为一个列,或者在WHERE语句中作为一个条件。例如: ``` SELECT name, age, (SELECT MAX(salary) FROM employee) AS max_salary FROM employee WHERE salary > (SELECT AVG(salary) FROM employee); ``` 以上SQL语句使用了两个标量子查询,第一个标量子查询返回了employee表中salary列的平均值,第二个标量子查询返回了employee表中salary列的最大值。同时,主查询中使用了WHERE子句来过滤出salary大于平均值的员工,以及一个新的列max_salary,用来显示员工表中最高的薪资。 2. 列子查询子查询是指返回一列值的子查询,通常是用在SELECT语句中作为一个列,或者在WHERE语句中作为一个条件。例如: ``` SELECT name, age, salary FROM employee WHERE salary IN (SELECT salary FROM employee WHERE department='IT'); ``` 以上SQL语句使用了一个列子查询子查询返回了employee表中属于IT部门的员工的薪资,主查询中使用了WHERE子句来筛选出对应的员工记录。 3. 行子查询子查询是指返回多列多行的子查询,通常是用在WHERE或者FROM语句中。例如: ``` SELECT name, age, salary FROM (SELECT * FROM employee WHERE department='IT') AS t WHERE t.salary > (SELECT AVG(salary) FROM employee); ``` 以上SQL语句使用了一个行子查询子查询返回了employee表中属于IT部门的员工记录,主查询中使用了WHERE子句来进一步筛选出薪资高于平均值的员工记录。 总之,子查询是MySQL数据库中非常重要的语句,可以实现复杂的查询功能,但是也需要注意性能问题,避免过度嵌套和不必要的查询。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值