SQL入門！ SELECT 編

#SQLの基本のキ

+ SELECT 項目名1,項目名2,… FROM テーブル名 WHERE 条件;
+ INSERT INTO テーブル名 VALUES(値1,値2…);
+ UPDATE テーブル名 SET 項目名 = 値 WHERE 条件;
+ DELETE FROM テーブル名 WHERE 条件;

**※文の終わりに「;」を付けるのをお忘れなく！**

----

環境
　Windows 10
　MySQL : version(5.7.28)
使用アプリ
　コマンドプロンプト(Windowsマーク押して「cmd」って打ったら出てくるやつ)

----

#MySQLサーバーに接続

    mysql -u root -p

上記のコマンドを入力すると、パスワードを求められるのでパスワードを入れる。(MySQLインストール時に設定したパスワードを使います)

![コメント 2020-09-09 094324.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619833/50fff46c-761a-e11b-3d0e-5e21c7238bf3.jpeg)

接続成功
![コメント 2020-09-09 094611_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619833/4bb891a2-d7c3-e5c2-fd93-adec8a928f78.jpeg)

#MySQLの終了
    quit;

上記のコマンドを入力し、Enterを押すだけ
![コメント 2020-09-09 095543.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619833/91d8d21c-227b-70b2-d992-1849346b901c.jpeg)
「Bye」と表示され、そのあとの行で通常のコマンド入力待機位置になっていれば成功です。

#データベースの操作
MySQLが無料で公開しているデータを拝借して、テーブルの操作をしていきたいと思います。

MySQLが無料公開しているデータのDL方法は下記の記事を参考にしました。
> [【SQL】MySQL公式サンプルでデータベースを使う](https://qiita.com/yukibe/items/fc6016348ecf4f3b10bf)

    mysql> SHOW DATABASES;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    | world              |
    +--------------------+
    9 rows in set (0.00 sec)

**データベース名 : world**

    mysql> SHOW TABLES;
    +-----------------+
    | Tables_in_world |
    +-----------------+
    | city            |
    | country         |
    | countrylanguage |
    +-----------------+
    3 rows in set (0.00 sec)

**テーブル名 : city**

    mysql> SELECT * FROM city LIMIT 10;
    +----+----------------+-------------+---------------+------------+
    | ID | Name           | CountryCode | District      | Population |
    +----+----------------+-------------+---------------+------------+
    |  1 | Kabul          | AFG         | Kabol         |    1780000 |
    |  2 | Qandahar       | AFG         | Qandahar      |     237500 |
    |  3 | Herat          | AFG         | Herat         |     186800 |
    |  4 | Mazar-e-Sharif | AFG         | Balkh         |     127800 |
    |  5 | Amsterdam      | NLD         | Noord-Holland |     731200 |
    |  6 | Rotterdam      | NLD         | Zuid-Holland  |     593321 |
    |  7 | Haag           | NLD         | Zuid-Holland  |     440900 |
    |  8 | Utrecht        | NLD         | Utrecht       |     234323 |
    |  9 | Eindhoven      | NLD         | Noord-Brabant |     201843 |
    | 10 | Tilburg        | NLD         | Noord-Brabant |     193238 |
    +----+----------------+-------------+---------------+------------+
    10 rows in set (0.00 sec)

「city」テーブルを使ってSELECT文を実行していきたいと思います。
*※数が多いので10個まで表示するというオプションを付けています*


#SELECT

**SELECT** カラム名 **FROM** テーブル名;

>SELECT ⇒ 「どのカラムのデータを？」
FROM ⇒ 「どのテーブルの？」

実行例 :「city」テーブルの「Name」カラムのデータを10件抽出
![スクリーンショット 2020-09-12 104637.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619833/3b809a29-5c66-0988-3010-1c9ed1b64eac.jpeg)
*※データ数が多いので「10個だけデータを抽出する」というオプションを付けています*

**複数のカラムデータを取得する**

 > **SELECT** カラム名, カラム名 **FROM** テーブル名;
複数のカラムデータを取得するときはカラム名を「,」で区切ります。

実行例 :「city」テーブルの「Name」と「Population」カラムのデータを10件抽出
![スクリーンショット 2020-09-12 105135.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619833/3fbe91c2-b92a-9735-6413-b8e895cbb6bc.jpeg)
*※データ数が多いので「10個だけデータを抽出する」というオプションを付けています*


**すべてのカラムデータを取得する**
> **SELECT** * **FROM** テーブル名; 
全カラムデータを取得するときは「*」を使います。

実行例 : 「city」テーブルの全カラムデータを10件抽出
![スクリーンショット 2020-09-12 105447.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619833/3bd1a533-b02a-5dfc-3703-5ab82b813c6f.jpeg)
*※データ数が多いので「10個だけデータを抽出する」というオプションを付けています*

#WHERE句

> **SELECT** * **FROM** テーブル名 **WHERE** 条件式;
WHERE 〇〇 **=** △△　⇒ **WHERE**のあとに「=」を付けて、「〇〇が△△である」という条件にマッチしたデータを取得することができます。

実行例 :「city」テーブルの「ID」カラムの「IDが33」のデータを抽出
![スクリーンショット 2020-09-12 110034.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619833/5888c308-ac8f-8c80-e1c4-47de70082bab.jpeg)


※ *△△を指定する際の注意点として、数値データはそのまま数字を指定し、テキストデータや日付データの場合は「''」もしくは「""」で指定部分を囲まなくてはいけない。

**主なデータ型**

+ テキストデータ　⇒　WHERE 〇〇 = "名前";
+ 整数値　⇒　WHERE 〇〇 = 11111
+ 日付データ　⇒　WHERE 〇〇 = "2020-01-01"
 
#比較演算子
> **SELECT** * **FROM** テーブル名 **WHERE** 条件式;
>WHERE 〇〇 **>=** △△　⇒ **WHERE**のあとに「>=」を付けて、「〇〇が△△以上であるもの」という条件に当てはまったデータを取得することができる。

実行例 :「city」テーブルの「Population」カラムのデータで「25万人以上」のデータを10件抽出
![スクリーンショット 2020-09-12 234207.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619833/e329e453-0cb8-7c31-1b51-21a82d7205b4.jpeg)


**比較演算子の種類**

+ a `=` b　⇒　a と b が**等しい**
+ a `<` b　⇒　a が b より**小さい**
+ a `<=` b　⇒　a が b より**小さい**または、a が b と**等しい**
+ a `>` b　⇒　a が b より**大きい**
+ a `>=` b　⇒　a が b より**小さい**または、a が b と**等しい**
+ a `<>` b　⇒　a が b と**等しくない**(`!=`も一緒の意味)


#LIKE演算子
> **SELECT** カラム名 **FROM** テーブル名 **WHERE** 〇〇 **LIKE** 文字列;
LIKE 文字列 ⇒ 「～のような(～を含む)」

実行例 : 「city」テーブルの「Name」カラムで"Tir"が含まれているデータを抽出
![スクリーンショット 2020-09-12 235824.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619833/a50d020c-d6f8-421a-8bd4-ccf45bfdd731.jpeg)


**LIKE演算子を使う際に覚えておく必要があるもの**

+ ワイルドカード「`%`」

    "%東京%" ⇒「東京」の前後のワイルドカードにより、「東京」を含むデータが取得できる(テキストデータや日付データは「%」の外を「"」または「'」で囲む)

    "東京%" ⇒ 前方一致。「東京」で**始まる**データを取得できる

    "%東京" ⇒ 後方一致。「東京」で**終わる**データを取得できる

+ `BINARY`

    大文字小文字を区別したい場合はLIKE演算子のあとに付ける「BINARY」を付ける

+ 任意の一文字を表す「`_`」
実行例 : 「Name」カラムで「〇〇c（任意の二文字がcの前に入る都市名）」で始まる名前のデータを5件抽出
![スクリーンショット 2020-09-18 100508.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619833/6856e8df-b379-a2f6-12ba-792f3fba0553.jpeg)

+ エスケープ「`\`」

 文中に`%`や`_`が入ったデータを抜き出したい場合は`\`を`%`や`_`の前に付けてあげる
例 : 

    SELECT * FROM テーブル名 WHERE カラム名 LIKE "%\%%";
    SELECT * FROM テーブル名 WHERE カラム名 LIKE "%\_%";




#NOT演算子
> **SELECT** * **FROM** テーブル名 **WHERE** **NOT** 条件;
WHERE NOT 条件 ⇒ 「条件を満たさないデータ」
WHERE NOT カラム名 LIKE "%△△%" ⇒ 「カラム名の△△と一致しないデータ」

実行例 :「city」テーブルの「Population」カラムで「800万人」より**少なくない**データを抽出
![スクリーンショット 2020-09-13 000652.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619833/db126780-a748-1d8e-037e-58585e695aaa.jpeg)

#IS NULL
> **SELECT** * **FROM** テーブル名 **WHERE** 〇〇 **IS NULL**;
IS NULL ⇒ 「～がNULLである」
WHERE 〇〇 IS NULL ⇒ 指定した〇〇(カラム)のデータが「NULL」**である**ものを取得する

#IS NOT NULL
> **SELECT** * **FROM** テーブル名 **WHERE** 〇〇 **IS NOT NULL**;
IS NOT NULL ⇒ 「～がNULLではない」
WHERE 〇〇 IS NOT NULL ⇒ 指定した〇〇(カラム)のデータが「NULL」**ではない**ものを取得する

**「NULL」に関連するデータを取得する際に、「=」は使えないので注意してください。**

#AND演算子
> **SELECT** * **FROM** テーブル名 **WHERE** 条件1 **AND** 条件2;
WHERE 条件1 AND 条件2 ⇒ 「条件1と条件2、**どちらの条件も満たす**データを取得する」

実行例 :「city」テーブルの「CountyrCode」が"USA"かつ、「Population」が"9万人以下"のデータを抽出
![スクリーンショット 2020-09-13 001817.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619833/f7deb1fa-920c-fed3-4b1f-e5924921b311.jpeg)

###BETWEEN
「〇〇以上〇〇以下」という条件の場合のみ、`BETWEEN`を使って書き換えることができる
実行例 : 「Population」カラムで**10000以上30000以下**のデータだけを5件抽出
![スクリーンショット 2020-09-18 095309.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619833/5c896344-e9c9-143e-3e58-438966916432.jpeg)

実行例 : 「Population」カラムで**10000以上30000以下ではない**データを5件抽出
![スクリーンショット 2020-09-18 095353.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619833/d6132a6f-2370-6cd3-12ea-4ca5b504730d.jpeg)


#OR演算子
> **SELECT** * **FROM** テーブル名 **WHERE** 条件1 **OR** 条件2;
 WHERE 条件1 OR 条件2 ⇒ 「条件1と条件2、**どちらかの条件を満たす**データを取得する」

実行例 :「city」テーブルの「CountyrCode」が"AUS"もしくは、「Population」が"100万人以上"のデータを抽出
![スクリーンショット 2020-09-13 002806.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619833/10e7ba66-d244-7af9-1bb3-587bf6d3f61e.jpeg)

###IN
`=`で判定する条件を`OR`で繋いだ場合、`IN`を使って書き換えるできる
実行例 : 「Population」カラムで**237500もしくは127800**であるデータを抽出
![スクリーンショット 2020-09-18 095900.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619833/f5c8e30e-9549-fdea-4199-0a9c4aae3620.jpeg)

実行例 : 「Population」カラムで**237500もしくは127800ではない**データを5件抽出
![スクリーンショット 2020-09-18 095935.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619833/89a9b440-4d21-c1f2-079f-71c4777f76c1.jpeg)



#ORDER BY
> **SELECT** * **FROM** テーブル名 **ORDER BY** 並べたいカラム名 並べ方;
**SELECT** * **FROM** テーブル名 **WHERE** 条件 **ORDER BY** 並べたいカラム名 並べ方;
ORDER BY ⇒ 「～順に並べる」
**並べ方**
「ASC (昇順) 」⇒ 1, 2, 3...99 (小さい数から大きい数に向かって並べる)
「DESC (降順) 」⇒ 99...3, 2, 1 (大きい数から小さい数に向かって並べる)

実行例 :「city」テーブルの「CountryCode」が"USA"かつ、「Population」が"100万以上"のデータを「ASC(昇順)」に並べて抽出
![スクリーンショット 2020-09-13 010057.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619833/77065cbe-6e06-5d31-177f-d60f4733d887.jpeg)


#LIMIT
>**SELECT** * **FROM** テーブル名 **LIMIT** 数字;
**SELECT** * **FROM** テーブル名 **WHERE** 条件 **LIMIT** 数字;
LIMIT データの件数; ⇒ 「取得するデータの件数を指定する」

実行例 :「city」テーブルの全カラムデータを10件抽出
![スクリーンショット 2020-09-12 105447.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619833/3222fb1f-07c6-11af-8d65-a606b7d696c6.jpeg)


#ORDER BY と LIMIT の組み合わせ
> **SELECT** * **FROM** テーブル名 **ORDER BY** 並べたいカラム名 並べ方 **LIMIT** 数字;

実行例 :「city」テーブルの「ID」カラムを「DESC(降順)」に並べて10件抽出
![スクリーンショット 2020-09-13 003856.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619833/962d2fbc-b459-b2db-e042-5b51e93b571e.jpeg)

#WHERE, LIKE, ORDER BY, LIMITを使った組み合わせ順

    SELECT * FROM テーブル名 WHERE カラム名 LIKE "◯%" ORDER BY 並べたいカラム名 並べ方 LIMIT 件数;

#OFFSET
> **SELECT** * **FROM** テーブル名 **ORDER BY** 並べたいカラム名 並べ方 **LIMIT** 数字 OFFSET 数字（先頭から除外したい件数）;
実行例 :「city」テーブルの「ID」カラムを「DESC(降順)」に並べて、先頭の2件を除外した10件を抽出
![スクリーンショット 2020-09-18 153826.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/619833/2c5c70ef-8c49-35fb-a24b-067e2b47c501.jpeg)


#終わりに
ここの実行例で書いたクエリですが、もっと簡潔に書けたりするのかもしれません。
そこら辺も、これから勉強を続けていけば見えてくるかも知れないので楽しみです。
まだまだSQLの入り口的な内容かと思いますが、SQLの奥の深さとデータを抽出する楽しさが知れたような気がします。
引き続き、基礎をやっていきたいと思います。

※9/18　加筆

+ BINARY
+ _
+ BETWEEN
+ IN
+ \
+ OFFSET

**SQL（MySQL）関連の投稿**
1. [SQL入門！ CREATE 編（データベース）](https://qiita.com/h0iga3shi13/items/0fe741a34bc4ad1e4dc0)
2. [SQL入門！ テーブル作成・削除・変更 編](https://qiita.com/h0iga3shi13/items/0a391f8d77a289506b58)