🦔
SQL 基礎
はじめに
初学者の方向けにSQLについてまとめてみました。
SQLの操作はMYSQLを使って操作しています。
SQLとは?
- Structured Query Language(構造化問合せ言語)
- リレーショナルデータベースのデータを操作する言語です
- データの条件検索、データの取得、削除、更新ができます
リレーションデータベース(RDB)とは?
- 複数の表を関連ずけ、表にデータを格納するデータベースのことです
- データベースは一般的にリレーションデータベースがつかわれています
テーブルの構成
- テーブルとは、データを格納する表です。
- 縦列をカラム、横列(行)をレコードといいます。
- フィードはデータの要素にあたります
SQLのルール
- 命令文の最後は必ず、セミコロンをつける
- 改行可能
- 単語の間は半角スペースで区切る
- 文字列、日付はクォーテーション記号で囲う
- テーブルの名前は基本複数形
データ型
- SQLのデータ型です
整数
- TINYNT... -128 ~ +127
- INT... -21億 〜 + 21億
- BIGINT... -922京 〜 +922京
- TINYNT UNSIGND... 0 ~ 255
- TINYNT UNSIGND... 0 ~ 42億
- BIGINT UNSIGND... 0 ~ 1844京
実数
- DECIMAL... 固定小数点
- FLOAT... 浮動小数点
- DOUBLE... 浮動小数点(高精度)
※ 浮動小数点は誤差が出やすいので通常はDECIMALが使われます。
文字列
- CHAR... 0 ~ 255文字
- VARCHAR... 0 ~ 655535文字
- TEXT... それ以上
- ENUM... 特定の文字から1つ
- SET... 特定の文字列から複数
真偽値
- BOOL... TRUE / FALSE
- TINYNT(1)... 1 / 0
日時
- DATE... 日付
- TIME... 時間
- DATETIME... 日時
コメントの付け方
--
/*
コメント
*/
データベースを作成
-- CREATE DATABASE データベース名
CREATE DATABASE mydb;
use
で使用するデータベース名を選択できます。
-- use データベース名
USE mydb;
テーブルを作成
-
CREATE TABLE
でテーブルの作成を行います。 - ()の中にカラムとデータ型の指定します。
-
VARCHAR
...文字列型。文字数の指定。 -
INT
...数値型。整数の指定。
usersテーブルの中にidとmessageのカラムを作成
-- CREATE TABLE テーブル名 (カラム)
CREATE TABLE users (id INT, message VARCHAR(140));
DEAC
でテーブルの構造を確認できます。
-- DEAC テーブル名
DESC users;
+---------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| message | varchar(140) | YES | | NULL | |
+---------+--------------+------+-----+---------+-------+
SHOW TABLES;
でテーブルの一覧を確認できます。
SHOW TABLES;
+----------------+
| Tables_in_mydb |
+----------------+
| users |
+----------------+
テーブル削除
-
DROP
で指定したテーブルを削除します。 -
IF EXIST
を付けず、 postsテーブルが存在しなかった場合エラーが起きます。 -
IF EXIST
...もし存在すればという意味です。
-- DROP TABLE IF EXIST テーブル名
DROP TABLE IF EXIST posts;
レコードの追加
- レコードを追加します。
- カンマで区切って、複数のレコードの追加もできます。
-- INSERT INTOテーブル名 (カラム) VALUES (値)
INSERT INTO users (id, message) values (1, 'thank');
INSERT INTO users (id, message) values (2, 'HI'),(3, 'hey');
+------+---------+
| id | message |
+------+---------+
| 1 | thank |
| 2 | HI |
| 3 | hey |
+------+---------+
データを取得
- テーブルからデータを抽出、取得します。
-
*
でデータを全てのレコードを取得できます。 - 特定のカラムの抽出も可能
- 条件にあうレコードだけを抽出したい場合は
WHERE
を使います
-- SELECT * FROM テーブル名
SELECT * FROM users;
-- SELECT カラム FROM テーブル名
SELECT message FROM users;
-- SELECT カラム FROM テーブル名 WHERE カラム 演算子 値
SELECT * FROM users WHERE id = 1;
+------+---------+
| id | message |
+------+---------+
| 1 | thank |
+------+---------+
-- 1以外を抽出
SELECT * FROM users WHERE id != 1;
+------+---------+
| id | message |
+------+---------+
| 2 | HI |
| 3 | hey |
+------+---------+
並び替え
-
ORDER BY
で指定したカラムの順番に並び替えます。 -
DESC
をつけると逆に並び替えられます。
-- SELECT カラム FROM テーブル名 ORDER BY カラム
SELECT * FROM users ORDER BY likes;
SELECT * FROM users ORDER BY likes DESC;
-- likesの値が同一のものがあれば、messageを元に順番に並び替えます。
SELECT * FROM users ORDER BY likes, message;
SELECT * FROM users ORDER BY likes DESC, message;
SELECT * FROM posts ORDER BY likes, message LIMIT 2;
データを更新
-
UPDATE
でカラムのデータを更新できます - 複数のカラムのデータを更新するときは、カンマで区切ります
- WHEREで更新するレコードの指定ができます
※ WHEREで指定しないと同じカラムのデータが全て更新されます。
-- UPDATE テーブル SET カラム=更新後の値 WHERE カラム 条件 値
UPDATE users SET message='bye' WHERE id = 1;
SELECT * FROM users WHERE id = 1;
+------+---------+
| id | message |
+------+---------+
| 1 | bye |
+------+---------+
-- 複数指定の時
-- UPDATE テーブル SET カラム=更新後の値, ..., WHERE カラム 条件 値
レコードの削除
-
DELETE
でレコードを削除します -
WHERE
を使って条件を指定できます - PRIMARY KEYを設定している場合、
削除されたPRIMARY KEYと同じ値は追加作成されません。
-- DELETE FROM テーブル名 条件文
DELETE FROM users WHERE id = 1;
制限をかける
- AND... 〜 かつ 〜 を表します。
- BETWEEN... 〜 から 〜 までを表します。
- NOT BETWEEN... 〜 から 〜 以外を表します。
- OR...〜 または 〜 を表します。
- IN...書き方がORとは違いますが意味はORと意味は一緒です。
※likesカラムに値が入っていることを想定しています。
-- likesが10以上かつ20以下を抽出します
SELECT * FROM users WHERE likes >= 10 AND likes <= 20;
-- likesが10〜20までを抽出します
SELECT * FROM users WHERE likes BETWEEN 10 AND 20;
-- likesが10~20以外を抽出します
SELECT * FROM users WHERE likes NOT BETWEEN 10 AND 20;
-- likesが10または20のものを抽出します
SELECT * FROM users WHERE likes = 10 OR likes = 20;
-- likesが10または20のものを抽出します
SELECT * FROM users WHERE likes IN(10, 20);
-- likesが10または20の以外のものを抽出します
SELECT * FROM users WHERE likes NOT IN(10, 20);
部分一致
- 部分一致したもを取得したい場合は
LIKE
使います。 -
%
...0文字以上の任意の文字 -
_
...任意の1文字以上 - BINARY...大文字、小文字を区別します。
-
%
や_
を含めたものを抽出したい場合は、前に\
をつけてあげます。
-- tで始まるものを大文字小文字区別せず抽出します。
SELECT * FROM users WHERE message LIKE 't%';
-- 小文字のtで始まるものを抽出します。
SELECT * FROM users WHERE message LIKE BINARY 't%';
-- 最後がeyで終わるものを抽出します
SELECT * FROM users WHERE message LIKE '%ey';
-- iが含まれるものを抽出します
SELECT * FROM users WHERE message LIKE BINARY '%i%';
-- %を含めたものを抽出します
SELECT * FROM users WHERE NOT message LIKE '%\%%';
-- 最初から3文字目がaのものを抽出します
SELECT * FROM users WHERE message LIKE '__a%';
-- 最初から3文字目がa以外のものを抽出します
SELECT * FROM users WHERE message NOT LIKE '__a%';
-- _を含めたものを抽出します
SELECT * FROM users WHERE message LIKE '%\_%';
グループ化
-
GROUP BY
でレコードのグループ化ができます。
INSERT INTO posts (quantity, fruits) VALUES
(12, 'apple'),
(8 'banana') ,
(11, 'apple'),
(3, 'grape'),
(4, 'banana');
-- SELECT カラム, SUM(集計先カラム) FROM テーブル名GROUP BY カラム;
SELECT fruits, SUM(quantity) FROM posts GROUP BY fruits;
-- fruitsの種類に従ってグループ化し、quantityが集計されています
+--------+---------------+
| fruits | SUM(quantity) |
+--------+---------------+
| apple | 23 |
| banana | 12 |
| grape | 3 |
+--------+---------------+
※SUMは集計関数といい、値の合計を求めてくれます。
HAVING
- 条件を付けたいとき、
GROUP BY
より後にWHERE
は使えません。 - 代わりに
HAVING
を使います。
-- SELECT カラム, FROM テーブル名 GROUP BY カラム, HAVING 条件;
SELECT fruits, FROM posts GROUP BY fruits, HAVING quantity > 10;
※ GROUP BY
より前にWHERE
を使用することは可能です。
その場合は、条件で絞り込んだ後にグループ化されます。
DISTINCT
- 重複を省いたカラムのデータを抽出することができます。
-- SELECT DISTINCT カラム, FROM テーブル名;
SELECT DISTINCT fruits, FROM posts;
+--------+
| fruits |
+--------+
| apple |
| banana |
| grape |
+--------+
演算子
○ = △
-- != と <> は同じ意味です
○ != △ ○ <> △
○ < △
○ > △
○ >= △
○ <= △
まとめ
個人的にドットインストールは一連の操作が学べるのでおすすめです。
記事は、あくまで基礎なので追加で学習してみてください😁
Discussion