前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MYSQL基础操作之数据约束与关联查询--Java学习网

MYSQL基础操作之数据约束与关联查询--Java学习网

作者头像
用户1289394
发布2021-07-09 11:55:28
4260
发布2021-07-09 11:55:28
举报
文章被收录于专栏:Java学习网

一、MYSQL约束

1.默认值约束,当字段没有插入值的时候,mysql自动给该字段分配默认值。 默认值的字段允许为空。 对默认值字段也可以插入null。

代码语言:javascript
复制
1 CREATE TABLE STUDENT(
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.非空约束

代码语言:javascript
复制
1 CREATE TABLE STUDENT(
2     ID INT,
3     NAME VARCHAR(20),
4     GENDER VARCHAR(2) NOT NULL
5 );

2.1非空字段必须赋值(错误显示)

代码语言:javascript
复制
INSERT INTO STUDENT (ID , NAME) VALUES(1, '李四');

2.2不能插入null(错误显示)

代码语言:javascript
复制
INSERT INTO STUDENT (ID , NAME) VALUES (1, '张三' ,NULL);

3.唯一约束

代码语言:javascript
复制
1 CREATE TABLE STUDENT (
2     ID INT UNIQUE,
3     NAME VARCHAR(20)
4 );
5 INSERT INTO STUDENT (ID , NAME) VALUES (1, '张三');

下面语句执行发生错误

代码语言:javascript
复制
INSERT INTO STUDENT (ID , NAME) VALUES (1, '李四');

错误提示

4.主键约束(非空+唯一),通常每张表都会设置一个主键字段。用于标注表记录的唯一性。  主键一般都是没有业务含义的。

代码语言:javascript
复制
1 CREATE TABLE STUDENT(
2     ID INT PRIMARY KEY,
3     NAME VARCHAR(20)
4 );
5 
6 INSERT INTO STUDENT (ID , NAME) VALUES (1, '张三');

下面语句执行显示错误

代码语言:javascript
复制
INSERT INTO STUDENT (ID , NAME ) VALUES (NULL , '李四');

错误提示

下面错误也是一种错误

代码语言:javascript
复制
INSERT INTO STUDENT (ID ,NAME ) VALUES (1, '李四');

5.自增长约束 可以自动的递增

代码语言:javascript
复制
 CREATE TABLE STUDENT(
    ID INT PRIMARY KEY AUTO_INCREMENT,
    NAME VARCHAR(20)
);
INSERT INTO STUDENT (NAME) VALUES ('张三');
INSERT INTO STUDENT (NAME) VALUES ('李四');

整表数据删除,不影响自增的删除语句

代码语言:javascript
复制
DELETE FROM STUDENT;

删除表之后再次(不用再创建表),添加插入语句如图所示

删除表中所有数据,删除外键也是用这个语句。

代码语言:javascript
复制
DELETE FROM STUDENT;

再次插入数据

6.外键约束

被约束的表为副表,外键设置在副表上

eg:创建员工表(副表),创建部门表(主表),先创建主表,再创建副表

代码语言:javascript
复制
CREATE TABLE DEPT(
    ID INT PRIMARY KEY,
    DEPTID VARCHAR(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 TABLE EMPLOYEE(
    ID INT PRIMARY KEY AUTO_INCREMENT,
    EMPNAME VARCHAR(20),
    DEPTID INT,
    CONSTRAINT EMPLOYEE_DEPT_FK FOREIGN KEY (DEPTID) REFERENCES DEPT(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.下面进行级联关联,意味着,当主表修改时,副表也修改

修改以上表的创建语句,并重新插入新的语句

代码语言:javascript
复制
 1 DROP TABLE EMPLOYEE;
 2 
 3 CREATE TABLE EMPLOYEE(
 4     ID INT PRIMARY KEY AUTO_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);

查询如图所示

修改主表的一条记录

代码语言:javascript
复制
UPDATE DEPT SET ID=5 WHERE ID=4;

主表的运行结果

副表的运行结果

--------------------------------------------------------------------------------------

二、关联查询

1.交叉查询

代码语言:javascript
复制
SELECT * FROM EMPLOYEE,DEPT;

2.内连接查询

多表查询规则:1)查询哪些表 2)确定哪些字段 3)表与表之间的查询条件(连接表的数量-1)

代码语言:javascript
复制
1 SELECT EMPNAME , dept.DEPTNAME
2         FROM EMPLOYEE
3         INNER JOIN DEPT
4         ON EMPLOYEE.DEPTID = DEPT.ID;

3.使用别名

代码语言:javascript
复制
1 SELECT EMPNAME AS '员工姓名', D.DEPTNAME AS '部门' -- 注意这里的D
2                 FROM EMPLOYEE AS E
3                 INNER JOIN DEPT AS D
4                 ON E.DEPTID = D.ID;

4.左外连接查询,左边的数据一定会完全显示。查询时先写左表

首先我们改造一下副表

代码语言:javascript
复制
UPDATE EMPLOYEE SET DEPTID = NULL WHERE  ID= 4;

如果是内连接查询则显示

如果左连接查询

代码语言:javascript
复制
1  SELECT    D.DEPTNAME, E.EMPNAME
2                  FROM DEPT AS D -- 左表
3                  LEFT OUTER JOIN EMPLOYEE AS E -- 右表
4                  ON D.ID = E.DEPTID;

右连接其实和左连接一样,只是查询表的位置不同,下面是右连接,显示的和左连接的相同

代码语言:javascript
复制
1  SELECT D.DEPTNAME,E.EMPNAME
2                 FROM EMPLOYEE AS E-- 左表
3                 RIGHT JOIN DEPT AS D -- 右表
4                 ON E.ID = D.ID;

5.自连接查询,自连接查询一般应用于表数据为树状结构。

首先我们创建表并查询

代码语言:javascript
复制
 1 CREATE TABLE PERSON(
 2     ID INT PRIMARY KEY AUTO_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 AS P
15     RIGHT JOIN PERSON AS B
16     ON P.ID = B.BOSSID;

显示结果

注意上面创建表的BOSSID的结构。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java学习网 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档