一、SQL 语句查询数据库基础
(一)简单查询
在 SQL 中,最基本的查询语句是SELECT语句,要从名为students的表中查询所有学生的姓名和年龄,可以使用以下语句:
SELECT name, age FROM students;
| 字段 | 说明 |
SELECT |
用于指定要查询的列,多个列之间用逗号隔开。 |
FROM |
指定数据来源的表。 |
如果要查询特定条件的数据,比如查询年龄大于 18 岁的学生,可以使用WHERE子句:
SELECT name, age FROM students WHERE age > 18;
| 子句 | 作用 |
WHERE |
用于筛选符合特定条件的记录,条件表达式可以包含比较运算符(如>、<、=等)、逻辑运算符(如AND、OR、NOT)等。 |
(二)聚合函数查询
常用的聚合函数有SUM()(求和)、AVG()(求平均值)、COUNT()(计数)、MAX()(求最大值)、MIN()(求最小值)等,要计算students表中所有学生的平均年龄,可以使用:
SELECT AVG(age) AS average_age FROM students;
| 函数 | 功能 |
AVG() |
计算指定列的平均值。 |
AS |
为计算结果起一个别名,方便阅读和引用。 |
若要统计不同性别的学生人数,可以使用GROUP BY子句结合COUNT()函数:

SELECT gender, COUNT(*) AS student_count FROM students GROUP BY gender;
| 子句/函数 | 说明 |
GROUP BY |
按照指定的列对数据进行分组,每个组应用聚合函数进行计算。 |
COUNT(*) |
统计每组的记录数。 |
二、多表查询
(一)内连接查询
假设有两个表students(学生表,包含学号、姓名、班级编号等字段)和classes(班级表,包含班级编号、班级名称等字段),要查询每个学生的姓名和所在班级名称,可以使用内连接:
SELECT students.name, classes.class_name FROM students INNER JOIN classes ON students.class_id = classes.class_id;
| 关键字/操作 | 含义 |
INNER JOIN |
内连接,只返回两个表中满足连接条件的记录。 |
ON |
指定连接条件,这里是根据class_id字段在两个表之间建立连接关系。 |
(二)外连接查询
如果希望查询所有学生信息,即使某些学生没有对应的班级信息(比如班级信息丢失或尚未分配班级),可以使用左外连接:
SELECT students.name, classes.class_name FROM students LEFT JOIN classes ON students.class_id = classes.class_id;
| 关键字 | 特点 |
LEFT JOIN |
左外连接,以左表(这里是students表)为基准,即使右表没有匹配的记录,也会返回左表的记录,右表对应字段为空值。 |
三、子查询与嵌套查询

(一)子查询示例
要查询成绩高于班级平均成绩的学生信息,可以先使用子查询计算班级平均成绩,再在外层查询中使用该子查询结果进行筛选:
SELECT student_id, score FROM scores WHERE score > (SELECT AVG(score) FROM scores GROUP BY class_id);
| 部分 | 解释 |
| 子查询 | (SELECT AVG(score) FROM scores GROUP BY class_id)计算出每个班级的平均成绩,这是一个独立的查询语句,返回一个包含班级平均成绩的结果集。 |
| 外层查询 | 从scores表中选择成绩高于子查询结果(班级平均成绩)的学生学号和成绩。 |
(二)嵌套查询示例
若要查询成绩排名前 3 的学生所在班级及班级平均成绩,可以使用嵌套查询:
SELECT class_id, AVG(score) AS avg_score
FROM (SELECT class_id, score, ROW_NUMBER() OVER (PARTITION BY class_id ORDER BY score DESC) AS row_num
FROM scores) subquery
WHERE row_num <= 3
GROUP BY class_id;
| 部分 | 功能 |
内部子查询(别名subquery) |
使用窗口函数ROW_NUMBER()为每个班级的成绩按降序排名,PARTITION BY class_id表示按班级分组进行排名。 |
| 外部查询 | 从内部子查询结果中筛选出排名前 3(row_num<= 3)的记录,然后按班级分组计算平均成绩。 |
相关问题与解答
问题一:在多表查询中,如果连接条件错误会导致什么结果?

解答:如果连接条件错误,可能导致查询结果为空或者返回错误的数据关联,在上述学生和班级的连接查询中,如果将连接条件写成ON students.class_id = classes.wrong_column(假设wrong_column是一个不存在或不相关的列),那么可能无法正确匹配学生和班级的数据,最终查询结果可能会不符合预期,比如返回空结果集或者错误的学生班级对应关系。
问题二:为什么在子查询中不能直接使用聚合函数的结果进行筛选?
解答:在 SQL 的标准语法中,子查询通常是作为一个独立的查询单元,其结果集在外部查询中被引用,直接在子查询中使用聚合函数结果进行筛选不符合 SQL 的执行逻辑顺序,不能直接写WHERE score > AVG(score)(这里假设没有分组等情况),因为这样 SQL 引擎不知道如何先计算聚合函数再进行筛选,必须先通过子查询计算出聚合函数的结果,然后在外部查询中引用这个结果来进行筛选,这样才能按照正确的逻辑顺序执行查询操作,确保查询的准确性和可理解性。
来源互联网整合,作者:小编,如若转载,请注明出处:https://www.aiboce.com/ask/139154.html