mysql の JOIN の詳細な使用法 - クエリの例付き
SQL では、JOIN は
複数のテーブルのデータを結合するために使用される操作です。結合条件を指定して 2 つ以上のテーブル内の修飾された行を結合し、新しい結果セットを生成します。
SQL の一般的な JOIN タイプには、INNER JOIN、LEFT JOIN、RIGHT JOIN、およびFULL OUTER JOINがあります。
これらの JOIN タイプの使用法については、以下で詳しく説明します。
1.INNER JOIN (内部接続): 結合条件を満たす 2 つのテーブルの行を返します。両方のテーブルから共通の条件を満たす行のみが返され、一致しない行は含まれません。構文は次のとおりです。
SELECT 列名 FROM 表1 INNER JOIN 表2 ON 连接条件;
2.LEFT JOIN (左側の接続): 結合条件を満たす左側のテーブルのすべての行と、右側のテーブルの行を返します。右側のテーブルに一致する行がない場合は、NULL 値が返されます。構文は次のとおりです。
SELECT 列名 FROM 表1 LEFT JOIN 表2 ON 连接条件;
3.RIGHT JOIN (右接続): 結合条件を満たす右側のテーブルのすべての行と、左側のテーブルの行を返します。左側のテーブルに一致する行がない場合は、NULL 値が返されます。構文は次のとおりです。
SELECT 列名 FROM 表1 RIGHT JOIN 表2 ON 连接条件;
4.FULL OUTER JOIN (完全外部接続): 接続条件が満たされているかどうかに関係なく、2 つのテーブル内のすべての行を返します。テーブル内に一致する行がない場合は、NULL 値が返されます。構文は次のとおりです。
SELECT 列名 FROM 表1 FULL OUTER JOIN 表2 ON 连接条件;
接続条件では、比較演算子(=、<>、<、> など)を使用して接続の条件を指定できます。結合条件は、1 つの列の等価条件にすることも、複数の列の組み合わせ条件にすることもできます。
JOIN 操作では結果セットの行数が増加する可能性があるため、特定のビジネス要件に応じて適切な JOIN タイプを選択する必要があることに注意してください。
プロジェクトで実際に使用されるサンプル コードを添付します。
<select id="getPointDetail" resultType="com.****************">
SELECT
hp.bk_id zdbh,
spb.lng,
spb.lat,
spb.bdrq,
spb.xzq,
spb.ydlx,
spb.ssdzdy as swdzdy,
a.value as wljcdwlxmc,
b.value as jcjlxmc,
c.value as jcjjbmc,
d.value as dxsllxmc,
e.value as hsclxmc,
f.value as ydlxmc,
sgnp.*
FROM hub_point hp
LEFT JOIN sat_groundwater_network_point sgnp ON hp.hid = sgnp.hid
left join sat_point_base spb on spb.hid = hp.hid
left join (select * from sys_dict_item where fk_sort_code = '1019') a on sgnp.wljcdwlx = a.code
left join (select * from sys_dict_item where fk_sort_code = '1017') b on sgnp.jcjlx = b.code
left join (select * from sys_dict_item where fk_sort_code = '1016') c on sgnp.jcjjb = c.code
left join (select * from sys_dict_item where fk_sort_code = '1013') d on sgnp.dxsllx = d.code
left join (select * from sys_dict_item where fk_sort_code = '1012') e on sgnp.hsclx = e.code
left join (select * from sys_dict_item where fk_sort_code = '1001') f on spb.ydlx = f.code
<where>
<if test="id != null and id != ''">
hp.hid = #{
id}
</if>
</where>
ORDER BY sgnp.load_dts DESC
LIMIT 1
</select>
このサンプルコードは、springboot プロジェクトのマッパーによってマッピングされた SQL クエリ文であり、
コードを 1 行ずつ説明します。
- 1 行目: タグはクエリ ステートメントを定義し、id 属性は「getPointDetail」です。
- 行 2 ~ 20: これは実際のクエリ ステートメントです。これらの行では、SELECT キーワードによって結果セットとして複数の列が選択され、FROM キーワードによってテーブルが指定されます。クエリ ステートメントは、
hub_point テーブル、sat_groundwater_network_point テーブル、sat_point_base テーブルから選択された列を含む結果セットを返します。 - 行 7 ~ 19: これらは、他のテーブルを Hub_point テーブルと結合する複数の LEFT JOIN 句です。ON句で結合条件を指定します。各
LEFT JOIN 句は、サブクエリとテーブルを接続します。サブクエリは、sys_dict_item テーブルから特定のフィールドを選択し、
WHERE 句と特定の条件でフィルタリングするクエリです。 - 行 22 ~ 24: ラベルは WHERE 句をラップして条件を追加するために使用されます。ここでは
タグで条件を判定しており、パラメータidが空でなく、空文字列でもない場合は、WHERE句に条件としてhp.hid = #{id}を追加します。 - 26行目:ORDER BY句を使用してsgnp.load_dts列の降順にソートします。
- 行 27: LIMIT 句を使用して、結果セットで返される行の数を 1 に制限します。
- 以上がこのコードの簡単な説明です。複数のテーブルをクエリし、複数の LEFT JOIN を使用してテーブルを結合します。同時に、WHERE
句、ORDER BY 句、および LIMIT 句を使用して、結果セットをさらにフィルタリングおよび並べ替えます。