SQLのusingについてまとめています。
usingは、joinの結合条件をスッキリわかりやすく記述できる

例えば、以下のSQLは、employees(社員)テーブルと、dept_emp(部署・社員紐付けテーブル)、departments(部署)テーブルをjoinで結合してデータを取得するSQLです。テーブルの結合条件として、employeesとdept_empではemp_no(社員番号)を、dept_empとdepartmentsではdept_no(部署番号)を指定しています。
mysql> SELECT
-> employees.emp_no,
-> first_name,
-> last_name,
-> dept_name
-> FROM
-> employees
-> left join dept_emp using(emp_no)
-> left join departments using(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 |
+--------+------------+-----------+--------------------+
join条件に同じカラム名を指定するときだけ使える記述方法。見た目がスッキリします。
なお、onを使って指定すると、以下のようになります。結果は全く同じです。
mysql> SELECT
-> employees.emp_no,
-> first_name,
-> last_name,
-> 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 |
+--------+------------+-----------+--------------------+
Oracleでは、PL/SQLで、バインド変数指定にUSINGを使用する
OracleのPL/SQL内でUSINGを使用する場合は、バインド変数を指定するという意味になります。
参考)PL/SQLの動的SQL
CREATE PROCEDURE calc_stats ( w NUMBER, x NUMBER, y NUMBER, z NUMBER ) IS BEGIN DBMS_OUTPUT.PUT_LINE(w + x + y + z); END; / DECLARE a NUMBER := 4; b NUMBER := 7; plsql_block VARCHAR2(100); BEGIN plsql_block := 'BEGIN calc_stats(:x, :x, :y, :x); END;'; EXECUTE IMMEDIATE plsql_block USING a, b; -- calc_stats(a, a, b, a) END; /
上記のSQLでは、cals_statsというプロシージャに変数aと変数bをバインド変数に関連付けて実行しています。プレーすホルダ:xには変数aが、:yには変数bが指定され、結果としてプロシジャcalc_stats(a,a,b,a)が実行されることになります。
まとめ


- USINGはjoinの結合条件を指定するSQL
- 結合するテーブルのカラム名が同じ場合のみ使用可能
- Oracleは、PL/SQL内でバインド変数の指定時にUSINGを使用する