データの制限と並べ替え

SELECTステートメントの基本的な機能は、選択、射影、および結合です。テーブルから特定の列を表示することは、プロジェクト操作と呼ばれます。ここでは、出力の特定の行を表示することに焦点を当てます。これは、選択操作と呼ばれます。SELECTクエリにWHERE句を追加することで、特定の行を選択できます。実際のところ、WHERE句はSELECTクエリ階層のFROM句の直後に表示されます。シーケンスは、すべてのシナリオで維持する必要があります。違反した場合、Oracleは例外を発生させます。

構文:

SELECT *|{[DISTINCT] column| expression [alias],..}
FROM table
[WHERE condition(s)]

構文では、

  • WHERE句はキーワードです

  • [条件]には、列名、式、定数、リテラル、および比較演算子が含まれます。

上司が組織の四半期予算に取り組んでいるとします。この活動の一環として、各従業員の重要な詳細のリストを作成する必要がありますが、それは少なくとも年間25,000ドルが支払われる従業員に対してのみです。以下のSQLクエリは、このタスクを実行します。太字で示されているWHERE句の使用に注意してください。

SELECT Employee_ID, Last_Name, First_Name, Salary
FROM employees
WHERE Salary >= 25000;  

EMPLOYEE_ID  LAST_NAME        FIRST_NAME       SALARY
----------   ---------------  ---------------  -----------
88303        Jones            Quincey          $30,550.00
88404        Barlow           William          $27,500.00
88505        Smith            Susan            $32,500.00

3 rows selected

注意点-

  • SELECT句には、WHERE句を1つだけ含めることができます。ただし、ANDまたはOR演算子を使用して、WHERE句に複数のフィルター条件を追加できます。

  • 述語句の列、リテラル、または式は、類似または相互変換可能なデータ型である必要があります。

  • WHERE句では列エイリアスを使用できません。

  • 文字リテラルは一重引用符で囲む必要があり、大文字と小文字が区別されます。

  • 日付リテラルは一重引用符で囲む必要があり、形式に依存します。デフォルトの形式はDD-MON-RR

比較演算子

比較演算子は、ある用語またはオペランドを別の用語と比較するために述語で使用されます。SQLは、等式、不等式、およびその他の演算子の包括的なセットを提供します。これらは、SELECTクエリのデータおよびフィルター条件ロジックに応じて使用できます。WHERE句で比較演算子を使用する場合、演算子の両側の引数(比較するオブジェクトまたは値)は、列名または特定の値のいずれかである必要があります。特定の値を使用する場合、その値は数値またはリテラル文字列のいずれかである必要があります。値が文字列または日付の場合は、値を一重引用符( '')で囲む必要があります。

Oracleには、等式または不等式の条件で使用される9つの比較演算子があります。

Operator  Meaning
=         equal to 
<         less than
>         greater than
>=        greater than or equal to
<=        less than or equal to
!=        not equal to
<>        not equal to

他のOracle演算子は、BETWEEN..AND、IN、LIKE、およびISNULLです。

BETWEEN演算子

BETWEEN演算子を使用して、特定の範囲内の列値を比較できます。指定された範囲には、比較時に両方が含まれる下限と上限が必要です。その使用法は、複合不等式演算子(<=および> =)に似ています。数値、文字、および日付タイプの値で使用できます。

たとえば、WHERE条件 SALARY BETWEEN 1500 AND 2500 SELECTクエリでは、給与が1500〜2500の従業員が一覧表示されます。

IN演算子

IN演算子は、指定された値のセットの列値をテストするために使用されます。列が指定されたセットの値のいずれかと同等である場合、条件が検証されます。IN演算子を使用して定義された条件は、メンバーシップ条件とも呼ばれます。

たとえば、WHERE条件 SALARY IN (1500, 3000, 2500) SELECTクエリでは、給与が1500、3000、または2500のいずれかである行を制限します。

LIKE演算子

LIKE演算子は、SELECTクエリでのパターンマッチングとワイルドカード検索に使用されます。列の値の一部が不明な場合は、ワイルドカードを使用して不明な部分を置き換えることができます。ワイルドカード演算子を使用して検索文字列を作成するため、検索はワイルドカード検索と呼ばれます。これらの2つの演算子は、パーセンタイル( '%')とアンダースコア( '_')です。アンダースコア( '_')は単一の文字を置き換え、パーセンタイル( '%')は複数の文字を置き換えます。組み合わせて使用​​することもできます。

たとえば、以下のSELECTクエリは、姓が「SA」で始まる従業員の名を一覧表示します。

SELECT first_name
FROM employees
WHERE last_name LIKE 'SA%';

IS(NOT)NULL条件

注意すべき点として、NULL値は等式演算子を使用してテストすることはできません。これは、等式演算子が明確な値をテストしている間、NULL値が不明で割り当てられていないためです。IS NULL演算子は、列のNULL値をチェックするための等価演算子として機能します。

たとえば、WHERE条件 COMMISSION_PCT IS NULL SELECTクエリでは、コミッションの割合がない従業員が一覧表示されます。

論理演算子

WHERE句の述語に複数のフィルタ条件を追加できます。論理演算子AND、OR、およびNOTを使用して、複数の条件を組み合わせることができます。

  • AND:2つ以上の条件を結合し、すべての条件が真の場合にのみ結果を返します。

  • または:2つ以上の条件を結合し、いずれかの条件が真の場合に結果を返します。

  • NOT:それに続く式を否定します。

AND演算子は、WHERE句で2つ以上の条件をリンクし、すべての条件が真の場合にのみTRUEを返します。マネージャーが女性従業員のリストを必要としているとします。さらに、リストには、姓が「E」で始まるか、アルファベットの後半にある従業員のみを含める必要があります。さらに、結果テーブルは従業員の姓でソートする必要があります。満たすべき2つの簡単な条件があります。WHERE句は、WHERE Gender = 'F' AND last_name> 'E'と書くことができます。

SELECT last_name "Last Name", first_name "First Name", Gender "Gender"
FROM employees
WHERE Gender = 'F' AND last_name > 'E'
ORDER BY last_name;

OR演算子は、WHERE句で複数の条件をリンクし、いずれかの条件がtrueを返す場合はTRUEを返します。組織のマネージャーの要件が少し変わったとします。別の従業員リストが必要ですが、このリストでは、従業員は次のようにする必要があります。(1)女性であるか、(2)姓が「T」で始まるか、アルファベットの後半にある文字。結果テーブルは、従業員の姓でソートする必要があります。この状況では、クエリを満たすために2つの条件のいずれかを満たすことができます。女性従業員は、2番目の条件を満たす名前を持つ従業員と一緒にリストする必要があります。

NOT演算子は、式または条件を否定するために使用されます。

ORDERBY句

数行のデータのみを表示する場合、出力をソートする必要がない場合があります。ただし、多数の行を表示する場合、マネージャーは情報をソートすることで意思決定を支援することができます。SELECTステートメントからの出力は、オプションのORDERBY句を使用して並べ替えることができます。ORDER BY句を使用する場合、注文する列名は、SELECT句で指定された列名でもある必要があります。

以下のSQLクエリは、ORDER BY句を使用して、結果テーブルをlast_name列で昇順で並べ替えます。昇順がデフォルトのソート順です。

SELECT last_name, first_name
FROM employees
WHERE last_name >= 'J'
ORDER BY last_name;

last_name        first_name
---------------  ---------------
Jones            Quincey
Klepper          Robert
Quattromani      Toni
Schultheis       Robert

並べ替えは、数値と日付の値に基づいて行うこともできます。複数の列に基づいて並べ替えを行うこともできます。

デフォルトでは、ORDER BY句は、結果テーブルの出力行を昇順で並べ替えます。キーワードDESC(降順の略)を使用して、降順の並べ替えを有効にできます。代替のデフォルトは昇順でソートするASCですが、ASCキーワードはデフォルトであるため、ほとんど使用されません。ASCまたはDESCオプションのキーワードを使用する場合は、WHERE句でソートする列名の後に続ける必要があります。

Positional Sorting -選択した列リスト内の列の数値位置は、列名の代わりにORDERBY句で指定できます。これは主にUNIONクエリで使用されます(後で説明します)。クエリは、結果セットが列リストの2番目に表示されるため、給与で並べ替えます。

SELECT  first_name, salary
FROM employees
ORDER BY 2;

置換変数

異なる入力セットに対してSQLクエリを複数回実行する必要がある場合は、置換変数を使用できます。置換変数を使用して、クエリを実行する前にユーザー入力を求めることができます。これらは、条件付きフィルタリングおよびデータ表示の入力としてユーザーからのデータ範囲を取得するクエリベースのレポート生成で広く使用されています。置換変数の前には、値を一時的に格納するための1つのアンパサンド(&)記号が付いています。例えば、

SELECT EMPLOYEE_ID, LAST_NAME, SALARY
FROM employees
WHERE LAST_NAME = &last_name
OR EMPLOYEE_ID = &EMPNO;

上記のSELECTクエリが実行されると、Oracleは「&」を置換変数として識別します。以下のように、「last_name」と「EMPNO」の値を入力するようにユーザーに求めます。

Enter value for last_name:
Enter value for empno:

ユーザーが両方の変数に入力を提供すると、値が置き換えられ、クエリが検証されて実行されます。

注意点-

  • 変数が文字または日付の値を置き換えることを意図している場合、リテラルは一重引用符で囲む必要があります。便利な手法は、文字と日付の値を処理するときに、アンパサンド置換変数を一重引用符で囲むことです。

  • SQLDeveloperとSQL * Plusはどちらも、置換変数とDEFINE / UNDEFINEコマンドをサポートしています。ただし、SQLDeveloperまたはSQL * Plusは、ユーザー入力の検証チェック(データ型を除く)をサポートしていません。

  • 置換変数は、SQLステートメントのWHERE句だけでなく、列名、式、またはテキストの置換としても使用できます。

ダブルアンパサンド置換変数の使用

同じ置換変数が複数の場所で使用されている場合、同じデータが再度入力されるのを避けるために、ダブルアンパサンド置換を使用します。このような場合、置換変数の値は、一度入力されると、使用のすべての瞬間に置換されます。

SELECT first_name, HIRE_DATE, SEPARATION_DATE
FROM employees
WHERE HIRE_DATE LIKE '%&DT%' AND SEPARATION_DATE '%&&DT%'

上記のクエリでは、同じ値の&DTが2回置換されることに注意してください。そのため、ユーザーが指定した値は2か所で置き換えられます。

DEFINEおよびVERIFYコマンド

セッションでの変数の定義の設定は、SQL * PlusのDEFINE機能によって設定されます。クエリの実行中に停止しないように、変数をセッションで定義できます。Oracleは、SQLクエリで検出されるたびに同じ変数を読み取ります。デフォルトではON状態です。DEFINE句を使用すると、クエリを実行する前にコマンドラインで変数を宣言できます。DEFINE variable=value;

検証コマンドは、OLDおよびNEWステートメントとして表示されている上記の置換を検証します。デフォルトではオフであり、SETコマンドを使用してオンに設定できます。

SQL> SET DEFINE ON
SQL> SET VERIFY ON
SQL> DEFINE NAME = MARTIN'
SQL> SELECT first_name, SALARY 
FROM employees
WHERE first_name = '&NAME';
OLD   1: select first_name, sal from employee where first_name = '&first_name'
new   1: select first_name, sal from employee where first_name = 'MARTIN'

first_name     SALARY
-------        -------
MARTIN         5000