Mysql 多个子查询 多个LEFT JOIN 视图创建

本文介绍如何使用SQL创建多个视图来辅助用户管理任务。包括筛选未提供服务的用户、统计当前月及上个月每位用户的消费总额,并整合这些信息与用户基本信息、奖金总额及未开票金额等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[sql] view plain copy 在CODE上查看代码片派生到我的代码片
CREATE VIEW v_noprovide AS SELECT
*
FROM
tb_section
WHERE
provide = ‘0’

CREATE VIEW v_thismonth AS SELECT
ts.userId AS id,
CONCAT(
‘thismonth:’,
SUM(ts.amount),
‘yuan’
) AS ‘thismonth’
FROM
tb_section AS ts
WHERE
ts.yearMonth = DATE_FORMAT(NOW(), ‘%Y%m’)

CREATE VIEW v_lastmonth AS SELECT
ts.userId AS id,
CONCAT(
‘lastmonth:’,
SUM(ts.amount),
‘yuan’
) AS ‘lastmonth’
FROM
tb_section AS ts
WHERE
ts.yearMonth = DATE_FORMAT(
DATE_SUB(NOW(), INTERVAL 1 MONTH),
‘%Y%m’
)

CREATE
VIEW v_usermanage AS
SELECT
u.id AS id,
u.email AS email,
u.name AS name,
CONCAT(
COALESCE (
la.lastmonth,
‘lastmonth:0yuan’
),
COALESCE (
th.thismonth,
‘thismonth:0yuan’
)
) AS recent,
Sum(COALESCE(b.amount,0)) AS totalBonus,
Sum(COALESCE(n.amount,0)) AS unbilled
FROM
tb_user AS u
LEFT JOIN tb_bonus AS b ON u.id = b.receiverId
LEFT JOIN v_noprovide AS n ON u.id = n.userId
LEFT JOIN v_thismonth AS th ON u.id = th.id
LEFT JOIN v_lastmonth AS la ON u.id = la.id
GROUP BY u.id

MySQL中的LEFT JOIN用于从左表(在LEFT JOIN关键字左边的表)返回所有记录,以及右表(在LEFT JOIN关键字右边的表)中匹配的记录。当涉及到视图(view)和索引时,可能会出现索引失效的情况。 首先,MySQL中的视图是一个虚拟表,其内容由查询定义。视图包含的数据并不实际存在于数据库中,而是在查询视图时动态生成。因此,视图上的索引通常与物理表上的索引不同,它们是视图定义中的SELECT语句上的索引,并不总是能够直接被利用。 当你执行一个包含LEFT JOIN查询,并且涉及到视图时,可能会遇到索引失效的情况,这通常与以下因素有关: 1. 视图的索引策略:视图的索引并不是物理上存在于数据库中,它们依赖于视图所基于的基础表的索引。当使用LEFT JOIN时,如果连接条件或者WHERE子句中的条件没有利用到有效的索引,或者优化器认为全表扫描会更加高效,那么索引就可能不会被使用。 2. 优化器的决策:MySQL的优化器会决定是否使用索引以及如何使用索引。在复杂的查询中,特别是涉及到视图表连接时,优化器可能会因为各种统计信息和成本模型的计算结果而选择不使用索引,从而导致全表扫描。 3. 视图更新规则:MySQL中对视图的更新有一定限制,特别是在涉及到复杂查询表连接的视图。如果视图定义中包含复杂的JOIN操作或者聚合函数,那么可能无法在视图上直接创建索引,进而影响到基于视图查询性能。 为了确保LEFT JOIN查询在涉及视图时索引的有效使用,你可以采取以下措施: - 确保基础表上有适当的索引,并且这些索引能够被视图中的查询利用。 - 分析查询计划,查看是否有不合理的全表扫描发生,如果有,可以尝试重写查询语句来提高索引的利用率。 - 使用EXPLAIN命令来了解查询是如何执行的,以及为什么优化器没有使用某些索引。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值