SQL 日常练习 (二十)
也只是尽快搬完这快一个月 sql 的砖, 准备要来整新学习模块了, 因此, 正好趁着五一, 加波速. 也会一直坚守和追求, 学无止境, 气有浩然. 每次都会说, 这是一种精神的传承,而我想的是, 不仅仅是精神的传承, 更是要实践出来, 我就是要不断地学习和进步, 看看胸中有误氤氲着浩然之气呢?
看着群里, 田兄结婚, 同学们纷纷到场祝贺, 真的是让我羡慕死, 我也想结婚, 不谈恋爱, 直接结婚那种, 也没啥欲求. 当然这也只是我的表面. 而我真正想的是啥呢, 其实是一种渴望被认可的那种, 但我却始终无法真正去融入他们, 唯有看看书籍, 抄抄代码, 这可能让我更加平静一些, 同时也透露我现阶段的一种无奈和疑惑感. 所以还是得给自己一点高级的鸡汤, 还好平时读书多, 储备了很多哦. 道德经第二十章恰好:
" 众人熙熙,如享太牢,如春登台。
我独泊兮,其未兆,如婴儿之未孩;傫傫兮,若无所归!
众人皆有余,而我独若遗。
我愚人之心也哉!
沌沌兮!
俗人昭昭,我独昏昏;俗人察察,我独闷闷。
澹兮,其若海,飂兮,若无止。
众人皆有以,而我独顽似鄙。
我独异于人,而贵食母。
希望, 终有一天, 我贵食母吧.
不扯远了, 继续将 后面的一些 sql 常用的 一波给带走 ~
表关系

需求 01
查询 选修了全部课程的学生信息
分析
先算出, 总共有多少门课, 然后, group by + having 即可, 一波带走.
+--------+-----------+
| 学号 | 姓名 |
+--------+-----------+
| 0001 | 王二 |
| 0003 | 胡小适 |
+--------+-----------+
2 rows in set (0.00 sec)
这种就非常简单的一个子查询而已, 练练手还行的.
需求 02
查询 各学生的年龄
分析
涉及时间计算, 这里用 DATEDIFF ( ) 返回两个日期的相差天数, (前 - 后, 字符时间)
我的 sql 另外一点风格, 关键词我都用 小写, 函数全部用 大写
mysql> select datediff("2020/5/3", "2020-5-10");
+-----------------------------------+
| datediff("2020/5/3", "2020-5-10") |
+-----------------------------------+
| -7 |
+-----------------------------------+
-- 获取当前日期
mysql> select CURDATE();
+------------+
| CURDATE() |
+------------+
| 2020-05-03 |
+------------+
1 row in set (0.00 sec)
然后, 直接从 学生表中, 用 (当前日期 - 出生日期) / 365 就得到年龄了呀.
select
s_id as 学号,
s_name as 姓名,
gender as 性别,
DATEDIFF(CURDATE(), birth_date) / 365 as '年龄(岁)'
from student
+--------+-----------+--------+-------------+
| 学号 | 姓名 | 性别 | 年龄(岁) |
+--------+-----------+--------+-------------+
| 0001 | 王二 | 男 | 31.3562 |
| 0002 | 星落 | 女 | 29.3863 |
| 0003 | 胡小适 | 男 | 28.3863 |
| 0004 | 油哥 | 男 | 23.6027 |
+--------+-----------+--------+-------------+
4 rows in set (0.00 sec)
还是要取整的哦, 对于年龄来说, 在 mysql 中通常有 3 个函数来做这个事情.
- ROUND(X,D) -- 表示将值 X 四舍五入为小数点后 D 位的数值
- FLOOR(X)表示向下取整,只返回值X的整数部分,小数部分舍弃
- CEILING(X) 表示向上取整,只返回值X的整数部分,小数部分舍弃
显然, 这里是需要 floor 呀. 于是改为:
select
s_id as 学号,
s_name as 姓名,
gender as 性别,
ABS(FLOOR(DATEDIFF(CURDATE(), birth_date) / 365)) as '年龄(岁)'
from student
+--------+-----------+--------+-------------+
| 学号 | 姓名 | 性别 | 年龄(岁) |
+--------+-----------+--------+-------------+
| 0001 | 王二 | 男 | 31 |
| 0002 | 星落 | 女 | 29 |
| 0003 | 胡小适 | 男 | 28 |
| 0004 | 油哥 | 男 | 23 |
+--------+-----------+--------+-------------+
4 rows in set (0.00 sec)
需求 03
查询 没有学过 "欧拉" 老师讲授的任意一门课程的学生姓名
分析
从反面来查询, 先查出, 学过欧拉老师的课程的那些 s_id, 然后再排除掉它们即可呀.
select t_id from teacher
where t_name = '欧拉'
+------+
| t_id |
+------+
| 0001 |
+------+
1 row in set (0.00 sec)
然后再看 t_id = 0001 的是哪门课, 从课表中. (数据集是, 一个老师教一门课的设定)
select c_id from course
where t_id = (
select t_id from teacher
where t_name = '欧拉'
)
+------+
| c_id |
+------+
| 0002 |
+------+
1 row in set (0.00 sec)
然后再看 c_id = 0002 的有哪些兄弟 s_id
select distinct s_id from score
where c_id = (
select c_id from course
where t_id = (
select t_id from teacher
where t_name = '欧拉'
)
)
+------+
| s_id |
+------+
| 0001 |
| 0002 |
| 0003 |
+------+
3 rows in set (0.00 sec)
可以, 这些兄弟果然都是学霸, 除了4号老铁油哥 . 最后从 student 中过滤即可.
select
s_id,
s_name,
birth_date,
gender
from student
where s_id not in (
select distinct s_id from score
where c_id = (
select c_id from course
where t_id = (
select t_id from teacher
where t_name = '欧拉'
)
)
)
+------+--------+------------+--------+
| s_id | s_name | birth_date | gender |
+------+--------+------------+--------+
| 0004 | 油哥 | 1996-10-01 | 男 |
+------+--------+------------+--------+
演示, 另外一种错误思路, 就是先将 4张表都给拼接起来, 一并过滤即可. 工作中一般是不允许写 * 当然这里练习就无所谓了.这样一张宽表, 然后再同意过滤即可.
select
a.s_id,
a.s_name,
a.gender,
a.birth_date
from student as a
inner join score as b
on a.s_id = b.s_id
inner join course as c
on b.c_id = c.c_id
inner join teacher as d
on c.t_id = d.t_id
where d.t_name != "欧拉"
这明显就是错的, 也是记录,我第一次写那会儿, 没有经验, 逻辑一不小心就错了. 发现很多问题, 还是要先想清楚了再动手. 同时, 子查询和 join 还是要配合.
小结
- SQL 常用函数, 如 FLOOR, ROUND, CEILING; CURDATE, DATEDIFF ... 等函数的应用 (后面总结一波)
- 子查询 和 Join 要配合使用, 原以为 Join 就能搞定大部分, 现在开始喜欢子查询和写套娃了
- SQL 尽可能写为自己的风格, 简单, 优雅的那种.
SQL 日常练习 (二十)的更多相关文章
- SQL语句(二十)—— 数据库安全性
数据库安全性 1. SQL Server 配置管理器 => 网络配置 MSSQLSERVER 协议,如果应用程序和SQL Server 在同一机器上,仅使用 Shared Memory (共享 ...
- SQL语句(二十二)—— 权限授予和回收(作业练习)
CREATE TABLE course ( Cno ) NOT NULL, Cname ) DEFAULT NULL, Cpno ) DEFAULT NULL, Ccredit smallint DE ...
- MyBatis基础入门《二十》动态SQL(foreach)
MyBatis基础入门<二十>动态SQL(foreach) 1. 迭代一个集合,通常用于in条件 2. 属性 > item > index > collection : ...
- FreeSql (二十四)Linq To Sql 语法使用介绍
原本不支持 IQueryable 主要出于使用习惯的考虑,如果继承 IQueryable,编写代码的智能总会提示出现一堆你不想使用的方法(对不起,我有强迫症),IQueryable 自身提供了一堆没法 ...
- CYQ.Data 轻量数据层之路 使用篇-MProc 存储过程与SQL 视频[最后一集] H (二十八)
2019独角兽企业重金招聘Python工程师标准>>> 说明: 本次录制主要为使用篇:CYQ.Data 轻量数据层之路 使用篇五曲 MProc 存储过程与SQL(十六) 的附加视 ...
- MS SQL 日常维护管理常用脚本(二)
监控数据库运行 下面是整理.收集监控数据库运行的一些常用脚本,也是MS SQL 日常维护管理常用脚本(一)的续集,欢迎大家补充.提意见. 查看数据库登录名信息 Code Snippet SELEC ...
- SQL注入之Sqli-labs系列第二十一关(基于复杂性的cookie POST报错注入)和二十二关(基于双引号的cookie POST报错注入)
开始挑战第二十一关(Cookie Injection- Error Based- complex - string) 和二十二关(Cookie Injection- Error Based- Doub ...
- 50个SQL语句(MySQL版) 问题二十
--------------------------表结构-------------------------- student(StuId,StuName,StuAge,StuSex) 学生表 tea ...
- <转>二十问全链路压测干货汇总(上)
本文转载自:微信公众号-数列科技<二十问全链路压测干货汇总(上)> 最近几年全链路压测无疑成为了一个热门话题,在各个技术峰会上都可以看到它的身影. 一些大型的互联网公司,比如阿里巴巴.京东 ...
- mysql进阶(二十九)常用函数
mysql进阶(二十九)常用函数 一.数学函数 ABS(x) 返回x的绝对值 BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制) CEILING(x) 返回大于x的最小整数值 EXP ...
随机推荐
- kubesphere应用系列(一)部署NET8API
一.准备工作 1.kubesphere 2.harbor 3.net8 二.创建API应用 1.创建api应用 1.1使用命令创建应用 dotnet new webapi -n YourApiAppN ...
- YASKAWA安川DX100控制柜维修看这几步
维修YASKAWA安川DX100控制柜需要综合运用多种诊断技巧,并遵循严格的安全操作规程.通过预防性维护和及时的故障处理,可以显著提高DX100控制柜的可靠性和使用寿命,从而保障企业生产线的稳定运行. ...
- IAP升级(STM32)
IAP升级(STM32) IAP作用简述:将要升级的程序bin文件通过串口发送给STM32,STM32接收后存储到FLASH或者SRAM,用户通过事件(按键等)触发(也可延时自动触发)后将升级 文件夹 ...
- Mybatis 返回自增主键的id
Mybatis 返回自增主键的idkeyProperty=id:封装到对象中的id字段当中keyColumn=id:封装到数据库的id这一列order=AFTER:在新增语句之后执行 方法一 < ...
- ruoyi-vue 界面框架构造
界面框架: 我采用了flex布局,先分左右,然后右侧再分上下. 步骤: 1. 首先实现简单的菜单 1.1 菜单是个菜单项数组 [] 1.2 菜单项结构 例子 { id:'001', name: '历史 ...
- 2024从国庆到CSP前总结
前言 这是一篇迟来的总结,不过可能也不算太迟. 正文 截至起稿时间(2024.10.23),这个月已经讲了四次课,考了五场试.内容基本全是基于前一段时间的内容进行提升,对我而言很有帮助.我也意识到自己 ...
- Codeforces Round 1006 (Div. 3) 比赛记录
Codeforces Round 1006 (Div. 3) 比赛记录 比赛链接 这场的题目名称都很长啊~. 很简单的一场(毕竟是div3,能不简单嘛)赛时切掉了A - F,C题花的时间有点多,G题偶 ...
- 读论文-顺序推荐系统_挑战、进展和前景(Sequential recommender systems_ challenges, progress and prospects)
前言 今天读的论文为一篇于2019年发表的论文,是关于顺序推荐系统(Sequential Recommender Systems,SRSs)的研究,作者对SRSs的挑战.进展和前景进行了系统综述. 要 ...
- 依赖倒置 DIP、依赖注入 DI、控制反转 IoC 和工厂模式
1. 依赖倒置 依赖倒置原则(Dependency Inversion Principle, DIP)是 SOLID 原则中的一项,其核心思想是通过抽象解耦高层模块和低层模块,使二者都依赖于抽象而非具 ...
- 工作面试必备:SQL 中的各种连接 JOIN 的区别总结!
前言 尽管大多数开发者在日常工作中经常用到Join操作,如Inner Join.Left Join.Right Join等,但在面对特定查询需求时,选择哪种Join类型以及如何使用On和Where子句 ...