【MySQL】第七弹——复习总结 & 视图

文章目录

🌏客户端和数据库操作客户端和数据库操作

c 复制代码
1. 登录 mysql -uroot -p 输入密码
2. 查看当前的数据库版本 select version()
3. 显示所有数据库 show databases;
4. 创建数据库 create [ if not exists ] database 数据库名 character set 字符编码集 collateral 排序规则
5. 选择数据库 use 数据库名
6. 查看当前选择了哪个数据库 select database();
7. 删除数据库 drop [ if not exists] database 数据库名; // 非常危险的操作,一定谨慎使用
8. 查看警告信息 show warnings;
9. 退出 quit / exit 

🌏表操作

c 复制代码
表操作
1. 查看当前数据库中有哪些表 show tables;
2. 创建一张新表 create table 表名 (列名/字段名 数据类型 [,列名/字段名 数据类型]...);
3. 查看表结构 desc 表名;
4. 删除表 drop 表名; // 非常危险的操作,一定谨慎使用 

🌏CRUD 增删改查总结

c 复制代码
CRUD 增删改查
1. 新增 - 插入
insert into 表名 [(列名 [,列名]...)] values (值[,值]...);
指定了多少列,就需要指定多少值,值与列名一一对应
若不指定列名, 值的顺序与个数 都要与表中所有的列一一对应
2. 查询操作
a. 全列查询 select * from 表名;
//注意:不加限制的查询会把表中所有数据都查出来
//极有可能就把磁盘IO (input output) 吃满或者把网络带宽吃满
b. 指定列查询 select 列名 [,列名]... from 表名; //推荐使用
c. 列为表达式的查询 select 列名/表达式 from 表名;
d. 别名查询 select 列名/表达式 [as] 别名 from 表名; //别名中若包含空格,用单引号引起来
e. 去重查询 select distinct 列名 [,列名]... from 表名; //如果列名有多个,去重时只有所有列都相等,才会判定为重复,才会去重
f. 排序 select 列名 [,列名]... from 表名 order by 列名 asc | desc ; //asc 升序 desc 降序 不写默认为升序
g. 条件查询 select 列名 [,列名] ... from 表名 where 列名/表达式 比较/逻辑运算符 order by 列名 asc | desc;
h. 区间查询 where 列名 between 开始条件 and 结束条件; //等价于 开始条件 <= 列的值 <=结束条件
i. 模糊查询 select * from 表名 where 列名 like '%值_'; // %匹配任意个字符 _匹配单个字符
j. 分页查询 select * form 表名 where 条件 order by 列名 asc | desc limit num; //查询num条记录
select * form 表名 where 条件 order by 列名 asc | desc limit start, num; //从第start条开始,向后查num条
select * form 表名 where 条件 order by 列名 asc | desc limit num offset start; // 从第start条开始,向后查num条
3. 更新
update 表名 set 列名 = 值 where 条件 order by 子句 limit num;
//如果不指定条件和limit的数量就会更新整张表
4. 删除
delete from 表名 where 条件 order by 子句 limit num;
//如果不指定条件和limit数量会删除整张表的数据 

🌏数据库约束

c 复制代码
数据库约束
1. 非空约束:NOT NULL 标记一个字段是否可以为空,指定了这个约束,字段就不能为空
2. 唯一约束:UNIQUE 标记一个字段的内容在当前列中唯一,不能重复,但是可以为NULL
3. 主键约束:PRIMARY KEY 在约束方式上相当于NOT NULL + UNIQUE
4. 默认约束:DEFAULT 当一个字段没有指定值是(为NULL时),不指定列的值时,就用默认值填充该列
5. 外键约束:FOREIGN KEY 一个表中的字段与另一个表中的主键建立关联关系,当对表中的数据进行增删改时 数据库会帮我们进行检查 

🌏表的设计

🌏分组查询

🌏聚合函数

🌏联合查询

c 复制代码
联合查询(表连接查询)
1. 内连接
select * from table1, table2 where table1.xxx = table2.xxx;
select * from table1 join table2 on table1.xxx = table2.xxx;
select * from table1 inner join table2 on table1.xxx = table2.xxx;
表连接的执行过程
1. 先计算参与表连接的笛卡尔积
2. 通过连接条件过滤无效数据
3. 加入查询条件得到想要的结果行
4. 精减列名得到最终想要查询的列
2. 外连接 分为左外连接和右外连接
select * from table1 left join table2 on table1.xxx = table2.xxx;
select * from table1 right join table2 on table1.xxx = table2xxx;
左外连接以左表为基准,左边的表中所有的数据全部显示,右表中没有对应的记录用NULL去填充
右外连接以右表为基准,右边的表中所有的数据全部显示,左表中没有对应的记录用NULL去填充
主要应用在两张表数据不一致的场景里
3. 自连接
select * from table1 t1, table2 t2 where t1.xxx = t2.xxx;
把行转换成列,在查询的时候可以使用where条件进行过滤,实现行与行之间的比较
4. 子查询
单 行 子 查 询:select * from table1 where id = (select id from table2 where clo = xxx);
多 行 子 查 询:select * from table1 where id IN (select id from table2 where clo = xxx); 
c 复制代码
5. 合并查询
select * from table1 union select * from table2;
select * from table1 union all select * from table2; 

🌏SQL语句中各部分的执行顺序

🪐视图

视图是⼀个虚拟的表,它是基于一个或多个基本表或其他视图的查询结果集。视图本身不存储数据,而是通过执行查询来动态生成数据。用户可以像操作普通表⼀样使用视图进行查询、更新和管理。视图本身并不占用物理存储空间,它仅仅是⼀个查询的逻辑表示,物理上它依赖于基础表中的数据。

语法:

  • 查询用户的所有信息和考试成绩

学生id 学生姓名 所有班级名 课程和对应的成绩

所有这样的开发需求,都需要写这么复杂的SQL

可以把以上SQL定义为一个视图


  • 查看 使用视图
  • 创建视图时指定列名

指定列名之后,视图会根据指定的列名创建,查询结果集中是否重名不重要,重名也不需要再取别名

💫更新基本表 - 视图会受到影响

  • 更新基本表的数据

原始的student_id = 1 course_id = 1 的成绩为70.5

查看视图中是否会有影响


更新基本表之后,视图会查到最新的数据

💫更新视图

  • 更新视图 把分数改为80

创建视图时使用order by 子句,视图不允许进行更新操作

💫不允许更新的视图

  • 修改真实表会影响视图,修改视图同样也会影响真实表
  • 以下视图不可更新:
    • 创建视图时使用ORDER BY的视图
    • 创建视图时使用聚合函数的视图
    • 创建视图时使用 DISTINCT
    • 创建视图时使用 GROUP BY 以及 HAVING 子句
    • 创建视图时使用 UNION 或 UNION ALL
    • 查询列表中使用子查询
    • 在FROM子句中引用不可更新视图

不论更新了视图还是基础表,相互都会被影响,查询出来的数据都是最新结果

💫删除视图

语法:

drop view view_name;

💫视图的优点

  1. 简单性:视图可以将复杂的查询封装成一个简单的查询。例如,针对一个复杂的多表连接查询,可以创建一个视图,用户只需查询视图而无需了解底层的复杂逻辑。
  2. 安全性:通过视图,可以隐藏表中的敏感数据。例如,一个系统的用户表中,可以创建一个不包含密码列视图,普通用户只能访问这个视图,而不能访问原始表。
  3. 逻辑数据独立性:视图提供了一种逻辑数据独立性,即使底层表结构发生变化,只需修改视图定义,而无需修改依赖视图的应用程序。使用到应用程序与数据库的解耦
  4. 重命名列:视图允许用户重命名列名,以增强数据可读性
相关推荐
星辰离彬8 分钟前
线上 Linux 环境 MySQL 磁盘 IO 高负载深度排查与性能优化实战
linux·运维·服务器·数据库·mysql·性能优化
Faith_xzc9 小时前
MySQL 迁移至 Doris 最佳实践方案
数据库·mysql·adb
ikun·9 小时前
MySQL高可用
数据库·mysql
好奇的菜鸟9 小时前
Windows系统下MySQL 8.4.5压缩包安装详细教程
windows·mysql·adb
付出不多9 小时前
linux——mysql故障排查与生产环境优化
linux·运维·mysql
5283012 小时前
MySQL故障排查与生产环境优化
数据库·mysql
西红柿天尊12 小时前
查看mysql配置文件my.cnf的位置
数据库·mysql·adb
卡戎-caryon12 小时前
【MySQL】04.数据类型
linux·数据库·笔记·mysql·adb
进击的CJR12 小时前
MySQL 8.0 OCP 英文题库解析(六)
数据库·mysql·开闭原则