SQL查询选修了全部课程的学生姓名
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL查询选修了全部课程的学生姓名相关的知识,希望对你有一定的参考价值。
查询选修了全部课程的学生姓名
:student 是学生表 course 是选课表 sc 是课程表
select sname
from student
where not exists
(select *
from course
where not exists
(select *
from sc
where sno =student.sno
and cno=course.cno)
select *
from course
where not exists
(select *
from sc
where sno =student.sno
and cno=course.cno)
这一段计算为什么就得出 某学生存在没有选的课程?
分析原因如下:
第一问:两个NOT EXISTS表示双重否定:没有一个选了课的学生没有选course表里的课程
select sname from student where not exists /*没有一个学生满足以下条件*/
(select * from course where not exists /*什么条件呢?没有选过Course表里的课*/
(select * from sc where sno =student.sno /*这里两个=分别指对应的关系,表示选
过课并且是Course里and cno=course.cno) 的课,只不过用not exists否定掉了*/
第二问:其实和NOT IN 是一个意思 exists只返回true 或false 这里not exists里的内容 其实就 是指学生选过的课程,再用NOT EXISTS否定了,就变成了没有选
参考技术A 第一问:两个NOT EXISTS表示双重否定:没有一个选了课的学生没有选course表里的课程select sname
from student
where not exists /*没有一个学生满足以下条件*/
(select * from course
where not exists /*什么条件呢?没有选过Course表里的课*/
(select * from sc
where sno =student.sno /*这里两个=分别指对应的关系,表示选过课并且是Course里and cno=course.cno) 的课,只不过用not exists否定掉了*/
第二问:其实和NOT IN 是一个意思 exists只返回true 或false 这里not exists里的内容 其实就是指学生选过的课程,再用NOT EXISTS否定了,就变成了没有选的本回答被提问者和网友采纳 参考技术B exists 是类似于in 效率比in 好的多
not exists 类似于 not in 效率一样比not in 一样好的多
再来看这个sql语句,应该明白了吧
数据库查询语句
假设学生选课数据库关系模式如下, 请写出下面数据库查询语句
Student (SNo, SName,SSex, SClass);学生表:学号,学生姓名,性别,班级
Course (CNo, CName); 课程表:课程编号,课程名称
StudentCourse SC (SNo,CNo, Score) 成绩表: 学号,课程编号,成绩
1) 查询学生总人数
2) 查询选修了课程的学生人数
3) 计算1号课程的学生平均成绩
4) 查询选修了3门以上课程的学生的学号
5) 从学生选课数据库中查询选修“数据库原理”课并且成绩在90分以上的学生名单
数据库查询语句需要根据不同的需求进行编写。(以MySQL数据库查询为例)
1、如果需要查询某个数据表的所有字段,则使用 * 代表所有字段进行查询即可。该种方式是最简单的一种查询。
2、若需要查询某表的某些字段,则在select后加上字段名,多个字段名使用 , 进行分隔。
3、若需要根据指定条件查询某些数据记录,则可以使用 where关键字来进行条件查询。
4、若需要对查询结果进行分组,则可以使用 Group By 关键字来进行分组查询。
在使用 Laravel 的时候,很多时候我们想知道背后执行的数据库查询语句是什么。
这个其实可以有一个很简单的方法:
在 app\\Providers\\AppServiceProvider 里面:
public function boot() if ( $this->app->environment() === 'local' ) \\Log::info(\\DB::getQueryLog());
如果没有效果的话,记得在代码前面执行 DB::enableQueryLog()。在使用 tinker 的情况下也是可以的:
⚡ php artisan tinkerPsy Shell v0.7.0 (PHP 7.0.4-7+deb.sury.org~wily+2 — cli) by Justin Hileman>>> DB::enableQueryLog(); => null>>> App\\User::all();=> Illuminate\\Database\\Eloquent\\Collection #771 all: [ App\\User #777 ... , App\\User #778 ... , ... ], >>> DB::getQueryLog();=> [ [ "query" => "select * from "users"", "bindings" => [], "time" => 0.32, ], ]
主要在 tinker 最开始的时候执行 DB::enableQueryLog() ,然后你执行完数据库查询后,就可以使用 DB::getQueryLog() 查看了
参考技术B (我不太清楚你说的课程号是指CNO还是CNAME,我这里假定你说的课程号为CNO,以下语句均未考虑字段数值类型)1、SELECT A1.SNO,A1.SNAME,A2.GRADE FROM S A1,SC A2 WHERE A1.SNO = A2.SNO AND A2.CNO = C2 AND A2.GRADE BETWEEN 80 AND 90
2、不太懂
3、SELECT A1.SNO FROM SC A1,SC A2 WHERE A1.SNO = A2.SNO AND A1.CNO = C2 AND
A2.CNO = C4 GROUP BY A1.SNO
4、SELECT A1.SNO FROM SC A1 WHERE A1.CNO = C1 AND A1.SNO NOT IN (SELECT SNO FROM SC WHERE CNO = C2)
5、SELECT A1.SNO,A1.SNAME,A1.AGE FROM S A1,SC A2 WHERE A1.SNO = A2.SNO AND A2.CNO NOT IN(C1,C2)
6、SELECT SNO,SNAME FROM S WHERE SNO NOT IN(
SELECT SNO FROM SC WHERE GRADE <= 80 ) GROUP BY SNO
7、 参考技术C 1) 查询学生总人数
SELECT COUNT(SNo) FROM Student
2) 查询选修了课程的学生人数
SELECT COUNT(DISTINCT SNo) FROM SC
3) 计算1号课程的学生平均成绩
SELECT AVG(Score) FROM SC WHERE CNo = 1
4) 查询选修了3门以上课程的学生的学号
SELECT SNo
FROM SC
GROUP BY SNo
HAVING COUNT(CNo) > 3
5) 从学生选课数据库中查询选修“”课并且成绩在90分以上的学生名单
SELECT SName
FROM SC
WHERE CNo = (SELECT CNo FROM Course WHERE CName = '数据库原理')
AND Score > 90本回答被提问者采纳 参考技术D --查询学生总人数
select count(*)
from Student
--查询选修了课程的学生人数
select count(distinct SNo)
from SC
--计算1号课程的学生平均成绩
select avg(Score) 1号课程平均成绩
from sc
where CNo = '1'
--查询选修了3门以上课程的学生的学号
select SNo
from SC
group by SNo having count(CNo) >3
--从学生选课数据库中查询选修“数据库原理”课并且成绩在90分以上的学生名单
select S.SNo,S.SName
from Student S join SC on S.SNo = SC.SNo join Course C on C.CNo = SC.CNo
where C.CName = '数据库原理' and SC.Score > 90
以上是关于SQL查询选修了全部课程的学生姓名的主要内容,如果未能解决你的问题,请参考以下文章