【MySQL】カラムのデータを同一テーブルの別カラムにコピーするクエリ

概要

MySQL前提で話を進めます

あるテーブルのAカラムのデータを同じテーブルのBカラムにコピーしたいということがありました。

どうやらサブクエリを使えばいけるみたいなのでやってみます。

サブクエリ

その前にサブクエリが何かというと

サブクエリは「副問い合わせ」とも呼ばれ、SQL文の中にSELECT文を埋め込み、抽出条件として利用することを可能としています。

引用元:@IT SELECT文の総仕上げはサブクエリ

つまり、SELECT文などに入れ子として組み込んで、抽出したデータを元々のSELECT文等の条件式として使えるみたいな感じのやつですね。

実践

今回以下のキャプチャにあるテーブルを使用します。 このテーブルのidが6〜10のdirectorカラムにあるデータをdetailカラムにコピーします。 ※データベースはMySQLを使用しています。 f:id:jiro8899:20210102220017p:plain

クエリは以下になります

UPDATE
    products as p1,
    (
    SELECT 
        id, director 
    FROM 
        products 
    WHERE 
        id
    BETWEEN 6 AND 10
    ) as p2
SET
    p1.detail = p2.director
WHERE
    p1.id = p2.id;

これを実行すると以下のキャプチャのようにデータがコピーされています。 f:id:jiro8899:20210102222737p:plain

解説

コピーする(UPDATE)側がproductsのp1、コピーするデータを持ってくる側(副問合せ)をp2としてテーブルを設定します。

副問合せ側ではidが6〜10のidとdirectroカラムを取得しています。 idを取得している理由としてはWHERE文で使うためです。

コピーする条件としてデータを持ってくる側(p2)と同じidのp1のレコードに対してコピーします。(今回はidが6〜10のレコード)

この時WHERE文を設定しないと空のデータをコピーしてしまいます。

idがp1の6〜10のレコードのdetailカラムにデータを持ってくる側のp2のdirectorカラムのデータをコピーします。

自分としては同一テーブルだけど別テーブルのデータをコピーしているイメージですね。

図解すると以下のようになります。 f:id:jiro8899:20210102231358p:plain

カラムのデータを同じテーブルの別カラムにコピーすることなんて普通やらないですから検索してもなかなか出てこないのと、普段クエリを書く機会があまりないから結構苦戦してしまいましたね。。。

参考

www.atmarkit.co.jp

dev.classmethod.jp