数据库基础学习之MySQL数据库操作(三)复杂!

1.表结构修改:(alter)

修改表名: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可加可不加。

删除字段:alter table tb_name drop [column] field_name;

column可加可不加。

2.约束条件:

约束是一种限制,通过对表中的数据做出限制,来确保表中数据的完整性,唯一性。
在这里插入图片描述

(1)默认约束(default):

插入数据的时候,如果没有明确为字段赋值,则自动赋予默认值,在没有设置默认值的情况下,默认值为NULL.

create table tb( id int default ‘a’ , name varchar(20));

主动使用默认值: insert into 表名 value(default,default);

修改默认值: alter table 表名 modify 字段名 字段类型 default 新的默认值。(使用modify修改字段类型的命令修改默认值)

(2)非空约束(not null):

限制一个字段的值不能为空,Insert的时候必须为该字段赋值。如果不赋值,则使用默认值null,但规定非空,即不能为null,所以会报错。

注意:空字符不等于NULL。

create table tb( id int not null, name varchar(20));

删除非空约束,直接在后面加上null

添加非空约束:
alter table tb_name modify field_name data_type not null;

(3)唯一约束(unique key):

限制一个字段的值不重复,该字段的数据不能出现重复的。

作用:确保字段中值的唯一。

create table tb( id int unique key, name varchar(20));

删除唯一约束: drop index 字段名 on 表名;

(4)主键约束(primary key):

作用: 通常每张表都需要一个主键来体现唯一性每张表里面只能有一个主键。

特点: 主键 = 非空 + 唯一。

create table tb( id int primary key, name varchar(20));

删除主键: alter table 表名 drop primary key;

增加主键:三种方式!

  1. alter table 表名 add primary key(字段名);

    2.alter table tb_name change name new_name data_type primary key;

    3.alter table tb_name modify field_name data_type primary key;

(5)自增长约束(auto_increment):

默认值从1开始,每次在最后一个值的基础上增加1。

自动编号,和主键组合使用,一个表里面只能有一个自增长(原因:auto_increment 要求用在主键上,一张表就一个主键)

create table tb( id int primary key auto_increment, name varchar(20));

设置自增长的增长幅度: set @@auto_increment_increment = 指定步长;

重点来啦 ! ! !


(6)外键约束(foreign key):

----- 保持数据的一致性,我有的你一定有, 你没有的, 我绝对没有。

-----这里的我指副表;你指主表!!!

外键:通过外键关联两张表,必须连接另外一张表里面的主键,另外一张表就是主表,本表就是副表。

主表和副表是因为使用外键连接表才产生的概念。


···删除外键约束: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(id)代表外键表名; id2代表主键字段名。

注意:1.外键名字可以随便取,因为如果你创建表的时候就增加外键,系统默认会有一个外键名字,可以通过show create table 表名,查看。

---------2.自己的这张表连接另外一张表的主键(注意连接的一定要是主键),连接的主表里面没有的数据,添加外键的这张表里也一定不能有。

例子:(增加外键约束)
在这里插入图片描述在这里插入图片描述第一张表有主键,第二张表没主键且没在创建表的时候就增加外键约束,所以下面增加外键:
在这里插入图片描述通过命令查看创建的外键约束:
在这里插入图片描述删除外键约束:
在这里插入图片描述
在这里插入图片描述1. B表中的id_b字段,只能添加 id_a中已有的数据 。即:
插入修改规则: 主表没有的这个字段值,副表也不能有。

  1. A表中id_a 被参照的数据, 不能被修改和删除
    删除规则:先删除副表,副表里面没有的数据,主表才能删除。

在这里插入图片描述

3.表关系:

(1)一对一关系: 主键连接主键!!!

-------自己这张表的主键连接另外一张表的主键。通过外键的方式来实现!!!(给主键的字段连接外键)

第一步:第一张表的创建
在这里插入图片描述
在这里插入图片描述在这里插入图片描述第二步:第二张表的创建:
----------注意:通过外键关联两张表,必须连接另外一张表里面的主键,则另外一张表(student)就是主 表 ,本表data1就是副表。

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
第三步:通过外连接实现一对一:

--------------------- 这里还体现了外键约束。
在这里插入图片描述
注意:删除数据的时候:

-----要先删除副表的,再删除主表的,才能删掉 。如果直接删除主表的将报错。
在这里插入图片描述

(2)多对一(或者称一对多)关系: 非主键连接主键

------ 自己的这张表的非主键连接另外一张表的主键。通过外键的方式实现。(给非主键的字段连接外键)

第一步:创建一个没有主键的表:

--------没有主键的这张表的非主键连接另外一张有主键的表的主键。则实现了多对一。
--------- 因为:非主键可以重复,主键唯一。
在这里插入图片描述
第二步:创建一个有主键的表:
在这里插入图片描述

在这里插入图片描述在这里插入图片描述
第三步:通过外连接查看多对一:
在这里插入图片描述

(3)多对多关系:

思路是非主键连接非主键,但是外键必须连接主键,所以必须有一个中间表,负责结合两张表的主键

联合主键: (1,1)

添加联合主键:alter table 表名 add primary key(字段1,字段2);

第一步:创建第一个表:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
第三步:上面已经创建了两张表,还需要一张中间表:

-------- 这张中间表就将上面两张表都连接起来了,实现了多对多:

在这里插入图片描述上面这张图的primary key(s_id,c_id)是创建联合主键

-------foreign key(s_id) references student(id)是关联学生的id

-------foreign key(s_id) references cours(c_id)是关联课程的c_id

在这里插入图片描述在这里插入图片描述
但这样查看不直观,所以用连接查询看:
在这里插入图片描述

拓展:

1.视图:(把查询出来的结果变成一张表)

特点:可以引用多张表。是一张虚表!!!

优点:

简单化,数据所见即所得

安全性,用户只能查询或者修改他们看得到的数据

逻辑独立性,可以屏蔽真实表结构变化带来的影响。比如:如果给一张有主键的表建立视图,那么这张表的视图是没有主键的。

缺点:

性能较差,简单的查询也会变得稍微复杂

修改不方便,复杂的聚合视图基本无法修改

创建视图: create view 视图名字 as select * from 表名;

一张表形成的视图是可以进行增删改查的;对视图进行修改,对应的原表也会跟着修改。

多张表形成的视图不能进行修改操作。

删除视图: drop view 视图名字;

2.mysql正则:(regexp)

^h 意思是以h开头。

a$ 意思是以a结尾。

[^h] 意思是不是h的都可以

+是一个到多个

*是零个到多个

{m,n} 控制次数

.是通配符,任意字符。

---------------------------------使用的表:
在这里插入图片描述
找到name中含有h的:
在这里插入图片描述

找到name中以h开头的:
在这里插入图片描述

找到名字中以a结尾的:
在这里插入图片描述

只要包含h的都找到:
在这里插入图片描述

只要是name里不是h的都找到:
在这里插入图片描述在这里插入图片描述
.是通配符,代表任意字符,一个代表一个任意字符
在这里插入图片描述

在这里插入图片描述

{m,n}控制次数
在这里插入图片描述在这里插入图片描述

*零个到多个:
在这里插入图片描述
+一个到多个:
在这里插入图片描述

发布了22 篇原创文章 · 获赞 31 · 访问量 904

猜你喜欢

转载自blog.csdn.net/qq_44907926/article/details/104407541