日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL简单基础

發布時間:2024/1/17 数据库 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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’

IDNAME
1夏娜
2黃泉


表b

IDname
1泰蘭德
2艾露恩


from?a,b會得到
?

IDNAMEIDname
1夏娜1泰蘭德
2黃泉2艾露恩
1夏娜2艾露恩
2黃泉1泰蘭德


而select * from a union select * from b會得到

IDNAME
1夏娜
2黃泉
1泰蘭德
2艾露恩


最后提一嘴,union是去重的,不想去重用union all

(2)inner join(join就行)和outer join(left join,right join,full outer?join)
????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
IDNAMEWEAPON
1夏娜太刀
2黃泉太刀
3泰蘭德弓箭
select?id,name,weapon from c?group by weapon;
果然赤裸裸的報錯了,報錯什么沒有使用組函數啦。
為什么呢?親,你模仿計算機弄出來個表給我看看唄。??
IDNAMEWEAPON
1夏娜太刀
2黃泉弓箭
3泰蘭德?
這樣???估計也就這樣了,但是個表么???一點也不對稱啊!!!?按照weapon分組得到兩行數據,然后你又要查詢id和name,這兩個字段都是有三行數據的呀,你這不為難計算機么,人家當然給你報錯了!
可以這樣,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

總結

以上是生活随笔為你收集整理的SQL简单基础的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。