SQL子查询实战:应用场景与高效技巧解析
SQL子查询
所谓的SQL子查询是嵌套在其他查询中的查询。
子查询通常用在WHERE子句的IN运算符中,用于过滤和填充计算列。
我们就从这两个使用场景开始学习吧。
该部分包括以下关系表:
主订单表存储订单ID、订单日期和客户ID,订单具体信息存储在OrderItems表中;order_num是关联的客户特定信息,存储在customers表中,并通过cust_id字段关联。
接下来,假设我们需要获取所有购买了RGA01产品的客户的信息?
首先,我们只列出步骤:
然后,我们完成第一步:
包含产品RGAN01的订单号:
有了订单号,就可以从orders表中获取CustomerID:
执行结果:
接下来我们合并上面的两个步骤:回答问题e首先在子查询中,放在WHERE语句的IN运算符中之后:
执行结果和上面第二步得到的结果是一样的:
在SELECT语句中,子查询从内向外处理:首先执行子查询SELECTorder_numFROMOrderItemsWHEREprod_id='RGAN01',将返回的订单号作为IN运算符的参数,执外部查询:SELECTcust_idFROMOrdersWHEREorder_numIN(20007,20008);。
最后我们看第三步,根据客户ID获取与客户相关的信息。
执行结果:
同样,我们可以将上面的WHERE子句替换为子查询:
至此,我们的返回任务完成:搜索姓名以及所有购买RGAN01产品的客户的联系信息。
子查询的另一个用例是创建计算字段。
再次,我们通过一个案例来学习:获取每个客户的订单总数。
customers表和orders表是一对多的关系,即一个客户对应多个订单,但一个订单只对应一个客户。
以下SQL获取客户1000000001的订单数:
要统计每个客户的订单数,应将其用作子查询:
通过执行结果:
上面的SQL为客户表中的每个客户返回三列:cust_namecust_state和orders。
Orders是子查询创建的计算字段。
在子查询条件中,我们使用Orders.cust_id=Customers.cust_id表的完全限定列名,这是因为Orders表和Customers表包含具有相同字段名的列。
在本节中,我们学习了在SELECT语句中使用子查询的两种方法:将子查询应用于WHERE子句的IN运算符、执行条件过滤以及使用子查询创建计算字段。
子查询检索效率不太理想下一篇小鱼就和大家一起开始学习连接表啦~连接表是数据检索的核心和重点,让我们拭目以待吧!
什么是SQL语句中相关子查询与非相关子查询
关键是要理解SQL子查询是嵌套在其他查询语句中的独立查询单元,它们可以灵活地处理数据并执行复杂的操作。子查询按照“从内到外”的原则分为多种执行类型。
子查询执行过程涉及细节,包括执行顺序、效率优化等。
编写时需要注意可读性和可维护性,避免过度嵌套。
相关子查询和不相关子查询是区分的核心概念。
不相关子查询:结果与外部查询不相关,独立执行。
关联子查询:结果与外查询相关,执行结果影响外查询。
定义子查询类型并记下查询执行逻辑和结果与外部查询之间的关系。
显示相关子查询和不相关子查询之间差异的示例。
不相关子查询的示例:查询特定状态下的数据,而不依赖于外部查询的结果。
相关子查询的示例:根据外部查询的结果和依赖于外部查询的结果查询数据。
综上所述,掌握SQL子查询的关键是理解其执行过程、区分相关子查询和不相关子查询以及如何评估和演示示例。
SQL子查询
包含在另一个查询中的子查询,适用于SELECT、FROM、WHERE/ON和HAVING语句。比较子查询通过将子查询与主查询数据进行比较来实现特定的查询目标。
例1.1:在WHERE/ON子句中使用子查询来过滤工资高于公司平均工资的员工。
例1.2:使用带有JOINON条件的子查询来获取工资超过部门平均工资的员工及其部门名称。
示例2:在SELECT语句中应用子查询来显示员工ID、姓名、工资和部门名称。
示例3:在FROM子句中包含子查询,计算自2020年1月1日以来在该部门工作的每个部门的平均工资。
示例4:在HAVING子句中使用子查询查找员工人数超过部门平均水平的部门。
上面的例子演示了SQL语句中子查询比较的多功能性,可以满足不同的查询需求。