數據類型:
整數類型:
tinyint(1字節), smallint(2字節), mediumint(3字節),int(4字節), bigint(8字節);
Byte 1111 1111
1字節=8位(8個燈泡)
一個燈泡只能表達2個意思(2個數字)
2個燈泡可以表達4個意思
3個燈泡可以表達8個意思
。。。。。
8個燈泡(1個字節)可以表達256個數字。
默認情況下,這些整數類型都是可正可負的,那么:
tinyInt就只能存儲: -128--127這些數;
通用設定形式:
定義一個字段(表頭)的時候的類型的寫法。
比如:
create table tab1 (f1 數據類型 );
數據類型: 類型名[(長度n)] [unsigned] [zerofill]
長度n: 表示的意思是該數字的“顯示形式上的長度”,
unsigned:設定為“無符號”數,則此時不能存儲負數,正數幾乎加倍。
zerofill:填充0,是指如果一個數字的長度不夠指定長度的時候,可以在左邊填充0以補到該長度。
注意: 如果設置了zerofill,則自動也就表示同時具備了unsigned修飾的含義
小數類型
可以分為:
單精度浮點型: float,非精確數,通常不設定長度
雙精度浮點:double,非精確數,通常不設定長度
定點型:decimal,精確數,通常,定點型需要設定長度,形式為:decimal(總長, 小數位數)
時間日期類型
有如下:
date, time, datetime, year, timestamp
注意:
寫入數據庫時,直接的時間日期數據(具體的時間格式,如:2018-01-29),應該用單引號引起了。
year類型可以是4位整數或4位純數字字符串,也可以是2位整數或2位純數字字符串
timestamp表示的含義是“時間戳”,其實就是指“當前時刻”,本質上是一個數字,代表從1970年1月1日0點0分0秒到某個時間之間的秒數數值。該類型的字段值無需賦值,而是會自動取得當前時間值。
字符串類型
最基本最重要的2個:
varchar類型:可變長度字符串類型。最多能存儲65532個字節的字符串——也還要考慮字符編碼。設定的長度只是最長長度,但可以不存滿,則實際長度以數據長度為准。
char類型:定長字符串類型。最多能存儲256個字符。如果存儲的數據不足設定的長度,則會自動補空格填滿。
設定時都需要給定長度,比如:varchar(20), char(6);
mysql,一行的所有內容的總的存儲長度也有個限制,約65535個。
2個二進制文本:
binary: 類似char,只是里面不存“文本”,而是存“文本的二進制數據”
varbinary: ,類似varchar,同樣,不存“文本”,而是存“文本的二進制數據”
2個大文本類型:
text: 可以存儲“超大文本”,且其實際的長度並不占用一行的長度。相對char和varchar,效率低。
blob: 可以存儲“超大二進制文本”,通常用於存儲圖片這種“二進制數據”
2個有關“選項”的文本存儲形式:
enum:
專門用於方便存儲類似表單中的“單選項”的值。
形式:
enum(‘選項1’,‘選項2’,‘選項3’,......)
這些選項的值雖然是字符串,但其數據庫內部存儲其實是數字(效率高),他們的數字值是:1, 2, 3,4, 5,。。。。。最多6萬多個。
舉例:
結果:
練習:
單選按順序來,幾就是幾;多選,湊數順序(1,2,4,8,16...依次排序)
多選的 7 等於第一個數加第二個數加第四個數 湊齊
set:專門用於方便存儲類似表單中的“多選項”的值。
形式:
set (‘選項1’,‘選項2’,‘選項3’,......)
創建表:
基本形式
create table [if not exists] 表名(字段列表, [約束或索引列表]) [表選項列表];
說明:列表都是表示“多個”,相互之間用逗號分開。
字段基本形式: 字段名 類型 [字段修飾屬性];
字段屬性設置
not null: 不為空,表示該字段不能放“null”這個值。不寫,則默認是可以為空
auto_increment: 設定int類型字段的值可以“自增長”,即其值無需“寫入”,而會自動獲得並增加
此屬性必須隨同 primary key 或 unique key 一起使用。
[primary] key: 設定為主鍵。是唯一鍵“加強”:也不能重復並且不能使用null,並且可以作為確定任意一行數據的“關鍵值”,最常見的類似:where id= 8; 或 where user_name = ‘zhangsan’;
通常,每個表都應該有個主鍵,而且大多數表,喜歡使用一個id並自增長類型作為主鍵。
但:一個表只能設定一個主鍵
unique [key] : 設定為唯一鍵:表示該字段的所有行的值不可以重復(唯一性)。
default ‘默認值’: 設定一個字段在沒有插入數據的時候自動使用的值。
comment ‘字段注釋’:
舉例:
索引設置
什么是索引:
索引是一個“內置表”,該表的數據是對某個真實表的某個(些)字段的數據做了“排序”之后的存儲形式。
其作用是:極大提高表查找數據的速度!——其效率(速度)可以匹敵二分查找。
注意:索引在提供查找速度的同時,降低增刪改的速度。
對創建(設計)表來說,建立索引是非常簡單的事,形式如下:
索引類型 (字段名1,字段名2, .... ) //可以使用多個字段建立索引,但通常是一個
有以下幾種索引:
普通索引:key(字段名1,字段名2, .... ):它只具有索引的基本功能——提速
唯一索引:unique key (字段名1,字段名2, .... )
主鍵索引:primary key (字段名1,字段名2, .... )
全文索引:fulltext (字段名1,字段名2, .... )
舉例:
約束設置
什么叫約束:約束就是一種限定數據以符合某種要求的形式(機制)
約束主要有:
主鍵約束:primary key (字段名1,字段名2, .... )
其實就是主鍵索引,也是主鍵屬性。即primary key有3個角度的理解(說法):字段屬性設置為主鍵,或建立的主鍵索引,或設定一個主鍵約束,但他們的本質是一樣
唯一約束:unique key (字段名1,字段名2, .... ),其實也是“3體合一”(類似primary key)
外鍵約束:
什么叫外鍵:就是設定一個表中的某個字段的值,必須“來源於”另一個表的某個主鍵字段的值。
語法形式:
foreign key (字段名1,字段名2, .... ) references 表名2(字段名1,字段名2, .... )
說明:
對某個(些)字段設定外鍵,則其相對應的其他表的對應字段需要設置為主鍵。
非空約束:就是要求該字段的值不能為空,其只能在字段上當作字段屬性來設定。
默認約束:就是要求該字段的值在“空”的時候會自動填充該設定的默認值,也只能字段上設定。
檢查約束:就是使用一個表達式(邏輯判斷)來決定數據是否有效,比如年齡字段,可以使用
tinyint,則可能會超過127就不合適了。
tinynit unsigned,則0-255是可以的。
但:如果考慮現實情況,假設某保險公司只作150歲以下的人的保險。則我們就可以繼續對該字段可能存儲的數據進行“約束”。比如類似:if(age > 150){return false}
可惜的是:mysql不支持檢查約束的語法和功能。
表選項:
表選項就是對一個表的有關屬性的設定,通常都不需要。如果不設定,則有其默認值。
有以下幾個可用:
comment = ‘表的注釋’;
charset = 字符編碼名稱; //跟數據的字符編碼設定一個意思。
字符編碼設定的范圍及繼承關系:
系統級設定:安裝時確定了。
庫級設定:建庫時設定;
表級設定:就是這里的charset = 字符編碼名稱
字段級設定:作為字段屬性出現。
他們都只對“字符類型”的字段有效。每一級如果沒有設定,就會“繼承使用”其上一級的設定。
auto_increment = 起始整數; //自增長類型值的初值,默認是1
engine = “表的存儲引擎名”; //
存儲引擎就是將數據存入硬盤(或其他媒介)的方式方法。通常就幾個可用,默認是InnoDB
存儲引擎決定一個數據表的各方面的信息:功能和性能。
修改表:
一般概述
通常,創建一個表,能搞定(做到)的事情,修改表也能做到。大體來說,就可以做到:
增刪改字段:
增:alter table 表名 add [column] 字段名 字段類型 字段屬性;
刪: alter table 表名 drop 字段名
改:alter table 表名 change 原字段名 新字段名 新字段類型 新字段屬性;
增刪索引:
增刪約束:
修改表選項:
修改表的基本形式:
alter table 表名 修改語句1,修改語句2, ..... ;
刪除表:
drop table [if exists] 表名;
表的其他操作:
顯示所有表show tables:
顯示表結構desc 表名;
顯示表的創建語句: show create table 表名;
從已有表復制表結構:create table [if not exists] 新表名 like 原表名;
從已有表復制表結構:create table [if not exists] 新表名 select * from 原表名 where 1<>1;(不推薦)
視圖
單詞:view
什么是視圖:
視圖可以看作是一個“臨時存儲的數據所構成的表”(非真實表),其實本質上只是一個select語句。只是將該select語句(通常比較復雜)進行一個“包裝”,並設定了一個名字,其后就可以通過該名字並把該名字當作一個表來使用。
如果一個select語句比較復雜,又在多個頁面需要使用它,則可以將它做成一個視圖,方便使用。
又如果,某個數據表中的某些字段不想給別人看(不同公司之間的數據業務交換的時候),但另一個又需要給人看,此時也可以使用視圖。
視圖創建形式:
create view 視圖名 [(列名1,列名2,...)] as 一條復雜select語句;
可以將select語句所取得的列重新命名,但也可以不重新命名,則使用select語句中的給定列名。
修改視圖:
alter view 視圖名 [(列名1,列名2,...)] as select語句;
刪除視圖:
drop view [if exists] 視圖名;
數據庫設計3范式(3NF):
范式,就是規范,就是指設計數據庫需要(應該)遵循的原則。
第一范式(1NF),原子性
存儲的數據應該具有("不可再分性")
舉例:
第二范式(2NF)唯一性
需要實現每一行數據具有唯一可區分的特性,並不能有部分依賴關系。》》》主鍵
通常,給一個表加主鍵(也是推薦做法),就可以做到“唯一可區分”。
但主鍵有這樣情況:
設定一個字段為主鍵:此時,表示該一個字段的值就可以明確確定一行數據。
設定多個字段為主鍵:表示只有這多個字段的值都確定后才能確定一行數據。此時也稱為“聯合主鍵”
什么叫依賴:
如果確定一個表中的某個數據(A),則就可以確定該表中的其他另一個數據(B),則我們說:B依賴於A。
實際上,一個表只要有主鍵,則其他非主鍵一定是依賴於主鍵的。
什么叫“部分依賴”:
如果確定一個表中的某個數據組合(A,B),則就可以確定該表中的其他另一個數據(C),則我們說:C依賴於(A,B)(此時A,B通常就是做出主鍵)。
但:如果某個數據D,它只依賴於數據A,或者說,A一確定,則D也可以確定,此時我們就稱為“數據D部分依賴於數據A——可見部分依賴是指某個非主鍵字段,依賴於聯合主鍵字段的其中部分字段。
第三范式(3NF):獨立性,消除傳遞依賴
在一個具有主鍵的表中,假設主鍵為A,其必然其他非主鍵都依賴於該主鍵,比如:B依賴於A,C依賴於A,D依賴於A。。。。。。
但同時:如果該表中的某個字段B的值一確定,就能夠確定另一個字段的值C,則我們稱為C依賴於B。
那么,就出現了:
C依賴B,B依賴A——這就是傳遞依賴
則消除該傳遞依賴的的通常做法,就是將C依賴於B的數據,分離到另一個表中。
理解:把表格拆分統計