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