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

SQLのビューを理解する

    Manoj Debnath

    SQLデータベースのテーブルには膨大な量のデータが含まれている場合がありますが、すぐに使用できる便利な形式であるとは限りません。データの量は、効率的に使用するために、いくつかの指定された基準に基づいてフィルタリングする必要があります。セキュリティ上の理由から、特定の量のデータのみを公開し、残りは特権ユーザーがアクセスできるようにする場合があります。 SQL DML操作は拡張可能であり、複雑なクエリ式を使用して1つ以上のテーブルをフィルタリングするために使用されます。このアイデアを活用して、必要なデータを正確に含むSQLを使用して、永続ベーステーブルから仮想テーブルを作成できます。これが、SQL:2006標準でビューテーブルまたはビューの使用が導入された理由です。ビューまたは仮想テーブルの定義は、スキーマオブジェクトとして存在します。この記事では、SQLのビューの概念とその仕組みを紹介し、いくつかの例を使用してどのように実装されるかを示します。

    SQLビューの概要

    SQLビューは、1つ以上のベーステーブルから派生したメモリに常駐する仮想テーブルに他なりません。仮想テーブルとは、ビュー内のタプルに物理的な存在がなく、データベースに格納されていないことを意味します。タプルは、SQLクエリの結果として作成される一時データのようなもので、通常、1つ以上のベーステーブルからフィルター処理されたデータを描画します。その結果、ビューテーブルに適用できる操作のタイプに制限があります。たとえば、更新操作をすべてのタイプのビューに適用できるわけではありませんが、SQLクエリの適用に制限はありません。

    以下の例は、MySQLデータベースでテストされています。いくつかのテーブルを作成することから始めます:

    my_company データベース:

    CREATE DATABASE my_company;
    
    CREATE TABLE Employee(
        empId INT(11) UNSIGNED CHECK (empId > 0),
        empName VARCHAR(20),
        birthDate DATE,
        address TEXT(128),
        gender VARCHAR(1),
        salary DECIMAL(15,2),
        managerId INT(11) UNSIGNED,
        deptId INT(11) UNSIGNED,
        PRIMARY KEY(empId)
    );
     
    CREATE TABLE Department(
        deptId INT(11) UNSIGNED CHECK (empId > 0),
        deptName VARCHAR(20),
        deptMgrId INT(11) UNSIGNED,
        mgrStartDate DATE,
        PRIMARY KEY(deptId)
    );
    
    CREATE TABLE Project(
        projId INT(11) UNSIGNED CHECK (empId > 0),
        projName VARCHAR(20),
        projLocation TEXT(128),
        deptId INT(11) UNSIGNED,
        PRIMARY KEY(projId)
    );
     
    CREATE TABLE EmpWorksOnProj(
        empId INT(11) UNSIGNED,
        projId INT(11) UNSIGNED,
        hoursWorked DECIMAL(4,2)
    );  
     
    ALTER TABLE Employee ADD CONSTRAINT fk_emp_mgr FOREIGN KEY(managerId) REFERENCES Employee(empId);
    ALTER TABLE Employee ADD CONSTRAINT fk_emp_dept FOREIGN KEY(deptId) REFERENCES Department(deptId);
    ALTER TABLE Department ADD CONSTRAINT fk_dept_mgr FOREIGN KEY(deptMgrId) REFERENCES Employee(empId);
    ALTER TABLE Project ADD CONSTRAINT fk_proj_dept FOREIGN KEY(deptId) REFERENCES Department(deptId);
    

    ビューは参照テーブルと考えることができ、物理的には存在しない場合でも、何度でも使用できます。たとえば、 my_companyを頻繁に参照する必要がある場合があります データベースを作成し、従業員を見つけます およびプロジェクト 情報。 従業員の間には多対多の関係があることに注意してください およびプロジェクト 1人で多くのプロジェクトに取り組むことができ、1つのプロジェクトに多くの従業員がいるためです。したがって、3つのテーブルの結合を指定する代わりに:従業員 EmpWorksOnProj 、およびプロジェクト コラボレーション情報が必要になり、クエリを発行するたびに、これらのテーブル間の結合の結果として指定されるビューを定義します。ビューは、クエリの結果から作成された仮想テーブルを形成します。利点は、クエリが3つの結合されたテーブルから取得する必要がなく、単一の結果のテーブルから取得できることです。テーブルのコレクション:従業員プロジェクト部門 したがって、などはビューのベーステーブルまたは定義テーブルを形成します。

    上記のスキーマに基づいていくつかのビューを作成しましょう。

    CREATE VIEW V1
    AS
    SELECT
       empName, projName, hoursWorked
    FROM
       Employee, Project, EmpWorksOnProj
    WHERE
       Employee.empId=EmpWorksOnProj.empId
    AND
       Project.projId=EmpWorksOnProj.projId;
     

    ビューまたは仮想テーブルでSQLクエリを指定する方法は、ベーステーブルを含むクエリを指定する方法と同じです。ビューでSQLSELECTを使用して、次のようにデータを取得できます。

    SELECT * FROM V1;

    EmpName

    ProjName

    勤務時間

    ミッキーマウス

    ClubHouse

    6.50

    ドナルドダック

    農業

    7.0

    以下は、2番目のビューを作成します:

    CREATE VIEW V2 AS SELECT deptName、COUNT(*)、SUM(salary)FROM Department、Employee WHERE Employee.deptId =Department.deptId GROUP BY deptName;

    SQLSELECTの結果は

    になります
    SELECT * FROM V1;

    DeptName

    COUNT(*)

    SUM(給与)

    音楽

    5

    56000.00

    ドラマ

    2

    25400.00

    ビューV1では、属性名はベーステーブルから派生していることに注意してください。 V2では、CREATE VIEW句の指定された属性とSELECT句で指定された属性の間の1対1の対応を使用して、新しい属性名が明示的に指定されます。ビューを含むSELECT句は、ビューの定義を決定します。

    ビューの情報は常に最新であると想定されています。つまり、それが定義されているベーステーブルで行われた変更を常に反映する必要があります。これは、ビューを定義するときに実際には具体化されていないが、後でクエリが指定されたときに具体化されることを意味するため、興味深いものです。バックグラウンドのデータベース管理システムは、ビューを最新の状態に保つ責任があります。

    ビューの更新、挿入、削除

    SQLでは、更新可能なビューを作成して、既存のデータを変更したり、ビューに新しい行を挿入したりして、ベーステーブルのレコードを挿入または変更することができます。 。ビューが更新可能かどうかは、ビュー定義内で定義されたSELECTステートメントによって決定されます。ビューを更新可能に指定するための特別な条項はありません。通常、ビュー定義は単純である必要があり、SUM、AVG、MAX、MIN、COUNTなどの集計関数を含めることはできません。あらゆる種類のグループ化、DISTINCT、またはJOIN句も、ビューを更新できなくなります。ビューを更新できない理由については、特定のRDBMSの関連するデータベースマニュアルを参照してください。

    更新可能なビューを作成しましょう:

    CREATE VIEW v3_ch_dept_name
    AS
    SELECT
       deptId, deptName, deptMgrId, mgrStartDate
    FROM
       Department;
    

    ビューのSELECTクエリ:

    SELECT * FROM v3_ch_dept_name;

    DeptId

    DeptName

    DeptMgrId

    MgrStartDate

    1

    音楽

    123456789

    2020-01-01

    5

    ドラマ

    987654321

    2018-03-05

    次に、部門名(deptName)を変更してビューを更新します。

    UPDATE
       v3_ch_dept_name
    SET
       deptName = 'Security'
    WHERE
       deptId = 5;
    

    次のように、ビューに行を挿入できます。

    INSERT
       INTO v3_ch_dept_name
    VALUES (7,'Logistics',666884444,'1982-07-07');

    また、次のようにビューから行を削除できます。

    DELETE FROM v3_ch_dept_name WHERE deptId = 7;

    MySQLでは、次のSELECTコマンドを使用して、更新可能なビューまたは更新できないビューをデータベース内で簡単に見つけることができます。

    SELECT
       table_name
    FROM
       information_schema.views
    WHERE
       is_updatable like 'YES'
    AND
       table_schema like 'my_company';

    データベースからのDROPビュー

    ビューは、DROP VIEW を使用していつでも破棄できます。 コマンド。

    DROP VIEW V1;

    drop viewコマンドを実行すると、ビュー定義が削除されることに注意してください。このビューの派生元のベーステーブルに格納されている基になるデータは変更されません。ドロップしたビューは、同じ名前で再作成できます。

    ALTERVIEWステートメント

    ビューは通常、SQL:2006標準に従って変更できません。つまり、ALTERVIEWステートメントはビューでは機能しません。ただし、この種のステートメントをサポートするMySQLやSQLServerのようなRDBMSがあります。 Oracleは、ビューを変更するのではなく、最初に削除してから再作成することを信条としています。したがって、RDBMSによってビューでサポートされる機能は、製品ごとに異なります。

    結論

    SQLビューは、複数のデータ型にアクセスするための便利なツールでもあります。複雑なクエリは、ビュー定義内に保存できます。必要になるたびにクエリを再作成する代わりにビューを呼び出すことができるため、これは再利用を活用します。これは、すべての人に公開したくない多くの情報を非表示にしているユーザーに情報を提示するための便利な方法です。これはセキュリティの観点からも重要です。複雑な構造を合成して、エンドユーザーが簡単な形式で表示できます。

    参照:

    Elmasri、Ramez、およびShamkantB.Navathe。 データベースシステムの基礎 。ピアソン教育。


    1. RoomDatabase.Callback()のonCreate()は、.build()の呼び出しが成功した後に呼び出されませんでした

    2. SQL DROP TABLE構文–DBMSによってリストされます

    3. to_timestamp()がPostgreSQLでどのように機能するか

    4. 階層的に定義されたデータセットのフラット化されたテーブル/ビューの作成