MySQL之视图&内连接、外连接、子查询

目录

一、视图

[1.1 含义](#1.1 含义)

[2.1 视图的基本语法](#2.1 视图的基本语法)

二、案例

三、思维导图


一、视图

1.1 含义

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

视图(view)是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,数据库中只存放了视图的定义,而并没有存放视图中的数据,这些数据存放在原来的表中。

2.1 视图的基本语法

创建视图

sql 复制代码
create view 视图名
as
查询语句;

查看视图有两种方式

sql 复制代码
方式1:
这里看到的是视图的字段
DESC 视图名;
方式2:
这里可以看到视图的创表语句
SHOW CREATE VIEW 视图名

视图的修改

修改视图有两种方式

sql 复制代码
方式1:
创建视图的时候你可以更改视图
CREATE OR REPLACE VIEW
AS
查询语句;

方式2:
ALTER VIEW 视图名
AS
查询语句;

删除视图

sql 复制代码
DROP 视图名

二、案例

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

1.涉及表:t_mysql_student,t_mysql_score

2.连接方式:内连接

3.行转列:流程函数

  • 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

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

1.涉及表:t_mysql_student,t_mysql_score

2.连接方式:内连接

3.行转列:流程函数

  • 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

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

1.涉及表:t_mysql_student,t_mysql_score

2.连接方式:外连接

3.行转列:流程函数

  • 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

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

1.下面代码使用的是子查询

  • 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'

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

1.涉及表:t_mysql_student,t_mysql_score

2.连接方式:外连接

  • SELECT
    s.sid,s.sname,
    ROUND(avg(sc.score),2) 平均分数
    FROM
    t_mysql_student s LEFT JOIN
    t_mysql_score sc on s.sid = sc.sid
    GROUP BY s.sid,s.sname
    HAVING 平均分数 >= 60

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

1.涉及表:t_mysql_student,t_mysql_score

2.连接方式:内连接

  • 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

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

1.涉及表:t_mysql_student,t_mysql_score

2.连接方式:外连接

  • 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

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

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

三、思维导图

相关推荐
想摆烂的不会研究的研究生1 小时前
每日八股——Redis(1)
数据库·经验分享·redis·后端·缓存
码熔burning1 小时前
MySQL 8.0 新特性爆笑盘点:从青铜到王者的骚操作都在这儿了!(万字详解,建议收藏)
数据库·mysql
猫头虎1 小时前
2025最新OpenEuler系统安装MySQL的详细教程
linux·服务器·数据库·sql·mysql·macos·openeuler
哈库纳玛塔塔2 小时前
放弃 MyBatis,拥抱新一代 Java 数据访问库
java·开发语言·数据库·mybatis·orm·dbvisitor
@LetsTGBot搜索引擎机器人3 小时前
2025 Telegram 最新免费社工库机器人(LetsTG可[特殊字符])搭建指南(含 Python 脚本)
数据库·搜索引擎·机器人·开源·全文检索·facebook·twitter
计算机毕设VX:Fegn08954 小时前
计算机毕业设计|基于springboot + vue动物园管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
冉冰学姐4 小时前
SSM校园排球联赛管理系统y513u(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架应用·开题报告、
Tony Bai5 小时前
【分布式系统】03 复制(上):“权威中心”的秩序 —— 主从架构、一致性与权衡
大数据·数据库·分布式·架构
wb043072015 小时前
SQL工坊不只是一个ORM框架
数据库·sql
至善迎风6 小时前
Redis完全指南:从诞生到实战
数据库·redis·缓存