1. 程式人生 > >MySQL中的常用關鍵字

MySQL中的常用關鍵字

很久不用MySQL,感覺又是一個新的玩意兒了,寫起SQL語句來感覺好陌生,確實是很久了!

distinct

查詢出某個欄位不重複的記錄。可用distinct來返回不重複欄位的條數count(distinct id)

limit

記得這個可以用來做分頁。它後面可以接受一個或兩個數字引數。引數必須是一個整數常量。如果給定兩個引數,第一個引數指定第一個返回記錄行的偏移量,第二個引數指定返回記錄行的最大數目

//初始記錄行的偏移量是 0(而不是 1):
mysql> SELECT * FROM table LIMIT 5,10; //檢索記錄行6-15

//為了檢索從某一個偏移量到記錄集的結束所有的記錄行,可以指定第二個引數為 -1:
mysql> SELECT
* FROM table LIMIT 95,-1;
// 檢索記錄行 96-last //如果只給定一個引數,它表示返回最大的記錄行數目。換句話說,LIMIT n 等價於 LIMIT 0,n: mysql> SELECT * FROM table LIMIT 5; //檢索前 5 個記錄行

limit的效率高?

常說的Limit的執行效率高,是對於一種特定條件下來說的:即資料庫的數量很大,但是隻需要查詢一部分資料的情況。高效率的原理是:避免全表掃描,提高查詢效率。比如:每個使用者的email是唯一的,如果使用者使用email作為使用者名稱登陸的話,就需要查詢出email對應的一條記錄。
SELECT * FROM t_user WHERE email=?;


上面的語句實現了查詢email對應的一條使用者資訊,但是由於email這一列沒有加索引,會導致全表掃描,效率會很低。
SELECT * FROM t_user WHERE email=? LIMIT 1;
加上LIMIT 1,只要找到了對應的一條記錄,就不會繼續向下掃描了,效率會大大提高。

limit的效率低?

在一種情況下,使用limit效率低,那就是:只使用limit來查詢語句,並且偏移量特別大的情況。做以下實驗:
語句1:
select * from table limit 150000,1000;
語句2:
select * from table while id>=150000 limit 1000;


語句1為0.2077秒;語句2為0.0063秒。兩條語句的時間比是:語句1/語句2=32.968

比較以上的資料時,我們可以發現採用where…limit….效能基本穩定,受偏移量和行數的影響不大,而單純採用limit的話,受偏移量的影響很大,當偏移量大到一定後效能開始大幅下降。不過在資料量不大的情況下,兩者的區別不大。所以應當先使用where等查詢語句,配合limit使用,效率才高。在sql語句中,limt關鍵字是最後才用到的。以下條件的出現順序一般是:where->group by->having-order by->limit

OFFSET

為了與 PostgreSQL 相容,MySQL 也支援句法: LIMIT # OFFSET #。經常用到在資料庫中查詢中間幾條資料的需求比如下面的sql語句:

selete * from testtable limit 2,1;
selete * from testtable limit 2 offset 1;

注意:
1.資料庫資料計算是從0開始的
2.offset X是跳過X個數據,limit Y是選取Y個數據
3.limit X,Y 中X表示跳過X個數據,讀取Y個數據

這兩個都是能完成需要,但是他們之間是有區別的:
①是從資料庫中第三條開始查詢,取一條資料,即第三條資料讀取,一二條跳過
②是從資料庫中的第二條資料開始查詢兩條資料,即第二條和第三條。

UNION & UNION ALL

union all是直接連線,取到得是所有值,記錄可能有重複 union 是取唯一值,記錄沒有重複。

1、UNION 的語法如下:
[SQL 語句 1]
UNION
[SQL 語句 2]

2、UNION ALL 的語法如下:
[SQL 語句 1]
UNION ALL
[SQL 語句 2]

效率

UNION和UNION ALL關鍵字都是將兩個結果集合併為一個,但這兩者從使用和效率上來說都有所不同。

1、對重複結果的處理:UNION在進行錶鏈接後會篩選掉重複的記錄,Union All不會去除重複記錄。

2、對排序的處理:Union將會按照欄位的順序進行排序;UNION ALL只是簡單的將兩個結果合併後就返回。

從效率上說,UNION ALL 要比UNION快很多,所以,如果可以確認合併的兩個結果集中不包含重複資料且不需要排序時的話,那麼就使用UNION ALL。

簡單應用

將一個表的內容弄成兩份到一個輸出中:

select * from
(select * from players) b
UNION all
(select * from players) ;

join相關

left join(左聯接) 返回包括左表中的所有記錄和右表中聯結欄位相等的記錄
right join(右聯接) 返回包括右表中的所有記錄和左表中聯結欄位相等的記錄
inner join(等值連線) 只返回兩個表中聯結欄位相等的行