欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SQL实战50例:MySQL查询语句练习

程序员文章站 2022-05-03 09:22:25
...

一、学生-课程数据库中包括三个表:

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  查询全体学生的学号和姓名。

SQL实战50例:MySQL查询语句练习

例2  查询全体学生的姓名、学号、所在系。

SQL实战50例:MySQL查询语句练习

例3 查询全体学生的详细记录。

SQL实战50例:MySQL查询语句练习

例4 查询全体学生的姓名及其出生年份。

SQL实战50例:MySQL查询语句练习

例5 查询全体学生的姓名、出生年份、和所在系。

SQL实战50例:MySQL查询语句练习

例6 查询所有选修过课的学生的学号。

SQL实战50例:MySQL查询语句练习

例7 查询计算机系全体学生的名单。

SQL实战50例:MySQL查询语句练习

例8 查所有年龄在20岁以下的学生姓名及其年龄。

SQL实战50例:MySQL查询语句练习

例9 查考试成绩有不及格的学生的学号。

SQL实战50例:MySQL查询语句练习

例10 查询年龄在20岁至23岁之间的学生的姓名,系别,和年龄。

SQL实战50例:MySQL查询语句练习

SQL实战50例:MySQL查询语句练习 

例11 查询年龄不在20岁至23岁之间的学生的姓名、系别和年龄。

SQL实战50例:MySQL查询语句练习

例12 查询软件工程系、体育、计算机系的学生的姓名和性别。

SQL实战50例:MySQL查询语句练习

SQL实战50例:MySQL查询语句练习 

例13 查既不是软件工程系、体育系、也不是计算机系的学生的姓名和性别。

SQL实战50例:MySQL查询语句练习

例14 查询学号为5的学生的详细情况。

SQL实战50例:MySQL查询语句练习

例15 查询所有姓名里有Y字母的学生的学生的姓名。

SQL实战50例:MySQL查询语句练习

例16 查姓名两个字母的学生的姓名。

SQL实战50例:MySQL查询语句练习

例17 查所有不姓z的学生姓名。

SQL实战50例:MySQL查询语句练习

例18 查羽毛球课程的课程号和学分。

SQL实战50例:MySQL查询语句练习

例19 查所有姓z的学生的姓名、学号、和性别。

SQL实战50例:MySQL查询语句练习

例20 查询以高数开头,并且倒数第一个字符为2的课程的详细信息。

SQL实战50例:MySQL查询语句练习

例21 某些学生选修某门课程后没有参加考试,所以有选课记录,但没有考试成绩、查询缺少成绩的学生的学号和相应的课程号。

SQL实战50例:MySQL查询语句练习

例22 查询所有有成绩记录的学生的学生学号和课程号。

SQL实战50例:MySQL查询语句练习

例23 查软件工程系在20岁以下的学生姓名。

SQL实战50例:MySQL查询语句练习

例24 查询选修了3号课程的学生的学号及其成绩、查询结果按分数的降序排列。

SQL实战50例:MySQL查询语句练习

例25 查询全体学生情况、查询结果按所在系所在系升序排列、对同一系中的学生按年龄降序排列。

SQL实战50例:MySQL查询语句练习

例26 查询学生的总人数。

SQL实战50例:MySQL查询语句练习

例27 查询了选修了课程的学生人数。

SQL实战50例:MySQL查询语句练习

例28 计算1号课程的学生的平均成绩。

SQL实战50例:MySQL查询语句练习

例29 查询学习了1号课程的最高成绩。

SQL实战50例:MySQL查询语句练习

例30 查询各个课程号和与相应的选课人数。

SQL实战50例:MySQL查询语句练习

例31 查询软件工程选修了三门以上课程的课程的学生的学号。

SQL实战50例:MySQL查询语句练习

例32 查询每个学生及其选修课程的情况。

SQL实战50例:MySQL查询语句练习

例33 自然连接Student和SC表。

SQL实战50例:MySQL查询语句练习

例34 查询每一门课程的间接先修课(即先修课的先修课)。

SQL实战50例:MySQL查询语句练习

 

例35 查询选修了一号课程且成绩在90分以上的所有学生。

SQL实战50例:MySQL查询语句练习

例36 查询每个学生选修的课程名及其成绩。

SQL实战50例:MySQL查询语句练习

例37 查询与hxz在同一个系的学生。

SQL实战50例:MySQL查询语句练习

例38 查询选修了课程名为足球的学生学号和姓名。

SQL实战50例:MySQL查询语句练习

例39 查询其他系中比软件工程系中任一学生小的学生名单。

SQL实战50例:MySQL查询语句练习

例40 查询其他系中比软件工程系所有年龄都小的学生名单。

SQL实战50例:MySQL查询语句练习

例41 查询所有选修了一号课程的学生姓名。

SQL实战50例:MySQL查询语句练习

SQL实战50例:MySQL查询语句练习

例42 查询所有选修未修一号课程的学生姓名。

SQL实战50例:MySQL查询语句练习

例43 查询选修了全部课程的学生姓名。

转化为查询学生姓名,没有一门课不选(双重否定变肯定)

SQL实战50例:MySQL查询语句练习

例44 查询至少选修了学生5选修的全部课程的学生号码。

可理解为:不存在这样的课程y,学生5选修了y,而学生x没有选。

SQL实战50例:MySQL查询语句练习

例45 查询软件工程系的学生及年龄不大于19岁的学生。

SQL实战50例:MySQL查询语句练习

例46 查询选修了课程1或者选修了选修了课程2的学生。

SQL实战50例:MySQL查询语句练习

例47 查询软件工程系的学生与年龄不大于19岁的学生的交集。

实际上是查询软件工程系中不大于19岁的学生。

SQL实战50例:MySQL查询语句练习

例48 查询选修了课程1的学生集合与选修了课程2的学生集合的交集。

实际上查询即选修了1号课程又选修了2号课程的学生。

SQL实战50例:MySQL查询语句练习

 

例49 查询计算机系的学生与年龄不大于19岁学生的差集。

SQL实战50例:MySQL查询语句练习

例50 查询了选修课程1的学生集合与选修课程2的学生的差集。

SQL实战50例:MySQL查询语句练习