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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

MySQL编程技巧_MySQL学习笔记---MySQL开发技巧

發(fā)布時(shí)間:2025/3/12 数据库 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL编程技巧_MySQL学习笔记---MySQL开发技巧 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。