1. aki3061

    No comment

    aki3061
Changes in body
Source | HTML | Preview
@@ -7,11 +7,11 @@
## 動作確認環境とテーブル
PostgreSQL 9.4でクエリの動作を確認した。
また、使用したテーブルの定義は下記。
-```
+```sql
CREATE TABLE Employees (
id INTEGER PRIMARY KEY,
name VARCHAR(10) NOT NULL,
age INTEGER NOT NULL,
department VARCHAR(10) NOT NULL
@@ -26,12 +26,14 @@
```
SELECTするとこんな感じ。
-```
+```sql
# SELECT * FROM Employees ;
+```
+```
id | name | age | department
----+-----------+-----+------------
1 | Sato | 23 | 営業
2 | Suzuki | 35 | 営業
3 | Saito | 38 | 営業
@@ -44,17 +46,18 @@
## 実行例
下記のSQLは、所属部署の平均年齢よりも若い社員を表示する。(ついでに年齢と所属部署も表示する)
ここで「所属部署の」というのがポイントであり、たとえば「営業」の社員であれば営業に所属する社員の平均年齢が基準となる。(つまり、開発社員の年齢は考慮しない)
-```
+```sql
SELECT name, age, department
FROM Employees as e1
WHERE e1.age < (SELECT AVG(age) as avg_age
FROM Employees as e2
WHERE e1.department = e2.department);
+```
+```
name | age | department
-----------+-----+------------
Sato | 23 | 営業
Takahashi | 35 | 開発
(2 rows)
@@ -64,16 +67,17 @@
WHERE句で指定されたサブクエリは、外側のクエリの結果の1行ごとに実行され、その外側のクエリの結果のdepartmentの値をサブクエリ内で利用している。
「所属部署の」という制限を外す場合、つまり「社員全体の平均年齢よりも若い社員」を知りたい場合は、相関サブクエリではないサブクエリを用いる。
-```
+```sql
SELECT name, age, department
FROM Employees
WHERE age < (SELECT AVG(age)
FROM Employees);
+```
+```
name | age | department
-----------+-----+------------
Sato | 23 | 営業
Suzuki | 35 | 営業
Takahashi | 35 | 開発
@@ -83,22 +87,23 @@
## 所属部署の平均年齢もあわせて表示したい場合
SELECTの列の指定で、WHERE句と同じ式を書けば実現できる。
(DRY原則に反しているので、もっとスマートなやり方があれば教えてください。)
-```
+```sql
SELECT name,
age,
department,
(SELECT AVG(age) as avg_age
FROM Employees as e2
WHERE e1.department = e2.department)
FROM Employees as e1
WHERE e1.age < (SELECT AVG(age) as avg_age
FROM Employees as e2
WHERE e1.department = e2.department);
+```
+```
name | age | department | avg_age
-----------+-----+------------+---------------------
Sato | 23 | 営業 | 32.0000000000000000
Takahashi | 35 | 開発 | 39.3333333333333333
(2 rows)