核心提示:一、MYSQL约束1.默认值约束,当字段没有插入值的时候,mysql自动给该字段分配默认值。默认值的字段允许为空。对默认值字段也可以插入null。1 CREATE TABLE STUDENT(2 ID...
一、MYSQL约束
1.默认值约束,当字段没有插入值的时候,mysql自动给该字段分配默认值。默认值的字段允许为空。对默认值字段也可以插入null。
1 CREATE TABLESTUDENT(2 ID INT,3 NAME VARCHAR(20),4 ADDRESS VARCHAR(20) DEFAULT '京口区'
5 );6 INSERT INTO STUDENT (ID, NAME ) VALUES (1,'张三');7 INSERT INTO STUDENT (ID , NAME,ADDRESS ) VALUES (2,'李四' ,NULL);
2.非空约束
1 CREATE TABLESTUDENT(2 ID INT,3 NAME VARCHAR(20),4 GENDER VARCHAR(2) NOT NULL
5 );
2.1非空字段必须赋值(错误显示)
INSERT INTO STUDENT (ID , NAME) VALUES(1, '李四');
2.2不能插入null(错误显示)
INSERT INTO STUDENT (ID , NAME) VALUES (1, '张三' ,NULL);
3.唯一约束
1 CREATE TABLESTUDENT (2 ID INT UNIQUE,3 NAME VARCHAR(20)4 );5 INSERT INTO STUDENT (ID , NAME) VALUES (1, '张三');
下面语句执行发生错误
INSERT INTO STUDENT (ID , NAME) VALUES (1, '李四');
错误提示
4.主键约束(非空+唯一),通常每张表都会设置一个主键字段。用于标注表记录的唯一性。 主键一般都是没有业务含义的。
1 CREATE TABLESTUDENT(2 ID INT PRIMARY KEY,3 NAME VARCHAR(20)4 );5
6 INSERT INTO STUDENT (ID , NAME) VALUES (1, '张三');
下面语句执行显示错误
INSERT INTO STUDENT (ID , NAME ) VALUES (NULL , '李四');
错误提示
下面错误也是一种错误
INSERT INTO STUDENT (ID ,NAME ) VALUES (1, '李四');
5.自增长约束可以自动的递增
CREATE TABLESTUDENT(
IDINT PRIMARY KEYAUTO_INCREMENT,
NAMEVARCHAR(20)
);INSERT INTO STUDENT (NAME) VALUES ('张三');INSERT INTO STUDENT (NAME) VALUES ('李四');
整表数据删除,不影响自增的删除语句
DELETE FROM STUDENT;
删除表之后再次(不用再创建表),添加插入语句如图所示
删除表中所有数据,删除外键也是用这个语句。
DELETE FROM STUDENT;
再次插入数据
6.外键约束
被约束的表为副表,外键设置在副表上
eg:创建员工表(副表),创建部门表(主表),先创建主表,再创建副表
CREATE TABLEDEPT(
IDINT PRIMARY KEY,
DEPTIDVARCHAR(20)
);INSERT INTO DEPT (ID , DEPTNAME) VALUES (1, '软件设计部门');INSERT INTO DEPT (ID , DEPTNAME) VALUES (2, '人事部');INSERT INTO DEPT (ID , DEPTNAME) VALUES (3, '财务部');INSERT INTO DEPT (ID , DEPTNAME) VALUES (4, '运营部');CREATE TABLEEMPLOYEE(
IDINT PRIMARY KEYAUTO_INCREMENT,
EMPNAMEVARCHAR(20),
DEPTIDINT,CONSTRAINT EMPLOYEE_DEPT_FK FOREIGN KEY (DEPTID) REFERENCESDEPT(ID)
);INSERT INTO EMPLOYEE (EMPNAME , DEPTID) VALUES ('张三' , 1);INSERT INTO EMPLOYEE (EMPNAME , DEPTID) VALUES ('李四' , 2);INSERT INTO EMPLOYEE (EMPNAME , DEPTID) VALUES ('王五' , 3);INSERT INTO EMPLOYEE (EMPNAME , DEPTID) VALUES ('赵六' , 4);
查询两张表
7.下面进行级联关联,意味着,当主表修改时,副表也修改
修改以上表的创建语句,并重新插入新的语句
1 DROP TABLEEMPLOYEE;2
3 CREATE TABLEEMPLOYEE(4 ID INT PRIMARY KEYAUTO_INCREMENT,5 EMPNAME VARCHAR(20),6 DEPTID INT,7 CONSTRAINT EMPLOYEE_DEPT_FK FOREIGN KEY (DEPTID) REFERENCES DEPT(ID) ON UPDATE CASCADE ON DELETE CASCADE
8 );9
10 INSERT INTO EMPLOYEE (EMPNAME , DEPTID) VALUES ('张三' , 1);11 INSERT INTO EMPLOYEE (EMPNAME , DEPTID) VALUES ('李四' , 2);12 INSERT INTO EMPLOYEE (EMPNAME , DEPTID) VALUES ('王五' , 3);13 INSERT INTO EMPLOYEE (EMPNAME , DEPTID) VALUES ('赵六' , 4);
查询如图所示
修改主表的一条记录
UPDATE DEPT SET ID=5 WHERE ID=4;
主表的运行结果
副表的运行结果
--------------------------------------------------------------------------------------
二、关联查询
1.交叉查询
SELECT * FROM EMPLOYEE,DEPT;
2.内连接查询
多表查询规则:1)查询哪些表 2)确定哪些字段 3)表与表之间的查询条件(连接表的数量-1)
1 SELECTEMPNAME , dept.DEPTNAME2 FROMEMPLOYEE3 INNER JOINDEPT4 ON EMPLOYEE.DEPTID = DEPT.ID;
3.使用别名
1 SELECT EMPNAME AS '员工姓名', D.DEPTNAME AS '部门' --注意这里的D
2 FROM EMPLOYEE ASE3 INNER JOIN DEPT ASD4 ON E.DEPTID = D.ID;
4.左外连接查询,左边的数据一定会完全显示。查询时先写左表
首先我们改造一下副表
UPDATE EMPLOYEE SET DEPTID = NULL WHERE ID= 4;
如果是内连接查询则显示
如果左连接查询
1 SELECTD.DEPTNAME, E.EMPNAME2 FROM DEPT AS D --左表
3 LEFT OUTER JOIN EMPLOYEE AS E --右表
4 ON D.ID = E.DEPTID;
右连接其实和左连接一样,只是查询表的位置不同,下面是右连接,显示的和左连接的相同
1 SELECTD.DEPTNAME,E.EMPNAME2 FROM EMPLOYEE AS E--左表
3 RIGHT JOIN DEPT AS D --右表
4 ON E.ID = D.ID;
5.自连接查询,自连接查询一般应用于表数据为树状结构。
首先我们创建表并查询
1 CREATE TABLEPERSON(2 ID INT PRIMARY KEYAUTO_INCREMENT,3 NAME VARCHAR(20),4 BOSSID INT
5 );6
7 INSERT INTO PERSON (NAME,BOSSID) VALUES ('张三',NULL);8 INSERT INTO PERSON (NAME,BOSSID) VALUES ('李四',1);9 INSERT INTO PERSON (NAME,BOSSID) VALUES ('王五',2);10 INSERT INTO PERSON (NAME,BOSSID) VALUES ('赵六',3);11 INSERT INTO PERSON (NAME,BOSSID) VALUES ('李七',3);12
13 SELECT P.NAME AS '老板' ,B.NAME AS '员工'
14 FROM PERSON ASP15 RIGHT JOIN PERSON ASB16 ON P.ID = B.BOSSID;
显示结果
注意上面创建表的BOSSID的结构。关注微信号:javalearns 随时随地学Java
或扫一扫
随时随地学Java