【まとめ】ADO、SQLの書きかたすべて【基本・JOIN結合・使える、使えない構文】
「ADO、SQLの書きかたすべてをここに記す...」

ADOは他のSQLとちがって特殊。ここで覚えておくことを推奨する。

基本の書きかた

SELECT name, AVG(age), birthplace
FROM [data]
WHERE age > 3
GROUP BY name, birthplace
  • SELECT句...ほしい列を設定
  • FROM句...どこから情報をもってくるのか
  • WHERE句...~以上などの条件を設定
  • GROUP BY句...グループ化したい項目を設定

ここからは、それぞれの書きかたについて見ていこう。

SELECT句の書きかた

ほしいデータ列を, + 半角スペースで区切って設定する。

SELECT name, age, birthplace

*はムダなデータまで取得してしまうのでなるべく使わない。

SELECT *

SELECT句にDISTINCTを使うと重複が削除される。

SELECT DISTINCT birthplace

FROM句の書きかた

CSVを設定する場合、[]内にCSVファイル名を拡張子つきで書く。

FROM [file.csv] 

Excelシートを設定する場合、[]内にシート名を書き$を追加する。

FROM [Sheet1$]

Excelシート内の名前付きテーブルを設定する場合、[]内にシート名を書き$を追加Rangeの範囲を設定する。

FROM [Sheet1$A1:C6]

となるのだが、いちいち範囲を設定してはムダが多い。そこでつぎのVBAコードで名前付きテーブルの範囲を取得していく。

Function getTableRangeAddress(ByVal sheet_object As Worksheet, _
    ByVal table_name As String) As String
    
    With sheet_object
        Dim table_address As String
        Dim replaced_address As String
        
        table_address = .Range(table_name & "[#All]").address
        replaced_address = Replace(table_address, "$", "")
        
        getTableRangeAddress = .Name & "$" & replaced_address
    End With
    
End Function

上記をコピペして、下記を実行すればテーブルの範囲が自動的に出力される。

Const TABLE_NAME As String = "テーブル1"

Dim table_address As String
table_address = getTableRangeAddress(DataSheet, TABLE_NAME)

Accessの場合、[]内にテーブル名、またはクエリ名を書く。

FROM [people_table]

WHERE句の書きかた

文字列で条件設定する場合、シングルクォーテーション内に文字列を設定する。

WHERE name = '佐藤'

日付で条件設定する場合、シャープ内に日付を設定する。

WHERE date = #2021-01-01#

日付で条件範囲を設定する場合、BETWEEN 日付から AND 日付まで

WHERE date BETWEEN #2021-01-01# AND #2021-05-01#

数字を条件にする場合、数字のみで設定する。

WHERE age > 3

GROUP BY句の書きかた

GROUP BYの左側から優先的にグループ化される。

SELECT birthplace, age
FROM [people]
GROUP BY age, birthplace

COUNT、MAX、MIN、AVG、SUMは、設定していない列をGROUP BYに書く

SELECT birthplace, AVG(age)
FROM [people]
GROUP BY birthplace

関連記事SQLでSELECT句のCOUNTをきわめる【複数の条件指定も可能】

JOINの書きかた

~ JOINで2つのデータを選択し、ONで条件を設定する。

INNER JOINは、2つのON以降のデータ条件と一致したデータのみ抽出

SELECT name, age, [prefecture].town
FROM [people] INNER JOIN [prefecture]
ON [people].birthplace = [prefecture].town

LEFT JOINとRIGHT JOIN

  • LEFT JOIN...左側全データと右側データに一致したデータを抽出
  • RIGHT JOIN...右側全データと左側データに一致したデータを抽出

複数JOIN

複数JOINする場合は、つぎのように。2つ目以降はONの条件に()をつけるだけでOK。

SELECT name, age, [prefecture].town, [school].class_name
FROM ([people] INNER JOIN [prefecture]
ON ([people].birthplace = [prefecture].town))
INNER JOIN [school]
ON ([people].class_id = [school].class_id)

上記のように、INNER JOINだけじゃなくLEFT JOIN、RIGHT JOINも組み合わせてつかうことが可能。

ADO SQLで使える構文

  • TRANSFORM
  • PIVOT

関連記事SQLのTRANSFORMとPIVOTで簡単にクロス集計しようぜ

ADO SQLで使えない構文

  • WITH
  • COUNT(DISTINCT ~)
  • CASE
  • FULL JOIN
  • CONVERT