MySQL,SQL文について自分の言葉で説明してみる。

##MySQLとは
リレーショナルデータベース管理システムの一種のこと。

###リレーショナルデータベース管理システム(RDBMS)とは
リレーショナルデータベースを管理するためのソフトウェアのこと
MySQL以外にもMicrosoft SQL Server,PostgreSQL,SQLiteなどがある。

###リレーショナルデータベースとは
世界で最も有名な種類のデータベースで、行と列によって構成された「表形式のテーブル」と呼ばれるデータの集合を、互いに関連付けて関係モデルを使ったデータベースのこと。
いくつかあるデータベースの種類の一つ（他にも階層型、NoSQLなどがあります。）

まとめると、データベースという大枠の中に階層型、リレーショナル型、NoSQL、ネットワーク型などがあり、リレーショナル型のデータベースを管理するシステムのことをRDBMS、このRDBMSの一つがMySQL。
![スクリーンショット 2021-05-11 16.08.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185431/ec79e112-b2f6-b1fa-7c9b-e9bfef40416a.png)

##SQLとは
RDBMSを操作するための言語のこと。
以下のようなことができる。


- データの検索
- データの追加
- データの更新
- データの削除
- テーブルの作成
- テーブルの削除
- テーブルの主キーの設定
- ユーザー権限の付与

##データベース・レコードの作成、削除、更新など
####データベースの作成

```sql
create database first_app_develop;
```

####データベースの削除

```sql
drop detabase first_app_develop;
```

####テーブル・カラムの作成
varchar= variable length（可変長文字列）

```sql
create table users (
   id int,
   name varchar(10)
);
```

####レコードの追加

```sql
insert into users (id,name) values (1,'satou');
```
####レコードの更新

```sql
update users
set name ='佐藤', birthday = '1997-01-01'
where id = 1;
-- whereは省力可。whereの条件に合致するものは全て書き換わる
```
###レコードの削除

```sql
delete from users where id = 1;
-- update同様に条件に合致するものは全て削除される
```


##SELECT文
リレーショナルデータベースのテーブル（表）の行を読み取るためのSQL構文
処理結果はテーブルを返す

```sql
select 'カラム名' from 'テーブル名';
-- selectやfromは大文字でも小文字でもok

select 'カラム名1', 'カラム名2' from 'テーブル名';
--　カラム名は複数指定もできる
```

また、アスタリスクを使用すると全てのカラムを取得できる

```sql
select * from city ;
-- selectは条件に合致した情報を取得し、新しくテーブルを作ってくれる
```
※MySQLのサイトの[world database](https://dev.mysql.com/doc/index-other.html)というデータベースを使って練習したので、これから出てくるテーブル名やカラム名は全てworld databaseにあるものになります。

##WHERE句
テーブルデータの**検索条件を指定するためのSQL構文**
SELECT文やUPDATE文と組み合わせて使う

```sql
select 'カラム名' from 'テーブル名' where '条件式';
```

####等価演算

```sql
select * from city where Name = 'Tokyo';
-- cityテーブルにあるNameカラムがTokyoとなってるレコードを取得
-- プログラミング言語だとイコール一つは代入になるが、SQLに代入操作がないためイコールは一つ
```

MySQLでは条件に合致しTRUEになると1になり、FALSEは0になる。

```sql
select * from city where 1;
-- 全てのレコードが得られる

select * from city where 0;
--　何も得られない
```

####大小演算子


```sql
select * from city where Population >= 1000000;
-- 人口1000000人以上の都市を取得

select * from city where Population > 1000000;
-- 人口1000000人より大きい都市を取得

select * from city where CoutntryCode > 'Y';
-- 文字列の大小比較の場合辞書順での比較になる
-- YよりもあとのCoutryCodeカラムのデータを取得
```

####非等価比較

```sql
select * from city where CountryCode != 'JPN';
-- CountryCodeがJPNではないものを取得
```

####AND,BETWEEN,IN
```sql
-- AND
select * from city where CoutntryCode = 'JPN' and Population > 500000;

-- BETWEEN
select * from city where Population between 400000 and 500000;
-- cityテーブルにあるPopulationカラムが400000 ~ 500000の都市を取得

-- IN
select * from city where CountryCode in ('FRA','ITA')
-- CountryCodeがフランスもしくはイタリアのものを取得
select * from city where CountryCode not in ('FRA','ITA')
-- フランスまたはイタリア以外の以外を取得
```

###LIKE句（あいまい検索）

ワイルドカード文字

- % : 0文字以上のあらゆる文字列
- _ : 任意の１文字

####%（0文字以上の文字列）
```sql
select * from city where Name like 'ab%';
-- cityテーブルからNameカラムからabで始まる文字を取得

select * from city where Name like '%ab';
-- cityテーブルからNameカラムのabで終わる都市の名前を取得

select * from city where Name like '%ab%';
-- abを含む都市を検索
```

####_（任意の1文字）
文字数が分かってる場合便利

```sql
select * from city where CountryCode like 'JP_';
-- JPの後に続く一文字。

-- アンダースコアが3つの場合
select * from city where Name like '___';
-- Nameカラムが3文字のものを取得
 
select * from city where Name like '___' and Population > 100000;
-- 他の条件式も組み合わせできる
```
####ORDER BY
ソートできる（デフォルトだと昇順）

```sql 
order by 'カラム名'
-- カラム名順に並べ替えることができる
```

```sql 
select * from city where CountryCode = 'JPN' order by Population;
--昇順に並ぶ

select * from city where CountryCode = 'JPN' order by Population desc;
-- 降順に並ぶ
```

####LIMIT句
検索数を制限する

```sql
select * from city where CountryCode = 'JPN' order by Population desc limit 5;
-- cityテーブルにあるCountryCodeがJPNで人口が上位5件のものを降順で取得
```
####OFFSET句
データを取得する開始位置を指定する
例えばOFFSETを4に指定した場合最初から4番目のデータを飛ばし、5番目のデータから取得する

```sql
select * from user limit 3 offset 4;

-- 5番目のユーザーから三人分取得できる
```

##集計関数
平均値，合計値，最大値，最小値などを算出することができる

```sql
select sum(population) from country;
-- coutryテーブルの人口を合計する
```

![スクリーンショット 2021-06-05 16.26.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185431/d61bf3dc-719f-84e3-2a48-8df753295cec.png)


####as句
select文で作成したテーブルに新しくカラム名を決められる

```sql
select format(sum(population),0) as WorldPoupulation from country;
-- format関数で三桁をカンマ区切りにする。
```
![スクリーンショット 2021-06-05 16.23.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185431/cee68a75-7de2-d824-67b9-036339f02d68.png)

####GROUPBY句

```sql
select Continent, format(sum(population),0) as ContinentPoupulation from country group by Continent;
```
![スクリーンショット 2021-06-05 16.31.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185431/f048547a-e5b0-3dae-aaad-669879adde27.png)


##JOIN
テーブルの結合を行い、他のテーブルを横に繋げることができる

cityテーブルとcountryテーブルを結合したテーブルを作成
on以降はそれぞれどのカラムが紐づいてるかが書いてある

```sql
select * from city join country on city.countrycode = country.code;
```

#####cityテーブルとcountryテーブルをjoinして、日本の人口と東京の人口、日本の人口に対する東京の人口の割合を出してみる

```sql
select 
   id, 
   city.name,
   city.population as CityPopulation, 
   country.population as CountryPopulation,
   city.population / country.population as ratio
from city join country on city.countrycode = country.code
where city.name = 'Tokyo';
```
cityテーブルとcountryテーブルどちらにもあるカラムにはどちらのカラムのことかを明示する必要がある
![スクリーンショット 2021-06-05 18.21.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185431/5d00d5e4-42a7-c75d-a9e8-1e9fa5d53af1.png)