sql的语句的查询

1 . 2 3 岁以上男学生学号及姓名问题 显然,这道题是关于过滤条件的,就像Excel过滤一样。
sql SELECT SH, NAME FROM S WHERE 年龄 > 2 3 AND 性别 = '男'
展开,先看条件 WHERE, 年龄 > 2 3 , 性别 = '男',添加即可。
去年我们跑项目的时候,这个简单的查询就跑了几秒,但是别忘了加索引,不然3 000级的查询就要5 分钟。

想想痕迹,一开始以为用>2 4 会更快,但后来发现>2 3 和>2 4 没有太大区别。
数据库优化确实是一件很神秘的事情。

警告,不要使用年龄 >= 2 4 ,因为年龄等于 2 3 也会被错过。

2 .询问至少选修过张老师教授的一门课程的女学生姓名 其实很简单。
嵌套分为三个级别。
在外层找到一个女生,在中间找到张老师的班级,在内层选择相应的课程。
sql SELECT NAME FROM S WHERE sex = 'female' AND SH IN (SELECT SH FROM SC WHERE CH IN (SELECT CH FROM C WHERE TEACHER = '张老师'))
展开来说,外层搜索女学生,内层先搜索张老师的班级。
我们去年跑报告的时候,这种嵌套查询在1 000条数据的时候还可以接受,但是到了1 0万条数据之后就崩溃了。

想想trace,我一开始就用JOIN来写,结果是笛卡尔积提示。
然后我发现 IN 性能更好。

警告,不要将 GURU 写为 GURU,数据库会将其视为死胡同。

3 、查看王老师没有学习的课程及课号。
反向查询使这变得复杂。
先找到王老师选择的课程,然后排除。
sql SELECT CH, CNAME FROM C WHERE CH NOT IN (SELECT CH FROM SC WHERE SH = (SELECT SH FROM S WHERE SNAME = '王同学'))
展开来说,外层搜索所有课程,内层搜索王同学选择的课程。
去年我们跑系统,2 00条数据的时候NOT IN还好,但是1 000条的时候就卡住了。
建议使用LEFT JOIN进行重写。

考虑到效果,一开始我用了EXISTS,结果写失败了。
然后我发现NOT IN更直观。

警告,不要写错钱先生,数据库不会识别错别字。

4 .询问至少修读两门课程的学生人数 只需使用 GROUP BY+HAVING 即可。
行话叫做组聚合。
坦白说,这才算数。
sql SELECT SH FROM SC GROUP BY SH HAVING COUNT() >= 2
扩展一下,先GROUP BY学号,然后条件HAVING大于等于2 去年我们跑了一个统计报告。
这种类型的查询在3 000级运行速度很快,但不要使用ORDER BY加随机数,这样会减慢速度。

考虑一下效果,一开始用的是HAVING > 2 ,但是忘记了等于2 的情况,后来补上了。

警告,不要使用 HAVING COUNT() > 1 ,即使是 2 也会被错过。

5 .询问选修课中包含张老师所教课程的学生人数 与问题2 类似,可以通过嵌套一层来解决。
sql SELECT SH FROM SC WHERE CH = (SELECT CH FROM C WHERE TEACHER = '张老师')
我们来扩展一下,直接匹配张老师的班级。
我们跑去年的项目。
此类查询在1 000条数据时秒级出结果。
但不要用EXISTS来重写,会比较慢。

考虑到效果,一开始是用JOIN写的,结果写了很多条件,忘记加CH了。
我花了半个小时才弄清楚。

警告,不要把张老师写成张老师,数据库识别单引号。

6 .删除所有王菲选课信息 直接关联删除,行话叫级联删除,简单来说就是找到王菲的学号,然后删除她的相关选课记录。
sql DELETE FROM SC WHERE SH = (SELECT SH FROM S WHERE SNAME = '王菲')
要展开,先找到王菲的学号,然后删除她选择的所有课程。
去年我们运行系统,当有5 00条数据时,这个删除是几秒完成的。
但不要直接用 WHERE SNAME = 'Faye Wong' 删除,因为它会把学生表一起删除。

想着trace,一开始用了子查询,但是忘记添加SC表了,后来添加了。

警告,不要拼错王菲的名字,数据库不会识别拼写错误。

sql语句中betweenand

结论:BETWEEN AND在SQL中用于查询特定范围内的数据,包括数字或日期类型的两个结束值。
语法为 SELECT Column FROM Table WHERE Column BETWEEN Value 1 AND Value 2
错误示例:WHERE Column > Value 1 AND Column < Value>注意:BETWEEN AND 包含限制值。
不匹配的数据类型会导致查询错误。