MySQL编程技巧_MySQL学习笔记---MySQL开发技巧
SQL語(yǔ)句分類
DDL:數(shù)據(jù)定義語(yǔ)言 --- CREATE、ALTER、DROP、TRUNCATE
TPL:事務(wù)處理語(yǔ)言 --- COMMIT、ROLLBACK、SAVEPOINT、SET TRANSACTION
DCL:數(shù)據(jù)控制語(yǔ)言 --- GRANT、REVOKE
DML:數(shù)據(jù)操作語(yǔ)言 --- SELECT、UPDATE、INSERT、DELETE
join從句—內(nèi)連接
join從句:: inner | full outer | left outer | right outer | cross
內(nèi)連接inner join:
select a.user_name,a.over,b.over from user1 a join user2 b on a.user_name=b.user_name;
LEFT OUTER JOIN:包含左表中的所有數(shù)據(jù),當(dāng)某個(gè)連接謂詞不在右表中時(shí),新生成的表的右表字段為NULL。對(duì)左表數(shù)據(jù)的信息進(jìn)行擴(kuò)展,增加右表中的字段,當(dāng)某個(gè)連接謂詞不在右表中時(shí),新生成的表的右表字段為NULL。
使用LEFT OUTER JOIN對(duì)NOT IN 進(jìn)行優(yōu)化。
SELECT select_sxpressions
FROM TABLE A LEFT OUTER JOIN TABLE B ON A.key=B.key
WHERE B.key IS NULL;
表A中不包含表B中的數(shù)據(jù)。
SELECT select_sxpressions
FROM TABLE A LEFT OUTER JOIN TABLE B ON A.key=B.key
WHERE B.key IS NOT NULL;
表A與表B的交集,相當(dāng)于INNER JOIN。
忽然想起來(lái)有次面試問(wèn)我如何用left join實(shí)現(xiàn)not in的功能
select A.內(nèi)容,B.內(nèi)容 from A left join B ON a.key=b.key where b.key is null
RIGHT OUTER JOIN:包含右表中的所有數(shù)據(jù),當(dāng)某個(gè)連接謂詞不在左表中時(shí),新生成的表的左表字段為NULL。對(duì)右表數(shù)據(jù)的信息進(jìn)行擴(kuò)展,增加左表中的字段,當(dāng)某個(gè)連接謂詞不在左表中時(shí),新生成的表的左表字段為NULL。
使用RIGHT OUTER JOIN對(duì)NOT IN 進(jìn)行優(yōu)化。
SELECT select_sxpressions
FROM TABLE A RIGHT OUTER JOIN TABLE B ON A.key=B.key
WHERE A.key IS NULL;
表B中不包含表A中的數(shù)據(jù)。
SELECT select_sxpressions
FROM TABLE A RIGHT OUTER JOIN TABLE B ON A.key=B.key
WHERE A.key IS NOT NULL;
表A與表B的交集,相當(dāng)于INNER JOIN。
MySQL 中 不會(huì)支持 full join
解決方法:采用左連接和右連接結(jié)合+ union all 方法來(lái)取得兩表的合集
select a.user_name , a.over , b.over
from user1 a
left join user2 b on a.user_name = b.user_name
union all
select b.user_name , b.over, a.over
from user1 a
right join user2 b on a.user_name = b.user_name
join優(yōu)化子查詢技巧:
一般子查詢寫法:(數(shù)據(jù)小時(shí),沒有多大影響,如果數(shù)據(jù)量大時(shí),則要消耗大量的查詢)
select a.user_name , a.voer , (select over from user2 where a.user_name = b,user_name) as over2
from user1 a;
如果這兩張表的記錄相當(dāng)多 那么這個(gè)子查詢相當(dāng)于對(duì)A標(biāo)的每一條記錄都要進(jìn)行一次子查詢。
join優(yōu)化(左連接)后的寫法:
select a.user_name , a.over , b.over from user1 a
left join user2 b on a.user_name = b.user_name
使用join + having優(yōu)化聚合子查詢:
select a.user_name,b.timestr,b.kills from user1 a
join user_kills b on a.id = b.user_id
join user_kills c on c.user_id = b.user_id
group by a.user_name,btimestr,b.kills
having b.kills = max(c.kills);
分類聚合方式查詢每一個(gè)用戶某一個(gè)字段數(shù)據(jù)最大的兩條數(shù)據(jù):
select d.user_name ,c.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 group by user_id,timestr,kills) c join user1 d on c.user_id = d.id where cnt <= 2
如何進(jìn)行行列轉(zhuǎn)換
如何進(jìn)行行列轉(zhuǎn)換
需要進(jìn)行行轉(zhuǎn)列的場(chǎng)景:匯總顯示
Paste_Image.png
Paste_Image.png
未完待續(xù)...
總結(jié)
以上是生活随笔為你收集整理的MySQL编程技巧_MySQL学习笔记---MySQL开发技巧的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Mysql 零距离-入门(二)
- 下一篇: mysql not in 多列,MySQ