子查詢,意即查詢中還有另一個查詢,子查詢放置的位置可以在select、from、where中,有其個別用法及意義。


        位置
Select區間
From區間
Where區間
意義
一個子查詢回傳資料給母查詢當作一個欄位使用,只能回傳一筆單欄資料,此時的where條件能與母查詢的from區塊比對。
當作一個templatetable,可以給selectwhere直接使用,也可以與join系列聯合使用。
當作一種條件比對資料,透過inexist=等運算子來做條件限制

個別用法將在底下一一介紹

#假如這是記錄使用者的訂單
drop table user_order_A;
CREATE TABLE user_order_A (
id bigint(20) NOT NULL AUTO_INCREMENT COMMENT '訂單ID',
name varchar(20) NOT NULL COMMENT '誰的訂單',
PRIMARY KEY(id)
)AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
#假如有A、B、C三位使用者下單
insert into user_order_A(id,name) values (1, 'A');
insert into user_order_A(id,name) values (2, 'B');
insert into user_order_A(id,name) values (3, 'C');
insert into user_order_A(id,name) values (4, 'A');
insert into user_order_A(id,name) values (5, 'B');
insert into user_order_A(id,name) values (6, 'C');

#假如這是記錄每訂單的項目價錢
drop table products_table;
CREATE TABLE products_table (
  order_id bigint(20) NOT NULL COMMENT '關連訂單id',
  product_name varchar(255) NOT NULL,
  price bigint(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into products_table(order_id,product_name,price) values (1, "商品1", 20);
insert into products_table(order_id,product_name,price) values (3, "商品2", 10);
insert into products_table(order_id,product_name,price) values (2, "商品3", 50);
insert into products_table(order_id,product_name,price) values (5, "商品4", 10);
insert into products_table(order_id,product_name,price) values (5, "商品5", 10);
insert into products_table(order_id,product_name,price) values (6, "商品6", 80);
insert into products_table(order_id,product_name,price) values (1, "商品7", 10);
insert into products_table(order_id,product_name,price) values (2, "商品8", 10);
insert into products_table(order_id,product_name,price) values (3, "商品9", 40);
insert into products_table(order_id,product_name,price) values (2, "商品2", 10);
insert into products_table(order_id,product_name,price) values (4, "商品1", 20);

#使用子查詢select底下
SELECT user_order_A.id,
               user_order_A.name,
               (SELECT 
                              SUM(products_table.price)
               FROM
                              products_table
               WHERE user_order_A.id = products_table.order_id
               ) AS price
FROM
               user_order_A ;
結果:













使用在FROM後的JOIN子查詢
SELECT 
              user_order_A.id,
              user_order_A.name,
              products_table.price
FROM   user_order_A
             JOIN (SELECT
                                      SUM(products_table.price),
                                      products_table.order_id ,
                                      products_table.price
                         FROM products_table
                        GROUP BY products_table.order_id
                      )AS products_table
             ON(user_order_A.id= products_table.order_id)
GROUP BY user_order_A.id;
結果:













使用在WHERE後的子查詢條件資料
SELECT user_order_A.id,
               user_order_A.name,
               (SELECT 
                              SUM(products_table.price)
               FROM
                              products_table
               WHERE user_order_A.id = products_table.order_id
               ) AS price

FROM
               user_order_A

WHERE

               user_order_A.name IN (SELECT name FROM user WHERE user.id > 0)
結果︰

 















其它文章

arrow
arrow
    文章標籤
    db mysql subquery 子查詢
    全站熱搜

    PG Levin Li 發表在 痞客邦 留言(0) 人氣()