SQLの書き方についてまとめています。
SQLの書き方は、selectの構文が基本
SQLの書き方の基本構文
SQLには代表的な四大ステートメント(select、update、insert、delete)があります。selectの基本的な構文は以下の通り。
SELECT [DISTINCT ] [JOIN条件] カラム1 [, カラム2 ...] [FROM テーブル名] [WHERE where条件] [GROUP BY グルーピング条件] [HAVING 集合関数の絞込条件] [ORDER BY ソート指定] [LIMIT オフセット・最大取得数指定]
【関連記事】
▶SQL文一覧 基本4大ステートメントのサンプルコード集
たくさん指定項目がありますが、全ての項目を指定しなくてはならないわけではありません。最低限、抽出するカラムと対象テーブルを指定すれば、データベースからデータの抽出が可能です。
mysql> select * from employees; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 10001 | 1953-09-02 | Georgi | Facello | M | 1986-06-26 | | 10002 | 1964-06-02 | Bezalel | Simmel | F | 1985-11-21 | | 10003 | 1959-12-03 | Parto | Bamford | M | 1986-08-28 | | 10004 | 1954-05-01 | Chirstian | Koblick | M | 1986-12-01 | | 10005 | 1955-01-21 | Kyoichi | Maliniak | M | 1989-09-12 | | 10006 | 1953-04-20 | Anneke | Preusig | F | 1989-06-02 | | 10007 | 1957-05-23 | Tzvetan | Zielinski | F | 1989-02-10 | | 10008 | 1958-02-19 | Saniya | Kalloufi | M | 1994-09-15 | | 10009 | 1952-04-19 | Sumant | Peac | F | 1985-02-18 | | 10010 | 1963-06-01 | Duangkaew | Piveteau | F | 1989-08-24 |
上記のSQLは、employees(社員)テーブルから、全てのカラム(*)をselectで抽出するSQLです。
selectの構文は、update、insert、deleteに応用できます。
なお、SQLにはデータ操作するステートメント(DML)以外に、データベース自体を定義するDDLや、データベースを制御するDCLといったステートメントがあります。
【関連記事】
▶SQLの基礎 DDL、DMLのサンプルコード紹介
WHEREは、取得データの絞り込みを条件指定
WHERE句では、取得データの条件を記述します。以下の例ではemp_no(社員番号)が10001のデータを条件指定しています。
SELECT * FROM employees WHERE emp_no = '10001'; +--------+------------+------------+-----------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------+--------+------------+ | 10001 | 1953-09-02 | Georgi | Facello | M | 1986-06-26 | +--------+------------+------------+-----------+--------+------------+
条件指定は、andやorで接続したり、関数や演算子を組み合わせたり、あいまい検索など複雑な条件指定が可能です。
【関連記事】
▶SQL where句のサンプルコード集 ワイルドカードやサブクエリを使った複雑な条件指定
JOIN条件は、複数テーブルのデータを結合して取得
リレーショナルデータベースの特徴として、複数のテーブルを紐付けて結合してデータを取得できます。
SELECT employees.first_name, employees.last_name, salaries.salary FROM employees left join salaries on employees.emp_no = salaries.emp_no WHERE salaries.to_date = "9999-01-01"; +------------+-----------+--------+ | first_name | last_name | salary | +------------+-----------+--------+ | Georgi | Facello | 88958 | | Bezalel | Simmel | 72527 | | Parto | Bamford | 43311 | | Chirstian | Koblick | 74057 | | Kyoichi | Maliniak | 94692 | | Anneke | Preusig | 59755 | | Tzvetan | Zielinski | 88070 | | Sumant | Peac | 94409 | | Duangkaew | Piveteau | 80324 | | Patricio | Bridgland | 54423 | : :
上記の例は、employees(社員テーブル)と、salaries(年収テーブル)を結合し、社員の名(first_name)、社員の姓(last_name)、salary(給与)を取得している例です。to_date=9999-01-01のデータは最新の年収データを指定しています。
【関連記事】
▶SQL Joinサンプル集 Joinで遅いSQLの原因を調べる方法
FROM指定は対象テーブルを指定。クエリ指定でサブクエリも可能
FROMではデータ取得対象のテーブルを指定します。FROMの部分にカッコつきで別のSQLクエリを記述すると、SQLの実行結果をテーブルの代わりに使うことができます。これをサブクエリと呼びます。
SELECT age, count FROM (SELECT age, COUNT(age) as count FROM staffs GROUP BY age) as ageLists;
【関連記事】
▶SQLの副問い合わせ(サブクエリ)とは?概要・種類・使い方を解説
GROUP BYは、小計などを計算するグルーピング指定
group by指定で、対象データの小計などを計算できます。
SELECT departments.dept_name, count(*) FROM dept_emp left join departments ON dept_emp.dept_no = departments.dept_no WHERE to_date = "9999-01-01" group by departments.dept_name; +--------------------+----------+ | dept_name | count(*) | +--------------------+----------+ | Development | 61386 | | Sales | 37701 | | Production | 53304 | | Human Resources | 12898 | | Research | 15441 | | Quality Management | 14546 | | Marketing | 14842 | | Customer Service | 17569 | | Finance | 12437 | +--------------------+----------+
上記の例では、departments(部署)に所属する社員数を、部署ごとに計算しています。
【関連記事】
▶SQLのgroup byサンプルコード集 count、like、join等の組み合わせ例
ORDER BYは、ソート指定
order by は、指定したカラムでソート(並び替え)を行います。昇順、または降順指定が可能。
SELECT * FROM `employees` order by birth_date desc; +--------+------------+------------+-----------------+--------+------------+ | emp_no | birth_date | first_name | last_name | gender | hire_date | +--------+------------+------------+-----------------+--------+------------+ | 500000 | 1970-01-04 | TARO | Yamada | M | 2001-04-07 | | 60091 | 1965-02-01 | Surveyors | Bade | F | 1988-05-01 | | 66702 | 1965-02-01 | Deniz | Thibadeau | F | 1986-03-11 | | 33293 | 1965-02-01 | Adamantios | Vanwelkenhuysen | M | 1987-12-12 | | 59869 | 1965-02-01 | Zsolt | Riefers | M | 1987-09-25 | | 74344 | 1965-02-01 | Hiroyasu | Provine | M | 1994-11-25 | | 80850 | 1965-02-01 | Koldo | Luit | M | 1993-11-19 | | 86422 | 1965-02-01 | Jaewon | Thummel | F | 1985-09-14 | | 37592 | 1965-02-01 | Berni | Stranks | M | 1985-11-05 | | 93278 | 1965-02-01 | Magdalena | Penn | F | 1987-04-27 | : :
上記のSQLは、employees(社員)テーブルをbirth_date(誕生日)で降順にソートして取得する例です。
【関連記事】
▶SQL order byでソート指定するサンプルコード集 指定のレコードだけ先頭に並べるには?
LIMITは取得件数の指定
LIMITは、取得件数を指定します。
mysql> select * from salaries -> order by emp_no desc -> limit 10; +--------+--------+------------+------------+ | emp_no | salary | from_date | to_date | +--------+--------+------------+------------+ | 499999 | 77303 | 2001-11-29 | 9999-01-01 | | 499999 | 74327 | 2000-11-29 | 2001-11-29 | | 499999 | 70745 | 1999-11-30 | 2000-11-29 | | 499999 | 67043 | 1998-11-30 | 1999-11-30 | | 499999 | 63707 | 1997-11-30 | 1998-11-30 | | 499998 | 55003 | 2001-12-25 | 9999-01-01 | | 499998 | 51182 | 2000-12-25 | 2001-12-25 | | 499998 | 49971 | 1999-12-26 | 2000-12-25 | | 499998 | 47429 | 1998-12-26 | 1999-12-26 | | 499998 | 46206 | 1997-12-26 | 1998-12-26 | +--------+--------+------------+------------+
上記の例は、salaries(年収)テーブルから、emp_no(社員番号)で降順にソートしたうえで10件のデータを取得する例です。
【関連記事】
▶SQL limitを使ったページング、ランダム抽出、速度改善をおこなう
まとめ
- データ操作を行うSQLは、select、update、insert、delete。
- selectの構文を覚えておくと、update、insert、deleteに応用できる。
- SQLの構文では、対象テーブル、取得条件、ソート、取得件数などを指定可能。