日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

SQL中case?when用法及使用案例詳解

瀏覽:316日期:2023-09-29 21:02:28
目錄一、語(yǔ)法二、case when應(yīng)用場(chǎng)景2.1 案例一2.2 案例二2.3 案例三三、擴(kuò)展3.1 根據(jù)條件有選擇的UPDATE四、參考來(lái)源一、語(yǔ)法

Case具有兩種格式。簡(jiǎn)單Case函數(shù)和Case搜索函數(shù)。

簡(jiǎn)單Case函數(shù)格式:

CASE 列名WHEN 條件值1 THEN 選項(xiàng)1WHEN 條件值2 THEN 選項(xiàng)2……ELSE 默認(rèn)值END

Case搜索函數(shù):

CASEWHEN 條件1 THEN 選項(xiàng)1WHEN 條件2 THEN 選項(xiàng)2……ELSE 默認(rèn)值END二、case when應(yīng)用場(chǎng)景

case when與子查詢(xún)性能比較及優(yōu)化。為了方便說(shuō)明,我們先創(chuàng)建表,并造點(diǎn)數(shù)據(jù)。

CREATE TABLE `table_a` (`id` INT NOT NULL AUTO_INCREMENT,`country` VARCHAR(50) NOT NULL,`sex` CHAR(2) not null,`population` int NOT NULL,PRIMARY KEY (`id`));insert into table_a values(null,'中國(guó)','男',10);insert into table_a values(null,'中國(guó)','女',5);insert into table_a values(null,'美國(guó)','男',2);insert into table_a values(null,'美國(guó)','女',4);insert into table_a values(null,'加拿大','男',4);insert into table_a values(null,'加拿大','女',4);insert into table_a values(null,'英國(guó)','男',6);insert into table_a values(null,'英國(guó)','女',6);insert into table_a values(null,'法國(guó)','男',2);insert into table_a values(null,'法國(guó)','女',2);insert into table_a values(null,'日本','男',7);insert into table_a values(null,'日本','女',7);insert into table_a values(null,'德國(guó)','男',2);insert into table_a values(null,'墨西哥','男',7);insert into table_a values(null,'印度','男',1);2.1 案例一

統(tǒng)計(jì)亞洲和北美洲的人口數(shù)量,要求結(jié)果如下:

若第一時(shí)間沒(méi)有想到case when,我們可能會(huì)寫(xiě)出下面的sql:

SELECT sum(population) from Table_A where country in ('中國(guó)','印度','日本')UNIONSELECT sum(population) from Table_A where country in ('美國(guó)','加拿大','墨西哥')UNIONSELECT sum(population) from Table_A where country not in ('中國(guó)','印度','日本','美國(guó)','加拿大','墨西哥');

運(yùn)行結(jié)果:

這個(gè)sql的性能效率比較低,對(duì)同一個(gè)數(shù)據(jù)表查詢(xún)了三次,也無(wú)法獲得州的那一列。

使用case when進(jìn)行改造,如下:

SELECT SUM(population)FROM Table_A GROUP BYCASE country WHEN '中國(guó)' THEN '亞洲' WHEN '印度' THEN '亞洲'WHEN '日本' THEN '亞洲' WHEN '美國(guó)' THEN '北美洲' WHEN '加拿大' THEN '北美洲' WHEN '墨西哥' THEN '北美洲' ELSE '其他' END;

運(yùn)行結(jié)果:

使用了case when的sql語(yǔ)句明顯效率高一些,因?yàn)樗鼉H查找了一次表而已,若想獲得州的那一列,只需改寫(xiě)如下:

SELECT SUM(population), (CASE country WHEN '中國(guó)' THEN '亞洲' WHEN '印度' THEN '亞洲' WHEN '日本' THEN '亞洲' WHEN '美國(guó)' THEN '北美洲' WHEN '加拿大' THEN '北美洲' WHEN '墨西哥' THEN '北美洲' ELSE '其他' END ) as 州FROM Table_A GROUP BYCASE country WHEN '中國(guó)' THEN '亞洲' WHEN '印度' THEN '亞洲'WHEN '日本' THEN '亞洲' WHEN '美國(guó)' THEN '北美洲' WHEN '加拿大' THEN '北美洲' WHEN '墨西哥' THEN '北美洲' ELSE '其他' END;

運(yùn)行結(jié)果:

2.2 案例二

統(tǒng)計(jì)每個(gè)國(guó)家的男生人數(shù)和女生人數(shù),要求結(jié)果如下:

同樣的,不使用case when的寫(xiě)法如下:

SELECTa.country,(SELECTSUM( a1.population ) FROMtable_a a1 WHEREa1.country = a.country AND a1.sex = '男' ) 男,(SELECTSUM( a1.population ) FROMtable_a a1 WHEREa1.country = a.country AND a1.sex = '女' ) 女 FROMtable_a a GROUP BYa.country;

執(zhí)行結(jié)果:

使用case when進(jìn)行優(yōu)化:

SELECT COUNTRY,SUM(CASE SEX WHEN '男' THEN population ELSE 0 END) AS '男',SUM(CASE SEX WHEN '女' THEN population ELSE 0 END) AS '女'FROM table_a GROUP BY COUNTRY;

執(zhí)行結(jié)果:

兩者對(duì)比,顯然的case when的效率既簡(jiǎn)潔,效率也高。

2.3 案例三

上述兩個(gè)案例也許不夠貼近日常的工作內(nèi)容,下面舉個(gè)現(xiàn)實(shí)工作遇到的案例。

建表sql如下:

-- 貨架表CREATE TABLE `shelves` (`shelves_id` INT NOT NULL AUTO_INCREMENT, -- 貨架id`shelves_num` VARCHAR(50) NOT NULL UNIQUE,-- 貨架號(hào)`shelves_area` VARCHAR(50) NOT NULL,--貨架區(qū)域PRIMARY KEY (`shelves_id`));-- 物品表CREATE TABLE `goods` (`goods_id` INT NOT NULL AUTO_INCREMENT, -- 物品id`goods_name` VARCHAR(50) NOT NULL UNIQUE,-- 物品名稱(chēng)`goods_type` VARCHAR(20) NOT NULL,-- 物品類(lèi)型`goods_quantity` int NOT NULL,-- 物品數(shù)量`goods_createTime` DATETIME NULL DEFAULT NULL,-- 創(chuàng)建時(shí)間`goods_expiryTime` DATETIME NULL DEFAULT NULL,-- 過(guò)期時(shí)間`goods_shelvesId` INT NULL DEFAULT NULL,-- 貨架idPRIMARY KEY (`goods_id`));

需求說(shuō)明:統(tǒng)計(jì)每個(gè)貨架上的物品數(shù)量,要求統(tǒng)計(jì)結(jié)果如下

使用子查詢(xún)的寫(xiě)法:

SELECTshelves_area shelvesArea,shelves_num shelvesNum,COUNT( DISTINCT goods_type ) goodsTypeSum,COUNT( goods_id ) goodsSum,(SELECTCOUNT(*)FROMgoodsWHEREgoods_expiryTime < NOW()AND goods_shelvesId = shelves_id ) isNotExpiry,(SELECTCOUNT(*)FROMgoodsWHEREgoods_expiryTime > NOW()AND goods_shelvesId = shelves_id) isExpiryFROMshelvesLEFT JOIN goods ON shelves_id = goods_shelvesIdGROUP BY shelves_id;

使用case when的寫(xiě)法:

SELECTshelves_area shelvesArea,shelves_num shelvesNum,COUNT( DISTINCT goods_type ) goodsTypeSum,COUNT( goods_id ) goodsSum,SUM(CASE WHEN (shelves_id = goods_shelvesId AND goods_expiryTime < NOW()) THEN 1 ELSE 0 END) isNotExpiry,SUM(CASE WHEN (shelves_id = goods_shelvesId AND goods_expiryTime > NOW()) THEN 1 ELSE0 END) isExpiryFROMshelvesLEFT JOIN goods ON shelves_id = goods_shelvesIdGROUP BY shelves_id;

兩個(gè)不同寫(xiě)法的運(yùn)行結(jié)果是一樣的,但是性能效率上case when 顯然比子查詢(xún)的高一些。運(yùn)行結(jié)果如下(本人未造相關(guān)測(cè)試數(shù)據(jù)):

三、擴(kuò)展3.1 根據(jù)條件有選擇的UPDATE

例,有如下更新條件1.工資5000以上的職員,工資減少10%2.工資在2000到4600之間的職員,工資增加15%

很容易考慮的是選擇執(zhí)行兩次UPDATE語(yǔ)句,如下所示

--條件1 UPDATE Personnel SET salary = salary * 0.9 WHERE salary >= 5000; --條件2 UPDATE Personnel SET salary = salary * 1.15 WHERE salary >= 2000 AND salary < 4600;

但是事情沒(méi)有想象得那么簡(jiǎn)單,假設(shè)有個(gè)人工資5000塊。首先,按照條件1,工資減少10%,變成工資4500。接下來(lái)運(yùn)行第二個(gè)SQL時(shí)候,因?yàn)檫@個(gè)人的工資是4500在2000到4600的范圍之內(nèi),需增加15%,最后這個(gè)人的工資結(jié)果是5175,不但沒(méi)有減少,反而增加了。如果要是反過(guò)來(lái)執(zhí)行,那么工資4600的人相反會(huì)變成減少工資。暫且不管這個(gè)規(guī)章是多么荒誕,如果想要一個(gè)SQL 語(yǔ)句實(shí)現(xiàn)這個(gè)功能的話(huà),我們需要用到Case函數(shù)。代碼如下:

UPDATE Personnel SET salary = CASE WHEN salary >= 5000 THEN salary * 0.9 WHEN salary >= 2000 AND salary < 4600 THEN salary * 1.15ELSE salary END;

這里要注意一點(diǎn),最后一行的ELSE salary是必需的,要是沒(méi)有這行,不符合這兩個(gè)條件的人的工資將會(huì)被寫(xiě)成NUll,那可就大事不妙了。在Case函數(shù)中Else部分的默認(rèn)值是NULL,這點(diǎn)是需要注意的地方。

這種方法還可以在很多地方使用,比如說(shuō)變更主鍵這種累活。一般情況下,要想把兩條數(shù)據(jù)的Primary key,a和b交換,需要經(jīng)過(guò)臨時(shí)存儲(chǔ),拷貝,讀回?cái)?shù)據(jù)的三個(gè)過(guò)程,要是使用Case函數(shù)的話(huà),一切都變得簡(jiǎn)單多了。p_key col_1 col_2a 1 張三b 2 李四c 3 王五假設(shè)有如上數(shù)據(jù),需要把主鍵a和b相互交換。用Case函數(shù)來(lái)實(shí)現(xiàn)的話(huà),代碼如下

UPDATE SomeTable SET p_key = CASE WHEN p_key = 'a' THEN 'b' WHEN p_key = 'b' THEN 'a'ELSE p_key ENDWHERE p_key IN('a', 'b');四、參考來(lái)源

https://blog.csdn.net/Max_Rzdq/article/details/79418893

到此這篇關(guān)于SQL中case when用法詳解及使用案例的文章就介紹到這了,更多相關(guān)sql case when用法內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: MsSQL 數(shù)據(jù)庫(kù)
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品中文| 亚洲午夜一级| 日本不卡免费高清视频在线| 欧美精品福利| 国产调教精品| 美腿丝袜亚洲一区| 国产精品成人一区二区网站软件| 天堂√中文最新版在线| 午夜久久影院| 青青伊人久久| 成年男女免费视频网站不卡| 久久蜜桃精品| 亚洲精品美女91| 国产欧美另类| 欧美日韩激情| 欧美欧美黄在线二区| 在线亚洲观看| 高清日韩欧美| 日韩影院在线观看| 波多视频一区| 牛牛精品成人免费视频| 国产农村妇女精品一二区| 亚洲国产一区二区三区在线播放| 日本成人在线不卡视频| 国产精品v日韩精品v欧美精品网站| 亚洲国产专区| 美腿丝袜亚洲一区| 国产精品mm| 亚洲欧洲国产精品一区| 成人日韩精品| 国产suv精品一区二区四区视频| 视频一区二区三区在线| 久久青草久久| 麻豆国产精品| 国产日韩三级| 日韩三级精品| 日本一区中文字幕| 日本久久成人网| 国产精品精品| 国产精品白浆| 日韩高清不卡一区| 国产精品巨作av| 成人国产精选| 91精品xxx在线观看| 欧美日韩免费观看视频| 亚洲天堂资源| 九九久久婷婷| 蜜臀精品久久久久久蜜臀| 日韩视频一区| 日韩激情中文字幕| 亚洲高清影视| 免费在线成人| 久久婷婷激情| 日韩高清一级| 黄色成人精品网站| 国产精品s色| 国产不卡人人| 丝袜美腿一区二区三区| 日韩欧美少妇| 激情综合五月| 欧美日一区二区三区在线观看国产免| 久久香蕉国产| 中文字幕成在线观看| 性色一区二区| 成人三级高清视频在线看| 日韩av网站免费在线| 国产91精品对白在线播放| 日韩激情一二三区| 日韩1区2区3区| 中文字幕在线高清| 久久精品网址| 国产色噜噜噜91在线精品| 91久久久久| 国产毛片一区| 在线视频观看日韩| 中文视频一区| 国产视频一区欧美| 在线亚洲精品| 色欧美自拍视频| 日韩不卡免费高清视频| 婷婷成人综合| 亚洲午夜视频| 青青草精品视频| 免费观看在线综合色| 日韩高清不卡一区| 视频小说一区二区| 亚洲精品伊人| 日本一区二区中文字幕| 精品美女视频 | 国产激情久久| 日韩免费高清| 日韩精品水蜜桃| 三级在线观看一区二区| 香蕉久久国产| 欧美国产另类| 欧美日韩一区二区综合 | 亚洲有吗中文字幕| 国产精品亚洲产品| 国产亚洲一级| 欧美综合社区国产| 欧美 日韩 国产精品免费观看| 日本亚洲欧美天堂免费| 1024精品一区二区三区| 四虎成人av| 日韩一级不卡| 久久99高清| 五月天久久久| 涩涩av在线| 亚洲日韩视频| 亚洲在线国产日韩欧美| 91偷拍一区二区三区精品| 视频一区二区三区中文字幕| 狠狠色综合网| 欧美精品中文字幕亚洲专区| 伊人国产精品| 日韩中文首页| 国产精品蜜月aⅴ在线| 日本不卡一区二区| 久久久91麻豆精品国产一区| 免费看黄色91| 夜久久久久久| 日韩精品91| 久久久免费人体| 日韩不卡免费视频| 青草久久视频| 欧美激情福利| 国产免费av一区二区三区| 国产拍在线视频| 高清在线一区| 欧美成人基地| 欧美不卡在线| 欧美a级一区二区| 亚洲尤物在线| 日本aⅴ免费视频一区二区三区| 日韩精品五月天| 日韩网站在线| 日本久久成人网| 亚洲深深色噜噜狠狠爱网站| 久久gogo国模啪啪裸体| 亚洲欧美不卡| 午夜一级久久| 国产精品三p一区二区| 日本久久综合| 韩国久久久久久| 国产美女久久| 亚洲先锋成人| 911精品国产| 999精品在线| 国产成人免费视频网站视频社区| 亚洲精品一区二区在线看| 奶水喷射视频一区| 精品99在线| 色偷偷色偷偷色偷偷在线视频| 人人精品人人爱| 免费一级欧美片在线观看网站| 黑人精品一区| 亚洲少妇一区| 四虎精品一区二区免费| 精品99久久| 日本不卡高清| 精品丝袜在线| 日韩欧美网址| 欧美三级第一页| 日本在线成人| 69堂免费精品视频在线播放| 日韩中文一区二区| 日韩欧美二区| 国产色99精品9i| 欧美日韩国产综合网| 国产免费久久| 欧美一区在线观看视频| 丝袜诱惑制服诱惑色一区在线观看 | 精品亚洲美女网站| 麻豆成人综合网| 欧美黄色网页| 欧美a在线观看| 91精品国产自产精品男人的天堂 | 18国产精品| 日韩精品免费一区二区在线观看| 水野朝阳av一区二区三区| 亚洲综合不卡| 亚洲一二三区视频| 成人羞羞视频播放网站| 日韩免费精品| 国产精品一区2区3区| 国产精品亚洲产品| 久久久精品久久久久久96| 国产精品chinese| 美女在线视频一区| 国产精品高颜值在线观看| 日韩综合一区二区| 婷婷激情一区| 老鸭窝一区二区久久精品| 精品免费av| 一区二区视频欧美| 五月天久久网站| 欧美成人日韩| 一本色道精品久久一区二区三区| 国产一区久久| 色婷婷久久久|