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 关键字来进行分组查询。

参考技术A

在使用 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查询选修了全部课程的学生姓名的主要内容,如果未能解决你的问题,请参考以下文章

SQL中,查询学生姓名及所选修的课程名和成绩

在SQL中,如何查询至少选修了两门课程的学生学号呢?

写一个SQL语句,查询选修了5门课程的学生学号和姓名

练习一:对学生—课程数据库进行以下查询,按要求写出关系代数和SQL语句. 1. 查询全体学生的学号和姓名. .

写一个SQL语句,查询选修了5门课程的学生学号和姓名

写一条SQL语句,查询选修了所有课程的学号。