早就想把自己的資料庫基礎鞏固一下,然而一直沒有時間,今天終於抽出時間對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)
on duplicate key update 含義:
1)如果在INSERT語句末尾指定了 on duplicate key update,
並且插入行後會導致在一個UNIQUE索引或PRIMARY KEY中出現重複值,
則在出現重複值的行執行UPDATE;
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的網站這裡,有空可以多看看。