SQLメモ

テーブル

作成

CREATE TABLE <テーブル名>
( <列名1> <データ型> <制約>,
  ...);

削除

DROP TABLE <テーブル名>;

変更

-- 列の追加
ALTER TABLE <テーブル名> ADD COLUMN <列の定義>;

-- 列の削除
ALTER TABLE <テーブル名> DROP COLUMN <列の定義>;

集合演算(行方向)

これらは、以下のように使われる。

SELECT <列1>, <列2>
FROM <テーブル名>
UNION  -- このようにレコードの集合に対して処理する
SELECT <列a>, <列b>
FROM <テーブル名>

UNION

和(⋃)。重複行は削除される。 UNION ALL では削除されない。

INTERSECT

共通(積)(⋂)。どちらにも属する行。

EXCEPT

差(-)。A EXCEPT B は AにあってBにない行。

集合演算(列方向)

INNER JOIN

内部結合。FROM <テーブル名> INNER JOIN <テーブル名> ON <結合条件>

OUTER JOIN

外部結合。FROM <テーブル名> LEFT OUTER JOIN <テーブル名> ON <結合条件>。
外部結合では左右どちらのテーブルをマスタとみなすかによって、 LEFT OUTER JOIN, RIGHT OUTHER JOIN を使いわける。

データ

登録

INSERT … VALUES: 基本形。1回で1行を挿入。

INSERT INTO <テーブル名> ( <列名1>, <列名2>, ...)
VALUES ( <値1>, <値2>, ...);

INSERT … SELECT: ほかのテーブルからデータをコピーする場合

INSERT INTO <テーブル名> ( <列名1>, <列名2>, ...)
SELECT <列目a>, <列名b>, ...
FROM <テーブル名>;

更新

UPDATE

UPDATE <テーブル名>
  SET <列名> = <式>
  WHERE <条件式>;

検索

-- 重複を省く = DISTINCT
SELECT DISTINCT <列名>, ...
FROM <テーブル名>

演算

-- 算術
-- +, -, *, /
SELECT <列名> * 5
FROM <テーブル名>

-- 比較
-- = : 等しい
-- <> : 等しくない
-- >= : 以上, <= : 以下

-- 論理
-- 否定は NOT, かつの AND, またはの OR

集約

集約関数

COUNT : 行数をカウントする

SUM : 合計

AVG : 平均

MAX : 最大値

MIN : 最小値

GROUP BY

SELECT <列名1>, <列名2>, <列名3>, ...
FROM <テーブル名>
GROUP BY <列名1>, <列名2>, <列名3>, ...

WHERE を利用する場合、WHEREの絞り込み後にグループ化される。

GROUP BY を利用する場合、SELECT句に書けるのは「定数」か「集約関数(SUMなど)」か「GROUP BYで指定した列」のみ。

処理順序

SELECT <列名a>, COUNT(*)
FROM <テーブル名>
GROUP BY <列名a>
HAVING COUNT(*) = 2;

  句の順序: SELECT ⇒ FROM ⇒ WHERE ⇒ GROUP BY ⇒ HAVING ⇒ ORDER BY ⇒ LIMIT

  実行順序: FROM ⇒ WHERE ⇒ GROUP BY ⇒ HAVING ⇒ SELECT ⇒ ORDER BY ⇒ LIMIT

  ① GROP BY 句を使うときは SELECT 句に集約キー以外の列名を書けない

  ② SELECT 句に AS で別名付けた名前を GROUP BY では利用できない。なぜなら、実行順は SELECT が最後だから。

③ WHERE は GROUP BY より先に処理されるため、集約を使う場合は HAVING。

【復旧】Blazorでクラスを変更する

前置き

この記事は旧サイトの2021.8.24投稿の記事内容のリポストです。

やりたいこと

ある要素の class をクリックイベントで表示を変更したい

方法

ボタン要素のclassをクリックイベントで変更したいとします。

この場合、以下のように class="@変数名" というようにクラス属性の値を変数にすることで、C# のコード上から参照できます。

<button class="@ButtonClass" @onclick="ChangeClass">click me</button>
private string ButtonClass = "btn btn-primary";
private void ChangeClass()
{
    ButtonClass = ButtonClass == "btn btn-outline-primary" ?
        "btn btn-outline-secondary" : "btn btn-outline-primary";
}

Think

Blazorで変数を参照する場合、 @変数名 とすることで、C# (@code { }で囲まれた箇所)側で定義した変数を参照することができます。これは基本的な使い方ですが、最初はテキスト部分は変数にできるが、class属性の値などにも変数を使えるということがわからず悩んでしまいました。

そこで考えたのが 「button に id を付与して GetElementByIdのようなメソッドが使えるのでは?」みたいなことでどうにかDOM操作しようという考えにとらわれていて class属性の値も変数にできるんだということに思い至らなかった・・・。

ということでBlazorで何かしたい場合は対象の箇所を変数にしちゃえば大体いけそうというのが学びです。

Re! Hello world!

もともと特に何かしたいというわけでもなく、なんとなくで環境構築した WordPress サイトでしたが、4年越しに攻撃にあってしまい、DBの中身を改竄されてしまいました。

というわけでRe! Hello world! です……。

これはかつてのマイサイト。

発覚経緯

発覚経緯は2024/4/8 頃に管理画面をみようとするとなぜか install.php にリダイレクトされるという現象が発生。DBがおかしくなったのかな?と思い、phpMyAdmin を開いてみると、README というテーブルだけになっており、中には「あなたのDBの中身バックアップしたよ!返してほしかったらこのアドレスにビットコインを払って(意訳)」というメッセージがありました。

反省点とか振り返りとか

運用する気もなかった、というのもあるけどセキュリティなんて完全に気にしてませんでした。また、こんな何もないようなサイト攻撃されるのか?という甘い認識でした。4年間は無事でしたが…(笑)

また気にしてなかったとはいってもパスワードは大分適当な文字の羅列にはしてあったので総当たりしないと突破することができないものには一応なっていたので、本当に総当たりで攻撃しに来てるんだということがわかりました。

今回被害にあったのはそもそも db を改竄できるような状況にしてしまっていた、というところなので以下で対策とできるかなと思ってます。

  • phpmyadmin や LiteSpeed のポートを自分のグローバルIPに制限して利用する、また正直不要なのでポート閉じておく。

あと今回は無事でしたが、WordPressの管理画面も危ないと思うので、こちらについては二段階認証でワンタイムパスワードでも利用するようにしておこうと思います。

セキュリティ的にもっとこうしたほうがいいなどの意見がありましたらゆる募です。