1. 程式人生 > >MySQL中的關鍵字用法(二)

MySQL中的關鍵字用法(二)

MySQL中的關鍵字的用法(二)

limit:偏移量和數量
注意limit和offset的區別,下面有寫到offset,注意區分;
在我們使用查詢語句的時候,經常要返回前幾條或者中間某幾行資料,這個時候怎麼辦呢?不用擔心,mysql已經為我們提供了這樣一個功能;常用的大概就是分頁了吧。
LIMIT 子句可以被用於強制 SELECT 語句返回指定的記錄數。LIMIT 接受一個或兩個數字引數。引數必須是一個整數常量。如果給定兩個引數,第一個引數指定第一個返回記錄行的偏移量,第二個引數指定返回記錄行的最大數目。初始記錄行的偏移量是 0(而不是 1)。
select * from user limit 5,10;
//為了檢索初始偏移量是5,數量是10個的數量
select * from user limit 95,-1;
//為了檢索初始偏移量是95之後的所有資料,則把第二個資料設定成-1即可;
select * from user limit 5;
//這是為了從頭開始檢索5個數據,換句話就是limit 0,5這個樣子咯;
limit執行效率高?


常說的limit效率高,其實是在特定的情況下,資料庫的量很大,但是隻需要查詢一部分的資料就可以;
高效率的原理:避免全表掃描,提高查詢效率;比如:每個使用者的email是唯一的,如果使用者使用email作為使用者名稱登陸的話,就需要查詢出email對應的一條記錄。
select * from user where email=?;
上面的語句實現了查詢email對應的一條使用者資訊,但是由於email這一列沒有加索引,會導致全表掃描,效率會很低。
select * from user where email=? limit 1;
如果後面加上(limit 1)的時候,當掃描到相應的email的時候便不會繼續向下掃描;
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

having和where:條件
 where,過濾條件的關鍵字,但是它只能對group by之前的資料進行過濾篩選;
 having,也是過濾條件的關鍵字作用和where是一樣的,但是它過濾的是分組後的資料,就是對分組後得到的結果集進行過濾篩選。
 出現having其實我覺得就是為了解決一條語句出現兩個where的問題,把它們區分開來;
 select * from user where id>100 group by user.sex having user.sex=‘1’;
 這裡注意一個問題:一旦經過group by關鍵字分組後,別的資料便無法顯示;只能最多顯示兩列資料,即分組group by後面根據的條件後分組後的資料的計算。count,sum,avg,等

offset: 
select * from user limit 2,1;
//表示初始偏移量是2個,然後取一個數據;
select * from user limit 2 offset 1;
//limit 2 offset 1表示的是跳過1個數據,獲取2個數據;

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

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

Join和ON相關:連線
一般在真正的應用中都是多個數據表中讀取資料;
JOIN 按照功能大致分為如下三類:

1.INNER JOIN(內連線,或等值連線):獲取兩個表中欄位匹配關係的記錄。
2.LEFT JOIN(左連線):獲取左表所有記錄,即使右表沒有對應匹配的記錄。
3.RIGHT JOIN(右連線): 與 LEFT JOIN 相反,用於獲取右表所有記錄,即使左表沒有對應匹配的記錄。
關鍵字On是指怎麼把兩個表連線起來,如on a.name=b.name;
是一行一行的比較,然後聯合起來,此時並沒有判斷where子句的內容;
where 關鍵字是在表連線之後進行篩選;

內連線可不加on條件,而外連線必須加條件;
select * from user a left (outer) join people b ON a.uuid=b.id;
//外連線必須加on關鍵字,on後面跟連線的條件,如果後面不跟on連線條件的話會報錯;
select * from user a inner join people b ON a.uuid=b.id;
//內連線如果後面不跟on的條件的話,便跟完全連線的效果一樣了;介紹一下完全連線,也就是交叉連線,比如A表有a行資料,B表有b行資料,完全連線就有a*b行資料了;
在內連線中on關鍵字跟where關鍵字的用法沒有區別的;

Where關鍵字是對最終結果集的篩選;
On關鍵字是代表兩個表建立聯絡的規則;

NULL:空值
在MySQL中關於NULL的處理,你不能使用=NULL或者是!=NULL來查詢,於是MySQL就提供了一種方式,
IS NULL: 當列的值是 NULL,此運算子返回 true。
IS NOT NULL: 當列的值不為 NULL, 運算子返回 true。
<=>: 比較操作符(不同於=運算子),當比較的的兩個值為 NULL 時返回 true。
在 MySQL 中,NULL 值與任何其它值的比較(即使是 NULL)永遠返回 false,即 NULL = NULL 返回false 。

in和 NOT IN:
在一些固定的資料中的操作
select * from user where user.id in (1,5,8);
//查詢ID是1,5,8的使用者;
可以用in關鍵字來替換or關鍵字;

in作為查詢條件,一般典型有兩種用法:
一是IN常量,例如下面語句查詢一、三年級的學生:
SELECT * FROM student WHERE grade IN (‘一’,‘三’);
二是使用子查詢,也就是IN(SQL語句),例如下面的語句查詢不及格的班級的所有學生:
SELECT * FROM student WHERE classno IN (
select classno from scores where score<60
);

alter:用來修改表的屬性、列的屬性
刪除、增加、修改欄位:
alter table user drop age;//刪除user表的age欄位;
alter table user add age int not null;//在user表中新增age欄位;
alter table user modify age char(100)//在user表中修改age欄位的屬性;

總結

上面兩篇文章大致介紹了MySQL中常用的關鍵字以及用法,我感覺這些關鍵字基本已經涵蓋了平時工作中非專業人員的常用範圍了,對某些關鍵字有更深興趣的再去單獨查閱資料去了解即可,這裡不必糾結太深;

在這裡插入圖片描述
/*************************************************************************
/*************************************************************************
此文章版權方是個人,目的是為自己記錄學習歷程的同時為大家提供一些參考;如果有不正確的地方,歡迎大家提出!

/*************************************************************************
/*************************************************************************