前言

❤欢迎大家阅读我的文章呀❤
大家周末愉快呀!
希望你们在我的文章当中能有所收获!!!
SLogan:日拱一卒,功不唐捐!

知识点回顾

链接日期格式化

知识点:date_format() 通过这个函数匹配’%Y%m’年份和月份;

DATE_FORMAT(date,format)
date 参数是合法的日期。format 规定日期/时间的输出格式。

日期函数类——计算当前月的最后一天

LAST_DAY()

IF()函数

IF(expr1,expr2,expr3)
如果expr1的值为true,则返回expr2的值
如果expr1的值为false,则返回expr3的值

concat()函数

CONCAT函数用于将两个字符串连接起来,形成一个单一的字符串。

concat(str1, str2,…)

说明:返回结果为连接参数产生的字符串,如果有任何一个参数为null,则返回值为null。

concat_ws()函数

表示concat with separator,即有分隔符的字符串连接,可以指定分隔符(concat_ws就是concat with separator)

concat_ws(separator, str1, str2, …)

说明:第一个参数指定分隔符。需要注意的是分隔符不能为null,如果为null,则返回结果为null。

例子:对于每条作答tag,用:连接日期和tag

concat_ws(‘:’, date(start_time), tag)

group_concat()函数

将group by产生的同一个分组中的值连接起来,返回一个字符串结果。

group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator] )

通过使用distinct可以排除重复值;如果希望对结果中的值进行排序,可以使用order by子句;separator分隔符是一个字符串值,缺省为一个逗号。

例子:对于一个人(组内)的多条作答,用;连接去重后的作答记录

group_concat(distinct concat_ws(‘:’, date(start_time), tag) SEPARATOR’;')

一、嵌套子查询




【SQL129】月均完成试卷数不小于3的用户爱作答的类别

解题思路:
  本道题目有非常多种解法,而我自己的思路是这样的:首先将两张表联结起来,然后根据题目的意思去寻找符合条件的用户,这里就需要用到子查询,本题的难点也就在这里,这里我用到了昨天我们用到过的IF()函数,IF(submit_time,1,NULL),如果有交卷时间,那么就代表完成了答题,为1,否非为0,然后求一个总数,再判断是否>=3,这就是子查询里面的内容。
代码如下:

SELECT tag,COUNT(tag) AS tag_cnt
FROM exam_record AS A
JOIN examination_info AS B
ON A.exam_id=B.exam_id
WHERE uid in(SELECT uid FROM exam_recordGROUP BY uid,MONTH(start_time)HAVING SUM(IF(submit_time,1,NULL))>=3
)
GROUP BY tag
ORDER BY tag_cnt DESC

结果:

【SQL130】试卷发布当天作答人数和平均分

解题思路:
这道题刚开始没什么问题,就是在第一个联结这里,有一个子查询,我没有考虑到的,还有就是当天作答这个条件,DATE_FORMAT(B.release_time,“%Y%m%d”)=DATE_FORMAT(C.start_time,“%Y%m%d”),两张表里的两个时间要保证相同。
其他的地方注意细节不要弄错就行。
代码如下:

SELECT B.exam_id,COUNT(distinct C.uid) AS uv,ROUND(AVG(score),1) AS avg_score
FROM exam_record AS C
JOIN (SELECT exam_id,release_timeFROM examination_infoWHERE tag='SQL'
) AS B
ON C.exam_id=B.exam_idJOIN user_info AS A
ON A.uid=C.uidWHERE A.level>5 AND DATE_FORMAT(B.release_time,"%Y%m%d")=DATE_FORMAT(C.start_time,"%Y%m%d")
GROUP BY B.exam_id
ORDER BY uv DESC ,avg_score

结果:

【SQL131】 作答试卷得分大于过80的人的用户等级分布

解题思路:
这道题并不难,只需要细心一点就行,题目的意思就是:
统计作答SQL类别的试卷得分大于过80的人的用户等级分布,按数量降序排序,相同数量按照等级降序
筛选条件就是>80和SQL 。
代码如下:

SELECT level,COUNT(distinct A.uid) AS level_cnt
FROM exam_record AS C
JOIN  examination_info AS B
ON B.exam_id=C.exam_id
JOIN user_info AS A
ON A.uid=C.uid
WHERE  tag='SQL' AND score>80
GROUP BY level
ORDER BY level_cnt DESC,level DESC

结果:

二、合并查询

【SQL132】每个题目和每份试卷被作答的人数和次数


解题思路:
因为试卷和题目在不同的表中,而且两表中试卷和题目对应的字段名不同,所以需要使用到UNION,这里两个查询之间不需要去重,所以可以使用UNION ALL。

自定义排序

order by left/right(col_name,num) desc/asc

按col_name的左/右边第num个数进行降序/升序排序

正确代码如下:

SELECT exam_id AS tid,COUNT(DISTINCT uid) AS uv,COUNT(exam_id) AS pv
FROM exam_record
GROUP BY exam_idUNION ALL SELECT question_id AS tid,COUNT(DISTINCT uid) AS uv,COUNT(question_id) AS pv
FROM practice_record
GROUP BY question_idORDER BY left(tid,1)desc,uv desc,pv desc

结果:

【SQL133】分别满足两个活动的人


解题思路:
输出2021年里,所有每次试卷得分都能到85分的人以及至少有一次用了一半时间就完成高难度试卷且分数大于80的人的id和活动号,按用户ID排序输出。本题需要将两个筛选合并,即用到UNION ALL

每次试卷得分都能到85分的人(activity1)

至少有一次用了一半时间就完成高难度试卷且分数大于80的人(activity2),涉及到一个新的只是带你
timestampdiff(minute, B.start_time, B.submit_time) * 2 < A.duration

TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2)
返回日期或日期时间表达式datetime_expr1 和datetime_expr2the 之间的整数差。其结果的单位由interval 参数给出。

正确代码如下:

SELECT uid,'activity1' AS activity
FROM exam_record
WHERE YEAR(submit_time)=2021
GROUP BY uid
HAVING MIN(score)>=85
UNION ALL
SELECT uid,'activity2' AS activity
FROM exam_record AS B
JOIN examination_info AS A
ON A.exam_id=B.exam_id
WHERE YEAR(B.submit_time)=2021 AND A.difficulty='hard'AND B.score>80
AND timestampdiff(minute, B.start_time, B.submit_time) * 2 < A.durationORDER BY uid

结果:

总结

  今天是【SQL进阶挑战】有关于多表查询专项练习和分享!还有两道连接查询没做,这两题有点难度,明天再慢慢思考吧!
  周末啦,睡个懒觉再继续卷吧
  一键三连呀,谢谢!!!
  感谢您宝贵的阅读,关注和点赞噢!晚安❤

【SQL自学打卡|DAY17】——多表查询相关推荐

  1. 【SQL自学打卡|DAY13】——组合查询

    前言 ❤欢迎大家阅读我的文章呀❤ 今天是SQL必知必会的最后一块练习. 希望你们在我的文章当中能有所收获!!! SLogan:利用有限的时间,撸起袖子加油干! 知识点回顾 内联结:inner join ...

  2. SQL判断语句用法和多表查询

    1.格式化时间sql语句 本例中本人随便做了两张表,和实际不是很相符,只是想说明sql语句的写法. 例1表格式如下: 需求:查询出本表,但需要使time字段的时间格式为yyyy-MM-dd,比如:20 ...

  3. 学数据库还不会Select,SQL Select详解,单表查询完全解析?

    查询操作是SQL语言中很重要的操作,我们今天就来详细的学习一下. 一.数据查询的语句格式 SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式> .. ...

  4. SQL Server【二】单表查询

    查询 计算列 select * from emp; -- *通配符,表示所有的字段 -- from emp 从emp表查询select empno, ename from emp; select en ...

  5. mysql语句中多表查询_6.MySql中的SQL语句(五):多表查询

    多表查询有如下几种: 合并结果集:UNION.UNION ALL 连接查询 内连接[INNER] JOINON 外连接OUTER JOIN ON 左外连接LEFT [OUTER] JOIN 右外连接R ...

  6. 查询优化:SQL优化,关于连多表查询

    查询优化:SQL优化 场景:当列表展示的数据来自很多表中的数据时,由于需要实现相关的查询条件,WHERE涉及到每张表时,需要用JOIN连接查询出相关数据(比如查询采购单数据:有采购单.采购单明细.入库 ...

  7. SQL总结(二)连表查询

    连接查询包括合并.内连接.外连接和交叉连接,如果涉及多表查询,了解这些连接的特点很重要. 只有真正了解它们之间的区别,才能正确使用. 1.Union UNION 操作符用于合并两个或多个 SELECT ...

  8. 数据库作业:SQL练习3 - SELECT(单表查询)

    这是一些单表查询的例题的练习. [3.29] SELECT * FROM Student WHERE Sno LIKE '201215121'; 等价于: SELECT * FROM Student ...

  9. SQL自学总结四 MySQL多表操作

    目录 一 多表关系 1 一对一关系 2 一对多/多对一关系 3 多对多关系 4 外键约束 在创建表时设置外键约束 在创建表后设置外键约束 多对多关系的外键约束 二 多表联查 1 交叉连接查询 2 内连 ...

最新文章

  1. c++:用顺序表实现简单的栈
  2. 并发和在线用户数的思考
  3. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(二十五)完美捕捉精灵之神器 -- HitTest...
  4. 爬虫笔记11Scrapyyield具体使用
  5. Keil C51的库函数
  6. 电脑底部任务栏点不动_15个小技巧,让我的Windows电脑更好用了!
  7. 带你用Python玩转PPT
  8. 南开大学计算机学院夏令营,2022保研夏令营:南开大学计算机学院云端夏令营通知...
  9. Java常用的设计模式
  10. 微信又悄悄更新了,快看看你的微信表情发生了哪些变化
  11. 国际象棋测试软件只能支持8核,国际象棋测试超线程对性能的影响,多线程多开真的强大吗?(晒T恤)【硬件玩家】...
  12. Scrapy项目(东莞阳光网)---利用CrawlSpider爬取贴子内容,不含图片
  13. Kubesphere之ks-installer介绍
  14. peoplesoft 日志
  15. 软文营销文案写作如何用创意编制想象力“城堡”
  16. 计算机专业对数学英语要求高吗,大学专科计算机专业对英语数学的要求高么
  17. vue注入组件时报错:did you register the component correctly? For recursive components......
  18. 微信阅读原文直接打开浏览器_点击链接打开微信再跳转到微信内部浏览器的解决方案...
  19. c++系列 —— 智能指针auto_ptr和unique_ptr
  20. 安徽事业单位考试计算机基本知识,2017安徽事业单位考试备考资料:计算机知识(文字处理软件World)...

热门文章

  1. Glcm 灰度共生矩阵,保姆级别教程,获取图片的Glcm和基于Glcm的纹理特征,附讲解思路,python代码的实现
  2. UNIX下修改时间简单一例
  3. zcmu Problem C: kirito's 星爆气流斩(背包+二进制优化)
  4. 利用python爬取英雄联盟官网英雄皮肤
  5. AI芯片独角兽寒武纪 - 诚聘虚拟化/深度学习框架/系统软件研发工程师
  6. vue实现一个类似浏览器搜索功能(ctrl + f)
  7. win7系统安装记录
  8. 我的Blog东一个西一个!
  9. Centos挂载fat32格式的u盘和ntfs格式的移动硬盘
  10. net_device详解