select * from 表名
假设有一张名为
student
的数据表,它存储了学生的信息,包括学号、姓名、年龄等。现在,使用 select 全表查询语句,查看整个学生表的内容。
数据表
student
:
学号 姓名 年龄 101 小明 20 102 小红 22 SQL 查询语句:
select * from student;
查询结果:
学号 姓名 年龄 101 小明 20 102 小红 22
select {列名...}
假设有一张名为
students
的学生数据表,它存储了班级里学生的信息,包括姓名(name)、年龄(age)、性别(gender)、分数(score)等。数据表
students
:
name age gender score John 18 Male 90 Alice 17 Female 88 现在,我们使用"选择查询"来获取所有学生的姓名(name)和性别(gender)信息,SQL 语句如下:
select name, gender from students;
查询结果:
name gender John Male Alice Female 通过上述 SQL 查询语句,我们得到了学生名单表中所有学生的姓名和性别信息。
select {原始字段名} as {别名}, {原始字段名} as {别名} from 表名
假设有一张名为
employees
的数据表,它存储了团队成员的信息,包括姓名(name)、年龄(age)、职位(position)等:数据表
employees
:
name age position John 30 Project Manager Alice 28 Software Engineer 现在,我们使用 "别名" 来获取所有团队成员的姓名(name)和职位(position)信息,并为它们取别名为
员工姓名
和职位名称
:
-- SQL查询语句 select name as 员工姓名, position as 职位名称 from employees;上述代码中的 as 也可以省略,比如
name 员工姓名
也是 ok 的。查询结果,注意表格头的列名从英文变为了中文:
员工姓名 职位名称 John Project Manager Alice Software Engineer
假设有一张名为
orders
的数据表,它存储了订单信息,包括订单编号(order_id)、商品单价(unit_price)、购买数量(quantity)等:数据表
orders
:
order_id unit_price quantity 1001 10.00 5 1002 20.00 3 现在,我们需要计算每个订单的总金额(total_amount),即商品单价(unit_price)乘以购买数量(quantity)。
SQL 查询语句如下:
select order_id, unit_price, quantity, unit_price * quantity as total_amount from orders;
查询结果如下,其中 total_amount 是计算出来的新列:
order_id unit_price quantity total_amount 1001 10.00 5 50.00 1002 20.00 3 60.00 此外,SQL 可以直接把常量作为列名,比如执行下列 SQL 语句:
select 200, '篮球' as hobby;
查询结果如下:
200 hobby 200 篮球
从名为
student
的数据表中选择出所有学生的姓名(name)和分数(score),并且额外计算出分数的 2 倍(double_score)。
select name,score,score*2 as double_score from student
- SELECT 列1, 列2, ...
- FROM 表名
- WHERE 条件;
其中,列1, 列2, ...是你要选择的列,可以是具体的列名,也可以是*表示选择所有列。
表名是你要从中查询数据的表名。
条件是指定的查询条件,可以使用比较运算符(如=、<、>等)、逻辑运算符(如AND、OR等)、IN 操作符、LIKE 操作符等来设置条件。
select name, score from student where name = '鱼皮'
从名为
student
的数据表中选择出所有学生的姓名(name)和成绩(score),要求学生姓名为 '鱼皮'。
运算符是 SQL 中用于在条件查询中进行条件判断的特殊符号,比如
=
、!=
、<
、>
等。
select name,age from student where name !='热dog'
从名为
student
的数据表中选择出所有学生的姓名(name)和年龄(age),要求学生姓名不等于 '热dog' 。
空值表示该字段的值是未知的、不存在的或者没有被填写的。在SQL查询中,我们可以使用 "IS NULL" 和 "IS NOT NULL" 来判断字段是否为空值或非空值。
select name, age, score from student where age is not null
从名为
student
的数据表中选择出所有学生的姓名(name)、年龄(age)和成绩(score),要求学生年龄不为空值。
模糊查询是一种特殊的条件查询,它允许我们根据模式匹配来查找符合特定条件的数据,可以使用 LIKE 关键字实现模糊查询。
在 LIKE 模糊查询中,我们使用通配符来代表零个或多个字符,从而能够快速地找到匹配的数据。
有如下 2 种通配符:
- 百分号(%):表示任意长度的任意字符序列。
- 下划线(_):表示任意单个字符。
select name, score from student where name not like '%李%'
从名为
student
的数据表中选择出所有学生的姓名(name)和成绩(score),要求姓名(name)不包含 "李" 这个字。
- -- SQL查询语句,关键字 "张" 的员工信息:
- select name, age, position from employees where name like '%张%';
-
- -- 只查询以 "张" 开头的数据行
- select name, age, position from employees where name like '张%';
-
- -- 只查询以 "张" 结尾的数据行
- select name, age, position from employees where name like '%张';
逻辑运算是一种在条件查询中使用的运算符,它允许我们结合多个条件来过滤出符合特定条件的数据。在逻辑运算中,常用的运算符有:
- AND:表示逻辑与,要求同时满足多个条件,才返回 true。
- OR:表示逻辑或,要求满足其中任意一个条件,就返回 true。
- NOT:表示逻辑非,用于否定一个条件(本来是 true,用了 not 后转为 false)
select name, score from student where name like '%李%' or score > 500;
从名为
student
的数据表中选择出所有学生的姓名(name)、成绩(score),要求学生的姓名包含 "李",或者成绩(score)大于 500。
在 SQL 中,我们可以使用 distinct
关键字来实现去重操作。
select distinct class_id, exam_num from student;
从名为
student
的数据表中选择出所有不重复的班级 ID(class_id)和考试编号(exam_num)的组合。
在 SQL 中,我们可以使用
order by
关键字来实现排序操作。order by
后面跟上需要排序的字段,可以选择升序(asc)或降序(desc)排列。
select name,age,score from student order by score desc,age asc;
从名为
student
的数据表中选择出学生姓名(name)、年龄(age)和成绩(score),首先按照成绩从大到小排序,如果成绩相同,则按照年龄从小到大排序。
select name,age from student order by age asc limit 1,3;
从名为
student
的数据表中选择学生姓名(name)和年龄(age),按照年龄从小到大排序,从第 2 条数据开始、截取 3 个学生的信息。(第二条数据开始,也就是下标为1)
- -- LIMIT 后只跟一个整数,表示要截断的数据条数(一次获取几条)
- select task_name, due_date from tasks limit 2;
-
- -- LIMIT 后跟 2 个整数,依次表示从第几条数据开始、一次获取几条
- select task_name, due_date from tasks limit 2, 2;
条件分支 case when
是 SQL 中用于根据条件进行分支处理的语法。它类似于其他编程语言中的 if else 条件判断语句,允许我们根据不同的条件选择不同的结果返回。
使用 case when
可以在查询结果中根据特定的条件动态生成新的列或对现有的列进行转换。
- case when 支持同时指定多个分支,示例语法如下:
-
- case when (条件1) then 结果1
- when (条件2) then 结果2
- ...
- else 其他结果 end
select name, case when(age>60) then '老同学' when(age>20) then '年轻' else '小同学' end as age_level from student order by name asc;
假设有一个学生表
student
,包含以下字段:name
(姓名)、age
(年龄)。请你编写一个 SQL 查询,将学生按照年龄划分为三个年龄等级(age_level):60 岁以上为 "老同学",20 岁以上(不包括 60 岁以上)为 "年轻",20 岁及以下、以及没有年龄信息为 "小同学"。返回结果应包含学生的姓名(name)和年龄等级(age_level),并按姓名升序排序。
常用的时间函数有:
- DATE:获取当前日期
- DATETIME:获取当前日期时间
- TIME:获取当前时间
使用时间函数获取当前日期、当前日期时间和当前时间:
- -- 获取当前日期
- selcet date() ascurrent_date;
-
- -- 获取当前日期时间
- selcet datetime() as current_datetime;
-
- -- 获取当前时间
- selcet time() as current_time;
假设有一个学生表 student
,包含以下字段:name
(姓名)、age
(年龄)。
请编写一个 SQL 查询,展示所有学生的姓名(name)和当前日期(列名为 "当前日期")。
select name,date() as 当前日期 from student
1)使用字符串处理函数 UPPER
将姓名转换为大写:
- -- 将姓名转换为大写
- select name, upper(name) as upper_name from employees;
2)使用字符串处理函数 LENGTH
计算姓名长度:
- -- 计算姓名长度
- select name, length(name) as name_length
- from employees;
3)使用字符串处理函数 LOWER
将姓名转换为小写:
- -- 将姓名转换为小写并进行条件筛选
- select name, lower(name) as lower_name
- from employees;
select id,name,upper(name) as upper_name from student where name='热dog';
假设有一个学生表
student
,包含以下字段:id
(学号)、name
(姓名)。请编写一个 SQL 查询,筛选出姓名为 '热dog' 的学生,展示其学号(id)、姓名(name)及其大写姓名(upper_name)。
在 SQL 中,聚合函数是一类用于对数据集进行 汇总计算 的特殊函数。它们可以对一组数据执行诸如计数、求和、平均值、最大值和最小值等操作。聚合函数通常在 SELECT 语句中配合 GROUP BY 子句使用,用于对分组后的数据进行汇总分析。
常见的聚合函数包括:
- COUNT:计算指定列的行数或非空值的数量。
- SUM:计算指定列的数值之和。
- AVG:计算指定列的数值平均值。
- MAX:找出指定列的最大值。
- MIN:找出指定列的最小值。
假设有一个订单表 orders
,包含以下字段:order_id
(订单号)、customer_id
(客户编号)、amount
(订单金额)。数据如下:
order_id | customer_id | amount |
---|---|---|
1 | A001 | 100 |
2 | A002 | 200 |
3 | A001 | 150 |
4 | A003 | 50 |
1)使用聚合函数 COUNT
计算订单表中的总订单数:
- select count(*) as order_num
- from orders
2)使用聚合函数 COUNT(DISTINCT 列名)
计算订单表中不同客户的数量:
- select count(distinct customer_id) as customer_num
- from orders;
3)使用聚合函数 SUM
计算总订单金额:
- select sum(amount) as total_amount
- from orders
select sum(score) as total_score,avg(score) as avg_score,max(score) as max_score,min(score) as min_score from student
假设有一个学生表
student
,包含以下字段:id
(学号)、name
(姓名)、class_id
(班级编号)、score
(成绩)。编写一个 SQL 查询,汇总学生表中所有学生的总成绩(total_score)、平均成绩(avg_score)、最高成绩(max_score)和最低成绩(min_score)。
假设有一个订单表 orders
,包含以下字段:order_id
(订单号)、customer_id
(客户编号)、amount
(订单金额)。数据如下:
order_id | customer_id | amount |
---|---|---|
1 | A001 | 100 |
2 | A002 | 200 |
3 | A001 | 150 |
4 | A003 | 50 |
1)使用分组聚合查询中每个客户的编号:
- SELECT customer_id
- FROM orders
- GROUP BY customer_id;
2)使用分组聚合查询每个客户的下单数:
- SELECT customer_id, COUNT(order_id) AS order_num
- FROM orders
- GROUP BY customer_id;
select class_id,avg(score) as avg_score from student group by class_id;
假设有一个学生表
student
,包含以下字段:id
(学号)、name
(姓名)、class_id
(班级编号)、score
(成绩)。编写一个 SQL 查询,统计学生表中的班级编号(class_id)和每个班级的平均成绩(avg_score)。
假设有一个订单表 orders
,包含以下字段:order_id
(订单号)、product_id
(商品编号)、customer_id
(客户编号)、amount
(订单金额)。
数据如下:
order_id | product_id | customer_id | amount |
---|---|---|---|
1 | 1 | A001 | 100 |
2 | 1 | A002 | 200 |
3 | 1 | A001 | 150 |
4 | 1 | A003 | 50 |
5 | 2 | A001 | 50 |
要查询使用多字段分组查询表中 每个客户 购买的 每种商品 的总金额,相当于按照客户编号和商品编号分组:
- SELECT customer_id, product_id, SUM(amount) AS total_amount
- FROM orders
- GROUP BY customer_id, product_id;
select class_id,exam_num,count(*) as total_num from student group by class_id,exam_num;
假设有一个学生表
student
,包含以下字段:id
(学号)、name
(姓名)、class_id
(班级编号)、exam_num
(考试次数)、score
(成绩)。编写一个 SQL 查询,统计学生表中每个班级每次考试的总学生人数(total_num)。
在 SQL 中,having子句用于在分组聚合后对分组进行过滤。它允许我们对分组后的结果进行条件筛选,只保留满足特定条件的分组。
having子句与条件查询 where子句的区别在于,where 子句用于在 分组之前 进行过滤,而 having子句用于在 分组之后 进行过滤。
假设有一个订单表 orders
,包含以下字段:order_id
(订单号)、customer_id
(客户编号)、amount
(订单金额)。数据如下:
order_id | customer_id | amount |
---|---|---|
1 | A001 | 100 |
2 | A002 | 200 |
3 | A001 | 150 |
4 | A003 | 50 |
1)使用 HAVING 子句查询订单数超过 1 的客户:
- SELECT customer_id, COUNT(order_id) AS order_num
- FROM orders
- GROUP BY customer_id
- HAVING COUNT(order_id) > 1;
2)使用 HAVING 子句查询订单总金额超过 100 的客户:
- SELECT customer_id, SUM(amount) AS total_amount
- FROM orders
- GROUP BY customer_id
- HAVING SUM(amount) > 100;
select class_id,sum(score) as total_score from student group by class_id having sum(score)>150;
假设有一个学生表
student
,包含以下字段:id
(学号)、name
(姓名)、class_id
(班级编号)、score
(成绩)。编写一个 SQL 查询,统计学生表中班级的总成绩超过 150 分的班级编号(class_id)和总成绩(total_score)。
在 SQL 中,关联查询是一种用于联合多个数据表中的数据的查询方式。
其中,cross join
是一种简单的关联查询,不需要任何条件来匹配行,它直接将左表的 每一行 与右表的 每一行 进行组合,返回的结果是两个表的笛卡尔积。
假设有一个员工表 employees
,包含以下字段:emp_id
(员工编号)、emp_name
(员工姓名)、department
(所属部门)、salary
(工资)。数据如下:
emp_id | emp_name | department | salary |
---|---|---|---|
1 | 小明 | 技术部 | 5000 |
2 | 鸡哥 | 财务部 | 6000 |
3 | 李华 | 销售部 | 4500 |
假设还有一个部门表 departments
,包含以下字段:department
(部门名称)、manager
(部门经理)、location
(所在地)。数据如下:
department | manager | location |
---|---|---|
技术部 | 张三 | 上海 |
财务部 | 李四 | 北京 |
销售部 | 王五 | 广州 |
使用 cross join 进行关联查询,将员工表和部门表的所有行组合在一起,获取员工姓名、工资、部门名称和部门经理,示例 SQL 代码如下:
- SELECT e.emp_name, e.salary, e.department, d.manager
- FROM employees e
- CROSS JOIN departments d;
select s.name student_name, s.age student_age, s.class_id class_id, c.name class_name from student s, class c;
假设有一个学生表
student
,包含以下字段:id(学号)、name(姓名)、age(年龄)、class_id(班级编号);还有一个班级表class
,包含以下字段:id(班级编号)、name(班级名称)。编写一个 SQL 查询,将学生表和班级表的所有行组合在一起,并返回学生姓名(student_name)、学生年龄(student_age)、班级编号(class_id)以及班级名称(class_name)。
inner join 只返回两个表中满足关联条件的交集部分,即在两个表中都存在的匹配行。
假设有一个学生表
student
,包含以下字段:id
(学号)、name
(姓名)、age
(年龄)、class_id
(班级编号)。还有一个班级表class
,包含以下字段:id
(班级编号)、name
(班级名称)、level
(班级级别)。编写一个 SQL 查询,根据学生表和班级表之间的班级编号进行匹配,返回学生姓名(
student_name
)、学生年龄(student_age
)、班级编号(class_id
)、班级名称(class_name
)、班级级别(class_level
)。
- 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 是一种关联查询方式,它根据指定的关联条件,将两个表中满足条件的行组合在一起,并 包含没有匹配的行 。
在 outer join 中,包括 left outer join 和 right outer join 两种类型,它们分别表示查询左表和右表的所有行(即使没有被匹配),再加上满足条件的交集部分。
假设有一个学生表
student
,包含以下字段:id
(学号)、name
(姓名)、age
(年龄)、class_id
(班级编号)。还有一个班级表class
,包含以下字段:id
(班级编号)、name
(班级名称)、level
(班级级别)。编写一个 SQL 查询,根据学生表和班级表之间的班级编号进行匹配,返回学生姓名(
student_name
)、学生年龄(student_age
)、班级编号(class_id
)、班级名称(class_name
)、班级级别(class_level
),要求必须返回所有学生的信息(即使对应的班级编号不存在)。
- 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
子查询是指在一个查询语句内部 嵌套 另一个完整的查询语句,内层查询被称为子查询。子查询可以用于获取更复杂的查询结果或者用于过滤数据。
当执行包含子查询的查询语句时,数据库引擎会首先执行子查询,然后将其结果作为条件或数据源来执行外层查询。
假设有一个学生表
student
,包含以下字段:id
(学号)、name
(姓名)、age
(年龄)、score
(分数)、class_id
(班级编号)。还有一个班级表class
,包含以下字段:id
(班级编号)、name
(班级名称)。编写一个 SQL 查询,使用子查询的方式来获取存在对应班级的学生的所有数据,返回学生姓名(
name
)、分数(score
)、班级编号(class_id
)字段。
select name, score, class_id from student where class_id in (select distinct id from class);
查询中的一种特殊类型是 "exists" 子查询,用于检查主查询的结果集是否存在满足条件的记录,它返回布尔值(True 或 False),而不返回实际的数据。
和 exists 相对的是 not exists,用于查找不满足存在条件的记录
假设有一个学生表
student
,包含以下字段:id
(学号)、name
(姓名)、age
(年龄)、score
(分数)、class_id
(班级编号)。还有一个班级表class
,包含以下字段:id
(班级编号)、name
(班级名称)。编写一个 SQL 查询,使用 exists 子查询的方式来获取 不存在对应班级的 学生的所有数据,返回学生姓名(
name
)、年龄(age
)、班级编号(class_id
)字段。
- select name,age,class_id
- from student
- where not exists (
- select class_id from class where class.id = student.class_id
- );
在 SQL 中,组合查询是一种将多个 select 查询结果合并在一起的查询操作。
包括两种常见的组合查询操作:union 和 union all。
union 操作:它用于将两个或多个查询的结果集合并, 并去除重复的行 。即如果两个查询的结果有相同的行,则只保留一行。
union all 操作:它也用于将两个或多个查询的结果集合并, 但不去除重复的行 。即如果两个查询的结果有相同的行,则全部保留。
假设有一个学生表
student
,包含以下字段:id
(学号)、name
(姓名)、age
(年龄)、score
(分数)、class_id
(班级编号)。还有一个新学生表student_new
,包含的字段和学生表完全一致。编写一条 SQL 语句,获取所有学生表和新学生表的学生姓名(
name
)、年龄(age
)、分数(score
)、班级编号(class_id
)字段,要求保留重复的学生记录。
- select name,age,score,class_id
- from student
- union all
- select name,age,score,class_id
- from student_new
在 SQL 中,开窗函数是一种强大的查询工具,它允许我们在查询中进行对分组数据进行计算、 同时保留原始行的详细信息 。
开窗函数可以与聚合函数(如 SUM、AVG、COUNT 等)结合使用,但与普通聚合函数不同,开窗函数不会导致结果集的行数减少。
打个比方,可以将开窗函数想象成一种 "透视镜",它能够将我们聚焦在某个特定的分组,同时还能看到整体的全景。
该函数用法为:
sum (计算字段名) over (partition by 分组字段名)
假设有一个学生表
student
,包含以下字段:id
(学号)、name
(姓名)、age
(年龄)、score
(分数)、class_id
(班级编号)。编写一个 SQL 查询,返回每个学生的详细信息(字段顺序和原始表的字段顺序一致),并计算每个班级的学生平均分(class_avg_score)。
- select id,name,age,score,class_id,
- avg(score) over (partition by class_id) as class_avg_score
- from student
sum over order by,可以实现同组内数据的 累加求和 。
示例用法如下:
sum(计算字段名) over (partition by 分组字段名 order by 排序字段 排序规则)
假设有一个学生表
student
,包含以下字段:id
(学号)、name
(姓名)、age
(年龄)、score
(分数)、class_id
(班级编号)。编写一个 SQL 查询,返回每个学生的详细信息(字段顺序和原始表的字段顺序一致),并且按照分数升序的方式累加计算每个班级的学生总分(class_sum_score)。
- select id,name,age,score,class_id,
- sum(score) over (partition by class_id order by score asc) as class_sum_score
- from student
Rank 开窗函数是 SQL 中一种用于对查询结果集中的行进行 排名 的开窗函数。它可以根据指定的列或表达式对结果集中的行进行排序,并为每一行分配一个排名。在排名过程中,相同的值将被赋予相同的排名,而不同的值将被赋予不同的排名。
当存在并列(相同排序值)时,Rank 会跳过后续排名,并保留相同的排名。
Rank 开窗函数的常见用法是在查询结果中查找前几名(Top N)或排名最高的行。
Rank 开窗函数的语法如下:
- rank () over(
- partition by 列名1, 列名2, ... -- 可选,用于指定分组列
- order by 列名3 [asc|desc], 列名4 [asc|desc], ... -- 用于指定排序列及排序方式
- ) as rank_column
其中,PARTITION BY
子句可选,用于指定分组列,将结果集按照指定列进行分组;ORDER BY
子句用于指定排序列及排序方式,决定了计算 Rank 时的排序规则。AS rank_column
用于指定生成的 Rank 排名列的别名。
假设有一个学生表
student
,包含以下字段:id
(学号)、name
(姓名)、age
(年龄)、score
(分数)、class_id
(班级编号)。编写一个 SQL 查询,返回每个学生的详细信息(字段顺序和原始表的字段顺序一致),并且按照分数降序的方式计算每个班级内的学生的分数排名(ranking)。
- select id,name,age,score,class_id,
- rank() over (partition by class_id order by score desc) as ranking
- from student
row_number开窗函数是 SQL 中的一种用于为查询结果集中的每一行 分配唯一连续排名 的开窗函数。
它与之前讲到的 Rank 函数,row_number函数为每一行都分配一个唯一的整数值,不管是否存在并列(相同排序值)的情况。每一行都有一个唯一的行号,从 1 开始连续递增。
row_number开窗函数的语法如下(几乎和 Rank 函数一模一样):
- row_number() over (
- partition by column1, column2, ... -- 可选,用于指定分组列
- order by column3 [ASC|DESC], column4 [ASC|DESC], ... -- 用于指定排序列及排序方式
- ) as row_number_column
其中,PARTITION BY
子句可选,用于指定分组列,将结果集按照指定列进行分组。order by
子句用于指定排序列及排序方式,决定了计算 row_number时的排序规则。as row_number_column
用于指定生成的行号列的别名。
假设有一个学生表
student
,包含以下字段:id
(学号)、name
(姓名)、age
(年龄)、score
(分数)、class_id
(班级编号)。编写一个 SQL 查询,返回每个学生的详细信息(字段顺序和原始表的字段顺序一致),并且按照分数降序的方式给每个班级内的学生分配一个编号(row_number)。
- select id,name,age,score,class_id,
- row_number() over (partition by class_id order by score desc) as row_number
- from studen
开窗函数 lag / lead 的作用是获取在当前行之前或之后的行的值,这两个函数通常在需要比较相邻行数据或进行时间序列分析时非常有用。
1)lag 函数
lag 函数用于获取 当前行之前 的某一列的值。它可以帮助我们查看上一行的数据。
lag 函数的语法如下:
LAG(column_name, offset, default_value) OVER (PARTITION BY partition_column ORDER BY sort_column)
参数解释:
column_name
:要获取值的列名。offset
:表示要向上偏移的行数。例如,offset为1表示获取上一行的值,offset为2表示获取上两行的值,以此类推。default_value
:可选参数,用于指定当没有前一行时的默认值。PARTITION BY
和ORDER BY
子句可选,用于分组和排序数据。2)Lead 函数
Lead 函数用于获取 当前行之后 的某一列的值。它可以帮助我们查看下一行的数据。
Lead 函数的语法如下:
LEAD(column_name, offset, default_value) OVER (PARTITION BY partition_column ORDER BY sort_column)
参数解释:
column_name
:要获取值的列名。offset
:表示要向下偏移的行数。例如,offset为1表示获取下一行的值,offset为2表示获取下两行的值,以此类推。default_value
:可选参数,用于指定当没有后一行时的默认值。PARTITION BY
和ORDER BY
子句可选,用于分组和排序数据假设有一个学生表
student
,包含以下字段:id
(学号)、name
(姓名)、age
(年龄)、score
(分数)、class_id
(班级编号)。编写一个 SQL 查询,返回每个学生的详细信息(字段顺序和原始表的字段顺序一致),并且按照分数降序的方式获取每个班级内的学生的前一名学生姓名(prev_name)、后一名学生姓名(next_name)。
- select id,name,age,score,class_id,
- lag(name) over (partition by class_id order by score desc) as prev_name,
- lead(name) over (partition by class_id order by score desc) as next_name
- from student;