基础:WHERE 子句
WHERE 子句的基本语法结构如下:

SELECT column1, column2, ... FROM table_name WHERE condition;
示例:
假设我们有一个 Students 表:
| StudentID | FirstName | LastName | Age | City |
|---|---|---|---|---|
| 1 | John | Doe | 18 | New York |
| 2 | Jane | Smith | 20 | London |
| 3 | Peter | Jones | 18 | Paris |
| 4 | Mary | Williams | 21 | London |
查询年龄大于 19 岁的学生:
SELECT * FROM Students WHERE Age > 19;
结果: | StudentID | FirstName | LastName | Age | City | | :-------- | :-------- | :------- | :-: | :----- | | 2 | Jane | Smith | 20 | London | | 4 | Mary | Williams | 21 | London |
常用条件运算符
WHERE 子句中的 condition 可以使用多种运算符。

比较运算符
| 运算符 | 描述 | 示例 |
|---|---|---|
| 等于 | WHERE City = 'London' |
|
或 <> |
不等于 | WHERE City != 'London' |
> |
大于 | WHERE Age > 19 |
< |
小于 | WHERE Age < 19 |
>= |
大于或等于 | WHERE Age >= 18 |
<= |
小于或等于 | WHERE Age <= 20 |
逻辑运算符
可以将多个条件组合起来使用。
| 运算符 | 描述 | 示例 |
|---|---|---|
AND |
如果两个条件都为真,则返回真 | WHERE Age > 18 AND City = 'London' |
OR |
如果其中一个条件为真,则返回真 | WHERE City = 'London' OR City = 'Paris' |
NOT |
如果条件为假,则返回真 | WHERE NOT City = 'London' |
示例: 查询年龄大于 18 岁且住在伦敦的学生:
SELECT * FROM Students WHERE Age > 18 AND City = 'London';
结果: | StudentID | FirstName | LastName | Age | City | | :-------- | :-------- | :------- | :-: | :----- | | 2 | Jane | Smith | 20 | London | | 4 | Mary | Williams | 21 | London |
高级查询条件
BETWEEN ... AND ... (在...之间)
用于选取介于两个值之间的数据范围(包含边界值)。

示例: 查询年龄在 18 到 20 岁之间的学生:
SELECT * FROM Students WHERE Age BETWEEN 18 AND 20;
结果: | StudentID | FirstName | LastName | Age | City | | :-------- | :-------- | :------- | :-: | :------- | | 1 | John | Doe | 18 | New York | | 2 | Jane | Smith | 20 | London | | 3 | Peter | Jones | 18 | Paris |
IN (在列表中)
允许您在 WHERE 子句中指定多个值。
示例: 查询住在伦敦或巴黎的学生:
SELECT * FROM Students WHERE City IN ('London', 'Paris');
结果: | StudentID | FirstName | LastName | Age | City | | :-------- | :-------- | :------- | :-: | :----- | | 2 | Jane | Smith | 20 | London | | 3 | Peter | Jones | 18 | Paris |
LIKE (模糊匹配)
用于在 WHERE 子句中进行搜索模式匹配。
通常与通配符一起使用:
| 通配符 | 描述 | 示例 |
|---|---|---|
| 代表零个、一个或多个字符 | WHERE FirstName LIKE 'J%' (以 J 开头) |
|
_ |
代表单个字符 | WHERE FirstName LIKE 'J_n' (J开头,n结尾,中间一个字符) |
示例:
- 查找所有名字以 "J" 开头的学生:
SELECT * FROM Students WHERE FirstName LIKE 'J%';
- 查找所有名字以 "s" 结尾的学生:
SELECT * FROM Students WHERE LastName LIKE '%s';
- 查找名字中包含 "a" 的学生:
SELECT * FROM Students WHERE FirstName LIKE '%a%';
IS NULL / IS NOT NULL (查询空值)
用于查找值为 NULL(空值)或非 NULL 的记录。
示例:
假设 Email 列可能为空:
-- 查询没有邮箱的学生 SELECT * FROM Students WHERE Email IS NULL; -- 查询有邮箱的学生 SELECT * FROM Students WHERE Email IS NOT NULL;
排序和限制结果
查询结果通常需要排序和限制数量。
ORDER BY (排序)
对结果集进行排序,默认为升序 (ASC)。
语法:
SELECT column_list FROM table_name WHERE condition ORDER BY column1 [ASC|DESC], column2 [ASC|DESC];
示例: 按年龄升序排列学生:
SELECT * FROM Students ORDER BY Age ASC; -- 或者省略 ASC,因为它是默认值 SELECT * FROM Students ORDER BY Age;
按年龄降序排列学生:
SELECT * FROM Students ORDER BY Age DESC;
先按城市升序,再按年龄降序排列:
SELECT * FROM Students ORDER BY City ASC, Age DESC;
LIMIT (限制结果数量)
用于限制返回的记录数,在 SQL Server 中,使用 TOP 关键字。
MySQL / PostgreSQL / SQLite 语法:
SELECT * FROM table_name WHERE condition LIMIT number;
示例: 查询年龄最大的 2 名学生:
SELECT * FROM Students ORDER BY Age DESC LIMIT 2;
SQL Server 语法:
SELECT TOP number column_list FROM table_name WHERE condition;
示例:
SELECT TOP 2 * FROM Students ORDER BY Age DESC;
聚合函数与分组 (GROUP BY)
当需要对数据进行分组统计时,会用到 GROUP BY 和聚合函数。
常用聚合函数:
| 函数 | 描述 |
|---|---|
COUNT(column_name) |
返回指定列的值的数目 |
SUM(column_name) |
返回指定列的总和 |
AVG(column_name) |
返回指定列的平均值 |
MAX(column_name) |
返回指定列的最大值 |
MIN(column_name) |
返回指定列的最小值 |
示例: 统计每个城市的学生人数:
SELECT City, COUNT(*) AS NumberOfStudents FROM Students GROUP BY City;
结果: | City | NumberOfStudents | | :------- | :--------------- | | New York | 1 | | London | 2 | | Paris | 1 |
HAVING 子句
WHERE 过滤的是行数据,而 HAVING 过滤的是分组后的数据(聚合结果)。
示例: 统计每个城市的学生人数,并只显示人数大于 1 的城市:
SELECT City, COUNT(*) AS NumberOfStudents FROM Students GROUP BY City HAVING COUNT(*) > 1;
结果: | City | NumberOfStudents | | :----- | :--------------- | | London | 2 |
| 子句/关键字 | 功能 | 示例 |
|---|---|---|
WHERE |
过滤行,基于列值 | WHERE Age > 18 |
AND / OR / NOT |
组合条件 | WHERE Age > 18 AND City = 'London' |
BETWEEN |
范围查询 | WHERE Age BETWEEN 18 AND 20 |
IN |
列表查询 | WHERE City IN ('London', 'Paris') |
LIKE |
模糊查询 | WHERE FirstName LIKE 'J%' |
IS NULL |
查询空值 | WHERE Email IS NULL |
ORDER BY |
排序结果 | ORDER BY Age DESC |
LIMIT / TOP |
限制结果数 | LIMIT 2 或 TOP 2 |
GROUP BY |
分组数据 | GROUP BY City |
HAVING |
过滤分组 | HAVING COUNT(*) > 1 |
COUNT() / SUM() / AVG() 等 |
聚合计算 | COUNT(*) |
掌握这些命令的组合使用,你就可以完成绝大多数的数据查询需求了。
