Progate SQL
SQL I
基本用語
- テーブル: 表
- カラム: 列
- レコード: 行
- SLQ: クエリを書くための言語。大文字小文字を区別しない。
- クエリ: データベースに送る命令。改行の有無に関わらず,
;
までが1つの命令。(例:SELECT hoge FROM fuga;
)
抽出
SELECT カラム名
: 取り出すカラムの指定SELECT カラム1, カラム2
のように複数カラムを指定可能。(全カラムを指定するときはSELECT *
とする)
FROM テーブル名
: 対象となるテーブルの指定WHERE カラム名=値
: カラム名の項目が値となるレコードのみを取り出す- 値
- 文字列, 日付: " または ' で囲む必要がある (例: "2017-07-01")
- 数値 : 囲まない
- 演算子
- 条件式:
date >= "2017-07-01"
は "2017-07-01"以降の値なら真- 否定:
NOT hoge=3
AND
,OR
- 否定:
WHERE name IS NULL
: nameカラムがNULLであるデータを取り出す (<->IS NOT NULL
)name = NULL
は不可
並べ替え
ORDER BY 並び替えの基準のカラム 並べ替え規則
- 並べ替え規則: 昇順
ASC
(ascending order), 降順DESC
(descending order)
- 並べ替え規則: 昇順
制限
LIMIT 123
: 上から123レコードのみ取り出す(クエリの末尾に記述)
SQL II
その他
SELECT DISTINCT(カラム名)
: SELECT カラム名 に加えて, 重複要素を削除SELECT name, price * 1.08
: price カラム全体の値を 1.08 倍してとりだす。- カラム同士の演算も可能
- 演算は
ORDER BY
やAVG
の引数にすることも可能
集計関数
SELECT SUM(カラム名)
: 合計を1列で得る。後に where を用いた場合は最終結果で SUM される。AVG()
: 平均。分母も where などの最終結果の列数。COUNT()
: 列数。値がnull
のときは数えない。また, カラムとして*
を指定でき, このときは null 関係なくレコード数になる。MAX()
,MIN()
グループ化
GROUP BY カラム名
: 指定したカラムで、完全に同一のデータを持つレコードどうしが同じグループとなる(FROM の後ろに書く)GROUP BY
を用いる場合、SELECT
で使えるのは、GROUP BY
に指定しているカラム名(表示させるため)- 集計関数 (
COUNT(*)
でグループに属していたレコード数。たいていグループに関する合計とかをしりたいので,SELECT SUM(price), user
FROM list
GROUP BY user
みたいに使う)
GROUP BY カラム1, カラム2
で2つのカラムの組が完全に一致したものをグループ化HAVING 条件
で条件を満たすグループのレコードのみ表示- HAVING: グループ化されたデータを検索対象
- WHERE: グループ化される前のテーブル全体を検索対象
順番
- 書く順番:
SELECT
->FROM
->WHERE
->GROUP BY
->HAVING
- 実行順番:
FROM
->JOIN, ON
->WHERE
->GROUP BY
-> 集計関数 ->HAVING
->SELECT, DISTINCT
->ORDER BY
->LIMIT
SQL III
その他
- サブクエリ: クエリの中に入れるクエリ。
()
で囲む必要があり, 末尾の;
は不要。全体の実行はサブクエリが実行された後。- サブクエリの実行結果で単体の値を返し, それを条件式中に入れる。
- カラム名の後ろに AS をつけることで, カラム名にエイリアスを与えられる。(
SELECT
内で使用する?)
SELECT name AS elder FROM namelist WHERE old > 60;
テーブルを紐づける
- TableAの外部キー -> TableBの主キー (キーはあるカラム)
- tableA に tableB を結合する。
ON
は結合条件でテーブル名.カラム名
を利用する- 複数のテーブルに同じカラム名が存在するときも
テーブル名.カラム名
で指定 - 外部キーが null のとき
JOIN
のとき除外されるLEFT JOIN
のとき, tableAは全て残されて, 外部キーが null であるレコードの tableB は全て null になる
FROM tableA JOIN tableB ON tableA.ref_key = tableB.main_key
JOIN
(orLEFT JOIN
)ON
は連続して複数書くことで3つ以上のテーブルを結合可能(tableB,CをtableAに結合する。)
SQL IV
- レコードの取得: これまでやってきた
SELECT
- レコードの追加: 多くの場合, id カラムには AUTO INCREMENT という機能で児童に番号が振られる。そのとき, 以下の
カラム1
と対応する値57
は省略可能
INSERT INTO テーブル名 (id, user, old) VALUES (57, "yamada", 23);
- レコードの更新:
WHERE
省略時は全レコードを対象とする
UPDATE テーブル名 SET name = "yamaguchi", old = 25 WHERE id = 57;
- レコードの削除:
WHERE
省略時は全レコードを対象とする
DELETE FROM テーブル名 WHERE id = 57;
MySQLの開発環境を用意しよう
Windows
インストール
- https://dev.mysql.com/downloads/windows/installer/5.7.html にアクセス
- mysql-installer-community-5.7.30.0.msi をインストール
- 枠の下の「いいえ、ダウンロードを開始してください」
- インストーラー からインストール(全部デフォルト)
- 環境変数から
C:\Program Files\MySQL\MySQL Server 5.7\bin
にパスを通す
mysql --version
動作確認
管理者として以下を実行
net start mysql57 mysql --user=root --password ## パスワードが要求される(******) > exit; ## exit で脱出できる net stop mysql57 ## サービス停止
macOS
- Homebrewのインストール
- MySQLのインストール
brew install mysql@5.7 echo 'export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"' >> ~/.bash_profile ## インストールした時の説明に書いてある source ~/.bash_profile mysql --version brew services start mysql@5.7 mysql_secure_installation ## 以下, 質問は全てenter
- 起動
brew services start mysql@5.7 mysql --user=root --password # ログイン > exit; brew services stop mysql@5.7
MySQLでデータベースを作成しよう
- 起動, ログインは前述
SHOW databases; -- データベースの表示 CREATE DATABASE データベース名; /* データベースの作成 */ USE データベース名; -- データベースの使用 SHOW tables; -- テーブル一覧の表示 CREATE TABLE テーブル名 (`id` int auto_increment, `name` text, primary key (id)); /* テーブルの作成: `id` は auto_increment な整数 かつ 主キー, 他に `name` カラム(文字列) */ DESCRIBE テーブル名; /* カラム情報の表示 */ /* この後はこれまでやってきた話 */ DROP TABLE テーブル名; /* テーブルの削除 */ DROP DATABASE データベース名; -- データベースの削除