mysql数据库3

数据约束

 

默认值约束

当用户对使用默认值的字段不插入值的时候,就使用默认值。

注意:1)对默认值字段插入null是可以的。

  2)对默认值字段可以插入非null
CREATE TABLE teacher(
    tid INT,
    tname VARCHAR(12),
    addr VARCHAR(20) DEFAULT '张店区'
)
INSERT INTO teacher VALUES(1,'小红帽','博山区');
INSERT INTO teacher(tid,tname) VALUES(2,'大灰狼');
INSERT INTO teacher VALUES(3,'外婆',NULL);
SELECT * FROM teacher
DROP TABLE teacher

非空约束

限制字段必须赋值

 

 

注意:1)非空字符必须赋值

  2)非空字符不能赋null
CREATE TABLE teacher(
    tid INT,
    tname VARCHAR(12) NOT NULL,
    addr VARCHAR(20) DEFAULT '张店区'
)
INSERT INTO teacher VALUES(1,'小红帽','博山区');
-- Field 'tname' doesn't have a default value
INSERT INTO teacher(tid,addr) VALUES(2,'淄川区');
-- Column 'tname' cannot be null
INSERT INTO teacher VALUES(3,NULL,'临淄区');
SELECT * FROM teacher

-- 唯一约束

对字段的值不能重复

注意:1)唯一字段可以插入null

  2)唯一字段可以插入多个null
CREATE TABLE teacher(
    tid INT,
    tname VARCHAR(12) NOT NULL,
    idcard VARCHAR(20) UNIQUE,
    addr VARCHAR(20) DEFAULT '张店区'
)
INSERT INTO teacher VALUES(1,'小红帽','370303x','淄川区');
INSERT INTO teacher VALUES(2,'小蓝帽','370303x','临淄区');
-- 允许存入null值,允许存入多个null值
INSERT INTO teacher VALUES(3,'小白帽',NULL,'博山区');
INSERT INTO teacher VALUES(4,'小黑帽',NULL,'博山区');
SELECT * FROM teacher

-- 主键约束

非空+唯一

注意:1)通常情况下,每张表都会设置一个主键字段。用于标记表中的每条记录的唯一性。

  2)建议不要选择表的包含业务含义的字段作为主键,建议给每张表独立设计一个非业
CREATE TABLE teacher(
    tid INT PRIMARY KEY,
    tname VARCHAR(12) NOT NULL,
    idcard VARCHAR(20) UNIQUE,
    addr VARCHAR(20) DEFAULT '张店区'
)
INSERT INTO teacher VALUES(1,'小红帽','370303x','博山区');
-- Duplicate entry '1' for key 'PRIMARY'
INSERT INTO teacher VALUES(1,'小白帽','370303y','博山区');
-- Column 'tid' cannot be null
INSERT INTO teacher VALUES(NULL,'小白帽','370303y','博山区');

SELECT * FROM teacher
DROP TABLE teacher


-- 自增长约束(主键的基础上)

自动递增

自增长字段可以不赋值,自动递增
CREATE TABLE teacher(
    tid INT PRIMARY KEY AUTO_INCREMENT,
    tname VARCHAR(12) NOT NULL,
    idcard VARCHAR(20) UNIQUE,
    addr VARCHAR(20) DEFAULT '张店区'
)
INSERT INTO teacher(tname,idcard) VALUES('小红帽','370303x');
INSERT INTO teacher(tname,idcard) VALUES('小蓝帽','370303y');
INSERT INTO teacher(tname,idcard) VALUES('小蓝帽','370303z');
-- 清空表
DELETE FROM teacher
TRUNCATE TABLE teacher


INSERT INTO teacher VALUES(10,'小小帽','370303y','博山区');
INSERT INTO teacher(tname,idcard) VALUES('小蓝帽','370303z');

SELECT * FROM teacher

DROP TABLE teacher

-- 零填充(自增长约束的基础上)
CREATE TABLE teacher(
    tid INT(5) ZEROFILL PRIMARY KEY AUTO_INCREMENT,
    tname VARCHAR(12) NOT NULL,
    idcard VARCHAR(20) UNIQUE,
    addr VARCHAR(20) DEFAULT '张店区'
)

INSERT INTO teacher(tname,idcard) VALUES('小红帽','370303x');
INSERT INTO teacher(tname,idcard) VALUES('小蓝帽','370303y');
INSERT INTO teacher(tname,idcard) VALUES('小蓝帽','370303z');
SELECT * FROM teacher

-- 外键约束

约束两种表的数据

出现两种表的情况:

解决数据冗余高问题: 独立出一张表

如: 员工表  和  部门表

问题出现:在插入员工表数据的时候,员工表的部门ID字段可以随便插入!!!!!

使用外键约束:约束插入员工表的部门ID字段值

解决办法: 在员工表的部门ID字段添加一个外键约束。

注意1)被约束的表称为副表,约束别人的表称为主表,外键设置在副表上的!!!

  2)主表的参考字段通用为主键!

  3)添加数据: 先添加主表,再添加副表

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

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


-- 创建主表
CREATE TABLE dept(
    did INT PRIMARY KEY AUTO_INCREMENT,
    dname VARCHAR(10),
    mgr VARCHAR(10)
)
-- 创建副表
CREATE TABLE emp(
    eid INT PRIMARY KEY AUTO_INCREMENT,
    ename VARCHAR(10),
    esex CHAR(5),
    edate DATE,
    money DOUBLE,
    did INT, -- 外键
    CONSTRAINT emp_dept_fk FOREIGN KEY(did)
    REFERENCES dept(did)  -- 外键约束
)
-- 添加数据(先添加主表,再添加副表)
INSERT INTO dept(dname,mgr) VALUES('开发部','tom');
INSERT INTO dept(dname,mgr) VALUES('测试部','jerry');
INSERT INTO dept(dname,mgr) VALUES('产品部','tony');

INSERT INTO emp(ename,esex,edate,money,did) VALUES('张三','男','1999-09-09',6000,1);
INSERT INTO emp(ename,esex,edate,money,did) VALUES('李四','女','1995-05-05',4500,1);
INSERT INTO emp(ename,esex,edate,money,did) VALUES('王五','男','2006-06-06',5000,2);
INSERT INTO emp(ename,esex,edate,money,did) VALUES('赵六','男','2002-02-02',3000,3);
SELECT * FROM emp
SELECT * FROM dept
-- 修改数据(先改副表,在改主表)
UPDATE emp SET did=1 WHERE did=3
UPDATE dept SET did=4 WHERE did=3
-- 删除数据(先删副标在删主表)
DELETE FROM emp WHERE did=2
DELETE FROM dept WHERE did=2

 

 

连接查询(多表查询)

连接就是指两个或2个以上的表(数据源)“连接起来成为一个数据源”。

实际上,两个表的完全的连接是这样的一个过程:

左边的表的每一行,跟右边的表的每一行,两两互相“横向对接”后所得到的所有数据行的结果。

注意:连接之后,并非形成了一个新的数据表,而只是一种“内存形态”。


-- 交叉连接
SELECT * FROM emp JOIN dept
-- 内连接
SELECT * FROM emp JOIN dept ON emp.did=dept.did
-- 查询李四的部门经理
SELECT mgr FROM emp JOIN dept ON emp.did=dept.did WHERE ename='李四'
-- 查询测试部产品部员工名称
SELECT ename FROM emp JOIN dept ON emp.did=dept.did WHERE dname='产品部'
-- 查询所有男生所属的部门信息
SELECT dname FROM emp JOIN dept ON emp.did=dept.did WHERE esex='男'
-- 左外连接
SELECT * FROM dept LEFT JOIN emp ON dept.did=emp.did
-- 右外连接
SELECT * FROM emp RIGHT JOIN dept ON emp.did=dept.did

上一篇:2022展望(下):来年区块链行业最具潜力的赛道有哪些?


下一篇:phpunit: This test did not perform any assertions