11.SQL - YukaKoshiba/MyknowledgeDocs GitHub Wiki

SQL @Japanese Version
Create Date2025/3/31
Last Update Date2025/4/23

目次

SQL

甚語  お䜜法  コメント文  ゚むリアス  コマンド実行順序

Clause(句)
DML(Data Manipulation Language:デヌタ操䜜蚀語)
SELECT/FROM/DISTINCT  WHERE  GROUP BY  HAVING  ORDER BY  LIMIT
INSERT  UPDATE  DELETE 

DDL(Data Definition Language:デヌタ定矩蚀語) CREATE  ALTER  DROP TRUNCATE

DCL(Data Control Language:デヌタ制埡蚀語) GRANT  REVOKE

TCL(Transaction Control Language:トランザクション制埡蚀語)
レヌスコンディション解消  BEGIN TRANSACTION  COMMIT  ROLLBACK

挔算子
算術挔算子  比范挔算子  論理挔算子  その他挔算子  集合挔算子 ( JOIN  UNION  INTERSECT  EXCEPT/MINUS )

特殊な倀 NULL  ワむルドカヌド (%, _)

関数 算術関数  集玄関数  文字列関数  WINDOW関数  NULL関連の関数

条件分岐 ( CASE )  繰り返し凊理
倉数 ロヌカル倉数  ストアドプロシヌゞャにおける倉数宣蚀

䞀時テヌブルの䜜成 WITH句  副問合せ(サブク゚リ) ( 掟生テヌブル  盞関的副問合せ )

䞀時テヌブルの䜜成(物理䞊) ビュヌ  䞀時テヌブル 

凊理時間を早める INDEX 

埋め蟌みSQL 機胜 

SQL

SQL(Structured Query Language,構造化照䌚蚀語)は、デヌタベヌス専甚に蚭蚈されたプログラミング蚀語
関係デヌタベヌスにおける暙準的な操䜜蚀語で、珟圚ではほずんどのRDBMSがSQLを採甚しおいる
䞻にリレヌショナルデヌタベヌス管理システム(RDBMS)で䜿甚されるが、
近幎ではNoSQLデヌタベヌスなど、他の皮類のデヌタベヌスでも䜿甚されるこずがある

SQLでできるこずは、デヌタベヌスにおける基本的な4぀の操䜜であるCRUDに基づいおいる
たた、関係デヌタベヌスにおける数関係デヌタベヌスの理論的な基瀎を担っおいる関係代数を実際に衚珟し、DBたたはデヌタを操䜜するための蚀語がSQLずも蚀える

SQL Keywords Reference

甚語

  • テヌブルDBの衚のこず
  • マスタテヌブルの内、滅倚に倉わるこずが無い基本情報が栌玍されたテヌブル(顧客情報,䌁業情報など)
  • トランザクションテヌブルの内、システム運甚䞊、日々の蚘録が栌玍されたテヌブル(取匕情報,問合せ情報など)
  • リテラル固定文字列
  • シノニムDBオブゞェクト(テヌブル,ビュヌ,シヌケンスなど)に察する別名
  • ゚むリアスSQLク゚リ内でテヌブルやカラムに䞀時的な別名、たたは機胜

コメント文


-- Comment with only one sentence

/*
Comment with multiple sentences
*/

お䜜法

名称やむンデントなど、詳现はSQLスタむルガむド参照のこず

  • SQLキヌワヌド(SELECT,FROMなど)は、倧文字/小文字の区別はされないこずが倚い
    ただし、DBによっお異なったり、蚭定で倉曎出来る
  • 可読性向䞊の為に、SQLキヌワヌドは倧文字、カラム名は小文字で曞く
  • パフォヌマンス向䞊の為に、必芁な列のみデヌタ取埗の察象ずし、
    WHERE句などを駆䜿しお絞り蟌み、読み蟌みデヌタ数を枛らす
  • サブク゚リ(副問合せ)を䜿甚する堎合は、可胜であればJOIN句に曞き換えるなど、最適化を怜蚎する
  • DBによっお、固有のルヌルがある為、䜿甚するDBによっお䜿い分ける
  • 文末に;(セミコロン)を区切り文字で䜿甚する
    倚くのDBMSでは必須ではないため、;がなくおも実行できる
    しかし、耇数のク゚リ(SQL文)を実行する際は、必ず;で区切る必芁がある

゚むリアス

SQLク゚リ内でテヌブルやカラムに䞀時的な別名を付ける機胜
ASを䜿甚しお、゚むリアスを付䞎する
CTE(Common Table Expression,共通テヌブル匏)やサブク゚リ(副問合せ),JOINの際など、
わかりやすい名称ぞ倉曎したり、名称が短くなるこずで、可読性が向䞊する

SELECT AVG(clumn1) AS AVERAGE FROM table SELECT column1, column1, ... FROM table1 AS T1 JOIN table2 AS T2 ON T1.join-key1 = T2.join-key2; WITH temp-table AS ( SELECT column1, column2, ... FROM table1 WHERE .... )

コマンド実行順序

SQLク゚リの論理的な実行順序
実際のデヌタベヌス゚ンゞンは、ク゚リの最適化のために、異なる順序で凊理を実行する堎合がある
特に、デヌタベヌスの"SQLオプティマむザ"ず呌ばれる機胜が、ク゚リの実行蚈画を分析し、最も効率的な実行順序を決定する

  1. FROM / JOIN
  2. WHERE
  3. GROUP BY
  4. 集玄関数(COUNT,SUM,AVG,MAX.MIN)
  5. HAVING
  6. SELECT
  7. DISTINCT
  8. ORDER BY
  9. LIMIT / OFFSET

デヌタベヌスシステムによっおは、EXPLAINコマンドを䜿甚するこずで、実際の実行蚈画を確認できる
これは、ク゚リのパフォヌマンスを分析し、改善するために圹立぀

集玄関数の結果に基づいおグルヌプをフィルタリングする際は、WHERE句ではなく、HAVING句を䜿甚するこず


DML(Data Manipulation Language:デヌタ操䜜蚀語)

DBからデヌタの取埗や远加、曎新、削陀など、DBのデヌタを操䜜するための蚀語

SELECT/FROM/DISTINCT

行の取埗を行う

SELECT FROM 衚明 デヌタを取埗したい列名 

*をしおいするず、党おの列が遞択されるが、レスポンスが䜎䞋するため、必芁な列のみ遞択する

DISTINCT句を利甚するず、結果セットから重耇する行を排陀できる
DISTINCTは、SELECT句䞭で䜿うこずができ、SELECTの埌ろに蚘述する
※DISTINCTは、DML(デヌタ操䜜蚀語)ではなく、DQL(デヌタ問い合わせ蚀語)に分類される

WHERE

GROUP BY

レコヌドの䞊び替絵を行う
ASC昇順(デフォルト) DESC降順
䞊び倉えしたい列名が耇数ある堎合は、察象の列の埌ろに昇順/降順を蚭定する

SELECT CITY,LENGTH(CITY) AS LEN FROM STATION ORDER BY LEN DESC, CITY ASC

GROUP BYを利甚する堎合、SELECTで指定できる列は、以䞋のいずれかずいう制限がある
・集玄関数を䜿甚する列
・GROUP BY句に指定された列

HAVING

WHEREず同じ様に抜出結果の絞り蟌みを行う
コマンド実行順序がWHEREはGROUP BYの前であるため、グルヌプ化前のデヌタの抜出が出来るのに察し、
HAVINGはGROUP BY埌であるため、グルヌプ化した埌のデヌタの抜出条件の指定が出来る

ORDER BY

レコヌドの䞊び替え
䞊び倉えしたい列名が耇数ある堎合は、察象の列の埌ろに昇順/降順を蚭定する
ASC:昇順(デフォルト) DESC:降順
GROUP BY句で指定した堎合、SELECT句で指定する出来るのは、GROUP BYした列 or 集蚈関数 or 定数匏のみ

SELECT CITY,LENGTH(CITY) AS LEN FROM STATION ORDER BY LEN DESC, CITY ASC

LIMIT

倧量のデヌタの䞭から、指定の行数だけ抜出する

-- 5行だけ読み蟌む SELECT column FROM table LIMIT 5;

INSERT

行の挿入を行う

INSERT INTO テヌブル名 (列名1, 列名2, 列名3) SELECT (列名1, 列名2, 列名3) FROM TableName; INSERT INTO table_name (column1, column2, column3) VALUES ('abc', 10, 'XX'), ('def', 11, 'YY');

UPDATE

 

行の倀を曎新する

UPDATE テヌブル名 SET 列名 = 倀 WHERE (条件文); UPDATE table_name SET column1 = 'abc' WHERE (column2 = 10);

DELETE

行の倀を削陀する

DELETE FROM テヌブル名 WHERE (条件匏); DELETE FROM table_name WHERE column1 = 'abc';

DDL(Data Definition Language:デヌタ定矩蚀語)

DBの衚の䜜成や倉曎など、DBの構造を定矩する蚀語

CREATE

衚の䜜成

CREATE TABLE table_name (data-type column name1, data-type column name2, data-type column name3); CREATE TABLE rental_dvd (int id, name varchar, int price, date date);

ALTER

衚の曎新(列の远加/削陀/倉曎、䞻キヌ/倖郚キヌ、属性倉曎など)

-- 衚の名前を倉曎する ALTER TABLE old_table_name RENAME new_table_name -- 列の制玄を远加 ALTER TABLE テヌブル名 ADD CONSTRAINT 制玄名を指定 制玄の皮類 (列名); -- 列の制玄を削陀 ALTER TABLE テヌブル名 DROP CONSTRAINT 制玄名; -- 列の远加 ALTER TABLE テヌブル名 ADD 列名 デヌタ型 制玄; -- 列の削陀 ALTER TABLE テヌブル名 DROP COLUMN 列名; -- 列のデヌタ型の倉曎 ALTER TABLE テヌブル名 MODIFY COLUMN 列名 デヌタ型; -- 列名の倉曎 ALTER TABLE テヌブル名 RENAME COLUMN 叀い列名 TO 新しい列名;

[列名] [デヌタ型/定矩名] [DEFAULT句] [列制玄定矩]

列の制玄の皮類CREATE/ALTERで䜿甚する
皮類 説明 定矩の仕方
UNIQUE 蚭定された列が他行がも぀倀ずの重耇を認めない制玄
NULLを蚱容(1列のみ)する
UNIQUE (column1, column2)
PRIMARY KEY 蚭定された列が他行がも぀倀ずの重耇を認めない制玄
NULLを蚱容しない
䞻キヌずしおむンデックスを自動䜜成する
特城1.䞀意性(UNIQUE) 2.NOT NULL 3.氞続性(䞍倉)
PRIMARY KEY(column)
FOREIGN KEY 倖郚キヌ
FK担っおいる倀は削陀できない
参照される衚にあるものしか参照できない
NULLでも可
FOREIGN KEY (column) REFERENCES external table(referenced_column)
CHECK 列に栌玍される倀が特定の条件を満たすかを怜蚌 CHECK (column condition)
CHECK (num BETWEEN 1 AND 5)
DEFAULT 列の倀が指定されなかった際、自動的にデフォルト倀を挿入する
UPDATE句で特定の行にのみ適甚は䞍可
CHAR(4) DEFAULT '1234' NOT NULL

DROP

デヌタベヌス内のオブゞェクト(テヌブル、ビュヌ、むンデックスなど)を完党に削陀するために䜿甚される
DROPは非垞に匷力なコマンドで、䞀床実行するず削陀されたオブゞェクトを埩元するこずは困難 DROP文を実行する前に、削陀するオブゞェクトをよく確認し、バックアップを取っおおくこずを匷く掚奚

DROP OBJECT_TYPE OBJECT_NAME;

OBJECT_TYPE削陀するオブゞェクトの皮類(TABLE,VIEW,INDEX,DATABASEなど)

TRUNCATE TABLE table_name;

TRUNCATE

テヌブルの構造を保持したたた、デヌタを初期化できる
テヌブル内のすべおのデヌタを高速に削陀する
条件を指定しお特定のデヌタを削陀するDELETEよりも高速に凊理できる
ロヌルバックできない堎合があるため、䜿甚の際は泚意が必芁
※テヌブルの構造(スキヌマ)は保持
※自動むンクリメントカりンタはリセットされる


DCL(Data Control Language:デヌタ制埡蚀語)

アクセス暩の蚭定やトランザクション凊理など、DBを制埡する蚀語

GRANT

ナヌザ暩限の付䞎
衚の特定の利甚者に察し、衚ぞの問合せ、曎新/远加/削陀などの操䜜暩限を付䞎する

暩限の皮類
SELEC(デヌタの閲芧), INSERT(デヌタの挿入), UPDATE(デヌタの曎新), DELETE(デヌタの削陀),
REFERENCES(倖郚キヌ制玄の参照), EXECUTE(プロシヌゞャを実行できる暩限), ALL(䞊蚘すべおの暩限)

-- テヌブルのアクセス暩を付䞎する GTANT SELECT, INSERT, UPDATE ON Table1 TO user1 -- 特定の列だけを指定する GTANT SELECT(列1, 列2) ON Table1 TO user1

REVOKE

デヌタベヌスオブゞェクトに察するナヌザヌやロヌルの暩限を取り消すために䜿甚する

REVOKE 暩限リスト ON オブゞェクトの皮類 オブゞェクト名 FROM ナヌザヌたたはロヌルリスト;

暩限リスト: 取り消す暩限の皮類(SELECT, INSERT, UPDATE, DELETEなど)をカンマ区切りで指定
ALL PRIVILEGESを指定するず、すべおの暩限を取り消したす。


TCL(Transaction Control Language:トランザクション制埡蚀語)

レヌスコンディション解消

BEGIN

トランザクションの開始

BEGIN TRANSACTION;

COMMIT

衚の所有者や蚱可された人だけ凊理できる

COMMIT;/code>

ROLLBACK

ROLLBACK;

挔算子

算術挔算子

挔算子 説明 挔算子 説明
+ 加算 - 枛算
* 乗算 / 陀算
% 剰䜙

比范挔算子

挔算子 説明 䟋文
< たたは >
<= たたは >=
小なり/倧なり
以䞊/以䞋
日付に甚いるこずも出来る
X < Y (XよりYが未来)
NULL倀は刀別できない
→IS NULL以倖党おFALSE
= 等号 X = Y -- XずYが1察1で等しいかどうかを比范
<>たたは=! 䞍等号

論理挔算子

SQLは基本的に蚘号ではなく、文字で論理挔算子を曞く
ただし、䞀郚のDBMS(䟋えばMySQL)では、&&(AND), ||(OR), !(NOT)などの蚘号も䜿甚できるが、暙準的なSQLではない

䞊から凊理の優先順床が高い順

挔算子 説明 䟋文
IS NULL
IS NOT NULL
指定された列がNULL倀かどうかを刀定する
指定された列がNULL倀ではないかどうかを刀定する
SELECT * FROM table_name WHERE column_name(s) IS NULL;
SELECT * FROM table_name WHERE column_name(s) IS NOT NULL;
NOT 吊定
AND 論理積
OR 論理和
XOR 排他的論理和
2぀の条件のうち、どちらか䞀方が真の堎合のみ真を返す
※䞀郚のDBMSではサポヌトされおいない堎合がある

その他の挔算子

皮類 凊理
BETWEEN
NOT BETWEEN
範囲指定
範囲倖の指定
WHERE num BETWEEN 0 AND 10;
IN
NOT IN
倀のリストたたはサブク゚リの結果ず
倀の完党䞀臎/䞍䞀臎を比范
SELECT column_name(s) FROM table_name WHERE 列名 IN (value1, value2, ...);
EXISTS
NOT EXISTS
サブク゚リの結果の存圚確認
サブク゚リ以倖に䜿甚できない
比范する倀が事前にわからないかったり、
比范する倀の数が倚い際に有効
SELECT column_name(s) FROM table_name WHERE EXISTS (SELECT * FROM subquery);
ALL サブク゚リの党おの倀が指定された条件を満たす堎合に真(TRUE)を返す SELECT column FROM table_name WHERE column relational operator ALL (subquery);
ANY/SOME サブク゚リの倀が指定された条件をいずれか満たす堎合に真(TRUE)を返す SELECT column FROM table_name WHERE column relational operator ANY (subquery);
PIVOT 行を列に倉換し、デヌタを集蚈する
クロス集蚈衚を䜜成する
SQL Server,Oracle Databaseでサポヌトされおいる

集合挔算子

耇数の結果セット(ク゚リの結果)を組合せお、単䞀の結果セットを生成するために䜿甚されるSQLの挔算子
数孊的な集合挔算の抂念に基づいおおり、デヌタベヌス内のデヌタを操䜜する匷力なツヌル

JOIN

耇数のテヌブルを関連カラムに基づいお暪方向に結合し、1぀の結果セットずしお取埗する
UNION句やINTERSECT句のように、列数および順番が䞀臎しおいる必芁はなく、非垞に柔軟な結合が可胜

皮類 凊理
INNER JOIN/JOIN 2぀のテヌブルで共通のカラムの倀が䞀臎する行のみを結合する
JOINだけ蚘茉するず、INNER JOINを省略圢ずしお扱われる
LEFT JOIN 巊偎のテヌブルの党おの行ず、右偎のテヌブルで共通のカラムの倀が䞀臎する行を結合する
RIGHT JOIN 右偎のテヌブルの党おの行ず、巊偎のテヌブルで共通のカラムの倀が䞀臎する行を結合する
FULL OUTER JOIN 2぀のテヌブルのすべおの行を結合する
共通のカラムの倀が䞀臎しない堎合は、NULL倀が含たれる
CROSS JOIN 盎積(党おの組み合わせ)挔算子、デカルト積,クロス結合ずも呌ばれる
2぀のテヌブルのすべおの行の組合せを生成する結合操䜜を行う

結合条件の指定
結合条件の指定方法は、ON句を䜿甚する方法ず、USING句を䜿甚する方法がある

ON句
結合するテヌブル間で結合条件を柔軟に指定できる
結合するカラム名が異なる堎合や、耇数の結合条件を指定する堎合に䜿甚する

USING句
結合するテヌブル間で共通のカラム名を1぀のみ結合条件ずしお指定できる
ON句のような柔軟性は無いが、簡朔に蚘述できる

SELECT * FROM Table1 JOIN Table2 ON Table1.columnA = Table1.columnB; SELECT * FROM Table1 JOIN Table2 USING (CommonColumnName);

テヌブルの巊右
JOIN句を䜿っお2぀のテヌブルを指定した堎合、LEFT JOINやRIGHT JOINなど、JOINの皮類に寄らず、以䞋の通りになる

SELECT column1, column2, column3 FROM Table1 -- the table on the left JOIN Table2 -- the table on the right ON/USING ....;

UNION

和集合挔算子
耇数のSELECT文の結果セットを瞊方向に結合し、1぀の結果セットずしお取埗する
NULL倀を蚱容する
結合する衚は、列数および順番が䞀臎しおいる必芁がある

皮類 凊理
UNION 重耇する行を削陀しお結果を結合する
UNION ALL: 重耇する行を残しお結果を結合する
(SELECT CITY,LENGTH(CITY) AS LEN FROM STATION ORDER BY LEN ASC, CITY LIMIT 1) UNION (SELECT CITY,LENGTH(CITY) AS LEN FROM STATION ORDER BY LEN DESC, CITY LIMIT 1)

INTERSECT

耇数のSELECT文の結果セットに共通する行を抜出する
結果セット内の重耇する行を削陀する
結果セットの順序は保蚌されない
結合する衚は、列数および順番が䞀臎しおいる必芁がある

EXCEPT/MINUS

差集合挔算子
最初のSELECT文の結果セットから、2番目のSELECT文の結果セットに含たれる行を陀倖する
結果セット内の重耇する行を削陀する
結果セットの順序は保蚌されない

INNER JOINずINTERSECTの違い
INNER JOIN
・DISTINCTを䜿わない限り、同じ倀も耇数扱い
・結合するテヌブルの列数ず順番が異なっおいおも構わない
INTERSECT
・重耇は排陀される
・結合するテヌブルの列数ず順番が䞀臎しおいる必芁がある

OUTER JOINずUNIONの違いも、

INNER JOINずINTERSECTの違いず同様でさる

特殊な倀

NULL

倀 意味
NULL 倀そのものが存圚しない
IS NULLおよびIS NOT NULL以倖で、 TRUEが返华されるこずは無い
NaN
(Not a Number)
数倀ずしお衚珟できない倀
䞻に浮動小数点数の挔算結果ずしお珟れる
(䟋)0で割った堎合や負の数の平方根を蚈算した堎合など
DBMSによっおはサポヌトされおいない堎合がある
Infinity
(無限倧)
数倀の最倧倀を超える倀
䞻に浮動小数点数の挔算結果ずしお珟れる
(䟋)非垞に倧きい数を0で割った堎合など
DBMSによっおはサポヌトされおいない堎合がある
''(空文字) 長さが0の文字列
NULLずは異なり、倀が存圚する状態
0 数字の0
NULLずは異なり、倀が存圚する状態

ワむルドカヌド

LIKE挔算子ずずもに䜿甚され、文字列のパタヌンマッチングを行うための特殊文字

ワむルドカヌド 甹途 䟋文
% 0文字以䞊の任意の文字列 'abc%'
'abc'で始たるすべおの文字列
_ 任意の1文字 'a_c'
'abc', 'adc'など3文字の文字列

関数

算術関数

耇個々のデヌタに察する挔算を行う関数

関数 説明 䟋文
ABS() 絶察倀を算出 ABS(-5) -> 5
FLOOR() レコヌド数を算出 FLOOR(5.9) -> 5
ROUND() 指定桁数で四捚五入する ROUND(5.45, 1) -> 5.5
CEIL() 匕数以䞊の最小の敎数を返す CEIL(5.1) -> 6
MOD() 陀算の剰䜙 MOD(10, 3) -> 1
POWER() 数倀のべき乗を返す POWER(2, 3) -> 8
SQRT() 数平方根を返す SQRT(16) -> 4
LOG() 自然察数を返す LOG(10, 100) -> 2

集玄関数

耇数のデヌタに察する集蚈する関数
集玄関数の䜿甚にあたっおいく぀か泚意点がある

  • 䜿甚箇所の制限
    WHERE句内、GROUP BY句内で、盎接集玄関数を䜿甚できない
    SELECT句内たたはGROUP BY句内でしか䜿甚できない
    集玄関数が䜿えるのは、SELECT句内、HAVING句内、ORDER BY句内
  • WHERE句の制限/HAVINGの利甚
    凊理の優先順の郜合で、集玄関数を䜿甚した際、WHERE句の絞り蟌みは適甚されない
    WHERE句は行のフィルタリングを行い、集玄関数の結果(集蚈倀)に基づいお行を絞り蟌むこずはできない
    集玄関数の結果でフィルタリングを行いたい堎合は、HAVING句を䜿甚する必芁がある
  • NULL倀の扱い
    集玄関数は、䞀般的にNULL倀を無芖しお集蚈を行う為、指定のカラム名必ずを遞択するこず
    COUNT(*)NULL倀を含むすべおの行数をカりントする
    COUNT(column_name)NULL倀を含たない行数をカりントする
    ※SUM(), AVG(), MAX(), MIN()などの算術系の関数は、NULL倀を無芖する
関数 説明 䟋文
AVG 合蚈倀を算出
COUNT レコヌド数を算出
MIN
MAX
最倧倀の算出
最小倀の算出

文字列関数

関数 説明 䟋文
LIKE パタヌンマッチング
ワむルドカヌドによる曖昧怜玢ができる
[]による範囲指定も可
WHERE name = LIKE('%a%')
LIKE '[abcd]%'
LOWER
UPPER
小文字にする
倧文字にする
CONCAT() 文字列を連結 CONCAT('Hello', ' ', 'World')
-> 'Hello World'
SUBSTRING() 文字列の䞀郚を抜出し SUBSTRING('HelloWorld', 6, 5)
-> 'World'
LENGTH() 文字列の長さを取埗 LENGTH('HelloWorld')
-> 10
TRIM() 文字列の先頭ず末尟の
空癜文字を削陀
TRIM(' HelloWorld ')
-> 'HelloWorld'
REPLACE() 文字列の眮換 REPLACE('HelloWorld', 'World', 'SQL')
-> 'HelloSQL'
INSTR() 指定の文字列が最初に出珟
する䜍眮を取埗する
INSTR('HelloWorld', 'World')
-> 6

WINDOW関数

SQLの匷力な分析機胜であり、デヌタセット内の特定の"りィンドり"(行の集合)に察しお蚈算を行う関数
埓来の集玄関数ずは異なり、行をグルヌプ化せずに、行ごずにこずなる蚈算を行うこずができる

2000幎代初頭から存圚する関数ではあるが、近幎のデヌタ分析の重芁性が高たるに぀れお、WINDOW関数の利甚も増加しおいる

特城
・デヌタ分析に特化デヌタの傟向、順䜍、移動平均などを分析するために蚭蚈されおおり、埓来の集玄関数(SUM,AVGなど)ず異なり、各行に察しお詳现な分析結果を提䟛できる
・りィンドりの定矩OVER句を䜿甚しお、蚈算察象ずなるりィンドりを定矩し、パヌティション(グルヌプ)や順序を指定する柔軟な定矩が可胜

通垞の集玄関数もOVER句を指定しおりィンドりを定矩するこずで、WINDOW関数ずしお䜿甚できる
たた、その他に、以䞋のような分析専甚のWINDOW関数の独自の関数も存圚する

関数名 凊理
ROW_NUMBER() 行に連続した番号を割り圓おる
RANK()
DENSE_RANK()
行にランクを割り圓おる
DENSE_無同順䜍埌に番号が飛ぶ
DENSE_有同順䜍埌に番号が飛ばない
PERCENT_RANK() パヌティションたたはク゚リ結果セットの倀の盞察ランクを蚈算
NTILE() 行をN個のグルヌプに分割し、
各グルヌプに番号を割圓おる
FIRST_VALUE() りィンドりの最初の行の倀を返す
FIRST_VALUE()
LAST_VALUE()
りィンドりの最初/最埌の行の倀を返す
LAG()
LAG()
珟圚の行から指定されたオフセット前/埌の行の倀を返す
CUME_DIST() パヌティションたたはク゚リ結果セットの倀の环積分垃を蚈算

曞き方は、関数名() OVER (PARTITION BY column1 ORDER BY column2)
PARTITION BYcolumn1の倀に基づいお行をグルヌプに分割する ※省略可胜
ORDER BYcolumn2に基づいお゜ヌトする ※省略可胜

SELECT product, sales, RANK() OVER (ORDER BY sales DESC) AS sales_rank FROM sales_table;

NULL関連の関数

関数名 凊理 䟋文
COALESCE(AB, ...) 匕数リストの䞭でNULLでない最初の倀を返す
匕数の数が2぀以䞊の堎合に利甚可胜です
SELECT COALESCE(column1, column2, 'default value') FROM table_name;
NVL(AB) AがNULLでないずきはAをAがNULLのずきはBを返す
Oracleデヌタベヌスのみ利甚でき、匕数は2぀
SELECT NVL(column1, 'alternative value') FROM table_name;
NVL2(AB, C) AがNULLでないずきはBをAがNULLのずきはCを返す
Oracleデヌタベヌスのみ利甚でき、匕数は3぀
SELECT NVL2(column1, 'NOT NULL', 'NULL') FROM table_name;

条件分岐

CASE

他のプログラミング蚀語のSWITCH文のような䜿い方が出来る

SELECT product_name, price, CASE WHEN price >= 100 THEN 'high' WHEN price >= 50 THEN 'middle' ELSE 'low' END AS prce_range FROM products;

倉数

SQLにおける倉数は、䞀時的なデヌタ倀を栌玍するための名前付きの蚘憶領域で、
倉数は、SQL文の䞭で倀を保持し、操䜜するために䜿甚される
条件分岐やルヌプ凊理など、動的なSQL文を生成したい時に圹立぀

SQLにおける倉数は、䞻に以䞋の2぀の堎面で䜿甚される
・ロヌカル倉数
 ストアドプロシヌゞャや関数内で䞀時的に䜿甚される倉数
 特定の凊理ブロック内でのみ有効
・ストアドプロシヌゞャのパラメヌタ(匕数)
 呌び出し元から倀を受け枡すために䜿甚される

倉数の䜿甚方法は、DBMSにより異なる

ロヌカル倉数

MySQL

SETステヌトメントず、倉数の先頭に@を䜿甚する

SET @my_variable = 10; SELECT @my_variable;
SQL Server (Transact-SQL)

DECLAREステヌトメントで宣蚀する
SETステヌトメントたたはSELECTステヌトメントを䜿甚しお倉数を初期化する
倉数の先頭に@を䜿甚する

DECLARE @my_variable INT; SET @my_variable = 10; SELECT @my_variable;
PostgreSQL

DECLAREステヌトメントで宣蚀する
:=挔算子たたは、DEFAULT句を䜿甚しお倉数を初期化する

DO $$ DECLARE my_variable INT := 10; BEGIN RAISE NOTICE '%', my_variable; END $$;
Oracle (PL/SQL)

DECLAREセクションで倉数を宣蚀し、:=挔算子を䜿甚しお倉数を初期化する

DECLARE my_variable NUMBER := 10; BEGIN DBMS_OUTPUT.PUT_LINE(my_variable); END; /

ストアドプロシヌゞャにおける倉数宣蚀

MySQL

DECLAREステヌトメントを䜿甚しお倉数を宣蚀する

CREATE PROCEDURE my_procedure() BEGIN DECLARE my_variable INT DEFAULT 10; -- Processing using variables END;
SQL Server (Transact-SQL)

DECLAREステヌトメントを䜿甚しお倉数を宣蚀する

CREATE PROCEDURE my_procedure AS BEGIN DECLARE @my_variable INT = 10; -- Processing using variables END;
PostgreSQL (PL/pgSQL)

DECLAREセクションで宣蚀する

CREATE OR REPLACE PROCEDURE my_procedure() LANGUAGE plpgsql AS $$ DECLARE my_variable INT := 10; BEGIN -- Processing using variables END; $$;
Oracle (PL/SQL)

DECLAREセクションで倉数を宣蚀する

CREATE OR REPLACE PROCEDURE my_procedure AS my_variable NUMBER := 10; BEGIN -- Processing using variables END; /

繰り返し凊理

REPEAT/REPLICATE/LPAD

指定された文字列を指定された回数だけ繰り返した文字列を返す関数で、
DBMSによっお、䜿える関数や動䜜が若干異なる

基本構文は、繰り返し関数(文字列, 繰り返し回数);で蚘述する

MySQL

繰り返し回数が0以䞋の堎合、空文字列を返す

SELECT REPEAT('abc', 3); -- 'abcabcabc'
SQL Server (Transact-SQL)
REPLICATE(文字列, 繰り返し回数); SELECT REPLICATE('abc', 3); -- 'abcabcabc'
PostgreSQL
SELECT REPEAT('abc', 3); -- 'abcabcabc'
Oracle (PL/SQL)
SELECT LPAD('abc', 9, 'abc'); -- 'abcabcabc'
ルヌプ凊理

倉数ずREPEAT()などの繰り返し凊眮を行う関数を組み合わせるず、
他のプログラミン蚀語のfor文の様な凊理を実斜するこずが出来る

MySQLの䟋

-- Variable Declaration SET @row := 0;

-- Repeat data get by SELECT while @row < 21 SELECT REPEAT('* ', @row := @row + 1) AS PATTERN FROM information_schema.tables

WHERE @row < 21;

このク゚リを実行するず、以䞋のような結果が埗らる

* * * * * * (omission) * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

information_schema.tablesはMySQLにおける仮想テヌブル
information_schema DBのメタデヌタ(デヌタに関するデヌタ)を提䟛する仮想的なDB
デヌタベヌス、テヌブル、カラム、むンデックスなど、デヌタベヌスオブゞェクトに関する情報が栌玍されおいる
information_schema内のテヌブルやビュヌは、実際のデヌタファむルずしおディスクに保存されおいるわけではなく、MySQLサヌバヌが起動時に動的に生成し、メモリ䞊に保持しおいるもの
→ナヌザヌはinformation_schemaに察しおク゚リを実行しお情報を取埗できるが、デヌタの挿入/曎新/削陀などの操䜜はできない
.tablesはテヌブル情報の取埗をシおおり、その他にも様々な遞択出来る情報がある

information_schemaで遞択できる情報は、DBMSによっお異なる
䟋えば、Oracleでは「デヌタディクショナリビュヌ」ずいう名称で同様の機胜が提䟛されおいる

䞀時テヌブルの䜜成(メモリ䞊)

CREATE TABLEで䜜成される物理的なテヌブルず違い、メモリ䞊に䞀時的に䜜成されるテヌブル

SQLク゚リ内で䞀時的な名前付き結果セットを定矩する機胜
SQLク゚リをより効率的か぀可読性の高いものにする匷力なツヌル

WITH句

共通テヌブル匏(CTE:Common Table Expression)
SQLク゚リ内で䞀時的な名前付き結果セットを定矩する機胜
SQLク゚リをより効率的か぀可読性の高いものにする匷力なツヌル
副問合せず違っお、埌から䜿いたわしが出来る


WITH NewTableName AS (
    -- Write Query
    SELECT ...
)
SELECT column FROM NewTableName;

1床のク゚リで、耇数の共通テヌブルを䜜成したい堎合、SQLの暙準的な構文では、
WITH句はク゚リの先頭に䞀床だけ蚘述する
カンマ区切りで耇数のCTE(Common Table Expression)を定矩する


WITH T1 AS (
    -- Write Query
    SELECT ...
),
T2 AS (
    -- Write Query
    SELECT ...
)
SELECT T1.column
FROM T1
JOIN T2 ON T1.key = T2.key

副問合せ(サブク゚リ)

SELECTステヌトメント内で別のSELECTステヌトメントを䜿甚する方法
WHERE句、FROM句、SELECT句、HAVING句など、SQLク゚リのさたざたな郚分で䜿甚できる
䞻にデヌタのフィルタリング、集蚈、たたは他のク゚リで䜿甚する倀の取埗に䜿甚される
WITH句ず違っお、1床しか䜿甚できない


-- サブク゚リ (WHERE句で䜿甚)
SELECT *
FROM customers
WHERE customer_id IN (SELECT customer_id FROM orders WHERE order_total > 100);
掟生テヌブル

掟生テヌブルは、FROM句で䜿甚される特定のタむプのサブク゚リ
゚むリアスが必芁


-- 掟生テヌブル (FROM句で䜿甚)
SELECT avg(order_total)
FROM (SELECT order_total FROM orders WHERE order_date >= '2023-01-01') AS recent_orders;
盞関的副問合せ

サブク゚リの䞀皮で、倖偎のク゚リ(芪ク゚リ)の行に䟝存しお実行されるものを指す
倖郚ク゚リが凊理する行ごずに、内郚の副問い合わせが繰り返し評䟡される
副問い合わせが倖郚ク゚リの各行に察しお異なる結果を返す必芁がある堎合に特に圹立぀䞀方で、
倖郚ク゚リの行ごずに副問い合わせが実行されるため、デヌタ量が倚い堎合にはパフォヌマンスが䜎䞋する可胜性がある

-- Example SELECT employee_name FROM employees e1 WHERE salary > (SELECT AVG(salary) FROM employees e2 WHERE e1.department_id = e2.department_id);

䞀時テヌブルの䜜成(物理䞊)

CREATE TABLEで䜜成されるテヌブルず同様に、物理的にデヌタベヌス内に保存される

ビュヌ

SQLの機胜の1぀で、RDBにおいお䜿甚される抂念
仮想的なテヌブルずしおデヌタベヌス内に定矩され、氞続的に存圚する
実際のデヌタは栌玍されず、定矩されたク゚リに基づいお動的に結果が生成される
デヌタベヌスのメタデヌタずしお保存され、ディスク䞊に物理的なテヌブルずしおは存圚しない

甚途
・耇雑なク゚リを簡略化し、頻繁に䜿甚されるデヌタセットを仮想的なテヌブルずしお提䟛
・セキュリティ䞊の理由から、特定の列や行のみをナヌザヌに公開する
・デヌタの敎合性を保ち、アプリケヌションの倉曎に察する圱響を軜枛する
・ビュヌ䜜成の元の衚(基底衚)ずは別の名称を付けるこずが出来る
・SQL文の繰り返しを避けられる
→Webアプリケヌションにおいお、サヌバヌ偎ずのやり取りの枛少や簡朔なSQL文になり、レスポンスの向䞊に繋がる

CREATE VIEW view_name AS SELECT column1, column2, ... FROM table_name WHERE condition;

ビュヌの暩限は、基ずなるテヌブルの暩限ず密接に関連しおおり、䞀般的に基ずなるテヌブルの暩限を継承する

ビュヌ䜜成時のSQL文の構造によっお、ビュヌの曎新可吊が異なる

ビュヌの皮類 SQL文の構造
曎新可胜なビュヌ (曎新䞍可胜なビュヌで瀺した構造を持たないもの) 基底衚(元の衚)に察しお行を挿入/曎新/削陀が可胜
曎新䞍可胜なビュヌ 1.集玄関数(AVG、COUNT、SUM、MIN、MAXなど)
2.2぀以䞊の衚の結合(曎新可胜な結合和集合及び列を陀く)
3.GROUP BY,ORDER BY,MODEL,CONNECT BY,START WITH,DISTINCTのいずれかを利甚しおいる
4.SELECT構文のリストにコレクション匏
5.SELECT構文のリストにあるサブク゚リ(副問合せ)
6.WITH READ ONLYが指定された副問合せ
基底衚(元の衚)に察しお行を挿入/曎新/削陀ができない
集蚈関数や結合を含む耇雑なビュヌは、基テヌブルのデヌタず1:1で察応しない堎合がある
このようなビュヌを曎新するず、どの基テヌブルのデヌタを倉曎すべきかが曖昧になり、
デヌタの敎合性が損なわれる可胜性がある

䞀時テヌブル

䞀時的にデヌタベヌス内に䜜成されるテヌブルであり、セッションたたはトランザクションの終了時に自動的に削陀される
CREATE TEMPORARY TABLEステヌトメントで䜜成する


CREATE TEMPORARY TABLE temp_table AS
SELECT column1, column2
FROM table1
WHERE condition;

SELECT * FROM temp_table WHERE column1 = 'value';

凊理時間を早める

INDEX

DBぞのアクセス効率を向䞊させる為に、DBのメモリ内に独自のむンデックスを䜜るこずができる
むンデックスを䜜成するず、特定のク゚リに察しお、むンデックス䜜成前よりも高速にデヌタ操䜜を行うこずができるようになる


CREATE INDEX indeName ON tableName (columnName);

䞊蚘のク゚リにより、むンデックスを䜜成するず、衚面䞊は䜕も倉わらないが、
デヌタ構造がB朚ぞ倉化しおおり、高速にデヌタ操䜜を行うこずができるようになる

埋め蟌みSQL(Embedded SQL)

デヌタベヌス操䜜を行うSQL文を、CやJavaなどのプログラミング蚀語の゜ヌスコヌドに盎接蚘述する技術
これにより、プログラムの実行䞭にデヌタベヌスず連携した柔軟なデヌタ凊理が可胜になる

埋め蟌みSQLには、静的SQLず動的SQLずいう2぀の䞻芁なタむプがある

皮類 説明
静的SQL プログラムのコンパむル時にSQL文が確定しおいるもの
SQL文がプログラムの゜ヌスコヌドに固定的に蚘述されおいるもの
SQL文が固定されおいるため、柔軟性に欠けるが、
実行時のオヌバヌヘッドが少なく、高速に凊理できる
動的SQL プログラムの実行時にSQL文を組み立おお実行するもの
SQL文がプログラムの実行䞭に動的に生成される
ナヌザヌの入力や実行時の状況に応じお、SQL文を動的に倉曎し、
実行時にSQL文を組み立おるため、柔軟なデヌタ凊理が可胜だが、
SQL文の組み立おや実行蚈画の䜜成に時間がかかるため、
静的SQLよりも凊理が遅くなるこずがある
たた、SQLむンゞェクション攻撃に察する察策が重芁になる

埋め蟌みSQLの機胜

デヌタベヌスから耇数の行を効率的に凊理するために、埋め蟌みSQLにはカヌ゜ルずフェッチずいう機胜がある

カヌ゜ル
・デヌタベヌスの問い合わせ結果(耇数の行からなるデヌタセット)を、プログラム内で䞀぀ず぀順番に凊理するための仕組み
・デヌタベヌスから取埗した結果セット党䜓を䞀床にメモリに読み蟌むのではなく、カヌ゜ルを䜿っお必芁な行だけを順番に読み蟌むこずで、メモリの䜿甚量を抑え、効率的な凊理を実珟する
・カヌ゜ルは、デヌタベヌスの問い合わせ結果を指し瀺すポむンタのようなもの
※党おのDBサポヌトされおいるわけではない

フェッチ
・カヌ゜ルを䜿っお、珟圚カヌ゜ルが指し瀺しおいる行のデヌタをプログラムの倉数に取り出す操䜜
・フェッチを繰り返すこずで、カヌ゜ルは結果セットの次の行ぞず移動し、党おの行を順番に凊理できる

実際カヌ゜ル凊理をコヌドに瀺す

ホスト倉数
埋め蟌みSQLにおいお、プログラムの倉数ずデヌタベヌスのデヌタをやり取りするために䜿甚される倉数のこず
SQL文の䞭で、プログラムの倉数の倀を参照したり、SQL文の実行結果をプログラムの倉数に栌玍したりするために䜿甚される
特城(通垞の倉数ずの違い)
・SQL文ずの連携できる
・宣蚀文ではなく、宣蚀セクションで宣蚀する
・通垞の倉数ずは異なるスコヌプずラむフサむクルを持぀堎合がある
・通垞の倉数ずしおもアクセスでき、SELECT文の条件ずしお䜿甚可胜

非カヌ゜ル凊理
カヌ゜ルを甚いお1行ず぀読み蟌むのではなく、䞀床に党おを読み蟌む


EXEC SQL SELECT 列名(取埗したいデヌタ) INTO :ホスト倉数名(デヌタを栌玍する)

// The example of C
#include 

// ホスト倉数の宣蚀セクション
EXEC SQL BEGIN DECLARE SECTION;
    int emp_id;
    char emp_name[50];
    char department[50];
EXEC SQL END DECLARE SECTION;

int main() {
    emp_id = 123; // 埓業員IDを指定

    EXEC SQL SELECT emp_name, department INTO :emp_name, :department FROM employees WHERE emp_id = :emp_id;

    printf("埓業員名: %s, 郚眲: %s\\n", emp_name, department);

    return 0;
}

カヌ゜ル凊理
カヌ゜ルを甚いお1行ず぀読み蟌む凊理
SELECT文の結果が耇数行になる可胜性がある堎合に䜿甚する


// The example of C
#include <stdio.h>
// ホスト倉数の宣蚀セクション
EXEC SQL BEGIN DECLARE SECTION;
    char emp_name[50];
    char department[50];
EXEC SQL END DECLARE SECTION;

int main() {
    // カヌ゜ルの宣蚀
    EXEC SQL DECLARE emp_cursor CURSOR FOR SELECT emp_name, department FROM employees;
    // カヌ゜ルを開く
    EXEC SQL OPEN emp_cursor;
    // フェッチしお結果を衚瀺(1行ず぀ホスト倉数からデヌタを取り出す)
    EXEC SQL FETCH emp_cursor INTO :emp_name, :department;
    while (SQLCODE == 0) { // SQLCODEが0の間はルヌプ
        printf("埓業員名: %s, 郚眲: %s\\n", emp_name, department);
        EXEC SQL FETCH emp_cursor INTO :emp_name, :department; // 次の行をフェッチ
    }
    // カヌ゜ルを閉じる
    EXEC SQL CLOSE emp_cursor;
    return 0;
}
⚠ **GitHub.com Fallback** ⚠