Mysql数据库知识点(二)

编程菜鸟互助学习圈,一起学编程

前面中我们学习了

Mysql数据库知识点(一)

,今天二妹子和大家接着学习。

5

数据约束

(给表添加数据约束,从而约束用户操作表数据的行为)

1)默认值约束(default)

create table test(

name varchar(20),

gender varchar(20) default ‘男’

)

需求:当不插入gender的时候,分配一个‘男’的默认值

注意:1)当没有插入gender字段的时候,分配一个默认值

2)非空约束(not null)

create table test(

name varchar(20) not null,

gender varchar(20)

)

需求;name字段一定要有值(不能不插入数据,不能是null),这是给name添加非空约束

1)非空约束,不能不插入值

Insert into test(gender) values(‘男’);

2)非空约束,不能插入null

Insert into test(name,gender) values(null,’男’);

3)唯一约束(unique)

create table test(

Id int unique,

name varchar(20)

)

需求:id的值不能出现重复。这时就要给id添加一个唯一约束

1)不能插入重复的值

2)唯一约束,可以插入多个null。所以唯一约束不能约束null

Insert into test(id,name) values(1,’张三’);

4)主键约束(primary key)(唯一+非空)

注意;

1)通常情况下,我们会给每张表都设置一个主键字段,用来标记记录的唯一性

2)但是不建议把业务含义字段作为主键,因为随着业务的变化,业务字段可能出现重复

3)建议给每张表都独立添加一个叫id的字段,把这个id字段设置成主键,用来作为记录的唯一性

create table test(

Id int primary key,

name varchar(20)

)

1)唯一性

2)非空性

5)自增长约束(auto_increment)

create table test(

Id int primary key auto_increment,

name varchar(20)

)

自增长约束:初始值为0,每次递增1

使用truncate table 删除数据的时候,可以把自增长的初始值置为0

6)外键约束

员工表(副表:被别的表约束的表,外键设置在副表)

Create table employee(

Id int primary key auto_increment,

name varchar(20),

deptId int,

添加外键约束(foreign key)

Constraint employee_dept_fk foreign key(deptId) references dept(id)

外键名 外键字段

)

部门表(主表:约束别人的表)

Create table dept(

Id int primary key auto_increment,

Name varchar(20)

)

外键约束在什么情况下会起作用?

插入数据:当往副表插入了主表中不存在的数据时,外键起作用

修改数据:当往副表中修改主表中不存在的数据时,外键起作用

删除数据:副表中有关联主表数据的情况下,当删除主表数据时,外键起作用

当有了外键之后,应该如何管理数据呢?

插入数据:先插入主表的数据,再插入副表数据

修改数据:先修改主表数据,再修改副表数据

删除数据:先删除副表数据,再删除主表数据

7)级联技术(cascade)

级联:当有了外键的时候,我们希望修改或删除数据的时候,修改或删除主表数据时,同时能够影响副表的数据,这时就可以使用级联

Create table employee(

Id int primary key auto_increment,

name varchar(20),

deptId int,

添加外键约束(foreign key)

添加级联修改:on update cascade

添加级联修改:on delete cascade

Constraint employee_dept_fk foreign key(deptId) references dept(id) on update cascade on delete cascade

外键名 外键字段

);

部门表(主表:约束别人的表)

Create table dept(

Id int primary key auto_increment,

Name varchar(20)

);

6

数据库设计三大范式:

第一范式;要求表的每个字段必须独立的不可分割的单元

学生表: student name ---违反第一范式

张三|狗娃

王涵|张小涵

查询:现用名中包含‘张’的学生

Select * from student where name like ‘%张%’;

学生表: student name old_name ---符合第一范式

张三 狗娃

王涵 张小涵

第二范式:在第一范式的基础上,要求表的除主键以外的字段都和主键有依赖关系

一张表只表达一个意思

员工表:employee

员工编号 员工姓名 部门名称 订单名称 ---违反第二范式

员工表:employee

员工编号 员工姓名 部门名称 ---符合第二范式

订单表:

订单编号 订单名称

第三范式:在第二范式的基础上,要求表的除主键以外的字段都只能和主键有直接决定的依赖关系

员工表:employee

员工编号 员工姓名 部门编号 部门名称 ---违反第三范式(出现数据冗余)

1 张三 1 软件开发部

2 李四 1 软件开发部

员工表:employee

员工编号 员工姓名 部门编号 ---符合第三范式

1 张三 1

2 李四 1

部门表:dept

部门编号 部门名称

1 软件开发部

7

多表查询

1.交叉连接查询(笛卡尔乘积:4*3=12,产生笛卡尔积的原因是没有足够的连接条件)(一般不用)

需求:查询员工及其部门名称

SELECT employee.name,dept.name

FROM employee,dept;

2.内连接查询(使用最多)

多表查询的步骤:1)确定查询哪些表

2)确定查询哪些字段

3)确定连接条件(规则:条件=表数量-1)

SELECT employee.name,dept.name

FROM employee,dept

WHERE employee.deptId=dept.id;

另一种语法

SELECT e.name,d.name

FROM employee e

INNER JOIN dept d

ON e.deptId=d.id;

3.左外连接查询(左表数据全部显示,如果右边不满足,则显示null)

需求:查询部门及其部门的员工

SELECT d.name,e.name

FROM dept d

LEFT OUTER JOIN employee e

ON d.id=e.deptId;

4.右外连接查询(右表数据全部显示,如果左边不满足,则显示null)

SELECT d.name,e.name

FROM employee e

RIGHT OUTER JOIN dept d

ON e.deptId=d.id;

今日干货到此结束

我们下次继续啃。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180614G1PGBX00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券