MySQL练习题

Posted 敏而好学,不耻下问。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL练习题相关的知识,希望对你有一定的参考价值。

  一、表关系

  二、操作表

1、自行创建测试数据;

/*
 Navicat Premium Data Transfer

 Source Server         : localhost
 Source Server Type    : mysql
 Source Server Version : 50624
 Source Host           : localhost
 Source Database       : sqlexam

 Target Server Type    : MySQL
 Target Server Version : 50624
 File Encoding         : utf-8

 Date: 10/21/2016 06:46:46 AM
*/

SET NAMES utf8;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
--  Table structure for `class`
-- ----------------------------
DROP TABLE IF EXISTS `class`;
CREATE TABLE `class` (
  `cid` int(11) NOT NULL AUTO_INCREMENT,
  `caption` varchar(32) NOT NULL,
  PRIMARY KEY (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

-- ----------------------------
--  Records of `class`
-- ----------------------------
BEGIN;
INSERT INTO `class` VALUES (\'1\', \'三年二班\'), (\'2\', \'三年三班\'), (\'3\', \'一年二班\'), (\'4\', \'二年九班\');
COMMIT;

-- ----------------------------
--  Table structure for `course`
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
  `cid` int(11) NOT NULL AUTO_INCREMENT,
  `cname` varchar(32) NOT NULL,
  `teacher_id` int(11) NOT NULL,
  PRIMARY KEY (`cid`),
  KEY `fk_course_teacher` (`teacher_id`),
  CONSTRAINT `fk_course_teacher` FOREIGN KEY (`teacher_id`) REFERENCES `teacher` (`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

-- ----------------------------
--  Records of `course`
-- ----------------------------
BEGIN;
INSERT INTO `course` VALUES (\'1\', \'生物\', \'1\'), (\'2\', \'物理\', \'2\'), (\'3\', \'体育\', \'3\'), (\'4\', \'美术\', \'2\');
COMMIT;

-- ----------------------------
--  Table structure for `score`
-- ----------------------------
DROP TABLE IF EXISTS `score`;
CREATE TABLE `score` (
  `sid` int(11) NOT NULL AUTO_INCREMENT,
  `student_id` int(11) NOT NULL,
  `course_id` int(11) NOT NULL,
  `num` int(11) NOT NULL,
  PRIMARY KEY (`sid`),
  KEY `fk_score_student` (`student_id`),
  KEY `fk_score_course` (`course_id`),
  CONSTRAINT `fk_score_course` FOREIGN KEY (`course_id`) REFERENCES `course` (`cid`),
  CONSTRAINT `fk_score_student` FOREIGN KEY (`student_id`) REFERENCES `student` (`sid`)
) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=utf8;

-- ----------------------------
--  Records of `score`
-- ----------------------------
BEGIN;
INSERT INTO `score` VALUES (\'1\', \'1\', \'1\', \'10\'), (\'2\', \'1\', \'2\', \'9\'), (\'5\', \'1\', \'4\', \'66\'), (\'6\', \'2\', \'1\', \'8\'), (\'8\', \'2\', \'3\', \'68\'), (\'9\', \'2\', \'4\', \'99\'), (\'10\', \'3\', \'1\', \'77\'), (\'11\', \'3\', \'2\', \'66\'), (\'12\', \'3\', \'3\', \'87\'), (\'13\', \'3\', \'4\', \'99\'), (\'14\', \'4\', \'1\', \'79\'), (\'15\', \'4\', \'2\', \'11\'), (\'16\', \'4\', \'3\', \'67\'), (\'17\', \'4\', \'4\', \'100\'), (\'18\', \'5\', \'1\', \'79\'), (\'19\', \'5\', \'2\', \'11\'), (\'20\', \'5\', \'3\', \'67\'), (\'21\', \'5\', \'4\', \'100\'), (\'22\', \'6\', \'1\', \'9\'), (\'23\', \'6\', \'2\', \'100\'), (\'24\', \'6\', \'3\', \'67\'), (\'25\', \'6\', \'4\', \'100\'), (\'26\', \'7\', \'1\', \'9\'), (\'27\', \'7\', \'2\', \'100\'), (\'28\', \'7\', \'3\', \'67\'), (\'29\', \'7\', \'4\', \'88\'), (\'30\', \'8\', \'1\', \'9\'), (\'31\', \'8\', \'2\', \'100\'), (\'32\', \'8\', \'3\', \'67\'), (\'33\', \'8\', \'4\', \'88\'), (\'34\', \'9\', \'1\', \'91\'), (\'35\', \'9\', \'2\', \'88\'), (\'36\', \'9\', \'3\', \'67\'), (\'37\', \'9\', \'4\', \'22\'), (\'38\', \'10\', \'1\', \'90\'), (\'39\', \'10\', \'2\', \'77\'), (\'40\', \'10\', \'3\', \'43\'), (\'41\', \'10\', \'4\', \'87\'), (\'42\', \'11\', \'1\', \'90\'), (\'43\', \'11\', \'2\', \'77\'), (\'44\', \'11\', \'3\', \'43\'), (\'45\', \'11\', \'4\', \'87\'), (\'46\', \'12\', \'1\', \'90\'), (\'47\', \'12\', \'2\', \'77\'), (\'48\', \'12\', \'3\', \'43\'), (\'49\', \'12\', \'4\', \'87\'), (\'52\', \'13\', \'3\', \'87\');
COMMIT;

-- ----------------------------
--  Table structure for `student`
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `sid` int(11) NOT NULL AUTO_INCREMENT,
  `gender` char(1) NOT NULL,
  `class_id` int(11) NOT NULL,
  `sname` varchar(32) NOT NULL,
  PRIMARY KEY (`sid`),
  KEY `fk_class` (`class_id`),
  CONSTRAINT `fk_class` FOREIGN KEY (`class_id`) REFERENCES `class` (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;

-- ----------------------------
--  Records of `student`
-- ----------------------------
BEGIN;
INSERT INTO `student` VALUES (\'1\', \'\', \'1\', \'理解\'), (\'2\', \'\', \'1\', \'钢蛋\'), (\'3\', \'\', \'1\', \'张三\'), (\'4\', \'\', \'1\', \'张一\'), (\'5\', \'\', \'1\', \'张二\'), (\'6\', \'\', \'1\', \'张四\'), (\'7\', \'\', \'2\', \'铁锤\'), (\'8\', \'\', \'2\', \'李三\'), (\'9\', \'\', \'2\', \'李一\'), (\'10\', \'\', \'2\', \'李二\'), (\'11\', \'\', \'2\', \'李四\'), (\'12\', \'\', \'3\', \'如花\'), (\'13\', \'\', \'3\', \'刘三\'), (\'14\', \'\', \'3\', \'刘一\'), (\'15\', \'\', \'3\', \'刘二\'), (\'16\', \'\', \'3\', \'刘四\');
COMMIT;

-- ----------------------------
--  Table structure for `teacher`
-- ----------------------------
DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher` (
  `tid` int(11) NOT NULL AUTO_INCREMENT,
  `tname` varchar(32) NOT NULL,
  PRIMARY KEY (`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

-- ----------------------------
--  Records of `teacher`
-- ----------------------------
BEGIN;
INSERT INTO `teacher` VALUES (\'1\', \'张磊老师\'), (\'2\', \'李平老师\'), (\'3\', \'刘海燕老师\'), (\'4\', \'朱云海老师\'), (\'5\', \'李杰老师\');
COMMIT;

SET FOREIGN_KEY_CHECKS = 1;
表结构和数据

2、查询“生物”课程比“物理”课程成绩高的所有学生的学号;

select A.student_id from 
(select num,student_id from score left join course on course.cid=score.course_id 
where course.cname=\'生物\')as A
inner join
(select num,student_id from score left join course on course.cid=score.course_id 
where course.cname=\'物理\')as B
on A.student_id=B.student_id
where A.num>B.num

  

3、查询平均成绩大于60分的同学的学号、姓名和平均成绩;

select student_id,student.sname,avg(num) from score 
left join student on student.sid=score.student_id 
group by student_id having avg(num)>60

  

4、查询所有同学的学号、姓名、选课数、总成绩;

select student_id as 学号,student.sname as 姓名,count(1)as 选课数,sum(if(isnull(num),0,num))as 总成绩 from score 
left join student on student.sid=score.student_id group by student_id

  

5、查询姓“李”的老师的个数;

select count(1) from teacher where tname like \'李%\'

  

6、查询没学过“李平”老师课的同学的学号、姓名;

select student.sid,student.sname from student
where student.sid not in 
(
select student_id from score where course_id in
(select cid from course left join teacher on teacher.tid=course.teacher_id
where teacher.tname=\'李平老师\')
)

  

7、查询学过“001”并且也学过编号“003”课程的同学的学号、姓名;

方法一:
select student_id,student.sname from score left join student on student.sid=score.student_id
where student_id in 
(select student_id from score where course_id=1)
and 
student_id in 
(select student_id from score where course_id=3)
group by student_id

方法二:
SELECT student_id,student.sname FROM
	(SELECT score.student_id FROM score WHERE course_id = 1 OR course_id = 3) AS A
LEFT JOIN student ON A.student_id = student.sid
GROUP BY student_id
HAVING count(student_id) > 1

  

8、查询学过“叶平”老师所教的所有课的同学的学号、姓名;

select student_id,student.sname from score left join student on student.sid=score.student_id
where course_id in
(
select cid from course left join teacher on teacher.tid=course.teacher_id 
where teacher.tname=\'李平老师\'
) group by student_id having count(1)=(select count(1) from course left join teacher on teacher.tid=course.teacher_id 
where teacher.tname=\'李平老师\')

  

9、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名;

方法一:
select student_id,student.sname from score left join student on student.sid=score.student_id
where student_id in
(
select A.student_id from
(select num,student_id from score where course_id=2) as A
inner join 
(select num,student_id from score where course_id=1)as B
on A.student_id=B.student_id
where A.num<B.num
)group by student_id

方法二:
select student.sid,student.sname from
(
	select A.student_id from
		(select score.student_id,score.num from score where course_id = 2)as A
		inner join 
		(select score.student_id,score.num from score where course_id = 1)as B 
		on A.student_id = B.student_id
		where A.num < B.num
)as C
	left join student on C.student_id = student.sid

  

10、查询有课程成绩小于60分的同学的学号、姓名;

select student_id,student.sname from score left join student on 
score.student_id=student.sid where num<60 GROUP BY student_id

  

11、查询没有学全所有课的同学的学号、姓名;

方法一:
select student_id,student.sname from score left join student on student.sid=score.student_id
where student_id in 
(
select student_id from score where course_id in
(select cid from course)
)group by student_id having count(1)<(select count(1) from course)

方法二:
select student.sid,student.sname from
(select score.student_id from score where score.course_id in 
(select course.cid from course ) GROUP BY score.student_id HAVING count(score.student_id)<4
)as A
LEFT JOIN student on student.sid= A.student_id

  

12、查询

以上是关于MySQL练习题的主要内容,如果未能解决你的问题,请参考以下文章

部分代码片段

linux中怎么查看mysql数据库版本

csharp Epicor标准练习片段

golang 去练习片段

从mysql的片段中加载ListView

连接MySQL出现错误:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)(代码片段