SELECT文で並べ替えを行うには?SQL実践講座(2)

» 2000年11月15日 00時00分 公開
[篠原光太郎@IT]

今回掲載の内容

  • SQL文の記述方法について
  • 並べ替えを行う方法
  • 並べ替え順について


SQL文の記述方法について

 前回に引き続き、今回はSELECT文での並べ替えの仕方(ORDER BY)の説明をします。説明に入る前に、SQL文の記述方法について、若干補足をします。

大文字と小文字の区別

 SQLで大文字と小文字を区別するか否かは、今回解説するサーバごとに設定される「並べ替え順」で決まります。この設定により、テーブル名、列名といったDBの構造に関する名称(オブジェクト名)も、大文字/小文字が区別されるか否かが決まります。

 例えば、前回使用した

SELECT CustomerID, CompanyName FROM Customers

というSQLは、「辞書順、大文字小文字を区別しない」と設定された環境では

SELECT customerid, companyname FROM customers

と記述しても同じ結果が得られますが、「五十音順辞書順、大文字小文字を区別する」と設定された環境では、「オブジェクト名が無効です」というエラーが発生し、失敗します。

 どのような環境であっても、テーブル名や列名には大文字と小文字を適宜使用して、SQL記述時には定義したときと同じテーブル名や列名を使うことが、間違いを少なくするポイントとなります。

改行の位置

 SQL文は改行を認識しませんので、SQL文中の任意の位置で改行を入れることが可能です。次の2つの例は、2つとも同じ結果を返します。

SELECT * FROM Customers WHERE City = 'London'
SELECT * FROM Customers
WHERE City = 'London'

 ただし、文字列中の改行は、改行として認識されます。これについては、データを挿入するINSERT文や、データを修正するUPDATE文の回に事例をもって説明します。

文字列の囲み

 文字列を " "(ダブル・クオーテーション、二重引用符)で囲むコンピュータ言語が多いですが、SQLでは ' '(シングル・クオーテーション、単一引用符)で囲みます。SQL Serverでは、設定によってはダブル・クオーテーションが使用できますが、ANSIではシングル・クオーテーションが標準です。

 ANSIでは、ダブル・クオーテーションを、次に説明するオブジェクト名の区切りに使用します。

オブジェクト名の囲み

 テーブル名、カラム名といったオブジェクト名は、通常、区切り文字なしに記述することが可能です。今までの例では、すべて区切り文字なしでの記述で説明しました。

 テーブル名、カラム名には、空白を含んだ名称を使用することが可能です。そのような場合には、ダブル・クオーテーションで囲んで指定します。

SELECT * FROM "Order Details"

 この例を実際に実行すると、「'Order Details' の近くに不正な構文があります。」というエラーメッセージが出力されませんでしたか? SQL Server Enterprise Managerやクエリ・アナライザは、デフォルトではダブル・クオーテーションの扱いに関してANSI標準に準拠した設定にはなっていません。

 次の通りにオプションを変更することで、ANSI標準の設定とすることができます。クエリ・アナライザで、「『クエリ』メニュー→現在の接続オプション」を選択します。表示される画面で、「ANSIの引用符で囲まれた識別子を使用」をチェックし、適用します。

画面1 クエリ・アナライザ 現在の接続オプション(画面をクリックすると拡大表示します) 画面1 クエリ・アナライザ 現在の接続オプション(画面をクリックすると拡大表示します)

並べ替えを行うには?

 では、本題に入りましょう。

 SELECT文でデータを取得し表示させた場合、表示されるデータの順番は、特に指定しない限り、RDBMS(SQL Server)が勝手に決定します。通常は、同じSELECT文を発行すれば同じ順番でデータが表示されますが、これも保証はされていません。

 明示的にデータを表示させる順番を指定する場合には、SELECT文に「ORDER BY」という句を追加します。例えば、Customersテーブルのデータを会社名順に表示させるためには、次のようなSQL文を発行します。

SELECT CustomerID, CompanyName
FROM Customers
ORDER BY CompanyName

 この例のように、「ORDER BY」というキーワードに続けて列名を指定します。列名の後に「昇順」「降順」の指定をすることも可能です。

SELECT CustomerID, CompanyName
FROM Customers
ORDER BY CompanyName DESC

 昇順が「ASC」、降順が「DESC」で、指定を省略した場合は昇順になります。また、ORDER BYに指定する列は、複数指定することができます。

SELECT CustomerID, CompanyName, City
FROM Customers
ORDER BY City, CompanyName

 この場合、まずCity列の順に並べ替えが行われ、同じCity列の値を持った行がCompanyName列の順に並べ替えられます。並ベ替えに指定できる列は、SQL Serverが扱うことのできるほとんどのデータを対象にすることができますが、text型とimage型の列は指定できませんので、注意が必要です。

並べ替え順

 並べ替えをどのような規則に基づいて実行するかは、SQL Serverのインストール時に設定する「並べ替え順」(Sort Order)で決まります。これは、サーバごとの設定となるため、DBごとに設定することや、インストール後の変更はできません。

 SQL Serverで指定できる並べ替え順には、以下のようなタイプがあります。

  • 辞書順、大文字小文字を区別しない
  • バイナリ順
  • 五十音順辞書順、大文字小文字を区別する
  • 辞書順、大文字小文字を区別しない、大文字優先
  • 辞書順、大文字小文字を区別しない、アクセントを区別しない

 「辞書順」「五十音順辞書順」というのは、英和辞典や国語辞典のように、辞書の見出しの順番に使用されるのと同じ順番です。例えば、アルファベットであれば、

A→a→B→b→C→c


という順番で並びます。

 一方、「バイナリ順」の場合には、インストールされた文字コード体系で使用される文字コード順に並べ替えが行われます。通常使用されるISO文字セットでは、上記の例は、

A→B→C→a→b→c


という順序で並びます。

 また、「並べ替え順」という設定項目ですが、同時に「大文字/小文字の区別」に関してもセットで設定します。

 SQL Serverのインストール時のデフォルトでは、「辞書順、大文字小文字を区別しない」が選択されます。デフォルトを変更して、例えば「五十音順辞書順、大文字小文字を区別する」を選択しセットアップを行うと、大文字/小文字が区別されるようになります。

 この設定の影響範囲としては、「Order By」によるデータの並べ替え順をはじめとし、WHERE句での検索条件指定、さらに、SQL文でのDB名、テーブル名、列名、といったオブジェクト名の記述にも影響を与えます。

 例えば、「大文字小文字を区別しない」設定の環境では、「London」と「london」は同じですので、次の例ではCityが「London」のデータも検索結果として表示されますが、「大文字と小文字を区別する」環境では、検索結果として表示されません。

SELECT CustomerID, CompanyName, City
FROM Customers
WHERE City = 'london'

今回のまとめ

今回は、 「ORDER BY句」を紹介しました。次回は、集計の仕方(GROUP BY)を予定しています。



「SQL実践講座」バックナンバー

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。