继续每日一练 sql 肯定会无敌强的后面. 恰好今天项目弄报表这块, 用了国产的 BI 工具, 帆软Report, 除了页面控件做得有些 low 外, 我感觉其他各方面都特别适合做 中国式的报表. 明天上线, 今天才开始弄填报, 要设计表字段, 全部要自己来写 sql, 恰好练习了把, 果然, sql 再数据这块, 真的是无比重要的哦.

发现这个 BI 有点好, 就是可以做模板成网页, 然后让业务自己往里导数据, 数据回写数据库, 感觉贼简单好用哦

sql 搞来搞去, 还是这些, 筛选字段, 表拼接, 分组聚合... (ps: 今天写 DDL 反复改, 差点没把领导给气死.... )

表关系

需求_01

查询 学过 "欧拉" 老师所教的所有课的学生学号, 姓名

分析

分析: 学生表 inner join 成绩表 inner join 课程表 inner join 教师表

select
st.s_id as "学号",
st.s_name as "姓名" from student as st
inner join score as s on st.s_id = s.s_id
inner join course as c on s.c_id = c.c_id
inner join teacher as t on c.t_id = t.t_id where t.t_name = "欧拉" -- 多名学生, 可按学号排序
order by st.s_id;
+--------+-----------+
| 学号 | 姓名 |
+--------+-----------+
| 0001 | 王二 |
| 0002 | 星落 |
| 0003 | 胡小适 |
+--------+-----------+
3 rows in set (0.00 sec)

关键点还是理解表结构逻辑和, 关联关系的呀. 但是呢, 这里有个很大的问题, 关于查询效率. 这里是先把所有的表都给拼接起来嘛, 通常业务中呢, 其实每个表都是非常大的, 这样直接来 inner join 怕是要卡死. 更通常的做法是, 关联一张的时候, 就临时表安排一下, 然后慢慢拼, 先 where 过滤, 再来查询以提高效率.

需求02

查询 同时学过 0001 和 0002 号课程的学生学号, 姓名

分析

对 score 进行拆分按课号, 然后以学号为 inner join

select * from score where c_id = "0001";
+------+------+-------+
| s_id | c_id | score |
+------+------+-------+
| 0001 | 0001 | 80 |
| 0003 | 0001 | 80 |
+------+------+-------+
2 rows in set (0.00 sec) mysql> select * from score where c_id = "0002";
+------+------+-------+
| s_id | c_id | score |
+------+------+-------+
| 0001 | 0002 | 90 |
| 0002 | 0002 | 60 |
| 0003 | 0002 | 80 |
+------+------+-------+
3 rows in set (0.00 sec)

可以看到, 二者相交的学号是 1, 3 , 其实就 inner join 就行啦.

-- 都给查出来看看
select
a.*,
b.*
from (select * from score where c_id = "0001") as a inner join (select * from score where c_id = "0002") as b on a.s_id = b.s_id;
+------+------+-------+------+------+-------+
| s_id | c_id | score | s_id | c_id | score |
+------+------+-------+------+------+-------+
| 0001 | 0001 | 80 | 0001 | 0002 | 90 |
| 0003 | 0001 | 80 | 0003 | 0002 | 80 |
+------+------+-------+------+------+-------+
2 rows in set (0.00 sec)

多表关联的好处就是, 取了表的别名后, 你想要哪个就可以拿到哪个字段, 大表就是好用的呀.

只是需要学号和姓名, 那其实只查学号, in 学生表即可


select s_id as "学号",
s_name as "姓名" from student where s_id in ( select
a.s_id
from (select s_id from score where c_id = "0001") as a inner join (select s_id from score where c_id = "0002") as b on a.s_id = b.s_id );
+--------+-----------+
| 学号 | 姓名 |
+--------+-----------+
| 0001 | 王二 |
| 0003 | 胡小适 |
+--------+-----------+
2 rows in set (0.00 sec)

小结

  • 多表连接查询, 其实只要搞清楚表之间的连接字段,实在不行, 都给它连上拼接一张大表, 要啥有啥.
  • 从提高查询效率上考虑, 不要一下拼接出所有表, 而可选择临时表的形式, 和先给做过滤再拼接
  • 灵活使用 join 和 in 即 表连接 和 子查询 的相互配合, 这样就非常厉害了哦.

SQL 强化练习 (四)的更多相关文章

  1. SQL总结(四)编辑类

    SQL总结(四)编辑类 应有尽有 1.数据库 创建数据库语法: CREATE DATABASE database_name 1)创建测试库 CREATE DATABASE TestDB 2)使用库 U ...

  2. SQL强化练习(面试与学习必备)

    一.经典选课题A 1.1.请同时使用GUI手动与SQL指令的形式创建数据库.表并添加数据. 题目:设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教 ...

  3. SQL中的四种语言DDL,DML,DCL,TCL

    1.DDL(Data Definition Language)数据库定义语言statements are used to define the database structure or schema ...

  4. ORCAL 数据库的约束以及SQL语言的四种类型

    oracle数据库约束: 定义:要输入的这个值是一个什么样的值, 或者是哪个范围内的值 作用: 确保完整性, 确保精确性 1, 非空约束(not null) 记录一条信息的时候如果用户名和密码没有被记 ...

  5. sql编程(四)触发器

    触发器:一种特殊的存储过程,和制定的表相关,而对于一个表进行的数据操作时自动的触发执行类似winform 事件创建语法:create trigger 触发器的名称on 表名 for insert | ...

  6. SQL优化的四个方面,缓存,表结构,索引,SQL语句

    一,缓存 数据库属于 IO 密集型的应用程序,其主要职责就是数据的管理及存储工作.而我们知道,从内存中读取一个数据库的时间是微秒级别,而从一块普通硬盘上读取一个IO是在毫秒级别,二者相差3个数量级.所 ...

  7. Oracle SQL篇(四)group by 分组与分组的加强 rollup

        分组操作group by 和分组的强化(rollup) 分组操作和分组函数的使用,对于编写SQL语句的人来说,是最基本的概念. 我们来看下面的例子: 在这里我们使用员工表EMP scott@D ...

  8. SQL强化(一)保险业务

    保险业务 : 表结构 : sql语句 : /*1. 根据投保人电话查询出投保人 姓名 身份证号 所有保单 编号 险种 缴费类型*/SELECTt2.cust_name,t2.idcard,t4.pro ...

  9. sql 事务的四种隔离级别

    在 SQL 标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的修改,哪些在事务内和事务间是可见的,哪些是不可见的.较低级别的隔离通常可以执行更高的并发,系统的开销也更低. read unco ...

  10. SQL学习笔记四之MySQL数据操作

    阅读目录 一 介绍 二 插入数据INSERT 三 更新数据UPDATE 四 删除数据DELETE 五 查询数据SELECT 六 权限管理 一 介绍 MySQL数据操作: DML =========== ...

随机推荐

  1. [JOISC 2023 Day3] Tourism 题解

    大家好,我喜欢珂朵莉树,所以我用珂朵莉树 \(AC\) 了本题. 实际上,我们比较容易发现,这题实际上就是求 \([l,r]\) 中的所有点作为关键点时,虚树所压缩的所有点(实际上就是显现出来的点+在 ...

  2. 若依-Vue 单体版本 更换mybatisPlus

    1.单体模块在pom.xml ; 多模块版本在ruoyi-common\pom.xml.模块添加整合依赖 <!-- mybatis-plus 增强CRUD --> <dependen ...

  3. 『Python底层原理』--Python整数为什么可以无限大

    整数类型是编程中最常见的数据类型之一,但它的实现细节却鲜为人知. 与其他语言不同,Python 的整数是任意精度的,这意味着它们可以无限大,仅受限于内存. 这种特性使得 Python 在处理大整数时非 ...

  4. Linux - Linux终端里的二维码

    qrencode:Linux 操作系统中生成二维码,点此进入下载页面 1.将tar包上传到 Linux 服务器上并解压:tar -zxvf qrencode-x.x.x.tar.gz 2.在 .bas ...

  5. Hadoop - [01] 概述

    Hadoop官网:https://hadoop.apache.org/ Hadoop下载:https://archive.apache.org/dist/hadoop/common/ 一.Hadoop ...

  6. Web前端入门第 10 问:HTML 段落标签( <p> )嵌套段落标签( <p> )的渲染结果会怎样?

    HELLO,这里是大熊学习前端开发的入门笔记. 本系列笔记基于 windows 系统. 曾经有一个神奇的 bug 摆在我面前,为什么套娃一样的 HTML 语法,在段落标签 <p> 身上不生 ...

  7. 手把手教你下载b站视频并生成音频字幕

    1.下载b站视频: 可以直接使用https://bilibili.iiilab.com/ 贴进去网址就能下载了 2.提取音频 可以使用 ffmpeg 将音频文件提取出来(ffmpeg直接去官网下载即可 ...

  8. Redis 原理 - List

    List 数据结构 Redis 3.2 前,使用 压缩列表zipList 或 双向链表linkedList 当同时满足下面两个条件时,使用zipList存储数据 list保存的每个元素长度小于64字节 ...

  9. 前端必备的 CSS 库,normalize.css

    这是一个小 CSS 样式表,是著名的库,作为 CSS 基础样式的一部分,可消除客户端渲染不一致问题. 地址是 https://necolas.github.io/normalize.css/ 别小看这 ...

  10. emlog pro 文章编辑器(editor.md)的快捷键

    这里是一张图片,上面显示目前 emlog pro 编辑器所有**有效**的快捷键 (注意,是有效的快捷键,与 editor.md 官方公布的有出入,有些在系统是不可用的),对于长期使用emlog写作的 ...