SQL 開發技巧
SQL 語句類型
DDL:數據定義語言
TPL:事務處理無言
DCL:數據控制語言
DML:數據操做語言{SELECT INSERT UPDATE DELETE}前端
SQL重要性:
1.增長數據庫處理效率,減小 應用相應時間。
2.減小數據庫服務器負載,增長服務器穩定。
3.減小服務器間通信的網絡流量。
(實現一些其餘人以爲SQL語句完成不了的功能,這也是一件很是酷的事情)數據庫
Join從句的正確使用
例子表:
一表: 唐僧四人表(four) 悟空關係表(relation)
id username over id uasername over
1 唐僧 仙 1 牛魔王 被降服
2 孫悟空 鬥戰 2 紅孩兒 被降服
3 豬八戒 豬 3 托塔天王 被降服
4 沙和尚 傻逼 4 孫悟空 超牛逼
Join的類型:
1.內鏈接--INNER
將兩張表的組合在一塊兒,產生新的結果表
SELECT * FROM four as f INNER JOIN relation as r ON f.username = r.username
結果就是隻有一條記錄 服務器
2.全外鏈接--FULL OUTER
左鏈接和右鏈接的結合
1.能夠將兩張表的全部字段結果集
2.能夠過濾AB兩表的關聯字段
問題來了:
SELECT * FROM four as f FULL JOIN relation as r ON r.username = f.username 會報ERROR 1600錯誤
解決方法:UNION ALL
select f.username, f.over, r.over from four f LEFT JOIN relation r ON f.username = r.username
union ALL
select r.username, r.over, f.over from relation r RIGHT JOIN four f ON r.username = f.username
這樣就能查詢出兩表的全部數據
3.左外鏈接--LEFT OUTER
1.A表B表關聯,取得A表中的全部結果集
2.A表B表關聯,取得A表中除了和B表關聯的其餘字段結果集
查詢取經四人組中哪些人不是悟空的結拜兄弟。
select a.user_name,a.over,b.over FROM four as f LEFT JOIN relation as r ON r.username = f.username WHERE r.username IS NULL(反之則IS NOT NULL)網絡
4.右外鏈接--RIGHT OUTER
1.A表B表關聯,取得B表中的全部結果集
2.A表B表關聯,取得B表中除了和A表關聯的其餘字段結果集
查詢悟空的結拜兄弟中那些人沒有去取經
select r.user_name,r.over,f.over FROM four as f LEFT JOIN relation as r ON r.username = f.username WHERE f.username IS NULL(反之則IS NOT NULL)
函數
5.交叉鏈接(CROSS)
交叉鏈接(cross join),又稱笛卡爾鏈接(cartesian join)或叉乘(Product),若是A和B是兩個集合,他們的交叉鏈接就爲:A x B(若是A有4個字段,B有五個,就是20個)
select a.name,b.name from user1 a CROSS JOIN user b (沒有任何關鍵字)優化
Join相關SQL技巧
如何更新使用過濾調教中包括自身的表?
UPDATE user1 a join (select b.username from user1 a join user2 b on a.username = b.username) b on a.username = b.username
SET a.over = '齊天大神';事務
使用JOIN優化子查詢
select a.username,a.over,b.over as over2 from user1 a LEFT JOIN user2 b ON a.username = b.username開發
使用JOIN優化聚合子查詢
select 【field1,field2..fieldn】 functionname(聚合函數) from tablename
【where condition】
group by field1,field2..fieldn 進行分類聚合的字段
【with rollup】 可選語法:是否對已經聚合過的結果再進行彙總
【having where condition】分類聚合後再進行條件過濾it
分組選擇
使用場景:選擇閱讀量前十的不一樣分類的新聞頭條//選擇前十的不一樣分類的課程(如前端,後段,數據庫)
例子: SELECT d.username, ctimestr, kills FROM (SELECT user_id, timestr,kills, (SELECT COUNT(*) FROM user_kills b WHERE b.user_id=a.user_id AND a.kills <= b.kills) AS cnt FROM user_kills a GROUPS BY user_id,timestr,kills) c JOIN user1 d ON c.user_id=d.id WHERE cnt <= 2
io
=====================本身記錄的筆記,可能有點簡陋