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
OracleDB2
・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
空白文字列を作成SPACESQLServer
・MySQL
・DB2
・Access
文字列を置き換えTRANSLATE
文字列の部分切り出しSUBSTR
SOUNDEXキーを求めるSOUNDEXSQLServer
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
文字列を置換または挿入するINSERTMySQL
DB2
文字列の部分的入れ替えSTUFFSQLServer
文字列の部分切り出しSUBSTRINGSQLServer
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
文字列内の文字位置を検索LOCATEMySQL
・DB2
意味命令対象
文字列内に含まれる文字列を検索INSTR関数MySQL
Oracle
Access
文字列中の文字を検索POSSTR

日付刻関数

日付・時刻

意味命令対象DB
現在の日付を得るCURRENT_DATE関数MySQL
PostgreSQL
・DB2
・Oralce
・ANSI
現在の日付を得るCURDATE関数MySQL
PostgreSQL
・DB2
・Oracle
・ANSI
現在の時刻を得るCURRENT TIMEMySQL
PostgreSQL
・DB2
・ANSI
現在の日付と時刻を得るCURRENT_TIMESTAMPSQLServer
MySQL
Oracle
PostgreSQL
・DB2
・ANSI
現在の日付と時刻を得るSYSDATEMySQL
・Oracle
現在の日付と時刻を得るNOWMySQL
PostgreSQL
Access
現在のUTCの日付と時刻を得るGETUTCDATESQLServer
年と週を返すYEARWEEKMySQL
意味命令対象DB
現在の日付を得るCURRENT DATE関数MySQL
PostgreSQL
DB2
Oracle
ANSI
現在の時刻を得るCURRENT_TIMEMySQL
PostgreSQL
DB2
ANSI
現在の時刻を得るCURTIMEMySQL
ANSI
現在の日付と時刻を得るCURRENT TIMESTAMP・SQLServer
MySQL
Oracle
・PostgreSQL
DB2
ANSI
現在の日付と時刻を得るGETDATESQLServer
現在の日付と時刻を得るTIMEOFDAY
UNIXタイムスタンプを得るUNIX_TIMESTAMPMySQL

変換

意味命令対象DB
秒を時分秒に変換SEC_TO_TIMEMySQL
意味命令対象DB
時分秒を秒に変換TIME_TO_SEC・MySQL

編集

意味命令対象DB
年月日を取り出すDATEMySQL
月を取り出すMONTHSQLServer
・MySQL
Access
・DB2
時を取り出すHOURMySQL
Access
・DB2
秒を取り出すSECONDMySQL
Access
DB2
曜日を英文字列で得るDAYNAMEMySQL
・DB2
日付を整形するDATE_FORMATMySQL
日付値から任意の日付要素の数値を得るEXTRACTMySQL
Oracle
PostgreSQL
ANSI
日付値から任意の日付要素の数値を得るDATEPARTSQLServer
Access
書式によって整形されたUNIXタイムスタンプを得るFROM_UNIXTIMEMySQL
意味命令対象DB
年を取り出すYEAR・SQLServer
MySQL
Access
・DB2
日を取り出すDAYSQLServer
MySQL
Access
・DB2
分を取り出すMINUTEMySQL
Access
・DB2
月を英文字列で得るMONTHNAMEMySQL
・DB2
日付要素を文字列で得るDATENAME・SQLServer
時刻を整形するTIME_FORMATMySQL
日付値から任意の日付要素の
数値を取得
DATE_PART
日付値から任意の日付要素の
数値を切り捨てる
DATE_TRUNC

計算

意味命令対象DB
年間の通算日を得るDAYOFYEAR・MySQL
・DB2
曜日を数値で得るDAYOFWEEKMySQL
DB2
曜日を数値で得るWEEKDAY・MySQL
・Access
次の指定した曜日の日付値を得るNEXT_DAY
年齢を計算するAGE
日付の足し算DATE_ADDMySQL
日付の引き算DATE_SUBMySQL
日付の差を月単位で計算MONTHS_BETWEEN
紀元0年1月1日からの日数を日付にするFROM_DAYSMySQL
期間PにN月を加算PERIOD_ADDMySQL
意味命令対象DB
日を得るDAYOFMONTH・MySQL
四半期を数値で得るQUARTERMySQL
DB2
月の最終日の日付値を得るLAST_DAYMySQL
Oracle
年間の通算週を取得WEEKMySQL
・DB2
日付の足し算DATEADDSQLServer
・Access
日付の差DATEDIFFMySQL
・SQLServer
Access
日付の引き算SUBDATEMySQL
月を加算ADD_MONTHS
紀元0年1月1日からの日数を得るTO_DAYSMySQL
期間p1と期間p2の間の月数を計算PERIOD_DIFFMySQL

集計関数

集計

意味命令対象DB
平均値を算出するAVGSQLServer
MySQL
Oracle
PostgreSQL
DB2
SQLite
Access
ANSI
最大値を得るMAXSQLServer
MySQL
Oracle
PostgreSQL
DB2
SQLite
Access
ANSI
相間係数を算出するCORR/CORRELATION
集計行かどうか判定GROUPINGSQLServer
Oracle
DB2
意味命令対象DB
合計値を算出するSUMSQLServer
MySQL
Oracle
PostgreSQL
DB2
SQLite
Access
ANSI
最小値を得るMINSQLServer
MySQL
Oracle
PostgreSQL
DB2
SQLite
Access
ANSI
行数を数えるCOUNTSQLServer
MySQL
Oracle
PostgreSQL
DB2
SQLite
Access
ANSI

集計・偏差

意味命令対象DB
標準偏差を算出するSTDDEV/STDEVSQLServer
MySQL
Oracle
PostgreSQL
・DB2
Access
意味命令対象DB
母集団標準偏差を算出するSTDDEV_POP/STDEVPSQLServer
Oracle
Access

集計・分散

意味命令対象DB
分散を算出するVAR/VARIANCESQLServer
MySQL
Oracle
PostgreSQL
DB2
Access
意味命令対象DB
母集団分散を算出するVAR_POP/VARPSQLServer
Oracle
Access

分析関数

分析

意味命令対象DB
同順位を飛ばさずに順位をつけるDENSE_RANK
行番号をつけるROW_NUMBERSQLServer
Oracle
DB2
回帰直線のy切片を求めるREGR_INTERCEPT
ウィンドウを使った合計を求めるSUM~OVER~
意味命令対象DB
同順位を飛ばして順位をつけるRANK
回帰直線の傾きを求めるREGR_SLOPE
回帰直線の確定係数を求めるREGR_R2

変換関数

変換

意味命令対象DB
データ型を変換CASTSQLServer
MySQL
Oracle
PostgreSQL
DB2
ANSI
データ型を変換CONVERTSQLServer
NULL値を変換ISNULLSQLServer
DB2
Access
NULL値を変換NVL
日付型に変換TO_DATE
意味命令対象DB
NULL値でない最初の値を返すCOALESCESQLServer
MySQL
Oracle
PostgreSQL
DB2
SQLite
値を変換DECODE
2つの引数が等しい場合にNULLを返すNULLIFSQLServer
MySQL
Oracle
PostgreSQL
DB2
SQLite
文字列型に変換TO_CHAR
数値型に変換TO_NUMBER

システム情報関数

システム

意味命令対象DB
権限チェックの際に使用されるユーザ名を戻すCURRENT_USER
現在データベースを実行しているユーザ名USER
意味命令対象DB
データベース接続を開始させたユーザ名を戻すSESSION_USER

SQL基本操作

テーブルからデータ(レコード)を抽出する基本的なやり方

基本的なレコード抽出方法

条件にマッチするレコードの検索方法

条件にマッチ(合致)するレコードの検索方法

テーブルとテーブルを結合する方法

RDBは複数のテーブルを作成しそれぞれのキー同士を結合してデータを抽出するのが基本となります。テーブル同士を結合して抽出する方法を解説しています。

テーブル結合の詳細

行を並び替え(ソート)して抽出する方法

行を並び替えする方法

データを登録する

テーブルにレコードを新規登録(INSERT文)する解説はこちら

データ更新する

既存レコードの特定カラムの値を更新(UPDATE文)する解説はこちら

データを削除する

テーブル内のレコードを削除する解説はこちら

お手軽テーブルバックアップ方法

SELECT結果から表(テーブル)のバックアップを簡単に作成することができます。

SELECT結果から表(テーブル)を作成する方法

テーブルを参照する必要がない関数やシステム日付を取得する場合(仮想表)

対応:OracleMySQLSQLServer

関数テストやDB日付の取得等、実テーブル参照をする必要がない場合は仮想表を使います。

仮想表(DUAL)を使う方法