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 ...
随机推荐
- ucos实时操作系统学习笔记——任务间通信(信号量)
ucos实时操作系统的任务间通信有好多种,本人主要学习了sem, mutex, queue, messagebox这四种.系统内核代码中,这几种任务间通信机制的实现机制相似,接下来记录一下本人对核心代 ...
- Leetcode 笔记 98 - Validate Binary Search Tree
题目链接:Validate Binary Search Tree | LeetCode OJ Given a binary tree, determine if it is a valid binar ...
- ABP(现代ASP.NET样板开发框架)系列之21、ABP展现层——Javascript函数库
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之21.ABP展现层——Javascript函数库 ABP是“ASP.NET Boilerplate Project ...
- 更改默认alert框体
更改框体主要用到的是更改系统的内置控件winpop下面是winpop具体代码 (function(window, jQuery, undefined) { 2 3 var HTMLS = { 4 ov ...
- [Android]在Dagger 2中使用RxJava来进行异步注入(翻译)
以下内容为原创,欢迎转载,转载请注明 来自天天博客: # 在Dagger 2中使用RxJava来进行异步注入 > 原文: 几星期前我写了一篇关于在Dagger 2中使用*Producers*进行 ...
- -Android -线程池 批量上传图片 -附php接收代码
(出处:http://www.cnblogs.com/linguanh/) 目录: 1,前序 2,类特点 3,用法 4,java代码 5,php代码 1,前序 还是源于重构,看着之前为赶时间写着的碎片 ...
- 【分布式】Zookeeper会话
一.前言 前面分析了Zookeeper客户端的细节,接着继续学习Zookeeper中的一个非常重要的概念:会话. 二.会话 客户端与服务端之间任何交互操作都与会话息息相关,如临时节点的生命周期.客户端 ...
- 【分布式】Zookeeper与Paxos
一.前言 在学习了Paxos在Chubby中的应用后,接下来学习Paxos在开源软件Zookeeper中的应用. 二.Zookeeper Zookeeper是一个开源的分布式协调服务,其设计目标是将那 ...
- scikit-learn预处理实例之一:使用FunctionTransformer选择列
本例展示怎样在一个管道中使用FunctionTransformer.如果你知道你的数据集的第一主成分与分类任务无关,你可以使用FunctionTransformer选取除PCA转化的数据的第一列之外的 ...
- ASP.Net MVC——DotNetZip简单使用,解决文件压缩问题。
准备工作: 在vs工具栏中找到NuGet 下载DotNetZip 现在就可以使用DotNetZip强大的类库了,在这里我给出一些简单的使用. public ActionResult Export() ...