SQL SELECT语句基础认知
在数据库操作中,SELECT语句是使用频率最高的SQL语句之一,它的核心作用是从数据库表中查询符合条件的数据并返回结果。不管是简单的单表查询,还是复杂的多表关联查询,基础逻辑都围绕SELECT语句展开。很多刚接触数据库的用户会觉得SQL语法复杂,但实际上SELECT语句的基础结构非常清晰,只要掌握核心规则,就能快速上手完成大部分基础查询需求。

SELECT语句基本语法结构
最基础的SELECT语句语法结构如下,所有复杂查询都是在这个基础上扩展而来:
-- 基础SELECT语法 SELECT 列名1, 列名2, ... FROM 表名 [WHERE 过滤条件] [ORDER BY 排序列 [ASC|DESC]] [LIMIT 返回行数];
其中方括号包裹的部分是可选内容,实际使用时可以根据需求选择是否添加。下面我们通过一个用户表作为示例,逐步讲解不同场景下的用法,示例表结构如下:
-- 创建示例用户表
CREATE TABLE user_info (
id INT PRIMARY KEY AUTO_INCREMENT,
user_name VARCHAR(50) NOT NULL,
age INT,
gender VARCHAR(10),
register_time DATE
);
-- 插入测试数据
INSERT INTO user_info (user_name, age, gender, register_time) VALUES
('张三', 22, '男', '2023-01-15'),
('李四', 25, '女', '2023-02-20'),
('王五', 22, '男', '2023-01-15'),
('赵六', 30, '女', '2023-03-10'),
('孙七', 25, '男', '2023-02-20');SELECT语句基础查询场景
查询表中所有数据
如果需要查询表中所有列的所有数据,可以使用星号*代替所有列名,这是最简便的全表查询方式:
-- 查询user_info表所有数据 SELECT * FROM user_info;
执行上述语句后,会返回user_info表中所有行的所有列数据。不过在实际生产环境中,全表查询尤其是大表的全表查询会消耗较多数据库资源,如果不是必要场景,不建议频繁使用这种写法。
查询指定列数据
如果只需要获取表中的某几列数据,可以在SELECT关键字后指定需要查询的列名,多个列名之间用英文逗号分隔:
-- 查询所有用户的姓名和年龄 SELECT user_name, age FROM user_info;
这种方式可以只返回我们需要的字段,减少数据传输量,也是实际开发中最常用的查询方式之一。
为查询列设置别名
有时候查询出来的列名可能不够直观,或者需要对列名做重命名方便后续处理,可以通过AS关键字为列设置别名,AS关键字也可以省略:
-- 为列设置别名,AS可以省略 SELECT user_name AS 用户名, age 年龄 FROM user_info;
执行后返回的列名会显示为“用户名”和“年龄”,而不是原来的字段名,更便于阅读和理解。
SELECT语句条件过滤与结果处理
WHERE子句实现条件过滤
WHERE子句用来筛选符合指定条件的数据,只有满足条件的数据才会被返回。常见的条件运算符包括等于=、不等于!=或<>、大于>、小于<、大于等于>=、小于等于<=,还有BETWEEN...AND...、IN、LIKE等逻辑运算符。
-- 查询年龄大于22岁的用户 SELECT user_name, age FROM user_info WHERE age > 22; -- 查询年龄是22或者25的用户 SELECT user_name, age FROM user_info WHERE age IN (22, 25); -- 查询年龄在20到25之间的用户 SELECT user_name, age FROM user_info WHERE age BETWEEN 20 AND 25; -- 查询姓名以“张”开头的用户,%代表任意长度字符 SELECT user_name, age FROM user_info WHERE user_name LIKE '张%'; -- 查询性别不为空的记录 SELECT user_name, gender FROM user_info WHERE gender IS NOT NULL;
如果需要多个条件组合,还可以使用AND和OR逻辑运算符,AND代表多个条件同时满足,OR代表满足其中一个条件即可:
-- 查询年龄大于22且性别为男的用户 SELECT user_name, age, gender FROM user_info WHERE age > 22 AND gender = '男'; -- 查询年龄小于23或者性别为女的用户 SELECT user_name, age, gender FROM user_info WHERE age < 23 OR gender = '女';
ORDER BY子句实现结果排序
默认情况下SELECT语句返回的数据是没有固定顺序的,如果需要按照指定列排序,可以使用ORDER BY子句。ASC代表升序排列,是默认排序方式,可以不写;DESC代表降序排列。
-- 按照年龄升序排列查询结果 SELECT user_name, age FROM user_info ORDER BY age ASC; -- 按照年龄降序排列,年龄相同再按照用户名升序排列 SELECT user_name, age FROM user_info ORDER BY age DESC, user_name ASC;
DISTINCT实现去重查询
如果查询的结果中存在重复行,可以使用DISTINCT关键字对结果去重,只返回不重复的记录:
-- 查询所有不重复的年龄 SELECT DISTINCT age FROM user_info; -- 查询不重复的年龄和性别组合 SELECT DISTINCT age, gender FROM user_info;
需要注意的是,DISTINCT是对查询的所有列组合去重,而不是只对第一个列去重。
LIMIT限制返回行数
当表中数据量很大时,我们可能只需要返回前几条数据,这时候可以使用LIMIT子句限制返回的行数,不同数据库可能语法略有差异,以下是MySQL中的用法:
-- 返回前3条数据 SELECT user_name, age FROM user_info LIMIT 3; -- 跳过前2条,返回接下来的3条数据,常用于分页查询 SELECT user_name, age FROM user_info LIMIT 2, 3;
SELECT语句进阶用法
聚合函数与GROUP BY分组
SELECT语句还可以搭配聚合函数使用,常见的聚合函数有COUNT(统计行数)、SUM(求和)、AVG(求平均值)、MAX(求最大值)、MIN(求最小值)。如果需要对数据进行分组统计,可以结合GROUP BY子句使用。
-- 统计每个年龄的用户数量 SELECT age, COUNT(*) AS user_count FROM user_info GROUP BY age; -- 统计男性和女性的平均年龄 SELECT gender, AVG(age) AS avg_age FROM user_info GROUP BY gender; -- 统计每个注册日期的用户数,只返回用户数大于1的日期 SELECT register_time, COUNT(*) AS user_count FROM user_info GROUP BY register_time HAVING COUNT(*) > 1;
这里需要注意HAVING和WHERE的区别:WHERE是在分组前过滤数据,HAVING是在分组后对分组结果进行过滤,WHERE中不能使用聚合函数,HAVING中可以。
常见函数使用
SELECT语句中还可以使用各种内置函数处理数据,比如字符串函数、日期函数等:
-- 将用户名转为大写 SELECT user_name, UPPER(user_name) AS upper_name FROM user_info; -- 查询注册时间在2023年2月之后的用户 SELECT user_name, register_time FROM user_info WHERE register_time >= '2023-02-01'; -- 计算用户的注册到现在过去了多少天 SELECT user_name, DATEDIFF(CURDATE(), register_time) AS days_from_register FROM user_info;
SELECT语句使用注意事项
- 避免使用SELECT * 进行查询,尤其是大表场景,会浪费数据库资源和网络带宽,明确指定需要的列名更高效。
- WHERE子句中的条件尽量使用索引列,避免对列进行函数操作,否则可能导致索引失效,影响查询效率。
- LIKE模糊查询中,如果以%开头,也会导致索引失效,非必要场景尽量不要使用前置%。
- 分组查询时,SELECT后面出现的列要么是分组列,要么是聚合函数处理的列,否则查询结果可能不符合预期。
- 不同数据库的SELECT语法存在细微差异,比如分页查询在MySQL中用LIMIT,Oracle中用ROWNUM,SQL Server中用TOP,使用时需要根据对应数据库调整。
掌握了以上SELECT语句的基础和进阶用法,就能应对大部分日常数据库的查询需求,后续可以逐步学习多表关联查询、子查询等更复杂的内容,不断提升数据库操作能力。