SQL: SELECT 文

2016/12/30

[もどる]


内部結合

次のサンプルは時刻表テーブル (TIMETABLE) と駅名マスターテーブル (STATIONS) を内部結合してある駅の時刻表を表示している。

SELECT
  T.TRAINCODE AS 列車番号,
  T.DEPARTURE AS 発車時刻,
  S.STATION AS 行先,
  T.REMARKS AS 備考
FROM
  dbo.TimeTableByStation(@name, 'W') AS T
  INNER JOIN dbo.STATIONS AS S
ON
  T.DESTINATION = S.ID
ORDER BY
  DEPARTURE;


TIMETABLE


STATIONS

 

外部結合

外部結合には LEFT と RIGHT がある。下の例は dbo.TimeTableByStation に dbo.STATIONS を結合している。RIGHT にすると dbo.STATIONS に dbo.TimeTableByStation を結合する。

外部結合では、結合キーが存在しない場合、そのカラムの内容は NULL になる。この例でいえば、駅名コードがない場合、行先の駅名がわからないので NULL となる。内部結合では、結合キーがない場合は、検索されず結果セットに含まれなくなる。

SELECT
  T.TRAINCODE AS 列車番号,
  T.DEPARTURE AS 発車時刻,
  S.STATION AS 行先,
  T.REMARKS AS 備考
FROM
  dbo.TimeTableByStation(@name, 'W') AS T
  LEFT JOIN dbo.STATIONS AS S
ON
  T.DESTINATION = S.ID
ORDER BY
  DEPARTURE;

 

GROUP BY

GROUP BY 句はテーブルの特定の列について集計を行うときに使用できる。

SELECT
  STATION,
  COUNT(STATION)
FROM
  dbo.TIMETABLE
GROUP BY
  STATION;

WHERE 句や HAVING 句で条件を絞り込むことができる。

SELECT
  Shop As 利用先,
  Count(Shop) As 利用件数,
  Sum(Amount) As 利用額
FROM
  dbo.OMCCARD
WHERE
  [Date] > '2016/08/01'
GROUP BY
  Shop
HAVING
  Sum(Amount) < 2000
ORDER BY 利用件数 DESC;

 

副問い合わせ

次のサンプルは駅名テーブル(STATIONS)を駅名で検索して一致した駅名コードで時刻表テーブル (TIMETABLE) を検索している。

SELECT
  *
FROM dbo.TIMETABLE
WHERE
  STATION = (SELECT ID FROM dbo.STATIONS WHERE STATION = @station)
  AND TAG = @tag

WITH 句を使用して副問い合わせを行うことができる。

WITH S AS (
  SELECT ID, STATION FROM dbo.STATIONS WHERE OPERATOR = @operator
)
SELECT *
FROM dbo.TIMETABLE AS T
  INNER JOIN S
ON
  S.ID = T.STATION;

 

演算子

CASE

CASE を使うと、コードをわかりやすい言葉に変換して表示できる。

SELECT
  ID,
  CASE TAG 
    WHEN 'W' THEN '平日'
	WHEN 'H' THEN '休日'
	ELSE ' '
  END AS 休日区分
FROM
  dbo.TIMETABLE;

IN

IN 演算子を使うと、検索対象のフィールドがある集合に含まれているかを検出できる。

SELECT
  *
FROM
  dbo.STATIONS AS S
WHERE
  ID IN (4, 5);
 

EXISTS

EXISTS 演算子を使うと、検索対象のフィールドがある集合に含まれているかを検出できる。次のサンプルは時刻表テーブルと駅名マスターテーブル両方に駅が含まれている駅の情報を取得する。

SELECT
  *
FROM
  dbo.STATIONS AS S
WHERE
  EXISTS (
    SELECT ID FROM dbo.TIMETABLE AS T WHERE S.ID = T.STATION
  )
 

文字列の結合

+ 演算子を使うと、文字列を結合できる。

SELECT
  ID,
  STATION + '駅'
FROM
  dbo.STATIONS
WHERE
  LINE = @linename;
 

 

テーブルのコピー

SELECT INTO を使うとテーブルを別のテーブルへコピーできる。この例で dbo.STATION_BK が存在しない場合は、自動的に作成される。

SELECT * INTO dbo.STATION_BK FROM dbo.STATIONS;
 

データをコピーせず、構造だけコピーしたい(空のテーブルを作成したい)場合は、次のようにすればよい。

SELECT * INTO dbo.STATION_BK FROM dbo.STATIONS WHERE 0 = 1;
 

 

ストアド関数の使用

SELECT 文でスカラー値関数は次のように使用できる。

SELECT dbo.GetUserName('user1', '24c9e15e52afc47c225b757e7bee1f9d');
 

SELECT 文でテーブル値関数は次のように使用できる。

SELECT * FROM dbo.GetUsersOld('2016/11/01');