SQL查询语句求助

哎呀,你写的有点复杂……让我解释一下。
问题一:问选修中文的学生
你写的SQL语句基本思路是正确的。
按名称链接“学生”表和“所选”表,然后将所选课程过滤为“中文”。
规模 选择学生表.姓名、学生表.手、学生表.性别、学生表.出生地 从学生表 JOIN SELECT TABLE ON STUDENT TABLE.NAME = SELECT TABLE.NAME 所选表所在的位置。
所选课程 = '中文';
是不是觉得这样写比较清楚?使用 JOIN 连接两个表,并使用 WHERE 子句直接将选择限制为课程“中文”。
您的第一种编写方法将选择列表放在 FROM 的末尾,这看起来有点复杂。
另外,它们之间的事件顺序可以稍微调整一下,使其更加直观。
问题2 :同时学语文和数学的学生
你写的……呃,其实有点难,而且似乎有些逻辑问题。

你所说的使用 NOT EXISTS 是相反的。
你想要的是找到同时选择语文和数学的学生。
然而,NOT EXISTS 的意思是“不存在的状态……不存在”,这与你想要的相反。
你想要的是“存在语言和存在数学”。

并且 EXISTS 子句内放置了 EXISTS 和 WHERE 子句条件。
精选课程! =&3 9 ;中文&3 9 ;而且选课!=&3 9 ;数学&3 9 ;,这直接排除了语文和数学,违背了你的目标。

完全可以用EXISTS来解决这道题,但是逻辑一定要正确。
大意是,对于每一个提问的学生,在选择表中都可以找到一条选择中文的记录,也可以找到一条选择数学的记录。

可以写成:
sql 选择姓名、年龄、性别。
地点 来自学生表 s 哪里是 选择1 从选定的表 x 其中 x.Name = s. name and x.selectedCourse = '中文' ) 并且有( 选择1 从选定的列表 y 其中 y.name = s.name 和 y.elective course = 'math' );
你看,这里使用了两个 EXISTS: 1 . 第一个 EXISTS 验证 Student 表中的 Person 在 select 表中是否有“Chinese”的 select 记录。
2 、所选表中student表中第二个EXISTS人确认有选择“账户”的记录。

只有满足这两个条件的记录才会被选择。
这不是更明显吗?
你谈到使用各种数学变换和现有参数...嗯,当你查询数据库时,有时会用到一些逻辑思维,但写成 EXISTS 的嵌套通常是最直接的实现方式。
你的写作风格很复杂,逻辑上也有问题。
希望这个解释对您有帮助。
无论如何,这取决于你。

SQL查询出有成绩不及格的学生的学号,姓名,课程名。

说实话,在操作数据库的时候,最麻烦的就是表的连接。
你提到的场景非常典型。
一共有三张桌子,一张一张地放在上面。
要检查不及格的学生,您确实需要使用 JOIN。
我之前在为一所高中构建系统时遇到过类似的情况。
当时有一个桌子设计特别蛋疼。
课程编号未存储在 tbStudent 中,但课程编号和学生编号存储在 tbScore 中。
这就直接逼着人们使用ON s.student_id = sc.student_id。

有趣的是,如果直接在 WHERE 子句中使用 sc.score < 6>我有一个朋友以前使用Oracle,并坚持在WHERE 中输入JOIN 条件。
最后,他检查了两个小时的计划。
后来我发现使用 ON sc.course_id = c.course_id AND sc.score < 6>这个事件说明,在写SQL的时候,不能只注重写得正确。
您还需要考虑如何规划数据库。

回到你的SQL,JOIN顺序实际上非常关键。
我习惯先用INNER JOIN连接tbStudent和tbScore,因为我不在乎学生有没有成绩或者成绩没有达标,所以直接过滤。
您编写它的方式是使用 JOIN 两次,但很容易被 ON 背后的许多条件淹没。
一个技巧是为表指定一个别名,例如您使用的 s 和 c,这可以节省大量打字工作。

应该记住一个细节。
如果同一学生选修了多门课程但未能通过 tbScore 记分板,则该学生将仅被列出一次。
如果你想统计每个学生不及格的课程数量,SQL会复杂得多,你需要使用GROUP BY和HAVING。
记得上次遇到这种情况是在做学籍预警系统的时候。
一位老师坚持认为记录是错误的,但后来我发现重复的记录没有被考虑在内。

不要忘记验证数据。
您的示例假设所有表都具有 Student_id 和 course_id 等字段。
最好在实际操作时确认一下。
之前接过一个项目,tbCourse中其实有两个course_id字段:课程号和课程名称。
当时我的头发都快掉光了。
所以在写SQL之前,先看看数据库表结构十分钟,绝对值回票价。

WHERE sc.score < 6>如果结果为NULL怎么办?大多数数据库会自动过滤掉 NULL 值,但最好显式写成 sc.score IS NOT NULL & sc.score < 6>我有一个使用 SQL Server 的客户端,由于这个 NULL 问题,报告中一半的数据是错误的。
我个人没有在这方面运行过SQL Server,但我记得数据在X左右,但我建议你验证一下。

简而言之,对于 JOIN 来说,熟能生巧,这确实是事实。
如果您更频繁地运行这些基本查询,一段时间后您将能够了解数据库的气质。

检索全部学生都选修的课程的课程号和课程名

这个SQL查询的目的是从C表中选出S表中没有出现的记录。

白话:查找C表中S表中没有出现的C个名字。

具体项目:比如某电商平台的C表和S表产品的用户购买记录。

时间:2 02 2 年我讨论过一个类似的项目。

数字:假设表C有1 000条记录,表S有5 00条记录。

我仍然是印度教徒,但我的经验是这样的:这个SQL是通过不存在的三层嵌套来实现的。
首先从表C中选择,然后排除表S中已经存在的,然后排除表SC中已经存在的(到C和S之间的关联表)。

评价一下自己。

SQL:查询每门课程的课程名、选课学生姓名及其学号,选课人数

哇,我明白你写的 SQL 了。
去年我给新生讲数据库的时候,有一个学生问了类似的问题。

您想从课程表、选课表和学生表中提取每门课程的课程号、学生姓名、学号和选课学生人数,对吧?去年我在北京和一个实习生一起,他用这个问题来统计每门课程有多少人报名。

你的写作技巧没有任何问题。
您使用子查询来计算每个班级的人数,然后将其链接到主查询。
也就是说,“课程参与者的数量”应该在 SQL 中命名为“count_num”或类似的名称。
去年有位老师在写SQL时忘记使用别名,纠结了很长时间。

但是,如果您有很多表或大量数据,则此查询可能会有点慢。
一年前,我在上海,连接一所学校数十万学生的数据库。
这种多表关系查询必须要优化,否则就不是开玩笑了。

尝试在该小节中将“number_of_course_enrollments”重命名为“number_of_students”。
然后使用“T.num_students”在主查询中引用它。
去年我编辑了一份学生作业,仅仅因为别名拼写错误,我就花了很长时间编辑。

哦,顺便说一句,您的问题似乎没有提供“课程注册人数”的别名。
必须修改,否则数据库会报错。
去年有一个同学在写SQL,但是因为这个小问题,提交了半天也看不懂错误。

总之,你的逻辑是正确的。
我去年教过的几个学生也问了同样的问题。
注意一些小细节,例如别名等。
去年我就因为这个原因帮助一个学生改了好几次代码。

如果您没有大量数据,则运行速度更快。
如果尺寸较大,可以考虑添加索引或者其他东西。
去年在深圳,我帮助一家公司扩容数据库,通过添加索引,将查询速度从几分钟提高到几秒。
就连我的老板也给了我奖金。
简而言之你这个SQL写得很好,逻辑也正确。
我去年指导的实习生终于获得了这个项目的荣誉。