0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

高逼格的SQL寫(xiě)法:行行比較

Android編程精選 ? 來(lái)源:Android編程精選 ? 2023-05-12 10:51 ? 次閱讀


環(huán)境準(zhǔn)備

數(shù)據(jù)庫(kù)版本:MySQL 5.7.20-log

1b46ab4a-f06e-11ed-90ce-dac502259ad0.png

圖片

建表 SQL

DROPTABLEIFEXISTS`t_ware_sale_statistics`;
CREATETABLE`t_ware_sale_statistics`(
`id`bigint(20)NOTNULLAUTO_INCREMENTCOMMENT'主鍵id',
`business_id`bigint(20)NOTNULLCOMMENT'業(yè)務(wù)機(jī)構(gòu)編碼',
`ware_inside_code`bigint(20)NOTNULLCOMMENT'商品自編碼',
`weight_sale_cnt_day`double(16,4)DEFAULTNULLCOMMENT'平均日銷(xiāo)量',
`last_thirty_days_sales`double(16,4)DEFAULTNULLCOMMENT'最近30天銷(xiāo)量',
`last_sixty_days_sales`double(16,4)DEFAULTNULLCOMMENT'最近60天銷(xiāo)量',
`last_ninety_days_sales`double(16,4)DEFAULTNULLCOMMENT'最近90天銷(xiāo)量',
`same_period_sale_qty_thirty`double(16,4)DEFAULTNULLCOMMENT'去年同期30天銷(xiāo)量',`same_period_sale_qty_sixty`double(16,4)DEFAULTNULLCOMMENT'去年同期60天銷(xiāo)量',`same_period_sale_qty_ninety`double(16,4)DEFAULTNULLCOMMENT'去年同期90天銷(xiāo)量',
`create_user`bigint(20)DEFAULTNULLCOMMENT'創(chuàng)建人',
`create_time`datetimeNOTNULLDEFAULTCURRENT_TIMESTAMPCOMMENT'創(chuàng)建時(shí)間',
`modify_user`bigint(20)DEFAULTNULLCOMMENT'最終修改人',
`modify_time`datetimeNOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMPCOMMENT'最終修改時(shí)間',`is_delete`tinyint(2)DEFAULT'2'COMMENT'是否刪除,1:是,2:否',
PRIMARYKEY(`id`)USINGBTREE,
KEY`idx_business_ware`(`business_id`,`ware_inside_code`)USINGBTREE
)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4ROW_FORMAT=DYNAMICCOMMENT='商品銷(xiāo)售統(tǒng)計(jì)';

1b5575d0-f06e-11ed-90ce-dac502259ad0.png

圖片

初始化數(shù)據(jù)

準(zhǔn)備了 769063 條數(shù)據(jù)

1b6e858e-f06e-11ed-90ce-dac502259ad0.png

圖片

基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 視頻教程:https://doc.iocoder.cn/video/

需求背景

業(yè)務(wù)機(jī)構(gòu)下銷(xiāo)售商品,同個(gè)業(yè)務(wù)機(jī)構(gòu)可以銷(xiāo)售不同的商品,同個(gè)商品可以在不同的業(yè)務(wù)機(jī)構(gòu)銷(xiāo)售,也就說(shuō):業(yè)務(wù)機(jī)構(gòu)與商品是多對(duì)多的關(guān)系

假設(shè)現(xiàn)在有 n 個(gè)機(jī)構(gòu),每個(gè)機(jī)構(gòu)下有幾個(gè)商品,如何查詢出這幾個(gè)門(mén)店下各自商品的銷(xiāo)售情況?

具體點(diǎn),類(lèi)似如下

1b7edda8-f06e-11ed-90ce-dac502259ad0.png

圖片

如何查出 100001 下商品 1000、1001、1003 、 100002 下商品 1003、1004 、 100003 下商品 1006、1008、1009 的銷(xiāo)售情況

相當(dāng)于是雙層列表(業(yè)務(wù)機(jī)構(gòu)列表中套商品列表)的查詢;業(yè)務(wù)機(jī)構(gòu)列表和商品列表都不是固定的,而是動(dòng)態(tài)的

那么問(wèn)題就是:如何查詢多個(gè)業(yè)務(wù)機(jī)構(gòu)下,某些商品的銷(xiāo)售情況

(問(wèn)題經(jīng)我一描述,可能更模糊了,大家明白意思了就好?。?/p>

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://github.com/YunaiV/yudao-cloud
  • 視頻教程:https://doc.iocoder.cn/video/

循環(huán)查詢

這個(gè)很容易想到,在代碼層面循環(huán)業(yè)務(wù)機(jī)構(gòu)列表,每個(gè)業(yè)務(wù)機(jī)構(gòu)查一次數(shù)據(jù)庫(kù),偽代碼如下:

1b91565e-f06e-11ed-90ce-dac502259ad0.png

圖片

具體的 SQL 類(lèi)似如下

1ba3410c-f06e-11ed-90ce-dac502259ad0.png

圖片

SQL 能走索引

1bb7f912-f06e-11ed-90ce-dac502259ad0.png

圖片

實(shí)現(xiàn)簡(jiǎn)單,也好理解,SQL 也能走索引,一切看起來(lái)似乎很完美

然而現(xiàn)實(shí)是:部門(mén)開(kāi)發(fā)規(guī)范約束,不能循環(huán)查數(shù)據(jù)庫(kù)

哦豁,這種方式只能放棄,另尋其他方式了

OR 拼接

通過(guò) MyBatis 的 動(dòng)態(tài) SQL 功能,進(jìn)行 SQL 拼接,類(lèi)似如下

1bcdfd2a-f06e-11ed-90ce-dac502259ad0.png

圖片

具體的 SQL 類(lèi)似如下

1be97366-f06e-11ed-90ce-dac502259ad0.png

圖片

SQL 也能走索引

1c023310-f06e-11ed-90ce-dac502259ad0.png

圖片

實(shí)現(xiàn)簡(jiǎn)單,也好理解,SQL 也能走索引,而且只查詢一次數(shù)據(jù)庫(kù),貌似可行

唯一可惜的是:有點(diǎn)費(fèi) OR,如果業(yè)務(wù)機(jī)構(gòu)比較多,那 SQL 會(huì)比較長(zhǎng)

作為候選人之一吧,我們接著往下看

混查過(guò)濾

同樣是利用 Mybatis 的 動(dòng)態(tài) SQL ,將 business_id 列表拼在一起、 ware_inside_code 拼在一起,類(lèi)似如下

1c1a44dc-f06e-11ed-90ce-dac502259ad0.png

圖片

具體的 SQL 類(lèi)似如下

1c30de0e-f06e-11ed-90ce-dac502259ad0.png

圖片

SQL 也能走索引

1c44bdc0-f06e-11ed-90ce-dac502259ad0.png

圖片

實(shí)現(xiàn)簡(jiǎn)單,也好理解,SQL 也能走索引,而且只查詢一次數(shù)據(jù)庫(kù),似乎可行

但是:查出來(lái)的結(jié)果集大于等于我們想要的結(jié)果集,你品,你細(xì)品!

所以還需要對(duì)查出來(lái)的結(jié)果集進(jìn)行一次過(guò)濾,過(guò)濾出我們想要的結(jié)果集

姑且也作為候選人之一吧,我們繼續(xù)往下看

行行比較

SQL-92 中加入了行與行比較的功能,這樣一來(lái),比較謂詞 = 、< 、> 和 IN 謂詞的參數(shù)就不再只是標(biāo)量值了,還可以是值列表了

當(dāng)然,還是得用到 Mybatis 的 動(dòng)態(tài) SQL ,類(lèi)似如下

1c5a651c-f06e-11ed-90ce-dac502259ad0.png

圖片

具體的 SQL 類(lèi)似如下

1c6f9bda-f06e-11ed-90ce-dac502259ad0.png

圖片

SQL 同樣能走索引

1c85a196-f06e-11ed-90ce-dac502259ad0.png

圖片

實(shí)現(xiàn)簡(jiǎn)單,SQL 也能走索引,而且只查詢一次數(shù)據(jù)庫(kù),感覺(jué)可行

只是:有點(diǎn)不好理解,因?yàn)槲覀兤綍r(shí)這么用的少,所以這種寫(xiě)法看起來(lái)很陌生

另外,行行比較是 SQL 規(guī)范,不是某個(gè)關(guān)系型數(shù)據(jù)庫(kù)的規(guī)范,也就說(shuō)關(guān)系型數(shù)據(jù)庫(kù)都應(yīng)該支持這種寫(xiě)法

總結(jié)

1、最后選擇了 行行比較 這種方式來(lái)實(shí)現(xiàn)了需求

別問(wèn)我為什么,問(wèn)就是逼格高!

2、某一個(gè)需求的實(shí)現(xiàn)往往有很多種方式,我們需要結(jié)合業(yè)務(wù)以及各種約束綜合考慮,選擇最合適的那個(gè)

3、行行比較是 SQL-92 中引入的,SQL-92 是 1992 年制定的規(guī)范

行行比較不是新特性,而是很早就存在的基礎(chǔ)功能!

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • SQL
    SQL
    +關(guān)注

    關(guān)注

    1

    文章

    767

    瀏覽量

    44174
  • 數(shù)據(jù)庫(kù)
    +關(guān)注

    關(guān)注

    7

    文章

    3822

    瀏覽量

    64506

原文標(biāo)題:高逼格的SQL寫(xiě)法:行行比較

文章出處:【微信號(hào):AndroidPush,微信公眾號(hào):Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    不高,數(shù)量不是唯一標(biāo)準(zhǔn)

    對(duì)于追求“”的人而言,氙氣大燈已經(jīng)落伍,激光照明又買(mǎi)不到,LED剛剛好。衡量汽車(chē)LED大燈好壞,燈泡數(shù)量是重要標(biāo)準(zhǔn),數(shù)量越多,照明效果越好,越顯檔次。但燈泡數(shù)量也不是唯一,還是有其他“高大上”的標(biāo)準(zhǔn)。
    發(fā)表于 02-22 14:04 ?805次閱讀

    關(guān)于labview中的SQL語(yǔ)句寫(xiě)法

    我的問(wèn)題是:比如說(shuō)要查詢數(shù)據(jù)庫(kù)中的時(shí)間在20120806-20130105之間的數(shù)據(jù) ,用vi程序查詢,那么SQL query語(yǔ)句該怎么寫(xiě)? 求大神幫忙???謝謝
    發(fā)表于 01-05 22:09

    用混凝土做的吊燈,讓你的家變成藝術(shù)館

    經(jīng)常會(huì)在一些復(fù)古的店里見(jiàn)到一些比較有格調(diào)的燈,也想在家裝一個(gè)。雖然某寶上什么都有,但自己做一個(gè)會(huì)更好吧。剛好看到有國(guó)外網(wǎng)友做了一個(gè)的混凝土燈,可以分享一下。步驟1:供給和工具-混
    發(fā)表于 11-24 16:37

    請(qǐng)教大神們,一個(gè)修手機(jī)的應(yīng)該在論壇里看那類(lèi)的帖子,或者哪方面的書(shū)籍來(lái)提升

    論一個(gè)苦+低文化的維修人員的和節(jié)操疑問(wèn)和疑惑如題,現(xiàn)在修手機(jī)到一定瓶頸了,想提升自己只能再學(xué)習(xí)些對(duì)我來(lái)說(shuō)特別專(zhuān)業(yè)的知識(shí),想到手機(jī)主板的設(shè)計(jì)與研發(fā)少不了電路的設(shè)計(jì),所以來(lái)壇里向大神們?nèi)∪〗?jīng),感激不盡
    發(fā)表于 06-08 23:27

    最簡(jiǎn)單的設(shè)備,也能拍攝的照片

    ,根據(jù)自己的情況有個(gè)度就行了。今天就教大家如何用最簡(jiǎn)單的、普通的設(shè)備,拍攝的照片。第一,沒(méi)有做不到,只有想不到第二、后期創(chuàng)意處理,效果驚人攝影是一門(mén)藝術(shù),創(chuàng)意比器材重要,初學(xué)攝影者,不需要一門(mén)心思的升級(jí)設(shè)備,好的作品是需要
    發(fā)表于 08-25 16:15

    你絕沒(méi)用過(guò)的一款空間可視化工具

    ='geojson')數(shù)據(jù)導(dǎo)入進(jìn)來(lái)后,作一些簡(jiǎn)單的自定義設(shè)置,就可以生成滿滿的空間可視化圖:除了在 Jupyter Notebook 展示,還可以導(dǎo)出為可交互式
    發(fā)表于 07-30 04:00

    三星玩,雙曲面剛過(guò)去,折疊功能又來(lái)了?

    盡管還沒(méi)從三星的新產(chǎn)品Note7爆炸案件陰影中徹底走出,但是大眾對(duì)于三星在手機(jī)領(lǐng)域的研發(fā)能力還是頗為認(rèn)可的,三星在手機(jī)專(zhuān)利領(lǐng)域確實(shí)也“玩”出了。這不,剛剛在雙曲面上突破了,又在折疊專(zhuān)利上有了“新招兒”。
    發(fā)表于 01-10 09:40 ?412次閱讀
    三星玩<b class='flag-5'>高</b><b class='flag-5'>逼</b><b class='flag-5'>格</b>,雙曲面剛過(guò)去,折疊功能又來(lái)了?

    小米5s,華為mate9這幾款手機(jī)的黑色版本真的!

    黑色應(yīng)該是流行了最久的一個(gè)顏色了,個(gè)人感覺(jué)黑色的東西非常,自帶一種高冷范。手機(jī)也是如此,黑色作為主配色之一,也深受用戶的喜愛(ài)。如果下面這些手機(jī)中有你喜歡的,不妨考慮考慮黑色版本。
    發(fā)表于 03-09 09:19 ?2099次閱讀

    iPhone 7 Plus等8款顏控手機(jī),哪款把你給觸動(dòng)了?

    無(wú)可否認(rèn),蘋(píng)果手機(jī)是國(guó)內(nèi)街頭出現(xiàn)率最高的手機(jī),價(jià)格昂貴、知名度使得蘋(píng)果手機(jī)似乎成為了衡量一個(gè)人是否富有是否有的標(biāo)準(zhǔn),所以把IPhone7 Plus放進(jìn)這個(gè)榜單中我想沒(méi)人會(huì)反對(duì)。
    發(fā)表于 04-05 09:35 ?1363次閱讀

    還記得那個(gè)曾經(jīng)滿滿的VAIO筆記本嗎?重新殺回來(lái)了

    曾經(jīng)何時(shí),索尼旗下VAIO筆記本就是的代名詞,其在國(guó)內(nèi)擁有眾多粉絲,愿意圍棋買(mǎi)單的用戶比比皆是,既然有這么大市場(chǎng),為何不重新殺回來(lái)呢?
    發(fā)表于 07-11 14:42 ?813次閱讀

    雪佛蘭科邁羅,馬自達(dá)MX-5,標(biāo)致RCZ便宜和的三款撩妹必備的神車(chē),售價(jià)基本在四十萬(wàn)左右

    又到了躁動(dòng)的夏季,在這個(gè)炎熱的季節(jié)里,好像一切都顯得那么不安分。比如人的荷爾蒙,在這個(gè)季節(jié)總是會(huì)特別泛濫,男人們總是會(huì)想著到處去撩妹,可是在這個(gè)功利的時(shí)代,沒(méi)有一輛的好車(chē),如何能撩得一手好妹呢
    發(fā)表于 07-17 11:27 ?1496次閱讀

    SQL告別count改用LIMIT 1

    的count 目前多數(shù)人的寫(xiě)法 多次REVIEW代碼時(shí),發(fā)現(xiàn)如現(xiàn)現(xiàn)象:業(yè)務(wù)代碼中,需要根據(jù)一個(gè)或多個(gè)條件,查詢是否存在記錄,不關(guān)心有多少條記錄。普遍的SQL及代碼寫(xiě)法如下 ##### SQL
    的頭像 發(fā)表于 07-26 10:57 ?2068次閱讀

    JAVA8提供了Optional類(lèi)來(lái)優(yōu)化這種寫(xiě)法

    這種寫(xiě)法比較丑陋的,為了避免上述丑陋的寫(xiě)法,讓丑陋的設(shè)計(jì)變得優(yōu)雅。JAVA8提供了Optional類(lèi)來(lái)優(yōu)化這種寫(xiě)法,接下來(lái)的正文部分進(jìn)行詳細(xì)說(shuō)明
    的頭像 發(fā)表于 04-24 15:18 ?1097次閱讀

    SQL MySQL編寫(xiě)技巧:行與行比較的功能

    實(shí)現(xiàn)簡(jiǎn)單,SQL 也能走索引,而且只查詢一次數(shù)據(jù)庫(kù),感覺(jué)可行 只是:有點(diǎn)不好理解,因?yàn)槲覀兤綍r(shí)這么用的少,所以這種寫(xiě)法看起來(lái)很陌生 另外,行行比較
    發(fā)表于 07-17 09:51 ?495次閱讀
    <b class='flag-5'>SQL</b> MySQL編寫(xiě)技巧:行與行<b class='flag-5'>比較</b>的功能

    insert into 語(yǔ)句的三種寫(xiě)法

    INSERT INTO是MySQL中常用的一種SQL語(yǔ)句,用于將數(shù)據(jù)插入到表中。此文將詳細(xì)介紹INSERT INTO語(yǔ)句的三種不同寫(xiě)法及其用途,并提供代碼示例和相關(guān)解釋。 正文: 一、基本插入
    的頭像 發(fā)表于 11-21 14:18 ?1.4w次閱讀