MYSQL入門

# 個人的リマインド用
参考
[【MySQL入門決定版】2時間半で学ぶ初心者向けMySQLデータベースチュートリアル【MySQLの基本とSQLの基礎文法の徹底的にマスター】](https://qiita.com/shin1rok/items/a2c0dd6c136c1b9a8803)

# 1
**前提**
PHPを使う。
目標はデータベースでのCRUD操作。
World Databaseっていう世界の都市情報が入ったデータベースを用意したので、次回はこれを使って操作していく。

# 2
RDBの特徴
**・データの強い生合成**
ヘンテコなデータが生まれにくい。
**・柔軟な検索**
SQLを使うことで思いのままに操ることができる。

### 検索メインで練習
MYSQLの用語
**データベース**
テーブルをいくつか集めたもの。
**テーブル**
データの集まりのこと。表形式で管理されている。
行(レコード)が1つのデータ、列(属性、カラム)がデータの属性で名前と型からなる。

**データの取得(SELECT文)**
```sql
select ID, Name, Poplation from city;
(select カラム from テーブル名)

select * from city; 全て持ってくる
```
**SELECT文の実行結果はテーブルで返ってくる**

# 3
**制限**
ある条件を満たすレコードのみを取り出す操作(レコードの検索)

**データを制限して取得(Where句)**
```sql
select カラム名1 カラム名2 from テーブル名 where 条件式;
```
**投下演算(=)**
与えられた2つの値が等しいかどうかをチェックする
```sql
select ID, Name from city where Name = 'Tokyo';
```
※TRUEだと1を返し、FALSEだと0を返す。そして1のものだけを抽出するので、
```sql
select * from city where 1;
```
これを実行すると全て抽出できる。

# 4
**大小関係での抽出**
```sql
select * from city where Population >= 1000000;
```
char型に対しても大小関係で抽出でき、その場合は辞書順になる。
```sql
selet * from city where CountryCode > 'Y';
文字列の最初がY含め、それ以降の文字から始まるものを抽出する
```
**等しくないものの抽出(!=)**
```sql
select * from city where CountryCode != 'JPN';
日本以外を全て抽出
```
**複数の条件で抽出(AND BETWEEN OR IN)**
```sql
AND BETWEEN
select * from city where CountryCode = 'JPM' and Population > 500000;
select * from city where Population between 400000 and 500000;
select * from city where Population not between 400000 and 500000;

OR in
select * from city where CountryCode = 'JPN' or Population > 500000;
select * from city where CountryCode in ('FRA', 'ITA');
どちらかでも含まれていたら、それを抽出
select * from city where CountryCode not in ('FRA', 'ITA');
FRA,ITA以外を抽出
```

# 5
**曖昧な文字列の検索**

**あるキーワードを含んでいる、から始まる(like)**
```sql
select * from city where Name like 'ab%'
abから始まる都市名を抽出

select * from city where Name like '___'
3文字の都市名を抽出
```
**ワイルドカード文字(% _)**
% → 全ての文字代わりに使える万能なもの(0文字以上のあらゆる文字列)
_ → 何かしらの1文字

**検索結果の並べ替え(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 limit 10;
上から10件
```

# 6
**データベースの作成(create)**
```sql
create database データベース名;
```
**テーブルの作成(create)**
```sql
create table users (
    id int,
    name varchar(10)
);
```
**レコードの作成(insert)**
```sql
insert into users (id, name) values (1, 'yorozuya');
```
※上で決めた型じゃなくても挿入でき、長さを超えても勝手に整えられるだけで挿入できる。しかし警告は出してくる。正直、これは嬉しくないので**Strictモード(厳格モード)** というものがある。これを使うと入らずに、エラーとしてくれる。使い方は直接ファイルに記述する。

# 7
**テーブルのキー**

**主キー(PK)**
テーブルの中のデータを1つ特定するための属性が主キー。候補キーから1つ選んで主キーとする。

**候補キー**
複数のデータの集まりから1つのデータを特定できる属性(候補キーは1つとは限らない)
例:都道府県は候補キーだが、県庁所在地も候補キーになれるといったように、複数存在する。

**複合キー**
ある属性とある属性を組み合わせて、データ1つ特定する。
例:巨人という球団の背番号10とか

**ID**
レコードを一意に特定するためにシステムによって発行された属性

**主キーの設定方法**
```sql
create table users (
    id int primary key,
    name varchar(10)
);
```
**複合キーの設定方法**
```sql
create table users (
    id int,
    name varchar(10),
    primary key(id, name)
);
```

# 8
**レコードの更新・削除**
※型について → int型は32bit、tinyint型は8bit(-128~127)。データベースの容量を4倍削減できるので、100を絶対超えないカラムにはtinyint型を使う。

**大量のデータを一度に挿入する**
```sql
insert into users
  (id, name, sex, birthday)
values
  (1, '田中太郎', 1, '1987-01-20'),
   .
   .
   .
```

**更新(update)**
```sql
update users
set name = 'さとう', birthday = '1999-10-20'
where id = 1;
```

**削除(delete)**
```sql
delete from users where id = 1;
```

# 9
**集計関数**
count,sum,avgなどなど

**合計(sum)**
```sql
select sum(population) from country;
カラム名に名前をつける
select sum(population) as WorldPopulation from country;

※数字を見やすくしてくれる
select format(sum(population), 0) from country;
```
~特定のまとまりごとに求めたい(group by)
```sql
select sum(population) from country group by Continent;
大陸ごとの人口

group byは複数選択できる
group by Continent, GovermentForm
```
**グループ化した後に絞り込み(having)**
whereだとグルーピングの前に絞り込み
```sql
select sum(population) from country group by Continent
having ContinentPopulation > 10000000; 
```

# 10
**データの結合**
どんな時に使うのか(例):東京の人口は日本全体の人口の何％かを求めたい。
まずは東京の人口を抽出。
```sql
select name, population from city where name = 'Tokyo';
```
しかし日本の人口がcityテーブルに入っていない。countryテーブルにある。こんな時に使うのが**joinで横に結後する。**

※テーブル同士のつながりのことを**リレーションシップ**という。

cityテーブルの方にはCountryCodeがあり、countryテーブルには同様のデータであるCodeがある。

```sql
select * from city join country on city.countrycode = country.code;
```
結合ができたのでコードを変えて、
```sql
select id, city.name, city.population, county.population from city 
join country on city.countrycode = country.code
where city.name = 'Tokyo';
```
最後に割合を求めるコードに
```sql
select 
  id, 
  city.name, 
  city.population, 
  county.population,
  city.population / country.population as ratio 
from city join country on city.countrycode = country.code
where city.name = 'Tokyo';
```