1.数据库的约束
约束:约束用户操作数据表的一种行为
1.默认约束 default:没有插入数据默认字段值
当前操作表,如果没有插入字段值,默认约束插入字段值
2.非空约束 not null:字段值不能为空
3.唯一约束 unique:约束字段值不能重复
删除唯一约束:alter table 表名 drop index 唯一约束所在字段名称
4.主键约束 primary key:非空且唯一
删除主键约束:alter table 表名 drop primary key;
也要删除非空约束
5.自增长约束 auto_increment:一般和主键约束一起使用,主键是自增长的,一般不需要插入
mysql提供函数:select last_insert_ID():查询到最后一次自增长主键的id值
6.外键约束 foreign key
外键所在的表---从表,在从表加入外键约束
constraint --声明
格式: constraint --声明
外键名称 ---命名规则:主表_fk_从表
foreign key 外键名称作用在指定的外键字段
references 关联主表id
例子:
CREATE TABLE employee(
id INT PRIMARY KEY AUTO_INCREMENT, -- 员工编号
NAME VARCHAR(20), -- 员工名称
age INT, -- 员工年龄
gender VARCHAR(5), -- 员工性别
dept_id INT, -- 部门id号
CONSTRAINT -- 声明
dept_employee_fk -- 后面跟外键名称 (命名规范:主表名_从表名_fk)
FOREIGN KEY (dept_id) -- 外键名称作用在指定的外键字段
REFERENCES -- -- 关联
dept(id) -- 主表的主键id
);
删除外键约束
alter table 表名 drop foreign key 外键名称
通过sql将外键约束加上
alter table 表名 add constraint 外键名称
foreign key 外键名称作用在指定的外键字段名称
references 主表主键id
7.级联修改和级联删除 cascade :当修改或者删除主表的时候,和主表相关联的表也会发生改变
(在外键约束的基础之后加入)
级联修改 on update cascade
级联删除 on delete cascade
例:
-- 通过sql语句,加入外键约束以及级联删除和级联修改
ALTER TABLE employee
ADD CONSTRAINT
dept_employee_fk
FOREIGN KEY
(dept_id)
REFERENCES
dept (id)
ON UPDATE CASCADE -- 级联修改
ON DELETE CASCADE ; -- 级联删除
-- 现在更改部门表的id=4的部分--->id 为3
UPDATE dept SET id = 3 WHERE id = 4 ;
-- 将id为3的产品部删除,在产品部的员工也随之删除!
DELETE FROM dept WHERE id = 3 ;
2.数据库的备份和还原
1.图形界面化的方式:sqlyog(其中一种)
(1)备份:选中库--->右键--->backup/export--->以sql转存文件导出到指定目录中--->
(2)还原:在root@localhost--->右键--->import--->选择execute sql script(执行sql脚本)--->找到sql脚本路径
2.命令行的方式
(1)备份的命令行方式:管理员身份运行dos控制台--->mysqldump -root -p123456 备份文件名 > 备份路径名
(2)还原的命令行方式:
将原来的库删除
创建一个新的库
使用这个库:source 备份的路径名
3.表和表的关系
1.一对一:一个人一个身份id
一对多:一个用户可以有多个订单
多对多:一个学生可以选择多门课程,一个课程可以被多个学生选择
4.数据库的三大范式(设计关系型数据库)
三者层层递进关系
1. 1NF
在设计数据库时,该库中的每一列是不可拆分的原子数据项
特点:每一列都是独立的,不能再拆分
2. 2NF
在1NF基础上,非主键的列完全依赖于主键列
特点:一张表描述一件事情
这张表中其他的非主键必须完全依赖于主键字段
3. 3NF
在2NF基础上,非主键的列不能产生传递依赖主键列
主键列--->x非主键类--->y非主键类,则y主键列依赖于主键列
针对多对多关系:
可以设置中间表,设置两个外键分别关联其它两个表
5.多表查询
笛卡尔乘积:A表有m条数据,B表有n条数据,查询共有m*n条记录
1.解决方法:
操作步骤:
(1)查询那些表
(2)查询那些字段
(3)这些表之间的关系:连接条件是什么
2.内连接查询
显式内连接:inner join
select 字段列表 from 表名1 (inner) join 表名2 on 连接条件
隐式内连接:使用 where 语句
select 字段列表 from 表名1,表名2 where 表名1
的某个字段 = 表名2.某个字段;
3.外连接查询
左外连接:将左表全部数据以及连接条件的数据查询出来
select 字段列表 from 左表 left outer join 右表 on 连接条件
右外连接:right outer join
4.子查询
(1)利用聚合函数以及比较运算符进行select语句的嵌套
SELECT *
FROM emp
WHERE salary =
(SELECT
MAX(salary)
FROM
emp) ;
(2)利用in集合数据
SELECT *
FROM
emp e
WHERE e.`dept_id` IN
(SELECT
d.id
FROM
dept d
WHERE d.`NAME` = '市场部'
OR d.`NAME` = '财务部'
) ;
(3)将某个查询语句的结果---多行多列--->看作"虚表"和其他表进行关系查询