马哈鱼数据血缘分析器中的子查询语句分析

发布时间:2022-07-05 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了马哈鱼数据血缘分析器中的子查询语句分析脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

在实际生产环境中,无论你的业务复杂与否,子查询都是绕不开的话题,本文带你了解一下马哈鱼数据血缘分析器是如果处理各种子查询的。通过本文你能了解到不同场景的子查询在马哈鱼中的展示状态。

嵌套子查询可以说是SQL语句中比较复杂的一部分,它可以提高查询效率,简化SQL语句的实现逻辑。子查询指的是一个查询语块可以嵌套在另外一个查询语句块的Form子句、where子句或者having子句中,根据位置不同可分为为子查询或内查询,后者为父查询或外查询。

下面我们逐步分析各种使用场景中子查询对应马哈鱼中的显示状态:

一、子查询分类场景分析

1、在From中声明子查询

最常见的子查询使用场景之一是它作为派生表与其他表或视图进行关联分析,这一类子查询主要有两种类型,一种是子查询作为派生表与其他表进行关联;另一种是子查询形成的派生表作为外层查询的唯一表。后者是前者的一种特殊情况,这两种情况下,子查询所产生的的中间结果集均会被马哈鱼显示并作为外层结果集的部分或全部数据,如下:

--形式一:子查询派生表与其他表进行关联
SELECT e.employee_id,e.last_name,e.salary,dept_avg_sal.avg_sal
From employees e,(
        SELECT department_id,AVG(salary) avg_sal
        FROM employees
        group by department_id
        )  dept_avg_sal
WHERE e.department_id = dept_avg_sal.department_id
AND e.salary > dept_avg_sal.avg_sal

马哈鱼数据血缘分析器中的子查询语句分析

形式二:子查询作为派生表
select * from (
  select dt.d_year
    ,ITem.i_brand_id brand_id
    ,item.i_brand brand
    ,sum(ss.ss_sales_PRice) sum_agg
 from date_dim dt
   ,Store_sales ss
   ,item
 where dt.d_date_sk = store_sales.ss_sold_date_sk
  and store_sales.ss_item_sk = item.i_item_sk
  and item.i_manufact_id = 816
  and dt.d_moy=11
 group by dt.d_year
   ,item.i_brand
   ,item.i_brand_id
 order by dt.d_year
     ,sum_agg desc
     ,brand_id
        ) where rownum <= 100;

马哈鱼数据血缘分析器中的子查询语句分析

2、单值子查询

单值子查询作为子查询中较为常见的一种使用方式,它可以是相关子查询也可以是不相关子查询,它产生的结果集因为仅作用于限制外层查询返回数据的多少,本身并不影响外层查询返回的列数,所以,它的中间结果集会被单独列出,如下图:

SELECT employee_id,last_name,salary
FROM employees e1
WHERE salary > (
        SELECT AVG(salary)
        FROM employees e2
        WHERE e2.department_id = e1.department_id  );

马哈鱼数据血缘分析器中的子查询语句分析

3、返回结果集中的子查询

返回结果集中的子查询必须是返回单列,一般是相关子查询,它返回的值作为外层查询的一个列,直接影响到最终查询结果集,所以它的中间结果集的地位会会像其他表或视图一样,作为最终结果集的源数据提供者,如下图:

--子查询作为返回值
select dt.d_year
    ,item.i_brand_id brand_id
    ,item.i_brand brand
    ,sum(ss.ss_sales_price) sum_agg
  ,(select score from  store_sales where storeid=1) score
 from date_dim dt
   ,store_sales ss
   ,item
 where dt.d_date_sk = store_sales.ss_sold_date_sk
  and store_sales.ss_item_sk = item.i_item_sk
  and item.i_manufact_id = 816
  and dt.d_moy=11
 group by dt.d_year
   ,item.i_brand
   ,item.i_brand_id
 order by dt.d_year
     ,sum_agg desc
     ,brand_id

马哈鱼数据血缘分析器中的子查询语句分析

4、嵌套子查询--iN表达式

嵌套子查询(in)它可以是相关子查询也可以是不相关子查询,它产生的结果集因为仅作用于筛选外层查询返回数据的多少,本身并不影响外层查询返回的列数,所以,它的中间结果集会被单独列出,如下图

--子查询在in表达式内
SELECT employee_id,last_name,job_id,department_id
FROM employees
WHERE employee_id IN (
            SELECT DISTINCT manager_id
            FROM employees);

马哈鱼数据血缘分析器中的子查询语句分析

5、嵌套子查询--[not]exists表达式

嵌套子查询([not]exists)它可以是相关子查询也可以是不相关子查询,它产生的结果集因为仅作用于筛选外层查询返回数据的多少,本身并不影响外层查询返回的列数,所以,它的中间结果集会被单独列出,如下图

--场景一:子查询中返回表中列
SELECT employee_id,last_name,job_id,department_id
FROM employees e1
WHERE EXISTS (
        SELECT employee_id
        FROM employees 
        WHERE e1.employee_id = manager_id
        );
       

马哈鱼数据血缘分析器中的子查询语句分析

--场景二:子查询中返回常量
SELECT employee_id,last_name,job_id,department_id
FROM employees e1
WHERE EXISTS (
        SELECT 1
        FROM employees 
        WHERE e1.employee_id = manager_id
        );

马哈鱼数据血缘分析器中的子查询语句分析

6、在having子句中使用子查询

having子句中的子查询也是用于筛选分组后的数据集合,它本质还是用于筛选数据本身,并不会影响外层结果集的结构,所以它的中间结果集会被单独列出,如下图:

--在having子句中使用子查询
SELECT d.deptno,d.dname,AVG(e.sal) avgsal
FROM emp e,dept d
WHERE e.deptno=d.deptno
GROUP BY d.deptno,d.dname
HAVING AVG(e.sal)=(SELECT MAX(AVG(sal))
     FROM emp GROUP BY deptno);

马哈鱼数据血缘分析器中的子查询语句分析

二、总结分析

通过分析子查询的各种使用场景,我们不难发现,子查询的位置决定了它所形成的中间结果集在马哈鱼分析结果上的位置,根据子查询所在的位置,我们可以简单总结如下:

  • where子句之前的子查询,它的中间结果集会参与它外层查询的结果集的形成,中间结果集在马哈鱼分析界面上和表或视图地位一致;
  • where子句之后的子查询,它的结果集仅参与外层查询返回数据的筛选限制,本身不会对外层查询结果集的结构产生影响,马哈鱼将它的中间结果集和外层结果集并列展示。

三、参照

马哈鱼数据血缘分析器: https://sqlflow.gudusoft.COM

马哈鱼数据血缘分析器中文网站: https://www.sqlflow.cn

脚本宝典总结

以上是脚本宝典为你收集整理的马哈鱼数据血缘分析器中的子查询语句分析全部内容,希望文章能够帮你解决马哈鱼数据血缘分析器中的子查询语句分析所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。