はじめに
データ分析するにあたってSQLを使いこなせるようになる必要が出てきました。
ですので、ここに自分の為の備忘録として、SQL文を用途に応じて列挙しておきます。
SQLとは
Structured Query Languageの略で、リレーショナルデータベース(RDB)の操作を行うための言語です。
SQLはデータベースやテーブルに対して様々な命令を行いますが、その命令は大まかに2つに分けることができます。
それは、データを定義するDDL(Data Definition Language)と、データを操作するDML(Data Manipulation Language)です。
- DDLの出来ること
命令 | 機能 |
---|---|
CREATE | データベースやテーブルの作成 |
ALTER | データベースやテーブルの更新 |
DROP | データベースやテーブルの削除 |
- DMLの出来ること
命令 | 機能 |
---|---|
INSERT | データの登録 |
UPDATE | データの更新 |
DELETE | データの削除 |
SELECT | データの検索 |
コマンド群
SQLは大文字で記述されることが多いですが、個人的には、小文字で記述することが大半なので、LOWERCASEで書いていきます。
まずは、mysqlにユーザ名rootで接続します。
$ mysql -u root
データベース一覧を表示
mysql> show databases;
データベース(仮:sql_practice)を作成
mysql> create database sql_practice
利用データベースを選択
mysql> use sql_practice;
テーブルの一覧を表示
mysql> show tables;
カラムの型と名前を指定しテーブル作成
mysql> create table users (id int, family_name varchar(255), first_name varchar(255));
テーブル構造を確認
mysql> show columns from users;
テーブル構造の変更(カラム追加)
mysql> alter table users add (email varchar(255), profile_photo varchar(255));
テーブル構造の変更(カラム名変更)
mysql> alter table users change profile_photo image varchar(255);
テーブル構造の変更(カラム削除)
mysql> alter table users drop image;
取得するカラムを指定
mysql> select family_name from users;
全てのカラムを取得
mysql> select * from users;
取得するレコードの制限
mysql> select * from users where family_name = "古川";
論理演算子で制限(AND)
mysql> select * from users where age <= 25 and prefecture = "大阪";
論理演算子で制限(OR)
mysql> select * from users where age >= 25 or prefecture = "大阪";
論理演算子で制限(NOT)
mysql> select * from users where not prefecture = "大阪";
単一カラムの範囲検索
mysql> select * from users where age between 20 and 25;
単一カラムのリスト検索
mysql> select * from users where prefecture in ("大阪", "京都");
データの結合
mysql> select concat(family_name, first_name) from users;
検索結果のカラム名の変更
mysql> select concat(family_name, first_name) as "名前" from users;
asは省略できます。
mysql> select concat(family_name, first_name) "名前" from users;
重複する行の除外
mysql> select distinct user_id from tweets where data = "2018-07-07";
レコードのグループ化
mysql> select user_id from tweets where data = "2018-07-07" group by user_id;
distinct
と一見同じように見えるが、こちらは、グループ単位で集計した結果を取得することが出来る。
レコードの数を数える
mysql> select user_id, count(*) from tweets where date = "2018-07-07" group by user_id;
これは、2018-07-07に誰が、何回ずつツイートしたか、を表しています。
カラム名の変更
mysql> select user_id, count(*) as "ツイート数" from tweets where date = "2018-07-07" group by user_id;
テーブルの結合
mysql> select user_id, count(*) "ツイート数", u.* from tweets t join users u on t.user_id = u.id where date = "2018-07-07" group by user_id;
JOIN
を使用すると、複数のテーブルの、指定したカラムの値が一致するデータを結合することが出来る。
検索結果を用いた検索(サブクエリ)
mysql> select * from users where id not in (select distinct user_id from tweets where date = "2018-07-07");
これは、2018-07-07にツイートしていない人を取得しています。
まとめ
備忘録としてまとめたため、読み手に配慮された説明がなされていなかったかもしれませんが、ご容赦ください。
役に立った方は、いいね、お願いします(^^)