create table if not exists student ( id integer not null primary key AUTOINCREMENT, name varchar(256) not null, age int null, class_id bigint not null, score double default 0 null, exam_num int default 0 null );
SELECT SUM(score) AS total_score, // 求和 AVG(score) AS avg_score, // 平均值 MAX(score) AS max_score, // 最大值 MIN(score) AS min_score // 最小值 FROM student;
单字段分组
1 2 3 4 5 6 7
SELECT class_id, AVG(score) AS avg_score FROM student GROUPBY class_id;
多字段分组
1 2 3 4 5 6 7 8
SELECT class_id, exam_num, COUNT(*) AS total_num FROM student GROUPBY class_id, exam_num;
分组后过滤
1 2 3 4 5 6 7 8 9
SELECT class_id, SUM(score) AS total_score FROM student GROUPBY class_id HAVING SUM(score) >150;
关联查询 - cross join 假设有一个学生表 student ,包含以下字段:id(学号)、name(姓名)、age(年龄)、class_id(班级编号);还有一个班级表 class ,包含以下字段:id(班级编号)、name(班级名称)。 请你编写一个 SQL 查询,将学生表和班级表的所有行组合在一起,并返回学生姓名(student_name)、学生年龄(student_age)、班级编号(class_id)以及班级名称(class_name)。 select s.name student_name, s.age student_age, s.class_id class_id, c.name class_name from student s, class c;
关联查询 - inner join select s.name student_name, s.age student_age, s.class_id class_id, c.name class_name, c.level class_level from student s join class c on s.class_id = c.id;
关联查询 - outer join(left join, right join) select s.name student_name, s.age student_age, s.class_id class_id, c.name class_name, c.level class_level from student s left join class c on s.class_id = c.id;
子查询 select name, score, class_id from student where class_id in (select distinct id from class); 子查询中的一种特殊类型是 “exists” 子查询,用于检查主查询的结果集是否存在满足条件的记录,它返回布尔值(True 或 False),而不返回实际的数据。 select name, age, class_id from student where not exists (select class_id from class where class.id = student.class_id);
组合查询:将多个 SELECT 查询结果合并 UNION 和 UNION ALL(不去除重复的行)
1 2 3
select name, age, score, class_id from student unionall select name, age, score, class_id from student_new;
开窗函数 - sum over 开窗函数 - 允许我们在查询中进行对分组数据进行计算、同时保留原始行的详细信息。 SUM(计算字段名) OVER (PARTITION BY 分组字段名)
1 2 3 4 5 6 7 8 9 10
SELECT id, name, age, class_id, score, exam_num, AVG(score) OVER (PARTITIONBY class_id) AS class_avg_score FROM student;
开窗函数 - sum over order by SUM(计算字段名) OVER (PARTITION BY 分组字段名 ORDER BY 排序字段 排序规则)
1 2 3 4 5 6 7 8 9
SELECT id, name, age, score, class_id, SUM(score) OVER (PARTITIONBY class_id ORDERBY score ASC) AS class_sum_score FROM student;
开窗函数 - rank 对查询结果集中的行进行排名
1 2 3 4
RANK() OVER ( PARTITIONBY 列名1, 列名2, ... -- 可选,用于指定分组列 ORDERBY 列名3 [ASC|DESC], 列名4 [ASC|DESC], ... -- 用于指定排序列及排序方式 ) AS rank_column
开窗函数 - row_number 为查询结果集中的每一行分配唯一连续排名
1 2 3 4
ROW_NUMBER() OVER ( PARTITIONBY column1, column2, ... -- 可选,用于指定分组列 ORDERBY column3 [ASC|DESC], column4 [ASC|DESC], ... -- 用于指定排序列及排序方式 ) AS row_number_column
开窗函数 - lag / lead (前/后) 获取在当前行之前或之后的行的值
1 2 3 4 5 6 7 8 9 10
SELECT id, name, age, score, class_id, LAG(name) over (PARTITIONBY class_id ORDERBY score DESC) as prev_name, LEAD(name) OVER (PARTITIONBY class_id ORDERBY score DESC) AS next_name FROM student;