【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. 重命名列:视图允许用户重命名列名,以增强数据可读性
相关推荐
Coder_Oldou18 小时前
【经验分享】MySQL线上使用经验
数据库·经验分享·mysql
IT教程资源C18 小时前
(N_115)基于springboot,vue教务管理系统
mysql·vue·前后端分离·springboot教务系统
chushiyunen18 小时前
mysql性能调优、连接数、问题排查等
数据库·mysql
Predestination王瀞潞18 小时前
数据库MySql 8.0.44的安装
数据库·mysql
中年程序员一枚18 小时前
Python防止重复资源的链接mysql方法
开发语言·python·mysql
Hns.18 小时前
MySQL慢SQL问题查找与优化方案
数据库·sql·mysql
菜择贰19 小时前
ubantu下载mysql
数据库·mysql·adb
程序员大辉19 小时前
免费的mysql链接工具HeidiSQL比Navicat好用
数据库·mysql
叫我詹躲躲19 小时前
为什么永远不要让前端直接连接数据库
javascript·mysql
syty202019 小时前
mysql--Waiting for table metadata lock
mysql