SQLite3中的三種Join方式
前一陣子設計資料庫結構,有個設計是要儲存所有的音、視訊和圖片資訊的metadata到表中,並要求可以不分型別的一次全部檢索出來。原來有個設計是設計一張大表,把所有的欄位不分型別全都添進去,通過型別欄位進行判斷,讀取哪些metadata作為檢索結果。這樣就導致表的結構十分複雜,且大量的欄位為空。為了解決這個問題,查了一下SQL的Join演算法,解決了這個設計問題。以下是SQLite3中支援的Join方式及使用說明:
1. Cross Join
又叫笛卡爾積,匹配前一個表與後一個表的每一行和每一列,這樣得到的結果集為n*m行(n, m分別為每張表的行數),x+y列(x, y分別為每張表的列數)。可見,該結果集可能會成為一個巨大的表,對記憶體和後續處理都會造成巨大壓力,所以,慎用(真沒用過)。
語法:SELECT ... FROM t1 CROSS JOIN t2 ...
(盜用Using SQLite3 2010中的圖)
2. Inner Join
類似Cross Join,但內建機制限制了返回的結果數量。返回的結果集不會超過x + y列,行數在0- n*m行之間。有3種方法用來指定Inner Join的判斷條件:
第一種是On表示式:SELECT ... FROM t1 JOIN t2 ON conditional_expression ...,例如:SELECT ... FROM employee JOIN resource ON employee.eid = resource.eid ...。
但On這種方式有倆個問題:一是語句比較長,二是存在重複列,如倆個eid。因此,可以使用第二種方式Using表示式:SELECT ... FROM t1 JOIN t2 USING ( col1 ,... ) ...,這種Join返回的結果集中沒有重複的欄位,只是每個欄位必須存在於各個表中。
更簡潔的方式是,使用第三種方式Natural Join:SQL自動檢測各表中每一列是否匹配,這樣,即使表結構發生變化,也不用修改SQL語句,可以自動適應變化。
(繼續盜圖)
3. Outer Join
解決我的問題使用的是Outer Join。
SQLite3只支援left outer join,其結果集由不大於x + y列,n - n*m行構成,至少包含左側表的每一行,對於Join後不存在的欄位值,則賦NULL。這樣得到的表與我們之前設計那個全集結果一樣,但資料結構更清晰,空間佔用更少。
(最後一次盜圖)
相關推薦
SQLite3中的三種Join方式
前一陣子設計資料庫結構,有個設計是要儲存所有的音、視訊和圖片資訊的metadata到表中,並要求可以不分型別的一次全部檢索出來。原來有個設計是設計一張大表,把所有的欄位不分型別全都添進去,通過型別欄位進行判斷,讀取哪些metadata作為檢索結果。這樣就導致表的結構十分複雜,
Hive的三種Join方式
Hive中就是把Map,Reduce的Join拿過來,通過SQL來表示。 參考連結:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins Common/Shuffle/Reduce Join Reduce
xml中三種解析方式介紹
1)dom: 文件物件模型(Document Object Model) 官方推薦的標準 dom原理:會把我們要解析的整個xml載入到到記憶體中.在記憶體中形成一個樹形結構 優點:可以進行增刪改查 缺點:由於把整個文件載入到記憶體中.所以會造成記憶體
iOS中三種定位方式
原理 每個手機基站都有一個識別符號,iPhone或3G iPad可以蒐集周圍所有收到訊號的基站和它們的識別符號,通過聯網傳送到蘋果雲端伺服器,再由伺服器根據這些基站的的位置資訊查詢並計算出當前位置,然後返回給手機。因為基站訊號輻射範圍大,所以誤差也大,在500米 ~ 幾公里. 特點 定位速度最
JS中三種編碼方式(escape,encodeURI,encodeURIComponent)
一 參考書 1 js編碼http://blog.csdn.net/cnartstorm/archive/2009/06/23/4292460.aspx2 js 解決中文亂碼函式-js中escape,encodeURI,encodeURIComponent三個函式的區別 h
.NetCore中三種注入方式的思考
該篇內容由個人部落格點選跳轉同步更新!轉載請註明出處! .NetCore徹底詮釋了“萬物皆可注入”這句話的含義,在.NetCore中到處可見注入的使用。因此core中也提供了三種注入方式的使用,分別是: AddTransient:每次請求,都獲取一個新的例項。即使同一個請求獲取多次也會是不同的例項
sql註入過程中後臺數據庫類型的三種判斷方式
sql註入 安全測試 數據庫類型判斷 後臺數據庫類型判斷:一、通過頁面返回的報錯信息,一般情況下頁面報錯會顯示是什麽數據庫類型,在此不多說;二、通過各個數據庫特有的數據表來判斷: 1、mssql數據庫 http://127.0.0.1/test.php?id=1 and (sele
Android中三種常用解析XML的方式(DOM、SAX、PULL)簡介及區別
字符串 lan win name屬性 Coding 空間 toc log fin XML在各種開發中都廣泛應用,Android也不例外。作為承載數據的一個重要角色,如何讀寫XML成為Android開發中一項重要的技能。今天就由我向大家介紹一下在Android平臺下幾種常見的
Qt中三種解析xml的方式
處理異常 AR ttr omd ostream odin move encoding efault 在下面的隨筆中,我會根據xml的結構,給出Qt中解析這個xml的三種方式的代碼。雖然,這個代碼時通過調用Qt的函數實現的,但是,很多開源的C++解析xml的庫,甚至很多其他語
c++中三種參數引用方式
例子 機制 string ret 調用 esp roc tor cpp 傳值調用 是默認的參數傳遞機制,實參會復制給形參,調用的語義是每次取得實參的副本並將該復本用作形參,即會有復本的開銷,並且不改變實參的值。 適用於:傳值調用用於不應該被函數改變的小型對象。 例子:voi
servlet的介紹 & xml中配置 以及 & 三種實現方式(補充設定瀏覽器不快取的方法)
開始時間:2018年10月13日20:53:30 | 2018年10月14日16:10:56 結束時間:2018年10月13日21:53:30 | 2018年10月14日17:02:23 累計時間:2小時 備註:幾乎每一句話都很有收穫,複習的時候務必要仔細一點 Servlet
Oracle中PL/SQL之 while、for、loop 三種迴圈方式的使用
PL/SQL while、for、loop 三種迴圈方式的使用 1、WHILE ... LOOP ... END LOOP 語法: WHILE 條件 LOOP 語句; END LOOP; 例子:輸出1到5的數字 declare num number :
Spark SQL join的三種實現方式
引言 join是SQL中的常用操作,良好的表結構能夠將資料分散到不同的表中,使其符合某種規範(mysql三大正規化),可以最大程度的減少資料冗餘,更新容錯等,而建立表和表之間關係的最佳方式就是join操作。 對於Spark來說有3種Join的實現,每種Join對應的不同的應用場景(SparkSQL自動決策
C++中類的三種繼承方式public(公有繼承)、protected(保護繼承)、private(私有繼承)之間的差別(附思維導圖)【轉】
(轉自:https://blog.csdn.net/coco56/article/details/80467975) 注:若不指明繼承方式,則預設是私有繼承。 一:對於公有繼承(public)方式: 基類的public和protected成員的訪問屬性在派生類中保持不變,但基類的p
springcloud中RestTemplate的三種使用方式
首先在A應用Controller中寫個方法 例如: package com.hlvy.hlvyeclient.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.spring
常量的三種定義方式和static在c語言中的三種修飾
c語言的常量在執行期間為固定值,在定義後無法被修改常量可以是任何的資料基本型別,可以為整形,浮點常量,字元和字串常量1,使用const關鍵字2, 使用巨集定義3,使用列舉常量 列舉: 1 #include<stdio.h> 2 int main(){ 3 e
Spring中Bean的三種裝配方式
bean的裝配通俗點就是依賴注入(spring的特點之一),再說通俗點就是類中屬性的賦值,而這種賦值不是由我們直接在程式碼中賦值,而是通過在配置檔案中配置值類實現的,給他起了一個高大上的名字,讓我來說就是把賦值包裝了一層還有一層呀。讓我們一起看看這三種裝配方式怎麼實現的吧!!
R中三種檢驗正態分佈的方式
一、畫出密度函式與正態分佈密度圖比較: library(MASS) mu<- c(0,0,0) Sigma<- matrix(c(1,0.5,0.25,0.5,1,0.5, 0.25,0.5,1),3,3) M<- mvrnorm(1000,
SparkSQL中的三種Join及其實現(broadcast join、shuffle hash join和sort merge join)
1.小表對大表(broadcast join) 將小表的資料分發到每個節點上,供大表使用。executor儲存小表的全部資料,一定程度上犧牲了空間,換取shuffle操作大量的耗時,這在SparkSQL中稱作Broadcast Join Broadcast Jo
servlet的介紹 & xml中配置 以及 & 三種實現方式(補充設定瀏覽器不快取的方法)
開始時間:2018年10月13日20:53:30 | 2018年10月14日16:10:56 結束時間:2018年10月13日21:53:30 | 2018年10月14日17:02:23 累計時間:3小時 動態資源: Servlet 簡單介紹: Servlet