
在 SQL 操作中,SELECT
语句是数据检索的核心,通过它可以从表中精准提取所需信息。本文基于COMPANY
表,通过具体案例详解SELECT
的常用用法,包括逻辑运算、模糊查询、范围筛选等,覆盖从简单到复杂的查询场景。
一、基础准备:表结构与测试数据
首先创建COMPANY
表并插入测试数据,作为后续查询的基础:
1. 表结构设计
sql
CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL, -- 员工ID(主键,非空)
NAME TEXT NOT NULL, -- 员工姓名(非空)
AGE INT NOT NULL, -- 年龄(非空)
ADDRESS CHAR(50), -- 地址(可空)
SALARY REAL -- 薪资(可空,浮点型)
);
2. 插入测试数据
sql
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES
(1, 'Paul', 32, 'California', 20000.00 ),
(2, 'Allen', 25, 'Texas', 15000.00 ),
(3, 'Teddy', 23, 'Norway', 20000.00 ),
(4, 'Mark', 25, 'Rich-Mond ', 65000.00 ),
(5, 'David', 27, 'Texas', 85000.00 ),
(6, 'Kim', 22, 'South-Hall', 45000.00 ),
(7, 'James', 24, 'Houston', 10000.00 );
3. 查看全表数据
执行基础查询,确认数据插入成功:
sql
select * from COMPANY; -- "*" 表示查询所有字段
查询结果(7 条记录):
ID | NAME | AGE | ADDRESS | SALARY |
---|---|---|---|---|
1 | Paul | 32 | California | 20000.0 |
2 | Allen | 25 | Texas | 15000.0 |
3 | Teddy | 23 | Norway | 20000.0 |
4 | Mark | 25 | Rich-Mond | 65000.0 |
5 | David | 27 | Texas | 85000.0 |
6 | Kim | 22 | South-Hall | 45000.0 |
7 | James | 24 | Houston | 10000.0 |
二、条件筛选:逻辑运算符的应用
通过WHERE
子句结合逻辑运算符,可实现多条件的数据过滤,常用运算符包括AND
、OR
等。
1. AND
:同时满足多个条件
案例 :找出年龄≥25 且 薪资≥65000 的员工
sql
select * from company where age >= 25 and salary >= 65000;
结果(同时满足两个条件的记录):
ID | NAME | AGE | ADDRESS | SALARY |
---|---|---|---|---|
4 | Mark | 25 | Rich-Mond | 65000.0 |
5 | David | 27 | Texas | 85000.0 |
2. OR
:满足任意一个条件
案例 :找出年龄≥25 或者 薪资≥65000 的员工
sql
select * from company where age >= 25 or salary >= 65000;
结果(满足任一条件的记录):
ID | NAME | AGE | ADDRESS | SALARY | |
---|---|---|---|---|---|
1 | Paul | 32 | California | 20000.0 | (年龄≥25) |
2 | Allen | 25 | Texas | 15000.0 | (年龄≥25) |
4 | Mark | 25 | Rich-Mond | 65000.0 | (两者均满足) |
5 | David | 27 | Texas | 85000.0 | (两者均满足) |
三、特殊值处理:NULL
判断
NULL
表示 "未知值"(非空字符串或 0),需用IS NULL
或IS NOT NULL
判断,不可直接用=
或!=
。
案例 :找出age
字段不为空的员工(本案例中age
均非空,故返回全表)
sql
select * from company where age is not null;
说明 :若表中存在age
为NULL
的记录(如INSERT INTO COMPANY VALUES (8, 'Lisa', NULL, 'NY', 50000);
),则该记录会被排除。
四、模糊查询:LIKE
匹配字符串
LIKE
用于按模式匹配字符串,支持两个通配符:
%
:匹配任意长度的字符(包括 0 个)_
:匹配单个字符
1. 匹配前缀
案例 :找出name
以 "Pa" 开头的员工
sql
select * from company where name like 'Pa%'; -- "Pa%" 表示以Pa开头,后面任意字符
结果:
ID | NAME | AGE | ADDRESS | SALARY |
---|---|---|---|---|
1 | Paul | 32 | California | 20000.0 |
2. 数值类型的模糊匹配(PostgreSQL 特殊处理)
LIKE
仅支持字符串匹配,若需对数值字段(如SALARY
)进行模糊查询,需先转换为字符串(PostgreSQL 用::text
)。
案例 :找出salary
以 "20" 开头的员工
sql
select * from company where salary::text like '20%'; -- 将salary转为文本后匹配
结果:
ID | NAME | AGE | ADDRESS | SALARY |
---|---|---|---|---|
1 | Paul | 32 | California | 20000.0 |
3 | Teddy | 23 | Norway | 20000.0 |
五、集合筛选:IN
与NOT IN
IN
用于判断字段值是否在指定集合中,NOT IN
则相反。
1. IN
:匹配集合中的任意值
案例:找出年龄为 25 或 27 的员工
sql
select * from company where age in (25, 27); -- age是25或27
结果:
ID | NAME | AGE | ADDRESS | SALARY |
---|---|---|---|---|
2 | Allen | 25 | Texas | 15000.0 |
4 | Mark | 25 | Rich-Mond | 65000.0 |
5 | David | 27 | Texas | 85000.0 |
2. NOT IN
:排除集合中的值
案例:找出年龄不为 25 且不为 27 的员工
sql
select * from company where age not in (25, 27); -- age不是25也不是27
结果:
ID | NAME | AGE | ADDRESS | SALARY |
---|---|---|---|---|
1 | Paul | 32 | California | 20000.0 |
3 | Teddy | 23 | Norway | 20000.0 |
6 | Kim | 22 | South-Hall | 45000.0 |
7 | James | 24 | Houston | 10000.0 |
六、范围查询:BETWEEN
BETWEEN
用于匹配 "某个范围内的值",包含边界值(等价于>=
且<=
)。
案例:找出年龄在 25 到 27 之间的员工(包括 25 和 27)
sql
select * from company where age between 25 and 27; -- 等价于 age >=25 and age <=27
结果:
ID | NAME | AGE | ADDRESS | SALARY |
---|---|---|---|---|
2 | Allen | 25 | Texas | 15000.0 |
4 | Mark | 25 | Rich-Mond | 65000.0 |
5 | David | 27 | Texas | 85000.0 |
七、结果限制:LIMIT
与OFFSET
LIMIT
用于限制返回的记录数,OFFSET
用于指定从第几条记录开始(默认从 0 开始),常用于分页查询。
1. LIMIT
:取前 N 条记录
案例:列出表中前 3 条记录
sql
select * from company limit 3;
结果(前 3 条):
ID | NAME | AGE | ADDRESS | SALARY |
---|---|---|---|---|
1 | Paul | 32 | California | 20000.0 |
2 | Allen | 25 | Texas | 15000.0 |
3 | Teddy | 23 | Norway | 20000.0 |
2. LIMIT + OFFSET
:分页查询
案例:列出表中第 4-7 条记录(从第 3 条后开始,取 4 条)
sql
select * from company limit 4 offset 3; -- OFFSET 3 表示跳过前3条,LIMIT 4 表示取4条
结果(第 4-7 条):
ID | NAME | AGE | ADDRESS | SALARY |
---|---|---|---|---|
4 | Mark | 25 | Rich-Mond | 65000.0 |
5 | David | 27 | Texas | 85000.0 |
6 | Kim | 22 | South-Hall | 45000.0 |
7 | James | 24 | Houston | 10000.0 |
总结:SELECT 检索核心用法速查表
需求场景 | 关键字 / 语法 | 示例 |
---|---|---|
多条件同时满足 | AND |
where age>=25 and salary>=65000 |
多条件满足其一 | OR |
where age>=25 or salary>=65000 |
判断非空值 | IS NOT NULL |
where age is not null |
模糊匹配(字符串) | LIKE + % /_ |
where name like 'Pa%' |
匹配集合中的值 | IN |
where age in (25,27) |
排除集合中的值 | NOT IN |
where age not in (25,27) |
范围查询(包含边界) | BETWEEN ... AND ... |
where age between 25 and 27 |
限制返回记录数 | LIMIT |
limit 3 |
分页查询(跳过前 N 条) | LIMIT ... OFFSET ... |
limit 4 offset 3 |
通过上述案例,可掌握SELECT
检索的核心技巧。实际应用中,可根据业务需求组合多种条件,实现精准的数据提取。