おすすめ本

最近のトラックバック

  • event (夢茶爺&苦茶爺のPC奮戦備忘録)

AccRanking

Ad

カテゴリ「MySQL」の13件の記事 Feed

2018年10月19日 (金)

【MySQL】UNION MINUS が無いので、代わりに NOT EXISTS を使う方法について

MySQLUNION MINUS が出来ないので、代わりに NOT EXISTS を使って実現します。
前回の記事の ユーザ変数を使って連番や、連続日付を取得する方法について のSQL文を参考にします。

8個の連続日付から、途中の4件を差し引く例を以下に示します。
最初の方のFROM句の中は、10日分の連続日付を生成するテーブル定義になります。
また、 NOT EXISTS 句のFROM句の中は、途中の日付から4日分の連続日付を生成するテーブルとなります。
それぞれのテーブルを日付カラムでリンクを行うと、出力として4日分の日付が中抜けした結果になります。
実行結果は以下の様になります。


楽天市場

■関連記事
【MySQL】ダミーテーブルをUNIONで連結してコード表を作成する方法
【MySQL】ユーザー変数を使ってSELECTに行番号を付加する方法
【MySQL】カラム名を囲むバッククオートについて
【MySQL】UNIONMINUSが無いので、代わりにNOTEXISTSを使う方法について
【MySQL】ユーザ変数を使って連番や、連続日付を取得する方法について

【MySQL】ユーザ変数を使って連番や、連続日付を取得する方法について

仕事の中で連番のみの仮想的なテーブルがほしい場合があったので、調べてみたところ、その解決方法としてユーザ変数を使って SQL文1個でできる様なので、その件を記します。

SQL文は以下の様に、2個のSELECT文をUNIONで連結しています。 最初のSELECT文でユーザ変数 @num を初期化し、2個目のSELECT文で @num を順次1加算し、表示することになります。 さらに LIMIT句 で何個までを生成するのかを指定します。
ただ、FROM句には実際のテーブルが必要ですので、あらかじめ TEST と命名したテーブルを作成しておきました。 TEST の中身はなんでもいいのですが、とにかく欲しい連番までのレコード(行)が必要です。
なるべくレコード数が多い方がいいのですが、特別に TEST などというテーブルを作成しなくても MySQLインストール時に生成されるシステムDBのテーブルを使ってもできます。

いろんな方のサイトを見ると、`information_schema`.COLUMNS を使っているのを多く見かけます。 実際このテーブルのレコード数は10万件以上ありますので、これを使うのがいいのではと思います。
実行結果は以下の様になります。
また、この方法を応用して、連続日付の生成を行います。以下のSQLを見て下さい。 @num の部分を @dat として日付発生させるように変更しています。
実行結果は以下の様になります。


楽天市場

■関連記事
【MySQL】ダミーテーブルをUNIONで連結してコード表を作成する方法
【MySQL】ユーザー変数を使ってSELECTに行番号を付加する方法
【MySQL】カラム名を囲むバッククオートについて
【MySQL】UNIONMINUSが無いので、代わりにNOTEXISTSを使う方法について
【MySQL】ユーザ変数を使って連番や、連続日付を取得する方法について

2011年4月27日 (水)

MySQLのdualダミーテーブル

Oraleに存在するダミーテーブルDUALですが、MySQLにも存在します。
でもMySQLのマニュアルを見ますと以下の様な記述があります。

「バージョン 4.1.0 以降では、どのテーブルも参照されない状況において、 ダミーテーブル名として DUAL を指定することができる。 これはもっぱら互換性を考慮した機能である。 一部の他のサーバではこの構文が必要となる。」

以下のSQLはどちらを使っても同じ結果が得られます。

Oracleを使ってきた私が、MySQLを使うとDUALを使いたくなってしまいます。
FROM句が無いのがどうも気持ち悪いからで、特に意味はありませんが、みなさんはどうなのでしょうか。

尚、上のSQLの実行はWindowsXPでXAMPPをインストールしてコマンドラインからMySQLを実行しています。
コマンドラインからの実行は以下のコマンドにより実行します。

c:\xampp\mysql\bin\mysql -u root -p


楽天市場

■関連記事
【MySQL】ダミーテーブルをUNIONで連結してコード表を作成する方法
【MySQL】ユーザー変数を使ってSELECTに行番号を付加する方法
【MySQL】カラム名を囲むバッククオートについて
【MySQL】UNIONMINUSが無いので、代わりにNOTEXISTSを使う方法について
【MySQL】ユーザ変数を使って連番や、連続日付を取得する方法について