##MySQLとは
リレーショナルデータベース管理システムの一種のこと。
###リレーショナルデータベース管理システム(RDBMS)とは
リレーショナルデータベースを管理するためのソフトウェアのこと
MySQL以外にもMicrosoft SQL Server,PostgreSQL,SQLiteなどがある。
###リレーショナルデータベースとは
世界で最も有名な種類のデータベースで、行と列によって構成された「表形式のテーブル」と呼ばれるデータの集合を、互いに関連付けて関係モデルを使ったデータベースのこと。
いくつかあるデータベースの種類の一つ(他にも階層型、NoSQLなどがあります。)
まとめると、データベースという大枠の中に階層型、リレーショナル型、NoSQL、ネットワーク型などがあり、リレーショナル型のデータベースを管理するシステムのことをRDBMS、このRDBMSの一つがMySQL。
##SQLとは
RDBMSを操作するための言語のこと。
以下のようなことができる。
- データの検索
- データの追加
- データの更新
- データの削除
- テーブルの作成
- テーブルの削除
- テーブルの主キーの設定
- ユーザー権限の付与
##データベース・レコードの作成、削除、更新など
####データベースの作成
create database first_app_develop;
####データベースの削除
drop detabase first_app_develop;
####テーブル・カラムの作成
varchar= variable length(可変長文字列)
create table users (
id int,
name varchar(10)
);
####レコードの追加
insert into users (id,name) values (1,'satou');
####レコードの更新
update users
set name ='佐藤', birthday = '1997-01-01'
where id = 1;
-- whereは省力可。whereの条件に合致するものは全て書き換わる
###レコードの削除
delete from users where id = 1;
-- update同様に条件に合致するものは全て削除される
##SELECT文
リレーショナルデータベースのテーブル(表)の行を読み取るためのSQL構文
処理結果はテーブルを返す
select 'カラム名' from 'テーブル名';
-- selectやfromは大文字でも小文字でもok
select 'カラム名1', 'カラム名2' from 'テーブル名';
-- カラム名は複数指定もできる
また、アスタリスクを使用すると全てのカラムを取得できる
select * from city ;
-- selectは条件に合致した情報を取得し、新しくテーブルを作ってくれる
※MySQLのサイトのworld databaseというデータベースを使って練習したので、これから出てくるテーブル名やカラム名は全てworld databaseにあるものになります。
##WHERE句
テーブルデータの検索条件を指定するためのSQL構文
SELECT文やUPDATE文と組み合わせて使う
select 'カラム名' from 'テーブル名' where '条件式';
####等価演算
select * from city where Name = 'Tokyo';
-- cityテーブルにあるNameカラムがTokyoとなってるレコードを取得
-- プログラミング言語だとイコール一つは代入になるが、SQLに代入操作がないためイコールは一つ
MySQLでは条件に合致しTRUEになると1になり、FALSEは0になる。
select * from city where 1;
-- 全てのレコードが得られる
select * from city where 0;
-- 何も得られない
####大小演算子
select * from city where Population >= 1000000;
-- 人口1000000人以上の都市を取得
select * from city where Population > 1000000;
-- 人口1000000人より大きい都市を取得
select * from city where CoutntryCode > 'Y';
-- 文字列の大小比較の場合辞書順での比較になる
-- YよりもあとのCoutryCodeカラムのデータを取得
####非等価比較
select * from city where CountryCode != 'JPN';
-- CountryCodeがJPNではないものを取得
####AND,BETWEEN,IN
-- 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文字以上のあらゆる文字列
- _ : 任意の1文字
####%(0文字以上の文字列)
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文字)
文字数が分かってる場合便利
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
ソートできる(デフォルトだと昇順)
order by 'カラム名'
-- カラム名順に並べ替えることができる
select * from city where CountryCode = 'JPN' order by Population;
--昇順に並ぶ
select * from city where CountryCode = 'JPN' order by Population desc;
-- 降順に並ぶ
####LIMIT句
検索数を制限する
select * from city where CountryCode = 'JPN' order by Population desc limit 5;
-- cityテーブルにあるCountryCodeがJPNで人口が上位5件のものを降順で取得
####OFFSET句
データを取得する開始位置を指定する
例えばOFFSETを4に指定した場合最初から4番目のデータを飛ばし、5番目のデータから取得する
select * from user limit 3 offset 4;
-- 5番目のユーザーから三人分取得できる
##集計関数
平均値,合計値,最大値,最小値などを算出することができる
select sum(population) from country;
-- coutryテーブルの人口を合計する
####as句
select文で作成したテーブルに新しくカラム名を決められる
select format(sum(population),0) as WorldPoupulation from country;
-- format関数で三桁をカンマ区切りにする。
####GROUPBY句
select Continent, format(sum(population),0) as ContinentPoupulation from country group by Continent;
##JOIN
テーブルの結合を行い、他のテーブルを横に繋げることができる
cityテーブルとcountryテーブルを結合したテーブルを作成
on以降はそれぞれどのカラムが紐づいてるかが書いてある
select * from city join country on city.countrycode = country.code;
#####cityテーブルとcountryテーブルをjoinして、日本の人口と東京の人口、日本の人口に対する東京の人口の割合を出してみる
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';