MYSQL基础操作之数据约束与关联查询
个人博客地址:https://www.vastyun.com
一、MYSQL约束
1.默认值约束,当字段没有插入值的时候,mysql自动给该字段分配默认值。
默认值的字段允许为空。
对默认值字段也可以插入null。
CREATE TABLE STUDENT(
ID INT,
NAME VARCHAR(20),
ADDRESS VARCHAR(20) DEFAULT '京口区'
);
INSERT INTO STUDENT (ID, NAME ) VALUES (1,'张三');
INSERT INTO STUDENT (ID , NAME,ADDRESS ) VALUES (2,'李四' ,NULL);

2.非空约束
CREATE TABLE STUDENT(
ID INT,
NAME VARCHAR(20),
GENDER VARCHAR(2) NOT NULL
);
2.1非空字段必须赋值(错误显示)
INSERT INTO STUDENT (ID , NAME) VALUES(1, '李四');

2.2不能插入null(错误显示)
INSERT INTO STUDENT (ID , NAME) VALUES (1, '张三' ,NULL);

3.唯一约束
CREATE TABLE STUDENT (
ID INT UNIQUE,
NAME VARCHAR(20)
);
INSERT INTO STUDENT (ID , NAME) VALUES (1, '张三');
下面语句执行发生错误
INSERT INTO STUDENT (ID , NAME) VALUES (1, '李四');
错误提示

4.主键约束(非空+唯一),通常每张表都会设置一个主键字段。用于标注表记录的唯一性。
主键一般都是没有业务含义的。
CREATE TABLE STUDENT(
ID INT PRIMARY KEY,
NAME VARCHAR(20)
); INSERT INTO STUDENT (ID , NAME) VALUES (1, '张三');
下面语句执行显示错误
INSERT INTO STUDENT (ID , NAME ) VALUES (NULL , '李四');
错误提示

下面错误也是一种错误
INSERT INTO STUDENT (ID ,NAME ) VALUES (1, '李四');

5.自增长约束
可以自动的递增
CREATE TABLE STUDENT(
ID INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20)
);
INSERT INTO STUDENT (NAME) VALUES ('张三');
INSERT INTO STUDENT (NAME) VALUES ('李四');

整表数据删除,不影响自增的删除语句
DELETE FROM STUDENT;
删除表之后再次(不用再创建表),添加插入语句如图所示

删除表中所有数据,删除外键也是用这个语句。
DELETE FROM STUDENT;
再次插入数据

6.外键约束
被约束的表为副表,外键设置在副表上
eg:创建员工表(副表),创建部门表(主表),先创建主表,再创建副表
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.下面进行级联关联,意味着,当主表修改时,副表也修改
修改以上表的创建语句,并重新插入新的语句
DROP TABLE EMPLOYEE; CREATE TABLE EMPLOYEE(
ID INT PRIMARY KEY AUTO_INCREMENT,
EMPNAME VARCHAR(20),
DEPTID INT,
CONSTRAINT EMPLOYEE_DEPT_FK FOREIGN KEY (DEPTID) REFERENCES DEPT(ID) ON UPDATE CASCADE ON DELETE CASCADE
); 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);
查询如图所示

修改主表的一条记录
UPDATE DEPT SET ID=5 WHERE ID=4;
主表的运行结果

副表的运行结果

--------------------------------------------------------------------------------------
二、关联查询
1.交叉查询
SELECT * FROM EMPLOYEE,DEPT;

2.内连接查询
多表查询规则:1)查询哪些表 2)确定哪些字段 3)表与表之间的查询条件(连接表的数量-1)
SELECT EMPNAME , dept.DEPTNAME
FROM EMPLOYEE
INNER JOIN DEPT
ON EMPLOYEE.DEPTID = DEPT.ID;

3.使用别名
SELECT EMPNAME AS '员工姓名', D.DEPTNAME AS '部门' -- 注意这里的D
FROM EMPLOYEE AS E
INNER JOIN DEPT AS D
ON E.DEPTID = D.ID;

4.左外连接查询,左边的数据一定会完全显示。查询时先写左表
首先我们改造一下副表
UPDATE EMPLOYEE SET DEPTID = NULL WHERE ID= 4;

如果是内连接查询则显示

如果左连接查询
SELECT D.DEPTNAME, E.EMPNAME
FROM DEPT AS D -- 左表
LEFT OUTER JOIN EMPLOYEE AS E -- 右表
ON D.ID = E.DEPTID;

右连接其实和左连接一样,只是查询表的位置不同,下面是右连接,显示的和左连接的相同
SELECT D.DEPTNAME,E.EMPNAME
FROM EMPLOYEE AS E-- 左表
RIGHT JOIN DEPT AS D -- 右表
ON E.ID = D.ID;

5.自连接查询,自连接查询一般应用于表数据为树状结构。
首先我们创建表并查询
CREATE TABLE PERSON(
ID INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
BOSSID INT
); INSERT INTO PERSON (NAME,BOSSID) VALUES ('张三',NULL);
INSERT INTO PERSON (NAME,BOSSID) VALUES ('李四',1);
INSERT INTO PERSON (NAME,BOSSID) VALUES ('王五',2);
INSERT INTO PERSON (NAME,BOSSID) VALUES ('赵六',3);
INSERT INTO PERSON (NAME,BOSSID) VALUES ('李七',3); SELECT P.NAME AS '老板' ,B.NAME AS '员工'
FROM PERSON AS P
RIGHT JOIN PERSON AS B
ON P.ID = B.BOSSID;
显示结果

注意上面创建表的BOSSID的结构。
MYSQL基础操作之数据约束与关联查询的更多相关文章
- MySQL数据约束和关联查询
1 默认值deafult:在建表的时候字段后使用 default ,默认值字段允许为null. 2 非空 not null:在建表的时候字段后使用 not null. 非空字段必须赋值,并且不能是n ...
- MySql数据库操作之数据约束
首先数据库的外键是数据库提供的一种完整性约束.在许多数据库的书上也会介绍到,然而对于外键这个完整性性约束究竟应该在数据库端实现,还是在项目业务端实现很多人有着不同的意见. 个人开发(小型应用).数据库 ...
- mysql基础操作(二):简单查询DQL
-- 1.查询所有字段 select * from student; -- 2.查询指定的字段 select id from student; select id, name from student ...
- MYSQL基础操作
MYSQL基础操作 [TOC] 1.基本定义 1.1.关系型数据库系统 关系型数据库系统是建立在关系模型上的数据库系统 什么是关系模型呢? 1.数据结构可以规定,同类数据结构一致,就是一个二维的表格 ...
- MySQL基础操作(二)
MySQL基础操作 一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用.注意:使用视图时 ...
- MySQL基础(三)——约束
MySQL基础(三)--约束 约束是在表上强制执行的数据校验规则,主要用于维护表中数据的完整性以及当数据之间有以来关系时,保护相关的数据不会被删除. 根据约束对列的限制,可以划分为:单列约束(只约束一 ...
- MYSQL 基础操作
1.MySQL基础操作 一:MySQL基础操作 1:MySQL表复制 复制表结构 + 复制表数据 create table t3 like t1; --创建一个和t1一样的表,用like(表结构也一样 ...
- 【MySQL】MySQL基础操作语句
mysql基础操作语句,包括数据库的增.删.切换,以及表的增.删.改.查.复制. 创建数据库 mysql> create database tem; 使用数据库 mysql> use te ...
- MySQL基础操作&&常用的SQL技巧&&SQL语句优化
基础操作 一:MySQL基础操作 1:MySQL表复制 复制表结构 + 复制表数据 create table t3 like t ...
随机推荐
- Javascript之函数模型
分析: 对于js自定义函数,函数体的内容大致可抽象为:变量(局部变量,由var关键字定义,全局变量)和函数(一般函数,匿名函数,闭包函数). function SelfDefineFunc() { v ...
- git did not exit cleanly
exit code 1 1.鼠标右键 -> TortoiseGit -> Settings -> Network 2.SSH client was pointing to C:\Pr ...
- OpenCASCADE Ring Type Spring Modeling
OpenCASCADE Ring Type Spring Modeling eryar@163.com Abstract. The general method to directly create ...
- java发送http的get、post请求
转载博客:http://www.cnblogs.com/zhuawang/archive/2012/12/08/2809380.html Http请求类 package wzh.Http; impor ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统--系统权限全套完整图
根据角色或用户或模块查询权限.
- Java异常总结
异常就是在程序中可能要发生的未知错误,java机制中异常分为2大类:Exception和Error. 对异常的处理方式有2种,一是将异常通过关键字throws抛出,二是将异常进行try catch处理 ...
- 安装wamp2.5报权限错误的解决办法
安装完wampServer 2.5,新建了一个虚拟目录,xhp/ 访问xhp/index.php报You don't have permission to access 按照以前的经验,只要打开/wa ...
- 使用java代码关闭指定端口的程序-windows
转载请请在页首注明作者与出处 一:问题由史 今天遇到一个问题,就是在实现自动化灾备的时候,发现原有死掉的程序没有完全关闭,当然这都不是本文的重点,重点是这个时候,我得把它完全关闭,所以才有了这篇文章. ...
- golang枚举类型 - iota用法拾遗
在c#.java等高级语言中,经常会用到枚举类型来表示状态等.在golang中并没有枚举类型,如何实现枚举呢?首先从枚举的概念入手. 1.枚举类型定义 从百度百科查询解释如下:http://baike ...
- JS瀑布流布局
好久没有更新博客喽,今天来说一个瀑布流布局. 瀑布流在很多网站已有很多,现在只说一下简单的实现原理吧, 1.计算一行可以排放几个元素 2.建立一个数组用于存放第一行的每个元素的高度. 3.得到数组中的 ...