SQL简单基础
一、如何理解SQL。
????關于sql,俺覺得最最基礎的是,你是在按什么角度去思考它。我倒是有一種方式,一看到select,就把從這個select到結束看成一個表,有多少select就有多少個表,然后這些表經過各種關系運算,最后得到你想要的結果,當然這個結果還是個表。
二、執行順序
????然后第二重要的是,你要理解sql的執行順序,看到一個sql語句時,不要先從select看,親,要先看from嘛,因為計算機就是這么干的。計算機先看from后面跟的是什么,比如from a,b,就把a和b的數據加載進內存,這個可是a(m條數據)和b(n條數據)的笛卡爾積啊,有m*n條數據。所以呢,使用form a left join b on a.id = b.id,會先pass一部分數據哦,這樣加載進內存的數據量變小了,速度就上去了。 當你說,from a,b where a.id=b.id這不也過濾了嗎。過濾是過濾了,只不過是加載進內存之后,才根據where條件過濾的。
執行順序如下:
?FROM
WHERE
GROUP BY
HAVING
SELECT
DISTINCT
UNION
ORDER BY
看見沒,select t.x+t.y z from t where z=10是會報錯滴,僅僅是因為where會在select前執行哦~
三、表連接
????真是值得大說特說呢,因為sql中最難的就是select,select干的最多的就是表連接嘍。咱一點一點說
(1)from a,b 與 union(union屬于集合操作,但是我覺得放在這里對比挺有趣的)
a,b就是把表橫著連在一起
比如‘表a’
| ID | NAME |
| 1 | 夏娜 |
| 2 | 黃泉 |
表b
| ID | name |
| 1 | 泰蘭德 |
| 2 | 艾露恩 |
from?a,b會得到
?
| ID | NAME | ID | name |
| 1 | 夏娜 | 1 | 泰蘭德 |
| 2 | 黃泉 | 2 | 艾露恩 |
| 1 | 夏娜 | 2 | 艾露恩 |
| 2 | 黃泉 | 1 | 泰蘭德 |
而select * from a union select * from b會得到
| ID | NAME |
| 1 | 夏娜 |
| 2 | 黃泉 |
| 1 | 泰蘭德 |
| 2 | 艾露恩 |
最后提一嘴,union是去重的,不想去重用union all
????join會把不滿足的都干掉,只留下滿足條件的。
????outer join會把主表的都留下,驅動表有滿足的就跟主表的這條數據連在一起(橫著),某條主表數據在驅動表里沒有找到滿足條件的,就拿null跟這個主表數據拼在一起。left join左邊是主表。right join右邊是主表。full outer join大家互為主表和驅動表。
(3)半連接之in和exists
????select name from a where?id in(select id from b)
????是這么執行的,把a表加載進內存,然后把b表加載進內存,把b表的id都取出來保存在內存(緩存?)中,取a的第一條數據,看id等于1或者2嗎,滿足則返回true,然后把這條數據存入虛表?。然后掃描a的第二條數據,進行比較。如果a這個表足夠大,你就慘兮兮了,因為它要從頭掃到尾,每次都做個判斷(判斷可是要時間成本的)。
????select name from a where exists?(select null from b where b.id = a.id)
????首先exists里面的數據不會被保存在緩存里。它是這么執行的,取出a的一條數據,去跟b里的每一條進行比較判斷(時間成本),滿足則返回true,把剛才那條a的數據保存下來。正因為是邏輯判讀所以exists里面select null也是可以的啦。發現沒有,如果b表的數據量很大,你就慘了啊。跟in對比著看,發現什么了木有。
(4)反連接之not in和not exists
????沒什么好說的吧,記住not in()括號里面不要有null,因為任何東西一跟null比較就會獲得false,這樣你就啥都查不到了。但是在in()里面使用null是沒有影響的,想想為什么,很簡單的邏輯問題。
(5)交叉連接之cross join
????跟逗號連接是一個東西。
四、group by
請看下表C
| ID | NAME | WEAPON |
| 1 | 夏娜 | 太刀 |
| 2 | 黃泉 | 太刀 |
| 3 | 泰蘭德 | 弓箭 |
果然赤裸裸的報錯了,報錯什么沒有使用組函數啦。
為什么呢?親,你模仿計算機弄出來個表給我看看唄。??
| ID | NAME | WEAPON |
| 1 | 夏娜 | 太刀 |
| 2 | 黃泉 | 弓箭 |
| 3 | 泰蘭德 | ? |
可以這樣,select max(id),max(name),weapon from c group by weapon這樣不報錯了,但是數據是啥樣子的自己想想。
五、語法順序
select(對數據處理)
from(數據源:表)
where(選擇操作:過濾記錄)
group?by(分組)
having(過濾組)
union(集合)?
order?by(排序)
有次面試,我就把語法順序給寫錯了。啥也不說了。
轉載于:https://www.cnblogs.com/coolgame/p/9018227.html
總結
- 上一篇: js基础(原型)
- 下一篇: 关于python 中的 sys.argv