作者介绍:【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者
- 本文已收录于三大数据库深入讲解专栏:《三大数据库深入讲解》
- 热门专栏推荐:《Django框架从入门到实战》、《爬虫从入门到精通系列教程》、《爬虫高级》、《前端系列教程》、《tornado一条龙+一个完整版项目》。
- 本专栏面向广大程序猿,为的是大家入门并精通开发python项目常用的三大数据库:MySql,Redis,MongoDB。
- 订阅专栏后可私聊进一千多人Python全栈交流群(手把手教学,问题解答); 进群可领取Python全栈教程视频 + 多得数不过来的计算机书籍:基础、Web、爬虫、数据分析、可视化、机器学习、深度学习、人工智能、算法、面试题等。
- 加入我一起学习进步,一个人可以走的很快,一群人才能走的更远!
alter table 表名 rename to 新表名;
温馨小提示:alter修改字段的时候,字段的类型一定要加上。
alter table tb_name change name new_name data_type;
name为要修改的字段名,new_name为新的字段名,注意:字段名后面一定要加字段类型。
alter table tb_name modify field_name data_type;
注意修改字段类型时一定要注意不要超出范围。
alter table tb_name add [column] field_name data_type;
column可加可不加。
添加字段到指定位置(即指定字段下面):
如果想要添加到第一行,则将after id改为first即可。
alter table tb_name drop [column] field_name;
column可加可不加。
约束是一种限制,通过对表中的数据做出限制,来确保表中数据的完整性,唯一性。
插入数据的时候,如果没有明确为字段赋值,则自动赋予默认值,在没有设置默认值的情况下,默认值为NULL.
create table tb( id int default ‘a’ , name varchar(20));
insert into 表名 value(default,default);
alter table 表名 modify 字段名 字段类型 default 新的默认值;
(使用modify修改字段类型的命令修改默认值)限制一个字段的值不能为空,Insert的时候必须为该字段赋值。如果不赋值,则使用默认值null,但规定非空,即不能为null,所以会报错。
create table tb( id int not null, name varchar(20));
删除非空约束,直接在后面加上null。
alter table tb_name modify field_name data_type not null;
限制一个字段的值不重复,该字段的数据不能出现重复的。
作用:确保字段中值的唯一。
create table tb2( id int unique key, name varchar(20));
drop index 字段名 on 表名;
作用: 通常每张表都需要一个主键来体现唯一性,每张表里面只能有一个主键。
特点: 主键 = 非空 + 唯一。
create table tb3(id int primary key, name varchar(20));
alter table 表名 drop primary key;
增加主键(共三种方式):
alter table 表名 add primary key(字段名);
alter table tb_name change name new_name data_type primary key;
alter table tb_name modify field_name data_type primary key;
默认值从1开始,每次在最后一个值的基础上增加1。
create table ta( id int primary key auto_increment, name varchar(20));
(建议给下面第三部分—表关系看完之后再来看看本部分,会有茅塞顿开的感觉哦~)
外键:通过外键关联两张表,必须连接另外一张表里面的主键,另外一张表就是主表,本表就是副表。
保持数据的一致性,我有的你一定有, 你没有的, 我绝对没有。
(这里的我指副表;你指主表)
主表和副表是因为使用外键连接表才产生的概念。
删除外键约束:alter table h2 drop foreign key fk_name;
创建外键约束:alter table 表名1 add constraint 表名2 foreign key(id1) references 表名3(id2);
(创建一个外键约束,自己这张表(h1)里面的id连接另外一张表(h2)里面的id)
表名1代表要添加外键约束的表;
表名2代表外键名字;
id1代表自己表里的字段;
表名3代表外键表名;
id2代表主键字段名。
注意:
show create table 表名;
查看。
b表中的id_b字段,只能添加 id_a中已有的数据 。
即插入修改规则: 主表没有的这个字段值,副表也不能有。
a表中id_a 被参照的数据, 不能被修改和删除
即删除规则:先删除副表,副表里面没有的数据,主表才能删除。
自己这张表的主键连接另外一张表的主键。通过外键的方式来实现!!!(给主键的字段连接外键)
实操引入:假设有两张表,一张是学生表student,学生表中有学号、姓名、学院,但学生还有些比如电话,家庭住址等比较私密的信息,这些信息不会放在学生表当中,会新建一个学生的详细信息表data1来存放。这时的学生表和学生的详细信息表两者的关系就是一对一的关系,因为一个学生只有一条详细信息。用主键加主键的方式来实现这种关系。
下面是实操讲解(主要目的是讲解,所以我将两张表的字段做了简化):
第一步:学生表的创建
第二步:学生详细信息表的创建:
注意:通过外键关联两张表,必须连接另外一张表里面的主键,则另外一张表(student)就是主 表 ,本表data1就是副表。
第三步:通过外连接实现一对一:
这里还体现了外键约束。
注意:删除数据的时候:
要先删除副表的,再删除主表的,才能删掉 。如果直接删除主表的将报错。
自己的这张表的非主键连接另外一张表的主键。通过外键的方式实现。(给非主键的字段连接外键)
思路是非主键连接非主键,但是外键必须连接主键,所以必须有一个中间表,负责结合两张表的主键
联合主键: (1,1)
alter table 表名 add primary key(字段1,字段2);
实操引入:学生要报名选修课,一个学生可以报名多门课程,一个课程有很多的学生报名,那么学生表和课程表两者就形成了多对多关系。
下面是实操讲解(主要目的是讲解,所以我将两张表的字段做了简化):
第一步:创建第一个表:
第三步:上面已经创建了两张表,还需要一张中间表:
这张中间表就将上面两张表都连接起来了,实现了多对多:
上面这张图的primary key(s_id,c_id)是创建联合主键
特点:可以引用多张表。是一张虚表!!!
优点:
简单化,数据所见即所得
安全性,用户只能查询或者修改他们看得到的数据
逻辑独立性,可以屏蔽真实表结构变化带来的影响。比如:如果给一张有主键的表建立视图,那么这张表的视图是没有主键的。
缺点:
性能较差,简单的查询也会变得复杂
修改不方便,复杂的聚合视图基本无法修改
create view 视图名字 as select * from 表名;
一张表形成的视图是可以进行增删改查的;对视图进行修改,对应的原表也会跟着修改。 |
但是多张表(通过连接查询生成的视图)形成的视图不能进行修改操作。 |
drop view 视图名字;
查询语句写的太烂;
索引失效;
关联查询太多了;
服务器问题。
索引原理可以理解为把数据放进一本本书里面,查询不需要一个个数据查询;而是先找到放所需数据的书,在找页…可以加快查询数据的速度!
主键自动建立唯一索引
频繁查询条件的字段
外键关系自动建立索引
经常需要改变的数据不要建立索引
where条件里用到的字段不要创建索引
order by 要建立索引
聚合和分组字段也要建立索引
表记录太少
经常需要增删改的数据不要建立索引
太多重复且平均的字段不要建立索引
建立索引:
create index 索引名字 on 表名(字段名);
删除索引:
drop index 索引名字 on 表名;
显示表里索引:
show index from 表名;
小知识点:
如果是连接查询
explain 连接查询语句;
这样可以查看查询表的先后顺序。
正则表达式大家肯定都熟的不能再熟了(如果不熟的可以去看看Python基础分栏里的正则表达式讲解!),所以此处就简单使用几个常见的说明下如何在MYSQL中使用即可~
符号 | 含义 |
---|---|
^h | 以h开头 |
a$ | 以a结尾 |
[^h] | 不是h的都可以 |
+ | 一个到多个 |
* | 零个到多个 |
{m,n} | 控制次数 |
. | 通配符,任意字符 |
准备工作—使用的表:
找到name中含有h的:
找到name中以h开头的:
找到名字中以a结尾的:
只要包含h的都找到:
只要是name里不是h的都找到:
.是通配符,代表任意字符,一个代表一个任意字符
{m,n}控制次数
*零个到多个:
+一个到多个:
create user'xiaoming'@'%' identified by '123456';
grant select on test.student to 'xiaoming'@'%';
flush privileges;
测试:
以新用户登录即可,只拥有指定数据库,表的指定权限:
mysql -uxiaoming -p123456
use mysql;
update user set user = 'xm' where user = 'xiaoming';
别忘了刷新权限:
flush privileges;
set password for 'xm'@'%' = password('1234567');
刷新下权限:
flush privileges;