Sql-certificate-restricting-and-sorting-data

提供:Dev Guides
移動先:案内検索

データの制限と並べ替え

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 です。

比較演算子

比較演算子は、1つの用語またはオペランドを別の用語と比較するために述部で使用されます。 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、およびIS NULLです。

BETWEENオペレーター

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

たとえば、SELECTクエリのWHERE条件 SALARY BETWEEN 1500 AND 2500 は、給与が1500〜2500の従業員をリストします。

IN演算子

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

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

LIKEオペレーター

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

たとえば、次のSELECTクエリは、姓が「SA」で始まる従業員の名をリストします。

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

IS(NOT)NULL条件

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

たとえば、SELECTクエリのWHERE条件 COMMISSION_PCT IS NULL は、歩合率のない従業員をリストします。

論理演算子

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

  • AND:2つ以上の条件を結合し、すべての条件が真の場合にのみ結果を返します。
  • OR: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を返します。 組織のマネージャーの要件が少し変わったとします。 別の従業員リストが必要ですが、このリストでは従業員は次のことを行う必要があります。 結果表は、従業員の姓でソートする必要があります。 この状況では、クエリを満たすために2つの条件のいずれかを満たすことができます。 女性従業員は、2番目の条件を満たす名前を持つ従業員とともにリストする必要があります。

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

ORDER BY句

数行のデータのみを表示する場合、出力をソートする必要はありません。ただし、多数の行を表示する場合、情報をソートすることにより、マネージャーが意思決定を支援できる場合があります。 SELECTステートメントからの出力は、オプションのORDER BY句を使用してソートできます。 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句で並べ替える列名の後に続ける必要があります。

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

SELECT  first_name, salary
FROM employees
ORDER BY 2;

置換変数

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

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:

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

注意点-

  • 変数が文字または日付値を置換することを意図している場合、リテラルを一重引用符で囲む必要があります。 有用な手法は、文字と日付の値を処理するときに、アンパサンド置換変数を単一引用符で囲むことです。 SQL DeveloperとSQL Plusはどちらも、置換変数とDEFINE/UNDEFINEコマンドをサポートしています。 ただし、SQL Developerまたは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クエリで検出されるたびに同じ変数を読み取ります。 デフォルトではオン状態です。 DEFINE句を使用すると、クエリの実行前にコマンドラインで変数を DEFINE variable = value; として宣言できます。

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

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