早就想把自己的資料庫基礎鞏固一下,然而一直沒有時間,今天終於抽出時間對mysql資料庫基礎進行了學習與擴充套件。

mysql與其他資料庫的區別

Sqlite: 開源免費,體積小,單檔案,沒有程序。磁碟讀效能強大。寫併發性較低。

Mysql:開源免費,關係型資料庫,體積小效能強,完全的多執行緒實現,多平臺移植。

Sqlserver:微軟出品,只能執行在windows上。與windows server 配合很好

Oracle:安全性高,效能高,相容性高,可移植性高。價格昂貴,維護難度大,學習成本高。

mysql例項及重要版本節點

例項即伺服器上的程序。ps -ef|grep mysql可以進行檢視。

mysql重要的版本節點:5.5/5.7/8.0

(詳情瞭解這裡

檢視

虛擬表,實際是執行一個預置sql。表面和表格一樣,對程式碼不透明。

索引

索引的作用:快速定位資料。
索引的缺點:額外佔用空間,資料變更時需要同步更新索引。(詳情瞭解這裡
索引的型別:

1)普通索引 index:加速查詢資料。

2)唯一索引

主鍵索引:primary key 加速查詢+約束(不為空且唯一)。

唯一索引:unique 加速查詢資料+約束(唯一)。

3)聯合索引:

primary key(id,name):聯合主鍵索引。

unique(id,name):聯合唯一索引。

index(id,name):聯合普通索引。

4)全文索引fulltext :用於搜尋很長一篇文章的時候,效果最好。

5)空間索引spatial :瞭解就好,幾乎不用

建立/刪除索引的語法

點選檢視程式碼
#方法一:建立表時
  CREATE TABLE 表名 (
欄位名1 資料型別 [完整性約束條件…],
欄位名2 資料型別 [完整性約束條件…],
[UNIQUE | FULLTEXT | SPATIAL ] INDEX | KEY
[索引名] (欄位名[(長度)] [ASC |DESC])
); #方法二:CREATE在已存在的表上建立索引
CREATE [UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名
ON 表名 (欄位名[(長度)] [ASC |DESC]) ; #方法三:ALTER TABLE在已存在的表上建立索引
ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT | SPATIAL ] INDEX
索引名 (欄位名[(長度)] [ASC |DESC]) ; #刪除索引:DROP INDEX 索引名 ON 表名字;

`善用幫助文件

help create

help create index

1.建立索引

-在建立表時就建立(需要注意的幾點)

create table s1(

id int ,#可以在這加primary key

#id int index #不可以這樣加索引,因為index只是索引,沒有約束一說,

#不能像主鍵,還有唯一約束一樣,在定義欄位的時候加索引

name char(20),

age int,

email varchar(30)

#primary key(id) #也可以在這加

index(id) #可以這樣加

);

-在建立表後在建立

create index name on s1(name); #新增普通索引

create unique age on s1(age);新增唯一索引

alter table s1 add primary key(id); #新增住建索引,也就是給id欄位增加一個主鍵約束

create index name on s1(id,name); #新增普通聯合索引

2.刪除索引

drop index id on s1;

drop index name on s1; #刪除普通索引

drop index age on s1; #刪除唯一索引,就和普通索引一樣,不用在index前加unique來刪,直接就可以刪了

alter table s1 drop primary key; #刪除主鍵(因為它新增的時候是按照alter來增加的,那麼我們也用alter來刪)`

常見函式

IF:三個引數,第一個引數為返回真假的表示式,當表示式為1時,函式返回第二個引數,否則返回第三個引數。

UNIX_TIMESTAMP:當無引數時返回當前時間戳,加日期引數返回的是日期時間戳。

FROM_UNIXTIME:把時間戳格式化。

COUNT:聚合函式,計數。

SUM:聚合函式,求和。

LENGTH:返回字串長度。

(詳情點選這裡

基礎sql

1.insert

Insert into table( col1,col2,… ) values (col1val, col2val,…) ;正常用法(當有主鍵,插入相同資料時,報錯;當沒有主鍵時,會直接插入,產生相同資料)。

(`的作用,通常用來說明其中的內容是資料庫名、表名、欄位名,防止資料庫將其識別為關鍵字)

Replace into :

與insert into類似(當有主鍵或唯一索引時, 如果發現表中已經有此行資料(根據主鍵或者唯一索引判斷)則先刪除此行資料,然後插入新的資料,否則,直接插入新資料。當不存在主鍵時,replace into 會直接插入資料,這將導致表中出現重複的資料。)

Insert ignore into:當在表中發現已存在資料時,忽略新資料。

Insert into … ON DUPLICATE KEY UPDATE values(col)

  1. on duplicate key update 含義:

    1)如果在INSERT語句末尾指定了 on duplicate key update,

    並且插入行後會導致在一個UNIQUE索引或PRIMARY KEY中出現重複值,

    則在出現重複值的行執行UPDATE;

    2)如果不會導致唯一值列重複的問題,則插入新行。

  2. values(col_name)函式只是取當前插入語句中的插入值,並沒有累加功能。

    如:count = values(count) 取前面 insert into 中的 count 值,並更新

    當有多條記錄衝突,需要插入時,前面的更新值都被最後一條記錄覆蓋,

    所以呈現出取最後一條更新的現象。

    如:count = count + values(count) 依然取前面 insert into 中的 count 值,

    並與原記錄值相加後更新回資料庫,這樣,當多條記錄衝突需要插入時,

    就實現了不斷累加更新的現象。

注:insert into ... on duplicate key update ... values() 這個語句

儘管在衝突時執行了更新,並沒有插入,但是發現依然會佔用 id 序號(自增),

出現很多丟失的 id 值,

(詳情點選這裡

Insert into table1( col1,col2,… ) select col1,col2,… from table2

從一個表中複製資料,然後將資料插到另一個表中。

Insert into table1

select * from table2


將一個表中的所有列插到另一個表中。

2.update

1)Update table set col=val where 正常更新。

2)update table set sex= '男', name='張三' where id = 1 ; 更新多個欄位用逗號,而不是and。

3)UPDATE table1 a left JOIN table2 b ON a.HOSTID = b.hostid SET a.GROUP_ID = CASE ID

    WHEN 1 THEN

    'abc'

    WHEN 2 THEN

    'def'

    WHEN 3 THEN

    'ghi'

    ELSE

    'jkl'

END

WHERE b.groupid = '00000000-1111-2222-3333-444444444444'


複雜情況,結合表聯合、case。

3.delete

delete from where 正常用法。

複雜語句分析

Select ... from ... join ... on ... where ... group by ... having ... order by ... limit

分析順序:

From →join→on→where→groupby→Select→having→orderby→limit

Where 中的匹配方式

=, >, <, >=, <=, <>, !=

In, not in, like, between, is null, is not null

修改表結構的DDL

Create,Alert,Drop

另外有一個學sql的網站這裡,有空可以多看看。