1. 程式人生 > >PHP學習練手(七)

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關鍵字,使聚合只應用於不重複的值
    這裡寫圖片描述