1. 程式人生 > >python全棧開發 * mysql數據類型 * 180829

python全棧開發 * mysql數據類型 * 180829

應該 orm 技術 san 日期範圍 blob 如果 form ima

* 庫的操作   (增刪改查)
一.系統數據庫
查看系統庫命令 show databases
1.information_schema:
虛擬庫,不占用磁盤空間,存儲的是數據庫啟動後的一些參數,如用戶表信息、列信息、權限信息、字符信息等
2.performance_schema:
MySQL 5.5開始新增一個數據庫:主要用於收集數據庫服務器性能參數,記錄處理查詢請求時發生的各種事件、鎖等現象
3.myslq:
授權庫,主要存儲系統用戶的權限信息
4.test:
MySQL數據庫系統自動創建的測試數據庫
二.創建數據庫
1.求救語法: help create database;
2.創建數據庫語法 CREATE DATABASE 數據庫名 charset utf8;
3.數據庫命名規則:
可以由字母、數字、下劃線、@、#、$
區分大小寫
唯一性
不能使用關鍵字如 create select
不能單獨使用數字
最長128位
三.數據庫相關操作
1.查看數據庫 show databases;
2.查看當前庫 show create database db1;
3.查看所在的庫 select database()
4.選擇數據庫 use 數據庫名
5.刪除數據庫 drop database 數據庫名
6.修改數據庫 alter database db1 charset utf8;
四 補充:
1.SQL語言主要用於存取數據、查詢數據、更新數據和管理關系數據庫系統,SQL語言由IBM開發。SQL語言分為3種類型:
(1)DDL語句 數據庫定義語言: 數據庫、表、視圖、索引、存儲過程,例如CREATE DROP ALTER
(2)DML語句 數據庫操縱語言: 插入數據INSERT、刪除數據DELETE、更新數據UPDATE、查詢數據SELECT
(3)DCL語句 數據庫控制語言: 例如控制用戶的訪問權限GRANT、REVOKE

* 表的操作
一.存儲引擎
1.數據庫中的表也應該有不同的類型,表的類型不同,會對應mysql不同的存取機制,表類型又稱為存儲引擎
存儲引擎說白了就是如何存儲數據、如何為存儲的數據建立索引和如何更新、查詢數據等技術的實現方法。
2.在Oracle 和SQL Server等數據庫中只有一種存儲引擎,所有數據存儲管理機制都是一樣的
3.MySql數據庫提供了多種存儲引擎。用戶可以根據不同的需求為數據表選擇不同的存儲引擎,用戶也可以根據
自己的需要編寫自己的存儲引擎
二.mysql支持的存儲引擎
查看所有支持的引擎 show engines\G;
查看正在使用的存儲引擎 show variables like ‘storage_engine%‘;
1.InnoDB 存儲引擎
2.MyISAM 存儲引擎
3.Memory 存儲引擎
4.BLACKHOLE 黑洞存儲引擎
5.指定表類型/存儲引擎的命令:
create table t1(id int)engine=innodb;# 默認不寫就是innodb
小練習:
創建四張表,分別使用innodb,myisam,memory,blackhole存儲引擎,進行插入數據測試
create table t1(id int)engine=innodb;
create table t2(id int)engine=myisam;
create table t3(id int)engine=memory;
create table t4(id int)engine=blackhole;
查看數據庫中的文件:
(1).frm是存儲數據表的框架結構
(2).ibd是mysql數據文件
(3).MYD是MyISAM表的數據文件的擴展名
(4).MYI是MyISAM表的索引的擴展名
(5)memory 在重啟mysql或者重啟機器後,表內數據清空
(6)blackhole 往表內插入任何數據,都相當於丟入黑洞,表內永遠不存記錄.
三.表介紹:
表相當於文件,表中的一條記錄就相當於文件的一行內容,不同的是,表中的一條記錄有對應的標題,稱為表的字段.
id,name,sex,age,birth稱為字段,其余的,一行內容稱為一條記錄
四.創建表
語法:
create table 表名(
字段名1 類型[(寬度) 約束條件],
字段名2 類型[(寬度) 約束條件],
字段名3 類型[(寬度) 約束條件]
);
#註意:
1. 在同一張表中,字段名是不能相同
2. 寬度和約束條件可選
3. 字段名和類型是必須的
1.創建數據庫
create database db2 (charset utf8; )可省略
2.使用數據庫
use db2
3.創建表
create table a1(
id int,
name varchar(50)
age int(3)
);
4.插入表的記錄
insert into a1 values
(1,"mj",18),
(2,"wu",28);
5.查詢表的數據和結構
(1)查詢表中的存儲數據
select * from a1;
(2)查看a1表的結構
desc a1;
(3)查看表的詳細結構
show create table a1\G;
6.復制表
(1)新創建一個數據db3 create database db3 charset utf8;
(2)使用db3 use db3
(3)既復制表結構,又復制記錄create table b1 select * from db2.a1
(4)查看db3文件夾中的數據和表結構:select * from db3.b1;
7.如果只復制表結構,不要記錄
#在db2數據庫下新創建一個b2表,給一個where條件,條件要求不成立,條件為false,只拷貝表結構
create table b2 select * from db2.a1 where 1>5;
查看表結構 desc b2;
查看表結構中的數據,是空數據; select * from b2;
方法二:
create table b3 like db2.a1;
7.刪除表:
drop table 表明;

*數據類型
引入:
存儲引擎決定了表的類型,而表內存放的數據也要有不同的類型,每種數據類型都有自己的寬度,但寬度是可選的.
詳細參考鏈接:http://www.runoob.com/mysql/mysql-data-types.html
一.mysql常用數據類型概括:
1.數字
整型:tinyint int bigint
小數:
float:在位數比較長的情況下不精準
double:在位數比較長的情況下不精準
decimal:精準 內部原理是以字符串形式去存;
2.字符串:
char(10) :簡單粗暴,浪費空間,存取速度快
varchar:精準,節省空間,存取速度慢
sql優化:創建表時,定長(性別)的類型往前放,變長(地址 描述信息)的往後放
大於255個字符,超了就把文件路徑存放到數據庫中,(圖片 視頻數據庫中只存路徑或url).
3.時間類型 常用datetime
4.枚舉類型和集合類型
二.數值類型
(一) 整數類型:TINYINT SMALLINT MEDIUMINT INT BIGINT 默認有符號
作用:存儲年齡,等級,id,各種號碼等
1.tinyint[(m)] [unsigned] [zerofill]
小整數,數據類型用於保存一些範圍的整數數值範圍:
有符號:
-128 ~ 127
無符號:
0 ~ 255
MySQL中無布爾值,使用tinyint(1)構造。
2. int[(m)][unsigned][zerofill]
整數,數據類型用於保存一些範圍的整數數值範圍:
有符號:
-2147483648 ~ 2147483647
無符號:
0 ~ 4294967295
3.bigint[(m)][unsigned][zerofill]
大整數,數據類型用於保存一些範圍的整數數值範圍:
有符號:
-9223372036854775808 ~ 9223372036854775807
無符號:
0 ~ 18446744073709551615
註意:
默認是有符號; [unsigned](可設置)
int類型後面的存儲是顯示寬度,而不是存儲寬度
zerofill 用0填充 mysql> create table t4(id int(5) unsigned zerofill);
為該類型指定寬度時,僅僅只是指定查詢結果的顯示寬度,與存儲範圍無關,存儲範圍如下
其實我們完全沒必要為整數類型指定顯示寬度,使用默認的就可以了
默認的顯示寬度,都是在最大值的基礎上加1
(二)浮點型 (存儲薪資,身高,體重,體制參數)
1.定點數類型:dec等同於decimal
2.浮點類型:float double
語法:
單精度 float: FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
參數解釋: M是全長,D是小數點後個數.M最大值為255,D最大值為30
有符號:
-3.402823466E+38 to -1.175494351E-38,
1.175494351E-38 to 3.402823466E+38
無符號:
1.175494351E-38 to 3.402823466E+38
精確度:
**** 隨著小數的增多,精度變得不準確 ****
雙精度 double: DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
參數解釋: 雙精度浮點數(非準確小數值),M是全長,D是小數點後個數。M最大值為255,D最大值為30
有符號:
-1.7976931348623157E+308 to -2.2250738585072014E-308
2.2250738585072014E-308 to 1.7976931348623157E+308
無符號:
2.2250738585072014E-308 to 1.7976931348623157E+308
精確度:
****隨著小數的增多,精度比float要高,但也會變得不準確 ****
精準decimal: decimal[(m[,d])] [unsigned] [zerofill]
參數解釋:準確的小數值,M是整數部分總個數(負號不算),D是小數點後個數。 M最大值為65,D最大值為30。
精確度:
**** 隨著小數的增多,精度始終準確 ****
對於精確數值計算時需要用此類型
decaimal能夠存儲精確值的原因在於其內部按照字符串存儲。
三.日期類型: (DATE TIME DATETIME TIMESTAMP YEAR)
作用:存儲用戶註冊時間,文章發布時間,員工入職時間,出生時間,過期時間等
語法:
復制代碼
語法:
YEAR
YYYY(1901/2155)
create table t8(born_year year);#無論year指定何種寬度,最後都默認是year(4)

DATE
YYYY-MM-DD(1000-01-01/9999-12-31)

TIME
HH:MM:SS(‘-838:59:59‘/‘838:59:59‘)

DATETIME

YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59 Y)
create table t9(d date,t time,dt datetime);
insert into t9 values(now(),now(),now())
調用mysql自帶的now()函數,獲取當前類型指定的時間

TIMESTAMP

YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某時)
create table t10(time timestamp);
insert into t10 values(now());
補充:
在實際應用的很多場景中,MySQL的這兩種日期類型都能夠滿足我們的需要,存儲精度都為秒,但在某些情況下,會展現出他們各自的優劣。
下面就來總結一下兩種日期類型的區別。

1.DATETIME的日期範圍是1001——9999年,TIMESTAMP的時間範圍是1970——2038年。

2.DATETIME存儲時間與時區無關,TIMESTAMP存儲時間與時區有關,顯示的值也依賴於時區。在mysql服務器,
操作系統以及客戶端連接都有時區的設置。

3.DATETIME使用8字節的存儲空間,TIMESTAMP的存儲空間為4字節。因此,TIMESTAMP比DATETIME的空間利用率更高。

4.DATETIME的默認值為null;TIMESTAMP的字段默認不為空(not null),默認值為當前時間(CURRENT_TIMESTAMP),
如果不做特殊處理,並且update語句中沒有指定該列的更新值,則默認更新為當前時間。
註意:
#1. 單獨插入時間時,需要以字符串的形式,按照對應的格式插入
#2. 插入年份時,盡量使用4位值
#3. 插入兩位年份時,<=69,以20開頭,比如50, 結果2050
>=70,以19開頭,比如71,結果1971
create table t12(y year);
insert into t12 values (50),(71);
四.字符類型:
註意:char和varchar括號內的參數指的都是字符的長度
1. char類型:定長,簡單粗暴,浪費空間,存取速度快
字符長度範圍:0-255(一個中文是一個字符,是utf8編碼的3個字節)
存儲:
存儲char類型的值時,會往右填充空格來滿足長度
例如:指定長度為10,存>10個字符則報錯,存<10個字符則用空格填充直到湊夠10個字符存儲
檢索:
在檢索或者說查詢時,查出的結果會自動刪除尾部的空格,除非我們打開pad_char_to_full_length SQL模式(設置SQL模式:SET sql_mode = ‘PAD_CHAR_TO_FULL_LENGTH‘;
   查詢sql的默認模式:select @@sql_mode;)
2.varchar類型:變長,精準,節省空間,存取速度慢
字符長度範圍:0-65535(如果大於21845會提示用其他類型 。mysql行最大限制為65535字節,字符編碼為utf-8:https://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html
存儲:
varchar類型存儲數據的真實內容,不會用空格填充,如果‘ab ‘,尾部的空格也會被存起來
強調:varchar類型會在真實數據前加1-2Bytes的前綴,該前綴用來表示真實數據的bytes字節數(1-2Bytes最大表示65535個數字,正好符合mysql對row的最大字節限制,即已經足夠使用)
如果真實的數據<255bytes則需要1Bytes的前綴(1Bytes=8bit 2**8最大表示的數字為255)
如果真實的數據>255bytes則需要2Bytes的前綴(2Bytes=16bit 2**16最大表示的數字為65535)
檢索:
尾部有空格會保存下來,在檢索或者說查詢時,也會正常顯示包含空格在內的內容
3.相關函數:
length():查看字節數
char_length():查看字符數
查看字節數
#char類型:3個中文字符+2個空格=11Bytes
#varchar類型:3個中文字符+1個空格=10Bytes
總結:
#常用字符串系列:char與varchar
註:雖然varchar使用起來較為靈活,但是從整個系統的性能角度來說,char數據類型的處理速度更快,有時甚至可以超出varchar處理速度的50%。因此,用戶在設計數據庫時應當綜合考慮各方面的因素,以求達到最佳的平衡

#其他字符串系列(效率:char>varchar>text)
TEXT系列 TINYTEXT TEXT MEDIUMTEXT LONGTEXT
BLOB 系列 TINYBLOB BLOB MEDIUMBLOB LONGBLOB
BINARY系列 BINARY VARBINARY

text:text數據類型用於保存變長的大字符串,可以組多到65535 (2**16 ? 1)個字符。
mediumtext:A TEXT column with a maximum length of 16,777,215 (2**24 ? 1) characters.
longtext:A TEXT column with a maximum length of 4,294,967,295 or 4GB (2**32 ? 1) characters.

五.枚舉類型和集合類型
字段的值只能在給定範圍中選擇,如單選框,多選框
enum :單選 只能在給定的範圍內選一個值,如性別 sex 男male/女female
set :多選 在給定的範圍內可以選擇一個或一個以上的值(愛好1,愛好2,愛好3...)
示例:
mysql> create table consumer(
-> id int,
-> name varchar(50),
-> sex enum(‘male‘,‘female‘,‘other‘),
-> level enum(‘vip1‘,‘vip2‘,‘vip3‘,‘vip4‘),#在指定範圍內,多選一
-> fav set(‘play‘,‘music‘,‘read‘,‘study‘) #在指定範圍內,多選多
-> );
mysql> insert into consumer values
-> (1,‘趙雲‘,‘male‘,‘vip2‘,‘read,study‘),
-> (2,‘趙雲2‘,‘other‘,‘vip4‘,‘play‘);
六.完整性約束
(一)介紹
約束條件與數據類型的寬度一樣,都是可選參數
作用:用於保證數據的完整性和一致性
(二)
PRIMARY KEY (PK) #標識該字段為該表的主鍵,可以唯一的標識記錄
FOREIGN KEY (FK) #標識該字段為該表的外鍵
NOT NULL #標識該字段不能為空
UNIQUE KEY (UK) #標識該字段的值是唯一的
AUTO_INCREMENT #標識該字段的值自動增長(整數類型,而且為主鍵)
DEFAULT #為該字段設置默認值
說明:
#1. 是否允許為空,默認NULL,可設置NOT NULL,字段不允許為空,必須賦值
#2. 字段是否有默認值,缺省的默認值是NULL,如果插入記錄時不給字段賦值,此字段使用默認值
sex enum(‘male‘,‘female‘) not null default ‘male‘

#必須為正值(無符號) 不允許為空 默認是20
age int unsigned NOT NULL default 20
3. 是否是key
主鍵 primary key
外鍵 foreign key
索引 (index,unique...)
UNSIGNED #無符號
ZEROFILL #使用0填充
1.not null 與default
是否可空,null表示空,非字符串
not null - 不可空
null - 可空

默認值,創建列時可以指定默認值,當插入數據時如果未主動設置,則自動添加默認值

create table tb1(
nid int not null defalut 2,
num int not null
);
2.unique
在mysql中稱為單列唯一
第一
create table department(
id int,
name char(10) unique
);
insert into department values(1,‘it‘),(2,‘sale‘);
第二:
create table department(
id int,
name char(10) ,
unique(id),
unique(name)
);
insert into department values(1,‘it‘),(2,‘sale‘);
聯合唯一:
mysql> create table services(
-> id int,
-> ip char(15),
-> port int,
-> unique(id),
-> unique(ip,port)
-> );
insert into services values
-> (1,‘192,168,11,23‘,80),
-> (2,‘192,168,11,23‘,81),
-> (3,‘192,168,11,25‘,80);

3.primary key not null + unique的化學反應,相當於給id設置primary key
單列做主鍵
多列做主鍵(復合主鍵)
約束等價於 not null unique,字段的值不為空且唯一:
存儲引擎默認是(innodb):對於innodb存儲引擎來說,一張表必須有一個主鍵。
(1)單列主鍵
創建t14表,為id字段設置主鍵,唯一的不同的記錄
create table t14(
id int primary key,
name char(16)
);
insert into t14 values
(1,‘xiaoma‘),
(2,‘xiaohong‘);
錯誤:insert into t14 values(2,‘wxxx‘);
(2)復合主鍵
create table t16(
ip char(15),
port int,
primary key(ip,port)
);

insert into t16 values
(‘1.1.1.2‘,80),
(‘1.1.1.2‘,81);

4.auto_increment
約束:約束的字段為自動增長,約束的字段必須同時被key約束
示例:
create table student(
id int primary key auto_increment,
name varchar(20),
sex enum(‘male‘,‘female‘) default ‘male‘
);
不指定id
insert into student(name) values (‘老白‘),(‘小白‘)
指定ID
insert into student values(4,‘asb‘,‘female‘);
再次插入一條不指定id的記錄,會在之前的最後一條記錄繼續增長
mysql> insert into student(name) values (‘大白‘);
DELETE註意:
對於自增的字段,在用delete刪除後,再插入值,該字段仍按照刪除前的位置繼續增長
示例:delete:
delete from student;
insert into student(name) values(‘ysb‘);
效果:
id | name | sex |
+----+------+------+
| 9 | ysb | male |
應該用truncate清空表,比起delete一條一條地刪除記錄,truncate是直接清空表,在刪除大表時用它
TRUNCATE清空表
truncate student
insert into student(name) values(‘xiaobai‘);
| id | name | sex |
+----+---------+------+
| 1 | xiaobai | male |
補充:
查看可用的 開頭auto_inc的詞
show variables like ‘auto_inc%‘;
步長auto_increment_increment,默認為1
# 起始的偏移量auto_increment_offset, 默認是1

設置步長 為會話設置,只在本次連接中有效
set session auto_increment_increment=5;
#全局設置步長 都有效。
set global auto_increment_increment=5;

# 設置起始偏移量
set global auto_increment_offset=3;
註意:
如果auto_increment_offset的值大於auto_increment_increment的值,則auto_increment_offset的值會被忽略
設置完起始偏移量和步長之後,再次執行show variables like‘auto_inc%‘;
發現跟之前一樣,必須先exit,再登錄才有效。

清空表區分delete和truncate的區別:
delete from t1; #如果有自增id,新增的數據,仍然是以刪除前的最後一樣作為起始。
truncate table t1;數據量大,刪除速度比上一條快,且直接從零開始。
5.foreign key
情景:
公司有3個部門,但是有1個億的員工,那意味著部門這個字段需要重復存儲,部門名字越長,越浪費。
解決方法:
我們完全可以定義一個部門表
員工信息表關聯該表,如何關聯,即foreign key
一張是employee表,簡稱emp表(關聯表,也就從表)
一張是department表,簡稱dep表(被關聯表,也叫主表)
代碼:
#1.創建表時先創建被關聯表,再創建關聯表
# 先創建被關聯表(dep表)
create table dep(
id int primary key,
name varchar(20) not null,
descripe varchar(20) not null
);

#再創建關聯表(emp表)
create table emp(
id int primary key,
name varchar(20) not null,
age int not null,
dep_id int,
constraint fk_dep foreign key(dep_id) references dep(id)
);

#2.插入記錄時,先往被關聯表中插入記錄,再往關聯表中插入記錄

insert into dep values
(1,‘IT‘,‘IT技術有限部門‘),
(2,‘銷售部‘,‘銷售部門‘),
(3,‘財務部‘,‘花錢太多部門‘);

insert into emp values
(1,‘zhangsan‘,18,1),
(2,‘lisi‘,19,1),
(3,‘egon‘,20,2),
(4,‘yuanhao‘,40,3),
(5,‘alex‘,18,2);
3.刪除表
#按道理來說,刪除了部門表中的某個部門,員工表的有關聯的記錄相繼刪除。
但是先刪除員工表的記錄之後,再刪除當前部門就沒有任何問題
上面的刪除表記錄的操作比較繁瑣,按道理講,裁掉一個部門,該部門的員工也會被裁掉。其實呢,在建表的時候還有個很重要的內容,
叫同步刪除,同步更新
註意:在關聯表中加入
on delete cascade #同步刪除
on update cascade #同步更新
代碼:復制代碼
create table emp(
id int primary key,
name varchar(20) not null,
age int not null,
dep_id int,
constraint fk_dep foreign key(dep_id) references dep(id)
on delete cascade #同步刪除
on update cascade #同步更新
);
#再去刪被關聯表(dep)的記錄,關聯表(emp)中的記錄也跟著刪除
delete from dep where id=3;
再去更改被關聯表(dep)的記錄,關聯表(emp)中的記錄也跟著更改
update dep set id=222 where id=2;

python全棧開發 * mysql數據類型 * 180829