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を使用する