天天看點

mysql開發技巧1

SQL語言的發展

SQL分有(關系型資料庫,非關系型資料庫)

常見的sql語句類型:

DDL資料定義語言

TPL事務處理語言

DCL資料控制語言

DML資料操作語言

SQL開發技巧着重于DML語句:

DML(SELECT,INSERT , UPDATE , DELETE)

正确使用SQL:

增加資料庫處理效率,減少應用響應時間

減少資料庫伺服器負載,增加伺服器穩定

減少伺服器間通訊的網絡流量

正确的使用join從句:

SQL标準中join的類型:

Join:

内連接配接(INNER)

全外連接配接(FULL OUTER)

左外連接配接(LEFT OUTER)

右外連接配接(RIGHT OUTER)

交叉連接配接(CROSS)

1.join操作的類型--innerjoin

Select from tableA A inner join tableB B on A.key=B.key

mysql開發技巧1

2.join操作的類型--leftouter join

Select from TableA  A left join TableB B onA.key=B.key

Select from TableA A left join TableB B on A.key=B.key where B.keyis null

mysql開發技巧1

例子:

查詢取經四人組中那些人不是悟空的結拜兄弟

如:

SELECT a.’user_name,a.’over’,b.’over’ FROMuser1 a LEFT JOIN user2 b ON a.’user_name’ WHEREb.user_name IS NULL

3.join操作的類型--rightouter join

Select from TableA A right join TableB B on A.key=B.key

Select from TableA A right join TableB B on A.key=B.key where A.keyis null

mysql開發技巧1

例子:

查詢悟空的結拜兄弟中那些人沒有去取經

如:

SELECT b.’user_name’,b.’over’,a.’over’ FROMuser1 a RIGHT JOIN user2 b ON a.’user_name’ =b.’user_name’ WHEREa.user_name IS NULL

4.join操作的類型--FULLjoin

Mysql 中不支援fulljoin 的連接配接

mysql開發技巧1

解決join操作的類型----fulljoin

如:

SELECT a.’user_name’,a.’over’,b.’over’ FROMuser1 a LEFT JOIN user2 b ON a.’user_name’ =b.’user_name’ NUIONALL SELECT b.’user_name’,b.’over’,a.’over’ FROMuser1 a RIGHT JOIN user2 b ON a.’user_name’ =b.’user_name’

5.join操作的類型---Crossjoin

交叉連接配接,又稱卡迪爾連接配接,如:A和B是兩個合集,他們的交叉連接配接就是:A*B

如:

SELECT a.’user_name’,a.’over’,b.user_name,b.’over’ FROMuser1 a CROSS JOIN user2 b

如何更新使用過濾條件中包含自身的表?

情景:

把同時存在于取經四人組和悟空兄弟表中的記錄的人在取經組表中的over字段更新為“大聖”

如:UPDATEuser1 SET over = “大聖” WHEREuser1.’user_name’ IN(SELECT b.’user_name’ FROMuser1 a INNER JOIN user2 b ON a.’user_name’ =b.user_name);

Mysql中不支援這種查詢,可以聯合更新

使用join來解決問題

如:UPDATE user1 a join (SELECTb.’user_name’ FROMuser1 a INNER JOIN user2 b ON a.’user_name’=b.’user_name’)b ON a.user_name = b.user_name SET a.over = ‘大聖’

使用join優化子查詢

如1:SELECT a.user_name,a.’over’,(SELCTover FROM user2 b WHERE a.user_name = b.’user_name’)AS over2 FROM user1 a ;

使用join優化子查詢

如2:SELECT a.’user_name’,a.’over’,b.’over’ ASover2  FROM user1 a LEFT JOIN user2 b ONa.’user_name’ =b.’user_name’;

使用JOIN優化聚合子查詢

問題:如何:查詢出四人組中打怪最多的日期?

如:SELECT a.user_name,b.timestr,b.kills FROMuser1 a.id = b.user_id WHERE b.kills=(SELECT MAX(c.kills) FROMuser_kills c WHERE c.user_id = b.user_id)

使用JOIN優化聚合子查詢

問題:如何查詢出四人組中打怪最多的日期?(避免子查詢)

如:SELECT a.user_name,b.timestr,b.kills FROMuser1 a JOIN user_kills b ON a.id = b.user_id JOIN user_kills c ONc.user_id = b.user_id GROUP BY a.user_name,b.timestr,b.kills HAVINGb.kills = MAX(c.kills);

如何實作分組選擇?

顯示:

SELECT a.user_name,b.timestr,b.kills FROM user1 a JOIN user_kills bON a.id = b.user_id WHERE user_name = ‘孫悟空’ ORDERBY b.kills DESC LIMIT 2

對每一個人分别進行以上查詢

顯示:

SELECT d.user_name, c.timestr, 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 cntFROM user_kills a GROUP BY user_id,timestr,kills) c JOIN user1 d ONc.user_id = d.id WHERE cnt <=2

但有些查詢方式不支援