← 目录从入门到精通SQL Server

数据查询

2024/10/19

SQL Server 数据查询详解:SELECT、WHERE、ORDER BY、DISTINCT、TOP 和 OFFSET-FETCH

在 SQL Server 中,数据查询是操作数据库的核心功能之一。无论是简单的查询还是复杂的数据筛选,都需要用到 SELECT 语句及其相关的条件、排序和限制等操作。本文将深入讲解 SQL Server 中数据查询的基础语法,包括 SELECT 语句的使用、WHERE 过滤条件、数据排序和去重、以及如何限制返回的数据量。


1. SELECT 语法基础

1.1 什么是 SELECT?

SELECT 是 SQL 中最基本、最常用的查询语句,用于从数据库表中检索数据。它可以选择特定的列或所有列,并通过指定不同的条件进行筛选和排序。

1.2 SELECT 基本语法

SELECT 语句的基本结构如下:

sql
SELECT 列名1, 列名2, ...
FROM 表名;

例如,假设我们有一个名为 Employees 的表,它包含员工的姓名、职位和薪水等信息。可以使用以下查询从表中获取所有员工的姓名和职位:

sql
SELECT FirstName, JobTitle
FROM Employees;

1.3 查询所有列

使用 * 通配符可以检索表中的所有列数据:

sql
SELECT * 
FROM Employees;

这条语句会返回 Employees 表中的所有列和行。


2. WHERE 语句和过滤条件

2.1 什么是 WHERE?

WHERE 子句用于筛选满足特定条件的数据。它允许你指定一个或多个条件,只有符合这些条件的记录才会被返回。

2.2 WHERE 基本语法

WHERE 子句通常跟随在 FROM 子句之后,用于指定筛选条件:

sql
SELECT 列名1, 列名2, ...
FROM 表名
WHERE 条件;

例如,获取薪水大于 50000 的员工:

sql
SELECT FirstName, Salary
FROM Employees
WHERE Salary > 50000;

2.3 使用多个条件

你可以使用逻辑运算符 AND 和 OR 来组合多个条件。比如获取薪水大于 50000 并且职位是“Manager”的员工:

sql
SELECT FirstName, JobTitle, Salary
FROM Employees
WHERE Salary > 50000 AND JobTitle = 'Manager';

2.4 常见的条件运算符

  • =:等于
  • >:大于
  • <:小于
  • >=:大于等于
  • <=:小于等于
  • <> 或 !=:不等于
  • BETWEEN:在某个范围内
  • LIKE:用于模糊查询
  • IN:匹配多个值中的一个

**示例:**获取姓氏以 “S” 开头的员工:

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

3. ORDER BY 和 DISTINCT 的使用

3.1 ORDER BY:排序结果

ORDER BY 子句用于对查询结果进行排序,默认是按升序排序,但你也可以指定降序。

3.1.1 ORDER BY 基本语法

sql
SELECT 列名1, 列名2, ...
FROM 表名
ORDER BY 列名1 [ASC|DESC];
  • ASC:升序(默认)
  • DESC:降序

**示例:**按薪水升序排列员工信息:

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

**示例:**按姓氏降序排列员工信息:

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

3.2 DISTINCT:去除重复值

DISTINCT 子句用于去除查询结果中的重复记录,使结果集只包含唯一的值。

3.2.1 DISTINCT 基本语法

sql
SELECT DISTINCT 列名
FROM 表名;

**示例:**获取职位的唯一值:

sql
SELECT DISTINCT JobTitle
FROM Employees;

这条查询会返回所有不同的职位。


4. 限制返回数据:TOP 和 OFFSET-FETCH

在某些情况下,你可能只想返回查询结果中的前几行,或者从某个偏移量开始返回部分数据。SQL Server 提供了 TOP 和 OFFSET-FETCH 子句来实现这一点。

4.1 TOP:返回前几条记录

TOP 子句用于限制返回的行数,可以返回前 n 条记录或者前 n% 的记录。

4.1.1 TOP 基本语法

sql
SELECT TOP (行数) 列名1, 列名2, ...
FROM 表名;

**示例:**获取前 5 个薪水最高的员工:

sql
SELECT TOP (5) FirstName, LastName, Salary
FROM Employees
ORDER BY Salary DESC;

4.1.2 TOP PERCENT

你还可以使用 TOP 子句的百分比形式来获取结果集中前百分之几的记录。

**示例:**获取薪水最高的前 10% 员工:

sql
SELECT TOP (10) PERCENT FirstName, LastName, Salary
FROM Employees
ORDER BY Salary DESC;

4.2 OFFSET-FETCH:分页查询

OFFSET-FETCH 子句允许你实现分页查询,即从查询结果的某个偏移位置开始,获取一定数量的数据。

4.2.1 OFFSET-FETCH 基本语法

sql
SELECT 列名1, 列名2, ...
FROM 表名
ORDER BY 列名1
OFFSET 行数 ROWS FETCH NEXT 行数 ROWS ONLY;

**示例:**从第 6 行开始获取 5 条记录:

sql
SELECT FirstName, LastName, Salary
FROM Employees
ORDER BY Salary DESC
OFFSET 5 ROWS FETCH NEXT 5 ROWS ONLY;

这条查询会跳过前 5 行数据,从第 6 行开始返回 5 条记录。


5. 实战案例:综合应用

假设我们有一个包含员工信息的 Employees 表,现在需要获取以下信息:

  • 薪水大于 60000 且职位为“Manager”的员工;
  • 只返回前 3 个薪水最高的员工;
  • 结果按姓氏降序排列。

我们可以通过以下 SQL 语句实现:

sql
SELECT TOP (3) FirstName, LastName, Salary
FROM Employees
WHERE Salary > 60000 AND JobTitle = 'Manager'
ORDER BY LastName DESC;

6. 总结

通过本文的学习,您应该对 SQL Server 中数据查询的核心语法有了深入的了解。我们详细讲解了 SELECT 语句的基础使用、WHERE 子句的过滤条件、ORDER BY 的排序功能、DISTINCT 的去重查询,以及如何使用 TOP 和 OFFSET-FETCH 限制返回的数据量。

这些 SQL 查询技巧在实际应用中十分常用,无论是简单的报表生成,还是复杂的数据分析,都离不开这些基础操作。通过不断练习和应用,您将能够更加灵活、高效地操作 SQL Server 中的数据。


附录:员工表 (Employees) 数据示例

FirstName LastName JobTitle Salary
Alice Smith Manager 75000
Bob Johnson Developer 60000
Charlie Williams Manager 80000
David Brown Designer 50000
Eve Davis Developer 55000