1.数据约束:给表添加数据约束,从而约束用户操作数据的行为。
2.默认值约束:当被约束的字段没有值插入时,会自动分配一个默认值。
CREATE TABLE student(
NAME VARCHAR(20),
gender VARCHAR(2)DEFAULT '男'
);
INSERT INTO student(NAME) VALUES('jack');
INSERT INTO student(NAME,gender) VALUES('van',NULL);
SELECT*FROM student;
只要插入数据,哪怕数据为空,也会覆盖该默认值。
3.非空约束:要求被约束的字段一定要有值,不能为null,不能不插入。
CREATE TABLE student(
NAME VARCHAR(20)NOT NULL,
gender VARCHAR(2)
);
4.唯一约束:被约束的字段不能插入重复的值,但是可以插入多个null,所以该约束不能约束null
CREATE TABLE student(
id INT UNIQUE ,
NAME VARCHAR(20)
);
INSERT INTO student VALUES(1,'asd');
INSERT INTO student VALUES(NULL,'sdf');
INSERT INTO student VALUES(NULL,'qwe');
SELECT * FROM student;
5.主键约束:被约束的字段唯一+非空。因此一般给每张表添加一个id字段设置成主键作为记录的唯一性。
CREATE TABLE student(
id INT UNIQUE ,
NAME VARCHAR(20)
);
INSERT INTO student VALUES(1,'asd');
INSERT INTO student VALUES(NULL,'sdf');
INSERT INTO student VALUES(NULL,'qwe');
SELECT * FROM student;
6.自增长约束:初始值为0,每次新添加一条数据,被约束的字段自加1.
CREATE TABLE student(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20)
);
一般设置id为自增长,就不用我们手动进行输入。
7.数据删除:TRUNCATE TABLE student; 该指令会删除表中数据,并使系统的自增长值置零,不会删除该表。
8.外键约束:有时根据需要,我们在创建表时会出现数据冗余的情况,即相对较长的数据在表中频繁出现,此时可以
用第二张表来关联第一张表中的数据,这时就需要用到外键约束。
CREATE TABLE employee(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
idDept INT ,-- 与部门相连的部门id
CONSTRAINT employee_dept_fk FOREIGN KEY(idDept) REFERENCES dept(id)
-- 创建外键: 外键名称 外键字段 参考
);
-- 创建部门表 约束员工的表
CREATE TABLE dept(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20)
);-- 创建时先创建主表(部门表),在创建附表(员工表)
约束情况:A:向附表中插入主表不存在的数据时,外键报错。
B:附表中修改为主表不存在数据时,外键报错。
C:在附表中有关联主表数据的情况下删除主表数据时,外键报错。
对应操作:A:插入数据时先插入主表数据,在插入附表数据。
B:修改数据时先修改主表数据,在修改附表数据。
C:删除数据时先删除附表数据,再删除主表数据。
9.级练技术:在拥有外键的情况下,可以使我们在修改或删除主表数据的情况下,同时影响附表的数据。
CREATE TABLE employee(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
idDept INT ,
CONSTRAINT employee_dept_fk FOREIGN KEY(idDept) REFERENCES dept(id) ON UPDATE CASCADE ON DELETE CASCADE
-- ON UPDATE CASCADE(修改级联) ON DELETE CASCADE(删除级联)
);
10.数据库设计:第一范式:要求表的每个字段必须时独立的不可分割的一个单元,即不能把多个字段的内容放在一个
字段中合并。
第二范式:在第一范式的基础上,要求表的除主键以外的字段都和主键有依赖关系,即一张表只能表
示一个意思。
第三范式:在第二范式的基础上,要求表的除主键外的字段都只能和主键有直接决定的依赖关系。
11.多表查询:交叉连接查询:因为没有足够的连接条件而产生笛卡尔乘积。
SELECT dept.name,employee.name FROM dept,employee;
内连接查询:SELECT dept.name,employee.name FROM dept,employee WHERE
employee.idDept=dept.id;
左外连接查询:左表数据全显示,右表数据满足就显示,不满足显示null。
SELECT d.name,e.name FROM dept d LEFT OUTER JOIN employee e ON d.id=e.idDept;
右外连接查询:右表数据全部显示,左表满足连接就显示。
SELECT d.name,e.name FROM employee e RIGHT OUTER JOIN dept d ON d.id=e.idDept;
自连接查询:SELECT e.name AS '员工',b.name AS '上司' FROM employee e LEFT OUTER JOIN
employee b ON e.bossId=b.id;
12.Mysql存储过程:
创建存储过程
-- 定义结束符号
DELIMITER 结束符号
CREATE PROCEDURE 存储过程名称 (形式参数列表)
BEGIN
多个sql语句
END 结束符号
-- 调用存储过程
CALL 存储过程名称(实际参数列表);
参数类型:
IN: 输入参数,可以携带数据到存储过程中
OUT: 输出参数,可以携带数据到存储过程外面。
INOUT: 输入输出参数。13. 带有输入参数的存储过程:
DELIMITER $-- 输入id查看员工信息
CREATE PROCEDURE pro_testid(IN ide INT)
BEGIN
SELECT * FROM employee WHERE id=ide;
END $
CALL pro_testid(2);
14. 带有输出参数的存储过程:
DELIMITER $ -- 输出信息
CREATE PROCEDURE pro_testout(OUT n VARCHAR(30))
BEGIN
SET n='long may the sunshine';
END $
-- 可以用SET @n 改变会话变量的值
-- 定义会话变量接收输出参数
CALL pro_testout(@n);
SELECT @n;
15.存储过程的语句:
条件判断语句:
DELIMITER $
CREATE PROCEDURE pro_testByIf(IN num INT,OUT str VARCHAR(20))
BEGIN
IF num=1 THEN
SET str = '星期一';
ELSEIF num= 2 THEN
SET str ='星期二';
ELSEIF num=3 THEN
SET str = '星期三';
ELSE
SET str = '错误参数';
END IF;
END $
循环语句:
DELIMITER $
CREATE PROCEDURE pro_testwhile(IN num INT,OUT SUM INT)
BEGIN
DECLARE i INT DEFAULT 1; -- 定义局部变量
DECLARE result INT DEFAULT 0;
WHILE i<num DO
SET result=result+i;
SET i=i+1;
END WHILE;
SET SUM=result;
END $
-- 调用方法求和
CALL pro_testwhile(153,@n);
SELECT @n;
16.触发器(不是数电= =):当往员工表插入,删除,修改一条数据时,同时往日志表记录下来,就要使用触发器
-- 创建员工日志表
CREATE TABLE emp_log(
id INT PRIMARY KEY AUTO_INCREMENT,
DO VARCHAR(50)
);
-- 创建增加触发器
CREATE TRIGGER tri_empadd AFTER INSERT ON employee FOR EACH ROW
INSERT INTO emp_log(DO)VALUES('增加了一条数据');
-- 创建修改触发器
CREATE TRIGGER tri_empupd AFTER UPDATE ON employee FOR EACH ROW
INSERT INTO emp_log(DO)VALUES('修改了一条数据');
-- 创建删除触发器
CREATE TRIGGER tri_empdel AFTER DELETE ON employee FOR EACH ROW
INSERT INTO emp_log(DO)VALUES('删除了一条数据');
INSERT INTO employee(NAME,idDept)VALUES('qwe',3);
UPDATE employee SET NAME='saber'WHERE id=2;
DELETE FROM employee WHERE id =5;
SELECT *FROM employee;
SELECT *FROM emp_log;