编写单行子查询

6.2.1在WHERE子句中使用子查询

1.使用“=”号比较操作符

SELECT first_name,last_name FROM customers WHERE customer_id =(SELECT customer_id FROM customers WHERE last_name='Black');

2.使用“<>”、“<”、“>”、“>=”、“<=”等比较操作符

SELECT product_id,name,price
FROM products
WHERE price >
(SELECT AVG(price)
FROM products);

6.2.2 在HAVING子句中使用子查询

SELECT product_type_id,AVG(price)
FROM products
GROUP BY product_type_id
HAVING AVG(price) <
(SELECT MAX(AVG(price))
FROM products
GROUP BY product_type_id);

6.2.3 在FROM子句中使用子查询(内联视图)

SELECT product_id
FROM
(SELECT product_id
FROM products
WHERE product_id<3);

SELECT prds.product_id,price,purchase_data.product_count
FROM products prds,
(SELECT product_id,COUNT(product_id) product_count
FROM purchases
GROUP BY product_id) purchase_data
WHERE prds.product_id=purchases_data.product.id;

6.2.4 限制

1. 在单行查询中使用的子查询不能返回多行
2.
SELECT product_id,name
FROM products
WHERE product_id=
(SELECT product_id
FROM products
WHERE name LIKE '%e%');

LIKE 操作符:
下划线:_ 匹配任意一个字符
百分号:% 匹配从指定位置开始的任意多个字符

2.子查询不能包含ORDER BY 子句,如果需排序,应将ORDER BY子句放在外部查询中

SELECT product_id,name,price
FROM products
WHERE price>
(SELECT AVG(price)
FROM products)
ORDER BY product_id DESC;

6.3 多行子查询

6.3.1 在多行子查询中使用IN操作符

SELECT product_id,name
FROM product
WHERE product_id IN
(SELECT product_id
FROM products
WHERE name LIKE '%e%');

6.3.2 在多行子查询中(与 =,<>,<,>,<=,>=搭配)使用ANY操作符

SELECT employee_id,last_name
FROM empolyees
WHERE salary < ANY
(SELECT low_salary
FROM salary_grades);

6.3.3 在多行子查询中(与 =,<>,<,>,<=,>=搭配)使用ALL操作符号

SELECT employee_id,last_name
FROM employees
WHERE salary > ALL
(SELECT high_salary
FROM salary_grades);

6.4 多列子查询
SELECT product_id,product_type_id,name,price
FROM products
WHERE (product_type_id,price) IN
(SELECT product_type_id,MIN(price)
FROM products
GROUP BY product_type_id);


6.5 关联子查询

SELECT product_id,product_type_id,name,price
FROM products outer
WHERE price>
(SELECT AVG(price)
FROM products inner
WHERE inner.product_type_id=outer.product_type_id);

6.5.2 在关联子查询中使用EXISTS 和 NOT EXISTS

1.在关联子查询中使用EXISTS

SELECT employee_id,last_name
FROM employees outer
WHERE EXISTS
(SELECT employee_id
FROM employees inner
WHERE inner.manager_id=outer.employee_id);

2. 在关联子查询中使用NOT EXISTS

SELECT product_id,name
FROM products outer
WHERE NOT EXISTS
(SELECT 1
FROM purchases inner
WHERE inner.product_id=outer.product_id);

3. EXISTS 和NOT EXISTS与IN和NOT IN 的比较

EXISTS:只检查行的存在性
IN :则要检查值的实际存在性。

EXISTS 性能高于IN,应优先使用。

当用于比较的列值为NULL时:
NOT EXISTS 返回True
NOT IN 返回false

6.6 编写嵌套子查询---嵌套层次可多达255.

嵌套查询应尽量少用,连接查询性能高,应尽量采用。
SELECT product_type_id,AVG(price)
FROM products
GROUP BY product_type_id
HAVING AVG(price)<
(SELECT MAX(AVG(price)))
FROM products
WHERE product_type_id IN
(SELECT product_id
FROM purchases
WHERE quantity>1)
GROUP BY product_type_id);

6.7 包含子查询的UPDATE

UPDATE employees
SET salary =
(SELECT AVG(high_salary)
FROM salary_grades)
WHERE employee_id=4;

6.8 包含子查询的DELETE

DELETE FROM employees
WHERE salary >
(SELECT AVG(high_salary)
FROM salary_grades);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值