やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

SQLite3学習 演算子の一覧

 公式からは見つけられず。別サイトからかき集めた。

成果物

対象環境

情報源

演算子

コード例の動作環境

$ sqlite3
...
sqlite> 

算術演算子

演算子 説明 コード例 結果
+ 加算 select 1 + 2; 3
- 減算 select 5 - 1; 4
* 乗算 select 2 * 3; 6
/ 除算 select 7 / 2; 3
% 剰余 select 7 % 2; 1

比較演算子

演算子 説明 コード例 結果
=
==
等しい select 1 = 1;
select 1 = 0;
select 'A' = 'A';
select 'A' = 'B';
1
0
1
0
!=
<>
等しくない select 5 != 5;
select 5 != 6;
0
1
< 小なり
(左は右 未満)
select 5 < 5;
select 5 < 6;
0
1
> 大なり
(左は右 超過)
select 5 > 4;
select 5 > 5;
0
1
<= 小なりイコール
(左は右 以上)
select 5 <= 4;
select 5 <= 5;
select 5 <= 6;
0
1
1
>= 大なりイコール
(左は右 以下)
select 5 <= 4;
select 5 <= 5;
select 5 <= 6;
0
1
1
!< 不小なり select 5 !< 5; Error: unrecognized token: "!"
!> 不大なり select 5 !> 5; Error: unrecognized token: "!"

論理演算子

演算子 説明 コード例 結果
NOT 否定 select 5=5;
select not 5=5;
1
0
AND 論理積 select 1=1 and 1=1;
select 1=1 and 1=0;
1
0
OR 論理和 select 1=1 or 1=1;
select 1=1 or 1=0;
select 1=0 or 1=2;
1
1
0

NOT  NOTは以下のBETWEEN,IN,EXISTS,LIKE,GLOB,UNIQUEにも付与できる。

演算子 説明 コード例 結果
IS NULL NULL用等号 select 5 is NULL; 0
IS NOT NULL NULL用不等号 select 5 is not NULL; 1
|| 文字列結合 select 'A' || 'B';
select 1 || 2;
AB
12
BETWEEN 範囲 select 5 between 0 and 10;
select 5 between 0 and 4;
1
0
IN 候補 select 5 in (5,6);
select 5 in (4,6);
1
0
EXISTS 存在確認 select exists(select 5); 1
LIKE パターンマッチ select '123' like '%1%';
select '123' like '%4%';
select '123' like '___';
select '123' like '__';
select 'a10%a' like '%10$%%' escape '$';
select 'a10#a' like '%10$%%' escape '$';
1
0
1
0
1
0
GLOB パターンマッチ select '123' glob '*1*';
select '123' glob '*4*';
select '123' glob '???';
select '123' glob '??';
select '123' glob '[1-9]*';
select '123' glob '[1-9]';
select '123' glob '[^a-zA-Z]*';
select '123' glob '[a-zA-Z]*';
select '2*3=6' glob '*2[*]3*';
select '2+3=5' glob '*2[*]3*';
1
0
1
0
1
0
1
0
1
0
DISTINCT 重複せぬよう列挙 select distinct 列名 from テーブル名;
UNION 和集合 select 5 union select 6; 5
6
EXCEPT 差集合 select 5 except select 5; (取得レコードなし)
INTERSECT 積集合 select 5 intersect select 5; 5
CASE 条件分岐 select case when 1=1 then 'A' else 'Z' end;
select case when 0=1 then 'A' when 1=1 then 'B' else 'Z' end;
A
B
COLLATE 比較方法の指定 SELECT * FROM ... WHERE name = 'someone' COLLATE NOCASE SOmeoNE
LIMIT 取得上限数 select 5 union select 6 limit 1; 5

COLLATE * https://stackoverflow.com/questions/973541/how-to-set-sqlite3-to-be-case-insensitive-when-string-comparing

IS  NULLのためだけにIS句を使わねばならない。NULLには=が使えない。クソすぎ。NOT NULL制約を使おう。

EXISTS  EXISTS句は引数に副問合せを使うため複雑になる。たとえば以下。指定したユーザのリポジトリ名のみ取得するような想定。(他ユーザのリポジトリ名も同一テーブル内に格納されているものとする)

select
  r.name
from
  repos r
where
  exists(
    select * from users
    where id = r.user_id
  )

LIKE  LIKE句でカンマ区切りのデータAAAを抽出するときは以下。AAAの前後にカンマ,が有ろうが無かろうが取得できる。カラム名(',' || name || ',')になっている。一体これが何なのかわからない。でも、こう書けばいいってばっちゃが言ってた

select * from TBL where (',' || name || ',') like '%,AAA,%';

GLOB  LIKEよりGLOBのほうが速いらしい。

select * from TBL where (',' || name || ',') glob '*,AAA,*';

ビット演算子

演算子 説明 コード例 結果
& select 1 & 1;
select 1 & 0;
1
0
| select 1 | 1;
select 1 | 0;
select 0 | 0;
1
1
0
~ 反転 select ~0;
select ~-1;
-1
0
<< 左シフト select 1<<2; 4
>> 右シフト select 4>>2; 1

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux

前回まで