1. 程式人生 > >深入學習、理解select語句、delete語句以及其他SQL語句

深入學習、理解select語句、delete語句以及其他SQL語句

1,delete from user as u where u.userid=6;

2,delete from user u where u.userid=6;

3,delete from user where userid=6;

4,delete u.* from user u where u.userid=6;

5,delete u from user u where u.userid=6;

通過測試可以發現,1和2,都是錯誤的MySQL語句,而3和4和5是可行的。所以,如果我們想在刪除操作中使用別名的話,就要採用第4種方法或者第五種方法。

這是為什麼呢?

首先我們要對SQL語句,進行更加深入的瞭解。

一,SQL語言是一種宣告式的語言


    簡單的說,SQL語言宣告的是結果集的屬性,資料庫系統會根據SQL宣告的內容,從資料庫中查詢出符合條件的資料。這和傳統的程式設計思維是不一樣的,在傳統程式設計中,我們要告訴計算機怎麼做。

二,SQL的語法並不按照語法順序來執行

    SQL語句的執行順序和語法順序是不一致的,SQL語句的語法順序是:

a,select[distinct]
b,from
c,where
d,group by
e,having
f,union
g,order by

上面語句的執行順序為:

a,from
b,where
c,group by
d,having
e,select
f,distinct
g,union
h,order by

關於SQL語句的執行,有三個值得注意的地方:

1,from才是SQL語句執行的第一步,將資料從硬碟載入到資料緩衝區中,以便對這些資料進行操作。
2,select是在大部分語句執行之後,才執行的,嚴格的說是在from和group by 之後執行的。理解這一點是非常重要的,這就是你不能在where中使用select中設定別名的欄位作為判斷條件的原因。
3,無論在語法上還是在執行順序上,union 總是排在order by之前。

三,SQL語言的核心是對錶的引用  table references

四,靈活引用表能使SQL語句變得更強大


    一個簡單的例子就是join的使用。嚴格來說,join語句並非是select中的一部分,而是一種特殊的表引用語句。

五,SQL語句中推薦使用表連線

    高階SQL程式設計師也許會給你忠告:儘量不要使用逗號來代替join進行表的連線。使用join可以提高你的SQL語句的可讀性,並且可以避免一些錯誤。

六,SQL 中的派生表可以當做一種變數來看待

    說白了,所謂的派生表,就是在括號之中的子查詢。例如:
from (select * from autor)
有時候我們可以給派生表定義一個相關名,也就是大名鼎鼎的別名。例如:
from (select * from autor) a
我們反覆強調,SQL語句是對錶的引用,而並非對欄位的引用。

七,SQL語句中group by是對錶的引用進行的操作


    group by 是在表的引用的基礎上,對引用進行了操作,將引用轉換成另一種新的引用。

語法總是枯燥的,總之,看了這些,你應該明白一個原則:“用別名,先定義”。也就是說,SQL中,在使用一個別名的之前,必須要確保這個別名在之前已經定義了。

OK, 回過頭來,我們再來看我們遇到的問題:

1,delete from user as u where u.userid=6;

2,delete from user u where u.userid=6;

3,delete from user where userid=6;

4,delete u.* from user u where u.userid=6;

5,delete u from user u where u.userid=6;

當我們把SQL語句提交以後,資料庫是這樣操作的:
第一步:執行from user u,也就是掃描user表,並且給user表起了一個別名:u
第二步:執行where u.userid=6 ,也就是找到u引用中,userid=6的欄位;
第三步:執行delete u,也就是刪除u引用;

好了,我們再看看幾個關鍵點:
第一點:所有的別名是不是在使用之前,已經定義好了;
第二點:執行delete u,就是刪除user表引用u,u可以看做是一個引用表,這一步的意思就是刪除表u

好了,今天的學習就到這裡,改天再敘。