【如何成为SQL高手】第九关:高级复杂查询

简介: 【如何成为SQL高手】第九关:高级复杂查询

环境准备,通过以下建表


-- 创建数据库
CREATE DATABASE mes_db charset utf8mb4;
-- 切换数据库
USE mes_db;
-- 创建学生表
CREATE TABLE student (
no VARCHAR(20) PRIMARY KEY,
name VARCHAR(20) NOT NULL,
sex VARCHAR(10) NOT NULL,
birthday DATE, -- 生日
class VARCHAR(20) -- 所在班级
);
-- 创建教师表
CREATE TABLE teacher (
no VARCHAR(20) PRIMARY KEY,
name VARCHAR(20) NOT NULL,
sex VARCHAR(10) NOT NULL,
birthday DATE,
profession VARCHAR(20) NOT NULL, -- 职称
department VARCHAR(20) NOT NULL -- 部门
);
-- 创建课程表
CREATE TABLE course (
no VARCHAR(20) PRIMARY KEY,
name VARCHAR(20) NOT NULL,
t_no VARCHAR(20) NOT NULL, -- 教师编号
-- 表示该 t_no 来自于 teacher 表中的 no 字段值
FOREIGN KEY(t_no) REFERENCES teacher(no)
);
-- 成绩表
CREATE TABLE score (
s_no VARCHAR(20) NOT NULL, -- 学生编号
c_no VARCHAR(20) NOT NULL, -- 课程号
degree DECIMAL, -- 成绩
-- 表示该 s_no, c_no 分别来自于 student, course 表中的 no 字段值
FOREIGN KEY(s_no) REFERENCES student(no),
FOREIGN KEY(c_no) REFERENCES course(no),
-- 设置 s_no, c_no 为联合主键
PRIMARY KEY(s_no, c_no)
);
-- 查看所有表
SHOW TABLES;
-- 添加学生表数据
INSERT INTO student VALUES('101', '曾华', '男', '1977-09-01', '95033');
INSERT INTO student VALUES('102', '匡明', '男', '1975-10-02', '95031');
INSERT INTO student VALUES('103', '王丽', '女', '1976-01-23', '95033');
INSERT INTO student VALUES('104', '李军', '男', '1976-02-20', '95033');
INSERT INTO student VALUES('105', '王芳', '女', '1975-02-10', '95031');
INSERT INTO student VALUES('106', '陆军', '男', '1974-06-03', '95031');
INSERT INTO student VALUES('107', '王飘飘', '男', '1976-02-20', '95033');
INSERT INTO student VALUES('108', '张全蛋', '男', '1975-02-10', '95031');
INSERT INTO student VALUES('109', '赵铁柱', '男', '1974-06-03', '95031');
-- 添加教师表数据
INSERT INTO teacher VALUES('804', '李诚', '男', '1958-12-02', '副教授', '计算机系');
INSERT INTO teacher VALUES('856', '张旭', '男', '1969-03-12', '讲师', '电子工程系');
INSERT INTO teacher VALUES('825', '王萍', '女', '1972-05-05', '助教', '计算机系');
INSERT INTO teacher VALUES('831', '刘冰', '女', '1977-08-14', '助教', '电子工程系');
-- 添加课程表数据
INSERT INTO course VALUES('3-105', '计算机导论', '825');
INSERT INTO course VALUES('3-245', '操作系统', '804');
INSERT INTO course VALUES('6-166', '数字电路', '856');
INSERT INTO course VALUES('9-888', '高等数学', '831');
-- 添加添加成绩表数据
INSERT INTO score VALUES('103', '3-105', '92');
INSERT INTO score VALUES('103', '3-245', '86');
INSERT INTO score VALUES('103', '6-166', '85');
INSERT INTO score VALUES('105', '3-105', '88');
INSERT INTO score VALUES('105', '3-245', '75');
INSERT INTO score VALUES('105', '6-166', '79');
INSERT INTO score VALUES('109', '3-105', '76');
INSERT INTO score VALUES('109', '3-245', '68');
INSERT INTO score VALUES('109', '6-166', '81');


3e95ced999e34b799a94fdeb3af79db2.png

1.ANY用法



查询课程 3-105 且成绩至少高 3-245 的 score 表,DESC ( 降序 )


#ANY: 符合 SQL 语句中的任意条件

#也就是说,3-105成绩中,只要有一个大于从3-245筛选出来的任意行就符合条件

#最后根据降序查询结果

SELECT * FROM score WHERE c_no = ‘3-105’ AND degree > ANY(

SELECT degree FROM score WHERE c_no = ‘3-245’

) ORDER BY degree DESC;


efe6e5dd7c234d8cac0df58d14cda097.png

⛳️2.ALL的用法



查询课程 3-105 且成绩高于 3-245 的 score 表


#只需对上一道题稍作修改。

#ALL: 符合 SQL 语句中的所有条件。

#也就是说,在3-105成绩中,都要大于从3-245筛选出来全部行才算符合条件

SELECT * FROM score WHERE c_no = ‘3-105’ AND degree > ALL(

SELECT degree FROM score WHERE c_no = ‘3-245’);


70f20bf643394b1fa022e0a2457a6d6e.png


⛳️3. 自连接



查询某课程成绩比该课程平均成绩低的 score 表

#将表 b 作用于表 a 中查询数据

#score 别名a,b 如此就能用 a.c_no=b.c_no 作为条件执行查询

SELECT * FROM score a WHERE degree < (

(SELECT AVG(degree) FROM score b WHERE a.c_no = b.c_no));


271abb84435a4fbc914e5c9906de0d3f.png


⛳️4. 排序



😆 4.1 多字段排序


以 class 和 birthday 从大到小的顺序查询 student 表

SELECT * FROM student ORDER BY class DESC, birthday;

f502db9ab1684c00a652d6b54e1728d1.png


😆 4.2 等级处理


建立一个 grade 表代表学生的成绩等级,并插入数据:

CREATE TABLE grade (

low INT(3),

upp INT(3),

grade char(1)

);

INSERT INTO grade VALUES (90, 100, ‘A’);

INSERT INTO grade VALUES (80, 89, ‘B’);

INSERT INTO grade VALUES (70, 79, ‘C’);

INSERT INTO grade VALUES (60, 69, ‘D’);

INSERT INTO grade VALUES (0, 59, ‘E’);

SELECT * FROM grade;

–查询所有学生的 s_no 、c_no 和 grade 列

SELECT s_no, c_no, grade FROM score, grade

WHERE degree BETWEEN low AND upp;


1794df7102494bc3b3144fd2d459bce8.png

😆 4.3 排名


create table scores_tb (

id int auto_increment primary key,

xuehao int not null,

score int not null

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


insert into scores_tb (xuehao,score)

values (1001,89),

(1002,99),

(1003,96),

(1004,96),

(1005,92),

1006,90),

(1007,90),

(1008,94);

select * from scores_tb;


75da7b7214ca433ba63aa488b390069d.png


MySQL8.0 中可以利用 ROW_NUMBER(),DENSE_RANK(),RANK()

三个窗口函数实现上述三种排名


普通排名:

按分数高低直接排名,从 1 开始,往下排,类似于 row number

select xuehao,score,

ROW_NUMBER() OVER(order by score desc)

as row_r from scores_tb;


9d16650bf14540bb9064c19dbb7ccacf.png


数相同,名次相同,排名无间隔

select xuehao,score,

DENSE_RANK() OVER(order by score desc) as dense_r

from scores_tb;

a6e3bf425fc142049b9add0898523285.png


并列排名,排名有间隔

select xuehao,score,

RANK() over(order by score desc) as r

from scores_tb;


ad473b25c8f442e5918f2ae8e8d1b8f5.png

目录
相关文章
|
7天前
|
SQL 运维 监控
SQL查询太慢?实战讲解YashanDB SQL调优思路
本文是Meetup第十期“调优实战专场”的第二篇技术文章,上一篇《高效查询秘诀,解码YashanDB优化器分组查询优化手段》中,我们揭秘了YashanDB分组查询优化秘诀,本文将通过一个案例,助你快速上手YashanDB慢日志功能,精准定位“慢SQL”后进行优化。
|
4天前
|
SQL 索引
【YashanDB知识库】字段加上索引后,SQL查询不到结果
【YashanDB知识库】字段加上索引后,SQL查询不到结果
|
4天前
|
SQL 大数据 数据挖掘
玩转大数据:从零开始掌握SQL查询基础
玩转大数据:从零开始掌握SQL查询基础
75 35
|
2月前
|
SQL 安全 数据库
如何在Django中正确使用参数化查询或ORM来避免SQL注入漏洞?
如何在Django中正确使用参数化查询或ORM来避免SQL注入漏洞?
177 77
|
24天前
|
SQL 关系型数据库 分布式数据库
利用 PolarDB PG 版向量化引擎,加速复杂 SQL 查询!完成任务领发财新年抱枕!
利用 PolarDB PG 版向量化引擎,加速复杂 SQL 查询!完成任务领发财新年抱枕!
|
15天前
|
SQL 关系型数据库 OLAP
云原生数据仓库AnalyticDB PostgreSQL同一个SQL可以实现向量索引、全文索引GIN、普通索引BTREE混合查询,简化业务实现逻辑、提升查询性能
本文档介绍了如何在AnalyticDB for PostgreSQL中创建表、向量索引及混合检索的实现步骤。主要内容包括:创建`articles`表并设置向量存储格式,创建ANN向量索引,为表增加`username`和`time`列,建立BTREE索引和GIN全文检索索引,并展示了查询结果。参考文档提供了详细的SQL语句和配置说明。
32 1
|
1天前
|
SQL 缓存 关系型数据库
SQL为什么不建议执行多表关联查询
本文探讨了SQL中不建议执行多表关联查询的原因,特别是MySQL与PG在多表关联上的区别。MySQL仅支持嵌套循环连接,而不支持排序-合并连接和散列连接,因此在多表(超过3张)关联查询时效率较低。文章还分析了多表关联查询与多次单表查询的效率对比,指出将关联操作放在Service层处理的优势,包括减少数据库计算资源消耗、提高缓存效率、降低锁竞争以及更易于分布式扩展等。最后,通过实例展示了如何分解关联查询以优化性能。
|
2月前
|
SQL NoSQL Java
Java使用sql查询mongodb
通过MongoDB Atlas Data Lake或Apache Drill,可以在Java中使用SQL语法查询MongoDB数据。这两种方法都需要适当的配置和依赖库的支持。希望本文提供的示例和说明能够帮助开发者实现这一目标。
63 17
|
2月前
|
SQL Oracle 关系型数据库
如何在 Oracle 中配置和使用 SQL Profiles 来优化查询性能?
在 Oracle 数据库中,SQL Profiles 是优化查询性能的工具,通过提供额外统计信息帮助生成更有效的执行计划。配置和使用步骤包括:1. 启用自动 SQL 调优;2. 手动创建 SQL Profile,涉及收集、执行调优任务、查看报告及应用建议;3. 验证效果;4. 使用 `DBA_SQL_PROFILES` 视图管理 Profile。
|
23天前
|
SQL 数据可视化 IDE
SQL做数据分析的困境,查询语言无法回答的真相
SQL 在简单数据分析任务中表现良好,但面对复杂需求时显得力不从心。例如,统计新用户第二天的留存率或连续活跃用户的计算,SQL 需要嵌套子查询和复杂关联,代码冗长难懂。Python 虽更灵活,但仍需变通思路,复杂度较高。相比之下,SPL(Structured Process Language)语法简洁、支持有序计算和分组子集保留,具备强大的交互性和调试功能,适合处理复杂的深度数据分析任务。SPL 已开源免费,是数据分析师的更好选择。

热门文章

最新文章