← 目录从入门到精通SQL Server

数据过滤与排序

2024/10/19

SQL Server 数据过滤与排序详解:使用 BETWEEN、IN 和 LIKE 进行复杂查询

在 SQL Server 中,数据过滤与排序是查询操作中不可或缺的部分。在实际应用中,往往需要通过多种过滤条件,组合不同的数据筛选方法以实现复杂的查询。本篇博客将详细介绍 SQL Server 中如何使用 BETWEEN、IN 和 LIKE 进行复杂查询,结合示例代码,帮助你熟练掌握这些操作。


1. 使用 BETWEEN 进行范围查询

1.1 什么是 BETWEEN?

BETWEEN 用于筛选一个范围内的值,通常用于数字或日期字段。BETWEEN 包括边界值,即返回值时也包含范围的起点和终点。

1.2 BETWEEN 基本语法

sql
SELECT 列名1, 列名2, ...
FROM 表名
WHERE 列名 BETWEEN 起始值 AND 结束值;

1.3 示例:筛选工资在50000到80000之间的员工

sql
SELECT FirstName, LastName, Salary
FROM Employees
WHERE Salary BETWEEN 50000 AND 80000;

在这个例子中,SQL Server 会返回所有薪水在50000到80000之间的员工,包含50000和80000两个边界值。

1.4 使用 BETWEEN 查询日期范围

BETWEEN 也常用于日期范围查询。例如,获取雇佣日期在2020年1月1日到2021年12月31日之间的员工信息:

sql
SELECT FirstName, LastName, HireDate
FROM Employees
WHERE HireDate BETWEEN '2020-01-01' AND '2021-12-31';

这条语句会返回所有在这个日期范围内被雇佣的员工。


2. 使用 IN 进行多值匹配

2.1 什么是 IN?

IN 子句用于检查某个值是否在一组给定值中。它允许你匹配多种不同的值,而不需要使用多个 OR 语句。

2.2 IN 基本语法

sql
SELECT 列名1, 列名2, ...
FROM 表名
WHERE 列名 IN (值1, 值2, ...);

2.3 示例:筛选职位为“Manager”或“Developer”的员工

sql
SELECT FirstName, LastName, JobTitle
FROM Employees
WHERE JobTitle IN ('Manager', 'Developer');

这条查询语句会返回所有职位为 Manager 或 Developer 的员工。如果不使用 IN,你将需要写多条 OR 语句:

sql
SELECT FirstName, LastName, JobTitle
FROM Employees
WHERE JobTitle = 'Manager' OR JobTitle = 'Developer';

显然,使用 IN 更加简洁和易读。

2.4 IN 与子查询的结合使用

IN 还可以与子查询结合使用,以查询另一个表中的数据。例如,查找所有属于某些部门的员工:

sql
SELECT FirstName, LastName, DepartmentID
FROM Employees
WHERE DepartmentID IN (SELECT DepartmentID FROM Departments WHERE DepartmentName = 'IT');

此语句会返回所有属于 IT 部门的员工,子查询先从 Departments 表中获取 DepartmentID,再与 Employees 表中的 DepartmentID 进行匹配。


3. 使用 LIKE 进行模糊查询

3.1 什么是 LIKE?

LIKE 子句用于进行模糊查询,通常用于字符串字段。它可以结合通配符来匹配特定模式的数据。

3.2 LIKE 基本语法

sql
SELECT 列名1, 列名2, ...
FROM 表名
WHERE 列名 LIKE '模式';
  • %:匹配任意数量的字符
  • _:匹配单个字符

3.3 示例:筛选姓氏以 “S” 开头的员工

sql
SELECT FirstName, LastName
FROM Employees
WHERE LastName LIKE 'S%';

这里 % 是通配符,表示任何字符组合,因此可以匹配所有姓氏以字母 S 开头的员工。

3.4 使用 _ 通配符

如果想匹配精确长度的字符,可以使用 _ 通配符。以下查询将返回所有姓氏中第二个字母为 “a” 的员工:

sql
SELECT FirstName, LastName
FROM Employees
WHERE LastName LIKE '_a%';

3.5 LIKE 与数字和日期的结合使用

LIKE 通常用于字符串匹配,但在某些情况下也可以与数字和日期字段结合使用。例如,查找员工ID为 "12" 开头的员工:

sql
SELECT FirstName, LastName, EmployeeID
FROM Employees
WHERE EmployeeID LIKE '12%';

同样,LIKE 也可以用于查找特定年份的日期数据:

sql
SELECT FirstName, LastName, HireDate
FROM Employees
WHERE HireDate LIKE '2023%';

4. 综合应用:BETWEEN、IN 和 LIKE 的结合使用

4.1 示例:查询工资在60000到90000之间,并且职位是“Developer”或“Manager”,且姓氏以“M”开头的员工

sql
SELECT FirstName, LastName, JobTitle, Salary
FROM Employees
WHERE Salary BETWEEN 60000 AND 90000
AND JobTitle IN ('Developer', 'Manager')
AND LastName LIKE 'M%';

通过这条语句,SQL Server 会筛选出薪水在 60000 到 90000 之间,且职位为 Developer 或 Manager,并且姓氏以 “M” 开头的员工。


5. 排序查询结果:ORDER BY

5.1 ORDER BY 基本语法

在 SQL Server 中,ORDER BY 用于对查询结果进行排序。可以对单个或多个列进行升序 (ASC) 或降序 (DESC) 排序。

sql
SELECT 列名1, 列名2, ...
FROM 表名
ORDER BY 列名1 [ASC|DESC], 列名2 [ASC|DESC];

5.2 示例:按工资降序排列员工,若工资相同则按姓氏升序排列

sql
SELECT FirstName, LastName, Salary
FROM Employees
ORDER BY Salary DESC, LastName ASC;

在这里,查询结果会首先按照 Salary 降序排列,若有多个员工的工资相同,则按照 LastName 升序排列。


6. 实战案例

6.1 场景:筛选特定条件的员工

假设我们需要筛选出以下条件的员工:

  1. 薪水在 55000 和 90000 之间;
  2. 部门为 HR 或 Finance;
  3. 姓氏以字母 "J" 开头;
  4. 按薪水降序排列。

我们可以使用以下 SQL 语句来实现:

sql
SELECT FirstName, LastName, JobTitle, Salary
FROM Employees
WHERE Salary BETWEEN 55000 AND 90000
AND DepartmentID IN (SELECT DepartmentID FROM Departments WHERE DepartmentName IN ('HR', 'Finance'))
AND LastName LIKE 'J%'
ORDER BY Salary DESC;

这条查询语句使用了 BETWEEN、IN、LIKE 和 ORDER BY,结合多个条件进行筛选和排序,确保筛选出符合所有要求的员工信息。


7. 总结

在本文中,我们深入探讨了 SQL Server 中 BETWEEN、IN 和 LIKE 三个子句的使用。通过这些子句,你可以实现更加复杂的查询操作,灵活地筛选数据。我们还介绍了如何结合使用这些过滤条件以及 ORDER BY 进行排序。无论是在实际工作中还是数据分析任务中,掌握这些查询技巧可以帮助你更有效地从数据库中提取所需的数据。

通过不断练习和应用,你将能在 SQL Server 的数据查询中游刃有余。