SQLの基本スキル(4)-複雑なクエリ

  以前のレビュー:

SQLナレッジポイント-レコードを挿入

SQLナレッジポイント-レコードの更新、レコードの削除

基本的なSQLスキル(1)-SQLとデータベース

SQLの基本スキル(2)-クエリの基本

SQLの基本スキル(3)-集計と並べ替え

コンテンツ

見る

 ビューの利点

ビューを削除

サブクエリ

スカラーサブクエリ

相関サブクエリ

知識テスト


 

見る

SQLの観点からは、ビューとテーブルは同じです。2つの違いは、実際のデータがテーブルに格納されるのに対し、SELECTステートメントはビューに格納されることです(ビュー自体はデータを格納しません)。 。ビューを使用すると、複数のテーブルにまたがるデータのクエリなどの複雑な操作を簡単に完了できます。ビューには、「 ORDERBYを使用できない」と「制限付き更新を実行できる」という2つの制限があります

 ビューの利点

  • 最初のポイントは、ビューはデータを保存する必要がないため、ストレージデバイスの容量を節約できるということです。
  • 2つ目の利点は、頻繁に使用するSELECTステートメントをビューとして保存できるため、毎回書き直す必要がないことです。頻繁に使用するSELECTステートメントはビューにする必要があります。

ビューを作成するには、CREATEVIEWステートメントを使用する必要があります

CREATE VIEW 视图名称 (< 视图列名 1>, < 视图列名 2>, …… )
AS
<SELECT 语句 >
CREATE VIEW ProductSum (product_type, cnt_product)--视图的别名
AS
--这里的 AS 与定义别名时使用的 AS 并不相同,属于固定语法不可以省略
SELECT product_type, COUNT(*)
FROM Product
GROUP BY product_type;--视图的主体部分
---使用视图
SELECT product_type, cnt_product
FROM ProductSum;

ビューはビューの上にビューを作成することをサポートしていますが、複数のビューを使用するとSQLのパフォーマンスが低下します。ビューに基づいてビューを作成することは避けてください。ビューを使用する際の注意事項:

  • ORDERBY句は使用できません
  • ビューを更新できる条件:
    • SELECT句で使用されていないDISTINCT
    • FROM句にはテーブルが1つだけあります
    •  GROUPBY句は使用されていません
    • HAVING句は使用されていません

ビューを削除

ビューを削除するには、DROP VIEWステートメントを使用し、CASCADEオプションを使用して関連するビューを削除する必要があります。

DROP VIEW 视图名称 (< 视图列名 1>, < 视图列名 2>, …… )
--DROP VIEW ProductSum CASCADE;

サブクエリ

サブクエリはワンショットビュー(SELECTステートメント)です。ビューとは異なり、サブクエリはSELECTステートメントの実行後に消えます。サブクエリは、FROM句でビューを直接定義するために使用されるSELECTステートメントを使用することであり、サブクエリは最初に内部クエリとして実行されます。

-- 在 FROM 子句中直接书写定义视图的 SELECT 语句
SELECT product_type, cnt_product
FROM ( SELECT product_type, COUNT(*) AS cnt_product
FROM Product
GROUP BY product_type ) AS ProductSum;--子查询

スカラーサブクエリ

スカラーサブクエリには特別な制限があります。つまり、1行1列の結果のみを返す必要があります。つまり、テーブル内の行の特定の列の値を返す必要があり、スカラーサブクエリは単一の値を返すサブクエリ。スカラーサブクエリを記述できる場所は、WHERE句に限定されませんが、通常、単一の値を使用できる場所であればどこでもかまいません。つまり、定数または列名を使用できる場合、SELECT句、GROUP BY句、HAVING句、またはORDER BY句のいずれであっても、ほとんどすべての場所で使用でき、スカラーサブクエリは決して返すことができません。複数の行。結果。

相関サブクエリ

GROUP BY句と同様に、相関サブクエリもテーブル内のデータをセグメント化できます。

SELECT product _type , product_name, sale_price
FROM Product AS P1 ①
WHERE sale_price > (SELECT AVG(sale_price)
FROM Product AS P2 ②
WHERE P1.product_type = P2.product_type
GROUP BY product_type);

ここで重要な役割を果たすのは、サブクエリに追加されたWHERE句の条件です。この条件は、同じ商品カテゴリの各商品の販売単価と平均単価が比較されることを意味します。セグメント化されたグループ内で比較する場合、相関サブクエリが必要です。

知識テスト

1.次の3つの条件を満たすビューを作成します(ビュー名はViewPractice5_1です)。Productテーブルを参照テーブルとして使用し、テーブルに初期状態の8行のデータが含まれていると想定します。
条件1:販売単価が1,000円以上であること。
条件2:登録日は2009年9月20日です。
条件3:製品名、販売単価、登録日という3つの列が含まれています。
このビューでSELECTステートメントを実行した結果を以下に示します。

SELECT * FROM ViewPractice5_1;

の結果

CREATE VIEW ViewPractice5_1 
AS SELECT
product_name,
product_price,
regist_date 
FROM
	Product 
WHERE
	sale_price >= 1000 
	AND regist_date > "2009-09-20"

2. 1で作成したビューViewPractice5_1に次のデータを挿入すると、結果はどうなりますか?

INSERT INTO ViewPractice5_1 VALUES (' 刀子 ', 300, '2009-11-02');

报错:視野'shop.viewpractice5_1'基になるテーブルにデフォルト値がありません

ビューにデータを挿入すると、元のテーブルにもデータが挿入されます。元のテーブル(従業員)には、空にできないフィールドが多数あるため、挿入できません。許可されていないフィールドを変更してください。それらが空になるように空にするだけです。

3.次の結果に従ってSELECTステートメントを記述します。ここで、sale_price_allは、すべての製品の平均販売単価としてリストされています。

SELECT
	product_id,
	product_name,
	product_type,
	sale_price,
	( SELECT sum( sale_price ) FROM product ) AS sale_price_all 
FROM
	product

4. 1の条件に従ってSQLステートメントを記述し、次のデータを含むビュー(AvgPriceByTypeという名前)を作成します。

 ヒント:ここで重要なのはavg_sale_price列です。3とは異なり、ここで計算する必要があるのは、各商品タイプの平均販売単価であり、この列は、相関サブクエリを使用して作成できます。問題は、この相関サブクエリをどこで使用するかです。

CREATE VIEW AvgPriceByType AS
SELECT product_id,
       product_name,
       product_type,
       sale_price,
       (SELECT AVG(sale_price)
          FROM Product P2
         WHERE P1.product_type = P2.product_type
         GROUP BY P1.product_type) AS avg_sale_price
 FROM Product P1;

 

おすすめ

転載: blog.csdn.net/weixin_43212535/article/details/122777631