您的位置:首页 > 数据库 > MySQL

MySql 使用详解(2)

2015-08-06 21:48 711 查看
今天继续讨论MySql 高级应用,通常情况下,我们使用数据库操作表的时候,可能对

某些字段有一些特定的要求,比如非空啊, 默认值啊,这时候就可以在数据表上面添加约束了。

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

1,默认值约束

创建一个表,包含2个字段,并指定默认值:

default 关键字



从上面图中可以看出我创建表的时候给gender字段添加了默认值约束,在插入的时候

没写入该字段数据,默认就会有一个值。

2,非空约束

not null 关键字 非空约束,不能不插入数据,不能插入null







上图中创建表的时候使用了非空约束,插入数据的时候如果没有该字段会报异常:

Field 'NAME' doesn't have a default value

3,唯一约束

unique 关键字





上图中给test 中的字段 id 添加了唯一约束,插入一条数据之后,再插入一条相同的id的记录

就会报异常:Duplicate entry '1' for key 'id'

4,主键约束

primary key (唯一+ 非空)

通常情况下,我们会给每张表设置一个主键字段,用来标记记录的唯一性,但是不建议把

业务字段做为主键,因为随着业务的变化,业务字段可能会出现重复。建议每个表添加一个

id字段,把id字段设置为主键。





上图演示了主键约束的唯一性和非空性

5,自增长约束

auto_createment 关键字,添加该字段之后每插入一条记录,会为该条记录产生一个

自增长的数据,通常和主键一起使用,当 truncate table 之后该数据才会重置为 0 。

6,外键约束

外键约束是值当出现2张表的情况下,在一张表中存在冗余字段的时候使用,比如 员工表中

出现部门名称的情况,每个员工都有一个部门,部门字段包含几个中文,这种情况就是数据冗余,

我们可以将部门名称放在一个独立的表中,然后为每个部门设置一个部门id ,在员工表中只需要

填入该部门id即可, 在这样的情况下,在员工表中的部门id和 部门表的部门id 就产生了关系,

我们需要添加约束才能对保证这2个数据的关联性,防止非法数据进入。 (比如,部门表中没

有id为1 的部门,但是却在员工表中插入了一个员工,他的部门id为1,这为非法数据)。

语法为 :

CONSTRAINT 外键名称 FOREIGN KEY(表中字段) REFERENCES 另一个表名(另一个表中的关联字段)。

例如:

CREATE TABLE employee(

id INT PRIMARY KEY AUTO_INCREMENT,

NAME VARCHAR(20),

deptId INT,

CONSTRAINT employee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id)

)

CREATE TABLE dept(

id INT PRIMARY KEY AUTO_INCREMENT,

NAME VARCHAR(20)

)

如上面两个表,其中约束另一个表的表称为主表(dept),被约束的表称为叫副表(employee)

外键约束在什么情况下,会产生如下作用?

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

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

-- 删除数据: 副表中有关联主表的数据的时候,当删除主表数据,外键其作用

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

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

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

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

7,级联技术

级联: 当有了外键的时候,我们希望修改或删除数据的时候,修改或删除了主表的数据,

同时能够影响副表的数据,这时就可以使用级联。

-添加联级修改 : on update cascade

-添加联级删除 : on delete cascade

8,数据库设计的三大范式

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



         意思就是不能在一个字段表达多个意思,例如现用名和曾用名,不能写在同

         一个字段内,要分开写。

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

         有依赖关系(一张表只能表达一个意思)

         举个例子:

           员工表:employee

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

[b]         [/b]订单名称和员工编号没有依赖关系(员工编号并不能决定订单名称)

 
    第三范式:要求在第二范式基础上,表中除主键以外的所有字段都只能和

         主键有依赖关系(直接决定的关系)

            员工表:employee

员工编号 员工姓名 部门编号 部门名称 --违反第三范式

部门名称只由部门编号决定,不是由员工编号决定

通常情况下,数据库表的设计都要遵循第一二范式,第三范式会根据数据存储空间和

访问速度进行调整

9,多表查询

交叉连接查询

SELECT employee.name,dept.name FROM employee,dept;

通常结果为笛卡尔积 ,原因是没有筛选条件。

内连接查询



SELECT e.name,d.nameFROM employee e,dept dWHERE e.deptId=d.id;

另一种语法

SELECT e.name,d.nameFROM employee eINNER JOIN dept dON e.deptId=d.id;

左外连接查询

需求: 查询部门及其部门的员工(部门全部显示)

左外连接查询效果: 左表(部门表)的数据全部显示,右表(员工)

的数据当满足连接条件的时候,就显示满足条件的的数据,但是如果不满足

连接条件,则显示null

SELECT d.name,e.name

FROM dept d

LEFT OUTER JOIN employee e

ON d.id=e.deptId;

右外连接查询

右外连接查询效果: 右表(部门表)的数据全部显示,左表(员工)的数据

当满足连接条件的时候,就显示满足条件的数据,但是如果不满足连接条件,则显示null

SELECT d.name,e.name

FROM employee e

RIGHT OUTER JOIN dept d

ON d.id=e.deptId;

自连接查询

需求: 查询员工姓名及其上司姓名(没有上司的员工也显示)

SELECT e.name AS '员工',b.name AS '上司'

FROM employee e

LEFT OUTER JOIN employee b

ON e.bossId=b.id;

以上就是使用MySql数据库的一些总结了,还有一些内容没写出来,主要一般情况下掌握这些知识就行了,

不同的数据库,也有不同的语法,我这里知识有限,就写不出来了。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: