**自:
昨晚我和我爸聊天
我:「爸,你怎麼把菸戒了,也不出去喝酒了,是因為我媽不讓,還是自己醒悟,開始愛惜自己啦?」
爸:「兒子啊,你說的都不對,是彩禮又漲價了。」
我:「你不是有媳婦了嗎?」
爸:「我有,可你沒有啊!」
我:「爸,我長大了不娶媳婦,好好孝敬您!」
爸:「臭小子,你想的美,我一定要給你娶媳婦,讓你的孩子也好好折騰你,讓你也體會一下有乙個不爭氣的兒子是什麼感受!」
我:「......」
資料庫版本: mysql 5.7.20-log
建表 sql
初始化資料
準備了 769063 條資料
業務機構下銷售商品,同個業務機構可以銷售不同的商品,同個商品可以在不同的業務機構銷售,也就說:業務機構與商品是多對多的關係
假設現在有 n 個機構,每個機構下有幾個商品,如何查詢出這幾個門店下各自商品的銷售情況?
具體點,類似如下
如何查出 100001 下商品 1000、1001、1003 、 100002 下商品 1003、1004 、 100003 下商品 1006、1008、1009 的銷售情況
相當於是雙層列表(業務機構列表中套商品列表)的查詢;業務機構列表和商品列表都不是固定的,而是動態的
那麼問題就是:如何查詢多個業務機構下,某些商品的銷售情況
(問題經我一描述,可能更模糊了,大家明白意思了就好!)
這個很容易想到,在**層面迴圈業務機構列表,每個業務機構查一次資料庫,偽**如下:
具體的 sql 類似如下
sql 能走索引
實現簡單,也好理解,sql 也能走索引,一切看起來似乎很完美
然而現實是:部門開發規範約束,不能迴圈查資料庫
哦豁,這種方式只能放棄,另尋其他方式了
通過 mybatis 的 動態 sql 功能,進行 sql 拼接,類似如下
具體的 sql 類似如下
sql 也能走索引
實現簡單,也好理解,sql 也能走索引,而且只查詢一次資料庫,貌似可行
唯一可惜的是:有點費 or,如果業務機構比較多,那 sql 會比較長
作為候選人之一吧,我們接著往下看
同樣是利用 mybatis 的 動態 sql ,將 business_id 列表拼在一起、 ware_inside_code 拼在一起,類似如下
具體的 sql 類似如下
sql 也能走索引
實現簡單,也好理解,sql 也能走索引,而且只查詢一次資料庫,似乎可行
但是:查出來的結果集大於等於我們想要的結果集,你品,你細品!
所以還需要對查出來的結果集進行一次過濾,過濾出我們想要的結果集
姑且也作為候選人之一吧,我們繼續往下看
sql-92 中加入了行與行比較的功能,這樣一來,比較謂詞 = 、< 、> 和 in 謂詞的引數就不再只是標量值了,還可以是值列表了
當然,還是得用到 mybatis 的 動態 sql ,類似如下
具體的 sql 類似如下
sql 同樣能走索引
實現簡單,sql 也能走索引,而且只查詢一次資料庫,感覺可行
只是:有點不好理解,因為我們平時這麼用的少,所以這種寫法看起來很陌生
另外,行行比較是 sql 規範,不是某個關係型資料庫的規範,也就說關係型資料庫都應該支援這種寫法
1、最後選擇了 行行比較 這種方式來實現了需求
別問我為什麼,問就是逼格高!
2、某乙個需求的實現往往有很多種方式,我們需要結合業務以及各種約束綜合考慮,選擇最合適的那個
3、行行比較是 sql-92 中引入的,sql-92 是 1992 年制定的規範
行行比較不是新特性,而是很早就存在的基礎功能!
主流資料庫比較
一 開放性 1.sql server 只能在windows上執行,沒有絲毫的開放性,作業系統的系統的穩定對資料庫是十分重要的。windows9x系列產品是偏重於桌面應用,nt server只適合中小型企業。而且windows平台的可靠性,安全性和伸縮性是非常有限的。它不象unix那樣久經考驗,尤其是...
Hive和資料庫比較
由於 hive 採用了 sql 的查詢語言 hql,因此很容易將 hive 理解為資料庫。其實從結構上來看,hive 和資料庫除了擁有類似的查詢語言,再無類似之處。本文將從多個方面來闡述 hive 和資料庫的差異。資料庫可以用在 online 的應用中,但是 hive 是為資料倉儲而設計的,清楚這一...
檔案型資料庫比較
檔案型資料庫比較 tinydb,access,ib,fb,easytable,mysql,dbisam我都用過,在運算元據庫時經過突然停電,突然重啟動等因素折騰以後,資料庫檔案準壞。而且壞後99 不能修復。sqlite我用同樣的方法,卻沒事,sqlite資料庫檔案完好無損。特別是tinydb,acc...