SQLのas句についてまとめています。
以下、サンプルデータベースとしてEmployeesを、MySQLのバージョンは8.0.18を前提としています。
SQLのas句は別名をつける
asはカラム名やテーブル名を別名で置き換えるために使用します。
以下のSQLは、employees(社員)テーブルのfirst_name(姓名の名)をname1に、last_name(姓名の姓)をname2に置き換えてデータを10件抽出するサンプルSQLです。
mysql> desc employees; +------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------+------+-----+---------+-------+ | emp_no | int | NO | PRI | NULL | | | birth_date | date | NO | | NULL | | | first_name | varchar(14) | NO | | NULL | | | last_name | varchar(16) | NO | | NULL | | | gender | enum('M','F') | NO | | NULL | | | hire_date | date | NO | | NULL | | +------------+---------------+------+-----+---------+-------+ 6 rows in set (0.09 sec) mysql> select first_name as name1,last_name as name2 from employees limit 10; +-----------+-----------+ | name1 | name2 | +-----------+-----------+ | Georgi | Facello | | Bezalel | Simmel | | Parto | Bamford | | Chirstian | Koblick | | Kyoichi | Maliniak | | Anneke | Preusig | | Tzvetan | Zielinski | | Saniya | Kalloufi | | Sumant | Peac | | Duangkaew | Piveteau | +-----------+-----------+ 10 rows in set (0.07 sec)
複数カラムを一つのカラムとして扱う
複数カラムの計算結果や文字列として連結した結果に名前をつけることも可能です。以下は、文字列をconcatで連結した結果に別名をつけるサンプルです。
mysql> select concat( first_name, ' ', last_name ) as fullname from employees limit 10; +--------------------+ | fullname | +--------------------+ | Georgi Facello | | Bezalel Simmel | | Parto Bamford | | Chirstian Koblick | | Kyoichi Maliniak | | Anneke Preusig | | Tzvetan Zielinski | | Saniya Kalloufi | | Sumant Peac | | Duangkaew Piveteau | +--------------------+
テーブル名を別名で扱う
asはテーブル名に別名をつける用途でも使われます。以下は、employees(社員)テーブル、dept_emp(社員・部署紐付け)テーブル、departments(部署)テーブルをjoinするSQLと、実行結果です。asを使って置き換えてみましょう。
mysql> select employees.emp_no, first_name, last_name, departments.dept_name from employees left join dept_emp on employees.emp_no = dept_emp.emp_no left join departments on dept_emp.dept_no = departments.dept_no limit 10; +--------+------------+-----------+--------------------+ | emp_no | first_name | last_name | dept_name | +--------+------------+-----------+--------------------+ | 10001 | Georgi | Facello | Development | | 10002 | Bezalel | Simmel | Sales | | 10003 | Parto | Bamford | Production | | 10004 | Chirstian | Koblick | Production | | 10005 | Kyoichi | Maliniak | Human Resources | | 10006 | Anneke | Preusig | Development | | 10007 | Tzvetan | Zielinski | Research | | 10008 | Saniya | Kalloufi | Development | | 10009 | Sumant | Peac | Quality Management | | 10010 | Duangkaew | Piveteau | Production | +--------+------------+-----------+--------------------+
以下のようにスッキリと置き換えられます。
mysql> select t1.emp_no, first_name, last_name, t3.dept_name from employees as t1 left join dept_emp as t2 on t1.emp_no = t2.emp_no left join departments as t3 on t2.dept_no = t3.dept_no limit 10;
テーブル名の別名定義を使って、自己結合(セルフジョイン)を行う
asは、SQLの見た目をスッキリさせるだけではありません。一つのテーブルに異なる別名をつけて別テーブルとして扱うことで、セルフジョインをおこなうことができます。
以下は、給与テーブルから最新の年収を抽出するSQLです。
select * FROM salaries as a WHERE (emp_no, to_date) not in ( select emp_no, max(to_date) as to_date from salaries as b where a.emp_no = b.emp_no group by emp_no having count(*) > 1 )
【関連記事】
▶SQLで重複を削除するサンプルコード 最新データを残してdeleteするには?
まとめ
- asは、カラム名とテーブル名に別名をつける
- 計算式や関数の演算結果に別名をつけることも可能
- 同一テーブルに複数の別名をつけてセルフジョインが実現できる