一、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