SQL 基礎

8 min read読了の目安(約7200字

はじめに

初学者の方向けにSQLについてまとめてみました。
SQLの操作はMYSQLを使って操作しています。

SQLとは?

  • Structured Query Language(構造化問合せ言語)
  • リレーショナルデータベースのデータを操作する言語です
  • データの条件検索、データの取得、削除、更新ができます

SQLとは TECHSCORE(テックスコア)

リレーションデータベース(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  |             
+--------+

演算子

=-- != と <> は同じ意味です!= △  ○ <> △

○ < △

○ > △

○ >= △

○ <=

まとめ

個人的にドットインストールは一連の操作が学べるのでおすすめです。
記事は、あくまで基礎なので追加で学習してみてください😁

参照

[新人プログラマ向け]易しさを求める人のためのSQL解説
SQL テックスコア
ドットインストール