データベースマネジメント:SQL(最終更新:2015/12/09 11:25:24 JST)
SQLにはデータを単に抽出するだけでなく,データの集計などの加工を行うことができる.集計関数には次のような演算が用意されている.
フィールド(列)に含まれるレコード数(行数)をカウントするためにはCOUNT()演算を用いる.引数として,フィールド名を取る.
/* [商品]表の行数のカウント */ SELECT COUNT(*) FROM 商品
引数に特定のフィールド名を指定した場合は,そのフィールドのnullを除くレコード数をカウントする.
SELECT COUNT(工場) FROM 商品
また引数にDISTINCT句をつけると,nullと重複値を除くレコード数をカウントする.
SELECT COUNT(DISTINCT 工場) FROM 商品
データ処理でよく用いられる合計,平均,最大,最小を求める演算は次の通り.
合計値の計算にはSUM()演算を用いる.引数としてフィールド名を取る.
/* <単価>フィールドの合計 */ SELECT SUM(単価) FROM 商品
平均値の計算にはAVG()演算を用いる.引数としてフィールド名を取る.
/* <単価>フィールドの平均 */ SELECT AVG(単価) FROM 商品
最大値の計算にはMAX()演算を用いる.引数としてフィールド名を取る.
/* <商品コード>が200未満のデータの中の単価の最大値 */ SELECT MAX(単価) FROM 商品 WHERE 商品コード < 200
同様に最小値の計算にはMIN()演算を用いる.引数としてフィールド名を取る.
/* <商品コード>が200未満のデータの中の単価の最小値 */ SELECT MIN(単価) FROM 商品 Where 商品コード 7lt; 200
演算結果に対して,通常の四則演算も利用可能である.
/* <単価>を1.05倍 */ SELECT 単価*1.05 FROM 商品
フィールド内のすべてのデータについて集計関数を適用する以外に,データを他の列のデータでグループ化した上で,その各グループごとに集計関数を適用することもできる.
あるフィールドのデータでグループ化を行うためにはGROUP BY句を用いる.
/* <工場>フィールドのデータでグループ化したときの各グループのレコード数のカウント */ SELECT 工場, COUNT(*) FROM 商品 GROUP BY 工場
上記グループごとの<単価>の平均 SELECT 工場, AVG(単価) FROM 商品 GROUP BY 工場
グループ化した結果を条件により絞り込む場合には,HAVING句を用いる.
/* <工場>フィールドでグループ化し,各グループの<単価>フィールドの平均を求め,条件付け */ SELECT 工場, AVG(単価) FROM 商品 GROUP BY 工場 HAVING AVG(単価) >= 300 /* 工場ごとの単価平均値が300以上のもののみ出力される.*/
グループ化に関しては条件の絞り込みのタイミングが結果に影響する.グループ化後に絞り込む場合は前出のHAVING句を用いる.それに対して,グループ化前に条件付けを行いたい場合はWHERE句を用いる.WHERE句を用いた場合はまずデータがWHERE句で評価されて制限された後でGROUP BY句が適用される.
/* <単価>フィールドが200以上のデータについて,<工場>フィールドでグループ化し,カウント数が2以上を抽出 */ SELECT 工場, COUNT(*) FROM 商品 WHERE 単価 >=200 GROUP BY 工場 HAVING COUNT(*) >=2
あるフィールドに着目して,そのフィールド内のデータをもとに並べ替えを行うためにはORDER BY句を用いる.昇順(小→大)に並べ替えるためにはASCを,また降順(大→小)に並べ替えるためにはDESCを用いる.なお並べ替えの条件を省略した場合は昇順となる.
/* 昇順ソート */ SELECT * FROM 商品 ORDER BY 単価 ASC
/* 降順ソート */ SELECT * FROM 商品 ORDER BY 単価 DESC
またORDER BY句に複数のフィールドを指定した場合,前から順に並べ替えて,その中で同じものがあったとき次の条件で並べ替える.
SELECT * FROM 商品 ORDER BY 単価, 商品コード ASC
データと完全マッチングを取るのではなく,データがある文字列を含んでいるものを選び出す操作はパターンマッチと呼ばれる.この場合はWHERE句とLIKE演算子およびワイルドカードを表す%を用いる.ワイルドカードは0個以上の文字列を表す.
/* <商品名>が「○○せんべい」というレコードを抽出 */ SELECT * FROM 商品 WHERE 商品名 LIKE '%せんべい'
この場合,「のりせんべい」は抽出されるが,「せんべい詰め合わせ」は抽出されない.もし「せんべい詰め合わせ」を抽出するなら「LIKE 'せんべい%'」ととするか,あるいは「せんべい」を含むもの全部抽出「LIKE '%せんべい%'」とする必要がある.
特定の値に一致したレコードを取り出すためにはWHERE句にINで指定する.またある範囲に合致したレコードを取り出すためにはWHERE句にBETWEEN ANDで指定する.
/* 値の指定 */ SELECT * FROM 商品 WHERE 単価 IN(100, 500)
/* 範囲の指定 */ SELECT * FROM 商品 WHERE 単価 BETWEEN 200 AND 350このサイトに関するお問い合わせは,連絡先のページをご覧ください.