数据库单表的查询语句是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:限制返回的结果行数,常用于分页查询。
常用查询子句详解
查询指定列
若只需要表中部分列的数据,可以在SELECT子句中明确列出列名,用逗号分隔,查询员工表中的姓名和薪资:
SELECT name, salary FROM employees;
查询所有列
使用星号(*)可以快速返回表中的所有列,但生产环境中建议避免使用,因为星号会降低查询性能且可读性较差:
SELECT * FROM employees;
条件查询(WHERE子句)
WHERE子句通过运算符(如=、>、<、<>、LIKE、IN、BETWEEN等)实现数据过滤,以下是常见条件示例:
| 条件类型 | 示例 | 说明 |
|---|---|---|
| 等值查询 | WHERE department = ‘IT’ | 查询IT部门的所有员工 |
| 范围查询 | WHERE salary BETWEEN 5000 AND 10000 | 查询薪资在5000到10000之间的员工 |
| 模糊查询 | WHERE name LIKE ‘张%’ | 查询姓张的所有员工 |
| 集合查询 | WHERE department IN (‘IT’, ‘Finance’) | 查询IT或Finance部门的员工 |
| 空值判断 | WHERE bonus IS NULL | 查询没有奖金的员工 |
排序查询(ORDER BY子句)
ORDER BY子句默认按升序排列,若需降序需添加DESC关键字,可以按多列排序,优先级按列顺序排列:
SELECT name, salary FROM employees ORDER BY salary DESC, name ASC;
聚合函数与分组
聚合函数(如COUNT、SUM、AVG、MAX、MIN)用于对列进行计算,常与GROUP BY子句结合使用,统计每个部门的员工人数:

SELECT department, COUNT(*) AS employee_count FROM employees GROUP BY department;
限制结果集(LIMIT子句)
LIMIT子句常用于实现分页功能,查询薪资最高的前5名员工:
SELECT name, salary FROM employees ORDER BY salary DESC LIMIT 5;
查询结果的格式化输出
使用别名(AS)
通过AS关键字可以为列或表指定别名,提升结果可读性:
SELECT name AS '员工姓名', salary AS '月薪' FROM employees;
去重查询(DISTINCT)
若需去除结果中的重复值,可在列名前添加DISTINCT关键字:
SELECT DISTINCT department FROM employees;
复杂查询示例
假设有一个学生表(students),包含字段:id(学号)、name(姓名)、age(年龄)、gender(性别)、score(成绩),以下是几个复杂查询案例:
查询年龄大于18岁的女生成绩,按成绩降序排列:
SELECT name, score FROM students WHERE age > 18 AND gender = '女' ORDER BY score DESC;
统计每个性别的平均成绩和最高成绩:
SELECT gender, AVG(score) AS avg_score, MAX(score) AS max_score FROM students GROUP BY gender;
查询成绩在80到90之间的学生信息,仅显示前10条:

SELECT * FROM students WHERE score BETWEEN 80 AND 90 LIMIT 10;
性能优化建议
- **避免使用SELECT ***:明确指定需要的列,减少数据传输量。
- 合理使用WHERE:尽早过滤数据,降低后续处理的数据量。
- 为常用查询字段添加索引:如WHERE子句中的列、ORDER BY的列等。
- LIMIT分页优化:对于深度分页(如LIMIT 100000, 10),可改用基于索引的游标分页。
相关问答FAQs
Q1: 如何在查询结果中显示列的别名,并确保别名中包含空格?
A1: 在SQL中,若别名包含空格或特殊字符,需用单引号(’)、双引号(”)或方括号([])包裹。
SELECT name AS '员工姓名', salary AS '基本工资' FROM employees;
不同数据库的语法略有差异:MySQL和SQLite支持单引号,SQL Server支持双引号或方括号,Oracle则建议使用双引号。
Q2: 为什么使用GROUP BY后,SELECT子句中未聚合的列会报错?
A2: 根据SQL标准,当查询包含GROUP BY子句时,SELECT子句中的非聚合列必须出现在GROUP BY子句中,这是因为分组后,每个分组可能对应多行原始数据,数据库需要明确如何处理这些行的非聚合列,以下查询会报错:
-- 错误示例 SELECT department, name FROM employees GROUP BY department;
正确做法是:要么将非聚合列添加到GROUP BY中(如GROUP BY department, name),要么使用聚合函数(如GROUP_CONCAT(name))处理非聚合列。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复