mysql语句查询顺序_mysql查询语句书写顺序,执行顺序

之前用mysql只是简单的复制粘贴,这次写一个相对复杂的sql总是出错,拓展看了下相关内容,惊人的发现我有这么多不知道的,这些你知道吗?

之所以引出sql书写顺序和执行顺序,源于具体要解决的问题是:

一个账号对应多个角色,每个角色都有等级,需要查询每一个账号下等级最大的那个角色id,且最大等级大于20?

错误方案:

select char_id ,level from tbl_char_level l,

tbl_char c where l.char_id = c.char_id order by level desc group by

user_id having level>= 20;

只能group by在前,order by在后

错误方案:用max时,引出另一个问题:

select max(level) as max_level, l.char_id, user_id from

char_level l, tbl_char

c where l.char_id=c.char_id group by(user_id) having max_level >=

10;

这里的max_level对应的char_id,并不是它对应的那个id。max只负责取最大的level,但是并不负责取出

max_level对应的char_id

正确解决方案--子查询:

select char_id

(

select char_id ,level from tbl_char_level l,

tbl_char c where l.char_id = c.char_id order by level desc

)

group by user_id having level

>= 20;

having处理group by分完组后,每组里的具体行信息

Select查询的语句顺序:

Select … from tbl1, tbl2 where ….group by … having ……order by

(asc | desc )

执行顺序:

1. from:对from子句中前两个表执行笛卡尔积生成虚拟表vt1

2. on:对vt1应用on筛选只有满足为真的行才被插入vt2

3. outer join:如果指定了outer

join保留表中未找到的行将作为外部行添加到v2生成vt3,如果from包含两个以上表,则对上一个联结生成的结果表和喜爱一个表重复执行步骤1和2直到结束

4. where:对vt3应用where筛选器只有使为true的行才被插入vt4

5. group by:按group by子句中的列列表对vt4中的行分组生成vt5

6. having:对vt5应用having筛选器只有使为true的组才插入vt6

7. select:处理select列产生vt7

8. distinct:将重复的行从vt7中去除产生vt8

9. order by:将vt8的行按order by子句中的列排序生成vt9

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL查询语句执行顺序如下: 1. FROM:指定要查询的表。 2. JOIN:根据指定的条件,将两个或多个表合并为一个结果集。 3. ON:在执行JOIN之前,根据指定的条件筛选表。 4. WHERE:对查询结果进行筛选,只保留满足指定条件的行。 5. GROUP BY:将结果集按照指定的列进行分组。 6. WITH ROLLUP:按照GROUP BY的列对结果集进行汇总,并添加一行用于总计或小计。 7. HAVING:对分组后的结果进行筛选,只保留满足指定条件的分组。 8. SELECT:选择要查询的列。 9. DISTINCT:对查询结果进行去重。 10. UNION:将两个或多个查询结果集合并为一个结果集。 11. ORDER BY:按照指定的列对结果集进行排序。 12. LIMIT:指定查询结果的行数限制。 所以,MySQL会先执行FROM和JOIN,然后执行ON,接着执行WHERE,然后是GROUP BY、WITH ROLLUP、HAVING、SELECT、DISTINCT、UNION、ORDER BY和LIMIT。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* [Mysql查询语句执行顺序](https://blog.csdn.net/mysnsds/article/details/125313346)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [mysql语句执行顺序](https://blog.csdn.net/qq_41045651/article/details/130068288)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值