SQLiteでEXISTS / NOT EXISTS句を使う

MySQLやOracleなどのデータベースでおなじみのWHERE EXISTS句を
SQLiteで使えるかどうかを調べてみたら調べ方が悪いのか、
日本語の情報がほぼ無かったのでメモ。

SQL叩いて試してみたらEXISTS句使えました。
SQL文の例。

SELECT * FROM t1 WHERE EXISTS(SELECT * FROM t2 WHERE t1.id = t2.t1_id);
SELECT * FROM t1 WHERE NOT EXISTS(SELECT * FROM t2 WHERE t1.id = t2.t1_id);

これで片方のテーブルだけにある行などの抽出もできます。

CharSequenceはインターフェース

String型を指定したい部分にCharSequenceって出てきたので
なによと思ったのですが、どうやらインターフェースみたいです。

公式リファレンスを見てみると以下のような説明が書かれています。
>char シーケンスへの統一された読み取り専用アクセスを提供します。

なるほどね。

ちなみにこのインターフェースを実装しているクラス一覧は以下の通り。

  • String
  • CharBuffer
  • StringBuffer
  • StringBuilder

たまに引数の型で出てくるので覚えておくといいかもしれません。

現在のSQLモードを確認するSQL文

MySQLにはSQL modeというものがあり、何が設定されているかによってSQL文を実行したときの振る舞いが変わります。

ストリクトSQLモードというものがあり、これが有効だとより厳格にSQL文を解釈します。
Strictとはそのまま厳格という意味です。

そのSQLモードを確認する方法が以下のSQL。

SELECT @@sql_mode;

結果。

+-------------------------------------------------------------------------------
------------------------------------------------+
| @@sql_mode
                                                |
+-------------------------------------------------------------------------------
------------------------------------------------+
| STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_D
IVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER |
+-------------------------------------------------------------------------------
------------------------------------------------+

詳しくはSQL モードを参照。