首页 > 数据库 > 数据库开发技术 > 掌握SQL:查询和连接
摘要:欢迎来到我们 SQL 系列的第2讲,这里我们将深入探索高级 SQL 查询的世界和强大的连接概念。在这一讲中,你将掌握构造复杂 SQL 查询,从数据库中精确提取所需信息的艺术。
在第1讲,我们使用 SELECT 语句介绍了基础查询方式。现在,让我们探索更高级的查询技术来优化你的数据检索过程。
WHERE 子句可以让你基于指定条件过滤数据行。比如,如果你只想检索活跃员工,可以这样做:
SELECT FirstName, LastName
FROM Employees
WHERE Status = 'Active';
你可以使用 ORDER BY 子句控制结果的输出顺序。比如,你可以按员工的姓氏降序输出所有员工信息:
SELECT FirstName, LastName
FROM Employees
ORDER BY LastName ASC;
如果你只想检索特定数量的行或者想跳过特定数量行,则可以使用 LIMIT 和 OFFSET 关键字。比如,这里我们只检索前5名员工的信息:
SELECT FirstName, LastName
FROM Employees
LIMIT 5;
当处理多个表时,连接将是 SQL 的强大支柱。它们允许你将来自不同数据源的数据合并为一个结果集。让我们来深入了解连接的类型以及使用方法。
内连接仅返回两个表中都匹配到的行(公共行),你可以理解成两个集合的交集。比如,查询所有员工的部门信息:
SELECT Employees.FirstName,
Employees.LastName,
Departments.DepartmentName
FROM Employees
INNER JOIN Departments
ON Employees.DepartmentID = Departments.DepartmentID;
这里,我们使用部门编号(DepartmentID)列作为连接条件。
左连接会返回左表中的所有行和右表中的已匹配行,右表中的未匹配行在结果中将以 NULL 填充。比如,列出所有员工及为他们分配的项目信息:
SELECT Employees.FirstName,
Employees.LastName,
Projects.ProjectName
FROM Employees
LEFT JOIN EmployeeProjects
ON Employees.EmployeeID = EmployeeProjects.EmployeeID
LEFT JOIN Projects
ON EmployeeProjects.ProjectID = Projects.ProjectID;
右连接与左连接类似,只不过返回的是右表的所有行和左表的已匹配行,左表中的未匹配行在结果中将以 NULL 填充。二者可互换使用,只不过主表方向不一致而已。比如,如果你想看所有项目及其成员信息,可以使用右连接实现:
SELECT Projects.ProjectName,
Employees.FirstName,
Employees.LastName
FROM Projects
RIGHT JOIN EmployeeProjects
ON Projects.ProjectID = EmployeeProjects.ProjectID
RIGHT JOIN Employees
ON EmployeeProjects.EmployeeID = Employees.EmployeeID;
全外连接将返回两个表的并集,不管是否匹配。本质上,它是左连接和右连接的并集。比如,检索所有员工及为其分配的项目信息,包括那些没有任何项目的员工:
SELECT Employees.FirstName,
Employees.LastName,
Projects.ProjectName
FROM Employees
FULL OUTER JOIN EmployeeProjects
ON Employees.EmployeeID = EmployeeProjects.EmployeeID
FULL OUTER JOIN Projects
ON EmployeeProjects.ProjectID = Projects.ProjectID;
当你需要根据单个表来构造结果集的时候就会用到自连接。比如,员工表中有一列存储经理信息,可以使用自连接查询所有员工及其他们对应的经理信息:
SELECT e.EmployeeName,
m.EmployeeName AS ManagerName
FROM Employees e
LEFT JOIN Employees m
ON e.ManagerID = m.EmployeeID;
SQL 提供了多种聚合函数(如COUNT, SUM, AVG, MIN MAX)来对行组执行计算。比如,统计每个部门的员工人数:
SELECT DepartmentName, COUNT(*) AS EmployeeCount
FROM Employees
GROUP BY DepartmentName;
子查询,也叫嵌套查询,即嵌套在另一个查询中的查询。对复杂查询或当你需要将一个查询的结果作为另一个查询的输入时,就可以使用子查询。比如,查询薪水比平均薪水高的员工信息:
SELECT FirstName, LastName, Salary
FROM Employees
WHERE Salary > (SELECT AVG(Salary) FROM Employees)
这里,我们将平均薪水作为子查询。
GROUP BY 子句用于对指定列中具有相同值的行进行分组,它通常与聚合函数一起使用。比如,我们统计不同产品类型的总销售额:
SELECT ProductCategory,
SUM(SalesAmount) AS TotalSales
FROM Sales
GROUP BY ProductCategory;
而 HAVING 子句则允许你对分组后的结果进行过滤。比如,筛选总销售额超过10000美元的产品类型:
SELECT ProductCategory,
SUM(SalesAmount) AS TotalSales
FROM Sales
GROUP BY ProductCategory
HAVING SUM(SalesAmount) > 10000;
CASE 语句可以让你在 SQL 中实现条件操作,你可以将其看作编程语言中的分支语句。你可以用它们创建自定义列或执行条件聚合。例如,将员工按薪水分组:
SELECT FirstName, LastName,
CASE
WHEN Salary >= 80000 THEN 'High'
WHEN Salary >= 50000 THEN 'Medium'
ELSE 'Low'
END AS SalaryCategory
FROM Employees;
这样,就可以将员工分为高、中、低薪三档。
总结(Summary)
在这个部分,你已将 SQL 技能提升到了新的水平。你了解了高级查询技术,探索了各种类型的联接,掌握了聚合函数,深入研究了子查询,并理解了如何使用GROUP BY和HAVING子句。这些工具对于提取有价值的见解并将原始数据转化为有意义的信息至关重要。随着该系列的进展,你将继续扩展你的 SQL 知识并成为一名熟练的数据库管理员。
So, happy Learning!

往期看点👉👉👉
原文作者:数据派探险家;如有侵权,请联系管理员删除。