iT邦幫忙

2024 iThome 鐵人賽

DAY 5
0

在上一章我們學到合併查詢兩個資料表並且將查詢後取得的資料顯示在一個結果集中。而在這一章我們要學到更深入複雜的內容,對兩個以上的資料表建立合併查詢、關聯資料表、如何管理結果集中的資料、如何以類似資料表的格式暫存查詢結果。

情境一 具兩種類型的合併查詢
需要對三個以上的資料表進行合併查詢時,可能會需要用到不同類型的合併查詢,像是內部合併與外部合併做搭配。

舉例:查詢出每個部門的員工名單和對應的薪水,並且即使某些員工沒有薪水記錄或者某些部門沒有員工,也能在結果中顯示。

    select e.employee_name,
           d.department_name,
           s.salary
    from   employees e
    join   departments d 
      on   e.department_id = d.department_id  -- 內部合併:將員工與部門信息合併
    left join salaries s 
      on   e.employee_id = s.employee_id;      -- 外部合併:將薪水信息合併進來

情境二 合併查詢多個資料表
MYSQL實際上能允許我們一次合併查詢61個資料表,但我們其實很難寫出一次查詢這麼多資料表的程式碼,如果發現需要合併查詢超過10個資料表時就可能需要重新設計正在使用的資料庫,來簡化查詢程式碼的流程。
在撰寫此類程式碼時需要注意查詢引用資料欄時,要記得在資料欄名稱前加上資料表的別名與英文句點,來避免錯誤

舉例:查詢出在某一特定地點如Taipei的部門中,員工的薪水大於某一特定數額如 50000

    select e.employee_name,
           d.department_name,
           d.location,
           s.salary
    from   employees e
    join   departments d 
      on   e.department_id = d.department_id --關鍵字on處理第一個條件
     and   d.location = 'Taipei'             -- 使用 AND 關鍵字行第二個條件-篩選部門所在位置
    left join salaries s 
      on   e.employee_id = s.employee_id 
     and   s.salary > 50000 ;                -- 使用 AND 關鍵字行第二個條件-員工薪水大於50000

在這個範例中查詢會需要滿足多個條件,我們會用到關鍵字on和and,on用來處理第一個條件而and用來處理指定的第二個條件,根據需求增加and陳述式

關聯資料表
https://ithelp.ithome.com.tw/upload/images/20240823/201687592F03IBFK4U.jpg
藉由引用其他資料表的主要索引鍵,讓其他資料表的資料列可以彼此建立關係

管理結果集的資料

  • 關鍵字limit

    • 說明:限制結果集顯示的資料數列數量
         select *
         from best restaurant 
         order by place
         limit 5;
      
      表示結果集會顯示出餐廳排名前五名。limit後面加的數字是多少就會顯示多少資料列
  • 關鍵字union

    • 說明:將多個select陳述式的結果整合成一個結果集
    • 特性:會移除結果集中重複的值。如果希望結果集中包含重複的值要使用語法union all
          select fruit_name form orchard_1
          union all
          select fruit_name form orchard_2;
      
          結果集
          fruit_name
          ----------------
          apple
          banana
          orange
          peach
          apple
      
  • 暫存資料表

    • 說明:以類似資料表的格式暫存查詢結果
    • 特性:只能在單次session中重複使用暫存資料表,一旦關閉重新打開就會消失
    • 語法:與建立一般資料表相同,但語法改為create temporary table
    • 通用資料表運算式(CTE)
      • 為暫存資料表命名
      • 只能在單次查詢期間使用
      • 以關鍵字with為CTE命名
    • 遞迴通用資料表運算式
      • 使用時機:當資料是一連串的值或階層,且需要知道前一個值才能找到目前的值
      • 具兩個select陳述式,並由union隔開
    • 子查詢(內層查詢)
      • 使用時機:回傳主查詢後面需要用的資料,也就是說當查詢有子查詢時,會先執行子查詢,取出的值再回傳給外層查詢
      • 單行子查詢
                外層查詢
        selsct employee_name
        from employees
        where department_id =
        (       內層查詢
        selsect department_id 
        from departments 
        wherw location = 'Taipei'
        );
      
      • 多行子查詢
        selsct employee_name
        from employees
        where department_id **in**
        (
        selsect department_id 
        from departments 
        wherw location = 'Taipei'
        );
      
      以關鍵字in取代=

下一章:比較運算子&查詢值


上一篇
Day4 合併查詢(上)
下一篇
Day6 比較運算子&查詢值
系列文
從零開始的MySQL開發旅程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言