【投稿者】かぐちょ
SQLに初めて触れたとき、私が知っていたのは「SELECT * FROM テーブル名;」という、とても簡単な文だけでした。データベースからデータを取り出せることは知っていたのですが、それ以上のことはよくわかりませんでした。
しかし、仕事で実際にSQLを使うようになると、いろいろな文を使いこなす必要が出てきました。扱うデータの量が増えたり、テーブルをつなげたり、条件を分けたりするような場合に対応する中で、自然と覚えることも増えていきました。
この記事では、私が仕事の中で覚えたOracle SQLの基本的な文の中から、「NOT EXISTS」「UNION ALL」「DUAL」について、自分の経験をもとにわかりやすくまとめました。これからSQLを学ぶ人の参考になればうれしいです!
NOT EXISTS:存在しないデータを見つける方法
まず初めに覚えたのは、”NOT EXISTS”です。
そのとき使ったのが、NOT EXISTS という文です。たとえば、次のように書きます。
SELECT * FROM 商品マスタ M
WHERE NOT EXISTS (
SELECT 1 FROM 在庫テーブル Z
WHERE M.商品ID = Z.商品ID
);
このクエリは、在庫テーブルに同じ商品IDが「ない」商品だけを選び出します。最初は、この中のサブクエリの意味がわからず戸惑いましたが、EXISTS は「サブクエリに結果があるかどうか」を調べるものであるとわかってから、理解できました。
似たような文に NOT IN もありますが、NULLが入っている場合に動きが変わることがあるため、仕事では NOT EXISTS のほうが安全に使えると教わりました。
UNION ALL:データをまとめるときのポイント
次に覚えたのが UNION ALL です。複数のテーブルから似た形のデータをまとめて表示したいときに、UNION や UNION ALL を使います。
この2つの違いは、重複した行をどう扱うかです。
UNION:重複をなくしてくれるUNION ALL:重複もそのまま表示する
処理の速さでいうと、UNION は重複をなくすために追加の処理が入るので遅くなりやすいですが、UNION ALL はそのまま結合するので速いです。
DUAL:Oracleだけの特別なテーブル
Oracle SQLを使っていて最初に困ったのが DUAL という名前のテーブルでした。
たとえば、現在の日付を調べたいとき、こう書きます。
SELECT SYSDATE FROM DUAL;
この DUAL は、Oracleが用意している「1行だけの特別なテーブル」です。普通はテーブルからデータを取りますが、値や関数の結果だけを取りたいときに使います。
ほかのデータベース(MySQLやPostgreSQLなど)では、FROM句を書かなくても値が取れますが、Oracleでは FROM句が必ず必要なので、この DUAL が用意されているのです。
初めて見ると不思議に思いますが、理解するととてもシンプルな仕組みです。
実務で学んだSQLの上達方法
SQLを上手に使えるようになるために、一番大切だと感じたのは「実際に使ってみること」でした。エラーにぶつかっても試行錯誤を繰り返すことで、どんどん理解が深まります。また、仕事の内容に合ったSQLを書くことで、自然と応用力もついてきました。
また、周りの人が書いたSQLを読んで学ぶことも多かったです。「なぜこの書き方をしているのか」を考えることで、自分なりの改善案が浮かんだり、効率の良い書き方を身につけたりできました。
これからの目標とまとめ
まだまだSQLにはたくさんの便利な文があります。これからは、複雑なテーブルのつなぎ方(JOIN)や、順位をつけるウィンドウ関数(RANKやROW_NUMBERなど)にも挑戦していきたいと思います。
最初はSELECTしか書けなかった私も、仕事を通じて必要に迫られながら少しずつ使えるようになりました。この記事が、これからSQLを学ぶ方や実務での使い方に悩んでいる方の役に立てば幸いです。








