mysql 高階特性的簡單入門

2021-10-07 22:43:36 字數 2828 閱讀 6582

首先我們需要了解一下mysql的三大正規化:

定義正規化:英文名稱是 normal form,它是英國人 e.f.codd(關聯式資料庫的老祖宗)在上個世紀70年代提出關聯式資料庫模型後總結出來的,正規化是關聯式資料庫理論的基礎,也是我們在設計資料庫結構過程中所要遵循的規則和指導方法。目前有跡可尋的共有8種正規化,依次是:1nf,2nf,3nf,bcnf,4nf,5nf,dknf,6nf。通常所用到的只是前三個正規化,即:第一正規化(1nf),第二正規化(2nf),第三正規化(3nf)。下面就簡單介紹下這三個正規化。

第一正規化(1nf)

強調的是列的原子性,即列不能夠再分成其他幾列。

考慮這樣乙個表:【聯絡人】(姓名,性別,**)

如果在實際場景中,乙個聯絡人有家庭**和公司**,那麼這種表結構設計就沒有達到 1nf。要符合 1nf 我們只需把列(**)拆分,即:【聯絡人】(姓名,性別,家庭**,公司**)。1nf 很好辨別,但是 2nf 和 3nf 就容易搞混淆。

第二正規化(2nf)

首先是 1nf,另外包含兩部分內容,一是表必須有乙個主鍵;二是沒有包含在主鍵中的列必須完全依賴於主鍵,而不能只依賴於主鍵的一部分。

考慮乙個訂單明細表:【orderdetail】(orderid,productid,unitprice,discount,quantity,productname)。

因為我們知道在乙個訂單中可以訂購多種產品,所以單單乙個 orderid 是不足以成為主鍵的,主鍵應該是(orderid,productid)。顯而易見 discount(折扣),quantity(數量)完全依賴(取決)於主鍵(oderid,productid),而 unitprice,productname 只依賴於 productid。所以 orderdetail 表不符合 2nf。不符合 2nf 的設計容易產生冗餘資料。

可以把【orderdetail】表拆分為【orderdetail】(orderid,productid,discount,quantity)和【product】(productid,unitprice,productname)來消除原訂單表中unitprice,productname多次重複的情況。

第三正規化(3nf)

首先是 2nf,另外非主鍵列必須直接依賴於主鍵,不能存在傳遞依賴。即不能存在:非主鍵列 a 依賴於非主鍵列 b,非主鍵列 b 依賴於主鍵的情況。

考慮乙個訂單表【order】(orderid,orderdate,customerid,customername,customeraddr,customercity)主鍵是(orderid)。

其中 orderdate,customerid,customername,customeraddr,customercity 等非主鍵列都完全依賴於主鍵(orderid),所以符合 2nf。不過問題是 customername,customeraddr,customercity 直接依賴的是 customerid(非主鍵列),而不是直接依賴於主鍵,它是通過傳遞才依賴於主鍵,所以不符合 3nf。

通過拆分【order】為【order】(orderid,orderdate,customerid)和【customer】(customerid,customername,customeraddr,customercity)從而達到 3nf。

備註第二正規化(2nf)和第三正規化(3nf)的概念很容易混淆,區分它們的關鍵點在於,2nf:非主鍵列是否完全依賴於主鍵,還是依賴於主鍵的一部分;3nf:非主鍵列是直接依賴於主鍵,還是直接依賴於非主鍵列。

簡單的來說:第一正規化表示原子性:比如具體的部門,位址,代號等。

第二正規化代表一張表只描述一件事

第三正規化表示表中資料的不可傳遞性,比如需要計算的不可設定單獨字段。

接下來是索引的基本的命令:

show index form tablename;

create [unique] index indxname on tablename(fields(length:string)…);

drop index indexname on tablename;

在mysql中有一些我們有時會使用的函式,這裡我只舉出一些我平時可能會用到的函式:

mod(x,y)

ceil(float)

floor(float)

round(float[,n])

字串函式

length(varchar) 返回字串的位元組長度

char_length(varchar) 返回字串的長度

concat(str1,str2,…) 合併字串

concat_ws(joinstr,str1,str2,…) 連線字串

lower(str1)/upper(str1)

left(str1,n)/right(str1,n)/mid(str1,startpos,n)

instr(str1,deststr) 返回deststr在str1中的位置(從1開始),不存在返回0

reverse(str1) 字串反轉

日期函式

now()/curdate()

year(date)/month(date)/day(date)/dayofweek(date)/quarter(date)

date_add(date,interval num type) 在乙個日期上新增固定的時間(type)

datediff(bigdate,smalldate)

條件函式

if(condition,v1,v2)

ifnull(v1,v2) <=> if(v1=null,v2,v1)

case expr when val1 then v1…else vn end

系統函式

version()

connection_id() 連過的使用者

user()

MySQL高階特性 合併表

如果願意的話,可以把合併表看成一種較老的 有更多限制的分割槽表,但是它們也有自己的用處,並且能提供一些分割槽表不能提供的功能。合併表實際是容納真正的表的容器。可以使用特殊的union語法來create table。下面是乙個合併表的例子 mysql create table t1 a int not...

mysql子程式的高階特性(一)

delimiter create procedure test prod not deterministic begin update test score set score 6 where id 5 limit 1 end delimiter not deterministic 表示子程式包含了...

MySQL入門 7(索引特性)

索引使用場景 1.資料量較大,且經常對這些列進行條件查詢。2.該資料庫表的插入操作,及對這些列的修改操作頻率較低。3.索引會占用額外的磁碟空間。滿足以上條件時,考慮對錶中的這些字段建立索引,以提高查詢效率。反之,如果非條件查詢列,或經常做插入 修改操作,或磁碟空間不足時,不考慮建立索引。索引作用 1...