PHP學習練手(七)
內聯結
定義:內聯結從指定的表中返回匹配項。
舉例:
匹配項:m.forum_id=f.forum_id
等值聯結:上述匹配項也稱為等值聯結,可以將ON 匹配條件 換成 USING(匹配項)
交換INNER JOIN前後表,查詢結果不變
內聯結可以加入order 邊緣等限制條件
外聯結
定義:它將返回兩個表中都匹配的記錄和不匹配的記錄。
型別:
左聯結:返回左表中的要查詢的所有記錄和右表中匹配的項,若右表中沒有匹配的記錄,則返回NULL。(使用最廣泛)
——舉例:
附:個人理解,此處左表是forums,右表是messages。先查詢左表中的所有項(f.*)即name,然後再查詢右表中與每個name論壇相關聯的subject,若存在subject,則顯示記錄值,若沒有,則為NULL。右聯結:右聯結與左聯結正好相反,返回右表中所有要查詢的記錄和左表中匹配的項,若左表不匹配則返回NULL。
——舉例:
附:可知使用right join後改變左右表的位置,查詢結果一致。- 全聯結:左聯結和右聯結的組合。兩個表中所有匹配的記錄都將被返回,包括左表中部匹配右表的記錄和右表中不匹配左表的記錄。MYSQL不直接支援全聯結,不常用。可以使用左聯結、右聯結加UNION實現該功能。
聯結3個或更多表
1-檢索funny man 使用者釋出的所有訊息的ID、主題和論壇名
附:第一張表為users,第二張表為messages,第三張表為forums。先查詢前2張表中符合條件u.username=’funny man’的所有記錄,然後再將該虛擬表中forum_id所對應的forums名稱再檢索出來。
2-檢索每位使用者的使用者名稱、訊息ID、訊息主題和論壇名
附:第一個左聯結的左表是users,右表是messages。返回左表中所有檢索的username,和username匹配的右表中的記錄,形成一張虛擬表。第二個左聯結的左表是虛擬表,右表是forums。返回虛擬表中所有的forum_id記錄和forum_id匹配的論壇表中的記錄,即name。由於虛擬表的forum_id不要求檢索,故無需顯示。
分組選定的結果
分組函式:
AVG():列出所有數值的平均值
COUNT():列出所有的值得個數
GROUP_CONCAT():列出所有分組的值
附:從結果中可以看出,若不進行分組,則只返回一組資料,若分組,則返回所有分組的記錄。MAX():列出所有值得最大值
MIN():列出所有值得最小值
SUM():列出所有值得合計值
- AVG、COUNT、SUM可以使用DISTINCT關鍵字,使聚合只應用於不重複的值