有些同學已經了解了聯表查詢的語法結構,也能跑出結果來了,至少到了這一步,硬著頭皮也是要把東西弄出來的精神是值得肯定的,完整的資料庫查詢語法及背後的原理很複雜,不是一時半刻可以說得清的,大多數的人也都是摸著石頭過河走過來的,先會做再來懂是不得不的學習過程,因為我們是為了求職而來的,不是在學校求學,狀況不太一樣.
這篇是自己的一個筆記,也希望幫助到同學大略的了解為什麼查詢的語法會這樣下.
老師給出的資料表有三張,分別是訂單資料表,產品資料表,客戶資料表,我們的最終目的是把三張表的資訊整合成一份人類比較看得懂的報表;
我們先來測試如果單純的合併兩張資料表,不下任何條件,也不指定欄位,會發生什麼事,非常建議大家平時的練習就這樣一個指令一個指令慢慢測,在過程中就會熟記語法和結果.
下圖是不下WHERE條件的結果,我們會發現資料一供是64筆,這是訂單資料16筆乘以產品4筆的總數,所以很明顯的,資料庫的結合方式是把訂單的每一筆資料都複製一筆去對應產品資料表的每一筆資料,所以變成了64筆資料的結果,
因此,我們也發現到每四筆(紅框)資料中,只有一筆是和產品名稱有對上的(藍框),這兩張表的關聯性是建立在產品資料表的編號和訂單資料表中的訂購物代碼是一樣的,所以我們如果希望可以撈取到正確對應到產品的資料,只需要留下 o_product=p_no 的紀錄就可以了,這就是為什麼WHERE後面會需要下 o_product=p_no的原因了.
下圖是我們在查詢語句中加上了過濾條件後的結果,可以看到的是資料總筆數變成16筆,而且每一筆紀錄中的訂購物代碼和產品編號也都一致了.
現在回到我們原本的目的,整合三張表,如果我們不下條件,會得到如下的一張大表,可以看到的是總共有192筆紀錄,這是訂單16筆,產品4筆,客戶3筆乘起來的結果(16x4x3),然後訂單編號1的資料複製了12筆分配給產品和客戶,而產品則各複製了3筆給客戶,所以如果資料庫不好好的做好規劃,未來在查詢和管理上都會很麻煩的.
在下圖中,每12筆資料中只有一筆是我們需要,分別是客戶姓名對應(o_name=c_name)及產品名稱對應(o_product=p_no)的欄位,因此,我們需要過濾同時符合兩個條件的紀錄才是我們最終要留下的.
為了讓大家了解資料查詢的變化,所以我們先來測試一下,如果只先下一個條件會有什麼結果?
下圖是我們只針對產品來下WHERE條件的結果,可以看到的是產品編號和訂單中的訂購物代碼相同的資料被留下來了,而總筆數剩下48筆,這是訂單16筆乘以客戶3筆的數目,所以我們只要再增加對客戶資料的判斷,就可以撈取出正確對應到產品及客戶的資料了.
下圖是我們同時過濾了產品編號和客戶編號後所留下來的紀錄,此時的總筆數只剩下16筆,剛好是訂單的筆數,而且產品編號和客戶編號也都是正確的,這樣的結果已經夠我們拿來做為其它的應用了.
但是實務上,這樣的結果有一個問題是資料表的欄位太多,這裏一共有12個欄位,其中訂單資料表中的資料和產品資料及客戶資料是相同意義的內容,除了增加在網路傳輸時的資料量之外,並沒有其它意義,因此我們最終希望只要撈出我們在PHP應用程式中會使用到的欄位和資料內容就可以了,這樣才可以簡省資料流量,也可以讓最終的資料表的呈現是有意義的,因此我們可以把一開始的SELECT * 語法中增加指定的欄位,只留下我們要的最終欄位即可.
下圖就是我們最終希望呈現的訂單資料表的資料了,雖然我沒有把o_quantity*p_price的總價欄位給顯示出來,但這裏主要是希望讓大家可以透過實際的圖表呈現來看到語法的變化及結果,藉此加深印象.
留言