Help us understand the problem. What is going on with this article?

SQLの基礎の基礎

More than 1 year has passed since last update.

はじめに

SQLについて学習したので、これまでに学んだ知識をまとめました。

学習した事

  • MySQLのインストール
  • MySQL Workbenchの使用方法
  • SQL構文の基本の使い方

今回は、SQL構文の基本の使い方について、自分用メモと知識定着の目的で書きました。訂正箇所などありましたら、ご指摘いただけると幸いです。

SQLの基本

  • SQLは大文字と小文字を区別しない
  • 文字と日付はシングルクォーテーションで囲う

データ型

テーブルを作成する時に、それぞれのカラムに指定した形式のデータしか入力できないように設定する。この時指定するデータの形式をデータ型という。

データ型名 データ種別
int型 数値型 整数
tinyint型 数値型 -128〜127
char型 文字列 固定長の文字列255文字まで
varchar型 文字列 可変長の文字列255文字まで
text 文字列 長い文字列65535文字まで
date型 日付 1000-01-01〜9999-12-31まで
datetime型 日付・時刻 00:00:00.000000〜23:59:59.999999
time型 時刻 838:59:59〜838:59:59

集約関数

集約関数ではnullは基本的に無視されるが、COUNT(*)とする事でnullを含めたレコードを数える。

関数 意味
COUNT テーブルのレコード数を数える
SUM カラムの数値を合計する
AVG カラムの数値を平均する
MAX カラムの中の最大値を求める
MIN カラムの中の最小値を求める

SQL文の記述順序と実行順序

記述順序 実行順序
SELECT FROM
FROM JOIN
JOIN WHERE
WHERE GROUP BY
GROUP BY HAVING
HAVING SELECT
ORDER BY ORDER BY
LIMIT LIMIT

in演算子・・・ ある値が値セット内に含まれているかどうか。
not in演算子・・・ ある値が値セット内に含まれていないかどうか。

テーブル操作

CRUD

CRUDとは(Create, Read, Update, Delete)のこと。

SQLではこの4つの処理を

  • Create = INSERT
  • Read = SELECT
  • Update = UPTATE
  • Delete = DELETE

の構文で操作する。

テーブルの作成

CREATE TABLE [テーブル名](
  列名 [データ型] [その他の記述],
  列名 [データ型] [その他の記述],
  列名 [データ型] [その他の記述]
);

テーブルにデータの追加

INSERT INTO [テーブル名](列1,列2,列2) VALUES(値1,値2,値3);

この時、列と値の数が一致している必要がある。

複数行を一度に追加する場合は、それぞれが括弧で囲まれ、カンマで区切られた、カラム値の複数のリストを記入していく。

INSERT INTO [テーブル名](列1,列2,列2) VALUES(値1,値2,値3),(値1,値2,値3),(値1,値2,値3);

列の追加

ALTER TABLE [テーブル名] ADD [追加する列名] [データ型] AFTER [列名];

列名の変更

ALTER TABLE [テーブル名] CHANGE [旧列名] [新列名] [データ型];

データの取得(SELECT)

SLECT ・・・ カラムの指定
FROM ・・・ 対象テーブルの指定
JOIN ・・・ テーブルの結合
WHERE ・・・ 絞り込み条件の指定
GROUP BY ・・・ グループ化の条件の指定
HAVING ・・・ グループ化した後の絞り込み条件を指定
ORDER BY ・・・ 並び替え条件を指定
LIMIT ・・・ 取得する行数を指定

例 adventurerテーブル

id name sex lv mp job
1 山田 man 20 40 戦士
2 鈴木 woman 30 230 魔法使い
3 田中 man 40 280 僧侶
4 小野 woman 50 360 魔法戦士
5 佐藤 man 40 200 レンジャー
6 西野 woman 70 220 パラディン

WHERE句

SELECT name, lv FROM adventurer WHERE name = '鈴木';

実行結果

name     lv
鈴木      25
LIKE

ワイルドカード文字で文字列のパターンを指定する事ができる。

  • '山%' → '山'で始まる文字列
  • '%山' → '山'で終わる文字列
  • '%山%' → '山'を含む文字列
  • '__山' → 何かしらの2文字で始まり、'山'で終わる文字列

jobに戦士の文字列を含む情報を取得

SELECT * FROM adventurer WHERE job LIKE '%戦士%';

実行結果

id  name  sex   lv   mp    job
1   山田   man   20   40    戦士
4   小野  woman  50   360  魔法戦士

サブクエリ

鈴木さんよりもmpが高い人の名前を取得

SELECT name FROM adventurer WHERE mp > (SELECT mp FROM adventurer WHERE name = '鈴木');

実行結果

name
田中
小野

CASE

CASE式を使う事で条件分岐を指定する事ができる。

lvが60以上なら'A'
lvが40以上なら'B'
lvが40未満なら'C'

SELECT name,
       CASE WHEN lv >= 60 THEN 'A'
            WHEN lv >= 40 THEN 'B'
            ELSE 'C'
       END AS ranking
FROM adventurer;

実行結果

name   ranking
山田       C
鈴木       C
田中       B
小野       B
佐藤       B
西野       A

GROUP BY句

性別毎のレベルの平均を取得

SELECT sex, AVG(lv) FROM adventurer GROUP BY sex;

実行結果

sex     lv
man     50
woman   75

ORDER BY句

並び替え条件を指定する。複数条件を指定する時は、,区切りで指定する。
ASC・・・昇順(デフォルト)
DESC・・・降順

lvが高い順に並び替え。lvが同じ場合はid順。

SELECT * FROM adventurer ORDER BY lv DESC, id ASC;

実行結果

id  name  sex  lv  mp  job
6   西野  woman 70 220  パラディン
4   小野  woman 50 360  魔法戦士
3   田中   man  40 280  僧侶
5   佐藤   man  40 200  レンジャー
2   鈴木  woman 30 230  魔法使い
1   山田   man  20 40   戦士

LIMIT句

取得する行数を指定する事ができる。

SELECT * FROM adventurer ORDER BY lv DESC, id ASC LIMIT 3;

実行結果

id  name  sex  lv  mp  job
6   西野  woman 70 220  パラディン
4   小野  woman 50 360  魔法戦士
3   田中   man  40 280  僧侶

データの更新(UPDATE)

UPDATE [テーブル名] SET [変更したい列名] = ['新しい値'] WHEREで条件指定;

データを削除(DELETE)

DELETE FROM [テーブル名] WHERE [条件];

データベース操作

データベース接続

mysql -u root -p

MySQL起動

mysql.server start

MySQL終了

mysql.server stop

MySQLの状態確認

mysql.server status

データベースの作成

CREATE DATABASE [作成するデータベース名];

データベースの命名ルール

  • 半角のアルファベット a,b,cなど
  • 半角の数字 1,2,3など
  • アンダースコア _
  • 名前の最初は半角のアルファベット

データベースの削除

DROP DATABASE [削除したいデータベース名];

データベースの一覧表示

SHOW DATABASES;

使用しているデータベースの確認

SELECT DATABASE();

使用するデータベースの選択

USE [データベース名];
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away