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

MySQLビューを作成して使用する方法

    MySQLビューとは何ですか?

    MySQLビューは、正しく使用するとSQLクエリライターの時間を大幅に節約できる単なる通常のデータベースオブジェクトです。ビューは、ユーザーがテーブルのように参照できる保存されたクエリです。多くの場合、ユーザーは同じ基本クエリを何度も使用して複数の問題を解決していることに気付くでしょう。ビューは、そのクエリをすばやく保存し、後で参照する方法です。

    ビューを使用する利点は何ですか?

    ビューにはいくつかの利点があります。まず、ビューはMySQLユーザーにはテーブルのように表示されます。 SELECT句は、テーブルとまったく同じようにビューを参照できます。もう1つの利点は、ビューによって参照される基になるテーブルが変更されると、ビューの結果も変更されることです。 3番目の利点は、ビューがサーバー上で占めるスペースが非常に少ないことです。ビューのSQL結果は、アクセスされるたびに計算されるため、アクセスされるまでサーバーに保存されません。

    この演習の表

    この記事では、3人のドライバー、4つのトラック、および各トラックに1つのレースが含まれる、架空のカーレースシーズンに関する情報を含むデータベースが作成されます。このデータベースには、4つのテーブルがあります。

    • ドライバー
    • トラック
    • レース
    • 終了

    テーブルの構造は以下のとおりです。

    create table drivers
    (
      id int auto_increment,
      name varchar(64) not null,
      car_number int not null,
      constraint drivers_pk
         primary key (id)
    );
    create table tracks
    (
      id int auto_increment,
      name varchar(64) not null,
      location varchar(64) not null,
      constraint track_pk
         primary key (id)
    );
    create table races
    (
      id int auto_increment,
      name varchar(64) not null,
      track int not null,
      distance int not null,
      constraint races_pk
         primary key (id)
    );
    
    
    create table finishes
    (
      id int auto_increment,
      driver int not null,
      race int not null,
      position int not null,
      constraint finishes_pk
         primary key (id)
    );

    ドライバー

    次のステップでは、3人のドライバーとその車の番号をテーブルに挿入します。

    • バディベイカー28
    • デイルアーンハートジュニア8
    • リッキーラッド88
    insert into drivers (name,car_number) values
      ('Buddy Baker',28),
      ('Dale Earnhardt Jr.',8),
      ('Ricky Rudd',88);

    結果には、次の出力が表示されます。

    ID 名前 車の番号
    1 バディベイカー 28
    2 デイル・アーンハート・ジュニア 8
    3 リッキーラッド 88

    競馬場

    次に、4つの競馬場とその場所を追加します。

    • タラデガスーパースピードウェイ-アラバマ州リンカーン
    • デイトナインターナショナルスピードウェイ-フロリダ州デイトナビーチ
    • インディアナポリスモータースピードウェイ-スピードウェイ、インディアナ州
    • ミシガンインターナショナルスピードウェイ-ブルックリン、ミシガン
    insert into tracks (name,location) values
      ('Talladega Superspeedway','Lincoln, AL'),
      ('Daytona International Speedway','Daytona Beach, FL'),
      ('Indianapolis Motor Speedway','Speedway, IN'),
      ('Michigan International Speedway','Brooklyn, MI');

    結果には、次の出力が表示されます。

    ID 名前 場所
    1 タラデガスーパースピードウェイ アラバマ州リンカーン
    2 デイトナインターナショナルスピードウェイ フロリダ州デイトナビーチ
    3 インディアナポリスモータースピードウェイ スピードウェイ、インディアナ州
    4 ミシガンインターナショナルスピードウェイ ブルックリン、ミシガン州

    レー​​ス

    これで、4つのレースとそれぞれの距離が入力されます。

    • デイトナ500、2,500
    • タラデガ500,1,500
    • ブリックヤード400、3、400
    • ミシガン400、4、400
    insert into races (name,track,distance) values
      ('Daytona 500',2,500),
      ('Talladega 500',1,500),
      ('Brickyard 400',3,400),
      ('Michigan 400',4,'400');

    結果には、次の出力が表示されます。

    ID 名前 追跡 距離
    1 Talladega 500 2 500
    2 デイトナ500 1 500
    3 Brickyard 400 3 400
    4 ミシガン400 4 400

    結果

    最後に、シーズンの初めのテーブルが作成されました。

    デイトナ500での最初のレース:

    • リッキーラッドが最初に終了します
    • デイルアーンハートジュニアが2位でフィニッシュ
    • バディベイカーは3位でフィニッシュしました。
    insert into finishes (driver, race, position) values
      (1,1,3),
      (2,1,2),
      (3,1,1);

    コンパイルされたデータ

    最初のデータ入力

    これで、クエリする実際のデータがあります。クエリを実行して、対応するトラックとレースを含むすべてのドライバーの結果を確認する場合、いくつかの結合があるため、少し複雑になります。

    select d.name as driver,
         r.name as race,
         t.name as track,
         t.location as location,
         f.position as position
      from finishes f
      left join races r
         on f.race = r.id
      left join tracks t
         on r.track = t.id
      left join drivers d
         on d.id = f.driver;

    結果には、次の出力が表示されます。

    ドライバー レース 追跡 場所 位置
    バディベイカー デイトナ500 デイトナインターナショナルスピードウェイ フロリダ州デイトナビーチ 3
    デイル・アーンハート・ジュニア デイトナ500 デイトナインターナショナルスピードウェイ フロリダ州デイトナビーチ 2
    リッキー・ラッド デイトナ500 デイトナインターナショナルスピードウェイ フロリダ州デイトナビーチ 1

    2番目のデータ入力

    2番目のレースであるTalladega500のデータが追加されると、以前のクエリと同じように、クエリを再度書き込むことができます。このレースでは、デイルアーンハートが最初に、バディベイカーが2番目になります。

    insert into finishes (driver, race, position) values
      (1,2,2),
      (2,2,1),
      (3,2,3);

    上記のクエリの結果は次のようになります。

    ドライバー レース 追跡 場所 位置
    バディベイカー デイトナ500 デイトナインターナショナルスピードウェイ フロリダ州デイトナビーチ 3
    デイル・アーンハート・ジュニア デイトナ500 デイトナインターナショナルスピードウェイ フロリダ州デイトナビーチ 2
    リッキー・ラッド デイトナ500 デイトナインターナショナルスピードウェイ フロリダ州デイトナビーチ 1
    バディベイカー Talladega 500 タラデガスーパースピードウェイ アラバマ州リンカーン 2
    デイル・アーンハート・ジュニア Talladega 500 タラデガスーパースピードウェイ アラバマ州リンカーン 1
    リッキー・ラッド Talladega 500 タラデガスーパースピードウェイ アラバマ州リンカーン 3

    ビューの作成

    データベースに複数のレースがあるので、結果を見る新しい方法があります。クエリは「ベストフィニッシュ」に書き込むことができます 」と「ほとんどの勝利 。」これらのクエリはすべて、各レースのポジションでどのドライバーがフィニッシュしたかについての同じ基礎データから始まります。これらのクエリを開発するプロセスを簡素化するために、「ビューの作成または置換」句を使用してビューを作成できます。この句の後には、保存されるSQLが続きます。この場合、上記で示した前のクエリの前に追加されます。

    create or replace view all_finishes as
    select d.name as driver,
         r.name as race,
         t.name as track,
         t.location as location,
         f.position as position
      from finishes f
      left join races r
         on f.race = r.id
      left join tracks t
         on r.track = t.id
      left join drivers d
         on d.id = f.driver;

    その結果がSQLの強力な機能です。この結果はテーブルのように見えますが、基になるテーブルに新しい情報が追加されると変更されます。このクエリを実行してみましょう。

    select * from all_finishes;
    ドライバー レース 追跡 場所 位置
    バディベイカー デイトナ500 デイトナインターナショナルスピードウェイ フロリダ州デイトナビーチ 3
    デイル・アーンハート・ジュニア デイトナ500 デイトナインターナショナルスピードウェイ フロリダ州デイトナビーチ 2
    リッキー・ラッド デイトナ500 デイトナインターナショナルスピードウェイ フロリダ州デイトナビーチ 1
    バディベイカー Talladega 500 タラデガスーパースピードウェイ アラバマ州リンカーン 2
    デイル・アーンハート・ジュニア Talladega 500 タラデガスーパースピードウェイ アラバマ州リンカーン 1
    リッキー・ラッド Talladega 500 タラデガスーパースピードウェイ アラバマ州リンカーン 3

    結果は、このクエリを最後に実行したときと同じです:

    違いは、ビューをテーブルのようにクエリできるようになったことです。各レースの勝者を示すクエリ。

    select * from all_finishes where position = 1;

    クエリはこれらの結果を提供します。

    ドライバー レース 追跡 場所 位置
    リッキー・ラッド デイトナ500 デイトナインターナショナルスピードウェイ フロリダ州デイトナビーチ 1
    デイル・アーンハート・ジュニア Talladega 500 タラデガスーパースピードウェイ アラバマ州リンカーン 1

    平均的な仕上がりに基づいてリーダーを表示するクエリを作成することもできます。

    select avg(position) as finish,
      driver
    from all_finishes
      group by driver
         order by finish;

    これは、今シーズンのこれまでのところ、デイル・アーンハートがリードしていることを示しています:

    終了 ドライバー
    1.5 デイル・アーンハート・ジュニア
    2.0 リッキーラッド
    2.5 バディベイカー

    ビューは他のビューを参照できるため、これらのクエリを使用してより広範なビューを作成できます。

    create view standings_leader as
    select avg(position) as finish,
      driver
    from all_finishes
      group by driver
         order by finish;

    上記のクエリの結果は次のようになります。

    終了 ドライバー
    1.5 デイル・アーンハート・ジュニア
    2.0 リッキーラッド
    2.5 バディベイカー

    同様に:

    create view race_winners as
    select * from all_finishes where position = 1;

    同じ結果が得られます。

    ドライバー レース 追跡 場所 位置
    リッキー・ラッド デイトナ500 デイトナインターナショナルスピードウェイ フロリダ州デイトナビーチ 1
    デイル・アーンハート・ジュニア Talladega 500 タラデガスーパースピードウェイ アラバマ州リンカーン 1

    データの追加

    ビューの最も強力な部分は、バディベイカーがブリックヤード400とミシガン400を獲得したこれらのレース終了のようなデータを追加すると、ビューをクエリするだけで同じ結果が得られることです。

    insert into finishes (driver, race, position) values
      (1,3,1),
      (2,3,3),
      (3,3,2);
    
    insert into finishes (driver, race, position) values
      (1,4,1),
      (2,4,2),
      (3,4,3);

    これで、このクエリですべての終了を確認できます。

    select * from all_finishes;\

    上記のクエリの結果は次のようになります。

    ドライバー レース 追跡 場所 位置
    バディベイカー デイトナ500 デイトナインターナショナルスピードウェイ フロリダ州デイトナビーチ 3
    デイル・アーンハート・ジュニア デイトナ500 デイトナインターナショナルスピードウェイ フロリダ州デイトナビーチ 2
    リッキー・ラッド デイトナ500 デイトナインターナショナルスピードウェイ フロリダ州デイトナビーチ 1
    バディベイカー Talladega 500 タラデガスーパースピードウェイ アラバマ州リンカーン 2
    デイル・アーンハート・ジュニア Talladega 500 タラデガスーパースピードウェイ アラバマ州リンカーン 1
    リッキー・ラッド Talladega 500 タラデガスーパースピードウェイ アラバマ州リンカーン 3
    バディベイカー Brickyard 400 インディアナポリスモータースピードウェイ スピードウェイ、インディアナ州 1
    デイル・アーンハート・ジュニア Brickyard 400 インディアナポリスモータースピードウェイ スピードウェイ、インディアナ州 3
    リッキー・ラッド Brickyard 400 インディアナポリスモータースピードウェイ スピードウェイ、インディアナ州 2
    バディベイカー ミシガン400 ミシガンインターナショナルスピードウェイ ブルックリン、ミシガン州 1
    デイル・アーンハート・ジュニア ミシガン400 ミシガンインターナショナルスピードウェイ ブルックリン、ミシガン州 2
    リッキー・ラッド ミシガン400 ミシガンインターナショナルスピードウェイ ブルックリン、ミシガン州 3

    実行することもできます:

    select * from race_winners;

    それは私たちに与えます:

    ドライバー レース 追跡 場所 位置
    リッキー・ラッド デイトナ500 デイトナインターナショナルスピードウェイ フロリダ州デイトナビーチ 1
    デイル・アーンハート・ジュニア Talladega 500 タラデガスーパースピードウェイ アラバマ州リンカーン 1
    バディベイカー Brickyard 400 インディアナポリスモータースピードウェイ スピードウェイ、インディアナ州 1
    バディベイカー ミシガン400 ミシガンインターナショナルスピードウェイ ブルックリン、ミシガン州 1

    また、これによりシリーズチャンピオンになります:

    select * from standings_leader;

    結果は次のようになります:

    終了 ドライバー
    2 バディベイカー
    2 デイル・アーンハート・ジュニア
    2 リッキーラッド

    結論

    データベースサーバー(より具体的にはデータベースカタログ)にクエリを保存して名前を付けると、この新しく名前が付けられたクエリはデータベースビュー、またはより単純にビューと呼ばれます。 MySQLビューは、重要な情報の取得を高速化するのに役立つ、重要で再利用可能なクエリを保存するための強力な方法です。これらの保存ビューは他のビューを参照できるため、これらの実質的なクエリを使用してより詳細なビューを作成できます。

    評価してください!

    私たちは、Hosting™で最も役立つ人間であることに誇りを持っています!

    私たちのサポートチームは、経験豊富なLinux技術者と、複数のWebホスティングテクノロジー、特にこの記事で説明されているテクノロジーについての深い知識を持つ才能のあるシステム管理者でいっぱいです。

    この情報に関してご不明な点がございましたら、24時間年中無休で、この記事に関連する問題に関するお問い合わせにいつでもお答えいたします。

    フルマネージドVPSサーバー、クラウド専用、VMWareプライベートクラウド、プライベート親サーバー、マネージドクラウドサーバー、または専用サーバーの所有者であり、概説されている手順のいずれかを実行することに不安がある場合は、電話@800.580.4985、このプロセスを支援するためのチャットまたはサポートチケットを介して連絡できます。


    1. SQLクエリを使用したコンマ区切り値

    2. PostreSQLに新しい行のみを一括挿入する方法

    3. SQLServerフェールオーバークラスターのインストール-4

    4. SQLServerのXMLドキュメントでノードの順序を検索する