写点什么

SQL 数据库: 子查询和关联子查询

发布于: 2020 年 11 月 17 日
SQL数据库:子查询和关联子查询

创建测试数据集:

-- 创建Product表
CREATE TABLE Product(
product_id CHAR(4) NOT NULL,
product_name VARCHAR(100) NOT NULL,
product_type VARCHAR(32) NOT NULL,
sale_price INTEGER DEFAULT 0,
purchase_price INTEGER,
regist_date DATE,
PRIMARY KEY(product_id)
);
-- 插入数据
BEGIN TRANSACTION;
INSERT INTO Product VALUES ('0001', 'T恤衫', '衣服', 1000, 500, '2009-09-20');
INSERT INTO Product VALUES ('0002', '打孔器', '办公用品', 500, 320, '2009-09-11');
INSERT INTO Product VALUES ('0003', '运动T恤', '衣服', 4000, 2800, NULL);
INSERT INTO Product VALUES ('0004', '菜刀', '厨房用具', 3000, 2800, '2009-09-20');
INSERT INTO Product VALUES ('0005', '高压锅', '厨房用具', 6800, 5000, '2009-01-15');
INSERT INTO Product VALUES ('0006', '叉子', '厨房用具', 500, NULL, '2009-09-20');
INSERT INTO Product VALUES ('0007', '擦菜板', '厨房用具', 880, 790, '2008-04-28');
INSERT INTO Product VALUES ('0008', '圆珠笔', '办公用品', 100, NULL,'2009-11-11');
COMMIT;



子查询

子查询是一次性视图,将用来定义视图的SELECT语句直接用于FROM子句当中。



SELECT product_type, cnt_product
FROM (SELECT product_type, COUNT(*) AS cnt_product
FROM Product
GROUP BY product_type)
AS ProductCNT



标量子查询

标量子查询(scalar subquery)必须且只能返回一行一列的结果,因此它的返回值可以用在 = 或者 <> 这样需要单一值的比较运算符之中。

例如,计算平均销售单价的标量子查询

SELECT AVG(sale_price) FROM Product;

接下来,实现查询销售价格大于均价的商品信息:

SELECT product_type, sale_price FROM Product
WHERE sale_price > (SELECT AVG(sale_price) FROM Product);



关联子查询

  • 细分的组内进行比较时,需要使用关联子查询。



例如,查询商品中价格高于该类商品平均价格的商品信息

SELECT product_type, 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)

在关联子查询中存在关联名称关联域两个概念,其中p1p2就是关联名称,关联域也就是有效作用范围,例如,上述语句p2的作用域仅限于内层查询,所以如果将WHERE p1.product_type = p2.product_type查询条件转移至外层查询则会报错,即下面的语句:

SELECT product_type, sale_price FROM Product AS p1
WHERE p1.product_type = p2.product_type AND
sale_price > (SELECT AVG(sale_price) FROM Product AS p2
GROUP BY product_type)



发布于: 2020 年 11 月 17 日阅读数: 25
用户头像

正向成长 2018.08.06 加入

想要坚定地做大规模数据处理(流数据方向),希望结合结合批处理的传统处理方式,以及之后流批混合处理方向进行学习和记录。

评论

发布
暂无评论
SQL数据库:子查询和关联子查询