SQL入門
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 |
最大の整数 | FLOOR関数 | ・SQL Server ・MySQL ・PostgreSQL ・Oracle ・DB2 |
切り捨て | TRUNC/TRUNCATE関数 | ・MySQL ・PostgreSQL ・Oracle ・DB2 |
2乗 | SQUARE関数 | ・SQL Server |
度をラジアルに変換 | RADIANS関数 |
意味 | 命令 | 対象 |
---|---|---|
符号を得る | 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 |
自然対数 | 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 |
編集
意味 | 命令 | 対象 |
---|---|---|
文字列から指定された文字を削除 | TRIM関数 | ・SQL Server ・MySQL ・Oracle ・PostgreSQL ・DB2 ・SQLite ・Access ・ANSI |
文字列の右側の空白を削除 | RTRIM関数 | ・SQLServer ・MySQL ・Oracle ・PostgreSQL ・DB2 ・SQLite ・Access |
左から文字列を充填 | LPAD関数 | ・MySQL ・Oracle ・PostgreSQL |
文字列の左部分を取り出す | LEFT関数 | ・SQLServer ・MySQL ・DB2 ・Access |
文字列を指定された回数を繰り返す | REPEAT/REPLICATE関数 | ・SQLServer ・MySQL ・PostgreSQL ・DB2 |
文字列を反転 | REVERSE関数 | ・SQLServer ・MySQL |
空白文字列を作成 | SPACE | ・SQLServer ・MySQL ・DB2 ・Access |
文字列を置き換え | TRANSLATE | |
文字列の部分切り出し | SUBSTR | |
SOUNDEXキーを求める | SOUNDEX | ・SQLServer ・MySQL ・DB2 ・Oracle |
意味 | 命令 | 対象 |
---|---|---|
文字列の左側の空白を削除 | LTRIM関数 | ・SQL Server ・MySQL ・Oracle ・PostgreSQL ・DB2 ・Access |
文字列の両端の空白を削除 | BTRIM | |
右から文字列を充填 | RPAD関数 | ・MySQL ・Oracle ・PostgreSQL |
文字列の右部分を取り出す | RIGHT関数 | ・SQLServer |
文字列を置換 | REPLACE関数 | ・SQLServer ・MySQL ・Oracle ・PostgreSQL ・DB2 ・SQLLite |
文字列を結合 | CONCAT関数 | ・MySQL ・Oracle ・DB2 |
文字列を置換または挿入する | INSERT | ・MySQL ・DB2 |
文字列の部分的入れ替え | STUFF | ・SQLServer |
文字列の部分切り出し | SUBSTRING | ・SQLServer ・MySQL ・PostgreSQL ・ANSI |
文字長
意味 | 命令 | 対象 |
---|---|---|
文字列の長さを取得 | LEN/LENGTH関数 | ・SQLServer ・MySQL ・Oracle ・PostgreSQL ・DB2 ・SQLite ・Access |
文字列の文字長を取得 | CHAR_LENGTH/CHARACTER_LENGTH関数 | ・MySQL ・PostgreSQL ・ANSI |
意味 | 命令 | 対象 |
---|---|---|
文字列のバイト数取得 | OCTET_LENGTH関数 | ・MySQL ・PostgreSQL ・ANSI |
検索
意味 | 命令 | 対象 |
---|---|---|
文字列内に含まれる文字列を検索 | CHARINDEX関数 | ・SQLServer |
文字列中の文字を検索 | POSITION関数 | ・MySQL ・PostgreSQL ・ANSI |
文字列内の文字位置を検索 | LOCATE | ・MySQL ・DB2 |
意味 | 命令 | 対象 |
---|---|---|
文字列内に含まれる文字列を検索 | INSTR関数 | ・MySQL ・Oracle ・Access |
文字列中の文字を検索 | POSSTR |
日付刻関数
日付・時刻
意味 | 命令 | 対象DB |
---|---|---|
現在の日付を得る | CURRENT_DATE関数 | ・MySQL ・PostgreSQL ・DB2 ・Oralce ・ANSI |
現在の日付を得る | CURDATE関数 | ・MySQL ・PostgreSQL ・DB2 ・Oracle ・ANSI |
現在の時刻を得る | CURRENT TIME | ・MySQL ・PostgreSQL ・DB2 ・ANSI |
現在の日付と時刻を得る | CURRENT_TIMESTAMP | ・SQLServer ・MySQL ・Oracle ・PostgreSQL ・DB2 ・ANSI |
現在の日付と時刻を得る | SYSDATE | ・MySQL ・Oracle |
現在の日付と時刻を得る | NOW | ・MySQL ・PostgreSQL ・Access |
現在のUTCの日付と時刻を得る | GETUTCDATE | ・SQLServer |
年と週を返す | YEARWEEK | ・MySQL |
意味 | 命令 | 対象DB |
---|---|---|
現在の日付を得る | CURRENT DATE関数 | ・MySQL ・PostgreSQL ・DB2 ・Oracle ・ANSI |
現在の時刻を得る | CURRENT_TIME | ・MySQL ・PostgreSQL ・DB2 ・ANSI |
現在の時刻を得る | CURTIME | ・MySQL ・ANSI |
現在の日付と時刻を得る | CURRENT TIMESTAMP | ・SQLServer ・MySQL ・Oracle ・PostgreSQL ・DB2 ・ANSI |
現在の日付と時刻を得る | GETDATE | ・SQLServer |
現在の日付と時刻を得る | TIMEOFDAY | |
UNIXタイムスタンプを得る | UNIX_TIMESTAMP | ・MySQL |
変換
意味 | 命令 | 対象DB |
---|---|---|
秒を時分秒に変換 | SEC_TO_TIME | ・MySQL |
意味 | 命令 | 対象DB |
---|---|---|
時分秒を秒に変換 | TIME_TO_SEC | ・MySQL |
編集
意味 | 命令 | 対象DB |
---|---|---|
年月日を取り出す | DATE | ・MySQL |
月を取り出す | MONTH | ・SQLServer ・MySQL ・Access ・DB2 |
時を取り出す | HOUR | ・MySQL ・Access ・DB2 |
秒を取り出す | SECOND | ・MySQL ・Access ・DB2 |
曜日を英文字列で得る | DAYNAME | ・MySQL ・DB2 |
日付を整形する | DATE_FORMAT | ・MySQL |
日付値から任意の日付要素の数値を得る | EXTRACT | ・MySQL ・Oracle ・PostgreSQL ・ANSI |
日付値から任意の日付要素の数値を得る | DATEPART | ・SQLServer ・Access |
書式によって整形されたUNIXタイムスタンプを得る | FROM_UNIXTIME | ・MySQL |
計算
意味 | 命令 | 対象DB |
---|---|---|
日を得る | DAYOFMONTH | ・MySQL |
四半期を数値で得る | QUARTER | ・MySQL ・DB2 |
月の最終日の日付値を得る | LAST_DAY | ・MySQL ・Oracle |
年間の通算週を取得 | WEEK | ・MySQL ・DB2 |
日付の足し算 | DATEADD | ・SQLServer ・Access |
日付の差 | DATEDIFF | ・MySQL ・SQLServer ・Access |
日付の引き算 | SUBDATE | ・MySQL |
月を加算 | ADD_MONTHS | |
紀元0年1月1日からの日数を得る | TO_DAYS | ・MySQL |
期間p1と期間p2の間の月数を計算 | PERIOD_DIFF | ・MySQL |
集計関数
集計
集計・偏差
意味 | 命令 | 対象DB |
---|---|---|
標準偏差を算出する | STDDEV/STDEV | ・SQLServer ・MySQL ・Oracle ・PostgreSQL ・DB2 ・Access |
意味 | 命令 | 対象DB |
---|---|---|
母集団標準偏差を算出する | STDDEV_POP/STDEVP | ・SQLServer ・Oracle ・Access |
集計・分散
意味 | 命令 | 対象DB |
---|---|---|
分散を算出する | VAR/VARIANCE | ・SQLServer ・MySQL ・Oracle ・PostgreSQL ・DB2 ・Access |
意味 | 命令 | 対象DB |
---|---|---|
母集団分散を算出する | VAR_POP/VARP | ・SQLServer ・Oracle ・Access |
分析関数
分析
意味 | 命令 | 対象DB |
---|---|---|
同順位を飛ばさずに順位をつける | DENSE_RANK | |
行番号をつける | ROW_NUMBER | ・SQLServer ・Oracle ・DB2 |
回帰直線のy切片を求める | REGR_INTERCEPT | |
ウィンドウを使った合計を求める | SUM~OVER~ |
意味 | 命令 | 対象DB |
---|---|---|
同順位を飛ばして順位をつける | RANK | |
回帰直線の傾きを求める | REGR_SLOPE | |
回帰直線の確定係数を求める | REGR_R2 |
変換関数
変換
システム情報関数
システム
意味 | 命令 | 対象DB |
---|---|---|
権限チェックの際に使用されるユーザ名を戻す | CURRENT_USER | |
現在データベースを実行しているユーザ名 | USER |
意味 | 命令 | 対象DB |
---|---|---|
データベース接続を開始させたユーザ名を戻す | SESSION_USER |
SQL基本操作
テーブルからデータ(レコード)を抽出する基本的なやり方
条件にマッチするレコードの検索方法
テーブルとテーブルを結合する方法
RDBは複数のテーブルを作成しそれぞれのキー同士を結合してデータを抽出するのが基本となります。テーブル同士を結合して抽出する方法を解説しています。
行を並び替え(ソート)して抽出する方法
データを登録する
テーブルにレコードを新規登録(INSERT文)する解説はこちら
データ更新する
既存レコードの特定カラムの値を更新(UPDATE文)する解説はこちら
データを削除する
テーブル内のレコードを削除する解説はこちら
お手軽テーブルバックアップ方法
SELECT結果から表(テーブル)のバックアップを簡単に作成することができます。
テーブルを参照する必要がない関数やシステム日付を取得する場合(仮想表)
対応:Oracle、MySQL、SQLServer
関数テストやDB日付の取得等、実テーブル参照をする必要がない場合は仮想表を使います。