sql >> データベース >  >> RDS >> Mysql

MySQLビュー

    ここでは、MySQLの「ビュー」とは何か、およびそれらの使用方法について説明します。

    MySQLには、ビューを作成する機能があります。 。 ビュー は、呼び出されたときに結果セットを生成する保存されたクエリとして定義されます。ビューを「仮想テーブル」と呼ぶ人もいます。

    泥のように澄んでいますか?もう一度やり直しましょう。

    ビューとは何ですか?

    ビューは、データベースに保存するクエリです。その後、(クエリを再度書き出すのではなく)そのビューを呼び出すだけで後で実行できます。

    ビューは複雑なクエリで構成されている可能性がありますが、テーブルであるかのように結果が表示されます。したがって、ビューをテーブルであるかのようにクエリできます。

    たとえば、3つの異なるテーブルからデータを選択する複雑なクエリを作成できます。この複雑なクエリを実行する必要があるたびに入力するか、クエリをビューとして保存することができます。ビューとして保存したら、簡単なSELECTを実行できます。 複雑なクエリの結果を返すステートメント。ただし、もちろん、必要に応じて、ビューに対して複雑なクエリを作成することもできます。

    ビューを作成する

    ビューの作成は非常に簡単です。クエリの前に1行のコードを追加して、実行するだけです。ビューはすぐにデータベースに作成されます。

    構文

    ビューを作成するには、次のステートメントを入力してから、クエリを入力します。

    CREATE VIEW view_name AS

    view_name を置き換えます ビューに使用したい名前を付けます。

    FruitShop に対して次のコードを実行すると データベース:

    CREATE VIEW vFruitInventory AS
    SELECT 
        Fruit.FruitName,
        Fruit.Inventory,
        Units.UnitName
    FROM
    	Fruit INNER JOIN Units ON
        Fruit.UnitId = Units.UnitId;

    vFruitInventory というビューが表示されます。 ビュー の下にリストされています ( 更新 をクリックする必要がある場合があります SCHEMAS のボタン 最初のメニュー):

    (他のデータベースオブジェクトと同様に)ビューの命名規則を考えて、それに固執することをお勧めします。多くの開発者は、ビュー名の前にvを付けます 、vwv_ またはvw_ これにより、クエリでビューとテーブルを簡単に区別できるようになります。ただし、他の開発者はこの規則に同意せず、テーブル名とビュー名を交換可能にすることを好みます。

    ビューのクエリ

    これで、テーブルをクエリするのと同じようにビューをクエリできます。

    SELECT * FROM vFruitInventory;

    結果:

    もちろん、より具体的なクエリを使用することもできます。たとえば、これは在庫が10より大きいまたは小さいレコードのみを選択するものです:

    SELECT FruitName 
    FROM vFruitInventory
    WHERE Inventory <= 10;

    しかし、できません ビューで参照されていないクエリ列(ビューがクエリする基になるテーブルにある場合でも)。

    たとえば、 Fruit にクエリを実行できます。 このようなテーブル:

    SELECT * 
    FROM Fruit
    WHERE FruitId = 1;

    ただし、上記の vFruitInventory をクエリすることはできません。 このように表示:

    SELECT * 
    FROM vFruitInventory
    WHERE FruitId = 1;

    これは、ビューが FruitId を返さないためです。 桁。ビューで正確な列を指定しましたが、それらがすべて返されます。前述のように、ビューの結果セットはテーブルのようなものであり、「仮想テーブル」と呼ばれることもあります。 「テーブル」にこれらの列が含まれていない場合、それらを照会することはできません。

    これは制限ではなく、実際には機能です。 ビューの。この機能は、ユーザーに一部へのアクセスを許可できることを意味します テーブルの列ですが、他の列はありません(ビューを介して)。つまり、ビューがアクセスする基になるテーブルへのアクセスをユーザーに許可せずに、ビューへのアクセスをユーザーに許可できます。一部のテーブルには、ユーザーがアクセスを許可されていない機密情報が格納されている場合があります。ただし、同じテーブルに、必要な機密情報以外の情報も格納されている場合があります。 アクセスするために。何をすべきか?ビューを作成してください!そして、そのビューはそれらのテーブルから機密でない情報のみを選択できます。

    ビューの変更

    ビューを変更する2つの異なる方法があります。

    オプション1:ALTER VIEWを使用する ステートメント

    ALTER VIEWを使用してビューを変更できます 声明。このように:

    ALTER VIEW view_name AS

    view_name を置き換えます 変更するビューの名前を指定します。

    Fruit.FruitId を追加しましょう ビューへのフィールド:

    ALTER VIEW vFruitInventory AS
    SELECT 
    	Fruit.FruitId,
        Fruit.FruitName,
        Fruit.Inventory,
        Units.UnitName
    FROM
    	Fruit INNER JOIN Units ON
        Fruit.UnitId = Units.UnitId;

    ここで、 FruitId を返そうとすると クエリのフィールドで結果が得られます。

    ただし、このフィールドにFruit.FruitIdとしてアクセスすることはできないことに注意してください。 。 FruitIdとしてのみアクセスできます 。そして、これはそれがどうあるべきかです。結局のところ、ビューは「仮想テーブル」であり、クエリするテーブルの構造を知る必要はありません。

    オプション2:CREATE OR REPLACEを使用する

    ALTER VIEWを実行する前に、ビューが存在している必要があることに注意してください 声明。存在しない場合は、エラーが発生します。 CREATE OR REPLACEを使用すると、この問題を回避できます。 声明。これにより、ビューが存在しない場合は作成され、存在する場合は置き換えられます。

    したがって、上記のビューを次のように作成できます。

    CREATE OR REPLACE VIEW vFruitInventory AS
    SELECT 
        Fruit.FruitName,
        Fruit.Inventory,
        Units.UnitName
    FROM
    	Fruit INNER JOIN Units ON
        Fruit.UnitId = Units.UnitId;

    次に、同じCREATE OR REPLACEを使用して更新できます。 ステートメントですが、定義を変更するだけです。たとえば、Fruit.FruitIdを追加します フィールド:

    CREATE OR REPLACE VIEW vFruitInventory AS
    SELECT 
    	Fruit.FruitId,
        Fruit.FruitName,
        Fruit.Inventory,
        Units.UnitName
    FROM
    	Fruit INNER JOIN Units ON
        Fruit.UnitId = Units.UnitId;

    ビューの削除

    DROP VIEWを使用してビューをドロップします 声明。このように:

    DROP VIEW vFruitInventory

    上記のステートメントは、 vFruitInventory というビューを削除します 。

    複数のビューを削除する

    同じDROP VIEWを使用して複数のビューを削除できます 声明。各ビュー名はコンマで区切ってください。このように:

    DROP VIEW view_1, view_2 ...

    IF EXISTS 条項

    IF EXISTSを使用することもできます ビューが存在しない場合にエラーが発生しないようにする句:

    DROP VIEW IF EXISTS view_1, view_2 ...

    1. 再帰SQLクエリを作成することは可能ですか?

    2. ユーザーが私のコンテンツプロバイダーの特定のテーブルにのみアクセスできるようにする

    3. 同じステートメントで挿入のIDを取得します

    4. 演算子が存在しません:json =json