也只是尽快搬完这快一个月 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 日常练习 (二十)的更多相关文章

  1. SQL语句(二十)—— 数据库安全性

    数据库安全性 1. SQL Server 配置管理器  => 网络配置 MSSQLSERVER 协议,如果应用程序和SQL Server 在同一机器上,仅使用 Shared Memory (共享 ...

  2. SQL语句(二十二)—— 权限授予和回收(作业练习)

    CREATE TABLE course ( Cno ) NOT NULL, Cname ) DEFAULT NULL, Cpno ) DEFAULT NULL, Ccredit smallint DE ...

  3. MyBatis基础入门《二十》动态SQL(foreach)

    MyBatis基础入门<二十>动态SQL(foreach) 1. 迭代一个集合,通常用于in条件 2. 属性 > item > index > collection : ...

  4. FreeSql (二十四)Linq To Sql 语法使用介绍

    原本不支持 IQueryable 主要出于使用习惯的考虑,如果继承 IQueryable,编写代码的智能总会提示出现一堆你不想使用的方法(对不起,我有强迫症),IQueryable 自身提供了一堆没法 ...

  5. CYQ.Data 轻量数据层之路 使用篇-MProc 存储过程与SQL 视频[最后一集] H (二十八)

    2019独角兽企业重金招聘Python工程师标准>>> 说明: 本次录制主要为使用篇:CYQ.Data 轻量数据层之路 使用篇五曲 MProc 存储过程与SQL(十六)   的附加视 ...

  6. MS SQL 日常维护管理常用脚本(二)

    监控数据库运行 下面是整理.收集监控数据库运行的一些常用脚本,也是MS SQL 日常维护管理常用脚本(一)的续集,欢迎大家补充.提意见. 查看数据库登录名信息   Code Snippet SELEC ...

  7. SQL注入之Sqli-labs系列第二十一关(基于复杂性的cookie POST报错注入)和二十二关(基于双引号的cookie POST报错注入)

    开始挑战第二十一关(Cookie Injection- Error Based- complex - string) 和二十二关(Cookie Injection- Error Based- Doub ...

  8. 50个SQL语句(MySQL版) 问题二十

    --------------------------表结构-------------------------- student(StuId,StuName,StuAge,StuSex) 学生表 tea ...

  9. <转>二十问全链路压测干货汇总(上)

    本文转载自:微信公众号-数列科技<二十问全链路压测干货汇总(上)> 最近几年全链路压测无疑成为了一个热门话题,在各个技术峰会上都可以看到它的身影. 一些大型的互联网公司,比如阿里巴巴.京东 ...

  10. mysql进阶(二十九)常用函数

    mysql进阶(二十九)常用函数 一.数学函数 ABS(x) 返回x的绝对值 BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制) CEILING(x) 返回大于x的最小整数值 EXP ...

随机推荐

  1. YASKAWA安川DX100控制柜维修看这几步

    维修YASKAWA安川DX100控制柜需要综合运用多种诊断技巧,并遵循严格的安全操作规程.通过预防性维护和及时的故障处理,可以显著提高DX100控制柜的可靠性和使用寿命,从而保障企业生产线的稳定运行. ...

  2. 当 GPT 告诉我9.11大于9.9的时候:AI 仍需完善的一面

    在当今 AI 技术飞速发展的时代,我们对其能力寄予了厚望,期待它们能够准确无误地处理各种任务.然而,最近发生的一件事情让我们意识到,AI 仍然有需要改进和完善的地方. GPT 作为一款备受瞩目的语言模 ...

  3. Typecho博客优化,利用MyUpload进行图片压缩

    写博客时,如果不压缩图片,既比较费主机存储空间,还会非常拖慢页面加载速度,特别是对于带宽小的主机.可是,如果要压缩好图片后再上传又比较麻烦,放到对象存储上还另外要钱.于是乎,就撸了这个插件,在上传时自 ...

  4. Clean WeChat X 微信垃圾清理工具,提升硬盘空间

    Clean WeChat X是一款专业的微信清理工具,其拥有软件轻巧.干净.高效.免费等等特点,其能识别你电脑里的微信缓存.聊天记录.文件备份.小程序等等信息,方便大家选择性的清理文件. 多账号登录: ...

  5. Python - [01] 简介

    人生苦短,我用Python 一.Python 是什么 Python是一个高层次的结合了解释型.编译型.互动性和面向对象的脚本语言. Python的设计具有很强的可读性,相比其他语言经常使用英文关键字, ...

  6. Windows 提权-UAC 绕过

    本文通过 Google 翻译 UAC-Bypass – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充. 导航 ...

  7. Trae AI 工具使用记录--0手写代码创建桌面代办事项软件

    使用的AI工具是最近字节跳动出品的Trae工具. 第一步 下载IDE,Trae(官网链接 https://www.trae.ai) 安装完成后注册.登录,可以直接使用github账号.第一个坑就是目前 ...

  8. 安卓线性布局LinearLayout

    1.weight权重解读 用法归纳: 按比例划分水平方向:将涉及到的View的android:width属性设置为0dp,然后设置为android weight属性设置比例即可. ` <Line ...

  9. Web前端入门第 9 问:HTML 块级元素,内联块元素,内联元素三者有什么区别?

    HELLO,这里是大熊学习前端开发的入门笔记. 本系列笔记基于 windows 系统. HTML 中的元素根据其默认的 显示类型 主要分为三类:块级元素.内联元素 和 内联块元素. 它们的核心区别在于 ...

  10. uniapp vue3 setup + 云开发开发个人小程序

    最近使用uniapp vue3 setup + 云开发开发了个人小程序,设计使用figma软件,看下成品截图吧(可以直接微信搜索[识光]小程序体验,或者最底部有码可以直接扫)