FROM句で複数のテーブルを結合するポイントzukucode主にWEB関連の情報を技術メモとして発信しています。FROM句で複数のテーブルを結合するポイントFROM句では取得したいテーブルのテーブル名を指定します。以下のようなテーブルがあるとします。departmentは社員が所属する部署の情報を格納しています。employeeとdepartmentの関係は1対1とします。人事部このとき、社員の一覧と所属部署のデータを取得したい場合、FROM句で以下のように指定します。複数のテーブルを結合する場合はまず結合したいテーブルをJOINのあとに指定します。ONのあとに結合条件を指定します。結合条件とは結合条件を指定せずにテーブルを2つ指定すると、指定した2つのテーブルの直積の結果が出力されてしまいます。上記の例だとemployeeにはデータが3件、departmentにはデータが2件あるので3×2で6通りの組み合わせが考えられます。以下のように6件が出力されます。人事部このうち、取得したいデータはdepartment_id(employee)とid(department)が同じデータになります。逆にdepartment_id(employee)とid(department)が異なるデータはテーブル間の関連性のない意味のないデータになるので取得する必要がありません。department.idと指定します。結合のポイント上記の例では結合するテーブル同士が1対1で、なおかつ結合先のデータが必ず存在していることが前提となっています。そのため、混乱することはないかと思いますが、SQLが複雑になってくると、結合の理解があいまいだと予期せぬ結果になってしまうことがあります。最初にメインとなるテーブルを決め、結合するテーブルが何対何になるのかと、結合先のデータが必ず存在しているかどうか(idで結合する場合はそのidが結合先のテーブルに必ず存在しているかどうか)を必ず意識して結合していくと混乱せずにスムーズに実装できるかと思います。上記の例では社員単位(1社員1行)での出力になるはずですが、結合条件を正しく指定していないと、同一社員が2行出力されています。そのような結果は仕様通りではないので結合条件を見なおす必要があります。WITH句で同じSQLを1つのSQLに共通化する同じようなSQLはWITH句を使用して共通化すればパフォーマンスが改善されることが多いです。WITH句を使用すれば1つの副問い合わせをいろいろな場所で使いまわすことができます。重複しているレコードを一括でUPDATEするある列の値が同じレコードが複数ある場合に、そのレコードを全てUPDATEする方法を紹介します。テーブルと列(カラム)にコメントを設定する方法SQLでテーブルと列(カラム)にコメントを設定する方法を紹介します。SELECT句での副問合せの基本的な考え方と注意点SELECT句での副問合せをうまく利用すれば、集計単位の異なる値を同時に取得できます。取得した結果に対してもう一度SQLを実行するようなイメージで値を取得できます。SELECT句でテーブルから指定した列のデータを取得するSELECT句はFROM句で指定されたテーブルから、どの列を取得するかを指定するための構文です。別テーブルをSELECTした結果が存在すればその値を使用してUPDATEする方法SELECTした結果がすでに存在していればその値でUPDATEしたい場合があります。上記SQLだと、テーブルBの存在の有無にかかわらず、テーブルAの全てのデータが更新されてしまいます。UPDATE文で副問い合わせで取得した値を複数列に設定する方法UPDATE文で、副問い合わせで取得した値を複数列に設定する方法を紹介します。SETで指定する列を()で囲い、副問い合わせのSQLで()で囲った列に対応するようにSELECTで取得します。INTOのあとのVALUESの代わりに、SELECT文をそのまま使用します。SELECTで取得する列の順番と、INSERTするテーブルの列の順番が一致するようにします。rowspanを使用してテーブル表示するときに必要な情報を分析関数で取得するSQLではなくプログラム側で表示するときに複雑な処理を実装してしまいがちですが、SQLでrowspanに必要な情報を一緒に取得しておけばプログラム側での実装はかなりシンプルになります。ある列の値が最大もしくは最小の値のレコードを取得する例えば以下のテーブルがあるとき、身長が一番大きい社員のレコードを取得したい場合があります。業務でもよくありがちな仕様ですが、一見簡単そうで難しい問題です。システム日付をYYYYMMDD形式などの文字列型に変換する当ホームページに記載されている会社名・製品名・システム名などは、各社の登録商標、もしくは商標です。