MySQL之视图&外连接、内连接和子查询的使用


目录

一、视图

[1.1 含义](#1.1 含义)

[1.2 操作](#1.2 操作)

[1.3 SQL数据](#1.3 SQL数据)

二、连接查询案例

[(1)查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数](#(1)查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数)

[(2)查询同时存在" 01 "课程和" 02 "课程的情况](#(2)查询同时存在" 01 "课程和" 02 "课程的情况)

[(3)查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为 null )](#(3)查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为 null ))

[(4)查询不存在" 01 "课程但存在" 02 "课程的情况](#(4)查询不存在" 01 "课程但存在" 02 "课程的情况)

[(5)查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩](#(5)查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩)

(6)查询在t_mysql_score表存在成绩的学生信息

[(7)查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null )](#(7)查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null ))

(8)查询「李」姓老师的数量

(9)查询学过「张三」老师授课的同学的信息

(10)查询没有学全所有课程的同学的信息

(11)查询没学过"张三"老师讲授的任一门课程的学生姓名

(12)查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩

[(13)检索" 01 "课程分数小于 60,按分数降序排列的学生信息](#(13)检索" 01 "课程分数小于 60,按分数降序排列的学生信息)

(14)按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩

[(15)查询各科成绩最高分、最低分和平均分:以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列](#(15)查询各科成绩最高分、最低分和平均分:以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列)

三、思维导图


一、视图

1.1 含义

虚拟表,和普通表一样使用

1.2 操作

  • 创建视图

create view 视图名 as

  • 修改视图

方式一:

create or replace view 视图名 as

【查看视图相关字段】

方式二:

alter view 视图名 as

【查看的SQL语句】

  • 查看视图

方式一:

desc 视图名【看视图字段】

方式二:

show create view 视图名

  • 删除视图

drop view 视图名

1.3 SQL数据

/*

Navicat Premium Data Transfer

Source Server : localhost

Source Server Type : MySQL

Source Server Version : 80018

Source Host : localhost:3306

Source Schema : mybatis_ssm

Target Server Type : MySQL

Target Server Version : 80018

File Encoding : 65001

Date: 04/07/2023 23:53:33

*/

SET NAMES utf8mb4;

SET FOREIGN_KEY_CHECKS = 0;


-- Table structure for t_mysql_course


DROP TABLE IF EXISTS `t_mysql_course`;

CREATE TABLE `t_mysql_course` (

`cid` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '课程编号',

`cname` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '课程名称',

`tid` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '教师编号',

PRIMARY KEY (`cid`) USING BTREE

) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '课程信息表' ROW_FORMAT = Dynamic;


-- Records of t_mysql_course


INSERT INTO `t_mysql_course` VALUES ('01', '语文', '02');

INSERT INTO `t_mysql_course` VALUES ('02', '数学', '01');

INSERT INTO `t_mysql_course` VALUES ('03', '英语', '03');


-- Table structure for t_mysql_score


DROP TABLE IF EXISTS `t_mysql_score`;

CREATE TABLE `t_mysql_score` (

`sid` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '学生编号,外键',

`cid` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '课程编号,外键',

`score` float NULL DEFAULT 0 COMMENT '成绩',

INDEX `sid`(`sid`) USING BTREE,

INDEX `cid`(`cid`) USING BTREE,

CONSTRAINT `t_mysql_score_ibfk_1` FOREIGN KEY (`sid`) REFERENCES `t_mysql_student` (`sid`) ON DELETE RESTRICT ON UPDATE RESTRICT,

CONSTRAINT `t_mysql_score_ibfk_2` FOREIGN KEY (`cid`) REFERENCES `t_mysql_course` (`cid`) ON DELETE RESTRICT ON UPDATE RESTRICT

) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '成绩信息表' ROW_FORMAT = Dynamic;


-- Records of t_mysql_score


INSERT INTO `t_mysql_score` VALUES ('01', '01', 80);

INSERT INTO `t_mysql_score` VALUES ('01', '02', 90);

INSERT INTO `t_mysql_score` VALUES ('01', '03', 99);

INSERT INTO `t_mysql_score` VALUES ('02', '01', 70);

INSERT INTO `t_mysql_score` VALUES ('02', '02', 60);

INSERT INTO `t_mysql_score` VALUES ('02', '03', 80);

INSERT INTO `t_mysql_score` VALUES ('03', '01', 80);

INSERT INTO `t_mysql_score` VALUES ('03', '02', 80);

INSERT INTO `t_mysql_score` VALUES ('03', '03', 80);

INSERT INTO `t_mysql_score` VALUES ('04', '01', 50);

INSERT INTO `t_mysql_score` VALUES ('04', '02', 30);

INSERT INTO `t_mysql_score` VALUES ('04', '03', 20);

INSERT INTO `t_mysql_score` VALUES ('05', '01', 76);

INSERT INTO `t_mysql_score` VALUES ('05', '02', 87);

INSERT INTO `t_mysql_score` VALUES ('06', '01', 31);

INSERT INTO `t_mysql_score` VALUES ('06', '03', 34);

INSERT INTO `t_mysql_score` VALUES ('07', '02', 89);

INSERT INTO `t_mysql_score` VALUES ('07', '03', 98);


-- Table structure for t_mysql_student


DROP TABLE IF EXISTS `t_mysql_student`;

CREATE TABLE `t_mysql_student` (

`sid` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '学生编号',

`sname` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '学生名称',

`sage` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '学生年龄',

`ssex` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '学生性别',

PRIMARY KEY (`sid`) USING BTREE

) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '学生信息表' ROW_FORMAT = Dynamic;


-- Records of t_mysql_student


INSERT INTO `t_mysql_student` VALUES ('01', '赵雷', '1990-01-01', '男');

INSERT INTO `t_mysql_student` VALUES ('02', '钱电', '1990-12-21', '男');

INSERT INTO `t_mysql_student` VALUES ('03', '孙风', '1990-12-20', '男');

INSERT INTO `t_mysql_student` VALUES ('04', '李云', '1990-12-06', '男');

INSERT INTO `t_mysql_student` VALUES ('05', '周梅', '1991-12-01', '女');

INSERT INTO `t_mysql_student` VALUES ('06', '吴兰', '1992-01-01', '女');

INSERT INTO `t_mysql_student` VALUES ('07', '郑竹', '1989-01-01', '女');

INSERT INTO `t_mysql_student` VALUES ('09', '张三', '2017-12-20', '女');

INSERT INTO `t_mysql_student` VALUES ('10', '李四', '2017-12-25', '女');

INSERT INTO `t_mysql_student` VALUES ('11', '李四', '2012-06-06', '女');

INSERT INTO `t_mysql_student` VALUES ('12', '赵六', '2013-06-13', '女');

INSERT INTO `t_mysql_student` VALUES ('13', '孙七', '2014-06-01', '女');


-- Table structure for t_mysql_teacher


DROP TABLE IF EXISTS `t_mysql_teacher`;

CREATE TABLE `t_mysql_teacher` (

`tid` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '教师编号',

`tname` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '教师名称',

PRIMARY KEY (`tid`) USING BTREE

) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '教师信息表' ROW_FORMAT = Dynamic;


-- Records of t_mysql_teacher


INSERT INTO `t_mysql_teacher` VALUES ('01', '张三');

INSERT INTO `t_mysql_teacher` VALUES ('02', '李四');

INSERT INTO `t_mysql_teacher` VALUES ('03', '王五');

SET FOREIGN_KEY_CHECKS = 1;

二、连接查询案例

(1)查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数

方式一:

SELECT

*

FROM

t_mysql_student s,

( SELECT * FROM t_mysql_score WHERE cid = '01' ) t1,

( SELECT * FROM t_mysql_score WHERE cid = '02' ) t2

WHERE

s.sid = t1.sid

AND t1.sid = t2.sid

AND t1.score > t2.score

方式二:

SELECT

s.*,

(case when t1.cid = '01' then t1.score end ) 语文,

(case when t2.cid = '02' then t2.score end ) 数学

FROM

t_mysql_student s,

( SELECT * FROM t_mysql_score WHERE cid = '01' ) t1,

( SELECT * FROM t_mysql_score WHERE cid = '02' ) t2

WHERE

s.sid = t1.sid

AND t1.sid = t2.sid

AND t1.score > t2.score

(2)查询同时存在" 01 "课程和" 02 "课程的情况

SELECT

s.*,

(case when t1.cid = '01' then t1.score end ) 语文,

(case when t2.cid = '02' then t2.score end ) 数学

FROM

t_mysql_student s,

( SELECT * FROM t_mysql_score WHERE cid = '01' ) t1,

( SELECT * FROM t_mysql_score WHERE cid = '02' ) t2

WHERE

s.sid = t1.sid

AND t1.sid = t2.sid

(3)查询存在" 01 "课程但可能不存在" 02 "课程的情况(不存在时显示为 null )

SELECT s.*,

(case when t1.cid = '01' then t1.score end ) 语文,

(case when t2.cid = '02' then t2.score end ) 数学

FROM

t_mysql_student s INNER JOIN

( SELECT * FROM t_mysql_score WHERE cid = '01' ) t1

on s.sid = t1.sid left JOIN

( SELECT * FROM t_mysql_score WHERE cid = '02' ) t2

on t1.sid =t2.sid

(4)查询不存在" 01 "课程但存在" 02 "课程的情况

SELECT

s.*,

(case when sc.cid = '01' then sc.score end ) 语文,

(case when sc.cid = '02' then sc.score end ) 数学

FROM

t_mysql_student s,

t_mysql_score sc

WHERE

s.sid = sc.sid and

s.sid NOT IN ( SELECT sid FROM t_mysql_score WHERE cid = '01' )

AND sc.cid='02'

(5)查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩

SELECT

s.sid,

s.sname,

ROUND(AVG(sc.score),2) n

FROM

t_mysql_student s LEFT JOIN

t_mysql_score sc on s.sid =sc.sid

GROUP BY s.sid,s.sname

HAVING n>= 60

(6)查询在t_mysql_score表存在成绩的学生信息

SELECT

s.sid,

s.sname

FROM

t_mysql_student s INNER JOIN

t_mysql_score sc on s.sid =sc.sid

GROUP BY s.sid,s.sname

(7)查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显示为 null )

SELECT

s.sid,

s.sname,

COUNT(sc.score) 选课总数,

SUM(sc.score) 总成绩

FROM

t_mysql_student s LEFT JOIN

t_mysql_score sc on s.sid =sc.sid

GROUP BY s.sid,s.sname

(8)查询「李」姓老师的数量

SELECT COUNT(*) FROM t_mysql_teacher WHERE tname LIKE '李%'

(9)查询学过「张三」老师授课的同学的信息

SELECT

s.*,

c.cname,

t.tname,

sc.score

FROM

t_mysql_teacher t,

t_mysql_course c,

t_mysql_student s,

t_mysql_score sc

WHERE

t.tid = c.cid

AND c.cid = sc.cid

AND sc.sid = s.sid

AND t.tname = '张三'

(10)查询没有学全所有课程的同学的信息

SELECT

s.*,

c.cname,

t.tname,

sc.score

FROM

t_mysql_teacher t,

t_mysql_course c,

t_mysql_student s,

t_mysql_score sc

WHERE

t.tid = c.cid

AND c.cid = sc.cid

AND sc.sid = s.sid

AND t.tname = '张三'

(11)查询没学过"张三"老师讲授的任一门课程的学生姓名

SELECT

s.sid,

s.sname

FROM

t_mysql_score sc,

t_mysql_student s

WHERE

s.sid = sc.sid

AND sc.cid NOT IN

( SELECT cid FROM t_mysql_course c, t_mysql_teacher t WHERE c.tid = t.tid AND t.tname = '张三' )

GROUP BY

sid,

s.snamee

(12)查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩

SELECT

s.sid,

s.sname,

AVG( sc.score ) n

FROM

t_mysql_student s,

t_mysql_score sc

WHERE

s.sid = sc.sid

AND sc.score < 60

GROUP BY

s.sid,

s.sname

(13)检索" 01 "课程分数小于 60,按分数降序排列的学生信息

SELECT

s.*,

sc.score

FROM

t_mysql_student s,

t_mysql_score sc

WHERE

s.sid = sc.sid

AND sc.cid = '01'

AND sc.score < 60

ORDER BY

sc.score

(14)按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩

方法一:

SELECT

s.sid,

s.sname,

SUM( ( CASE WHEN sc.cid = '01' THEN sc.score END ) ) 语文,

SUM( ( CASE WHEN sc.cid = '02' THEN sc.score END ) ) 数学,

SUM( ( CASE WHEN sc.cid = '03' THEN sc.score END ) ) 英语,

ROUND( AVG( sc.score ), 2 )

FROM

t_mysql_score sc

RIGHT JOIN t_mysql_student s ON sc.sid = s.sid

GROUP BY

s.sid,

s.sname

方法二:

SELECT

s.sid,

s.sname,

SUM( IF ( sc.cid = '01', sc.score, 0 ) ) 语文,

SUM( IF ( sc.cid = '02', sc.score, 0 ) ) 数学,

SUM( IF ( sc.cid = '03', sc.score, 0 ) ) 英语,

ROUND( AVG( sc.score ), 2 )

FROM

t_mysql_score sc

RIGHT JOIN t_mysql_student s ON sc.sid = s.sid

GROUP BY

s.sid,

s.sname

(15)查询各科成绩最高分、最低分和平均分:

以如下形式显示:课程 ID,课程 name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90
要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列

SELECT

c.cid,

c.cname,

count(sc.sid) 人数,

max(sc.score) 最高分,

min(sc.score) 最低分,

ROUND( AVG( sc.score ), 2 ) 平均分,

CONCAT( ROUND(sum(if(sc.score>=60,1,0))/(SELECT count(*) FROM t_mysql_student)*100,2),'%') 及格率,

CONCAT( ROUND(sum(if(sc.score>=70 and sc.score<80,1,0))/(SELECT count(*) FROM t_mysql_student)*100,2),'%') 中等率,

CONCAT( ROUND(sum(if(sc.score>=90 and sc.score<90,1,0))/(SELECT count(*) FROM t_mysql_student)*100,2),'%') 优良率,

CONCAT( ROUND(sum(if(sc.score>=90,1,0))/(SELECT count(*) FROM t_mysql_student)*100,2),'%') 优秀率

FROM

t_mysql_score sc

LEFT JOIN t_mysql_course c ON sc.cid = c.cid

GROUP BY

c.cid,

c.cname

三、思维导图

相关推荐
莳花微语18 分钟前
使用MyCAT实现分布式MySQL双主架构
分布式·mysql·架构
he2581924 分钟前
centOS 7.9 安装JDK MYSQL
java·mysql·centos
夜泉_ly3 小时前
MySQL -安装与初识
数据库·mysql
qq_529835354 小时前
对计算机中缓存的理解和使用Redis作为缓存
数据库·redis·缓存
月光水岸New6 小时前
Ubuntu 中建的mysql数据库使用Navicat for MySQL连接不上
数据库·mysql·ubuntu
狄加山6756 小时前
数据库基础1
数据库
我爱松子鱼6 小时前
mysql之规则优化器RBO
数据库·mysql
chengooooooo7 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
Rverdoser8 小时前
【SQL】多表查询案例
数据库·sql
Galeoto8 小时前
how to export a table in sqlite, and import into another
数据库·sqlite