sql LEFT JOIN SELECT

SELECT
	a.qid,
	b.search_count,
	b.search_user
FROM
	oracledb.tmp_qid_20191012 a
LEFT JOIN (
	SELECT
		get_json_object (t.extend, '$.questionId') AS questionId,
		count(1) AS search_count,
		count(DISTINCT t.machineid) AS search_user
	FROM
		oracledb.bdp_otb_server_pksp t
	WHERE
		t.partdate >= 'date20190701'
	AND t.partdate <= 'date20190930'
	AND t.functionname = '关键字'
	GROUP BY
		get_json_object (t.extend, '$.questionId')
) b ON a.qid = b.questionId
### SQL 查询执行顺序解析 在SQL查询中,`SELECT`、`FROM` 和 `LEFT JOIN` 的逻辑处理顺序并不是按照它们在语句中的书写顺序来执行的。实际上,数据库引擎内部遵循特定的执行流程。 #### 1. FROM 子句 这是整个查询的第一步,在此阶段,所有的都会被读取并准备用于后续操作。对于涉及的情况,如使用 `JOIN` 操作符时,也会在此步骤完成联接工作。当涉及到左连接 (`LEFT JOIN`) 时,即使右侧没有匹配记录,左侧的所有行仍然会被保留下来,并且右侧对应的列将填充为 NULL 值[^1]。 ```sql FROM departments d LEFT JOIN employees e ON d.department_id = e.department_id ``` 这段代码示从 `departments` 开始,尝试与 `employees` 基于部门ID进行关联;如果有不匹配的部分,则只显示来自 `departments` 的数据,而缺失部分则用NULL代替。 #### 2. WHERE 条件过滤 一旦完成了数据源的选择和初步组合之后,就会应用任何指定于 `WHERE` 子句内的筛选条件。需要注意的是,虽然在这个例子中有 `WHERE` 关键字出现在最后面的位置上,但在实际运行过程中它是在 `JOIN` 完成后再做进一步限定作用的对象集合上的过滤[^4]。 ```sql WHERE d.department_name IN ('IT', 'Sales', 'Retail Sales') ``` 这里是对已经通过 `LEFT JOIN` 连接起来的结果集施加额外约束——仅限于某些特定名称下的部门条目参与最终计算。 #### 3. GROUP BY 分组聚合 接着会对满足上述两个阶段产生的中间结果实施分组汇总运算。这一步骤通常伴随着聚集函数的应用,比如求平均数(`AVG()`)等统计指标。 ```sql GROUP BY department_name, e.job_id ``` 该命令指示系统按部门名以及职位编号这两项属性来进行分类整理,并据此得出每一群体各自的薪资均值。 #### 4. SELECT 投影字段选取 到了这个环节才真正决定了返回给用户的列有哪些具体内容。此时可以自由挑选所需展示的信息项目,并允许对其进行重命名或其他形式变换。 ```sql SELECT d.department_name, e.job_id, AVG(e.salary) AS average_salary ``` 这条指令明确了要提取哪些信息作为输出的一部分,同时还定义了一个新的别名为 "average_salary" 的达式代员工工资平均水平。 #### 5. ORDER BY 排序安排 最后一环则是依据设定好的标准对所得列重新排列次序以便更直观地呈现出来。 ```sql ORDER BY d.department_name, e.job_id; ``` 综上所述,尽管面上看起来像是先选择了什么再去找哪里的数据,但实际上真正的执行路径是从底层向上逐步构建直至形成完整的答案视图[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hi 你好。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值