SQLの基礎についてわかりやすくまとめてみた
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
テーブルから部署がSales
、Development
、または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;
例えば、LIMIT
とOFFSET
を組み合わせて、結果の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
);
id
とname
の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 テーブル名
テーブルの結合操作
下記を参考にしてください。
終わりに
何かありましたらお気軽にコメント等いただけると助かります。
ここまでお読みいただきありがとうございます🎉
Discussion