day46 mysql进阶
一、约束条件
1 default默认值
# 补充知识点,插入数据时可以指定字段插入
create table t1(
id int,
name char(16)
);
insert into t1(name,id) values('hz',1);
default使用
# 创建一张表 内含一个默认字段
create table t2(
id int,
sex enum('male','female','others')# 这里用什么类型都可以 enum只是举例
)
# 只对这个表的id字段插入数据可以验证默认值
insert into t2 (id) values(1);
insert into t2 values(1,'male');
2 unique唯一
2.1 单列唯一
# 创建一张表 id字段不能重复
create table t3(
id int unique,
name char(16)
)
# 尝试对这个表插入重复数据
insert into t3 values(1,'hz'),(1,'lxt');
ERROR 1062 (23000): Duplicate entry '1' for key 'id'
# 报错提示不能重复添加id等于1的数据
2.2 联合唯一
# 联合唯一的本质是,每一条自己是可以重复,但是连在一起就是唯一的
# 例如ip+port 各自都可以重复,但是ip+port合在一起指定的是一个唯一的基于网络通信的应用程序
# 创建一个ip+port表
create table t4(ip int,port int,unique(ip,port));
# 尝试向表内插入相同的数据
insert into t4 values(1,2),(1,2);
ERROR 1062 (23000): Duplicate entry '1-2' for key 'ip'
# 尝试向表内插入单列相同,其他列不同的数据
insert into t4 values(1,2),(1,3);
# 成功
3 primary key主键
3.1 主键的基本使用
# 单单从约束条件来看primary key的效果等价于not null+unique
# 非空且唯一
# 创建一个含有主键的表
create table t4 (
id int primary key,
name char(16)
);
# 向表内插入数据验证主键的特性
insert into t4 values(1,'hz');
insert into t4 values(null,'lxt');
# 报错 主键不能为空
insert into t4 values(1,'lxt');
# 报错 主键不能重复
3.2 主键的特性
特性:主键是innodb储存引擎组织数据的依据
innodb存储引擎在创建表的时候必须有主键,我们在不写主键的时候,mysql检索我们创建的字段,把一个设置了not null+unique约束的字段升级成主键。如果没有这种字段,mysql会自己创建一个隐藏的主键,这种情况就无法实现主键的高效率的特性了。
主键的目的是为了索引的方便,类似于书的目录,提高了我们检索数据的效率。
单个字段主键
create table t5(
id int primary key,
name char(16)
);
联合主键(多个字段连起来的主键,本质上还是一个主键)
create table t5(
ip int ,
port int,
name char(4),
primary key(ip,pory)
);
总结:主键是一种提升检索效率的结构,我们应该在建表时为唯一不重复的字段设置成主键
4 auto_increment自增
特性:顾名思义会自动增加的字段
# 当我们设置一些编号是依次增加的情况,我们人为的每次去输入就会显得很多余,这个时候用auto_increment约束就可以让这个字段自动增加1
# 注意:自增约束只能设置给主键
# 创建一个id自增的表
create table t6(
id int primary key auto_increment,
name char(16)
);
# 只对name字段插入数据检验id是否自增
inster into t6 (name) values('hz'),('lxt');
# 我们也可以指定id插入,这之后的数据会在我们这条数据上自增
# 删除数据不会影响后面的自增
补充
delete from t6 # 后面可以跟条件,不跟默认清空整个表,但是自增计数不会清空
truncate t6 # 清空表数据并且重置自增计数
二、表于表之间关系
引子:
我们在定义一张学生表的时候,会定义很多字段
学生:姓名,年龄,年级,班级,课程,成绩,排名....
定义一个如此庞大的表会出现以下几个问题
- 表的组织结构不清晰
- 浪费硬盘空间
- 数据的可扩展性很差(重要)
这种合在一起写就像在python中把所有的代码都写在一个py文件中,虽然都可以实现效果,但是可读性和可扩展性都非常差
所以我们要根据种类,把不同的字段类型分成不同的表
这里可以把学生表分成学生基本信息表,学生成绩表
1 外键
定义:是用来帮助我们建立表和表之间的关系的
foreign key
2 表关系
表与表之间只有四种关系:
- 一对多
- 多对多
- 一对一
- 无关
2.1 一对多关系
在刚开始学习表关系的时候,我们要站在不同的表上考虑和对方的关系。
举例:学生表和班级表
- 学生角度
- 一个学生不能在多个班级
- 班级角度
- 一个班级可以有多个学生
结论:学生表和班级表是一对多关系
代码实现
# 代码中外键写在哪张表?
# 写在“多”的那张表,也就是必须要后创建的表
# 班级里可以有0~无数个学生,但是学生必须有一个班级,所以要县创建班级表
create table student(
id int primary key auto_increment,
name char(16),
class_id int,
foreign key(class_id) references class(cls_id)
);
create table class(
cls_id int primary key auto_increment,
level char(16)
);
# 向班级表插入数据,再向学生表插入数据
insert into class (level) values('first'),('second');
insert into student (name,class_id) values('hz',1),('lxt',2),('xxq',2);
# 这里的班级必须要把班级内的同学都删了才能删除班级,这样会显得操作非常繁琐,而且数据之间不能做到同步跟新同步删除
# 设置级联跟新,级联删除
create table student(
id int primary key auto_increment,
name char(16),
class_id int,
foreign key(class_id) references class(cls_id)
on update cascade
on delete cascade
);
create table class(
cls_id int primary key auto_increment,
level char(16)
);
2.2 多对多关系
多对多关系举例图书表和作者表
一本书可以有多个作者,一个作者可以写多本书
此时不能按照上面的方式去写,多对多的外键关联必须再添加一个表,在这个表中存放对应关系
create table book(
id int primary key auto_increment,
name char(16)
);
create table author(
id int primary key auto_increment,
name char(16),
age int
);
create table book2author(
id int primary key auto_increment,
author_id int,
book_id int,
foreign key(author_id) references author(id)
on update cascade
on delete cascade,
foreign key(book_id) references book(id)
on update cascade
on delete cascade
);
2.3 一对一关系
一对一的外键写在哪里都可以,不过通常写在查询频率较高的表中
create table authordetail(
id int primary key auto_increment,
phone int,
addr varchar(64)
);
create table author(
id int primary key auto_increment,
name varchar(32),
age int,
authordetail_id int unique,
foreign key(authordetail_id) references authordetail(id)
on update cascade # 同步更新
on delete cascade # 同步删除
)
3 修改表(了解)
# MySQL对大小写是不敏感的
"""
1 修改表名
alter table 表名 rename 新表名;
2 增加字段
alter table 表名 add 字段名 字段类型(宽度) 约束条件;
alter table 表名 add 字段名 字段类型(宽度) 约束条件 first;
alter table 表名 add 字段名 字段类型(宽度) 约束条件 after 字段名;
3 删除字段
alter table 表名 drop 字段名;
4 修改字段
alter table 表名 modify 字段名 字段类型(宽度) 约束条件;
alter table 表名 change 旧字段名 新字段名 字段类型(宽度) 约束条件;
"""
4 复制表(了解)
"""
我们sql语句查询的结果其实也是一张虚拟表
"""
create table 表名 select * from 旧表; 不能复制主键 外键 ...
create table new_dep2 select * from dep where id>3;
day46 mysql进阶的更多相关文章
- mysql进阶(二十九)常用函数
mysql进阶(二十九)常用函数 一.数学函数 ABS(x) 返回x的绝对值 BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制) CEILING(x) 返回大于x的最小整数值 EXP ...
- mysql进阶(二十八)MySQL GRANT REVOKE用法
mysql进阶(二十八)MySQL GRANT REVOKE用法 MySQL的权限系统围绕着两个概念: 认证->确定用户是否允许连接数据库服务器: 授权->确定用户是否拥有足够的权限执 ...
- mysql进阶(二十七)数据库索引原理
mysql进阶(二十七)数据库索引原理 前言 本文主要是阐述MySQL索引机制,主要是说明存储引擎Innodb. 第一部分主要从数据结构及算法理论层面讨论MySQL数据库索引的数理基础. ...
- mysql进阶(二十六)MySQL 索引类型(初学者必看)
mysql进阶(二十六)MySQL 索引类型(初学者必看) 索引是快速搜索的关键.MySQL 索引的建立对于 MySQL 的高效运行是很重要的.下面介绍几种常见的 MySQL 索引类型. 在数 ...
- mysql进阶(十六)常见问题汇总
mysql进阶(十六)常见问题汇总 MySQL视图学习: http://www.itokit.com/2011/0908/67848.html 执行删除操作时,出现如下错误提示: 出现以上问题的原因是 ...
- 【转】MySQL— 进阶
[转]MySQL— 进阶 目录 一.视图 二.触发器 三.函数 四.存储过程 五.事务 一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需 ...
- MySQL进阶(视图)---py全栈
目录 mysql进阶(视图)---py全栈 一.什么是视图? 二.视图的特性 三.视图的优点 四.使用场合 五.视图基本操作 六.案例 mysql进阶(视图)---py全栈 一.什么是视图? 视图是从 ...
- mysql进阶练习
一 . MySQL进阶练习 /*==========================创建班级表=============================*/ CREATE TABLE class ( ...
- MySQL进阶19--函数的创建(举例)/设置mysql的创建函数的权限/查看(show)/删除(drop) / 举4个栗子
/*MySQL进阶19 函数 存储过程和函数:都类似于java中的方法; 存储过程和函数通用好处: 1.提高代码的重用性 2.简化操作 好处: 减少操作次数,减少了编译次数,减少了和服务器的连接次数, ...
随机推荐
- Water Testing【皮克定理,多边形面积,线段上点的数目】
Water Testing 传送门:链接 来源:UPC 9656 题目描述 You just bought a large piece of agricultural land, but you n ...
- 油猴脚本 之 网教通直播评论记录抓取 v2.0
先放一个 <油猴脚本 之 网教通直播评论记录抓取>那篇文章的传送门 . 修复内容 将所有表情转为 [符号表情] 字样,而非删除: 修复被禁言用户读取异常,现在被禁言用户表示为 张三 [已禁 ...
- Android学习笔记主题(Theme)资源文件
安卓的主题资源文件,可以用于对Android应用的美化. styles文件是主题资源文件. 定义一个主题资源格式如下: <resources> <!-- Base applicati ...
- UWP实现第二字幕并且跟随系统的设置
话不多说,先看一下最终效果 系统设置默认 在系统设置里面更改字幕的显示效果 需求 要求播放器可以显示第二字幕,类似旁白的文字解释.比如片中出现了一个专业术语,这个时候观众可能有些疑惑.所以需要在屏幕上 ...
- 程序员Linux教程初窥入门-刘志敏-专题视频课程
程序员Linux教程初窥入门-313人已学习 课程介绍 程序员Linux教程初窥入门主要针对初级入门程序员的课程,也是为后期学习其他课程的一个基础,Git.Maven.Jenkins.R ...
- 35 _ 队列1 _ 什么是队列.swf
队列是一种可以实现一个先进先出的存储结构 什么是队列? 队列(Queue)也是一种运算受限的线性表.它只允许在表的一端进行插入,而在另一端进行删除.允许删除的一端称为队头(front),允许插入的一端 ...
- Spring-AOP:一、注解demo及基本概念
切面:Aspect 切面=切入点+通知.在老的spring版本中通常用xml配置,现在通常是一个类带上@Aspect注解.切面负责将 横切逻辑(通知) 编织 到指定的连接点中. 目标对象:Target ...
- 微信小程序之页面跳转(tabbar跳转及页面内跳转)
一.简介 微信小程序页面主要分为tabbar页面和应用内页面,这两种页面的跳转方式不同 二.tabBar页面跳转 tabBar 是底部导航栏页面,如下图 在app.json中的配置如下: 跳转方式如下 ...
- Pikachu靶场SQL注入刷题记录
数字型注入 0x01 burp抓包,发送至repeater 后面加and 1=1,and 1=2 可判断存在注入 0x02 通过order by判断字段数,order by 2 和order by 3 ...
- Selenium Grid的原理、配置与使用(转)
Selenium GridSelenium Grid在前面介绍Selenium的时候说过它有三大组件,Selenium Grid就是其中之一而作用就是分布式执行测试.讲分布式之前还是要说说UI自动化的 ...