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

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

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

高逼格的SQL寫法:行行比較

Android編程精選 ? 來源:Android編程精選 ? 2023-05-12 10:51 ? 次閱讀


環(huán)境準備

數(shù)據(jù)庫版本: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ù)機構(gòu)編碼',
`ware_inside_code`bigint(20)NOTNULLCOMMENT'商品自編碼',
`weight_sale_cnt_day`double(16,4)DEFAULTNULLCOMMENT'平均日銷量',
`last_thirty_days_sales`double(16,4)DEFAULTNULLCOMMENT'最近30天銷量',
`last_sixty_days_sales`double(16,4)DEFAULTNULLCOMMENT'最近60天銷量',
`last_ninety_days_sales`double(16,4)DEFAULTNULLCOMMENT'最近90天銷量',
`same_period_sale_qty_thirty`double(16,4)DEFAULTNULLCOMMENT'去年同期30天銷量',`same_period_sale_qty_sixty`double(16,4)DEFAULTNULLCOMMENT'去年同期60天銷量',`same_period_sale_qty_ninety`double(16,4)DEFAULTNULLCOMMENT'去年同期90天銷量',
`create_user`bigint(20)DEFAULTNULLCOMMENT'創(chuàng)建人',
`create_time`datetimeNOTNULLDEFAULTCURRENT_TIMESTAMPCOMMENT'創(chuàng)建時間',
`modify_user`bigint(20)DEFAULTNULLCOMMENT'最終修改人',
`modify_time`datetimeNOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMPCOMMENT'最終修改時間',`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='商品銷售統(tǒng)計';

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

圖片

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

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

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

圖片

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

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

需求背景

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

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

具體點,類似如下

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

圖片

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

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

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

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

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

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

循環(huán)查詢

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

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

圖片

具體的 SQL 類似如下

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

圖片

SQL 能走索引

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

圖片

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

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

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

OR 拼接

通過 MyBatis 的 動態(tài) SQL 功能,進行 SQL 拼接,類似如下

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

圖片

具體的 SQL 類似如下

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

圖片

SQL 也能走索引

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

圖片

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

唯一可惜的是:有點費 OR,如果業(yè)務(wù)機構(gòu)比較多,那 SQL 會比較長

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

混查過濾

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

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

圖片

具體的 SQL 類似如下

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

圖片

SQL 也能走索引

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

圖片

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

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

所以還需要對查出來的結(jié)果集進行一次過濾,過濾出我們想要的結(jié)果集

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

行行比較

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

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

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

圖片

具體的 SQL 類似如下

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

圖片

SQL 同樣能走索引

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

圖片

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

只是:有點不好理解,因為我們平時這么用的少,所以這種寫法看起來很陌生

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

總結(jié)

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

別問我為什么,問就是逼格高!

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

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

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

審核編輯 :李倩


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

    關(guān)注

    1

    文章

    750

    瀏覽量

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

    關(guān)注

    7

    文章

    3712

    瀏覽量

    64028

原文標題:高逼格的SQL寫法:行行比較

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

收藏 人收藏

    評論

    相關(guān)推薦

    不高,數(shù)量不是唯一標準

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

    關(guān)于labview中的SQL語句寫法

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

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

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

    請教大神們,一個修手機的應(yīng)該在論壇里看那類的帖子,或者哪方面的書籍來提升

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

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

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

    你絕沒用過的一款空間可視化工具

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

    三星玩,雙曲面剛過去,折疊功能又來了?

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

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

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

    iPhone 7 Plus等8款顏控手機,哪款把你給觸動了?

    無可否認,蘋果手機是國內(nèi)街頭出現(xiàn)率最高的手機,價格昂貴、知名度使得蘋果手機似乎成為了衡量一個人是否富有是否有的標準,所以把IPhone7 Plus放進這個榜單中我想沒人會反對。
    發(fā)表于 04-05 09:35 ?1293次閱讀

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

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

    雪佛蘭科邁羅,馬自達MX-5,標致RCZ便宜和的三款撩妹必備的神車,售價基本在四十萬左右

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

    SQL告別count改用LIMIT 1

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

    JAVA8提供了Optional類來優(yōu)化這種寫法

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

    SQL MySQL編寫技巧:行與行比較的功能

    實現(xiàn)簡單,SQL 也能走索引,而且只查詢一次數(shù)據(jù)庫,感覺可行 只是:有點不好理解,因為我們平時這么用的少,所以這種寫法看起來很陌生 另外,行行比較
    發(fā)表于 07-17 09:51 ?438次閱讀
    <b class='flag-5'>SQL</b> MySQL編寫技巧:行與行<b class='flag-5'>比較</b>的功能

    insert into 語句的三種寫法

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