はじめに
初めての実務で、クエリをかくことになり、自分の中で意識したいなということを記述してみました。
1. エイリアスを活用する
テーブル名が長くなると、読みづらくなりますね。短くしましょう。
.sql
SELECT
t.name,
t.age,
o.order_date
FROM
customers t
JOIN
orders o ON t.customer_id = o.customer_id;
省略方法1
こちらは、簡潔に記入する省略方法です。
.sql
FROM customer t
省略方法2
こちらはASをつける省略方法です。
.sql
FROM customer AS ct
2. SQLクエリで、2つのカラムを結合するには
たとえば、郵便番号のように二つの値を結合するときはどういうクエリを記述するのか?
A. CONCAT関数を用いましょう
.sql
SELECT CONCAT(column_name,column_name) FROM table_name;
さらに列と列の間に半角スペースなどの任意の文字列を含める場
.sql
SELECT CONCAT(column_name,' ',column_name) FROM table_name;
郵便番号を結合してみた
.sql
SELECT CONCAT(住所1, '-', 住所2) AS 郵便番号
FROM テーブル名;
// result: 123-4132
3. NOT EXIST使い倒せ!!
employees(従業員テーブル)
employee_id | name | department_id |
---|---|---|
1 | 佐藤 | 23 |
2 | 高橋 | 21 |
3 | 鈴木 | 34 |
4 | 松橋 | 15 |
5 | 棚橋 | 12 |
departments(部署テーブル)
department_id | department_name |
---|---|
23 | 惣菜 |
21 | 肉 |
34 | 魚 |
15 | レジ |
これがあると仮定します。
そこで今回、従業員が所属していない部署を調べたいとするときに、どんなクエリを投げるのか?
.sql
SELECT department_name
FROM departments d
WHERE NOT EXISTS (
SELECT 1
FROM employees e
WHERE e.department_id = d.department_id
);
従業員が所属していない部署を探すのに、NOT EXISTS
を使いましょう。
軽く補足
WHERE句の外側のクエリ
SELECT department_name FROM departments d
- departmentsテーブルからdepartment_nameをカラムを取得しています
WHERE句の内側のサブクエリ
SELECT 1 FROM employees e WHERE e.department_id = d.department_id
- employeesテーブルのdepartment_idと、departmentsテーブルのdepartment_idと一致するものの1行を取得しています
NOT EXISTS
- 内側のサブクエリが結果を返さない場合にTRUEを返却します
おわりに
SQLは、どのテーブルのどの項目をもってきたいかが定まれば、ガツガツかけると思います。目的を明確にし、言語化してからかいてみるといいかもですね。