moris5013

查询选修语文(cno=21)的学生名单

SELECT sname  FROM student  WHERE  EXISTS ( SELECT 1 FROM  sc  WHERE sc.cno = 21 AND  sc.sno  =  student.sno )

 

查询没有选修语文(cno=21)的学生名单

 

SELECT sname  FROM student  WHERE NOT EXISTS ( SELECT 1 FROM  sc  WHERE sc.cno = 21 AND  sc.sno  =  student.sno )

 

选修全部课程的学生名单  (子查询)

SELECT sname  FROM student  WHERE sno  in  (

SELECT sc.sno  FROM  sc   GROUP BY  sc.sno  HAVING  count(1) =  (SELECT count(1) from course)

)

 

选修全部课程的学生名单 (exists)

select * from student t where not exists 
( select * from course s where not exists 
      (select * from sc where t.sno=sc.sno and s.cno= sc.cno   )
)

 当有课程没有选修时,下面的查询有返回的记录数。当全部课程都选择时,返回空

( select * from course s where not exists
      (select * from sc where t.sno=sc.sno and s.cno= sc.cno )
)

 

数据库表结构

--课程表
CREATE TABLE `course` (
  `cno` int(11) NOT NULL DEFAULT \'0\',
  `cname` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`cno`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;

INSERT INTO `course` VALUES (\'20\', \'数学\');
INSERT INTO `course` VALUES (\'21\', \'语文\');
INSERT INTO `course` VALUES (\'22\', \'外语\');

--课程学生表
CREATE TABLE `sc` (
  `sno` int(11) NOT NULL DEFAULT \'0\',
  `cno` int(11) NOT NULL DEFAULT \'0\',
  PRIMARY KEY (`sno`,`cno`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;

INSERT INTO `sc` VALUES (\'10\', \'20\');
INSERT INTO `sc` VALUES (\'10\', \'21\');
INSERT INTO `sc` VALUES (\'11\', \'20\');
INSERT INTO `sc` VALUES (\'11\', \'21\');
INSERT INTO `sc` VALUES (\'11\', \'22\');
INSERT INTO `sc` VALUES (\'12\', \'22\');

--学生表
CREATE TABLE `student` (
  `sno` int(11) NOT NULL DEFAULT \'0\',
  `sname` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`sno`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;

INSERT INTO `student` VALUES (\'10\', \'zhangsan\');
INSERT INTO `student` VALUES (\'11\', \'lisi\');
INSERT INTO `student` VALUES (\'12\', \'wangwu\');

 

分类:

技术点:

相关文章: