數據庫表的定義、視圖與設計


數據類型:

整數類型:

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表示的含義是“時間戳”,其實就是指“當前時刻”,本質上是一個數字,代表從197011000秒到某個時間之間的秒數數值。該類型的字段值無需賦值,而是會自動取得當前時間值。

 

字符串類型

 

最基本最重要的2個:

 

varchar類型:可變長度字符串類型。最多能存儲65532個字節的字符串——也還要考慮字符編碼。設定的長度只是最長長度,但可以不存滿,則實際長度以數據長度為准。

 

 

 

char類型:定長字符串類型。最多能存儲256個字符。如果存儲的數據不足設定的長度,則會自動補空格填滿。

 

 

 

設定時都需要給定長度,比如:varchar(20),  char(6);

 

mysql,一行的所有內容的總的存儲長度也有個限制,約65535個。

 

2個二進制文本:

 

binary 類似char,只是里面不存“文本”,而是存“文本的二進制數據”

 

varbinary: ,類似varchar,同樣,不存“文本”,而是存“文本的二進制數據”

 

2個大文本類型:

 

text 可以存儲“超大文本”,且其實際的長度並不占用一行的長度。相對charvarchar,效率低。

 

blob:  可以存儲“超大二進制文本”,通常用於存儲圖片這種“二進制數據”

 

2個有關“選項”的文本存儲形式:

 

enum

 

專門用於方便存儲類似表單中的“單選項”的值。

 

形式:

 

enum(‘選項1’,‘選項2’,‘選項3’,......

 

這些選項的值雖然是字符串,但其數據庫內部存儲其實是數字(效率高),他們的數字值是:12345,。。。。。最多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  key3個角度的理解(說法):字段屬性設置為主鍵,或建立的主鍵索引,或設定一個主鍵約束,但他們的本質是一樣

唯一約束unique  key  (字段名1,字段名2.... ,其實也是“3體合一”(類似primary key)

外鍵約束

什么叫外鍵:就是設定一個表中的某個字段的值,必須“來源於”另一個表的某個主鍵字段的值。

語法形式:

foreign key (字段名1,字段名2.... ) references 表名2(字段名1,字段名2.... )

說明:

對某個(些)字段設定外鍵,則其相對應的其他表的對應字段需要設置為主鍵。

非空約束:就是要求該字段的值不能為空,其只能在字段上當作字段屬性來設定。

默認約束:就是要求該字段的值在“空”的時候會自動填充該設定的默認值,也只能字段上設定。

檢查約束:就是使用一個表達式(邏輯判斷)來決定數據是否有效,比如年齡字段,可以使用

tinyint,則可能會超過127就不合適了。

tinynit  unsigned,則0-255是可以的。

但:如果考慮現實情況,假設某保險公司只作150歲以下的人的保險。則我們就可以繼續對該字段可能存儲的數據進行“約束”。比如類似:ifage > 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

 

實際上,一個表只要有主鍵,則其他非主鍵一定是依賴於主鍵的。

 

 

 

什么叫“部分依賴”:

 

如果確定一個表中的某個數據組合(AB),則就可以確定該表中的其他另一個數據(C),則我們說:C依賴於(AB)(此時AB通常就是做出主鍵)。

 

但:如果某個數據D,它只依賴於數據A,或者說,A一確定,則D也可以確定,此時我們就稱為“數據D部分依賴於數據A——可見部分依賴是指某個非主鍵字段,依賴於聯合主鍵字段的其中部分字段

 

 

第三范式(3NF):獨立性,消除傳遞依賴

在一個具有主鍵的表中,假設主鍵為A,其必然其他非主鍵都依賴於該主鍵,比如:B依賴於AC依賴於AD依賴於A。。。。。。

但同時:如果該表中的某個字段B的值一確定,就能夠確定另一個字段的值C,則我們稱為C依賴於B

那么,就出現了:

C依賴BB依賴A——這就是傳遞依賴

消除該傳遞依賴的的通常做法,就是C依賴於B的數據,分離到另一個表中

理解:把表格拆分統計

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM