ALL、DISTINCT、DISTINCTROW、TOP 述語

SQL クエリで選択されるレコードを指定します。

構文

SELECT [ALL | DISTINCT | DISTINCTROW | [TOP n [PERCENT]]]
    FROM table

ALL、DISTINCT、DISTINCTROW、TOP の各述語を使用する SELECT ステートメントには、次の指定項目があります。

指定項目 内容
ALL 述語 述語を 1 つも指定しなければ ALL 述語を指定したものとみなします。Microsoft Jet データベース エンジンは、SQL ステートメントの条件を満たすすべてのレコードを選択します。次の 2 つの例は、どちらも [社員] テーブルのすべてのレコードを返します。

SELECT ALL *
FROM
社員
ORDER BY 社員コード;

SELECT *
FROM
社員
ORDER BY 社員コード;

DISTINCT 述語 選択したフィールドの中でデータが重複しているレコードを除外します。SELECT ステートメントに指定した各フィールドの値をクエリの結果に含めるには、それらがすべて固有である必要があります。たとえば、同姓同名の社員が格納されている [社員] テーブルを考えます。このテーブルで、"氏名" フィールドが "山田次郎" であるレコードが 2 つ以上ある場合、次の SQL ステートメントは "氏名" フィールドが "山田次郎" であるレコードを 1 つのみ返します。

SELECT DISTINCT
フリガナ
FROM 社員;

DISTINCT 述語を指定しなければ、"氏名" フィールドが "山田次郎" であるすべてのレコードを返します。

SELECT ステートメントに複数のフィールドを指定している場合、クエリ結果にレコードが含まれるようにするためには、それらのフィールド値の組み合わせがすべて一意である必要があります。

DISTINCT 述語を使用したクエリの出力は、更新できません。また、ほかのユーザーがデータを変更しても、結果には反映されません。

DISTINCTROW 述語 フィールドの重複のみでなく、レコード全体で重複しているデータを除外します。たとえば、[得意先] テーブルと [注文] テーブルを "得意先コード" で結合するクエリを作成したとします。[得意先] テーブルでは "得意先コード" の重複はありませんが、それぞれの得意先は多数の注文を出すので、[注文] テーブルでは得意先コードが重複しています。次の例は、少なくとも 1 回は注文を出したことのある会社の一覧表を DISTINCTROW 述語を使用して作成する SQL ステートメントです。ただし、この一覧には個々の注文の詳細は入りません。

SELECT DISTINCTROW 得意先名
FROM 得意先 INNER JOIN 注文
ON 得意先.得意先コード = 注文.得意先コード
ORDER BY 得意先名;

DISTINCTROW 述語を指定しないと、2 回以上注文した得意先について、注文の回数のみの行が作成されます。

DISTINCTROW 述語は、クエリで使用するすべてのテーブルからではなく、一部のテーブルからフィールドを選択した場合のみ有効です。このため、クエリの中にテーブルが 1 つのみしかない場合、またはすべてのテーブルからフィールドを出力する場合は、DISTINCTROW 述語は無視されます。

TOP n [PERCENT] 述語 先頭または末尾から指定の数までの間にあるレコードを、ORDER BY 句によって決められた順番で返します。たとえば、1994 年度の学級で上位 25 番以内の成績を挙げた生徒の名前を表示するには、次のような SQL ステートメントを記述します。

SELECT TOP 25
出席番号, 名前
FROM 生徒
WHERE 卒業年度 = 1994
ORDER BY 5
段階評価の平均 DESC;

ORDER BY 句を指定しなければ、WHERE 句の条件を満たす [生徒] テーブル内のレコードの中から、任意の 25 個のレコードを返します。

TOP 述語は、同じ値を持つレコードをすべて選択します。たとえば、上の例で 25 番目の生徒と 26 番目の生徒の成績が同じであれば、クエリは 26 個のレコードを返します。

予約語 PERCENT を使用すると、先頭または末尾から指定のパーセンテージまでの間にあるレコードを、ORDER BY 句によって決められる順番で返すこともできます。次の例は、上位 25 番以内の成績を挙げた生徒を選ぶ代わりに、学級内の上位 10 パーセントに該当する生徒を選びます。

SELECT TOP 10 PERCENT
出席番号, 名前
FROM 生徒
WHERE 卒業年度 = 1994
ORDER BY 5
段階評価の平均 ASC;

TOP 述語の後に指定する値は、符号なし整数型 (Integer) でなければなりません。

TOP 述語を指定したクエリは、更新できます。

table 取得するデータのあるテーブルの名前。

参照
FROM 句 (Microsoft Jet SQL) SELECT ステートメント (Microsoft Jet SQL)

使用例

ALL、DISTINCT、DISTINCTROW、TOP 述語の使用例