第九章 MySQL中LIMIT和NOT IN案例
第九章 MySQL中LIMIT和NOT IN案例
一.案例的项目
1.创建数据库语句:
#创建数据库
CREATE DATABASE `schoolDB`;
USE `schoolDB`;
#创建学生表
CREATE TABLE `student`(
`sid` INT(4) AUTO_INCREMENT NOT NULL PRIMARY KEY COMMENT'学生编号',
`stuName` VARCHAR(10) NOT NULL COMMENT'学生姓名',
`age` INT(4) NOT NULL COMMENT'年龄',
`sex` INT(1) NOT NULL COMMENT'学生性别'
)ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='学生信息表';
#创建课程表
CREATE TABLE `course`(
`cid` INT(4) PRIMARY KEY COMMENT'课程编号',
`cName` VARCHAR(50) NOT NULL COMMENT'课程名称',
`tid` INT(4) NOT NULL COMMENT'教师编号'
)ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='课程信息表';
#创建成绩表
CREATE TABLE `score`(
`sid` INT(4) COMMENT'学生编号',
`cid` INT(4) COMMENT'课程便号',
`score` INT(4) NOT NULL COMMENT'成绩'
)ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='成绩表';
#创建教师 表
CREATE TABLE `teacher`(
`tid` INT(4) PRIMARY KEY COMMENT'教师编号',
`teaName` VARCHAR(50) NOT NULL COMMENT'教师姓名'
)ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='教师信息表';
#创建`score表`主键
ALTER TABLE `score` ADD CONSTRAINT `pk_score` PRIMARY KEY `score`(`sid`,`cid`);
#创建课程表外键外键关联 教师表 教师编号
ALTER TABLE `course` ADD CONSTRAINT `fk_course_teacher` FOREIGN KEY (`tid`) REFERENCES `teacher`(`tid`);
#创建成绩表外键关联 学生表 学生编号
ALTER TABLE `score` ADD CONSTRAINT `fk_score_student` FOREIGN KEY (`sid`) REFERENCES `student`(`sid`);
#创建成绩表外键关联 课程表 课程编号
ALTER TABLE `score` ADD CONSTRAINT `fk_score_course` FOREIGN KEY (`cid`) REFERENCES `course`(`cid`);
#插入学生表 数据
INSERT INTO `student` VALUES(1,'张三',16,1);
INSERT INTO `student` VALUES(2,'李三思',17,1);
INSERT INTO `student` VALUES(3,'李大齐',16,1);
INSERT INTO `student` VALUES(4,'王晓花',16,0);
INSERT INTO `student` VALUES(5,'刘得住',17,1);
INSERT INTO `student` VALUES(6,'谢谢你',16,1);
INSERT INTO `student` VALUES(7,'吴三桂',16,1);
INSERT INTO `student` VALUES(8,'桂花',16,0);
#插入教师表 数据
INSERT INTO `teacher` VALUES(101,'朱大胖');
INSERT INTO `teacher` VALUES(102,'方芳');
INSERT INTO `teacher` VALUES(103,'刘博士');
#插入课程表 数据
INSERT INTO `course` VALUES(1011,'语文',101);
INSERT INTO `course` VALUES(1012,'英语',102);
INSERT INTO `course` VALUES(1013,'数学',103);
#插入成绩表 数据
INSERT INTO `score` VALUES(1,1011,90);
INSERT INTO `score` VALUES(1,1012,70);
INSERT INTO `score` VALUES(1,1013,60);
INSERT INTO `score` VALUES(2,1011,88);
INSERT INTO `score` VALUES(2,1012,70);
INSERT INTO `score` VALUES(2,1013,70);
INSERT INTO `score` VALUES(3,1011,92);
INSERT INTO `score` VALUES(3,1012,71);
INSERT INTO `score` VALUES(3,1013,65);
INSERT INTO `score` VALUES(4,1011,99);
INSERT INTO `score` VALUES(4,1012,78);
INSERT INTO `score` VALUES(4,1013,88);
INSERT INTO `score` VALUES(5,1011,87);
INSERT INTO `score` VALUES(5,1012,79);
INSERT INTO `score` VALUES(5,1013,62);
INSERT INTO `score` VALUES(6,1011,56);
INSERT INTO `score` VALUES(6,1012,65);
INSERT INTO `score` VALUES(6,1013,75);
INSERT INTO `score` VALUES(7,1011,50);
INSERT INTO `score` VALUES(7,1012,55);
INSERT INTO `score` VALUES(7,1013,51);
INSERT INTO `score` VALUES(8,1011,95);
INSERT INTO `score` VALUES(8,1012,59);
INSERT INTO `score` VALUES(8,1013,64);
2.执行SQL查询
USE `schooldb`;
/*1.查询学过“方芳”老师所教课程的学生的学号、姓名。(假定学生所学的课程均参加了考试)。*/
#测试通过
SELECT `sid`,`stuName` FROM `student` WHERE `sid` IN(
SELECT `sid` FROM `score` WHERE `cid`=(
SELECT `cid` FROM `course` WHERE `tid`=(
SELECT `tid` FROM `teacher` WHERE `teaName`='方芳'
)
)
);
3.NOT IN取反的经典应用
/*2.查询所有课程成绩均小于60分的学生学号和姓名。*/
#改一下数据才有符合要求的数据
UPDATE `score` SET `score`=50 WHERE `sid`=7 AND `cid`=1013;
SELECT `sid`,`stuName` FROM `student` WHERE `sid` NOT IN(
SELECT `sid` FROM `score`
WHERE `score`>60
);
/*难点:步骤分析:
1.查询所有分数大于60的学生编号
2.取反,不在所有大于60分的里面的学生,就是所有成绩小于60的学生
*/
4.LIMIT不支持子查询的解决方法
/*3.查询“方芳”老师所教的“数据库”课程成绩排名在第3~6名的学生学号、姓名,
并将此记录插入新表tempScore中。(要求使用limit子句)*/
CREATE TABLE `tempScore`(
SELECT `sid`,`stuName` FROM `student` WHERE `sid` IN(
#查询方芳老师所教课程第3-6名学员的编号
SELECT `sid` FROM(
SELECT `sid` FROM `score` WHERE `cid` IN(
SELECT `cid` FROM `course` WHERE `tid`=(
SELECT `tid` FROM `teacher` WHERE `teaName`='方芳'
)
)GROUP BY `score` DESC LIMIT 2,4
)AS ta
)
);
/*难点:问题出现在mysql不支持在子查询中使用limit报错:This version of MySQL doesn’t yet support ‘LIMIT & IN/ALL/ANY/SOME subquery
解决的方法是:在limit子句外面加上一层查询"SELECT `sid` FROM()
并且给from的结果集取上别名,就不会报错
*/
4.HAVING进行分组的应用
/*4.查询有两门以上课程不及格的学生学号及其平均成绩。*/
SELECT s.sid, AVG(sc.score)
FROM `student` AS s, `score` AS sc
WHERE s.sid IN
(
SELECT `sid` FROM `score`
WHERE `score` < 60
GROUP BY `sid`
HAVING COUNT(`cid`)>= 2
)
AND s.sid=sc.sid
GROUP BY s.sid
/*用到了having 分组*/
5.创建视图
/*5.创建视图student_view,用于查询所有学生的学号、姓名、参加考试课程数、各科总成绩。*/
CREATE VIEW `student_view`
AS
SELECT s.sid,s.stuName,COUNT(c.cid),SUM(sc.score) FROM `student`AS s
INNER JOIN `score` AS sc ON sc.sid=s.sid
INNER JOIN `course` AS c ON c.cid = sc.cid
GROUP BY s.sid;
第九章 MySQL中LIMIT和NOT IN案例的更多相关文章
- mysql中limit与in不能同时使用的解决方式.
mysql中limit与in不能同时使用的解决方式. 分类: MySQL2011-10-31 13:53 1277人阅读 评论(0) 收藏 举报 mysqlsubquery MySQL5.1中子查询是 ...
- mysql中limit的用法实例解析
mysql中limit的用法解析. 在mysql中,select * from table limit m,n.其中m是指记录开始的index,从0开始,n是指从第m条开始,取n条. 例如: mysq ...
- oracle数据库不支持mysql中limit功能
oracle数据库不支持mysql中limit功能,但可以通过rownum来限制返回的结果集的行数,rownum并不是用户添加的字段,而是oracle系统自动添加的. (1)使查询结果最多返回前10行 ...
- (转载)mysql中limit用法
(转载)http://hi.baidu.com/sppeivan/item/e45179375d6778c62f8ec221 mysql中limit用法 使用查询语句的时候,经常要返回前几条或者中 ...
- Mysql中limit的用法详解
Mysql中limit的用法详解 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,为我们提供了limit这样一个功能. SELECT * FROM table LIMIT [offset ...
- mysql中limit用法误区
之前一直用oracle,在分页的时候用rownumber,转换到mysql上之后,用limit做分页: 在做某个业务的时候,需要先将数据排序,再分页,在给limit上参数的时候沿用了oracle的ro ...
- MYSQL 中 LIMIT 用法
mapper文件中的sql: ------------------------------------------------------------------------------------- ...
- 【开发笔记】- MySQL中limit查询超级慢,怎么办?
有如下解决方法: (1).通过判断id的范围来分页 limit ; 也得到了分页的数据,但是我们发现如果id不是顺序的,也就是如果有数据删除过的话,那么这样分页数据就会不正确,这个是有缺陷的. (2) ...
- MySQL 中LIMIT的使用详解
在使用数据库过程中,常会遇到查询或者导出某个数据表或者查询集的前几条或者后几条记录,LIMIT可以很好的满足需求. LIMIT基本语法: 如果只给定一个参数,表示记录数. mysql; ) 相当于 m ...
随机推荐
- .net core的在初始化数据的拦截处理
本人初接触 .net core 如有不对的地方,请大家随时指正,共同学习. 首先说明,此案例是基于.net core1.0版本的,对于2.0好多的功能已经升级,例如:一些常用的dll已经在框架中存在, ...
- 201521123028 《java程序设计》 第7周学习总结
1. 本周学习总结 2. 书面作业 Q1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 Ans: ArrayList的contains源代码 contain源代码 ...
- 201521123008《Java程序设计》第六周实验总结
1.本周学习总结 2.书面作业 1.clone方法 1.1 Object对象中的clone方法是被protected修饰,在自定义的类中覆盖clone方法时需要注意什么? 因为被protected修饰 ...
- 201521123013 《Java程序设计》第14周学习总结
1. 本周学习总结 2. 书面作业 Q1. MySQL数据库基本操作 1.1 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自己的学号.姓名) 1.2 在自己建立的数据库上执行常见SQ ...
- 201521123062《Java程序设计》第12周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...
- 201521123122 《java程序设计》第十三周学习总结
## 201521123122 <java程序设计>第十三周实验总结 ## 1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1 ...
- 201521123087《Java程序设计》第14周学习总结
1. 本周学习总结 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自己的学号.姓名)在自己建立的数据库上执行常见SQL语句(截图)-参考 ...
- 在腾讯云上搭建WordPress博客
笔者一直很羡慕那些搭建了个人博客的大牛,在最近工作之余也尝试着搭建了自己的博客,历时1周,这篇文章就将踩过的坑记录下来,先看下成果,链接在此 1- 购买腾讯云主机 腾讯云官网,我选了79元/月的最便宜 ...
- jquery-easyUI第一篇【介绍、入门、使用常用的组件】
什么是easyUI 我们可以看官方对easyUI的介绍: easyUI就是一个在Jquery的基础上封装了一些组件-.我们在编写页面的时候,就可以直接使用这些组件-非常方便-easyUI多用于在后台的 ...
- 在java中使用MongoDB数据库
Java 安装 要想在 Java 程序中使用 MongoDB,需要先确定是否安装了 MongoDB JDBC 驱动,并且要在机器上安装了 Java.查看 Java 教程来确保在机器上安装好 Java. ...