【SQL Server】WHERE句とORDER BY句を使用したデータ取得


勉強/検証も兼ねて、SQL Serverのインストールを行い、sqlcmdコマンドを使用したコマンドベースでの作業を行いました。
[SQL Serverの導入_sqlcmdで遊ぶ](https://qiita.com/hitorigotsu/items/1c0981ac408d33b96671)

今回は、WHERE句/ORDER BY句を使用して遊びます。

下記のテーブルを作成して、遊びます。
※前回の[SQL Serverの導入_sqlcmdで遊ぶ](https://qiita.com/hitorigotsu/items/1c0981ac408d33b96671)を見てくれている人がいる場合は、DROP TABLE VANILLAでテーブルの削除を行ってください。「データベースに 'VANILLA' という名前のオブジェクトが既に存在します。」というエラーが出て、同名のテーブルは作成出来ないと思われます。

```:使用するテーブル
CREATE TABLE VANILLA(

	code INT UNIQUE,
	level INT,
	attack INT,
	defense INT,
	name VARCHAR(30));

GO
```

```:使用するデータ
INSERT INTO VANILLA (code,level,name,attack,defense)  VALUES (1,1,'ワイト',300,200)
INSERT INTO VANILLA (code,level,name,attack,defense)  VALUES (2,8,'ブルーアイズホワイトドラゴン',3000,2500)
INSERT INTO VANILLA (code,level,name,attack,defense)  VALUES (3,4,'ホーリー・エルフ',800,2000)
INSERT INTO VANILLA (code,level,name,attack,defense)  VALUES (4,6,'デーモンの召喚',2500,1200)
INSERT INTO VANILLA (code,level,name,attack,defense)  VALUES (5,4,'ワイバーンの戦士',1500,1200)
INSERT INTO VANILLA (code,level,name,attack,defense)  VALUES (6,7,'ブラックマジシャン',2500,2100)
INSERT INTO VANILLA (code,level,name,attack,defense)  VALUES (7,3,'闇・道化師のサギー',600,1500)
INSERT INTO VANILLA (code,level,name,attack,defense)  VALUES (8,3,'ベビードラゴン',1200,700)
INSERT INTO VANILLA (code,level,name,attack,defense)  VALUES (9,4,'砦を守る翼竜',1400,1200)
INSERT INTO VANILLA (code,level,name,attack,defense)  VALUES (10,4,'グレムリン',1300,1400)
GO
```

データを作成したら、とりあえずselect叩きます。

```:データ取得
1> SELECT * FROM VANILLA;
2> GO
code        level       attack      defense     name
----------- ----------- ----------- ----------- ------------------------------
          1           1         300         200 ワイト
          2           8        3000        2500 ブルーアイズホワイトドラゴン
          3           4         800        2000 ホーリー・エルフ
          4           6        2500        1200 デーモンの召喚
          5           4        1500        1200 ワイバーンの戦士
          6           7        2500        2100 ブラックマジシャン
          7           3         600        1500 闇・道化師のサギー
          8           3        1200         700 ベビードラゴン
          9           4        1400        1200 砦を守る翼竜
         10           4        1300        1400 グレムリン

(10 行処理されました)
```


お次にORDER BY句を使用して、データの並び替えを行います。
attackカラムの数値が高い順で並び替えを行います。
selete文の後ろに ORDER BY カラム名 DESC or ASCと記載する事で並び替えを行えます。
降順の場合はDESC/昇順はASCを使用します。デフォルトだとASCが適用されます。

```:attackを降順で並び替え
1> SELECT * FROM VANILLA ORDER BY attack DESC;
2> GO
code        level       attack      defense     name
----------- ----------- ----------- ----------- ------------------------------
          2           8        3000        2500 ブルーアイズホワイトドラゴン
          4           6        2500        1200 デーモンの召喚
          6           7        2500        2100 ブラックマジシャン
          5           4        1500        1200 ワイバーンの戦士
          9           4        1400        1200 砦を守る翼竜
         10           4        1300        1400 グレムリン
          8           3        1200         700 ベビードラゴン
          3           4         800        2000 ホーリー・エルフ
          7           3         600        1500 闇・道化師のサギー
          1           1         300         200 ワイト

(10 行処理されました)
```

並び替えました。ちなみに、複数指定する事も可能です。
カンマ区切りで、attack DESC,level DESCと指定する事で attack　→　level の順番で並び替えを行ってくれます。
上記で並び替えをすると、'ブラックマジシャン' と 'デーモンの召喚' の順番が逆になります。

```:複数条件でのORDER BY句
1> SELECT * FROM VANILLA ORDER BY attack DESC,level DESC;
2> GO
code        level       attack      defense     name
----------- ----------- ----------- ----------- ------------------------------
          2           8        3000        2500 ブルーアイズホワイトドラゴン
          6           7        2500        2100 ブラックマジシャン
          4           6        2500        1200 デーモンの召喚
          5           4        1500        1200 ワイバーンの戦士
          9           4        1400        1200 砦を守る翼竜
         10           4        1300        1400 グレムリン
          8           3        1200         700 ベビードラゴン
          3           4         800        2000 ホーリー・エルフ
          7           3         600        1500 闇・道化師のサギー
          1           1         300         200 ワイト
```

お次に、levelカラムが4となっているデータを取得します。
指定した条件でデータを取得したい場合は、WHERE句を使用します。
selete文の後ろに、WHERE カラム 条件式 と記載する事で指定した条件でデータを取得出来ます。

```:levelカラムが4となっているデータを取得
1> SELECT * FROM VANILLA WHERE level = 4;
2> go
code        level       attack      defense     name
----------- ----------- ----------- ----------- ------------------------------
          3           4         800        2000 ホーリー・エルフ
          5           4        1500        1200 ワイバーンの戦士
          9           4        1400        1200 砦を守る翼竜
         10           4        1300        1400 グレムリン

(4 行処理されました)
```

and/orを使用する事で、複数条件・いずれかの条件でのデータを取得出来ます。

①attackカラムとdefenseカラムが1000以上のデータを取得
②attackカラムとdefenseカラムのいずかが2000以上のデータを取得

を行います。

```:①attackカラムとdefenseカラムが1000以上のデータを取得
1> SELECT * FROM VANILLA WHERE (attack >= 1000) AND (defense >= 1000);
2> GO
code        level       attack      defense     name
----------- ----------- ----------- ----------- ------------------------------
          2           8        3000        2500 ブルーアイズホワイトドラゴン
          4           6        2500        1200 デーモンの召喚
          5           4        1500        1200 ワイバーンの戦士
          6           7        2500        2100 ブラックマジシャン
          9           4        1400        1200 砦を守る翼竜
         10           4        1300        1400 グレムリン

(6 行処理されました)
```

```:②attackカラムとdefenseカラムのいずかが2000以上のデータを取得
1> SELECT * FROM VANILLA WHERE (attack >= 2000) OR (defense >= 2000);
2> GO
code        level       attack      defense     name
----------- ----------- ----------- ----------- ------------------------------
          2           8        3000        2500 ブルーアイズホワイトドラゴン
          3           4         800        2000 ホーリー・エルフ
          4           6        2500        1200 デーモンの召喚
          6           7        2500        2100 ブラックマジシャン

(4 行処理されました)
```

最後に、Like演算子について
特定の文字列を含むデータを取得したい場合に、Like演算子を使用します。
WHERE カラム名 LIKE '文字' で特定の文字列を含むデータを取得出来ます。

検索対象には、ワイルドカードを使用する事が主です。
下記をよく使用します。


|  ワイルドカード文字|  説明  |
| ---- | ---- |
|  %　|  0個以上の文字  |
|  _ 　|  任意の一文字  |

LIKE句を使用して、ドラゴンが含まれるデータを取得します。

```:ドラゴンが含まれるデータを取得
1> SELECT * FROM VANILLA WHERE name LIKE '%ドラゴン%';
2> GO
code        level       attack      defense     name
----------- ----------- ----------- ----------- ------------------------------
          2           8        3000        2500 ブルーアイズホワイトドラゴン
          8           3        1200         700 ベビードラゴン

(2 行処理されました)
```

業務上でも、WHERE句/ORDER BY句/LIKE演算子の使用頻度は高いです。
というか、SELECT文とかALTER文しかほぼ使ってないです。(検証の時にINSERT文/UPDATE文書く位です、、)

最近は業務で触る機会がないので、こういった自己学習を設けないと駄目ですね。

何かの参考になれば、幸いでございます。
以上です。