昨日内容回顾

公钥私钥

数据库存储引擎

MyISAM

是5.5版本之前默认的存储引擎

存取数据的速度较快、但是安全性偏差

三个文件

结构、索引、数据

InnoDB

5.5版本及之后默认的存储引擎

存取数据的速度较MyISAM偏慢、但是安全性更高、能够支持更多的功能

两个文件

结构、数据

BlackHole

黑洞

存什么就消失什么

一个文件

结构

memory

内存

所有的数据都是直接保存在内存中的断电立刻丢失

一个文件

结构

创建表的完整语法

create table 表名(

字段名1 字段类型(宽度) 约束条件1 约束条件2 约束条件3,

字段名2 字段类型(宽度) 约束条件1 约束条件2 约束条件3,

字段名3 字段类型(宽度) 约束条件1 约束条件2 约束条件3,

字段名4 字段类型(宽度) 约束条件1 约束条件2 约束条件3

);

"""

注意事项

1.宽度、约束条件不是必须的可写可不写

2.最后一个不能加逗号

3.约束条件可以有多个 空格隔开即可

"""

严格模式

能让数据库少干活就尽可能的少干活

show variables like '%mode%'

sql_mode严格模式

5.6版本及以前的默认没有任何的严格模式

往后的版本默认都有严格模式

STRICT_TRANS_TABLES

set global sql_mode = 'STRICT_TRANS_TABLES'

设置完成后只需要退出客户端重新进入即可

整型

tinyint 1个字节(bytes)

smallint 2个字节(bytes)

int 4个字节(bytes)

bigint 8个字节(bytes)

"""

单位换算

8bit >>> 00000000

8bit = 1bytes

1024bytes = 1KB

1024KB = 1MB

1024MB = 1GB

1024GB = 1TB

1024TB = 1PB

"""

针对整型字段类型无序添加宽度

因为它自带的宽度已经足够使用了,并且也不是用来限制存储长度的

浮点型

float(255,30)

double(255,30)

decimal(65,30)

第一个数字表示的是总共多少位、第二个数字表示的小数部分占多少位

精确度

float < double < decimal

"""

有时候如果遇到了某个数据类型精确度的问题

那么你可以尝试着用其他数据类型来存储

在工作中我们开发会经常使用字符串来存储看似是数字的数据

"""

字符类型

char(4) # 定长最大只能存储四个字符、超出直接报错、不超默认用空格补全

varchar(4) # 变长最大只能存储四个字符、超出直接报错、不超有几个存几个

"""

5.6版本及之前如果你不设置严格模式,插入数据的时候是不会报错的

name char(4)

values('jason')
1.没有设置只会存储jaso
2.设置之后才会报错

"""

char(4)

存取数据的速度都很快(暴力)

浪费存储空间

varchar(4)

节省存储空间

存取数据的速度较于char都很慢

char与varchar在后面创建表的时候都可以使用、具体还可以结合业务逻辑来

日期类型

date 年月日

time 时分秒

datetime 年月日时分秒

year 年

...

枚举与集合类型

枚举类似于多选一

enum('male','female','others')

集合类似于多选多(也可以只选一个)

set('read','study','music','running')

约束条件

"""

在插入数据的时候有两种插入方式

1.insert into t1 values()

t1表里面有几个字段你括号里面就要对应给几个数据

2.insert into t1(name,password) values()
按照括号内书写的字段添加数据

"""

1.not null 非空

id int not null

2.default 默认值

name char(16) default 'jason'

id int default 666

该字段你给值的情况就用默认的如果你给了就用你的

3.unique 唯一

1.单列唯一

id int unique

id字段的数据不能重复

2.联合唯一
host char(16)
port int
unique(host,port)

4.primary key 主键

"""

在InnoDB存储引擎下

1.规定了一张表有且必须要有一个主键

2.如果你没有指定主键那么会有两种补救措施

2.1 会从上往下寻找一个not null unique的字段自动升级为主键

2.2 就会用一个内部隐藏的字段(迫不得已)

"""

约束效果等价于not null unique

但是还有额外的功能 提高查询数据的速度

id int primary key

一般情况下一张表中都会有一个id字段并且该字段一般就是主键字段

5.auto_increment 自增

"""

auto_increment不能单独使用

必须配合

primary key

unique一起使用

错误案例

id int auto_increment

"""

id int primary key auto_increment

name char(16)

insert into t1(name) values('jason')

如果你没有写括号说明需要填写的字段 那么默认需要你自己给

今日内容概要

表与表之间的关系

如何确定

如何建立

操作表的其他命令

表与表之间关系

"""

表与表之间的关系只有四种

一对多

多对多

一对一

没有关系

"""

我们的员工表有哪些不足之处

1.表结构不清晰(侧重点不清晰)

2.录入的数据有很多是重复的(浪费存储空间)

3.在修改数据的时候扩展性很差(修改的数据条目非常多)

如果将员工表一分为二到底是优化了还是复杂了

上述的三个问题都解决了

如何限制字段输入的值

create table emp(

id int primary key auto_increment,

name char(16),

age int,

dep_id int,

foreign key(dep_id) references dep(id)

# 将本表中的dep_id字段跟dep表中的id字段建立关系

);

create table dep(

id int primary key auto_increment,

dep_name char(32),

dep_desc char(64)

);

一对多关系判断

"""

在判断表关系的时候一定要

换位思考(要站在双方的角度思考问题)

"""

一对多的表关系判断

以员工表为例

1.先站在员工表的基础之上

问一个员工能否对应多个部门 不可以

2.再站在部门表的基础之上
问一个部门能否对应多个员工 可以 下结论
员工跟部门是单向的
只要是单向的那么表关系就是 一对多

"""

只要有一个是可以的就是一对多的关系

"""

一旦确立了表关系之后 关系字段应该放在哪张表???

表关系如果是一对多的话 那么外键字段建在多的一方

员工表是多的一方 所有外键字段放在员工表里面 dep_id

dep_id就是外键字段(用来表示表与表之间关系的)

create table emp(

id int primary key auto_increment,

name char(16),

age int,

dep_id int,

foreign key(dep_id) references dep(id)

# 将本表中的dep_id字段跟dep表中的id字段建立关系

);

create table dep(

id int primary key auto_increment,

dep_name char(32),

dep_desc char(64)

);

创建外键字段注意事项

1.要创建被关联表(没有外键字段的表)

2.插入数据要先录入被关联表的数据才能录入关联表的数据(没有外键字段的表)

insert into dep(dep_name,dep_desc) values

('外交部','搞外交'),

('讲师部','教书育人'),

('技术部','技术能力有限部门');

insert into emp(name,age,dep_id) values

('jason',18,1),

('tony',32,2),

('jack',30,2),

('tom',45,2),

('kevin',18,3);

3.关系表之间数据的同步更新同步删除

外键创建好了之后 被关联表的id字段无法修改

update dep set id=200 where id=1;

外键创建好了之后 被关联表的数据无法删除

delete from dep where id=1;

create table emp(

id int primary key auto_increment,

name char(16),

age int,

dep_id int,

foreign key(dep_id) references dep(id)

on update cascade # 同步更新

on delete cascade # 同步删除

);

create table dep(

id int primary key auto_increment,

dep_name char(32),

dep_desc char(64)

);

多对多关系

以图书跟作者表为例

判断表关系查看群内截图即可

create table book(

id int primary key auto_increment,

title varchar(16),

price float(10,2),

author_id int,

foreign key(author_id) references author(id)

on update cascade # 同步更新

on delete cascade # 同步删除

)

create table author(

id int primary key auto_increment,

name char(16),

gender enum('male','female','others') default 'male',

book_id int,

foreign key(book_id) references book(id)

on update cascade # 同步更新

on delete cascade # 同步删除

)

"""针对多对多的表关系,需要你创建一个第三张表来专门存储"""

create table book(

id int primary key auto_increment,

title varchar(16),

price float(10,2)

);

create table author(

id int primary key auto_increment,

name char(16),

gender enum('male','female','others') default 'male'

);

create table book2author(

id int primary key auto_increment,

book_id int,
foreign key(book_id) references book(id)
on update cascade # 同步更新
on delete cascade, # 同步删除 author_id int,
foreign key(author_id) references author(id)
on update cascade # 同步更新
on delete cascade # 同步删除

);

图书表和作者表里面的数据随意的插入都没有问题

只要确保在插入图书和作者的第三张关系表的时候得注意

insert into book(title,price) values

('阿甘正传',666.66),

('三体',999.66),

('曾国藩',789.66),

('西游记',123.66),

('聊斋',456.66);

insert into author(name) values

('jason'),

('tony'),

('tom');

insert into book2author(author_id,book_id) values

(1,1),

(1,2),

(1,3),

(2,1),

(2,4),

(2,5),

(3,1),

(3,2);

第三张表分别跟另外两张表是有删除和更新关系的 两张表之间现在没有任何影响

delete from author where name='tom';

多对多表关系的维护只需要第三张表来维护即可

一对一关系

实际案例

1.qq用户信息展示

一张表中用户的信息非常多,但是并不是所有的信息都是需要经常使用的

那么这种情况下就可以将一张表拆分成两张表 然后做一对一的表关系

create table authordetail1(

id int primary key auto_increment,

phone int,

addr char(255)

);

create table author(

id int primary key auto_increment,

name char(4),

age int,

authordetail_id int unique,

foreign key(authordetail_id) references authordetail1(id)

on update cascade

on delete cascade

);

外键字段总结

一对多外键字段建在多的那一方

多对多外键字段建在第三方表中

一对一外键字段建在任何一方都可以,但是推荐你建在查询频率较高的那张表中

修改表操作

mysql对大小写不敏感!!!

语法:

  1. 修改表名

    ALTER TABLE 表名

    RENAME 新表名;
  2. 增加字段

    ALTER TABLE 表名

    ADD 字段名 数据类型 [完整性约束条件…],

    ADD 字段名 数据类型 [完整性约束条件…];

    ALTER TABLE 表名

    ADD 字段名 数据类型 [完整性约束条件…] FIRST;

    ALTER TABLE 表名

    ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名;
  3. 删除字段

    ALTER TABLE 表名

    DROP 字段名;
  4. 修改字段 # modify只能改字段数据类型完整约束,不能改字段名,但是change可以!

    ALTER TABLE 表名

    MODIFY 字段名 数据类型 [完整性约束条件…];

    ALTER TABLE 表名

    CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…];

    ALTER TABLE 表名

    CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…];

MySQL第三讲的更多相关文章

  1. MySQL第三讲 一一一一 视图、触发器、函数、存储过程

    1. 视图 1.1 视图前戏 我们之前讲有,临时表的概念. 现在我们创建一个临时表:select * from (select * from tb1 where id between 10 and 1 ...

  2. python全栈开发教程目录

    python入门到进阶 Python基础2——数据类型的操作 Python基础——函数入门 Python基础——函数进阶 Python基础——函数的装饰器 Python基础——函数的装饰器 Pytho ...

  3. MySQL实战45讲学习笔记:事务隔离级别(第三讲)

    一.隔离性与隔离级别 1.事务的特性 原子性 一致性 隔离性 持久性 2.不同事务隔离级别的区别 读未提交:别人改数据的事务尚未提交,我在我的事务中也能读到.读已提交:别人改数据的事务已经提交,我在我 ...

  4. MySQL实战45讲学习笔记:第四十三讲

    一.本节概述 我经常被问到这样一个问题:分区表有什么问题,为什么公司规范不让使用分区表呢?今天,我们就来聊聊分区表的使用行为,然后再一起回答这个问题. 二.分区表是什么? 为了说明分区表的组织形式,我 ...

  5. MySQL实战45讲学习笔记:第三十三讲

    一.引子 我经常会被问到这样一个问题:我的主机内存只有 100G,现在要对一个 200G 的大表做全表扫描,会不会把数据库主机的内存用光了? 这个问题确实值得担心,被系统 OOM(out of mem ...

  6. MySQL实战45讲学习笔记:第十三讲

    一.引子 经常会有同学来问我,我的数据库占用空间太大,我把一个最大的表删掉了一半的数据,怎么表文件的大小还是没变? 那么今天,我就和你聊聊数据库表的空间回收,看看如何解决这个问题. 这里,我们还是针对 ...

  7. MySQL实战45讲学习笔记:第二十三讲

    一.本节概要 今天这篇文章,我会继续和你介绍在业务高峰期临时提升性能的方法.从文章标题“MySQL 是怎么保证数据不丢的?”,你就可以看出来,今天我和你介绍的方法,跟数据的可靠性有关. 在专栏前面文章 ...

  8. 深挖计算机基础:MySQL实战45讲学习笔记

    参考极客时间专栏<MySQL实战45讲>学习笔记 一.基础篇(8讲) MySQL实战45讲学习笔记:第一讲 MySQL实战45讲学习笔记:第二讲 MySQL实战45讲学习笔记:第三讲 My ...

  9. MySQL锁(一)全局锁:如何做全库的逻辑备份?

    数据库锁设计的初衷是处理并发问题,这也是数据库与文件系统的最大区别. 根据加锁的范围,MySQL里大致可以分为三种锁:全局锁.表锁和行锁.接下来我们会分三讲来介绍这三种锁,今天要讲的是全局锁. 全局锁 ...

随机推荐

  1. python类和函数

    #/usr/bin/python #coding=utf-8 class Car(): def __init__(self,name,year): self.name = name self.year ...

  2. jenkins自动化pipline的ci/cd流水线

    pipeline { agent any tools { //工具必须预先在jenkins中预配置 maven 'mvn' jdk 'jdk' } stages { stage('Env') { st ...

  3. 火爆的文字游戏你玩了吗?「GitHub 热点速览 v.22.06」

    不知道你有没有被 Wordle 这款游戏刷屏,在本期热点速览的特推部分选了一个 React 编写的开源版本同你分享,而本次公众号摘要也是一个提示, 只不过这个只能盲猜了.别小瞧 Wordle 这个游戏 ...

  4. sms短信网关对接

    因为工作的需求,需要对接短信网关,业务上就是一个注册用户时,需要发送手机验证码;可能别的公司都是使用第三方接口,但是大点的公司,为了安全,他们都有自己的短信消息中心(SMSC) 1.业务需求 - 1. ...

  5. C++输入多行数据

    动机 编程题常用需求,比如输入两行数据. 解决思路:使用getline 程序 #include <iostream> #include <vector> #include &l ...

  6. 基于GDAL库海洋表温日平均计算工具设计与实现 C++版

    技术背景 在对物理海洋数据处理过程中,表层温度是众多要素中的一种,本文书要是针对海洋表温数据批量日平均处理的一个工具设计.首先要在对当前的SST数据文件作一下简要的说明,SST全称为sea surfe ...

  7. Diary -「CSP 2019 J/S」 游记

    \(\text{Day 0}\) 试机, 总体感觉不错, 至少不像初一时候的紧张, 毕竟是中青年选手了 ( ? )         当晚睡得挺好, 虽然是冲着一等奖去的, 但还是没有给自己过多的思想包 ...

  8. CentOS 7 下升级OpenSSH 7.4p1到OpenSSH 8.4p1

    文章目录 一.环境介绍 二.安装配置telnet 2.1.安装telnet-server 2.2.配置telnet 2.3.配置telnet登录的终端类型 2.4.启动telnet服务 三.切换登录方 ...

  9. InfluxDB 2.x Open Source Time Series Database

    1. 说明 目前,大家普遍还在采用 InfluxDB 1.x 的版本,官方2.x的版本已经发布一段时间了, 其主推flux语言且自带前端炫酷图表. 2. 官方网站 https://www.influx ...

  10. Zookeeper开源客户端Curator之创建会话

    前面Zookeeper的链接使用的都是其提供的原生代码,实际开发过程中非常底层的细节开发工作如连接重连,反复注册等耗费开发人员大量的工作精力并且重复工作.而开源客户端Curator的出现解决了该类问题 ...