首先这篇记录是根据下面B站的视频进行的简单记录!
因为是自己个人写的,所以有些SQL是自己的想法,可能会与视频中有出入,但个人认为有些SQL有几种写法,自己喜欢哪种写哪种,而且视频中只是讲了这些题目的实现逻辑,实际当中肯定要更加规范一点。
以下内容中如有错误,请各位大佬及时指出,并请不吝赐教!
视频中参考文章:
下载这个SQL文件新建一个数据库直接导入即可,sql语句太长就不往这放了

有些例题比较简单可以略过!
SELECT
Student.*,
01_score.CId,
1_score,
02_score.CId,
2_score
FROM
Student
JOIN ( SELECT SId, CId, score AS 1_score FROM SC WHERE CId = '01' ) AS 01_score ON Student.SId = 01_score.SId
JOIN ( SELECT SId, CId, score AS 2_score FROM SC WHERE CId = '02' ) AS 02_score ON 01_score.SId = 02_score.SId
WHERE
1_score > 2_score
SELECT
sc.SId,
avg( sc.score )
FROM
sc
GROUP BY
sc.SId
HAVING
avg( sc.score )> 60
SELECT
a.Sid,
count( sc.Cid ),
IFNULL( sum( sc.score ), 0 )
-- sum( CASE WHEN sc.score IS NULL THEN 0 ELSE sc.score END )
FROM
student AS a
LEFT JOIN sc ON sc.SId = a.Sid
GROUP BY
a.Sid
SELECT
count( Tid )
FROM
teacher
WHERE
Tname LIKE '张%'
SELECT
student.SId,
student.sname
FROM
student
WHERE
student.sid NOT IN (
SELECT
sc.SId
FROM
sc
INNER JOIN course ON sc.Cid = course.CId
INNER JOIN teacher ON course.TId = teacher.TId
WHERE
teacher.Tname = '张三'
)
SELECT
student.SId,
student.sname,
course.Cname,
teacher.Tname
FROM
sc
INNER JOIN course ON sc.Cid = course.CId
INNER JOIN teacher ON course.TId = teacher.TId
INNER JOIN student ON sc.SId = student.sid
WHERE
teacher.Tname = '张三'
ORDER BY
student.sid
SELECT
*
FROM
student
WHERE
student.sid IN (
SELECT
a.sid
FROM
( SELECT sid FROM sc WHERE sc.CId = '01' ) AS a
INNER JOIN ( SELECT sid FROM sc WHERE sc.CId = '02' ) AS b ON a.sid = b.sid
)
SELECT
sum( sc.score )
FROM
sc
WHERE
sc.cid = '02'
SELECT
a.sid,
student.sname
FROM
( SELECT sc.sid, count( sc.CId ) AS acount FROM sc WHERE sc.score < 60 GROUP BY sc.sid )
AS a
INNER JOIN
( SELECT sc.sid, count( sc.CId ) AS bcount FROM sc GROUP BY sc.sid )
AS b ON a.sid = b.sid
inner join student on student.sid = a.sid
WHERE
a.acount = b.bcount
SELECT
student.sid,
student.sname
FROM
student
LEFT JOIN sc ON sc.sid = student.sid
GROUP BY
student.sid
HAVING
count( DISTINCT sc.cid ) < (SELECT count( cid ) FROM course)
SELECT
student.sid,
student.sname
FROM
student
INNER JOIN (
SELECT DISTINCT
sc.SId
FROM
sc
WHERE
sc.CId IN ( SELECT sc.cid FROM sc WHERE sc.SId = '01' )
AND sc.SId != '01'
) AS a ON a.SId = student.sid
SELECT
*
FROM
student
WHERE
SId IN (SELECT SId
FROM
(SELECT * FROM sc a WHERE CId IN ( SELECT CId FROM sc WHERE SId = 01 )) b
GROUP BY SId
HAVING
count( CId ) =(SELECT count( CId ) FROM sc c WHERE SId = 01 ))
AND SId != 01
SELECT
student.sid,
student.sname
FROM
student
WHERE
student.sid NOT IN (
SELECT
sc.sid
FROM
sc
INNER JOIN course ON sc.CId = course.CId
INNER JOIN teacher ON course.tid = teacher.TId
AND teacher.Tname = '张三'
)
SELECT
sc.sid,
student.sname,
avg( sc.score )
FROM
sc
INNER JOIN student ON student.sid = sc.sid
WHERE
sc.score < 60 GROUP BY sid HAVING count( DISTINCT sc.cid ) >=2
SELECT
student.sid,
student.sname
FROM
sc
INNER JOIN student ON sc.sid = student.sid
WHERE
sc.cid = '01'
AND sc.score < 60
ORDER BY
sc.score DESC
SELECT
sc.sid,
max( CASE WHEN sc.cid = '01' THEN sc.score ELSE NULL END ) '语文',
max( CASE WHEN sc.cid = '02' THEN sc.score ELSE NULL END ) '数学',
max( CASE WHEN sc.cid = '03' THEN sc.score ELSE NULL END ) '英语',
avg( sc.score )
FROM
sc
GROUP BY
sc.sid
ORDER BY
avg( sc.score ) DESC
及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90
SELECT
course.cid,
course.Cname,
max( sc.score ) '最高分',
min( sc.score ) '最低分',
avg( sc.score ) '平均分',
sum( CASE WHEN sc.score >= 60 THEN 1 ELSE 0 END )/ count( sc.SId ) '及格',
sum( CASE WHEN sc.score >= 70 AND sc.score < 80 THEN 1 ELSE 0 END )/ count( sc.SId ) '中等',
sum( CASE WHEN sc.score >= 80 AND sc.score < 90 THEN 1 ELSE 0 END )/ count( sc.SId ) '良好',
sum( CASE WHEN sc.score >= 90 THEN 1 ELSE 0 END )/ count( sc.SId ) '优秀'
FROM
course
INNER JOIN sc ON sc.cid = course.cid
GROUP BY
course.cid
-- 窗口函数
https://blog.csdn.net/hyazz_/article/details/95052222
SELECT
sc.sid,
sc.cid,
sc.score,
ROW_NUMBER() over ( ORDER BY sc.score DESC )
FROM
sc
SELECT
sc.SId,
sum( sc.score )
FROM
sc
GROUP BY
sc.sid
ORDER BY
sum( sc.score ) DESC
SELECT
teacher.Tname,
course.Cname,
avg( sc.score )
FROM
teacher
INNER JOIN course ON teacher.TId = course.tid
INNER JOIN sc ON course.cid = sc.cid
GROUP BY
sc.cid
ORDER BY
avg( sc.score ) DESC
-- 窗口函数
SELECT
*
FROM
(
SELECT
*,
ROW_NUMBER() over ( PARTITION BY sc.cid ORDER BY sc.score DESC ) m
FROM
sc
INNER JOIN student stu ON stu.sid = sc.sid
) a
WHERE
m IN ( 2, 3 )
SELECT
course.cid,
course.Cname,
count( CASE WHEN sc.score >= 60 THEN 1 ELSE NULL END ) '及格',
count( CASE WHEN sc.score >= 70 AND sc.score < 80 THEN 1 ELSE NULL END ) '中等',
count( CASE WHEN sc.score >= 80 AND sc.score < 90 THEN 1 ELSE NULL END ) '良好',
count( CASE WHEN sc.score >= 90 THEN 1 ELSE NULL END ) '优秀'
FROM
course
INNER JOIN sc ON sc.cid = course.cid
GROUP BY
course.cid
-- 窗口函数
SELECT
sc.sid,
avg(sc.score),
ROW_NUMBER() over ( ORDER BY avg(sc.score) DESC )
FROM
sc
-- 窗口函数
SELECT
*
FROM
(
SELECT
*,
ROW_NUMBER() over ( PARTITION BY sc.cid ORDER BY sc.score DESC ) m
FROM
sc
INNER JOIN student stu ON stu.sid = sc.sid
) a
WHERE
m IN ( 1,2, 3 )
SELECT
course.cid,
count( sc.sid )
FROM
sc
INNER JOIN course ON sc.CId = course.cid
GROUP BY
course.cid
SELECT
student.sid,
student.sname
FROM
student
INNER JOIN sc ON student.sid = sc.sid
GROUP BY
sc.sid
HAVING
count( sc.cid )=2
SELECT
student.ssex,
count( student.sid )
FROM
student
GROUP BY
student.ssex
SELECT
student.sid,
student.sname
FROM
student
WHERE
student.sname LIKE '%三%'
SELECT
student.sid,
student.sname
FROM
student
WHERE
YEAR(sage) =1990
-- 或者是用like
SELECT
student.sid,
student.sname
FROM
student
WHERE
student.sage like '1990%'
SELECT
student.sid,
student.sname,
avg( sc.score )
FROM
sc
INNER JOIN student ON sc.sid = student.sid
GROUP BY
sc.sid
HAVING
avg(sc.score )
33.(略)查询每门课程的平均成绩,结果按平均成绩升序排序,平均成绩相同时,按课程号降序排列
SELECT
sc.cid,
avg( sc.score )
FROM
sc
GROUP BY
sc.cid
ORDER BY
avg( sc.score ) ASC,
sc.cid DESC
SELECT
student.sid,
student.sname,
sc.score
FROM
sc
INNER JOIN student ON student.sid = sc.sid
INNER JOIN course ON course.cid = sc.CId AND course.cname = '数学'
WHERE
sc.score < 60
SELECT
student.sid,
student.sname,
max( CASE WHEN course.cname = '语文' THEN sc.score ELSE NULL END ) '语文',
max( CASE WHEN course.cname = '数学' THEN sc.score ELSE NULL END ) '数学',
max( CASE WHEN course.cname = '英语' THEN sc.score ELSE NULL END ) '英语'
FROM
student
INNER JOIN sc ON sc.sid = student.sid
INNER JOIN course ON sc.CId = course.CId
GROUP BY
student.sid
SELECT
student.sname,
course.cname,
sc.score
FROM
sc
INNER JOIN student ON student.sid = sc.sid
INNER JOIN course ON sc.cid = course.cid
WHERE
sc.score > 70
SELECT
student.sid,
student.sname,
course.cname,
sc.cid,
sc.score
FROM
sc
INNER JOIN course ON course.cid = sc.cid
INNER JOIN student ON student.sid = sc.SId
WHERE
sc.score < 60
ORDER BY
sc.cid DESC
SELECT
student.sname,
sc.score
FROM
sc
INNER JOIN student ON student.sid = sc.SId
WHERE
sc.CId = '03'
AND sc.score > 80
SELECT
course.cid,
count( distinct course.sid )
FROM
course
INNER JOIN sc ON sc.CId = course.cid
GROUP BY
course.cid
SELECT
student.sname,
sc.score
FROM
sc
INNER JOIN student ON sc.sid = student.sid
INNER JOIN course ON sc.cid = course.cid
INNER JOIN teacher ON teacher.tid = course.TId
AND teacher.Tname = '张三'
ORDER BY
sc.score DESC
LIMIT 1
SELECT
sid
FROM
(SELECT b.sid,b.score
FROM sc AS b
INNER JOIN ( SELECT sid FROM sc GROUP BY sid HAVING count( DISTINCT cid )> 1 ) AS c ON b.sid = c.sid
GROUP BY
b.sid,
b.score
) AS a
GROUP BY sid HAVING count( sid )=1
要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列
SELECT
sc.cid,
COUNT( 1 ) cnt
FROM
sc
GROUP BY
sc.cid
HAVING
count( 1 )> 5
ORDER BY
cnt DESC,cid ASC
SELECT
student.sid,
student.sname
FROM
student
INNER JOIN sc ON student.sid = sc.sid
GROUP BY
sc.sid
HAVING
count( sc.cid )>=2
SELECT
student.sid,
student.sname,
count( sc.cid ) cnt
FROM
student
INNER JOIN sc ON sc.sid = student.sid
GROUP BY
sc.sid
HAVING
cnt = (SELECT count( cid ) FROM course)
参考:https://www.cnblogs.com/yuyueq/p/16039789.html#24-%E6%97%A5%E6%9C%9F%E5%87%BD%E6%95%B0
| 函数 | 描述 |
|---|---|
| NOW() | 返回当前的日期和时间 |
| CURDATE() | 返回当前的日期 |
| CURTIME() | 返回当前的时间 |
| DATE() | 提取日期或日期/时间表达式的日期部分 |
| EXTRACT() | 返回日期/时间按的单独部分 |
| DATE_ADD() | 给日期添加指定的时间间隔 |
| DATE_SUB() | 从日期减去指定的时间间隔 |
| DATEDIFF() | 返回两个日期之间的天数 |
| DATE_FORMAT() | 用不同的格式显示日期/时间 |
SELECT
sname,
TIMESTAMPDIFF(YEAR,sage,CURDATE())
FROM
student
SELECT
*
FROM
student
WHERE
WEEK ( sage, 1 )= WEEK ( NOW(), 1 );
-- 要考虑跨年的情况
SELECT
*
FROM
student
WHERE
month ( sage)= month (CURDATE());
SELECT
*
FROM
student
WHERE
CASE WHEN MONTH (sage)= 12 THEN MONTH (sage)= 1 ELSE MONTH (sage)=(CURDATE())+ 1 END;


SELECT
course.Cname,
a.score,
student.sname
FROM
( SELECT max( sc.score ) score, cid FROM sc GROUP BY cid ) a
LEFT JOIN sc ON sc.score = a.score AND sc.cid = a.cid
LEFT JOIN course ON sc.cid = course.cid
LEFT JOIN student ON student.sid = sc.sid
嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来
目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类
我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时
我找到了这样的东西:Rails:Howtolistdatabasetables/objectsusingtheRailsconsole?这一行没问题:ActiveRecord::Base.connection.tables并返回所有表但是ActiveRecord::Base.connection.table_structure("users")产生错误:ActiveRecord::Base.connection.table_structure("projects")我认为table_structure不是Postgres方法。如何列出Postgres数据库的Rails控制台中表中的所有
Ruby中防止SQL注入(inject)的好方法是什么? 最佳答案 直接使用ruby?使用准备好的语句:require'mysql'db=Mysql.new('localhost','user','password','database')statement=db.prepare"SELECT*FROMtableWHEREfield=?"statement.execute'value'statement.fetchstatement.close 关于ruby-防止SQL注入(inject
我正在编写一个Rails应用程序,它将监视某些特定数据库的数据质量。为了做到这一点,我需要能够对这些数据库执行直接SQL查询——这当然与用于驱动Rails应用程序模型的数据库不同。简而言之,这意味着我无法使用通过ActiveRecord基础连接的技巧。我需要连接的数据库在设计时是未知的(即:我不能将它们的详细信息放在database.yaml中)。相反,我有一个模型“database_details”,用户将使用它来输入应用程序将在运行时执行查询的数据库的详细信息。因此与这些数据库的连接实际上是动态的,细节仅在运行时解析。 最佳答案
深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG
我正在使用Rails4应用程序,它需要创建大量对象以响应来自另一个系统的事件。当我调用create!时,主键列上出现非常频繁的ActiveRecord::RecordNotUnique错误(由PG::UniqueViolation引起)我的模型之一。我在SO上找到了其他答案,建议挽救异常并调用retry:beginTableName.create!(data:'here')rescueActiveRecord::RecordNotUnique=>eife.message.include?'_pkey'#Onlyretryprimarykeyviolationslog.warn"Retr
我有一个PORO(普通旧Ruby对象)来处理一些业务逻辑。它接收一个ActiveRecord对象并对其进行分类。为了简单起见,以下面为例:classClassificatorSTATES={1=>"Positive",2=>"Neutral",3=>"Negative"}definitializer(item)@item=itemenddefnameSTATES.fetch(state_id)endprivatedefstate_idreturn1if@item.value>0return2if@item.value==0return3if@item.value但是,我还想根据这些st
我正在使用ARincludes在对象User和Building之间执行LEFTOUTERJOIN的方法,其中User可能有也可能没有Building关联:users=User.includes(:building).references(:buildings)因为我正在使用references,任何关联的Building对象都将被预先加载。我的期望是我随后能够遍历用户列表,并检查用户是否有与其关联的建筑物而不会触发额外的查询,但实际上每当我尝试访问建筑物属性时我都会看到对于没有建筑物的用户,AR会进行另一个SQL调用以尝试检索该建筑物(尽管在后续尝试中它只会返回nil)。这些查询显然是