【MySQL必知必会】学习笔记Day7

2020-01-29  本文已影响0人  小小孩儿的碎碎念

【MySQL必知必会】学习笔记Day7&1.29&D14-16章&P90-112页

12、使用子查询

(1) 子查询

(2) 利用子查询进行过滤

SELECT order_num
FROM orderitems
WHERE prod_id ='TNT2';

输出:
order_num
20005
20007

SELECT cust_id
FROM orders
WHERE order_num IN (20005,20007);

输出:
cust_id
10001
10004

SELECT cust_name,cust_contact
FROM customers
WHERE cust_id IN (10001,10004);

输出:
cust_name              cust_contact
Coyote INc              Y Lee
Yosemite PLace      Y Sam

SELECT cust_name,cust_contact
FROM customers
WHERE cust_id IN (SELECT cust_id
                  FROM orders
                  WHERE order_num IN (SELECT order_num
                                      FROM orderitems
                                      WHERE prod_id ='TNT2'));

(3) 作为计算字段使用子查询

SELECT COUNT(*) AS orders
FROM orders
WHERE cust_id = 10001;
SELECT cust_name,
       cust_state,
       (SELECT COUNT(*)
        FROM  orders
        WHERE orders.cust_id = customers.cust_id) AS orders
FROM  customers
ORDER BY cust_name;

注:

13、联结表

(1)联结

① 关系表

② 为什么要使用联结

(2)创建联结

SELECT vend_name,prod_name,prod_price
FROM vendors,products
WHERE vendors.vend_id = products.vend_id
ORDER BY vend_name, prod_name;

① WHERE子句的重要性

② 内部联结

SELECT vend_name,prod_name,prod_price
FROM vendors INNER JOIN products
ON vendors.vend_id = products.vend_id

③ 联结多个表

SELECT prod_name,vend_name,prod_price,quantity
FROM orderitems,products,vendors
WHERE products.vend_id = vendors.vend_id
      AND orderitems.prod_id = products.prod_id
      AND order_num = 20005;

注:性能考虑:不要联结不必要的表。联结的表越多,性能下降越厉害。

SELECT cust_name,cust_contact
FROM customers
WHERE cust_id IN (SELECT cust_id
                  FROM orders
                  WHERE order_num IN (SELECT order_num
                                      FROM orderitems
                                      WHERE prod_id ='TNT2'));
SELECT cust_name,cust_contact
FROM customers,orders,orderitems
WHERE customers.cust_id = orders.cust_id
      AND  orderitems.order_num = orders.order_num
      AND  prod_id = 'TNT2';                  
14、创建高级联结

(1) 使用表别名

SELECT cust_name,cust_contact
FROM customers AS c,orders AS o,orderitems AS oi
WHERE c.cust_id = o.cust_id
      AND  oi.order_num = o.order_num
      AND  prod_id = 'TNT2';                  

注:表别名只在查询执行中使用

(2) 使用不同类型的联结

① 自联结

SELECT prod_id,prod_name
FROM products
WHERE vend_id = (SELECT vend_id
                                FROM products
                                WHERE prod_id = 'DTNTR');
SELECT p1.prod_id,p1.prod_name
FROM products AS p1,products AS p2
WHERE p1.vend_id = p1.vend_id
      AND p2.prod_id = 'DTNTR';

注:用自联结而不用子查询:自联结通常作为外部语句用来替代从相同表中检索数据时使用的子查询语句。虽然最终的结果是相同的,但有时候处理联结远比处理子查询快得多

② 自然联结

SELECT c.*,o.order_num,o.order_date,oi.prod_id,oi.quantity,oi.item_price
FROM customers AS c,orders AS o,orderitems AS oi
WHERE c.cust_id = o.cust_id
      AND oi.order_num = o.order_num
      AND prod_id = 'FB';

③ 外部联结

SELECT customers.cust_id, orders.order_num
FROM customers INNER JOIN orders
     ON  customers.cust_id = orders_cust_id;
SELECT customers.cust_id, orders.order_num
FROM customers LEFT OUTER JOIN orders
     ON  customers.cust_id = orders_cust_id;

注:

(从右边的表中选择所有行,应该使用RIGHT OUTER JOIN,如下例所示)

SELECT customers.cust_id, orders.order_num
FROM customers  RIGHT OUTER JOIN orders
     ON  customers.cust_id = orders_cust_id;

注:

(3) 使用带聚集函数的联结

SELECT customers.cust_name,
               customers.cust_id,
               COUNT(orders.order_num) AS num_ord
FROM  customers INNRT JOIN orders
     ON  customers.cust_id = orders.cust_id
GROUP BY customers.cust_id;
SELECT customers.cust_name,
               customers.cust_id,
               COUNT(orders.order_num) AS num_ord
FROM  customers LEFT OUTER  JOIN orders
     ON  customers.cust_id = orders.cust_id
GROUP BY customers.cust_id;

【MySQL必知必会】系列笔记:
【MySQL必知必会1-4章】学习笔记Day1
【MySQL必知必会5-7章】学习笔记Day2
【MySQL必知必会8-9章】学习笔记Day3
【MySQL必知必会10章】学习笔记Day4
【MySQL必知必会11-12章】学习笔记Day5
【MySQL必知必会13章】学习笔记Day6

上一篇 下一篇

猜你喜欢

热点阅读