数据库单表查询语句是SQL语言中最基础也是最重要的组成部分,它允许用户从数据库的单张表中检索、筛选、排序和聚合数据,掌握单表查询语句的编写方法,是进行数据分析和处理的前提,本文将详细介绍单表查询语句的构成、常用语法及实际应用场景。

SELECT语句的基本结构
单表查询的核心是SELECT语句,其基本语法结构如下:
SELECT column1, column2, ... FROM table_name [WHERE condition] [ORDER BY column1 [ASC|DESC]] [LIMIT number];
各部分的含义如下:
- SELECT子句:指定要查询的列名,可以使用表示查询所有列,列名之间用逗号分隔。
- FROM子句:指定查询的表名,即数据来源。
- WHERE子句:可选,用于筛选满足特定条件的行,如果不使用,则查询表中的所有行。
- ORDER BY子句:可选,用于对查询结果进行排序,默认为升序(ASC),可指定降序(DESC)。
- LIMIT子句:可选,用于限制返回结果的数量,常用于分页查询。
常用查询条件与运算符
WHERE子句是查询语句的筛选核心,通过使用不同的运算符可以实现精确查询、范围查询、模糊查询等。
比较运算符
用于比较列值与常量或表达式,常用的有:, >, <, >=, <=, <>或(不等于)。
示例:查询年龄大于等于18岁的用户信息。
SELECT * FROM users WHERE age >= 18;
逻辑运算符
用于组合多个条件,常用的有:AND(与)、OR(或)、NOT(非)。
示例:查询年龄在20到30岁之间且性别为女性的用户。
SELECT * FROM users WHERE age BETWEEN 20 AND 30 AND gender = '女';
模糊查询
使用LIKE运算符配合通配符实现,通配符包括:
- 匹配任意数量的任意字符。
_:匹配单个任意字符。
示例:查询姓名中以“张”开头的用户。
SELECT * FROM users WHERE name LIKE '张%';
范围查询
使用BETWEEN...AND...或IN运算符。

示例:查询年龄在18到25岁之间的用户。
SELECT * FROM users WHERE age BETWEEN 18 AND 25;
示例:查询城市为“北京”或“上海”的用户。
SELECT * FROM users WHERE city IN ('北京', '上海');
空值判断
使用IS NULL或IS NOT NULL判断列值是否为空。
示例:查询邮箱未填写的用户。
SELECT * FROM users WHERE email IS NULL;
排序与限制结果
排序结果
使用ORDER BY子句可以对查询结果按指定列进行升序或降序排列,可以按多列排序,优先级按列的顺序排列。
示例:查询用户信息,按年龄降序排列,年龄相同则按用户名升序排列。
SELECT * FROM users ORDER BY age DESC, name ASC;
限制结果数量
使用LIMIT子句可以限制返回的行数,常用于实现分页功能,MySQL中LIMIT的语法为LIMIT offset, count,表示从offset位置开始返回count条记录。
示例:查询年龄最大的前5个用户。
SELECT * FROM users ORDER BY age DESC LIMIT 5;
示例:查询第6到第10条用户记录(分页查询,每页5条)。
SELECT * FROM users LIMIT 5, 5;
聚合函数与分组查询
聚合函数对一组值进行计算并返回单个值,常用的聚合函数包括:

COUNT():计算行数。SUM():计算总和。AVG():计算平均值。MAX():计算最大值。MIN():计算最小值。
示例:统计用户总数、平均年龄、最大年龄。
SELECT COUNT(*) AS total_users, AVG(age) AS avg_age, MAX(age) AS max_age FROM users;
如果需要对查询结果进行分组统计,可以使用GROUP BY子句。
示例:按性别统计用户数量和平均年龄。
SELECT gender, COUNT(*) AS count, AVG(age) AS avg_age FROM users GROUP BY gender;
查询结果去重
使用DISTINCT关键字可以去除查询结果中的重复行。
示例:查询用户表中所有的城市(不重复)。
SELECT DISTINCT city FROM users;
综合示例
假设有一个students表,包含id(学号)、name(姓名)、gender(性别)、age(年龄)、class(班级)、score(成绩)等字段,以下是一个综合查询示例:
需求:查询班级为“计算机1班”的 female 学生,按成绩降序排列,返回前3名,并显示学号、姓名和成绩。
SELECT id, name, score FROM students WHERE class = '计算机1班' AND gender = '女' ORDER BY score DESC LIMIT 3;
相关问答FAQs
*问题1:SELECT 和指定具体列名查询有什么区别?*
答:`SELECT `会查询表中的所有列,虽然使用方便,但在实际应用中存在以下问题:
- 性能问题:当表包含大量列或大文本字段时,查询不必要的数据会增加网络传输和内存消耗。
- 维护问题:如果表结构发生变化(如新增列),
SELECT *可能会返回额外的列,导致应用程序逻辑错误。 - 安全性问题:可能暴露敏感字段。
建议在实际开发中明确指定所需的列名,以提高查询效率和代码可维护性。
问题2:为什么WHERE子句中不建议对列进行函数运算?
答:在WHERE子句中对列使用函数(如WHERE UPPER(name) = '张三')会导致数据库无法使用索引,从而进行全表扫描,严重影响查询性能。
优化方法:
- 如果可能,尽量使用原生条件(如
WHERE name = '张三')。 - 对于必须使用函数的场景,可以考虑创建函数索引(如MySQL的函数索引)或使用计算列。
- 在应用层进行函数处理,再传入查询条件。