0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

実務で毎日使っているSQLクエリ10選

0
Posted at

同じSELECT文を書いては、テーブルに新しい列が追加されるたびに列リストを手動で更新していました。SELECT * を使えば、追加された列が自動的に結果セットに含まれます。sql SELECT * FROM employees WHERE department = 'Sales'; これにより、列の変更に合わせて SQL を修正する手間が省け、データ構造の変化に柔軟に対応できるようになりました。

1. * を使って列リストを自動更新

同じSELECT文を書いては、テーブルに新しい列が追加されるたびに列リストを手動で更新していました。SELECT * を使えば、追加された列が自動的に結果セットに含まれます。sql SELECT * FROM employees WHERE department = 'Sales'; これにより、列の変更に合わせて SQL を修正する手間が省け、データ構造の変化に柔軟に対応できるようになりました。

✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨

最新ツール・トレンド情報をずんだもん×めたんが解説するYouTubeチャンネルを運営しています!
いいね、チャンネル登録してもらえると嬉しいです🙇‍♂️


ハジメル.dev: https://hajimeru-dev.vercel.app/

「ひとりで続けるのは難しい」「何から学べばいいか分からない」という方向けに、
プログラミングのマンツーマンレッスンサービス「ハジメル.dev」も運営しています。
未経験OK・オンライン完結・月額制/違約金なしなので、気軽に無料相談してみてください🙇‍♂️


海外テックニュースを追いたいけど、英語や情報量の多さで大変…という方向けに、
Hacker News の話題を日本語でサクッと追える「HackerNews 日本語まとめ & AI要約」
を個人開発しました!
技術トレンド収集に使ってもらえると嬉しいです🔥🙇‍♂️
→ HackerNews 日本語まとめ & AI要約: https://hn-matome-2ht.pages.dev/


「ニャンパイアサバイバー」というヴァンパイアサバイバーリスペクトのゲームを作成しました!
もしよろしければ遊んで頂けると嬉しいです😭


習い事教室の先生向けに、SNS 投稿・生徒募集・保護者通知の文章を AI で生成する Web サービス「おしらせAI」を個人開発しました。Next.js + Supabase + LLM で構成しており、無料で月 10 回まで試用できます。よければ触ってみてください。

→ おしらせAI: https://oshirase-ai.vercel.app/


言いたいことがうまく伝わらない…という方向けに、会話の言い方を添削する「伝え方ラボ」を開発中です。
場面を選んで自分の言葉で返すと、何が伝わっていないかの指摘と、そのまま使える言い換えが返ってきます。
ChatGPT に相談すると褒めから入って直すべきところが残りがちなので、指摘側に振り切りました。
現在は公開時にお知らせするメール登録のみ受付中です🙇‍♂️

→ 伝え方ラボ: https://tsutaekata-lab.pages.dev/

✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨

2. INSERT ... SELECT でデータのコピーも一発

異なるスキーマ間のデータコピーで、1 行ずつ INSERT を書くのは非効率的でした。INSERT INTO ... SELECT を使えば、ソースクエリの結果をそのままターゲットに挿入できます。sql INSERT INTO archive_orders SELECT * FROM orders WHERE order_date < '2023-01-01'; これにより、手動コピーの手間が省け、バッチ処理も簡単になりました。

3. UPDATE ... SET (SELECT ...) で関連レコードを一括更新

マスタテーブルの値変更に合わせて、子テーブルの参照値を更新するのに時間がかかっていました。サブクエリ付きの UPDATE で、一度の実行で関連レコードの更新が完了します。sql UPDATE products SET base_price = (SELECT max_price FROM pricing WHERE product_id = products.id) WHERE id IN (SELECT product_id FROM pricing); これにより、手動の UPDATE ループが不要になりました。

4. NOT IN を使った不要レコードの一括削除

期間終了後の顧客レコードを削除する際、1 行ずつ確認しながら DELETE を実行していました。DELETE FROM customers WHERE id NOT IN (SELECT customer_id FROM active_orders); を使うと、アクティブな注文がない顧客を一括削除できます。sql DELETE FROM customers WHERE id NOT IN (SELECT customer_id FROM active_orders); これで不要レコードの残渣がなくなり、定期メンテナンスが簡単になりました。

5. インデックス作成で検索スピードが劇的に向上

頻繁に実行していた検索クエリが遅くなり、インデックス作成を推奨されました。CREATE INDEX idx_user_email ON users(email); により、メール検索が速くなりました。sql CREATE INDEX idx_user_email ON users(email); これにより、レスポンス時間が数秒から数ミリ秒に短縮され、ユーザー体験が向上しました。

6. CTE で複雑なロジックをシンプルに

複数の結合とグループ化を組み合わせたレポート作成で、SQL が読みにくくなっていました。WITH 句を使うと、クエリをモジュール化して可読性を高められます。sql WITH monthly_sales AS ( SELECT region, DATE_TRUNC('month', sale_date) AS month, SUM(amount) AS total FROM sales GROUP BY region, month ) SELECT * FROM monthly_sales ORDER BY month; これにより、理解しやすいステップごとに分割できました。

7. HAVING で条件付き集計を実現

部署の売上高が一定額以下の部署をレポートで抽出する必要があり、WHERE だけでは実現できませんでした。HAVING を使えば、集計後のフィルタリングが可能です。sql SELECT department, SUM(salary) AS total_salary FROM employees GROUP BY department HAVING total_salary < 5000000; これにより、部署ごとの集計に基づいてフィルタリングできるようになりました。

8. サブクエリ JOIN で最新レコードを抽出

各商品の最新価格を他のテーブルと結合する必要があり、複雑な結合を書いていました。サブクエリをJOIN に組み込むことで、1 つのステートメントで最新レコードを取得できます。sql SELECT p.product_name, pr.price FROM products p JOIN ( SELECT product_id, MAX(effective_date) AS max_date FROM price_history GROUP BY product_id ) ph ON p.id = ph.product_id JOIN price_history pr ON ph.product_id = pr.product_id AND ph.max_date = pr.effective_date; これにより、複数ステップのプロセスが1つのクエリにまとめられました。

9. UNION ALL で異なるソースのデータを統合

複数のソースから得たログデータを1つのテーブルに集約する必要があり、別々の INSERT 文を実行していました。UNION ALL を使えば、重複を許容しつつデータを統合できます。sql SELECT log_id, message, log_date FROM system_logs WHERE log_date >= '2023-01-01' UNION ALL SELECT log_id, message, log_date FROM external_logs WHERE source = 'api'; これにより、ログ統合が簡素化され、重複行も保持できるようになりました。

10. ROW_NUMBER() で重複行を排出しランキング付け

同じ部署内での社員の順位付けで、重複行を排除する必要がありました。ROW_NUMBER() を使うと、順序付きウィンドウに基づいて一意の番号を付与できます。sql SELECT employee_id, department, salary, ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rank FROM employees; これにより、重複のないランキングが得られ、レポート作成が容易になりました。

まとめ
これらの10のクエリパターンは、日々の作業を劇的に効率化してくれました。まずは1つ、現場の課題に合わせて試してみると、その違いを実感できるでしょう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?