Webサイト制作コースのお申し込みはこちら Webサイト制作コースのお申し込みはこちら

SQLのfromについてまとめています。

fromは、データアクセス対象のテーブルを指定するSQL

fromは、SQL内でアクセス対象のテーブルを指定します。

以下は、employeesテーブルから、データを全件selectで取得するSQLです。

  1. select * from employees;

【関連記事】
SQL select文のサンプル集 結合、ソート、別テーブル生成の記述方法は?

fromで複数のテーブルを指定するには、join指定が必須

fromで複数テーブルを指定することも可能です。ただし、指定なしで複数テーブルを指定すると、全データの全組み合わせパターンが取得されます。

  1. mysql> select * from employees, departments, titles;
  2. +--------+------------+------------+-----------+--------+------------+---------+--------------------+--------+-----------------+------------+------------+
  3. | emp_no | birth_date | first_name | last_name | gender | hire_date | dept_no | dept_name | emp_no | title | from_date | to_date |
  4. +--------+------------+------------+-----------+--------+------------+---------+--------------------+--------+-----------------+------------+------------+
  5. | 10194 | 1954-01-29 | Josyula | Hofmeyr | F | 1989-05-15 | d004 | Production | 10001 | Senior Engineer | 1986-06-26 | 9999-01-01 |
  6. | 10194 | 1954-01-29 | Josyula | Hofmeyr | F | 1989-05-15 | d006 | Quality Management | 10001 | Senior Engineer | 1986-06-26 | 9999-01-01 |
  7. | 10194 | 1954-01-29 | Josyula | Hofmeyr | F | 1989-05-15 | d008 | Research | 10001 | Senior Engineer | 1986-06-26 | 9999-01-01 |
  8. | 10194 | 1954-01-29 | Josyula | Hofmeyr | F | 1989-05-15 | d007 | Sales | 10001 | Senior Engineer | 1986-06-26 | 9999-01-01 |
  9. | 10193 | 1960-06-29 | Masaru | Cheshire | M | 1991-07-28 | d009 | Customer Service | 10001 | Senior Engineer | 1986-06-26 | 9999-01-01 |
  10. | 10193 | 1960-06-29 | Masaru | Cheshire | M | 1991-07-28 | d005 | Development | 10001 | Senior Engineer | 1986-06-26 | 9999-01-01 |
  11. | 10193 | 1960-06-29 | Masaru | Cheshire | M | 1991-07-28 | d002 | Finance | 10001 | Senior Engineer | 1986-06-26 | 9999-01-01 |
  12. | 10193 | 1960-06-29 | Masaru | Cheshire | M | 1991-07-28 | d003 | Human Resources | 10001 | Senior Engineer | 1986-06
  13. :
  14. :

複数テーブルから、欲しい情報を取得するには、一般的に結合(join)という指定が必須です。

以下は、employees(社員)テーブルと、dept_emp(部署・社員紐付けテーブル)、departments(部署)テーブルを結合してデータを取得するSQLです。

  1. mysql> SELECT employees.emp_no, first_name, last_name, dept_name
  2. FROM employees
  3. left join dept_emp on employees.emp_no = dept_emp.emp_no
  4. left join departments on dept_emp.dept_no = departments.dept_no
  5. limit 10;
  6.  
  7. +--------+------------+-----------+--------------------+
  8. | emp_no | first_name | last_name | dept_name |
  9. +--------+------------+-----------+--------------------+
  10. | 10001 | Georgi | Facello | Development |
  11. | 10002 | Bezalel | Simmel | Sales |
  12. | 10003 | Parto | Bamford | Production |
  13. | 10004 | Chirstian | Koblick | Production |
  14. | 10005 | Kyoichi | Maliniak | Human Resources |
  15. | 10006 | Anneke | Preusig | Development |
  16. | 10007 | Tzvetan | Zielinski | Research |
  17. | 10008 | Saniya | Kalloufi | Development |
  18. | 10009 | Sumant | Peac | Quality Management |
  19. | 10010 | Duangkaew | Piveteau | Production |
  20. +--------+------------+-----------+--------------------+
  21. 10 rows in set (0.00 sec)

【関連記事】
MySQLのleft joinサンプルコード onとusingの結合条件指定の違いは?

from dual は、oracle用の対象テーブルのないSQL記述用

Oracleでは、from指定を省略することができません。そのため、システム側でdualというダミーテーブルを用意していて、以下のように使います。

  1. select sysdate from dual;
  2.  
  3. SYSDATE
  4. -----
  5. 26-APR-20

なお、MySQLではfrom dual指定は不要ですが、OracleのSQLとの互換性を保つために、from dual指定が可能となっています。

  1. mysql> select now();
  2. +---------------------+
  3. | now() |
  4. +---------------------+
  5. | 2020-04-25 03:09:51 |
  6. +---------------------+
  7. 1 row in set (0.05 sec)
  8.  
  9. mysql> select now() from dual;
  10. +---------------------+
  11. | now() |
  12. +---------------------+
  13. | 2020-04-25 03:09:56 |
  14. +---------------------+
  15. 1 row in set (0.00 sec)
  16.  

fromでテーブルの別名を指定する

fromの対象テーブル指定には、asを使って別名を定義することが可能です。

以下のSQLをasを使って書き換えてみましょう。

  1. mysql> select employees.emp_no, first_name, last_name, departments.dept_name from employees
  2. left join dept_emp on employees.emp_no = dept_emp.emp_no
  3. left join departments on dept_emp.dept_no = departments.dept_no
  4. limit 10;
  5.  
  6. +--------+------------+-----------+--------------------+
  7. | emp_no | first_name | last_name | dept_name |
  8. +--------+------------+-----------+--------------------+
  9. | 10001 | Georgi | Facello | Development |
  10. | 10002 | Bezalel | Simmel | Sales |
  11. | 10003 | Parto | Bamford | Production |
  12. | 10004 | Chirstian | Koblick | Production |
  13. | 10005 | Kyoichi | Maliniak | Human Resources |
  14. | 10006 | Anneke | Preusig | Development |
  15. | 10007 | Tzvetan | Zielinski | Research |
  16. | 10008 | Saniya | Kalloufi | Development |
  17. | 10009 | Sumant | Peac | Quality Management |
  18. | 10010 | Duangkaew | Piveteau | Production |
  19. +--------+------------+-----------+--------------------+

以下のようにシンプルに書き換えられました。より見やすくなったのではないでしょうか。

  1. mysql> select t1.emp_no, first_name, last_name, t3.dept_name from employees as t1
  2. left join dept_emp as t2 on t1.emp_no = t2.emp_no
  3. left join departments as t3 on t2.dept_no = t3.dept_no limit 10;

asによる別名定義を使って、同一テーブルを別のテーブルかのように扱うセルフジョインが可能になります。

【関連記事】
SQLのas句で、同一テーブルに別名をつけセルフジョインするサンプルコード 

まとめ

ポテパンダの一言メモ
  • fromはSQLの対象テーブルを指定する
  • oracleではfrom省略ができないため、from dualを指定する
  • fromでのテーブル指定には別名が使える。これを応用してセルフジョインが可能

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。