🔖

SQLの基礎についてわかりやすくまとめてみた

2024/05/14に公開

SQLとは

SQL(Structured Query Language)は、、リレーショナルデータベースからデータを操作するために使用されるです。データを抽出、更新、削除、挿入するためのさまざまなクエリやコマンドがあります。

SQLでデータベースの操作を記述するために使用されるものには、SQL文とSQL句があります。

SQL文

データベースで実行される単一のSQL命令を指します。
SELECT文、INSERT文、UPDATE文、DELETE文などがあります。

SQL句

SQL文の中で使用される要素で、SQL文の目的や条件を明確に定義するために使用されます。

クエリ

SQLを使用してデータベースから情報を取得するための命令または問い合わせを指します。
クエリは通常、SELECT文を使用して実行されます。

クエリを実行することで、データベースから必要な情報を取得し、処理することができます。

リレーショナルデータベースとは

次のように、データを表形式で管理しているデータベースです。
複数のテーブル(表)とそのリレーション(関係)の集まりでデータベースが構成されています。

表のことをテーブル、縦の列をカラム、行をレコードと言います。

データ操作

SELECT(行取得)

SELECT文は、列(レコード)、FROM句は、表(テーブル)を選択します。

usersテーブルから、nameの列を選択する場合は、下記の記述になります。

SELECT name FROM users;

INSERT(行挿入)

dbというデータベースのusersテーブルに新しい行を挿入する
first_nameカラムに山田last_nameカラムに太郎という値を持つ新しいユーザーを挿入します。

INSERT INTO db.users (first_name, last_name) VALUES ('山田', '太郎')

INSERT INTO文のカラム名を省略することもできます。
この書き方では、INSERT INTO文で明示的にカラム名を指定せずに、テーブルの列の順序に対応する値を挿入します。

INSERT INTO db.users VALUES ('山田', '太郎');

UPDATE(行更新)

行を修正して、更新します。

UPDATE テーブル名
SET 列名 =, 列名 =WHERE 条件

employeesテーブルから、idが1の人の年齢を20に修正しています。

UPDATE employees
SET age = 20
WHERE id = 1

DELETE(行削除)

行を削除します。

DELETE FROM テーブル名
WHERE 条件

employeesテーブルから、20歳未満の人の行を削除します。

DELETE FROM employees
WHERE age < 20

列の追加

ALTER TABLE テーブル名
ADD 列名 データ型 [制約];

employeesテーブルに新しい列departmentを追加する場合は以下のようになります:

ALTER TABLE employees
ADD department VARCHAR(50) NOT NULL;

DEFAULT

列の追加時やテーブルの作成時に、デフォルト値を指定することができます。

既存のemployeesテーブルに新しい列departmentを追加します。
そして、その列にデフォルト値としてSalesを設定しています。

ALTER TABLE employees
ADD department VARCHAR(50) DEFAULT 'Sales';

列の削除

ALTER TABLE テーブル名 
DROP 列名

*演算子

*演算子は、すべての列を選択するために使用されます。つまり、テーブル内のすべての列を含むクエリの結果が返されます。

四則演算

+-*/を使用できます。

employeesテーブルから従業員の名前と給与の80%を取得しています。

SELECT name,salary * 0.8
FROM employees;

WHERE句(条件指定)

SQL文で使用される条件を指定することができます。

SELECT 列名
FROM テーブル名
WHERE 条件式;

profileテーブルから年齢が30歳以上の行のみを取得します。

SELECT *
FROM profile
WHERE age >= 30;

下記の比較演算子と論理演算子は一般的に、WHERE句と組み合わせて使用されます。

比較演算子

=!=<<=>>=を使用できます。

下記のようにWHERE句と組み合わせてemployeesテーブルから年齢が30より大きい従業員を取得しています。

SELECT * FROM employees WHERE age > 30;

論理演算子

AND

両方の条件が真の場合に真を返します。

employeesテーブルから部署がSalesであり、かつ年齢が30より大きい従業員を取得します。

SELECT * FROM employees WHERE department = 'Sales' AND age > 30;

OR

どちらかの条件が真の場合に真を返します。

employeesテーブルから部署がSalesまたはDevelopmentである従業員を取得します。

SELECT * FROM employees WHERE department = 'Sales' OR department = 'Development';

BETWEEN ... AND ...

指定された範囲内の値を比較します。

ordersテーブルから2024年1月1日から2024年3月31日の間に行われた注文を取得します。

SELECT * FROM orders WHERE order_date BETWEEN '2024-01-01' AND '2024-03-31';

IN

指定されたリスト内のいずれかの値と一致するかを比較します。

employeeテーブルから部署がSalesDevelopment、またはFinanceのいずれかである従業員を取得します。

SELECT * FROM employees WHERE department IN ('Sales', 'Development', 'Finance');

NOT IN

INの逆で、指定されたリスト内のいずれの値とも一致しないかを比較します。

employeesテーブルから部署がSalesまたはDevelopmentでない従業員を取得します。

SELECT * FROM employees WHERE department NOT IN ('Sales', 'Development');

LIKE

パターンに一致するかを比較します。

employeesテーブルから姓がで始まる従業員を取得します。

SELECT * FROM employees WHERE first_name LIKE '佐%';

NOT LIKE

LIKEの逆で、指定されたパターンに一致しないかを比較します。

employeesテーブルから名前にという文字列を含まない従業員を取得します。

SELECT * FROM employees WHERE first_name NOT LIKE '%佐%';

%

ワイルドカード文字列として使用され、0文字以上の任意の文字列を表します。
主にLIKE/NOT LIKE演算子と組み合わせて、特定のパターンに一致する文字列を検索する際に使用されます。

例えば、佐%というパターンは、で始まる任意の文字列に一致します。
また、%藤というパターンは、で終わる任意の文字列に一致します。
%藤%というパターンは、文字列の中にが含まれる任意の文字列に一致します。

_

LIKE/NOT LIKE演算子で使用され、1文字の任意の文字を表します。
例えば、佐_というパターンは、で始まり2文字目が何でも良い文字列に一致します。_藤というパターンは、2文字目がである任意の2文字の文字列に一致します。

SELECT * FROM employees WHERE first_name NOT LIKE '_藤%';

で始まり、次に任意の文字列(0文字以上)が続き、最後にで終わる名前を持つ従業員を選択します。(佐藤太郎、佐藤次郎など)

SELECT * FROM employees WHERE first_name LIKE '佐_%郎';

集計関数

COUNT関数

指定された列内の行数を返します。

employeesテーブル内の行数を取得する。

SELECT COUNT(*) AS total_employees FROM employees;

Min/Max関数

指定された列内の最小値/最大値を返します。

employeesテーブル内の最低給与を取得する。

SELECT MIN(salary) AS min_salary FROM employees;

AVG関数

指定された列内の平均値を返します。

employeesテーブル内の平均給与を取得する。

SELECT AVG(salary) AS avg_salary FROM employees;

SUM関数

指定された列内の値の合計を返します。

employeesテーブル内の給与の合計を取得する。

SELECT SUM(salary) AS total_salary FROM employees;

ORDER BY(並び替え)

データを特定の列の値に基づいて並べ替えるために使用されます。

これにより、データを昇順(ASC)または降順(DESC)で整理することができます。ORDER BY句はクエリの最後に配置されます。何も指定していない場合は、昇順になります。

並び替えた列だけを見ても、それがどの従業員に関連しているのかわからないため、他の列も一緒に表示することが一般的です。

SELECT 列名1, 列名2 FROM テーブル名
ORDER BY 列名1 DESC/ASC; 

給与の高い順に並べ替えて結果を表示します。

SELECT name, salary FROM employees
ORDER BY salary DESC;

GROUP BY(グループ化)

クエリの結果をグループ化するために使用されます。
一般的に、GROUP BY句は集計関数(SUM、COUNT、AVGなど)と共に使用され、その集計関数をグループごとに計算します。例えば、従業員ごとの売上合計を計算したい場合、名前でグループ化して売上を合計することができます。

HAVING

GROUP BY句と一緒に使用され、グループ化された結果に対して条件を適用するために使用されます。ちなみに、WHERE句は通常、個々の行をフィルタリングするために使用されます。

employeesテーブルから名前ごとに売上を合計し、その合計が1000を超える従業員の名前と合計売上を表示します。

SELECT name, SUM(sales) AS total_sales
FROM employees
GROUP BY name
HAVING SUM(sales) > 1000;

LIMIT句(結果制御)

クエリの結果セットに返される行の数を制限します。

最初の10行を返します。

SELECT * FROM users
LIMIT 10;

OFFSET句(結果制御)

結果セットの先頭からスキップする行の数を指定します。
これらの句を組み合わせて使用することで、特定の範囲の結果セットを取得することができます。

最初の10行をスキップして、残りの行を返します。

SELECT * FROM users
OFFSET 10;

例えば、LIMITOFFSETを組み合わせて、結果の21行目から30行目までの結果を取得します。

SELECT * FROM users
LIMIT 10 OFFSET 20;

DISTINCT句(重複除去)

クエリの結果セットから重複する値を除去します。つまり、同じ値が複数回表示される場合、1つの値のみが表示されます。

usersテーブルから重複する名前を除去して一意の名前のみを取得します。

SELECT DISTINCT name FROM users;

テーブルについて

データ型

データ型名 説明 使用例
INTEGER 年齢や数量などの整数値
VARCHAR 可変長文字列 テキストや名前、電話番号などの可変長の文字列
BOOLEAN 真偽値 ブール値 (true/false)
DATE 日付 年、月、日の情報を持ち、日付や予定などの日付データ('YYYY-MM-DD')
DATETIME 日付と時刻 生年月日などの特定の日付と時刻('YYYY-MM-DD HH:MM:SS')
TIMESTAMP 日付と時刻 更新日時などのデータが挿入された時点の日付と時刻('YYYY-MM-DD HH:MM:SS')
CHARACTER 固定長文字列 指定された長さの文字列
TEXT 可変長文字列 テキストデータやコメントなどの可変長の文字列
DECIMAL 固定小数点数 金額や料金などの小数点を含んだ数値(長さは5桁であり、小数点以下の桁数は2桁の場合:weight DECIMAL(5, 2))
BLOB バイナリデータ 画像、音声、動画などのバイナリデータ

テーブルの制約

PRIMARY KEY(主キー制約)

テーブル内の特定の列(または複数の列)を一意に識別するために使用されます。
NULL値を含まず、重複する値を持つことができません。

AUTO_INCREMENT

主キーとして使用される列に対して、自動的に値を生成するための制約です。
主キーがidなどの整数型の場合に使用されます。

UNIQUE(一意制約)

指定された列(または複数の列の組み合わせ)に一意性を強制します。

NOT NULL

指定された列がNULL値を含まないようにします。

CHECK(チェック制約)

指定された列内のデータが特定の条件を満たすことを強制します。

FOREIGN KEY(外部キー制約)

2つのテーブル間の関係を定義し、参照整合性を保持するために使用されます。
つまり、外部キー制約は、他のテーブルの主キーまたは一意制約を参照するための制約です。

CREATE TABLE(テーブル作成)

CREATE TABLE テーブル名 (1 データ型 制約1,2 データ型 制約2
);

idnameの2つの列を持つテーブルを作成するための記述です。

CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL
);

DROP TABLE(テーブル削除)

DROP TABLE テーブル名;

テーブル名の変更

ALTER TABLE テーブル名 
RENAME TO 新しいテーブル名

テーブルの削除

DROP TABLE テーブル名

テーブルの結合操作

下記を参考にしてください。
https://zenn.dev/nenenemo/articles/83f53f8f186c56

終わりに

何かありましたらお気軽にコメント等いただけると助かります。
ここまでお読みいただきありがとうございます🎉

Discussion