MySQL基本數據類型與約束條件

  • 2022 年 2 月 18 日
  • 筆記

昨日內容回顧

  • 數據存儲的演變
# 方向:
	朝著更加統一和方便管理
  • 資料庫的發展史
# 由本地保存逐步演變為線上保存
  • 資料庫的本質
# 本質上就是一款CS架構的軟體

"""
資料庫:
	在不同場景可能對應不同的解釋
"""
  • 資料庫的分類
# 1.關係型資料庫
	有固定的表結構
	表與表之間可以可以建立程式碼層面的關係
	MySQL Oracle PostgreSQL MariDB sqlite db2 access sql server...

# 2.非關係型資料庫
	沒有固定的表結構
	數據存儲全部採用 K:V 鍵值對的形式
	radis mongodb memcache...
  • MySQL的下載與使用
# MySQL版本:
	5.6 Windows學習推薦
	5.7 目前企業正在過度
	8.0 Mac本可以直接安裝
    
# 直接訪問官網一步步下載

bin文件夾
	mysqld.exe		服務端
	mysql.exe		客戶端
    
data文件夾

mydefault.ini

readme

# 簡單的試試
	cd切換到bin路徑下
		先啟動服務端mysqld
		在啟動客戶端mysql
  • MySQL基本配置
1.環境變數的添加

2.系統服務製作(開機自啟)
	mysqld --install
	net start mysql
	net stop mysql
	musqld --remove
  • 重要概念
# 庫:文件夾

# 表:文件

# 記錄:文件內的一行行數據
  • 基本SQL語句
# 1.針對庫的
	create database 庫名;  # 創建庫
	show databases;  # 查看所有庫
	show create database 庫名;  # 定向查看某個庫
	alter database 庫名 charset='gbk';  # 修改庫編碼
	drop database 庫名;  # 刪除庫
    
	select database();  # 查看當前所在的庫名
	use 庫名;  # 切換到指定庫
    
    
# 2.針對錶的
	create table 表名(欄位名1 欄位類型,欄位名2 欄位類型);  # 創建表
	show tables;  # 查看當前庫下所有的表
	show create table 表名;  # 查看指定的表
	describe 表名;  # 查看錶的具體資訊
	desc 表名;  # 查看錶的具體資訊(簡寫)
	alter table 原表名 rename 新表名;  # 修改表名
	alter table 表名 change 原欄位名 新欄位名 新類型;  # 同時修改欄位名和類型
	alter table 表名 modify 欄位名 新欄位類型;  # 單獨修改欄位類型
	drop table 表名;  # 刪除表
    
    
# 3.針對記錄的
	insert into 表名 values(數據,數據,數據);  # 添加單條數據
	insert into 表名 values(),(),();  # 添加多條數據
	select * from 表名;  # 查看錶中的所有數據內容
	update 表名 set 欄位名='新數據' where 篩選條件
	delete from 表名 where 篩選條件;  # 刪除記錄內容
  • 配置文件
# \s 查看基本配置資訊

# MySQL5.6版本默認的內部編碼不是統一的 可能會造成亂碼問題

# 解決亂碼問題:
	主要以 mydefault.ini 及創建其副本並命名為 my.ini 
	具體配置內容直接拷貝

今日內容概要

  • 存儲引擎
  • MySQL基本數據類型
  • 約束條件

內容詳細

1.存儲引擎

# 1.存儲引擎可以堪稱是處理數據的不同方式

# 2.查看存儲引擎的方式
	show engines;
    
# 3.需要掌握的四個存儲引擎
	MyISAM
    	MySQL5.5之前默認的存儲引擎
        不支援事務、行級鎖和外鍵 針對數據的操作較於InnoDB不夠安全
        但數據的存取速度較於InnoDB更快
        
	InnoDB
		MySQL5.5之後默認的存儲引擎
		支援事務、行級鎖和外鍵 針對數據的操作更加的安全
    
	BLACKHOLE
		寫入其中的數據都會立刻消失 類似於垃圾處理站    
    
	MEMORY  
		基於記憶體存取數據
		速度最快 但是一旦斷電立刻丟失
        
        
# 4.存儲引擎創建表的不同點
	create table t1(id int) engine=myisam;
	create table t2(id int) engine=innodb;
	create table t3(id int) engine=memory;
	create table t4(id int) engine=blackhole;
"""
MyISAM會創建三個文件:
	.frm	表結構文件
	.MYD	表數據文件
	.MYI	表索引文件(索引是用來加快數據查詢的)
	
InnoDB會創建兩個文件:
	.frm	表結構文件
	.ibd	表數據和表索引文件
	
memory會創建一個文件:
	.frm	表結構文件

blackhole會創建一個文件:
	.frm	表結構文件
"""

image

image

2.MySQL基本數據類型之整型與浮點型

# 1.整型
	tinyint smallint int bigint
	不同的int類型能夠存儲的數字範圍是不一樣的
"""
1.要注意是否存負數(正負號需要佔一個比特位)
2.針對手機號碼只能用bigint

3.是否需要正負號
	create table t5(id tinyint);
	insert into t5 values(-999),(999);
	結論:所有的int類型默認都需要正負號


	create table t6(id tinyint unsigned);  # 移除正負號
	insert into t6 values(-999),(999);
"""


# 2.浮點型
	float double decimal
	float(255,30)  # 總共255位 小數位佔30位
	double(255,30)  # 總共255位 小數位佔30位
	decimal(65,30)  # 總共65位 小數位佔30位
"""
三者不同之處:
	create table t7(id float(255,30));
	create table t8(id double(255,30));
	create table t9(id decimal(65,30));
	
	insert into t7 values(2.222222222222222222222222);
	insert into t8 values(2.222222222222222222222222);
	insert into t9 values(2.222222222222222222222222);
	結論:三者的精確度不一樣
		float < double < decimal
		
		
至於到底使用哪個:
	一般情況下 小數點後面只保留兩位 float就足夠了
	如果從事高精密行業 可以考慮更高精確度
	
有時候很多看似需要用數字存儲的數據 可能都是存的字元串
字元串沒有精確度一說

python本身對數字的精確度很低 之所以能夠從事人工智慧和數據分析完全得益於功能強大的模組
"""

image

image

image

3.MySQL基本數據類型之字元類型

# char(4)
	定長類型  最多只能存四個字元 多了報錯少了自動空格填充至四個
    
# varchar(4)
	變長類型  最多只能存四個字元 多了報錯少了有幾個則存幾個
    
# 多了報錯特性
	create table t10(id int, name char(4));
	create table t11(id int, name varchar(4));
	insert into t10 values(111,'jason')
	insert into t11 values(222,'jason')
	
針對5.6版本超出範圍不會報錯 而是自動幫你截取並保存(此行為不合理)
	解決方式1:修改配置文件(永久 不推薦)
	解決方式2:命令修改(暫時)
		1. show variables like '%mode%';
		2. set global sql_mode = 'strict_trans_tables';
		set session  # 當前窗口有效
		set global  # 當前服務端有效
		修改完畢後退出客戶端重新進入即可
		
		再次執行插入文本指令 直接報錯


# 定長與變長特性
	insert into t1o values(333,'k');
	insert into t11 values(444,'l');
	"""    
	此時看不出不同
	可以利用統計某個欄位數據的長度  char_length()
	select char_length(name) from t10 where id=333;
	底層確實會填充  但是取出來的時候又會自動去除
	加上下面指令後 退出重新進入客戶端再進行驗證即可:
	set global sql_mode = 'strict_trans_tables,pad_char_to_full_length';
    """

image

image

image

4.char與varchar的對比

# char
	優勢:整存整取 速度快
	劣勢:浪費存儲空間
        
# varchar
	優勢:節省存儲空間
	劣勢:存取數據的速度較char慢
"""
char(5) 存五位 取五位
	jasontony kevintom  oscartank sean jerry
	
varchar(5)
	1bytes+jason1bytes+tony1bytes+kevin1bytes+tom
	存:先計算數據的長度
	取:先獲取報頭的數據
"""

# 以前幾乎都是char 現在很多情況下使用varchar
	進了公司之後 會通過郵件告訴你每個欄位的英文名和中文名及類型等項目的諸多資訊
    
# 補充:在創建欄位的時候可以加上相應的注釋
	create table t12(
		id int comment '序號',
		name char(4) comment '姓名'
	);

5.整型中括弧內數字的作用

create table t13(id int(3));
insert into t13 values(555555555);
"""
在整型中括弧內的數字並不是用來限制存儲的長度 而是用來控制展示的長度

我們以後在定義整型欄位的時候 不需要自己添加數字 使用默認的就可以
"""

create table t14(id int(3) zerofill);
insert into t13 values(4);
# 結論:整型比較的特殊 括弧中的數字是唯一一個不是用來限制存儲長度的類型

image

6.枚舉與集合類型

# 枚舉
	多選一 關鍵字:enum()
create table user(
	id int,
	name varchar(32),
	gender enum('male','female','others')
);
insert into user values(1,'jason','男');  # 報錯
insert into user values(2,'jason','male');  # 正常


# 集合
	多選多(包含多選一) 關鍵字:set()
create table userinfo(
	id int,
	name char(16),
	hobby set('ball','girl','man','others')
);

image

image

7.日期類型

# date	年月日

# datetime	年月日時分秒

# time	時分秒

# year	年份

create table client(
	id int,
	name varchar(36),
	reg_time date,
	bieth datetime,
	study_time time,
	join_time year
);
insert into client values(1,'jason','2021-11-11','2021-12-12 12:12:00','12:12:00',2022);

image

8.創建表的完整語法

create table 表名(
	欄位名1 欄位類型(數字) 約束條件,
	欄位名2 欄位類型(數字) 約束條件,
	欄位名3 欄位類型(數字) 約束條件
);
"""
1.欄位名和欄位類型時必須的
2.數字和約束條件是可選的 並且 約束條件可以有多個 中間空格隔開即可
3.最後一個語句的結尾一定不要加逗號!!!
"""

9.約束條件之not null

# 約束條件相當於是在欄位類型的基礎之上 添加的額外約束
	例:id int unsigned
    
# unsigned	讓數字沒有正負號

# zerofill	多餘的使用數字0填充

# not null	非空
ceeate table t2(
	id int,
	name varchar(36) not null
);


"""
新增表數據的方式:
	方式一:
		按照欄位順序一一傳值
		insert into t1 values(1,'jason');
		
	方式二:
		自定義傳值順序 或者不傳值
		insert into t1(name,id) values('jason',1);
		insert into t1(id) values(1)
		在MySQL中不傳數據 會使用關鍵字NULL填充意思就是空 類似於python的None
"""

image

10.約束條件之default

# default	默認值
	所有的欄位都可以設置默認值 
	用戶不給該欄位傳值則使用默認的 否則使用傳了的
    
create table t1(
	id int default 911,
	name varchar(16) default 'jason'
);

image

11.約束條件之unique

# unique	唯一值

# 單列唯一
create table t2(
	id int,
	name varchar(32) unique
);
"""添加重複的name值時就會報錯"""


# 聯合唯一
create table t3(
	id int,
	host varchar(32),
	port int,
	unique(host,port)
);
"""
host 和 port兩項合在一起值不能重複
"""

image

image

12.約束條件之primary key與auto_increment

# primary key	主鍵
	單從約束層面上來說 相當於 not null + unique  # 非空且唯一
	在此基礎之上還可以加快數據的查詢
    
"""
# InnoDB存儲引擎規定了 一張表必須有且只有一個主鍵
	因為InnoDB是通過主鍵的方式來構造表的
	如果沒有設置主鍵
    
	情況1:沒有主鍵和其他約束條件
		InnoDB會採用隱藏的欄位作為主鍵 不能加快數據的查詢
		
	情況2:沒有主鍵但是有非空且唯一的欄位
		自動將該欄位升級為主鍵	
		create table t4(
			id int,
			age int not null unique,
			pwd int not null unique
		);
# 結論:
	以後我們在創建表的時候一定要設置主鍵
	並且主鍵欄位一般都是表的id欄位(例:uid sid pid cid)
	例如:
		create table user(
			id int primary key,
			name varchar(32)             
		);
"""
    
    
# auto_increment	自增(只能給主鍵用)
"""
由於主鍵類似於數據的唯一標識 並且主鍵一般都是數字類型
我們在添加數據的時候不可能記住接下來的序號是多少 太麻煩

create table user1(
	id int primary key auto_increment,
	name varchar(32)
);
"""

image

image

image

13.自增的特性

# 自增不會因為刪除操作而回退
	delete from無法影響自增
    
# 如果想要重置需需要使用truncate關鍵字
	truncate 表名  # 清空表數據並且重置主鍵值

image

image