iT邦幫忙

2021 iThome 鐵人賽

DAY 16
0
自我挑戰組

大二萌新的學習紀錄系列 第 16

Day 16 : PHP - 如何在phpMyAdmin裡用SQL的語法做資料庫的查詢?

  • 分享至 

  • xImage
  •  

如標題,這篇想和大家聊聊如何用SQL的語法做資料庫的查詢
請注意,SQL的函數皆為「全大寫的英文字母

以下資料表和範例是我之前練習過的題目,看起來有點複雜,但其實用法很固定,其格式也大同小異

首先,這裡有三張資料表,由上到下依序為employeesmemberstransactions

employees:
https://ithelp.ithome.com.tw/upload/images/20210930/20141088P7EXu2lQnB.png

members:
https://ithelp.ithome.com.tw/upload/images/20210930/20141088Yz4IW8a22r.png

transactions:
https://ithelp.ithome.com.tw/upload/images/20210930/20141088rHUwZSImnT.png

現在我們點擊上方的「SQL」,會看到一個輸入程式的執行框,在此輸入完按執行即可
https://ithelp.ithome.com.tw/upload/images/20210930/20141088epXIuW3yoA.png


現在,我們會使用以上三張資料表的資料做「查詢」,並且透過以下六個範例來解釋SQL的語法架構
每次查詢完都會跑出一張「新的資料表」,至於跑出什麼內容,全看你的語法怎麼下

Ex 1:
首先,你會看到SELECTFROM
SELECT是用來「取得」資料表裡的資料,其寫的名稱即為新資料表的欄位名稱
FROM則表示要從「哪個」資料表裡取得資料

這裡SELECT為*,FROM為employees,表示將從employees這張資料表裡,查詢「全部欄位」的資料
https://ithelp.ithome.com.tw/upload/images/20210930/20141088QvjZERqFLy.png

所以它印出的新資料表會和「原本」的資料表employees一樣:
https://ithelp.ithome.com.tw/upload/images/20210930/20141088WdIR7rNOr1.png


Ex 2:
這裡我們把欄位名稱分別打出來
但請注意(salary*12) as annual_salary這行,意思是,對資料表employees的salary這個欄位*12倍,並將結果存在annual_salary這個欄位裡
https://ithelp.ithome.com.tw/upload/images/20210930/20141088VxPrdJWm5g.png

所以annual_salary這個欄位的資料會等於salary*12倍
https://ithelp.ithome.com.tw/upload/images/20210930/20141088XlIoeWOLn4.png


Ex 3:
這裡多了WHEREORDER BY
WHERE的後面寫的是「欲查詢的條件」有哪些
ORDER BY則表示要從哪個欄位的資料去做「排序」,預設為「由小排到大」,如果在欄位名稱後面加上DESC,則表示「由大排到小」

這裡WHERE為(age<=30) AND (position IN (‘主管’, ’職員’)),表示將從employees這張資料表裡的欄位age小於等於30的資料,且在欄位position裡是主管or職員的資料,因為是AND,故需「兩者皆符合」才印出
ORDER BY salary DESC則表示依照salary這個欄位的資料,依序由大排到小
https://ithelp.ithome.com.tw/upload/images/20210930/20141088QBN7BID7ZD.png

所以它印出的結果只有position是主管、職員,且age小於等於30的資料
https://ithelp.ithome.com.tw/upload/images/20210930/20141088stvAKchAd5.png


Ex 4:
這裡我們FROM了兩張資料表,分別是transactionsmembers
請注意看SELECT的members.name as name,意思是,「新資料表」的欄位name的資料是從資料表members裡的欄位name獲得的,其餘「皆」是從資料表transactions裡獲得的

所以,如果想「指定」哪張資料表的哪個欄位,只要加上.就好,ex: members.name

這裡WHERE表示transTime須為’2020-03-17 21:36:18’transaction.transMid = members.mid,才將其印出
ORDER BY則指定依members.mid這個欄位的資料,依序由大排到小
https://ithelp.ithome.com.tw/upload/images/20210930/20141088NErWcNIPVZ.png

所以它印出的transTIme的資料皆為2020-03-17 21:36:18
https://ithelp.ithome.com.tw/upload/images/20210930/20141088hDBQETLRAY.png


Ex 5:
這裡多了EXTRACT()
EXTRACT()函數是用來取出日期or時間中的特定部分,語法為:EXTRACT(欲取得的部分 as 欄位名稱),在「欲取得的部分」需全部為「大寫的英文字母

這裡分別要取出transactions裡的欄位transTime的year、month、day,所以在EXTRACT()裡的「欲取得的部分」則依序填入YEARMONTHDAY,再分別指向「新資料表」的欄位year、month、day

因為transactions這張資料表裡的欄位transMid裡有編號1、2、3、4,而members裡的欄位mid只有編號1、2、3,所以在WHERE須加上transactions.transMid = members.mid,以防印出在欄位transMid為「編號4」的資料
https://ithelp.ithome.com.tw/upload/images/20210930/20141088lKywq0JY3I.png

這裡可以看到tNo裡沒有s141016s141017,因為它們在欄位transMid的編號為4
https://ithelp.ithome.com.tw/upload/images/20210930/20141088ipmfPX4w8Z.png


Ex 6:
這裡多了COUNT()GROUP BY
COUNT()是計算此資料在資料表裡出現的次數
GROUP BY為「群組指令」,那種算平均值最大最小值總和……等需整個欄位做比較的,都需要用GROUP BY「指定」欄位名稱

這裡我們要計算在資料表members裡的陳阿龍吳阿珠陳阿明在資料表transactions裡出現的次數為何,所以在WHERE要下transactions.transMid = members.mid

GROUP BY指定計算資料表transactions裡的欄位transMid
ORDER BY先從新資料表裡的欄位count由大排到小,再從欄位name由大排到小
https://ithelp.ithome.com.tw/upload/images/20210930/20141088vlLtUdS5SC.png

結果如下圖所示:
https://ithelp.ithome.com.tw/upload/images/20210930/20141088T2fbfRaB7A.png


以上就是今天的介紹

看起來有點複雜,但SQL的查詢其實就環繞著SELECTFROMWHEREORDER BYGROUP BY
如果你能搞懂以上六個範例的語法架構,那你對SQL的查詢語法架構大致上就沒問題了,只是需要依照其他題目的要求去換函數做使用

如果對以上用法還不太清楚,可以去看一下我貼的參考資料喔!
裡面對SQL的查詢語法有很詳盡的解說


參考資料:
http://mirlab.org/jang/books/asp/sql01.asp?title=18-3%20%A8%CF%A5%CE%20SQL%20%A8%D3%C0%CB%B5%F8%B8%EA%AE%C6


上一篇
Day 15 : PHP - 如何在phpMyAdmin手動建立資料表?char和varchar又該如何選擇?
下一篇
Day 17 : PHP - MySQLi的面向過程和面向對象是什麼?又該如何做選擇?
系列文
大二萌新的學習紀錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言