前回に引き続き、今回は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の引用符で囲まれた識別子を使用」をチェックし、適用します。
では、本題に入りましょう。
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)を予定しています。
Copyright © ITmedia, Inc. All Rights Reserved.