
创建测试数据库:
/*如果已经存在此数据库,先删除*/
drop database if exists sqltest ;
/*创建并设置编码为UTF-8*/
create database sqltest default character set utf8 ;
一、单表查询
id | sno | name | cno | course | score |
2 | 20170101001 | 张三 | 1001 | 语文 | 86 |
3 | 20170101001 | 张三 | 1002 | 数学 | 56 |
4 | 20170101001 | 张三 | 1003 | 英语 | 48 |
5 | 20170101001 | 张三 | 1004 | 化学 | 90 |
6 | 20170101001 | 张三 | 1005 | 物理 | 57 |
7 | 20170101002 | 李四 | 1001 | 语文 | 90 |
8 | 20170101002 | 李四 | 1002 | 数学 | 68 |
9 | 20170101002 | 李四 | 1003 | 英语 | 87 |
10 | 20170101002 | 李四 | 1004 | 化学 | 68 |
11 | 20170101002 | 李四 | 1005 | 物理 | 45 |
12 | 20170101003 | 王五 | 1001 | 语文 | 86 |
13 | 20170101003 | 王五 | 1002 | 数学 | 60 |
14 | 20170101003 | 王五 | 1003 | 英语 | 48 |
15 | 20170101003 | 王五 | 1004 | 化学 | 90 |
16 | 20170101003 | 王五 | 1005 | 物理 | 70 |
17 | 20170101004 | 赵六 | 1001 | 语文 | 82 |
18 | 20170101004 | 赵六 | 1002 | 数学 | 80 |
19 | 20170101004 | 赵六 | 1003 | 英语 | 30 |
20 | 20170101004 | 赵六 | 1004 | 化学 | 70 |
21 | 20170101004 | 赵六 | 1005 | 物理 | 88 |
/*切换至测试数据库*/
use sqltest; /*如果表存在,则删除*/
drop table if exists tb_score ; /*创建学生表ST*/
CREATE TABLE `tb_score` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`Sno` varchar(50) not null ,
`name` varchar(50) DEFAULT NULL,
`Cno` varchar(50) not null ,
`course` varchar(50) DEFAULT NULL,
`score` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; /*插入数据*/
insert into tb_score (sno,name,cno,course,score) value('','张三','','语文','') ;
insert into tb_score (sno,name,cno,course,score) value('','张三','','数学','') ;
insert into tb_score (sno,name,cno,course,score) value('','张三','','英语','') ;
insert into tb_score (sno,name,cno,course,score) value('','张三','','化学','') ;
insert into tb_score (sno,name,cno,course,score) value('','张三','','物理','') ; insert into tb_score (sno,name,cno,course,score) value('','李四','','语文','') ;
insert into tb_score (sno,name,cno,course,score) value('','李四','','数学','') ;
insert into tb_score (sno,name,cno,course,score) value('','李四','','英语','') ;
insert into tb_score (sno,name,cno,course,score) value('','李四','','化学','') ;
insert into tb_score (sno,name,cno,course,score) value('','李四','','物理','') ; insert into tb_score (sno,name,cno,course,score) value('','王五','','语文','') ;
insert into tb_score (sno,name,cno,course,score) value('','王五','','数学','') ;
insert into tb_score (sno,name,cno,course,score) value('','王五','','英语','') ;
insert into tb_score (sno,name,cno,course,score) value('','王五','','化学','') ;
insert into tb_score (sno,name,cno,course,score) value('','王五','','物理','') ; insert into tb_score (sno,name,cno,course,score) value('','赵六','','语文','') ;
insert into tb_score (sno,name,cno,course,score) value('','赵六','','数学','') ;
insert into tb_score (sno,name,cno,course,score) value('','赵六','','英语','') ;
insert into tb_score (sno,name,cno,course,score) value('','赵六','','化学','') ;
insert into tb_score (sno,name,cno,course,score) value('','赵六','','物理','') ;
1.1查询不及格科目数大于等于2的学生学号、姓名和不及格科目数量:
/*不加having条件筛选*/
select sno as '学号' , name as '姓名' , count(score) as '不及格科目数' from tb_score where score < 60 group by sno ;
select sno as '学号' , name as '姓名' , count(score) as '不及格科目数' from tb_score where score < 60 group by sno having count(score) > 2 ;
1.2查询不及格科目数大于等于2的学生学号、姓名:
select sno as '学号' , name as '姓名' from tb_score where score < 60 group by sno having count(score) > 2 ;
1.3、查询不及格科目数大于等于2的学生学号、学生姓名、科目号、科目名称和分数,并按学号降序、科目号升序排序:
中间步骤探索
select * from tb_score where score < 60 group by sno having count(score) >= 2 order by sno desc , cno asc ;
最终结果
select * from tb_score where score < 60 and sno in (
select sno from tb_score where score < 60 group by sno having count(score) >= 2
)
order by sno desc , cno asc ;
二、多表查询
/*选择数据库*/
use sqltest ; /*删除已有的学生表*/
drop table if exists tb_student ; /*创建学生表*/
CREATE TABLE `tb_student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`stuId` varchar(45) DEFAULT NULL,
`name` varchar(45) DEFAULT NULL,
`clsId` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*插入学生的数据*/
insert into tb_student (stuId,name,clsId) value ('','张三','') ;
insert into tb_student (stuId,name,clsId) value ('','李四','') ;
insert into tb_student (stuId,name,clsId) value ('','王五','') ;
insert into tb_student (stuId,name,clsId) value ('','赵六','') ;
insert into tb_student (stuId,name,clsId) value ('','巩发财','') ;
insert into tb_student (stuId,name,clsId) value ('','柏拉图','') ;
insert into tb_student (stuId,name,clsId) value ('','钱老虎','') ;
insert into tb_student (stuId,name,clsId) value ('','杨伟','') ;
insert into tb_student (stuId,name,clsId) value ('','陈海','') ;
/*删除已有的班级表*/
drop table if exists tb_class ; /*创建班级表*/
CREATE TABLE `tb_class` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`clsId` varchar(45) DEFAULT NULL,
`name` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*插入班级的数据*/
insert into tb_class (clsId,name) value ('','高二(1)班') ;
insert into tb_class (clsId,name) value ('','高二(2)班') ;
insert into tb_class (clsId,name) value ('','高二(3)班') ;
/*删除已有的课程表*/
drop table if exists tb_course ; /*创建课程表*/
CREATE TABLE `tb_course` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`couId` varchar(45) DEFAULT NULL,
`name` varchar(45) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*插入课程数据*/
insert into tb_course (couId,name) value ('A01','语文') ;
insert into tb_course (couId,name) value ('A02','数学') ;
insert into tb_course (couId,name) value ('A03','英语') ;
/*删除已有的分数表*/
drop table if exists tb_score ; /*创建分数表*/
CREATE TABLE `tb_score` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`stuId` varchar(45) DEFAULT NULL,
`couId` varchar(45) DEFAULT NULL,
`score` float DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*插入分数数据*/
insert into tb_score (stuId,couId,score) value ('','A01',81) ;
insert into tb_score (stuId,couId,score) value ('','A02',73) ;
insert into tb_score (stuId,couId,score) value ('','A03',79) ; insert into tb_score (stuId,couId,score) value ('','A01',79) ;
insert into tb_score (stuId,couId,score) value ('','A02',83) ;
insert into tb_score (stuId,couId,score) value ('','A03',87) ; insert into tb_score (stuId,couId,score) value ('','A01',65) ;
insert into tb_score (stuId,couId,score) value ('','A02',97) ;
insert into tb_score (stuId,couId,score) value ('','A03',65) ; insert into tb_score (stuId,couId,score) value ('','A01',78) ;
insert into tb_score (stuId,couId,score) value ('','A02',86) ;
insert into tb_score (stuId,couId,score) value ('','A03',78) ; insert into tb_score (stuId,couId,score) value ('','A01',67) ;
insert into tb_score (stuId,couId,score) value ('','A02',89) ;
insert into tb_score (stuId,couId,score) value ('','A03',88) ; insert into tb_score (stuId,couId,score) value ('','A01',98) ;
insert into tb_score (stuId,couId,score) value ('','A02',90) ;
insert into tb_score (stuId,couId,score) value ('','A03',92) ; insert into tb_score (stuId,couId,score) value ('','A01',85) ;
insert into tb_score (stuId,couId,score) value ('','A02',78) ;
insert into tb_score (stuId,couId,score) value ('','A03',72) ; insert into tb_score (stuId,couId,score) value ('','A01',78) ;
insert into tb_score (stuId,couId,score) value ('','A02',85) ;
insert into tb_score (stuId,couId,score) value ('','A03',77) ; insert into tb_score (stuId,couId,score) value ('','A01',68) ;
insert into tb_score (stuId,couId,score) value ('','A02',91) ;
insert into tb_score (stuId,couId,score) value ('','A03',94) ;
学生表 |
分数表 |
班级表 |
|
课程表 |
2.1查询各班各科最高分数:
SELECT
cls.name AS '班级',
cou.name AS '课程',
MAX(temp.score) AS '最高分'
FROM
(SELECT
st.clsId, sc.couId, sc.score
FROM
tb_score AS sc
INNER JOIN tb_student AS st ON sc.stuId = st.stuId) as temp
INNER JOIN tb_class AS cls ON temp.clsId = cls.clsId
INNER JOIN tb_course AS cou ON temp.couId = cou.couId
GROUP BY temp.clsId , temp.couId