SQLとは
SQLとは「Structured Query Language」の略で「構造化問い合わせ言語」という意味です。SQLは、米国の米国の米国規格協会(ANSI)と国際標準化機構(ISO)で、リレーショナルデータベースの標準言語であることが認められています。
SQLにはデータ定義機能、データ操作機能、データ制御の3つの機能があります。
DDL | |
Data Definition Language データ定義命令 |
データベース、表、ユーザー等の作成、変更、削除を行うCREATE、ALTER、DROPなど |
DML | |
Data Manupilation Language データ操作命令 |
データの検索、挿入、更新、削除を行うSELECT、INSERT、UPDATE、DELETEなど |
DCL | |
Data Control Language データ制御文 |
データの変更を確定、取り消すためのコマンド COMMIT、ROLLBACKなど |
SQLの記述について
予約後の扱いについて
DMLの「SELECT」、「FROM」、「WHERE」、「INSERT」、「UPDATE」、「DELETE」など、DDLの「CREATE TABLE」、「DROP TABLE」命令、DCLの「GRANT」、「REVOKE」命令などの単語は予約語です。
予約語は表名(テーブル名)、列名(カラム名)などとして使用できません。しかし、どうしても予約語を表名や列名として使用した場合は、予約語を[]で囲んで指定します。
SELECT
[INSERT],
[UPDATE]
FROM [UPDATE]
;

システム開発の現場では、予約語を表名、列名などとして使用することは紛らわしく、システムトラブルの温床となるため使用することはありません。
大文字と小文字の区別
SQL文では大文字と小文字は区別していません。以下のSQLはいずれも同じ結果が返ってきます。
SELECT * FROM COMMON;
SELECT * FROM common;
SELECT * FROM Common;
ただし、データベース製品によってはオブジェクト名(テーブルなど)は大文字と小文字を区別されることがあります。また、データベース内の文字列データは大文字と小文字を区別されます。ただし、これもデータベース製品や設定などによって区別されないこともあります。
SELECT * FROM COMMON WHERE NAME = 'parts';
SELECT * FROM COMMON WHERE NAME = 'Parts';
空白文字
空白文字とは半角スペース、タブ、改行などです。
SQL文内では空白文字が連続した場合でも1つの空白文字として扱われます。長いSQL文を記述する場合は、改行や空白を入れて整形すると読みやすくなります。
以下のSQLはいずれも同じ結果が返ってきます。
SELECT * FROM COMMON WHERE NUMBER = 1;
SELECT * FROM COMMON WHERE NUMBER = 1;
SELECT
*
FROM COMMON
WHERE NUMBER = 1;
コメントの記述
1行のコメントを記述する場合は「–」(マイナス記号を2つ連続)に続けて記述します。
複数行のコメントを記述する場合は、コメント文を「/*」(開始)と「*/」(終了)で囲みます。SQL文中であっても「/*」「*/」で囲みます。
1行コメント行
--SELECT * FROM COMMON WHERE NUMBER = 1;
SELECT * FROM COMMON WHERE NUMBER = 1;
SELECT
*
FROM COMMON
WHERE NUMBER = 1;
複数行コメント行
/*
SELECT
NUMBER,
MAKER,
ID,
NAME
FROM COMMON
WHERE NUMBER = 1
;
*/
文中コメント行
SELECT
NUMBER,
/* MAKER,
ID,
NAME */
FROM COMMON
WHERE NUMBER = 1
;
SQL文末のカンマ要否
MySQL、Oracle、PostgreSQL、SQL ServerともSQL文の入力の最後に「;」つけます。DB2は「ステートメント終了文字」の指定として「;」(セミコロン)または「@」などを指定しますがデフォルトでは「;」でプロシージャの終わりが「@」。
AccessはSQL文末に「;」をつけません。
SQLServerではコマンド入力の場合は改行して「GO」があればSQL文のおわりとみなされます。また、SQL文をスクリプトとして記述しない場合も「;」は不要です。SQLLiteをSQLLiteManagerから使う場合は、SQL文の入力の最後には「;」をつけてもつけなくてもどうちらもで構いません。
関数
算術関数
意味 | 命令 | 対象 |
---|---|---|
絶対値 | ABS | SQL Server MySQL PostgreSQL Oracle DB2 SQLite Access |
最小の整数 | CEIL/CEILING | SQL Server MySQL PostgreSQL Oracle DB2 |
べき乗 | POW/POWER | SQL Server MySQL PostgreSQL Oracle DB2 |
3乗根 | CBRT | |
サイン | SIN | SQL Server MySQL PostgreSQL Oracle DB2 Access |
タンジェント | TAN | SQL Server MySQL PostgreSQL Oracle DB2 Access |
逆タンジェント | ATAN/ATN | SQL Server MySQL PostgreSQL Oracle DB2 Access |
ラジアンを度に変換 | DEGREES | SQL Server MySQL PostgreSQL Oracle DB2 Access |
円周率 | PI | SQL Server MySQL PostgreSQL |
AND演算 | BITAND |
意味 | 命令 | 対象 |
---|---|---|
符号を得る | SIGN/SGN | SQL Server MySQL PostgreSQL Oracle DB2 Access |
値をまるめる | ROUND | SQL Server MySQL PostgreSQL Oracle DB2 SQLite Access |
平方根 | SQRT/SQR | SQL Server MySQL PostgreSQL Oracle DB2 |
指数値 | EXP | SQL Server MySQL PostgreSQL Oracle DB2 |
コサイン | COS | SQL Server MySQL PostgreSQL Oracle DB2 SQLite Access |
逆サイン | ASIN | SQL Server MySQL PostgreSQL Oracle DB2 |
逆タンジェント | ATAN2/ATN2 | SQL Server MySQL PostgreSQL Oracle DB2 |
引数の中の最大値 | GREATEST | MySQL Oracle |
乱数 | RAND/RANDOM/RND | SQL Server MySQL PostgreSQL SQLite Access |
意味 | 命令 | 対象 |
---|---|---|
最大の整数 | FLOOR | SQL Server MySQL PostgreSQL Oracle DB2 |
切り捨て | TRUNC/TRUNCATE | MySQL PostgreSQL Oracle DB2 |
2乗 | SQUARE | SQL Server |
自然対数 | LN/LOG/LOG10 | SQL Server MySQL PostgreSQL Oracle DB2 Access |
双曲線コサイン | COSH | |
逆コサイン | ACOS | SQL Server MySQL PostgreSQL Oracle DB2 Access |
コタンジェント | COT | SQL Server MySQL PostgreSQL Oracle DB2 Access |
引数の中の最小値 | LEAST | MySQL Oracle |
余剰 | MOD | MySQL PostgreSQL Oracle DB2 |
文字列関数
変換
意味 | 命令 | 対象 |
---|---|---|
文字をASCIIコードに変換 | ASC/ASCII | SQL Server MySQL PostgreSQL Oracle DB2 Access |
ユニコードを文字に変換 | NCHAR/NCHR | SQL Server Oracle |
数値を8進数の文字列に変換 | OCT | MySQL |
文字列を区切り文字を使って連結 | CONCAT_WS | MySQL |
文字列が何番目に見つかったかを返す | FIELD | MySQL |
マルチバイト文字をコードに変換 | ORD | MySQL |
先頭文字を大文字に変換 | INITCAP | |
数値を2進数の文字列に変換 | BIN | MySQL |
N番目の文字列を返す | ELT | MySQL |
英文字を大文字に変換 | UPPER/UCASE | SQL Server MySQL Oracle PostgreSQL DB2 SQLite Access ANSI |
意味 | 命令 | 対象 |
---|---|---|
ASCIIコードを文字に変換 | CHR/CHAR | SQL Server MySQL PostgreSQL Oracle DB2 Access |
数値を文字列に変換 | STR | SQL Server Access |
数値を16進数の文字列に変換 | HEX | MySQL |
数値を指定した進数の文字列に変換 | CONV | MySQL |
カンマで区切られた文字の中から文字を探す | FIND_IN_SET | MySQL |
英文字を小文字に変換 | LOWER/LCASE | SQL Server MySQL Oracle PostgreSQL DB2 SQLite Access ANSI |
文字をユニコードに変換 | UNICODE | SQL Server |
文字列のビット長を取得 | BIT_LENGTH | MySQL |
指定されたビットに対する文字列のセットを返す | MAKE_SET | MySQL |
編集
意味 | 命令 | 対象 |
---|---|---|
文字列の左側の空白を削除 | LTRIM | SQL Server MySQL Oracle PostgreSQL DB2 Access |
文字列の両端の空白を削除 | BTRIM | |
右から文字列を充填 | RPAD | |
文字列の右部分を取り出す | RIGHT | |
文字列を置換 | REPLACE | |
文字列を結合 | CONCAT | |
文字列を置換または挿入する | INSERT | |
文字列の部分的入れ替え | TRANSLATE | |
文字列の部分切り出し | SUBSTRING |
文字長
意味 | 命令 | 対象 |
---|---|---|
文字列の長さを得る | LEN/LENGTH |
意味 | 命令 | 対象 |
---|---|---|
文字列の文字長を得る | CHAR_LENGTH/CHARACTER_LENGTH |
意味 | 命令 | 対象 |
---|---|---|
文字列のバイト数を得る | OCTET_LENGTH |
検索
意味 | 命令 | 対象 |
---|---|---|
文字列内に含まれる文字列を検索 | CHARINDEX | |
文字列中の文字を検索 | POSITION | |
文字列内の文字位置を検索 | LOCATE |
意味 | 命令 | 対象 |
---|---|---|
文字列内に含まれる文字列を検索 | INSTR | |
文字列中の文字を検索 | POSSTR |
日付刻関数
日付・時刻
意味 | 命令 | 対象DB |
---|---|---|
現在の日付を得る | CURRENT_DATE | |
現在の日付を得る | CURDATE | |
現在の時刻を得る | CURRENT TIME | |
現在の日付と時刻を得る | CURRENT_TIMESTAMP | |
現在の日付と時刻を得る | SYSDATE | |
現在の日付と時刻を得る | NOW | |
現在のUTCの日付と時刻を得る | GETUTCDATE | |
年と週を返す | YEARWEEK |
意味 | 命令 | 対象DB |
---|---|---|
現在の日付を得る | CURRENT DATE | |
現在の時刻を得る | CURRENT_TIME | |
現在の時刻を得る | CURTIME | |
現在の日付と時刻を得る | CURRENT TIMESTAMP | |
現在の日付と時刻を得る | GETDATE | |
現在の日付と時刻を得る | TIMEOFDAY | |
UNIXタイムスタンプを得る | UNIX_TIMESTAMP |
変換
意味 | 命令 | 対象DB |
---|---|---|
秒を時分秒に変換 | SEC_TO_TIME |
意味 | 命令 | 対象DB |
---|---|---|
時分秒を秒に変換 | TIME_TO_SEC |
編集
意味 | 命令 | 対象DB |
---|---|---|
年月日を取り出す | DATE | |
月を取り出す | MONTH | |
時を取り出す | HOUR | |
秒を取り出す | SECOND | |
曜日を英文字列で得る | DAYNAME | |
日付を整形する | DATE_FORMAT | |
日付値から任意の日付要素の数値を得る | EXTRACT | |
日付値から任意の日付要素の数値を得る | DATEPART | |
書式によって整形されたUNIXタイムスタンプを得る | FROM_UNIXTIME |
意味 | 命令 | 対象DB |
---|---|---|
年を取り出す | YEAR | |
日を取り出す | DAY | |
分を取り出す | MINUTE | |
月を英文字列で得る | MONTHNAME | |
日付要素を文字列で得る | DATENAME | |
時刻を整形する | TIME_FORMAT | |
日付値から任意の日付要素の数値を得る | DATE_PART | |
日付値から任意の日付要素の数値を切り捨てる | DATE_TRUNC | |
計算
意味 | 命令 | 対象DB |
---|---|---|
年間の通算日を得る | DAYOFYEAR | |
曜日を数値で得る | DAYOFWEEK | |
曜日を数値で得る | WEEKDAY | |
次の指定した曜日の日付値を得る | NEXT_DAY | |
年齢を計算する | AGE | |
日付の足し算 | DATE_ADD | |
日付の引き算 | DATE_SUB | |
日付の差を月単位で計算 | MONTHS_BETWEEN | |
紀元0年1月1日からの日数を日付にする | FROM_DAYS | |
期間PにN月を加算 | PERIOD_ADD |
意味 | 命令 | 対象DB |
---|---|---|
日を得る | DAYOFMONTH | |
四半期を数値で得る | QUARTER | |
月の最終日の日付値を得る | LAST_DAY | |
年間の通算週を取得 | WEEK | |
日付の足し算 | DATEADD | |
日付の差 | DATEDIFF | |
日付の引き算 | SUBDATE | |
月を加算 | ADD_MONTHS | |
紀元0年1月1日からの日数を得る | TO_DAYS | |
期間p1と期間p2の間の月数を計算 | PERIOD_DIFF |
集計関数
集計
意味 | 命令 | 対象DB |
---|---|---|
平均値を算出する | AVG | |
最大値を得る | MAX | |
相間係数を算出する | CORR/CORRELATION | |
集計行かどうか判定 | GROUPING |
意味 | 命令 | 対象DB |
---|---|---|
合計値を算出する | SUM | |
最小値を得る | MIN | |
行数を数える | COUNT |
集計・偏差
意味 | 命令 | 対象DB |
---|---|---|
標準偏差を算出する | STDDEV/STDEV |
意味 | 命令 | 対象DB |
---|---|---|
母集団標準偏差を算出する | STDDEV_POP/STDEVP |
集計・分散
意味 | 命令 | 対象DB |
---|---|---|
分散を算出する | VAR/VARIANCE |
意味 | 命令 | 対象DB |
---|---|---|
母集団分散を算出する | VAR_POP/VARP |
分析関数
分析
意味 | 命令 | 対象DB |
---|---|---|
同順位を飛ばさずに順位をつける | DENSE_RANK | |
行番号をつける | ROW_NUMBER | |
回帰直線のy切片を求める | REGR_INTERCEPT | |
ウィンドウを使った合計を求める | SUM~OVER~ |
意味 | 命令 | 対象DB |
---|---|---|
同順位を飛ばして順位をつける | RANK | |
回帰直線の傾きを求める | REGR_SLOPE | |
回帰直線の確定係数を求める | REGR_R2 |
変換関数
変換
意味 | 命令 | 対象DB |
---|---|---|
データ型を変換 | CAST | |
データ型を変換 | CONVERT | |
NULL値を変換 | ISNULL | |
NULL値を変換 | NVL | |
日付型に変換 | TO_DATE |
意味 | 命令 | 対象DB |
---|---|---|
NULL値でない最初の値を返す | COALESCE | |
値を変換 | DECODE | |
2つの引数が等しい場合にNULLを返す | NULLIF | |
文字列型に変換 | TO_CHAR | |
数値型に変換 | TO_NUMBER |
システム情報関数
システム
意味 | 命令 | 対象DB |
---|---|---|
権限チェックの際に使用されるユーザ名を戻す | CURRENT_USER | |
現在データベースを実行しているユーザ名 | USER |
意味 | 命令 | 対象DB |
---|---|---|
データベース接続を開始させたユーザ名を戻す | SESSION_USER |
SQL基本操作
テーブルからデータ(レコード)を抽出する基本的なやり方
条件にマッチするレコードの検索方法
テーブルとテーブルを結合する方法
RDBは複数のテーブルを作成しそれぞれのキー同士を結合してデータを抽出するのが基本となります。テーブル同士を結合して抽出する方法を解説しています。
行を並び替え(ソート)して抽出する方法
データを登録する
データ更新する
データを削除する
お手軽テーブルバックアップ方法
テーブルを参照する必要がない関数やシステム日付を取得する場合(仮想表)
Oracle MySQL SQLServer
関数テストやDB日付の取得等、実テーブル参照をする必要がない場合は仮想表を使います。