Progate SQL

SQL I

基本用語

  • テーブル: 表
    • カラム: 列
    • レコード: 行
  • SLQ: クエリを書くための言語。大文字小文字を区別しない。
  • クエリ: データベースに送る命令。改行の有無に関わらず, ; までが1つの命令。(例: SELECT hoge FROM fuga;)

抽出

  • SELECT カラム名 : 取り出すカラムの指定
    • SELECT カラム1, カラム2 のように複数カラムを指定可能。(全カラムを指定するときはSELECT *とする)
  • FROM テーブル名 : 対象となるテーブルの指定
  • WHERE カラム名=値: カラム名の項目が値となるレコードのみを取り出す
    • 文字列, 日付: " または ' で囲む必要がある (例: "2017-07-01")
    • 数値 : 囲まない
  • 演算子
    • = >= <= > <
    • LIKE: where name LIKE 文字列: name カラムの値が文字列か。ただし, 文字列にはワイルドガードを利用できる。
      • ワイルドガード: %は0文字以上の任意 ( "hoge%" -> "hoge", "hogera" )
  • 条件式: 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 BYAVG の引数にすることも可能

集計関数

  • 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 (or LEFT 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

インストール

  1. https://dev.mysql.com/downloads/windows/installer/5.7.html にアクセス
  2. mysql-installer-community-5.7.30.0.msi をインストール
  3. 枠の下の「いいえ、ダウンロードを開始してください」
  4. インストーラー からインストール(全部デフォルト)
  5. 環境変数から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 データベース名; -- データベースの削除