SQL子查询是使用数据库的最有用的工具之一。它使您可以在另一个查询中放置一个查询,以更有效地检索甚至更改数据。无论您使用的是哪个数据库系统,在编写优化的SQL代码时,SQL子量都很重要。
在本文中,我们将通过一些示例了解SQL子查询及其应用。
目录
- 什么是SQL子查询?
- SQL中的子查询类型
- 在更新和删除语句中使用子查询
- SQL中的子查询优势
- 在SQL中编写子Queries的最佳实践
- SQL子查询的现实世界用例
- 结论
什么是SQL子查询?
SQL子查询,也称为嵌套查询,是保存在另一个SQL查询中的查询。在Microsoft SQL Server中,该子查询首先运行,然后使用外部查询来执行特定任务,例如过滤,聚合或加入数据。
例子
SELECT EmployeeName
FROM Intellipaat_Employees
WHERE DepartmentID = (
SELECT DepartmentID
FROM Intellipaat_Departments
WHERE DepartmentName = 'Sales'
);
在上面的SQL子查询示例中,它为销售”#8220;#8221;部门。
外部查询提取了属于“ sales”的员工名称;部门。
例子:
SELECT EmployeeName
FROM Intellipaat_Employees
WHERE Salary > (
SELECT AVG(Salary)
FROM Intellipaat_Employees
);
SQL中的子查询类型
让我们使用Intellipaat员工表分析每种类型的子查询。如前所述,可以根据输出的行和列进行分类。
1。单行子征服
这种类型的子查询仅返回一排,对于单数而言并不太大。无论是=& gt; or&& lt;。这些操作员允许您在更大的查询中处于完美条件下的区域。
例子:
SELECT EmployeeName
FROM Intellipaat_Employees
WHERE Salary > (
SELECT AVG(Salary)
FROM Intellipaat_Employees
);
以上查询将检索那些薪金大于所有员工平均工资的雇员。
2。多排子征
这是一个更广泛的版本;因此,这些子量像通常一样返回多个行。这些子征值主要与运算符一起使用,例如,所有,所有或所有的都存在,与这些操作员一样,比较值或条件列表的方法是快速而简单的。
“in in”的示例:
SELECT EmployeeName
FROM Intellipaat_Employees
WHERE DepartmentID IN (
SELECT DepartmentID
FROM Intellipaat_Departments
WHERE Location = 'New York'
);
以上查询将检索那些在纽约部门工作的员工。
与“存在”的示例:
SELECT DepartmentName
FROM Intellipaat_Departments d
WHERE EXISTS (
SELECT 1
FROM Intellipaat_Employees e
WHERE e.DepartmentID = d.DepartmentID
);
以上查询将列出至少一名员工的部门。
3。相关子征服
相关的子查询是“嵌套查询”从“外部查询”检索数据的一个。由于外部查询检索数据,因此必须为主查询返回的每一行执行子查询。因此,相关的子查询是多次执行的,它们依靠外部查询站立。
例子:
SELECT EmployeeName
FROM Intellipaat_Employees e
WHERE Salary > (
SELECT AVG(Salary)
FROM Intellipaat_Employees
WHERE DepartmentID = e.DepartmentID
);
在这里,该子查询计算每个部门的平均工资,外部查询将每个员工的薪水与该平均值进行比较。
4。标量子征
这种类型的子查询充当一个迷你查询,当与选择语句一起使用或在哪里检索一行和一列的条款时,可以产生更好的解决方案,作为单数标量值足以比较或计算。
例子:
SELECT DepartmentName,
(SELECT COUNT(*)
FROM Intellipaat_Employees
WHERE Intellipaat_Employees.DepartmentID = Intellipaat_Departments.DepartmentID) AS EmployeeCount
FROM Intellipaat_Departments;
此查询将检索每个部门的名称以及该部门的员工伯爵。
5。派生表
派生表是在查询的子句中找到的子查询。它使您能够创建一个仅在查询执行期间才能访问的新表格,从而可以更好地数据管理和检索,就好像它是普通表一样。
例子:
SELECT AvgSalary
FROM (
SELECT DepartmentID, AVG(Salary) AS AvgSalary
FROM Intellipaat_Employees
GROUP BY DepartmentID
) AS DepartmentAvg
WHERE AvgSalary > 60000;
在此示例中,上述子查询在新表中计算并将每个部门的平均工资存储。然后,外部查询过滤了所有平均工资低于60,000的部门。
在更新和删除语句中使用子查询
例如,基于子查询更新值
UPDATE Intellipaat_Employees
SET Salary = Salary * 1.10
WHERE DepartmentID IN (
SELECT DepartmentID
FROM Intellipaat_Departments
WHERE DepartmentName = 'IT'
);
例如,使用子查询删除记录。
DELETE FROM Intellipaat_Employees
WHERE DepartmentID = (
SELECT DepartmentID
FROM Intellipaat_Departments
WHERE DepartmentName = 'HR'
);
SQL中的子查询优势
子查询提供了几个优点,使其对于数据库开发人员必不可少:
- 模块化:它使您可以将一个具有挑战性的问题分解为更易于管理的零件。
- 动态过滤:它们允许您根据其他查询的结果过滤信息。
- 可重用性:可以根据需要在各个位置执行相同的子查询。
- 灵活性:它们有助于执行计算和某些类型的聚集体,这些聚集体在单个查询中难以完成。
子查询是一种很好的方法,可以找到例如在部门平均工资高于平均工资的员工。它还通过提高SQL统计数据的有效性和可维护性来帮助SQL查询优化。
在SQL中编写子Queries的最佳实践
尽管子征服很强大,但应明智地使用它们来确保最佳性能和可读性。以下是一些最佳实践:
1。避免不必要的嵌套:使用联接而不是子查询,以更好地提高效率和速度。
2。使用相关的子征服很少使用:由于主查询中的每一行执行相关的子查询,因此应非常谨慎地使用它们。
3。索引优化:子查询列应具有索引以增强查询的性能。
4。测试和优化:使用实际数据调整和消除慢速运行查询。
SQL子查询的现实世界用例
关系子查询在数据分析和报告任务中尤其重要,因为它们有助于将问题陈述简化为简洁明了的查询。这是两个解释这一点的例子。
1。确定每个部门中最好的员工
考虑一下您有兴趣找出公司数据库中每个部门最多的雇员的情况。但是,如果不使用子征服,这可能会变得复杂,但可以这样解决。
SELECT DepartmentName
FROM Intellipaat_Departments
WHERE DepartmentID IN (
SELECT DepartmentID
FROM Intellipaat_Employees
GROUP BY DepartmentID
HAVING COUNT(*) > 10
);
它的工作原理:
- 子查询检索每个部门的最高付款。
- 外部查询过滤付款结果等于检索到的最高付款。
- 这简化了人力资源或管理人员在每个部门找到知名员工的过程。
2。使用子查询进行报告和仪表板
次数在仪表板的商业智能(BI)系统中很常见,以显示汇总的数据。例如,在给定的仪表板中,该仪表板应该代表拥有十多名员工的所有部门,可以看出Subqueries完美地执行此任务。
SELECT DepartmentName
FROM Intellipaat_Departments
WHERE DepartmentID IN (
SELECT DepartmentID
FROM Intellipaat_Employees
GROUP BY DepartmentID
HAVING COUNT(*) > 10
);
它的工作原理:
- 该子查询使用计数的条款总结了每个部门的所有员工
- > 10。
- 外部查询显示所选部门的名称。
这有助于用户了解哪些部门已经成长。
- 为什么这很重要?
- 改进决策:经理可以评估员工生产率和部门效力随着时间的变化。
- 增强仪表板效率:可以预先调整数据而无需报告。
节省时间:单个子查询获取特定所需的信息,而不是编写复杂的冗长句子。
结论
在SQL中,子征服是使您的查询更加有效和灵活的基本要素。一旦学习了子查询的类型以及如何使用它们,您将能够非常轻松地解决与数据库相关的复杂问题。子查询可能有助于过滤数据,进行计算和更新记录。通过学习不同类型的子查询以及如何利用它们,您将大大提高SQL技能。
帖子SQL子查询:逐步综合指南首先出现在Intellipaat博客上。