ms access SQL inner join outer join

 


ms accessについて、というか
一般的なSQLについておたずねします。

inner join, outer join というのは
SQLのうち SELECT文とともに用いられることが多いのでしょうか?

FROM テーブル,そしてそのあとに 続く句でしょうか?




はい、`INNER JOIN` や `OUTER JOIN` は一般的に `SELECT` 文とともに使われます。
これは、複数のテーブルを結合してデータを取得する際に利用されるからです。


### **JOINの基本構文**

`JOIN` は `FROM` 句の中で使用され、
`ON` 句で結合条件を指定します。

```sql

SELECT 列名1, 列名2, ...

FROM テーブルA
INNER JOIN テーブルB
ON テーブルA.共通列 = テーブルB.共通列;

```

また、`OUTER JOIN` には以下の種類があります。

1. **LEFT OUTER JOIN**(左外部結合)  

   → 左側のテーブルの全レコードを取得し、
    マッチする右側のテーブルのデータがあれば結合される。
   
2. **RIGHT OUTER JOIN**(右外部結合)
 
   → 右側のテーブルの全レコードを取得し、
    マッチする左側のテーブルのデータがあれば結合される。

3. **FULL OUTER JOIN**(完全外部結合)
 
   → 両方のテーブルの全レコードを取得し、
    マッチするデータがあれば結合される。

### **`JOIN` は `FROM` の一部**

`JOIN` は `FROM` 句の一部として使われ、
`FROM テーブルA JOIN テーブルB` のように続きます。

#### **例: INNER JOIN**

```sql

SELECT 顧客.名前, 注文.商品名
FROM 顧客
INNER JOIN 注文 ON 顧客.顧客ID = 注文.顧客ID;

```

#### **例: LEFT OUTER JOIN**

```sql

SELECT 顧客.名前, 注文.商品名
FROM 顧客
LEFT OUTER JOIN 注文 ON 顧客.顧客ID = 注文.顧客ID;

```

`INNER JOIN` は一致するデータのみ取得し、
    `LEFT OUTER JOIN` は左側のテーブルのデータを
    すべて取得する点が異なります。


### **MS Access の JOIN の注意点**

MS Access の SQL でも `JOIN` は使えますが、
以下のような制約があります:

- `FULL OUTER JOIN` はサポートされていません。
    (`UNION` を使って再現可能)

- `RIGHT OUTER JOIN` は `LEFT OUTER JOIN` を使って
    順序を逆にすることで対応可能。

**Access での JOIN 例**

```sql

SELECT A.列1, B.列2
FROM A INNER JOIN B ON A.キー = B.キー;

```

### **まとめ**

- `INNER JOIN` や `OUTER JOIN` は
    `SELECT` 文でよく使われる。

- `JOIN` は `FROM` 句の一部として指定される。

- `INNER JOIN` は一致するデータのみ取得。

- `OUTER JOIN` は一致しないデータも取得できる
    (MS Access では `FULL OUTER JOIN` は未対応)。

他に具体的な疑問があれば、教えてください!


---------------------------------------------

ms accessについて、というか
一般的なSQLについておたずねします。

left outer join を使った SELECT文の
シンプルな例は


#### **例: LEFT OUTER JOIN**

```sql

SELECT 顧客.名前, 注文.商品名
FROM 顧客
LEFT OUTER JOIN 注文 ON 顧客.顧客ID = 注文.顧客ID;

```

上記のようなものだそうですが、

左側のテーブルの全レコードを取得し、
マッチする右側のテーブルのデータがあれば結合される。

左側の列の値はすべて取得、
というのは等号「=」の左、ということでしょうか?

結合、というのは左側のテーブルの
Onで指定した列の値が同じ場合、
その左側の行に集約される、
というか左側のその行に吸収されるみたいなものでしょうか?

そして、右側の行のうち、マッチしないものはどうなるのでしょうか?

    ↓

### **LEFT OUTER JOIN の動作について詳しく解説**

#### **LEFT OUTER JOIN の動作**

`LEFT OUTER JOIN` は、左側のテーブルのすべてのレコードを取得し、
右側のテーブルのデータがあれば結合(マッチング)し、
なければ `NULL` を入れる動作をします。

---

### **結合の動作**
LEFT OUTER JOIN の SQL の例:

```sql

SELECT 顧客.顧客ID, 顧客.名前, 注文.商品名
FROM 顧客
LEFT OUTER JOIN 注文 ON 顧客.顧客ID = 注文.顧客ID;

```

これを、以下のような2つのテーブルで考えてみます。

#### **顧客 (左側のテーブル)**
| 顧客ID | 名前    |
|------|------|
| 1    | 田中   |
| 2    | 鈴木   |
| 3    | 佐藤   |

#### **注文 (右側のテーブル)**
| 注文ID | 顧客ID | 商品名  |
|------|------|------|
| 101  | 1    | ノートPC |
| 102  | 1    | スマホ  |
| 103  | 3    | タブレット |

---


### **LEFT OUTER JOIN の結果**

LEFT OUTER JOIN の結果テーブルは以下のようになります。


| 顧客ID | 名前    | 商品名    |
|------|------|------|
| 1    | 田中   | ノートPC |
| 1    | 田中   | スマホ  |
| 2    | 鈴木   | NULL  |
| 3    | 佐藤   | タブレット |

---

### **詳しい解説**

#### 1. **「左側のテーブルの全レコードを取得」について**

> **「左側の列の値はすべて取得」** というのは、

    `ON` 句の `=` の **左側のテーブルのすべての行を取得する**
    という意味です。


- 上記の結果では、
    `顧客` テーブル(左側)の **すべての行** が結果に含まれています。

- `注文` テーブル(右側)と `顧客ID` で結合されると、
    マッチする行があれば結合されます。

---

#### 2. **結合のイメージ**

> **「結合とは、

左側のテーブルの `ON` で指定した列の値が同じ場合、
その行に集約(吸収)されるものか?」**

- **はい、そのイメージでOKです。**

- `顧客ID=1` のデータは `注文` テーブルに `2行` あるので、
    それぞれ `田中` の行に吸収されて増えています。

- `顧客ID=2` の `鈴木` は

    `注文` テーブルに対応するデータがないので、
    そのまま `NULL` が入ります。

---

#### 3. **右側のテーブルの行で、マッチしないものはどうなる?**

> **「右側の行のうち、マッチしないものはどうなるのか?」**

- `注文` テーブルには
    `注文ID=103` の `タブレット` という注文が
    `顧客ID=3` にあるため、これは結合されます。
    
- **しかし、`注文ID=104` のように、どの `顧客` にも対応しない
    `注文` のデータがあった場合、それは結果に含まれません。**

---

### **LEFT OUTER JOIN のポイントまとめ**

✅ **左側のテーブルのすべての行を取得する。**  
✅ `ON` 句の条件が合致する場合、右側のテーブルのデータが結合される。  
✅ 合致するデータがなければ、右側の列は `NULL` になる。  
✅ **右側のテーブルの「マッチしない行」は結果に含まれない。**

---

#### **参考: RIGHT OUTER JOIN の場合**

**`RIGHT OUTER JOIN` は `LEFT OUTER JOIN` の逆で、
右側のテーブルのすべての行を取得します。**

```sql

SELECT 顧客.顧客ID, 顧客.名前, 注文.商品名
FROM 顧客
RIGHT OUTER JOIN 注文 ON 顧客.顧客ID = 注文.顧客ID;

```

→ `注文` テーブルの全データが表示され、
    マッチしない `顧客` の情報が `NULL` になります。

---


これで `LEFT OUTER JOIN` の仕組みは
クリアになったでしょうか?😊



コメント