SQL - 表の照会 (SELECT)


■内容

Top

■表の照会

Top

■基本SELECT文


■一般形式(基本)
Top
■演算子
■算術演算子
■文字列連結
■関係演算子(比較演算子)
■論理演算子
■型キャスト
Top

■基本照会

Top
■列の選択(射影)
■例題
  1. 担当者表(employee)から、すべてのデータを照会してください。

    • すべてのデータを照会する場合は、"*" を使います。
    select * FROM employee
    
    結果表
    EMP_ID      DEPT_ID     EMP_NAME             BIRTHDAY   HIREDATE   SEX         SAL        
    ----------- ----------- -------------------- ---------- ---------- ----------- -----------
              1          10 羽生 章洋            1978-10-10 1990-12-17           1      800.00
              2          10 釜本 喜美子          1975-05-20 1991-02-20           2     1600.00
              3          20 安部 弘江            1974-06-01 1991-02-22           2     1250.00
              4          20 松村 秀和            1970-09-13 1991-04-02           1     2975.00
              5          30 萩原 恵理子          1985-03-16 2008-09-28           2     1250.00
              6          30 岡田 奈緒子          1983-12-24 2007-05-01           2     2850.00
              7          30 井上 尚志            1971-10-17 2000-11-15           1     2450.00
              8          40 西口 麻衣子          1986-12-14 2008-12-03           2     3000.00
              9          40 滝本 順三            1978-04-02 2004-12-18           1     5000.00
             10          40 工藤 新一            1990-02-10 1999-04-01           1     1500.00
             11          90 毛利光太郎           1970-12-31 1990-04-01           1     8000.00
    
      11 レコードが選択されました。
    
  2. 担当者表(employee)から、担当者名(emp_name)と生年月日(birthday)を照会してください。

    • 特定の列を照会する場合は、列名を使います。
    select emp_name, birthday FROM employee 
    
    結果表
    EMP_NAME             BIRTHDAY
    -------------------- ----------
    羽生 章洋            1978-10-10
    釜本 喜美子          1975-05-20
    安部 弘江            1974-06-01
    松村 秀和            1970-09-13
    萩原 恵理子          1985-03-16
    岡田 奈緒子          1983-12-24
    井上 尚志            1971-10-17
    西口 麻衣子          1986-12-14
    滝本 順三            1978-04-02
    工藤 新一            1990-02-10
    毛利光太郎           1970-12-31
    
      11 レコードが選択されました。
    
  3. 担当者表(employee)から、担当者名(emp_name)と生年月日(birthday)を照会してください。このとき、生年月日(birthday)には列別名"誕生日"をつけます。

    • DB2では、ASキーワードは省略できます。また、2重引用符を使って、列別名中に、空白を入れることもできます。
    select emp_name, birthday AS 誕生日 FROM employee 
    
    結果表
    EMP_NAME             誕生日
    -------------------- ----------
    羽生 章洋            1978-10-10
    釜本 喜美子          1975-05-20
    安部 弘江            1974-06-01
    松村 秀和            1970-09-13
    萩原 恵理子          1985-03-16
    岡田 奈緒子          1983-12-24
    井上 尚志            1971-10-17
    西口 麻衣子          1986-12-14
    滝本 順三            1978-04-02
    工藤 新一            1990-02-10
    毛利光太郎           1970-12-31
    
      11 レコードが選択されました。
    
  4. 担当者表(employee)から、担当者名(emp_name)と給与額(sal)を照会してください。
    select emp_name, sal FROM employee 
    
    結果表
    EMP_NAME             SAL
    -------------------- -----------
    羽生 章洋                 800.00
    釜本 喜美子              1600.00
    安部 弘江                1250.00
    松村 秀和                2975.00
    萩原 恵理子              1250.00
    岡田 奈緒子              2850.00
    井上 尚志                2450.00
    西口 麻衣子              3000.00
    滝本 順三                5000.00
    工藤 新一                1500.00
    毛利光太郎               8000.00
    
      11 レコードが選択されました。
    
  5. 担当者表(employee)から、担当者名(emp_name)と年収(給与額(sal)*12)を照会してください。このとき、年収には列別名"年収"をつけます。

    select emp_name, sal * 12 AS 年収 FROM employee 
    
    結果表
    EMP_NAME             年収
    -------------------- ----------------------
    羽生 章洋                           9600.00
    釜本 喜美子                        19200.00
    安部 弘江                          15000.00
    松村 秀和                          35700.00
    萩原 恵理子                        15000.00
    岡田 奈緒子                        34200.00
    井上 尚志                          29400.00
    西口 麻衣子                        36000.00
    滝本 順三                          60000.00
    工藤 新一                          18000.00
    毛利光太郎                         96000.00
    
      11 レコードが選択されました。
    
  6. 担当者表(employee)から、担当者名(emp_name)と年収(給与額(sal)*12)を照会してください。このとき、年収には列別名"年収"をつけます。また、年収の小数点以下を切り捨てて表示してください。

    select emp_name, cast(sal * 12 AS int) AS 年収 FROM employee 
    
    結果表
    EMP_NAME             年収
    -------------------- -----------
    羽生 章洋                   9600
    釜本 喜美子                19200
    安部 弘江                  15000
    松村 秀和                  35700
    萩原 恵理子                15000
    岡田 奈緒子                34200
    井上 尚志                  29400
    西口 麻衣子                36000
    滝本 順三                  60000
    工藤 新一                  18000
    毛利光太郎                 96000
    
      11 レコードが選択されました。
    
Top
■文字列連結
■例題
  1. 担当者表(employee)から、担当者名(emp_name)と生年月日(birthday)を照会してください。このとき、つぎの形式で表示してください。また、生年月日(birthday)には列別名"誕生日"をつけます。
      "担当者 " 担当者名(emp_name) " の誕生日は " 生年月日(birthday) " です。"

    select '担当者 ' || emp_name || ' の誕生日は ' 
           || char(birthday) || ' です。' AS 誕生日 
        FROM employee 
    
    結果表
    誕生日
    ------------------------------------------------------------
    担当者 羽生 章洋 の誕生日は 1978-10-10 です。
    担当者 釜本 喜美子 の誕生日は 1975-05-20 です。
    担当者 安部 弘江 の誕生日は 1974-06-01 です。
    担当者 松村 秀和 の誕生日は 1970-09-13 です。
    担当者 萩原 恵理子 の誕生日は 1985-03-16 です。
    担当者 岡田 奈緒子 の誕生日は 1983-12-24 です。
    担当者 井上 尚志 の誕生日は 1971-10-17 です。
    担当者 西口 麻衣子 の誕生日は 1986-12-14 です。
    担当者 滝本 順三 の誕生日は 1978-04-02 です。
    担当者 工藤 新一 の誕生日は 1990-02-10 です。
    担当者 毛利光太郎 の誕生日は 1970-12-31 です。
    
      11 レコードが選択されました。
    
Top
■CASE式
■例題
  1. 担当者表(employee)から、担当者名(emp_name)と性別(sex)を照会してください。
    select emp_name, sex FROM employee 
    
    結果表
    EMP_NAME             SEX
    -------------------- -----------
    羽生 章洋                      1
    釜本 喜美子                    2
    安部 弘江                      2
    松村 秀和                      1
    萩原 恵理子                    2
    岡田 奈緒子                    2
    井上 尚志                      1
    西口 麻衣子                    2
    滝本 順三                      1
    工藤 新一                      1
    毛利光太郎                     1
    
      11 レコードが選択されました。
    
  2. 担当者表(employee)から、担当者名(emp_name)と性別(sex)を照会してください。このとき、性別(sex)が1のときは、'男'、性別(sex)が2のときは'女'というように表示してください。

    select emp_name, 
            case 
                when sex = 1  then '男' 
                              else '女' 
            end 
        FROM employee 
    
    結果表
    EMP_NAME             2
    -------------------- --
    羽生 章洋            男
    釜本 喜美子          女
    安部 弘江            女
    松村 秀和            男
    萩原 恵理子          女
    岡田 奈緒子          女
    井上 尚志            男
    西口 麻衣子          女
    滝本 順三            男
    工藤 新一            男
    毛利光太郎           男
    
      11 レコードが選択されました。
    
  3. 上記SQLで、性別(sex)列に対して、列別名"性別"をつけてください。

    select emp_name, 
            case 
                when sex = 1  then '男' 
                              else '女' 
            end AS 性別
        FROM employee 
    
    結果表
    EMP_NAME             性別
    -------------------- ----
    羽生 章洋            男
    釜本 喜美子          女
    安部 弘江            女
    松村 秀和            男
    萩原 恵理子          女
    岡田 奈緒子          女
    井上 尚志            男
    西口 麻衣子          女
    滝本 順三            男
    工藤 新一            男
    毛利光太郎           男
    
      11 レコードが選択されました。
    
Top
■WHERE文節
■関係演算子
■例題
  1. 担当者表(employee)から、給与額(sal)額が2000以上の担当者名(emp_name)と給与額(sal)額を照会してください。

    select emp_name, sal  FROM employee
        WHERE sal >= 2000
    
    結果表
    EMP_NAME             SAL
    -------------------- -----------
    松村 秀和                2975.00
    岡田 奈緒子              2850.00
    井上 尚志                2450.00
    西口 麻衣子              3000.00
    滝本 順三                5000.00
    毛利光太郎               8000.00
    
      6 レコードが選択されました。
    
  2. 担当者表(employee)から、性別(sex)が2の担当者名(emp_name)と給与額(sal)額を照会してください。

    • 照会する列でなくても、選択条件で使えます。
    select emp_name, sal  FROM employee
        WHERE sex = 2
    
    結果表
    EMP_NAME             SAL
    -------------------- -----------
    釜本 喜美子              1600.00
    安部 弘江                1250.00
    萩原 恵理子              1250.00
    岡田 奈緒子              2850.00
    西口 麻衣子              3000.00
    
      5 レコードが選択されました。
    
  3. 担当者表(employee)から、担当者名(emp_name)が '安部 弘江' の担当者名(emp_name)と給与額(sal)額を照会してください。

    • 文字列は、単一引用符(')で囲みます。
    select emp_name, sal  FROM employee
        WHERE emp_name = '安部 弘江'
    
    結果表
    EMP_NAME             SAL
    -------------------- -----------
    安部 弘江                1250.00
    
      1 レコードが選択されました。
    
  4. 担当者表(employee)から、生年月日(birthday)が '1980-01-01' 以降の担当者名(emp_name)と給与額(sal)額、生年月日(birthday)を照会してください。

    • 日付も単一引用符(')で囲みます。
    select emp_name, sal, birthday FROM employee
        WHERE birthday >= '1980-01-01'
    
    結果表
    EMP_NAME             SAL         BIRTHDAY
    -------------------- ----------- ----------
    萩原 恵理子              1250.00 1985-03-16
    岡田 奈緒子              2850.00 1983-12-24
    西口 麻衣子              3000.00 1986-12-14
    工藤 新一                1500.00 1990-02-10
    
      4 レコードが選択されました。
    
  5. 担当者表(employee)から、担当者ID(emp_id)が20の担当者名(emp_name)と給与額(sal)額、生年月日(birthday)を照会してください。

    • 選択条件に合う行がない場合は、結果表は0行になります。
    select emp_name, sal, birthday FROM employee
        WHERE emp_id = 20
    
    結果表
    EMP_NAME             SAL         BIRTHDAY
    -------------------- ----------- ----------
    
      0 レコードが選択されました。
    
Top
■論理演算子
■例題
  1. 担当者表(employee)から、給与額(sal)額が2000以上3000以下の担当者名(emp_name)と給与額(sal)額を照会してください。

    select emp_name, sal  FROM employee
        WHERE sal >= 2000 AND sal <= 3000
    
    結果表
    EMP_NAME             SAL
    -------------------- -----------
    松村 秀和                2975.00
    岡田 奈緒子              2850.00
    井上 尚志                2450.00
    西口 麻衣子              3000.00
    
      4 レコードが選択されました。
    
  2. 担当者表(employee)から、性別(sex)が2で給与額(sal)額が2000以上の担当者名(emp_name)と給与額(sal)額を照会してください。

    select emp_name, sal  FROM employee
        WHERE sal >= 2000 AND sex = 2
    
    結果表
    EMP_NAME             SAL
    -------------------- -----------
    岡田 奈緒子              2850.00
    西口 麻衣子              3000.00
    
      2 レコードが選択されました。
    
  3. 担当者表(employee)から、担当者ID(emp_id)が2, 4, 7の担当者名(emp_name)と給与額(sal)額を照会してください。

    select emp_name, sal FROM employee
        WHERE emp_id = 2 or emp_id = 4 or emp_id = 7
    
    結果表
    EMP_NAME             SAL
    -------------------- -----------
    釜本 喜美子              1600.00
    松村 秀和                2975.00
    井上 尚志                2450.00
    
      3 レコードが選択されました。
    
  4. 担当者表(employee)から、性別(sex)が2または給与額(sal)額が2000以上の担当者名(emp_name)と給与額(sal)額を照会してください。

    select emp_name, sal  FROM employee
        WHERE sal >= 2000 or sex = 2
    
    結果表
    EMP_NAME             SAL
    -------------------- -----------
    釜本 喜美子              1600.00
    安部 弘江                1250.00
    松村 秀和                2975.00
    萩原 恵理子              1250.00
    岡田 奈緒子              2850.00
    井上 尚志                2450.00
    西口 麻衣子              3000.00
    滝本 順三                5000.00
    毛利光太郎               8000.00
    
      9 レコードが選択されました。
    
  5. 担当者表(employee)から、性別(sex)が2または給与額(sal)額が2000以上3000以下の担当者名(emp_name)と給与額(sal)額を照会してください。

    • ANDとORを組み合わせることもできます。この場合は、ANDの方がORよりも優先されます。
    select emp_name, sal  FROM employee 
        WHERE sal >= 2000 AND sal <= 3000 or sex = 2
    
    結果表
    EMP_NAME             SAL
    -------------------- -----------
    釜本 喜美子              1600.00
    安部 弘江                1250.00
    松村 秀和                2975.00
    萩原 恵理子              1250.00
    岡田 奈緒子              2850.00
    井上 尚志                2450.00
    西口 麻衣子              3000.00
    
      7 レコードが選択されました。
    
  6. 担当者表(employee)から、性別(sex)が2でなく、かつ給与額(sal)額が2000未満または3000よりも高い担当者名(emp_name)と給与額(sal)額を照会してください。

    • 前問の条件を否定します。
    select emp_name, sal  FROM employee 
        WHERE not (sal >= 2000 AND sal <= 3000 or sex = 2)
    
    結果表
    EMP_NAME             SAL
    -------------------- -----------
    羽生 章洋                 800.00
    滝本 順三                5000.00
    工藤 新一                1500.00
    毛利光太郎               8000.00
    
      4 レコードが選択されました。
    
Top
■BETWEEN
■例題
  1. 担当者表(employee)から、給与額(sal)額が2000以上3000以下の担当者名(emp_name)と給与額(sal)額を照会してください。

    • "sal >= 2000 AND sal <= 3000" でも可能です。
    select emp_name, sal  FROM employee
        WHERE sal BETWEEN 2000 AND 3000
    
    結果表
    EMP_NAME             SAL
    -------------------- -----------
    松村 秀和                2975.00
    岡田 奈緒子              2850.00
    井上 尚志                2450.00
    西口 麻衣子              3000.00
    
      4 レコードが選択されました。
    
Top
■IN
■例題
  1. 担当者表(employee)から、担当者ID(emp_id)が2, 4, 7の担当者名(emp_name)と給与額(sal)額を照会してください。

    • "emp_id = 2 or emp_id = 4 or emp_id = 7" でも可能です。
    select emp_name, sal  FROM employee
        WHERE emp_id IN (2, 4, 7)
    
    結果表
    EMP_NAME             SAL
    -------------------- -----------
    釜本 喜美子              1600.00
    松村 秀和                2975.00
    井上 尚志                2450.00
    
      3 レコードが選択されました。
    
Top
■LIKE
■例題
  1. 顧客表(customer)から、住所(address)の一部が"大阪市"の顧客情報を照会してください。

    • 住所(address)の"一部"なので、前後に何文字かの文字列がある可能性があります。
    select * FROM customer
        WHERE address like '%大阪市%'
    
    結果表
    CUST_ID     CUST_NAME            ADDRESS                                  TEL                  FAX                 
    ----------- -------------------- ---------------------------------------- -------------------- --------------------
              3 北島 浩二            大阪府大阪市北区                         06-1234-XXXX         06-1234-XXXX        
             17 高沢 千夏            大阪府大阪市大淀区                       06-6777-XXXX         06-6777-XXXX        
    
      2 レコードが選択されました。
    
  2. 顧客表(customer)から、住所(address)が"東京都"以外の顧客情報を照会してください。

    • 住所(address)の先頭が"東京都"以外ということです。
    select * FROM customer
        WHERE address not like '東京都%'
    
    結果表
    CUST_ID     CUST_NAME            ADDRESS                                  TEL                  FAX                 
    ----------- -------------------- ---------------------------------------- -------------------- --------------------
              1 阪上 徹              和歌山県和歌山市                         073-123-XXXX         073-123-XXXX        
              3 北島 浩二            大阪府大阪市北区                         06-1234-XXXX         06-1234-XXXX        
              5 関根 修一            大阪府泉佐野市                           0724-99-XXXX         0724-99-XXXX        
             11 加藤 昭夫            神奈川県川崎市                           044-505-XXXX         044-505-XXXX        
             12 石橋 健太郎          札幌市中央区                             011-555-XXXX         -                   
             16 安井 和義            愛知県東海市                             0560-448-XXXX        0560-448-XXXX       
             17 高沢 千夏            大阪府大阪市大淀区                       06-6777-XXXX         06-6777-XXXX        
             19 吉田 正也            神奈川県川崎市                           044-888-XXXX         044-888-XXXX        
    
      8 レコードが選択されました。
    
    
  3. 顧客表(customer)から、顧客名(cust_name)の 2 文字目が"田"の顧客情報を照会してください。

    • 顧客名(cust_name)の先頭文字は任意の 1 文字です。ただし、日本語なので、日本語の下線 "_" を使います。
    select * FROM customer
        WHERE cust_name like '_田%'   -- "_" は、日本語の下線です
    
    結果表
    CUST_ID     CUST_NAME            ADDRESS                                  TEL                  FAX                 
    ----------- -------------------- ---------------------------------------- -------------------- --------------------
              6 木田 直美            東京都中央区                             03-3333-XXXX         -                   
             13 米田 恵美子          東京都港区虎ノ門                         03-3987-XXXX         03-3987-XXXX        
             14 松田 純一            東京都千代田区大手町                     03-3975-XXXX         03-3975-XXXX        
             18 島田 良子            東京都渋谷区                             03-3698-XXXX         -                   
             19 吉田 正也            神奈川県川崎市                           044-888-XXXX         044-888-XXXX        
             20 藤田 幹夫            東京都中央区                             03-3578-XXXX         -                   
    
      6 レコードが選択されました。
    
    □参考
    select * FROM customer
        WHERE cust_name like '_田%'   -- "_" は、半角の下線です
    
    結果表
    CUST_ID     CUST_NAME            ADDRESS                                  TEL                  FAX                 
    ----------- -------------------- ---------------------------------------- -------------------- --------------------
    
      0 レコードが選択されました。
    
Top
■NULLの扱い
Top
■NULL値の検索
■例題
  1. 顧客表(customer)から、ファックス番号(fax)を持っている人の顧客情報を照会してください。

    • ファックス番号(fax)を持っていれば、そこには値があります。すなわち、NULLではありません。
    select * FROM customer
        WHERE fax IS NOT NULL
    
    結果表
    CUST_ID     CUST_NAME            ADDRESS                                  TEL                  FAX                 
    ----------- -------------------- ---------------------------------------- -------------------- --------------------
              1 阪上 徹              和歌山県和歌山市                         073-123-XXXX         073-123-XXXX        
              2 松坂 宏              東京都千代田区                           03-3158-XXXX         03-3258-XXXX        
              3 北島 浩二            大阪府大阪市北区                         06-1234-XXXX         06-1234-XXXX        
              4 永井 光夫            東京都渋谷区                             03-3124-XXXX         03-0124-XXXX        
              5 関根 修一            大阪府泉佐野市                           0724-99-XXXX         0724-99-XXXX        
              7 片桐 昇              東京都新宿区                             03-1111-XXXX         03-1111-XXXX        
              8 田中 正敏            東京都品川区                             03-2222-XXXX         03-2222-XXXX        
              9 西口 和夫            東京都目黒区下目黒                       03-3333-XXXX         03-3333-XXXX        
             10 山口 克巳            東京都大田区                             03-4444-XXXX         03-4444-XXXX        
             11 加藤 昭夫            神奈川県川崎市                           044-505-XXXX         044-505-XXXX        
             13 米田 恵美子          東京都港区虎ノ門                         03-3987-XXXX         03-3987-XXXX        
             14 松田 純一            東京都千代田区大手町                     03-3975-XXXX         03-3975-XXXX        
             15 松下 晴彦            東京都板橋区                             03-3123-XXXX         03-3123-XXXX        
             16 安井 和義            愛知県東海市                             0560-448-XXXX        0560-448-XXXX       
             17 高沢 千夏            大阪府大阪市大淀区                       06-6777-XXXX         06-6777-XXXX        
             19 吉田 正也            神奈川県川崎市                           044-888-XXXX         044-888-XXXX        
    
      16 レコードが選択されました。
    
Top
■NULL値の変換
■例題
  1. 商品表(product)から、商品名(prod_name)と限界売価(標準単価(price) * 限界割引率(discount))を照会してください。

    • オペランドにNULLがあると、その演算結果はNULLになります。
    select prod_name, cost * discount FROM product
    
    結果表
    PROD_NAME            2
    -------------------- --------------------
    テレビ                         17500.0000
    ビデオ                          9600.0000
    MDプレーヤー                   18800.0000
    ステレオ                       39200.0000
    デジタルカメラ                 14880.0000
    プリンタ                       18800.0000
    電気シェーバー                          -
    ホイールマウス                          -
    アイロン                        8000.0000
    リモコン                                -
    
      10 レコードが選択されました。
    
  2. 商品表(product)から、商品名(prod_name)と限界売価(標準単価(price) * 限界割引率(discount))を照会してください。このとき、限界割引率(discount)が設定されていない場合は、1 として計算してください。

    select prod_name, cost * coalesce(discount, 1) FROM product
    
    結果表
    PROD_NAME            2
    -------------------- ------------------------
    テレビ                             17500.0000
    ビデオ                              9600.0000
    MDプレーヤー                       18800.0000
    ステレオ                           39200.0000
    デジタルカメラ                     14880.0000
    プリンタ                           18800.0000
    電気シェーバー                     13800.0000
    ホイールマウス                      8500.0000
    アイロン                            8000.0000
    リモコン                            5800.0000
    
      10 レコードが選択されました。
    
Top
■DISTINCT
■例題
  1. 担当者表(employee)から、部門ID(dept_id)の種類をすべて照会してください。このとき、重複行は省きます。

    select DISTINCT dept_id FROM employee 
    
    結果表
    DEPT_ID
    -----------
             10
             20
             30
             40
             90
    
      5 レコードが選択されました。
    
Top
■並べ替え
■例題
  1. 担当者表(employee)から、担当者情報を生年月日(birthday)順に照会してください。

    select * FROM employee ORDER BY birthday
    
    結果表
    EMP_ID      DEPT_ID     EMP_NAME             BIRTHDAY   HIREDATE   SEX         SAL        
    ----------- ----------- -------------------- ---------- ---------- ----------- -----------
              4          20 松村 秀和            1970-09-13 1991-04-02           1     2975.00
             11          90 毛利光太郎           1970-12-31 1990-04-01           1     8000.00
              7          30 井上 尚志            1971-10-17 2000-11-15           1     2450.00
              3          20 安部 弘江            1974-06-01 1991-02-22           2     1250.00
              2          10 釜本 喜美子          1975-05-20 1991-02-20           2     1600.00
              9          40 滝本 順三            1978-04-02 2004-12-18           1     5000.00
              1          10 羽生 章洋            1978-10-10 1990-12-17           1      800.00
              6          30 岡田 奈緒子          1983-12-24 2007-05-01           2     2850.00
              5          30 萩原 恵理子          1985-03-16 2008-09-28           2     1250.00
              8          40 西口 麻衣子          1986-12-14 2008-12-03           2     3000.00
             10          40 工藤 新一            1990-02-10 1999-04-01           1     1500.00
    
      11 レコードが選択されました。
    
  2. 担当者表(employee)から、担当者情報を給与額(sal)の高い順に照会してください。

    • 降順の場合は、"DESC" を指定します。
    select * FROM employee ORDER BY sal DESC
    
    結果表
    EMP_ID      DEPT_ID     EMP_NAME             BIRTHDAY   HIREDATE   SEX         SAL        
    ----------- ----------- -------------------- ---------- ---------- ----------- -----------
             11          90 毛利光太郎           1970-12-31 1990-04-01           1     8000.00
              9          40 滝本 順三            1978-04-02 2004-12-18           1     5000.00
              8          40 西口 麻衣子          1986-12-14 2008-12-03           2     3000.00
              4          20 松村 秀和            1970-09-13 1991-04-02           1     2975.00
              6          30 岡田 奈緒子          1983-12-24 2007-05-01           2     2850.00
              7          30 井上 尚志            1971-10-17 2000-11-15           1     2450.00
              2          10 釜本 喜美子          1975-05-20 1991-02-20           2     1600.00
             10          40 工藤 新一            1990-02-10 1999-04-01           1     1500.00
              3          20 安部 弘江            1974-06-01 1991-02-22           2     1250.00
              5          30 萩原 恵理子          1985-03-16 2008-09-28           2     1250.00
              1          10 羽生 章洋            1978-10-10 1990-12-17           1      800.00
    
      11 レコードが選択されました。
    
  3. 担当者表(employee)から、担当者情報を性別(sex)順に、給与額(sal)の高い順に照会してください。

    • 複数のキーを指定することも可能です。指定する順番に注意してください。
    select * FROM employee ORDER BY sex, sal DESC
    
    結果表
    EMP_ID      DEPT_ID     EMP_NAME             BIRTHDAY   HIREDATE   SEX         SAL        
    ----------- ----------- -------------------- ---------- ---------- ----------- -----------
             11          90 毛利光太郎           1970-12-31 1990-04-01           1     8000.00
              9          40 滝本 順三            1978-04-02 2004-12-18           1     5000.00
              4          20 松村 秀和            1970-09-13 1991-04-02           1     2975.00
              7          30 井上 尚志            1971-10-17 2000-11-15           1     2450.00
             10          40 工藤 新一            1990-02-10 1999-04-01           1     1500.00
              1          10 羽生 章洋            1978-10-10 1990-12-17           1      800.00
              8          40 西口 麻衣子          1986-12-14 2008-12-03           2     3000.00
              6          30 岡田 奈緒子          1983-12-24 2007-05-01           2     2850.00
              2          10 釜本 喜美子          1975-05-20 1991-02-20           2     1600.00
              3          20 安部 弘江            1974-06-01 1991-02-22           2     1250.00
              5          30 萩原 恵理子          1985-03-16 2008-09-28           2     1250.00
    
      11 レコードが選択されました。
    
  4. 商品表(product)から、商品名(prod_name)と限界売価(標準単価(price) * 限界割引率(discount))を限界売価(標準単価(price) * 限界割引率(discount))の降順に照会してください。

    • 整数を指定すると、SELECT文節で指定した式の順番を示します。
    • NULLには順序の概念がありません。ORDER BY 文節を指定したとき、NULL値の表示順に規定はありません。
    select prod_name, cost * discount FROM product ORDER BY 2 DESC
    
    結果表
    PROD_NAME            2
    -------------------- --------------------
    電気シェーバー                          -
    ホイールマウス                          -
    リモコン                                -
    ステレオ                       39200.0000
    MDプレーヤー                   18800.0000
    プリンタ                       18800.0000
    テレビ                         17500.0000
    デジタルカメラ                 14880.0000
    ビデオ                          9600.0000
    アイロン                        8000.0000
    
      10 レコードが選択されました。
    
  5. 商品表(product)から、商品名(prod_name)と限界売価(標準単価(price) * 限界割引率(discount))を限界売価(標準単価(price) * 限界割引率(discount))の降順に照会してください。このとき、限界割引率(discount)が設定されていない場合は、1 として計算してください。

    • ORDER BY には、列別名を指定することもできます。
    select prod_name, cost * coalesce(discount, 1) AS sprice FROM product 
        ORDER BY sprice DESC
    
    結果表
    PROD_NAME            SPRICE
    -------------------- ------------------------
    ステレオ                           39200.0000
    MDプレーヤー                       18800.0000
    プリンタ                           18800.0000
    テレビ                             17500.0000
    デジタルカメラ                     14880.0000
    電気シェーバー                     13800.0000
    ビデオ                              9600.0000
    ホイールマウス                      8500.0000
    アイロン                            8000.0000
    リモコン                            5800.0000
    
      10 レコードが選択されました。
    
Top
■実習
Top

■関数 / グループ

Top
■列関数
■例題
  1. 担当者表(employee)から、全担当者の給与(sal)の合計、平均、最小値、最大値を照会してください。
    select sum(sal), avg(sal), min(sal), max(sal)
        FROM employee
    
    結果表
    1                                 2                                 3           4          
    --------------------------------- --------------------------------- ----------- -----------
                             30675.00     2788.636363636363636363636363      800.00     8000.00
    
      1 レコードが選択されました。
    
  2. 担当者表(employee)から、部門ID(dept_id)が30の部門にいる担当者の人数、給与(sal)の合計、平均、最小値、最大値を照会してください。
    select count(*), sum(sal), avg(sal), min(sal), max(sal)
        FROM employee 
        WHERE dept_id = 30
    
    結果表
    1           2                                 3                                 4           5          
    ----------- --------------------------------- --------------------------------- ----------- -----------
              3                           6550.00     2183.333333333333333333333333     1250.00     2850.00
    
      1 レコードが選択されました。
    
  3. 担当者表(employee)から、部門ID(dept_id)の種類がいくつあるか数えてください。
    select count(DISTINCT dept_id) FROM employee
    
    結果表
    1
    -----------
              5
    
      1 レコードが選択されました。
    
Top
■GROUP BY
■例題
  1. 担当者表(employee)から、部門ID(dept_id)ごとの給与(sal)の合計、平均、最小値、最大値を照会してください。

    • 部門ID(dept_id)でグループ化します。このとき、SELECT文節で指定できる列名は、GROUP BY 句で指定した列名だけです。
    select dept_id, sum(sal), avg(sal), min(sal), max(sal)
        FROM employee
        GROUP BY dept_id
    
    結果表
    DEPT_ID     2                                 3                                 4           5          
    ----------- --------------------------------- --------------------------------- ----------- -----------
             10                           2400.00     1200.000000000000000000000000      800.00     1600.00
             20                           4225.00     2112.500000000000000000000000     1250.00     2975.00
             30                           6550.00     2183.333333333333333333333333     1250.00     2850.00
             40                           9500.00     3166.666666666666666666666666     1500.00     5000.00
             90                           8000.00     8000.000000000000000000000000     8000.00     8000.00
    
      5 レコードが選択されました。
    
  2. 担当者表(employee)から、性別(sex)ごとの人数を照会してください。

    select sex, count(*)
        FROM employee
        GROUP BY sex
    
    結果表
    SEX         2
    ----------- -----------
              1           6
              2           5
    
      2 レコードが選択されました。
    
  3. 担当者表(employee)から、部門ID(dept_id)ごとに、性別別の人数と給与(sal)の平均を照会してください。

    select dept_id, sex, count(*), avg(sal)
        FROM employee
        GROUP BY dept_id, sex
    
    結果表
    DEPT_ID     SEX         3           4                                
    ----------- ----------- ----------- ---------------------------------
             10           1           1      800.000000000000000000000000
             10           2           1     1600.000000000000000000000000
             20           1           1     2975.000000000000000000000000
             20           2           1     1250.000000000000000000000000
             30           1           1     2450.000000000000000000000000
             30           2           2     2050.000000000000000000000000
             40           1           2     3250.000000000000000000000000
             40           2           1     3000.000000000000000000000000
             90           1           1     8000.000000000000000000000000
    
      9 レコードが選択されました。
    
  4. 担当者表(employee)から、部門ID(dept_id)ごとに、部門の給与(sal)の合計が 5000 以下の給与(sal)の合計、平均、最小値、最大値を照会してください。

    select dept_id, sum(sal), avg(sal), min(sal), max(sal)
        FROM employee
        GROUP BY dept_id
        having sum(sal) <= 5000
    
    結果表
    DEPT_ID     2                                 3                                 4           5          
    ----------- --------------------------------- --------------------------------- ----------- -----------
             10                           2400.00     1200.000000000000000000000000      800.00     1600.00
             20                           4225.00     2112.500000000000000000000000     1250.00     2975.00
    
      2 レコードが選択されました。
    
  5. 担当者表(employee)から、部門ID(dept_id)ごとに、男性の担当者の給与(sal)の合計が5000以下の給与(sal)の合計、平均、最小値、最大値を照会してください。

    select dept_id, sum(sal), avg(sal), min(sal), max(sal)
        FROM employee
        WHERE sex = 1
        GROUP BY dept_id
        having sum(sal) <= 5000
    
    結果表
    DEPT_ID     2                                 3                                 4           5          
    ----------- --------------------------------- --------------------------------- ----------- -----------
             10                            800.00      800.000000000000000000000000      800.00      800.00
             20                           2975.00     2975.000000000000000000000000     2975.00     2975.00
             30                           2450.00     2450.000000000000000000000000     2450.00     2450.00
    
      3 レコードが選択されました。
    
Top
■実習
Top

■表の結合

Top
■表の結合(内部結合)
■例題
  1. 担当者表(employee)と部門表(department)から、担当者ID(emp_id)、担当者名(emp_name)、部門ID(dept_id)、部門名(dept_name)を照会してください。

    • 2つの表に同じ列名があるときは、表名または表の別名(相関名)を使って区別します。
       表名.列名
       相関名.列名
      
    • 相関名を指定した場合、そのSQL文の中ではかならず相関名で列名を修飾しなければなりません。
    select e.emp_id, emp_name, d.dept_id, dept_name 
        FROM employee e JOIN department d ON e.dept_id = d.dept_id
    
    結果表
    EMP_ID      EMP_NAME             DEPT_ID     DEPT_NAME
    ----------- -------------------- ----------- --------------------
              1 羽生 章洋                     10 営業部
              2 釜本 喜美子                   10 営業部
              3 安部 弘江                     20 開発部
              4 松村 秀和                     20 開発部
              5 萩原 恵理子                   30 企画部
              6 岡田 奈緒子                   30 企画部
              7 井上 尚志                     30 企画部
              8 西口 麻衣子                   40 管理部
              9 滝本 順三                     40 管理部
             10 工藤 新一                     40 管理部
    
      10 レコードが選択されました。
    
  2. 部門表(department)と担当者表(employee)から、部門の部門ID(dept_id)、部門名(dept_name)と、その部門を管理している担当者の担当者ID(mgr_id)、担当者名(emp_name)を照会してください。

    select d.dept_id, dept_name, e.emp_id, emp_name 
        FROM department d JOIN employee e ON d.mgr_id = e.emp_id
    
    結果表
    DEPT_ID     DEPT_NAME            EMP_ID      EMP_NAME
    ----------- -------------------- ----------- --------------------
             10 営業部                         1 羽生 章洋
             20 開発部                         3 安部 弘江
             30 企画部                         5 萩原 恵理子
             40 管理部                         8 西口 麻衣子
    
      4 レコードが選択されました。
    
  3. 部門表(department)から、部門の部門ID(dept_id)、部門名(dept_name)と、その部門を管理している部門の部門ID(adept_id)、部門名(dept_name)を照会してください。

    • このような結合を「自己結合」といいます。
    • 自己結合の場合、相関名(表別名)は必須です。
    select d.dept_id, d.dept_name, d.adept_id, d2.dept_name 
        FROM department d JOIN department d2 ON d.adept_id = d2.dept_id
    
    結果表
    DEPT_ID     DEPT_NAME            ADEPT_ID    DEPT_NAME
    ----------- -------------------- ----------- --------------------
             10 営業部                        30 企画部
             20 開発部                        30 企画部
             30 企画部                        40 管理部
             40 管理部                        40 管理部
             50 製造部                        50 製造部
    
      5 レコードが選択されました。
    
  4. 担当者表(employee)と部門表(department)から、担当者ID(emp_id)、担当者名(emp_name)、部門ID(dept_id)、部門名(dept_name)、上司のID(mgr_id)、上司の名前(emp_name)を照会してください。

    • 3つ以上の表の結合も、join を使って、つぎつぎに結合していきます。
    select e.emp_id, e.emp_name, d.dept_id, dept_name, mgr_id, e2.emp_name 
        FROM employee e JOIN department d ON e.dept_id = d.dept_id 
                        JOIN employee e2 ON mgr_id = e2.emp_id
    
    結果表
    EMP_ID      EMP_NAME             DEPT_ID     DEPT_NAME            MGR_ID      EMP_NAME            
    ----------- -------------------- ----------- -------------------- ----------- --------------------
              1 羽生 章洋                     10 営業部                         1 羽生 章洋           
              2 釜本 喜美子                   10 営業部                         1 羽生 章洋           
              3 安部 弘江                     20 開発部                         3 安部 弘江           
              4 松村 秀和                     20 開発部                         3 安部 弘江           
              5 萩原 恵理子                   30 企画部                         5 萩原 恵理子         
              7 井上 尚志                     30 企画部                         5 萩原 恵理子         
              6 岡田 奈緒子                   30 企画部                         5 萩原 恵理子         
              8 西口 麻衣子                   40 管理部                         8 西口 麻衣子         
             10 工藤 新一                     40 管理部                         8 西口 麻衣子         
              9 滝本 順三                     40 管理部                         8 西口 麻衣子         
    
      10 レコードが選択されました。
    
Top
■(参考)表の結合(内部結合の昔の書式)
■例題
  1. 担当者表(employee)と部門表(department)から、担当者ID(emp_id)、担当者名(emp_name)、部門ID(dept_id)、部門名(dept_name)を照会してください。

    select e.emp_id, emp_name, d.dept_id, dept_name 
        FROM employee e, department d 
        WHERE e.dept_id = d.dept_id
    
    結果表
    EMP_ID      EMP_NAME             DEPT_ID     DEPT_NAME
    ----------- -------------------- ----------- --------------------
              1 羽生 章洋                     10 営業部
              2 釜本 喜美子                   10 営業部
              3 安部 弘江                     20 開発部
              4 松村 秀和                     20 開発部
              5 萩原 恵理子                   30 企画部
              6 岡田 奈緒子                   30 企画部
              7 井上 尚志                     30 企画部
              8 西口 麻衣子                   40 管理部
              9 滝本 順三                     40 管理部
             10 工藤 新一                     40 管理部
    
      10 レコードが選択されました。
    
  2. 部門表(department)と担当者表(employee)から、部門の部門ID(dept_id)、部門名(dept_name)と、その部門を管理している担当者の担当者ID(emp_id)、担当者名(emp_name)を照会してください。

    select d.dept_id, dept_name, e.emp_id, emp_name 
        FROM department d, employee e 
        WHERE d.mgr_id = e.emp_id
    
    結果表
    DEPT_ID     DEPT_NAME            EMP_ID      EMP_NAME
    ----------- -------------------- ----------- --------------------
             10 営業部                         1 羽生 章洋
             20 開発部                         3 安部 弘江
             30 企画部                         5 萩原 恵理子
             40 管理部                         8 西口 麻衣子
    
      4 レコードが選択されました。
    
  3. 部門表(department)から、部門の部門ID(dept_id)、部門名(dept_name)と、その部門を管理している部門の部門ID(dept_id)、部門名(dept_name)を照会してください。

    select d.dept_id, d.dept_name, d.adept_id, d2.dept_name 
        FROM department d, department d2 
        WHERE d.adept_id = d2.dept_id
    
    結果表
    DEPT_ID     DEPT_NAME            ADEPT_ID    DEPT_NAME
    ----------- -------------------- ----------- --------------------
             10 営業部                        30 企画部
             20 開発部                        30 企画部
             30 企画部                        40 管理部
             40 管理部                        40 管理部
             50 製造部                        50 製造部
    
      5 レコードが選択されました。
    
Top
■表の結合(外部結合)
■例題
  1. 担当者表(employee)と部門表(department)から、担当者ID(emp_id)、担当者名(emp_name)、部門ID(dept_id)、部門名(dept_name)を照会してください。このとき、担当者はすべて照会します。

    • 担当者表(employee)の行をすべて表示することになるので、担当者表(employee)側、すなわち、"LEFT" をつけます。
    select e.emp_id, emp_name, d.dept_id, dept_name 
        FROM employee e left JOIN department d ON e.dept_id = d.dept_id
    
    結果表
    EMP_ID      EMP_NAME             DEPT_ID     DEPT_NAME
    ----------- -------------------- ----------- --------------------
              1 羽生 章洋                     10 営業部
              2 釜本 喜美子                   10 営業部
              3 安部 弘江                     20 開発部
              4 松村 秀和                     20 開発部
              5 萩原 恵理子                   30 企画部
              6 岡田 奈緒子                   30 企画部
              7 井上 尚志                     30 企画部
              8 西口 麻衣子                   40 管理部
              9 滝本 順三                     40 管理部
             10 工藤 新一                     40 管理部
             11 毛利光太郎                     - -
    
      11 レコードが選択されました。
    
  2. 担当者表(employee)と部門表(department)から、担当者ID(emp_id)、担当者名(emp_name)、部門ID(dept_id)、部門名(dept_name)を照会してください。このとき、担当者がいない部門についても照会します。

    • 部門表(department)の行をすべて表示することになるので、部門表(department)、すなわち、"RIGHT" をつけます。
    select e.emp_id, emp_name, d.dept_id, dept_name 
        FROM employee e right JOIN department d ON e.dept_id = d.dept_id
    
    結果表
    EMP_ID      EMP_NAME             DEPT_ID     DEPT_NAME
    ----------- -------------------- ----------- --------------------
              1 羽生 章洋                     10 営業部
              2 釜本 喜美子                   10 営業部
              3 安部 弘江                     20 開発部
              4 松村 秀和                     20 開発部
              5 萩原 恵理子                   30 企画部
              6 岡田 奈緒子                   30 企画部
              7 井上 尚志                     30 企画部
              8 西口 麻衣子                   40 管理部
              9 滝本 順三                     40 管理部
             10 工藤 新一                     40 管理部
              - -                             50 製造部
    
      11 レコードが選択されました。
    
  3. 担当者表(employee)と部門表(department)から、担当者ID(emp_id)、担当者名(emp_name)、部門ID(dept_id)、部門名(dept_name)を照会してください。このとき、所属する部門のない担当者も、担当者がいない部門も、ともにすべて照会します。

    • どちらの表もすべて表示することになるので、"FULL" をつけます。
    select e.emp_id, emp_name, d.dept_id, dept_name 
        FROM employee e full JOIN department d ON e.dept_id = d.dept_id
    
    結果表
    EMP_ID      EMP_NAME             DEPT_ID     DEPT_NAME
    ----------- -------------------- ----------- --------------------
              1 羽生 章洋                     10 営業部
              2 釜本 喜美子                   10 営業部
              3 安部 弘江                     20 開発部
              4 松村 秀和                     20 開発部
              5 萩原 恵理子                   30 企画部
              6 岡田 奈緒子                   30 企画部
              7 井上 尚志                     30 企画部
              8 西口 麻衣子                   40 管理部
              9 滝本 順三                     40 管理部
             10 工藤 新一                     40 管理部
              - -                             50 製造部
             11 毛利光太郎                     - -
    
      12 レコードが選択されました。
    
  4. 担当者表(employee)と部門表(department)から、担当者ID(emp_id)、担当者名(emp_name)、部門ID(dept_id)、部門名(dept_name)、上司のID(mgr_id)、上司の名前(emp_name)を照会してください。このとき、上司がいない担当者の担当者ID(emp_id)、担当者名(emp_name)もすべて照会します。

    • 直接関係があるところだけでなく、すべてに "LEFT" をつけます。
    select e.emp_id, e.emp_name, d.dept_id, dept_name, mgr_id, e2.emp_name 
        FROM employee e left JOIN department d ON e.dept_id = d.dept_id 
                         left JOIN employee e2 ON mgr_id = e2.emp_id
    
    結果表
    EMP_ID      EMP_NAME             DEPT_ID     DEPT_NAME            MGR_ID      EMP_NAME            
    ----------- -------------------- ----------- -------------------- ----------- --------------------
              1 羽生 章洋                     10 営業部                         1 羽生 章洋           
              2 釜本 喜美子                   10 営業部                         1 羽生 章洋           
              3 安部 弘江                     20 開発部                         3 安部 弘江           
              4 松村 秀和                     20 開発部                         3 安部 弘江           
              5 萩原 恵理子                   30 企画部                         5 萩原 恵理子         
              6 岡田 奈緒子                   30 企画部                         5 萩原 恵理子         
              7 井上 尚志                     30 企画部                         5 萩原 恵理子         
              8 西口 麻衣子                   40 管理部                         8 西口 麻衣子         
              9 滝本 順三                     40 管理部                         8 西口 麻衣子         
             10 工藤 新一                     40 管理部                         8 西口 麻衣子         
             11 毛利光太郎                     - -                              - -                   
    
      11 レコードが選択されました。
    
  5. 担当者表(employee)、顧客表(customer)、商品表(product)から、どの担当者(担当者ID(emp_id)、担当者名(emp_name))が、どの商品(商品ID(prod_id)、商品名(prod_name))を、誰に(顧客ID(cust_id)、顧客名(cust_name))販売したかを重複行を除いて照会してください。また、これを照会する場合、売上表(packedsales)と売上明細表(sales)も使用します。

    • 結果表に関係ない表であっても、結合できます。
    select DISTINCT e.emp_id, e.emp_name, p.prod_id, p.prod_name,c.cust_id, c.cust_name 
        FROM employee e JOIN packedsales ps ON e.emp_id = ps.emp_id 
                        JOIN customer c ON ps.cust_id = c.cust_id 
                        JOIN sales s ON ps.psales_no = s.psales_no 
                        JOIN product p ON s.prod_id = p.prod_id
    
    結果表
    EMP_ID      EMP_NAME             PROD_ID     PROD_NAME            CUST_ID     CUST_NAME           
    ----------- -------------------- ----------- -------------------- ----------- --------------------
              1 羽生 章洋                    101 テレビ                         1 阪上 徹             
              1 羽生 章洋                    103 MDプレーヤー                   1 阪上 徹             
              1 羽生 章洋                    102 ビデオ                         2 松坂 宏             
              2 釜本 喜美子                  103 MDプレーヤー                   3 北島 浩二           
              2 釜本 喜美子                  105 デジタルカメラ                 3 北島 浩二           
              2 釜本 喜美子                  106 プリンタ                       3 北島 浩二           
              2 釜本 喜美子                  104 ステレオ                       4 永井 光夫           
              3 安部 弘江                    105 デジタルカメラ                 5 関根 修一           
              3 安部 弘江                    106 プリンタ                       6 木田 直美           
              4 松村 秀和                    102 ビデオ                         7 片桐 昇             
              4 松村 秀和                    106 プリンタ                       7 片桐 昇             
              4 松村 秀和                    108 ホイールマウス                 8 田中 正敏           
              5 萩原 恵理子                  106 プリンタ                       9 西口 和夫           
              5 萩原 恵理子                  109 アイロン                       9 西口 和夫           
              5 萩原 恵理子                  110 リモコン                      10 山口 克巳           
    
      15 レコードが選択されました。
    
Top
■和結合 (UNION)
■例題
  1. セールス・データベースの表の行数をすべて表示します。

    select 'customer  ' table, count(*) count FROM customer
    union
    select 'employee  ' table, count(*) count FROM employee
    union
    select 'department' table, count(*) count FROM department
    union
    select 'product   ' table, count(*) count FROM product
    union
    select 'packedsales' table, count(*) count FROM packedsales
    union
    select 'sales      ' table, count(*) count FROM sales
    
    結果表
    TABLE       COUNT
    ----------- -----------
    department           5
    product             10
    employee            11
    customer            20
    packedsales          83
    sales               125
    
      6 レコードが選択されました。
    
Top
■差結合 (EXCEPT) と 積結合 (INTERSECT)
■例題
  1. 部門表(department)から、管理部門ID(adept_id)が40でない部門の情報をを照会してください。

    • つぎのSQL文と同じですが、パフォーマンスがよくなる可能性があります。
      select * FROM department
          WHERE adept_id <> 40
      
    select * FROM department 
    except 
    select * FROM department
        WHERE adept_id = 40
    
    結果表
    DEPT_ID     DEPT_NAME            LOC                  MGR_ID      ADEPT_ID
    ----------- -------------------- -------------------- ----------- -----------
             10 営業部               東京都千代田区                 1          30
             20 開発部               東京都港区                     3          30
             50 製造部               東京都大田区                   -          50
    
      3 レコードが選択されました。
    
Top
■実習
Top

■副照会

Top
■副照会(結果表が1行のケース)
■例題
  1. 担当者表(employee)から、全社の平均給与額(sal)よりも高い給与額(sal)を得ている担当者の担当者ID(emp_id)、担当者名(emp_name)、給与額(sal)を照会してください。

    • 全社の平均給与額(sal)は、つぎのSELECT文で取得できます。
      => select avg(sal) FROM employee ;
      
      1
      ---------------------------------
          2788.636363636363636363636363
      
        1 レコードが選択されました。
      
    select emp_id, emp_name, sal FROM employee 
        WHERE sal > (select avg(sal) FROM employee)
    
    結果表
    EMP_ID      EMP_NAME             SAL
    ----------- -------------------- -----------
              4 松村 秀和                2975.00
              6 岡田 奈緒子              2850.00
              8 西口 麻衣子              3000.00
              9 滝本 順三                5000.00
             11 毛利光太郎               8000.00
    
      5 レコードが選択されました。
    
  2. 担当者表(employee)から、最高給与額(sal)を得ている担当者の担当者ID(emp_id)、担当者名(emp_name)、給与額(sal)を照会してください。

    select emp_id, emp_name, sal FROM employee 
        WHERE sal = (select max(sal) FROM employee)
    
    結果表
    EMP_ID      EMP_NAME             SAL
    ----------- -------------------- -----------
             11 毛利光太郎               8000.00
    
      1 レコードが選択されました。
    
  3. 売上表(packedsales)と担当者表(employee)から、もっとも高い売上合計金額(total)をあげている売上No(psales_no)、担当者ID(emp_id)、担当者名(emp_name)を照会してください。

    select psales_no, e.emp_id, emp_name, total 
        FROM packedsales ps JOIN employee e ON ps.emp_id = e.emp_id 
        WHERE total = (select max(total) FROM packedsales)
    
    結果表
    PSALES_NO   EMP_ID      EMP_NAME             TOTAL
    ----------- ----------- -------------------- -----------
           1004           2 釜本 喜美子            180000.00
    
      1 レコードが選択されました。
    
Top
■副照会(結果表が複数行のケース)
■例題
  1. 担当者表(employee)から、各部門の平均給与額(sal)のいずれよりも高いか等しい給与額(sal)を得ている担当者の担当者ID(emp_id)、担当者名(emp_name)、給与額(sal)を照会してください。

    • 各部門の平均給与額(sal)は、つぎのSELECT文で取得できます。
      => select avg(sal) FROM employee GROUP BY dept_id ;
      
      1
      ---------------------------------
          1200.000000000000000000000000
          2112.500000000000000000000000
          2183.333333333333333333333333
          3166.666666666666666666666666
          8000.000000000000000000000000
      
        5 レコードが選択されました。
      
    select emp_id, emp_name, sal FROM employee 
        WHERE sal >= all (select avg(sal) FROM employee GROUP BY dept_id)
    
    結果表
    EMP_ID      EMP_NAME             SAL
    ----------- -------------------- -----------
             11 毛利光太郎               8000.00
    
      1 レコードが選択されました。
    
  2. 担当者表(employee)から、各部門の平均給与額(sal)のいずれかよりも高いか等しい給与額(sal)を得ている担当者の担当者ID(emp_id)、担当者名(emp_name)、給与額(sal)を照会してください。

    select emp_id, emp_name, sal FROM employee 
        WHERE sal >= any (select avg(sal) FROM employee GROUP BY dept_id)
    
    結果表
    EMP_ID      EMP_NAME             SAL
    ----------- -------------------- -----------
              2 釜本 喜美子              1600.00
              3 安部 弘江                1250.00
              4 松村 秀和                2975.00
              5 萩原 恵理子              1250.00
              6 岡田 奈緒子              2850.00
              7 井上 尚志                2450.00
              8 西口 麻衣子              3000.00
              9 滝本 順三                5000.00
             10 工藤 新一                1500.00
             11 毛利光太郎               8000.00
    
      10 レコードが選択されました。
    
  3. 売上表(packedsales)から、各顧客ごとの平均売上合計金額(total)のいずれよりも高い売上をあげている売上No(psales_no)、担当者ID(emp_id)、顧客ID(cust_id)、売上合計金額(total)を売上合計金額(total)の逆順に照会してください。

    select psales_no, emp_id, cust_id, total FROM packedsales 
        WHERE total > all (select avg(total) FROM packedsales GROUP BY cust_id) 
        ORDER BY total DESC
    
    結果表
    PSALES_NO   EMP_ID      CUST_ID     TOTAL
    ----------- ----------- ----------- -----------
           1004           2           4   180000.00
              4           2           4   120000.00
            224           2           4   120000.00
            541           1           1   120000.00
            433           2           3   115000.00
           1001           1           1    90000.00
            771           1           1    90000.00
    
      7 レコードが選択されました。
    
  4. 担当者表(employee)から、所属部門が部門表(department)にない担当者の担当者ID(emp_id)、担当者名(emp_name)、部門ID(dept_id)を照会してください。

    select emp_id, emp_name, dept_id FROM employee  
        WHERE dept_id not IN (select dept_id FROM department)
    
    結果表
    EMP_ID      EMP_NAME             DEPT_ID
    ----------- -------------------- -----------
             11 毛利光太郎                    90
    
      1 レコードが選択されました。
    
Top
■副照会(EXISTS)
■例題
  1. 担当者表(employee)から、所属部門が部門表(department)にない担当者の担当者ID(emp_id)、担当者名(emp_name)、部門ID(dept_id)を照会してください。

    select emp_id, emp_name, dept_id FROM employee e 
        WHERE not exists (select * FROM department WHERE dept_id = e.dept_id)
    
    結果表
    EMP_ID      EMP_NAME             DEPT_ID
    ----------- -------------------- -----------
             11 毛利光太郎                    90
    
      1 レコードが選択されました。
    
  2. 担当者表(employee)から、いままでにまったく売り上げがない担当者の担当者ID(emp_id)、担当者名(emp_name)、部門ID(dept_id)を照会してください。

    select emp_id, emp_name, dept_id FROM employee e 
        WHERE not exists (select * FROM packedsales WHERE emp_id = e.emp_id)
    
    結果表
    EMP_ID      EMP_NAME             DEPT_ID
    ----------- -------------------- -----------
              6 岡田 奈緒子                   30
              7 井上 尚志                     30
              8 西口 麻衣子                   40
              9 滝本 順三                     40
             10 工藤 新一                     40
             11 毛利光太郎                    90
    
      6 レコードが選択されました。
    
Top
■実習
Top

■実習

Top

■SELECT文の構文

Top

inserted by FC2 system