DB. MySQL 6. クエリ内のサブクエリ

4989 ワード

サブクエリ


リンクテキスト

1.非常関所サブクエリ


クエリー文の内部にある別のクエリー文は、外部クエリーと内部サブクエリーが独立して実行され、互いに関連しません.
ex1)
SELECT
  CategoryID, CategoryName, Description,
  (SELECT ProductName FROM Products WHERE ProductID = 1)
FROM Categories;

クエリー・ステートメントに別のクエリー・ステートメントを挿入して、別のテーブルからデータをロードします.
ex2)
SELECT * FROM Products
WHERE Price < (
  SELECT AVG(Price) FROM Products
);

サブクエリを使用してPriceの平均値を求め、平均値より低い値を抽出します.
ex3)
SELECT CategoryID, CategoryName, Description
FROM Categories;

CategoriesテーブルのCategoryID、CategoryName、Description列
ex3-1)
SELECT CategoryID FROM Products
  WHERE Price > 50;

Poductsテーブルには50より大きいCategoryIDがあります.
ex 3-2)合成ビュー

PoductsテーブルのPriceが50より大きいCategoryIDを抽出し、CategoryNameおよびDescription列のデータを読み込みます.

ALL, ANY


演算子の未~ALLサブクエリのすべての結果~ANYサブクエリの1つ以上の結果~~
ex1) ALL
SELECT Price FROM Products 
WHERE CategoryID =2;

CategoryIDが2の値を抽出してPriceを表示
ex 1-1)ALLの適用
SELECT * FROM Products
WHERE Price > ALL(
SELECT Price FROM Products 
WHERE CategoryID =2
);

CategoryIDが2より大きいPrice値が表示されます.CategoryIDが2の場合、Max値より大きい値が表示されます.
ex2) ANY
SELECT CategoryID FROM Products 
WHERE Price > 50;

50以上のCategoryID
適用ex 2-1)ANY
SELECT CategoryID, CategoryName, Description 
FROM Categories
WHERE CategoryID = ANY (
SELECT CategoryID FROM Products 
WHERE Price > 50);

Price値が50より大きいCategoryIDに同じ値がある場合、その値が表示されます.
"CategoryID = ANY"== "CategoryID IN"

2.関連サブクエリ


外部と内部のサブクエリが担当します.
ex1)
製品表

カテゴリテーブル

ProductsテーブルにはCategoryIDがあります.
クラスには各クラスのクラスIDが持つデータがあります.
SELECT ProductID, ProductName,
(
SELECT CategoryName FROM Categories C
WHERE C.CategoryID = P.CategoryID
) AS CategoryName
FROM Products P;
  • カテゴリC、製品Pの各テーブルの別名は
  • である
  • PテーブルからProductID、ProductNameの
  • を取得
  • CテーブルCategoryName
  • をインポート
  • C.CategoryIDとP.CategoryIDは同一集合
  • である.
  • PテーブルのProductID、ProductName、およびCテーブルのCategoryName
    ex2)
    Supplier表

    Customersテーブル

    各テーブルが持つCountyとCity情報を用いて1つのテーブルに整理する.
    SELECT SupplierName, Country, City,
    (
    SELECT COUNT(*) FROM Customers C
    WHERE C.Country = S.Country
    ) AS CustomersInTheCountry,
    (
    SELECT COUNT(*) FROM Customers C
    WHERE C.Country = S.Country AND C.City = S.City
    ) AS CustomersInTheCity 
    FROM Suppliers S;
  • Supplier S,Customers C各テーブルの別名
  • SテーブルSupplier Name、Country、City情報
  • を取得
  • Cテーブルでは、CとSの国情報が同じデータをインポートし、COUNT、列名クライアントInTheCountry
  • Cテーブルでは、CとSの国情報が同一、CとSの都市情報が同一のCOUNT、列名クライアントInTheCity
  • 結果が1つのテーブルに表示されます

    EXISTS / NOT EXISTS


    EXISTS演算子以外の未EXISTSがあるか
    ex1) EXISTS
    SELECT CategoryID, CategoryName 
    FROM Categories C
    WHERE EXISTS(
    SELECT * FROM Products P
    WHERE P.CategoryID = C.CategoryID AND P.Price > 80
    );

    P.Category IdおよびC.CategoryIDと同じ価格で80を超えるデータがある場合に表示されます.
    ex2) NOT EXISTS
    SELECT CategoryID, CategoryName 
    FROM Categories C
    WHERE NOT EXISTS(
    SELECT * FROM Products P
    WHERE P.CategoryID = C.CategoryID AND P.Price > 80
    );
    

    これは、80以上の価格のデータを除いて、P.CategoryIDとC.CategoryIDが同じであることを示している.