SQL入門

この記事は約16分で読めます。

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]
;Code language: CSS (css)

システム開発の現場では、予約語を表名、列名などとして使用することは紛らわしく、システムトラブルの温床となるため使用することはありません。

大文字と小文字の区別

SQL文では大文字と小文字は区別していません。以下のSQLはいずれも同じ結果が返ってきます。

SELECT * FROM COMMON;
SELECT * FROM common;
SELECT * FROM Common;

ただし、データベース製品によってはオブジェクト名(テーブルなど)は大文字と小文字を区別されることがあります。また、データベース内の文字列データは大文字と小文字を区別されます。ただし、これもデータベース製品や設定などによって区別されないこともあります。

SELECT * FROM COMMON WHERE NAME = 'parts';
SELECT * FROM COMMON WHERE NAME = 'Parts';Code language: JavaScript (javascript)

空白文字

空白文字とは半角スペース、タブ、改行などです。

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
;
*/Code language: JSON / JSON with Comments (json)

文中コメント行

SELECT 
      NUMBER,
      /* MAKER,
      ID,
      NAME */
FROM COMMON    
WHERE NUMBER = 1
;Code language: JavaScript (javascript)

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
年を取り出すYEAR・SQLServer
・MySQL
・Access
・DB2
日を取り出すDAY・SQLServer
・MySQL
・Access
・DB2
分を取り出すMINUTE・MySQL
・Access
・DB2
月を英文字列で得るMONTHNAME・MySQL
・DB2
日付要素を文字列で得るDATENAME・SQLServer
時刻を整形するTIME_FORMAT・MySQL
日付値から任意の日付要素の
数値を取得
DATE_PART
日付値から任意の日付要素の
数値を切り捨てる
DATE_TRUNC

計算

意味命令対象DB
年間の通算日を得るDAYOFYEAR・MySQL
・DB2
曜日を数値で得るDAYOFWEEK・MySQL
・ DB2
曜日を数値で得るWEEKDAY・MySQL
・Access
次の指定した曜日の日付値を得るNEXT_DAY
年齢を計算するAGE
日付の足し算DATE_ADD・MySQL
日付の引き算DATE_SUB・MySQL
日付の差を月単位で計算MONTHS_BETWEEN
紀元0年1月1日からの日数を日付にするFROM_DAYS・MySQL
期間PにN月を加算PERIOD_ADD・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
平均値を算出するAVG・SQLServer
・MySQL
・Oracle
・PostgreSQL
・DB2
・SQLite
・Access
・ANSI
最大値を得るMAX・SQLServer
・MySQL
・Oracle
・PostgreSQL
・DB2
・SQLite
・Access
・ANSI
相間係数を算出するCORR/CORRELATION
集計行かどうか判定GROUPING・SQLServer
・Oracle
・DB2
意味命令対象DB
合計値を算出するSUM・SQLServer
・MySQL
・Oracle
・PostgreSQL
・DB2
・SQLite
・Access
・ANSI
最小値を得るMIN・SQLServer
・MySQL
・Oracle
・PostgreSQL
・DB2
・SQLite
・Access
・ANSI
行数を数えるCOUNT・SQLServer
・MySQL
・Oracle
・PostgreSQL
・DB2
・SQLite
・Access
・ANSI

集計・偏差

意味命令対象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
データ型を変換CAST・SQLServer
・MySQL
・Oracle
・PostgreSQL
・DB2
・ANSI
データ型を変換CONVERT・SQLServer
NULL値を変換ISNULL・SQLServer
・DB2
・Access
NULL値を変換NVL
日付型に変換TO_DATE
意味命令対象DB
NULL値でない最初の値を返すCOALESCE・SQLServer
・MySQL
・Oracle
・PostgreSQL
・DB2
・SQLite
値を変換DECODE
2つの引数が等しい場合にNULLを返すNULLIF・SQLServer
・MySQL
・Oracle
・PostgreSQL
・DB2
・SQLite
文字列型に変換TO_CHAR
数値型に変換TO_NUMBER

システム情報関数

システム

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

SQL基本操作

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

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

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

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

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

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

テーブル結合の詳細

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

行を並び替えする方法

データを登録する

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

データ更新する

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

データを削除する

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

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

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

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

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

対応:Oracle、MySQL、SQLServer

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

仮想表(DUAL)を使う方法

タイトルとURLをコピーしました