Mysql中表示,只选了C2课程的学生,除过C2还选了其他课程的学生,没有选C2课程的学生

Mysql中表示

学生表:Student(Sno,Sname,Ssex,Sage,Sdept)
在这里插入图片描述

/*
SQLyog Ultimate v12.08 (64 bit)
MySQL - 5.5.27 
*********************************************************************
*/
/*!40101 SET NAMES utf8 */;

create table `student` (
	`Sno` int (11),
	`Sname` varchar (96),
	`Ssex` varchar (96),
	`Sage` int (11),
	`Sdept` varchar (96)
); 
insert into `student` (`Sno`, `Sname`, `Ssex`, `Sage`, `Sdept`) values('201215121','李勇','男','20','CS');
insert into `student` (`Sno`, `Sname`, `Ssex`, `Sage`, `Sdept`) values('201215122','刘晨','女','19','CS');
insert into `student` (`Sno`, `Sname`, `Ssex`, `Sage`, `Sdept`) values('201215123','王敏','女','18','MA');
insert into `student` (`Sno`, `Sname`, `Ssex`, `Sage`, `Sdept`) values('201215125','张立','男','19','IS');

课程表:Course(Cno,Cname,Cpno,Ccredit)

在这里插入图片描述

/*
SQLyog Ultimate v12.08 (64 bit)
MySQL - 5.5.27 
*********************************************************************
*/
/*!40101 SET NAMES utf8 */;

create table `course` (
	`Cno` int (11),
	`Cname` varchar (96),
	`Cpno` int (11),
	`Ccredit` int (11)
); 
insert into `course` (`Cno`, `Cname`, `Cpno`, `Ccredit`) values('1','数据库','5','4');
insert into `course` (`Cno`, `Cname`, `Cpno`, `Ccredit`) values('2','数学',NULL,'2');
insert into `course` (`Cno`, `Cname`, `Cpno`, `Ccredit`) values('3','信息系统','1','4');
insert into `course` (`Cno`, `Cname`, `Cpno`, `Ccredit`) values('4','操作系统','6','3');
insert into `course` (`Cno`, `Cname`, `Cpno`, `Ccredit`) values('5','数据结构','7','4');
insert into `course` (`Cno`, `Cname`, `Cpno`, `Ccredit`) values('6','数据处理',NULL,'2');
insert into `course` (`Cno`, `Cname`, `Cpno`, `Ccredit`) values('7','PASCAL语言','6','4');

学生选课表:SC(Sno,Cno,Grade)

在这里插入图片描述

/*
SQLyog Ultimate v12.08 (64 bit)
MySQL - 5.5.27 
*********************************************************************
*/
/*!40101 SET NAMES utf8 */;

create table `sc` (
	`Sno` int (11),
	`Cno` int (11),
	`Grade` int (11)
); 
insert into `sc` (`Sno`, `Cno`, `Grade`) values('201215121','1','92');
insert into `sc` (`Sno`, `Cno`, `Grade`) values('201215121','2','85');
insert into `sc` (`Sno`, `Cno`, `Grade`) values('201215121','3','88');
insert into `sc` (`Sno`, `Cno`, `Grade`) values('201215122','2','90');
insert into `sc` (`Sno`, `Cno`, `Grade`) values('201215122','3','80');
insert into `sc` (`Sno`, `Cno`, `Grade`) values('201215123','2','60');
insert into `sc` (`Sno`, `Cno`, `Grade`) values('201215125','1','70');


写出以下操作的SQL语句

分析这三种情况属于整个SC表的全集,

在这里插入图片描述

  • A:只选了C2课程的学生的学号
-- A
SELECT Sno FROM SC WHERE Cno='2' AND Sno NOT IN(SELECT DISTINCT Sno FROM SC WHERE Cno!='2');
SELECT Sno FROM SC WHERE Sno NOT IN (SELECT DISTINCT Sno FROM SC WHERE Cno!='2');
SELECT Sno FROM SC  SC1 WHERE Cno='2' AND 1=(SELECT COUNT(*) FROM SC SC2 WHERE SC1.`Sno`=SC2.`Sno`); 
SELECT Sno FROM SC WHERE Cno='2' AND Sno IN (SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*)=1);
SELECT Sno FROM SC SC1 WHERE Cno='2' AND EXISTS (SELECT * FROM SC SC2 WHERE SC1.`Sno`=SC2.`Sno` GROUP BY Sno HAVING COUNT(*)=1);
  • B:除过C2还选了其他课程的学生学号
-- B
SELECT Sno FROM SC WHERE Cno='2'  AND Sno IN(SELECT DISTINCT Sno FROM SC WHERE Cno!='2');
SELECT Sno FROM SC SC1 WHERE Cno='2' AND EXISTS (SELECT * FROM SC SC2 WHERE SC1.`Sno`=SC2.`Sno` AND Cno!='2');
SELECT Sno FROM SC SC1 WHERE Cno='2' AND 1<(SELECT COUNT(*) FROM SC SC2 GROUP BY Sno HAVING SC1.`Sno`=SC2.`Sno`);
SELECT Sno FROM SC SC1 WHERE Cno='2' AND 1<(SELECT COUNT(*) FROM SC SC2 WHERE SC1.`Sno`=SC2.`Sno` GROUP BY Sno );
SELECT Sno FROM SC SC1 WHERE Cno='2' AND 1<(SELECT COUNT(*) FROM SC SC2 WHERE SC1.`Sno`=SC2.`Sno`);
SELECT Sno FROM SC WHERE Cno='2' AND Sno IN(SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*)>1);
  • C:没有选C2课程的学生学号
-- C
SELECT Sno FROM SC WHERE Cno!='2' AND Sno NOT IN(SELECT  Sno FROM SC WHERE Cno='2');
SELECT Sno FROM SC WHERE Sno NOT IN (SELECT  Sno FROM SC WHERE Cno='2');
SELECT Sno FROM SC SC1 WHERE Cno!='2' AND NOT EXISTS (SELECT * FROM SC SC2 WHERE Cno='2' AND SC1.`Sno`=SC2.`Sno`);

exists关键字用法

代表存在量词,带有exists谓词的子查询不反悔任何数据,只产生逻辑真或逻辑假。

例如:
SELECT Sno FROM SC SC1 WHERE Cno='2' AND EXISTS (SELECT * FROM SC SC2 WHERE SC1.Sno=SC2.Sno AND Cno!='2');

        从SC1表中拿出一行,看里面的Sno在SC2表中符合Cno!=‘2’ and SC1.Sno=SC2.Sno条件下查询出来有无数据,有数据返回TRUE,即此时的Sno符合查询条件,无数据返回FALSE,即此时的Sno不符合查询条件。


谢谢

猜你喜欢

转载自blog.csdn.net/qq_43371004/article/details/89330214
C2