SQL構文

SQL構文

書き順 評価順序 備考
1 7 SELECT (DISTINCT) 列の指定 DISTINCTを指定すると列の値が重複する場合、排除してくれる
2 2 FROM テーブル WHERE句で内部結合する際は、結合するテーブルをすべて列挙する
3 3 INNR(LEFT/RIGHT OUTER) JOIN 結合テーブル ON 結合条件 抽出条件より先に評価される
4 4 WHERE 抽出(選択)条件 集約より先に評価される
4 5 GROUP BY 集約キー SELECTで指定できるカラムは集約キーか集約関数に限定される
5 6 HAVING 集約条件 集約キーの値から集約対象にするのかどうか
6 - ORDER BY ソートキー
- 1 (サブクエリ) 別名「副問合せ」。なので句だけでなく関数の引数にも指定することができ、結果が()内に展開される

検索

列の選択

SELECT (DISTINCT) 列の選択
FROM 検索テーブル
  • SELECT DISTINCT 列1, ... 指定した列の値が重複する場合は、1つにまとめられる
    • NULLも一つの値として評価される

行の選択

SELECT (DISTINCT) 列の選択
FROM 検索テーブル
WHERE 抽出条件

抽出条件

述語(trueもしくはfalseを返す式)を指定することができる。 述語には、比較演算子、論理演算子やLIKE演算子などの特殊演算子が使用できる。

比較演算子

演算子 意味
= 等価
<> 等価でない
>= ~以上
> より大きい
<= ~以下
< より小さい

文字列'Hello'に一致する行を選択する

SELECT * FROM テーブル WHERE 列 = 'Hello'

特殊演算子

演算子 意味
LIKE 文字列検索
ANY 複数の値を実現し、どれか一致すればtrueを返す
ALL 複数の値を実現し、全てに一致すればtrueを返す
BETWEEN 範囲検索。両端を含む
IS (NOT) NULL =ではNULLかどうかの判定は不可
(NOT) IN 含まれるかどうか
EXISTS 他のテーブルにレコードが存在する場合、trueを返す

文字列に一致する行を選択する

SELECT * FROM テーブル WHERE 列 LIKE '完全一致検索'
SELECT * FROM テーブル WHERE 列 LIKE '%後方一致検索'
SELECT * FROM テーブル WHERE 列 LIKE '前方一致検索%'
SELECT * FROM テーブル WHERE 列 LIKE '_部分一致検索_'
  • % 0文字以上の任意の文字
  • _ 任意の一文字

ANYによる複数の値を実現

SELECT * FROM テーブル 列 = ANY(値1, 値2, 値3)
  • 列 比較演算子 ANY(...) という形を取る
  • ANY(値1, 値2, 値3) 値1,値2,値3のどれともなる
  • ANY(サブクエリ) サブクエリで出力される値となる

2021年8月1日から2021年8月31日の間の行を選択する

SELECT * FROM テーブル WHERE date BETWEEN '2021/08/01' AND '2021/08/31'

NULLでない行を選択する

SELECT * FROM テーブル WHERE 列 IS NOT NULL

任意の値に該当する行のみ選択する

SELECT * FROM テーブル WHERE 列 IN(値1, 値2, 値3)

Bテーブルにレコードが存在する行のみ選択する

SELECT * FROM Aテーブル WHERE EXISTS(SELECT * FROM Bテーブル WHERE B.列 = A.列)
  • サブクエリ側のSELECT句に指定する値は定数でもよい
  • サブクエリの結果、レコードが存在する場合は、trueを返す

テーブルの結合

SELECT -
FROM -
INNER(OUTER) JOIN 結合テーブルを指定
ON 結合条件
WHERE 行の選択

先に結合条件が実行され、次に抽出条件が実行される

3つのテーブルを結合する

SELECT A.列, B.列, C.列 FROM A 
    INNER JOIN B ON A.列 = B.列
    INNER JOIN C ON A.列 = C.列
    WHERE A.列 > 200
  • テーブルA,B,Cが結合条件に従って内部結合されてからWHEREによる抽出条件で行が選択される
  • 結合条件は過不足なくテーブルの列同士を'='で結びつける必要がある

NOTE

サブクエリの使用はNG

NG 1

SELECT A.列, B.列 FROM A 
    INNER JOIN B ON A.列 = (サブクエリ)

NG 2

SELECT A.列, B.列 FROM A 
    INNER JOIN B ON A.列 IN(サブクエリ)

WHERE句を使った結合

内部結合となる。 抽出条件と混ざるため、近年は、INNER JOINを使うのが一般的。

テーブルA,B,Cを内部結合する

SELECT * FROM A, B, C WHERE A.列 = B.列 AND B.列 = C.列 AND 抽出条件
  • FROM句に結合するすべてのテーブルを列挙する
  • WHERE句に結合条件を指定する
  • 抽出条件はANDで結ぶ

集約

行を1つもしくはグループごとにまとめる。

集約関数

集約関数を使うことで行を1つにまとめることができる。

集約関数 意味
SUM() 列の値を合計値
AVG() 列の値を平均値
MIN() 列の値の最小値
MAX() 列の値の最大値
COUNT(*もしくは) 引数に*を指定した場合、NULLを含める。DISITINCTキーワードが使用可能

列の値が重複しない行数を出力する

SELECT COUNT(DISTINCT 列) FROM テーブル

NOTE

入れ子にできない。

# NG
SELECT 集約関数(集約関数(列)) FROM テーブル

集約関数とGROUP BY句

テーブル全体で一行にまとめるのではなく、グループごとに集約する。

NOTE

SELECTに指定できるのは、集約キーもしくは、集約関数のみに制限される。

参考文献

  • SQL 第2版ゼロからはじめるデータベース操作
  • SQL 苦手を克服する本
    • 評価順序について
  • 出るとこだけ!基本情報技術者 午後
    • 標準SQL NG集
  • よく分かるSQL 高橋麻奈
  • 理論から学ぶデータベース実践入門
    • データベース実装について

Deref型

Deref型

代表的なDeref型

  • 参照型 &T
  • スマートポインタ String, Box<T>, ...

3つのDeref型強制

参照(More on Deref coersion)

If T implements Deref<Target = U>, and x is a value of type T, then:

  1. In immutable contexts, *x (where T is neither a reference nor a raw pointer) is equivalent to *Deref::deref(&x).
  2. Values of type &T are coerced to values of type &U
  3. T implicitly implements all the (immutable) methods of the type U.

1. Dereference(*)演算子によるDeref型強制

#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
struct Foo(i32);
let foo1 = Foo(1);
let foo2 = &Foo(2);

// *演算子でFoo型に戻すことができる
if foo1 > *foo2 {}

2. 型宣言とBorrow(&)演算子によるDeref型強制

型宣言 することで、参照型(&U)として取り出すことができる。 一種のキャスト?にあたるかも。

#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
struct Foo(i32);

struct FooBox(Foo);
impl Deref for FooBox {
    type Target = Foo;
    fn deref(&self) -> &Self::Target {
        &self.data
    }
}
let foo = Foo(5);
let foo_box = FooBox(foo);
let foo2: &Foo = &foo_box; // &演算子によるDeref型強制

3. ドット(.)演算子によるDeref型強制

#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
struct Foo(i32);
impl Foo {
    fn say_hello(&self) {
        println!("Hello Everyone")
    }
}

struct FooBox(Foo);
impl Deref for FooBox {
    type Target = Foo;
    fn deref(&self) -> &Self::Target {
        &self.data
    }
}
let foo = Foo(5);
let foo_box = FooBox {data: foo};
foo_box.say_hello(); // 自動参照外しによるDeref型強制

関連

自動参照外し (Auto-dereferencing) - あるマのメモ書き

*演算子(Dereference)とスマートポインター

*演算子(Dereference演算子)は

  • 参照型につかうと、参照外しされる。
  • スマートポインター(Deref実装型)に使うと、Deref型強制される。

メモ

pub trait Dref {
    type Target: ?Sized;
    fn deref(&self) -> &Self::Target;
}

不可変参照外し演算子(*v)によって使用される。

*演算子による明示的な参照外し演算子だけでなく、コンパイラによって暗黙的に使用される。 このメカニズムは、Deref型強制と呼ばれる。

Derefは、スマートポインターにのみ実装される。

Deref型強制

型Tが、Deref<Target = U> を実装し、xがTの値とした時、

  1. *x*Deref::deref(&x)と同一 - derefメソッドが呼ばれ、参照が外される
  2. &Tは、&U型に強制される
  3. Tは暗黙的に型Uのメソッドを実装する

例1. Box<T>型 (Deref)

11文字の殺人

著者: 東野圭吾
発行: 1990年

あとがきを読んで、東野圭吾宮部みゆきが同世代であることを知った。 仲が良いことは知っていたが、彼女は社会派ということもあり、世代が一つ上ぐらいのイメージがあった。

著者は85年のデビューから「放課後」でその年に江戸川乱歩賞をとっているものの 、出世作である「秘密」や「百夜行」、1999年と2000年の出版まで10年間以上鳴かず飛ばずの時代があった。

東野が、本格ミステリー作家と一線を画すところは、社会問題を題材にし、かつ人間ドラマを緻密かつ丁寧に描いているからだと思っている。

この作品は、まだ売れていなかった時代ということになるが、バブルの余韻が残る日本という舞台を使い、殺人ミステリーでありながら、人を殺すことの罪深さも描かれている。

ただ幾分か村上春樹の要素がはいっていたような気がするのは僕だけだろうか? もしかしたら彼は、殺人ミステリー小説作家版村上春樹なのかもしれない。

国の借金と民間の借金


サラリーマンとして働いていると、国の助成金をあてにしようとする場面を何度も遭遇する。

この30年間、税金を使うべきところをとことん削除し、本来民間が、頑張って欲しいところにお金を出してきたのではないかと思う。

特に企業債務は90年代の減少が凄まじく、2000年以降は、緩やかに減少していっている。

急増する中国の企業債務 | リコー経済社会研究所 | リコーグループ 企業・IR | リコー

f:id:yossan2:20211010074420j:plain
各国の非金融企業債務額のGDP

国の助成金には集中と選択という戦略がある。 これに民間まで乗っかってしまったら1億総壊滅ということになってしまわないか。

子供の貧困対策を寄付で賄うというどこの国の話なのかわからないようなことをするのではなく、とにもかく民間や個人ではどうしようもない公共サービスに税金を使ってほしい。

今日学んだこと

国債は2種類存在する

とくに「赤字国債」とは「特例国債」のことを言う。

国債の役割と課題を知っておこう | わかっておきたい投資のこと | man@bowまなぼう

民間債務(残高)

2種類存在する

  • 企業債務
  • 家計債務

※ 日本の民間債務残高の資料は、フリーでは見つけることが出来なかった。中国や韓国はよくあった。(とくにこの国ヤバい系のソース)

ザナドゥ

note.com

著者: 戸画美角

感想:

「僕は知っていることだけしか知らないですよ」

知り合いの方が小説を書くということが本当に面白い。ということが分かった。 著者はとても物知りな方だなとずっと思っていて、そのことを直接伝えたこともある。 そして冒頭の言葉。その時は、ちょっと失礼なことを言ってしまったと後悔した。

しかしあれからご本人は、大きな公演に登壇するだけでなく、本も書かれ、やはり物知りであるということを証明されている。

そして小説を書かれた。

タイトルが「ザナドゥ」 その意味が知りたくて読み始めた。読めば書いているだろうと。 でも中身を読んでもその意味は書かれていなかった。 仕方がないのでググったところ、昔のモンゴル帝国の都の名前であり、現代では桃源郷を意味するらしい。 そして二回目を読み、なるほどと、物語とつなげることが出来た。そして面白いと思った。

今、あとがきを読むと、物語へと昇華させている舞台裏が解説されていた。

「モノを抽象化し、そして具現化する」というテクニックを小説でもいかんなく発揮されていることがよく分かった。 (当時からそんなプログラミングコードを思いつくなと心から思わされていた。あるいはこの力があるからこそこうして小説におとしむことが出来るのかもしれない) 小説の技法も物語ごとに上手くなっていると感じた。

またお叱りを受けるかもしれないけど、ここに僕なりのささやかなエールを込めて「面白かった」と伝えたい。

アベノミクスに思う

連日、株価が下落している。 しかし株を持たない私にとっては関係のない話だ。 アベノミクスもそうだった。

アベノミクスは、年金と日銀砲とで日経平均関連銘柄を買い上げることによって、 投資家に円を供給し、その円が、他の投資に回ることで日本の景気を回復させるという目論見だった。

しかし結局は海外資産に逃げてしまい、円安をまねいてしまった。 2012年以降、アメリカへの直接投資が急上昇している。 2020年の対内直接投資残高、日本が首位維持(米国) | 地域・分析レポート - 海外ビジネス情報 - ジェトロ

輸出入総額の推移をみると、2014年以降輸出高が増えており、特にこの年初めて旅行収支が2000億円の黒字となった。(55年ぶり) 2019年には、インバウンドで2兆6千億円の貿易収支を叩き出す。

しかしそれ以上に輸入総額も上昇しており、2015年以降は貿易黒字と赤字を交互に繰り返している。 これは材料コストが増大していることが伺える。

結局投資家に円をばらまいても格差を増大させるだけで終わってしまったと言える。