SQL实战50例:MySQL查询语句练习
一、学生-课程数据库中包括三个表:
1,学生表Student由学号(Sno)、姓名(Sname)、性别(Ssex)、年龄(Sage)、所在系(Sdept)五个属性所组成,可记为
Student(Sno,Sname,Ssex,Sage,Sdept) ,Sno为主码。
课程表Course由课程号(Cno)、课程名、先修课号、学分4个属性组成,可记为:
Course(Cno,Cname,Cpno,Ccredit),Cno为主码。
学生选课表SC由学号(sno)、课程号(Cno)、成绩(Grade)3个属性组成、可记为
SC(Sno,Cno,Grade) ,其中(Sno,Cno)为主码
下面是创建这三个表及注入数据的SQL:
Student:
/*
Navicat MySQL Data Transfer
Source Server : aaa
Source Server Version : 80012
Source Host : localhost:3306
Source Database : kaoyan
Target Server Type : MYSQL
Target Server Version : 80012
File Encoding : 65001
Date: 2020-02-17 12:17:07
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`Sno` int(10) unsigned NOT NULL AUTO_INCREMENT,
`Sname` varchar(15) DEFAULT NULL,
`Ssex` varchar(5) DEFAULT NULL,
`Sdept` varchar(6) DEFAULT NULL,
`Sage` int(11) DEFAULT NULL,
PRIMARY KEY (`Sno`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES ('1', 'hxz', '男', '软件工程', '24');
INSERT INTO `student` VALUES ('2', 'xy', '男', '计算机', '21');
INSERT INTO `student` VALUES ('3', 'cyy', '男', '体育', '13');
INSERT INTO `student` VALUES ('4', 'swt', '男', '数字媒体', '5');
INSERT INTO `student` VALUES ('5', 'lwz', '男', '煤炭专业', '30');
INSERT INTO `student` VALUES ('6', 'tjx', '男', '软件工程', '19');
INSERT INTO `student` VALUES ('7', 'zy', '女', '软件工程', '23');
INSERT INTO `student` VALUES ('8', 'xr', '女', '移动互联', '25');
INSERT INTO `student` VALUES ('9', 'gx', '女', '移动互联', '25');
课程表:
/*
Navicat MySQL Data Transfer
Source Server : aaa
Source Server Version : 80012
Source Host : localhost:3306
Source Database : kaoyan
Target Server Type : MYSQL
Target Server Version : 80012
File Encoding : 65001
Date: 2020-02-17 12:13:14
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for course
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (
`Cno` int(10) unsigned NOT NULL AUTO_INCREMENT,
`Cname` varchar(10) DEFAULT NULL,
`Cpno` int(11) DEFAULT NULL,
`Ccredit` int(11) DEFAULT NULL,
PRIMARY KEY (`Cno`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of course
-- ----------------------------
INSERT INTO `course` VALUES ('1', '软件工程导论', '10', '5');
INSERT INTO `course` VALUES ('2', '高数1', '0', '5');
INSERT INTO `course` VALUES ('3', '高数2', '2', '5');
INSERT INTO `course` VALUES ('4', '体育', '9', '3');
INSERT INTO `course` VALUES ('5', '羽毛球', '8', '2');
INSERT INTO `course` VALUES ('6', '足球', '7', '2');
INSERT INTO `course` VALUES ('7', '经济学', '6', '2');
INSERT INTO `course` VALUES ('8', '心理学', '5', '1');
学生选课:
/*
Navicat MySQL Data Transfer
Source Server : aaa
Source Server Version : 80012
Source Host : localhost:3306
Source Database : kaoyan
Target Server Type : MYSQL
Target Server Version : 80012
File Encoding : 65001
Date: 2020-02-17 12:13:51
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for sc
-- ----------------------------
DROP TABLE IF EXISTS `sc`;
CREATE TABLE `sc` (
`Sno` int(10) unsigned NOT NULL,
`Cno` int(10) unsigned NOT NULL,
`Grade` int(11) NOT NULL,
PRIMARY KEY (`Sno`,`Cno`),
KEY `Cno` (`Cno`),
CONSTRAINT `sc_ibfk_1` FOREIGN KEY (`Sno`) REFERENCES `student` (`sno`),
CONSTRAINT `sc_ibfk_2` FOREIGN KEY (`Cno`) REFERENCES `course` (`cno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-- ----------------------------
-- Records of sc
-- ----------------------------
INSERT INTO `sc` VALUES ('1', '1', '90');
INSERT INTO `sc` VALUES ('1', '2', '80');
INSERT INTO `sc` VALUES ('1', '3', '60');
INSERT INTO `sc` VALUES ('1', '4', '60');
INSERT INTO `sc` VALUES ('1', '5', '60');
INSERT INTO `sc` VALUES ('1', '6', '50');
INSERT INTO `sc` VALUES ('1', '7', '60');
INSERT INTO `sc` VALUES ('1', '8', '30');
INSERT INTO `sc` VALUES ('2', '8', '50');
INSERT INTO `sc` VALUES ('3', '7', '50');
INSERT INTO `sc` VALUES ('4', '6', '50');
INSERT INTO `sc` VALUES ('5', '5', '75');
INSERT INTO `sc` VALUES ('6', '4', '95');
INSERT INTO `sc` VALUES ('7', '5', '90');
INSERT INTO `sc` VALUES ('8', '2', '78');
INSERT INTO `sc` VALUES ('8', '3', '90');
INSERT INTO `sc` VALUES ('9', '1', '66');
建表完成后开始练习:
例1 查询全体学生的学号和姓名。
例2 查询全体学生的姓名、学号、所在系。
例3 查询全体学生的详细记录。
例4 查询全体学生的姓名及其出生年份。
例5 查询全体学生的姓名、出生年份、和所在系。
例6 查询所有选修过课的学生的学号。
例7 查询计算机系全体学生的名单。
例8 查所有年龄在20岁以下的学生姓名及其年龄。
例9 查考试成绩有不及格的学生的学号。
例10 查询年龄在20岁至23岁之间的学生的姓名,系别,和年龄。
例11 查询年龄不在20岁至23岁之间的学生的姓名、系别和年龄。
例12 查询软件工程系、体育、计算机系的学生的姓名和性别。
例13 查既不是软件工程系、体育系、也不是计算机系的学生的姓名和性别。
例14 查询学号为5的学生的详细情况。
例15 查询所有姓名里有Y字母的学生的学生的姓名。
例16 查姓名两个字母的学生的姓名。
例17 查所有不姓z的学生姓名。
例18 查羽毛球课程的课程号和学分。
例19 查所有姓z的学生的姓名、学号、和性别。
例20 查询以高数开头,并且倒数第一个字符为2的课程的详细信息。
例21 某些学生选修某门课程后没有参加考试,所以有选课记录,但没有考试成绩、查询缺少成绩的学生的学号和相应的课程号。
例22 查询所有有成绩记录的学生的学生学号和课程号。
例23 查软件工程系在20岁以下的学生姓名。
例24 查询选修了3号课程的学生的学号及其成绩、查询结果按分数的降序排列。
例25 查询全体学生情况、查询结果按所在系所在系升序排列、对同一系中的学生按年龄降序排列。
例26 查询学生的总人数。
例27 查询了选修了课程的学生人数。
例28 计算1号课程的学生的平均成绩。
例29 查询学习了1号课程的最高成绩。
例30 查询各个课程号和与相应的选课人数。
例31 查询软件工程选修了三门以上课程的课程的学生的学号。
例32 查询每个学生及其选修课程的情况。
例33 自然连接Student和SC表。
例34 查询每一门课程的间接先修课(即先修课的先修课)。
例35 查询选修了一号课程且成绩在90分以上的所有学生。
例36 查询每个学生选修的课程名及其成绩。
例37 查询与hxz在同一个系的学生。
例38 查询选修了课程名为足球的学生学号和姓名。
例39 查询其他系中比软件工程系中任一学生小的学生名单。
例40 查询其他系中比软件工程系所有年龄都小的学生名单。
例41 查询所有选修了一号课程的学生姓名。
例42 查询所有选修未修一号课程的学生姓名。
例43 查询选修了全部课程的学生姓名。
转化为查询学生姓名,没有一门课不选(双重否定变肯定)
例44 查询至少选修了学生5选修的全部课程的学生号码。
可理解为:不存在这样的课程y,学生5选修了y,而学生x没有选。
例45 查询软件工程系的学生及年龄不大于19岁的学生。
例46 查询选修了课程1或者选修了选修了课程2的学生。
例47 查询软件工程系的学生与年龄不大于19岁的学生的交集。
实际上是查询软件工程系中不大于19岁的学生。
例48 查询选修了课程1的学生集合与选修了课程2的学生集合的交集。
实际上查询即选修了1号课程又选修了2号课程的学生。
例49 查询计算机系的学生与年龄不大于19岁学生的差集。
例50 查询了选修课程1的学生集合与选修课程2的学生的差集。