02 mysql 基础二 (进阶)

Posted zcmq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了02 mysql 基础二 (进阶)相关的知识,希望对你有一定的参考价值。

mysql 基础二

阶段一 表约束

1、not null 非空约束

例子:

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

注意 空字符不等于null

#手动,添加非空约束 (必须这个字段,没有NULL值)
mysql> alter table tb1
    -> modify id int not null;
 
# 取消非空约束
mysql> alter table tb1
    -> modify id int ;
2、unique key 唯一约束

例子:

create table tb2(
    id int unique key,
    name varchar(20)
);
?
# 确保字段中的值的唯一 

#添加唯一约束
?
mysql> alter table tb2
    -> add unique key(name)
    ->;

#删除唯一约束
?
mysql> alter table tb2
    -> drop key name;
3、主键约束 primary key

主键的作用:可以唯一标识一条数据,每张表里面只能有一个主键,。主键的主要目的是帮助MySQL以最快的速度查找到表中的某一条信息

主键特性:非空且唯一。当表里没有主键的时,第一个出现的非空且为唯一的列,被当成主键。

例子:

create table tb3( 
   id int primary key,
   name varchar(20) not null
); 

#删除主键约束
?
mysql -> alter table tb3
      -> drop primary key;
4、自增长 auto_increment

auto_increment :自动编号,一般与主键组合使用。一个表里面只有一个自增默认情况下,起始值为1,每次的增量为1。

例子:

create table tb5(
   id intprimary key auto_increment,
   name varchar(20)
)auto_increment=100;

#删除自动增长
?
mysql> alter table tb5
    -> modify id int;

#增加自动增长auto_increment
?
mysql> alter table tb5
    -> modify id int auto_increment;
5、默认约束 default

default :初始值设置,插入记录时,如果没有明确为字段赋值,则自动赋予默认值。

例子:

create table tb6(
  id int primary key auto_increment,
  name varchar(20) not null,
  age int not null default 18
);

# 删除default
?
mysql> alter table tb6
    -> modify age int;

# 手动添加default
?
mysql> alter table tb6 
    -> modify age int default 20;
6、外键约束 foreign key

外键约束 :保持数据一致性,完整性实现一对多关系。

外键必须关联到键上面去,一般情况是,关联到另一张表的主键

(因为一个表只存一类信息。用外键来做参照,保证数据的一致性,可以减少数据余)

##表a
?
create table a( 
   a_id int primary key auto_increment,
   a_name varchar(20) not null
);
?
insert into a values(1,a1),(2,a2);
?
##表b
?
create table b(
   b_id int primary key,
   b_name varchar(20) not null,
   fy_id int not null,
   constraint AB_idforeign key(fy_id)references  a(a_id)
);
?
insert into b value(1,aa,2);

#删除外键
?
alter table  b drop foreign key AB_id;

#增加外键
?
mysql> alter table b
    -> add constraint AB_id foreign key(fy_id) references  a(a_id);

# B表中的fy_id 字段,只能添加 a_id中已有的数据。
# A表中a_id 被参照的数据,不能被修改和删除

阶段二 表关系

1、一对一关系 (学生详细)

一对一 : 用外键的方式,把两个表的主键关联

举例,学生表中有学号、姓名、学院,但学生还有些比如电话,家庭住址等比较私密的信息,这些信息不会放在学生表当中,会新建一个学生的详细信息表来存放。这时的学生表和学生的详细信息表两者的关系就是一对一的关系,因为一个学生只有一条详细信息。用主键加主键的方式来实现这种关系。

# 学生表
mysql> create table student(
    -> s_id int primary key,
    -> sex varchar(20),
    -> age int);
# 插入数据 
mysql> insert into student value(1,,22);
?
# 学生详细表
mysql> create table student_x(
    -> id int primary key,
    -> name varchar(20),
    -> foreign key (id) references student(s_id)
    -> );
# 插入数据
mysql> insert into student_x value(1,zcm);
 
# 查看
mysql> select * from student_x;
+----+------+
| id | name |
+----+------+
|  1 | zcm  |
+----+------+
?
mysql> select * from student;
+------+------+------+
| s_id | sex  | age  |
+------+------+------+
|    1 | nan  |   22 |
2、一对多关系 (学生所属学院)

? 举例,通常情况下,学校中一个学院可以有很多的学生,而一个学生只属于某一个学院。学院与学生之间的关系就是一对多的关系,通过外键关联来实现这种关系。

注意:学生表中 只能添加 ,已有的学院id

##创建学院表
create table department( 
   d_id int primary key auto_increment,  # 学院id
   d_name varchar(20) not null      # 学院名
);
?
##创建学生表
create table student(
   s_id int primary key auto_increment,   # 学生id
   s_name varchar(20) not null,                     # 学生名字
   dept_id int not null,            #  所属学院 id
   constraint SD_id foreign key(dept_id) references department(d_id)   #外键
);
?
# 插入数据
insert into department values(1,外语学院),(2,计算机学院);
insert into student values(1,‘张三,2),(2,‘李四,1);
?
# 查看
mysql> select * from department;
+------+-----------------+
| d_id | d_name          |
+------+-----------------+
|    1 | 外语学院        |
|    2 | 计算机学院      |
+------+-----------------+
?
mysql> select * from student_1;
+------+--------+---------+
| s_id | s_name | dept_id |
+------+--------+---------+
|    1 | 张三   |       2 |
|    2 | 李四   |       1 |
+------+--------+---------+
3、 多对多关系 (学生选课)

? 举例,学生要报名选修课,一个学生可以报名多门课程,一个课程有很多的学生报名,那么学生表和课程表两者就形成了多对多关系。对于多对多关系,需要创建中间表 实现。

# 建立学生表
mysql> create table student_d(
    -> s_id int primary key auto_increment,
    -> s_name varchar(20) not null
    -> );
?
# 建立课程表
mysql> create table cours(
    -> cours_id int primary key auto_increment,
    -> cours_name varchar(20) not null
    -> );
?
# 选课表(中间表)
mysql> create table ele(
    -> s_id int,        # 用来记录学生id
    -> cours_id int,    # 用来记录课程id
    -> primary key(s_id,cours_id),      # 联合主键
    -> foreign key(s_id) references student(s_id),      # 关联学生id
    -> foreign key(cours_id) references cours(cours_id)     # 关联课程id
    -> );
?
# 插入数据
insert into student_d values(1,张三),(2,李四),(3,王六);
insert into cours values(1,python编程),(2,大学英语),(3,音乐鉴赏);
insert into ele values(1,3),(2,1),(3,2);
?
# 查看
mysql> select * from student_d;
+------+--------+
| s_id | s_name |
+------+--------+
|    1 | 张三   |
|    2 | 李四   |
|    3 | 王六   |
+------+--------+
3 rows in set (0.00 sec)
?
mysql> select * from cours;
+----------+--------------+
| cours_id | cours_name   |
+----------+--------------+
|        1 | python编程   |
|        2 | 大学英语     |
|        3 | 音乐鉴赏     |
+----------+--------------+
3 rows in set (0.00 sec)
?
mysql> select * from ele;
+------+----------+
| s_id | cours_id |
+------+----------+
|    2 |        1 |
|    3 |        2 |
|    1 |        3 |
+------+----------+
3 rows in set (0.00 sec)


以上是关于02 mysql 基础二 (进阶)的主要内容,如果未能解决你的问题,请参考以下文章

我的Android进阶之旅NDK开发之在C++代码中使用Android Log打印日志,打印出C++的函数耗时以及代码片段耗时详情

Kotlin基础从入门到进阶系列讲解(基础篇)Fragment的基本使用

Kotlin基础从入门到进阶系列讲解(基础篇)Fragment的基本使用

lyt经典版MySQL基础——进阶2:条件查询

MySQL破冰之旅第二篇

mysql基础进阶