最新要闻
- 推动戏剧事业高质量发展
- 售价8.99万元起 钇为3全球上市 重新定义纯电A级车|热讯
- 谨防诈骗!男子点30块外卖 结果没了2000元|每日热门
- 实时焦点:Redmi K60系列618杀疯了!全渠道销量破100万台
- 微动态丨女儿考满分农民工父亲买烧鸡庆祝:趁年轻多挣点钱 让孩子能有选择
- 网飞《三体》真人剧集中文预告 明年一月上线
- 天天热推荐:“降息潮”蔓延 “存款特种兵”跨城狂飙
- 焦点关注:祸国电视剧免费观看(祸国电视剧)
- 国产“水果之王”来了!首批国产榴莲6月上市开卖_聚看点
- CPU都要烧掉了!女子景区坐竹筏被汽车撞了 网友:头次见|当前要闻
- 曾经最火SUV!比亚迪宋PLUS冠军版今日上市 买它还是银河L7?
- 小米MIX Fold 3关键规格曝光:首次用上潜望长焦、更耐摔-天天快看点
- 黑龙江首列高端旅游列车“林都号”首发:酒吧、茶室全都有
- 中成股份:6月16日融资买入247.82万元,融资融券余额1.3亿元
- 山村幼儿园计划-阳光专项基金20000_山村幼儿园计划_全球要闻
- 避坑指南 篇六:影帝的大肚腩也拯救不了没落的港片。
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
世界动态:MySQL中SQL语句的执行顺序(详细)
(资料图)
一:SQL语句的执行顺序
作为一个开发人员,在开发中基本上每时每刻都要和数据库打交到;虽然写过无数的SQL语句,但是写好一个SQL可不是这么简单的,它涉及到各式各样的优化和书写方式;但下面我以MySQL中的SQL执行顺序来作为讲解,对其进行剖析。
1:SQL数据的准备
为了可以为下文做铺垫,这里我创建了一些数据,后面将以SQL案例的方式说明SQL语句执行的顺序
-- 创建数据库表create database if not exists demo_order_school charset utf8;-- 使用表USE demo_order_school-- 创建辅导员老师表create table if not exists teacher( tid int primary key auto_increment COMMENT "编号", tname varchar(5) not null COMMENT "姓名", tsex enum("男","女") default "男" COMMENT "性别", tage tinyint unsigned COMMENT "年龄", tsalary decimal(6,1) default 0 COMMENT "工资 最高99999.9", taddress varchar(10) COMMENT "住址")charset utf8;-- 创建学生表create table if not exists student ( sid int(11) primary key auto_increment COMMENT "编号", sname varchar(5) not null COMMENT "姓名", ssex enum("男","女") default "男" COMMENT "性别", sage tinyint(11) unsigned not null default 20 COMMENT "年龄", saddress varchar(10) COMMENT "住址", senrol date default "2020-12-12" COMMENT "入学时间", tid int COMMENT "连接老师id")charset utf8;-- 添加老师数据insert into teacher (tid,tname,taddress)values(1,"张老师","江苏南京"),(2,"李老师","江苏无锡"),(3,"王老师","江苏常熟"),(4,"孙老师","江苏苏州");-- 添加学生数据insert into student(sid,sname,saddress)values(1 ,"王生安","安徽六安"),(2 ,"李鑫灏","安徽合肥"),(3 ,"薛佛世","安徽蚌埠"),(4 ,"蔡壮保","安徽安庆"),(5 ,"钱勤堃","安徽合肥"),(6 ,"潘恩依","安徽合肥"),(7 ,"陈国柏","安徽六安"),(8 ,"魏皑虎","安徽六安"),(9 ,"周卓浩","安徽六安"),(10,"汤辟邦","安徽六安"),(11,"张顺谷","安徽淮南"),(12,"张悌斯","安徽淮南"),(13,"张灶冲","安徽蚌埠"),(14,"章晞旺","安徽淮南"),(15,"易江维","安徽合肥"),(16,"孙生笙","安徽蚌埠"),(17,"饶展林","安徽蚌埠"),(18,"岳列洋","安徽合肥"),(19,"时党舒","安徽六安"),(20,"周迟蒲",null),(21,"廉梦容","安徽合肥"),(22,"朱付流","安徽蚌埠"),(23,"陆丛枫","安徽淮南"),(24,"吴 邪","安徽六安"),(25,"萧百徽","安徽六安"),(26,"田壮善","安徽六安"),(27,"莫立恩","安徽六安"),(28,"戚渊苏","安徽六安"),(29,"邱靖祈","安徽合肥"),(30,"刘鲜发","安徽六安"),(31,"郭磊留","安徽合肥"),(32,"张 磊","安徽淮南"),(33,"鲁贯栾","安徽蚌埠"),(34,"张 杰","安徽合肥"),(35,"姬行轮","安徽合肥"),(36,"严愚贵","安徽蚌埠"),(37,"龚银桓","安徽蚌埠"),(38,"盛丹革","安徽合肥"),(39,"张蓝彪","安徽六安"),(40,"成品彤","安徽六安"),(41,"方昂庄","安徽合肥"),(42,"区胄法","安徽蚌埠"),(43,"丘耿徽","安徽淮南"),(44,"张城庸","安徽六安"),(45,"陈浩森","安徽六安"),(46,"丘枝皆","安徽六安"),(47,"秦正莱","安徽六安"),(48,"张桥共",null),(49,"莫征意","安徽合肥"),(50,"张棉党","安徽合肥"),(51,"葛星申","安徽六安"),(52,"张 婷","安徽六安"),(53,"王 珊","安徽合肥"),(54,"王觉飘","安徽合肥"),(55,"魏爱來","安徽蚌埠"),(56,"池樵霆","安徽淮南"),(57,"李澜才","安徽六安"),(58,"孙 熹","安徽六安"),(59,"黎宝安","安徽六安"),(60,"夏两吟","安徽六安"),(61,"易 鲁","安徽六安"),(62,"路党拓","安徽合肥"),(63,"魏沁霭","安徽合肥"),(64,"鲍大莉","安徽六安");-- 处理数据update student set ssex=ceil(rand()*2),sage=ceil(rand()*5+20), senrol=concat(ceil(rand()*3+2017),"-" , ceil(rand()*12) , "-",ceil(rand()*20));update student set tid=ceil(rand()*4);
2:一个简单案例SQL编写
连接查询`teacher`表和`student`表,并对其分组,统计出每个老师手下的男女学生个数,并过滤出总是小于等于8的人数,降序排列SELECT DISTINCT t.tname "老师姓名",s.ssex "学生性别", COUNT(s.sid) "学生总数" FROM teacher t LEFT JOIN student s ON t.tid = s.tid GROUP BY t.tname,s.ssex HAVING COUNT(s.sid) >=8 ORDER BY COUNT(s.sid) DESC LIMIT 3; +--------------+--------------+--------------+ | 老师姓名 | 学生性别 | 学生总数 | +--------------+--------------+--------------+ | 孙老师 | 男 | 11 | | 张老师 | 女 | 9 | | 王老师 | 女 | 9 | +--------------+--------------+--------------+通过上面的一个案例可以发现,数据是查询出来了,但是具体的SQL执行顺序是什么呢?是先执行’WHERE‘子句还是先执行‘HAVING’子句呢?下面就一起说的透:
3:SQL执行顺序和书写顺序
执行顺序 书写顺序 8 SELECT 9 DISTINCT <查询字段> 1 FROM <查询的(左)表名称> 3 [LEFT|RIGHT|INNER] JOIN <连接查询右边表> 2 ON <表连接的连接条件> 4 WHERE <数据查询条件> 5 GROUP BY <字段分组信息> 6 WITH CUBE|ROLLUP <超组统计> 7 HAVING <处理后的筛选条件> 10 ORDER BY [ASC|DESC] <排序字段> 11 LIMIT <查询数据长度>说明:从这个顺序中我们不难发现,所有的查询语句都是从FROM子句开始执行的,在执行过程中,每个步骤都会为下一个步骤生成一个虚拟 表,这个虚拟表将作为下一个执行步骤的输入。第一步:首先对FROM子句中的前两个表执行一个笛卡尔乘积,此时生成虚拟表 vt1(若有多表时选择相对小的表做基础表)第二步:接下来使用ON筛选器,ON中的逻辑表达式将应用到 vt1 中的各个行,筛选出满足ON逻辑表达式的行,生成虚拟表 vt2第三步:如果是OUTER JOIN那么这一步就将添加第二步被过滤的数据,LEFT OUTER JION就把左表在第二步中过滤的添加进来, 如果是RIGHT OUTER JOIN那么就将右表在第二步中过滤掉的行添加进来,这样生成虚拟表 vt3注意:如果FROM子句中的表数目多余两个表,那么就将vt3和第三个表连接从而计算笛卡尔乘积,生成虚拟表,该过程就是一个重复 1-3的步骤,最终得到一个新的虚拟表 vt3。第四步:使用WHERE筛选器,对上一步生产的虚拟表vt3引用WHERE筛选器,筛选后生成虚拟表vt4;第五步:GROUP BY子句将指定的列值组合成为一组,得到虚拟表vt5。如果应用了GROUP BY,那么后面的所有步骤都只能得到的vt5的列 或者是聚合函数(COUNT、SUM、AVG等)。原因在于最终的结果集中只为每个组包含一行。这一点请牢记。第六步:应用WITH CUBE(在MySQL中不支持)或WITH ROLLUP(支持)选项,为vt5生成超组,生成vt6第七步:应用HAVING筛选器,生成vt7。HAVING筛选器是第一个也是为唯一一个可以使用到已分组数据的筛选器。第八步:处理SELECT子句。将vt7虚拟表在SELECT中出现的列筛选出来。生成vt8。第九步:应用DISTINCT子句,vt8中移除相同的行,生成vt9。事实上如果应用了GROUP BY子句那么DISTINCT是多余的; 其实分组的时候是将列中相同的值分成一组,同时只为每一组返回一行记录,那么所有的记录都将是不相同的。第十步:应用ORDER BY子句。按照ORDER_BY_CONDITION(指定排序的字段)排序vt9,此时返回的一个游标,而不是虚拟表。SQL是基于集 合理论的,集合不会预先对它的行排序,它只是成员的逻辑集合,成员的顺序是无关紧要的。对表进行排序的查询可以返回一个对 象,这个对象包含特定的物理顺序的逻辑组织。这个对象就叫游标。正因为返回值是游标,那么使用ORDER BY子句查询不能应用于 表达式。排序是很需要成本的,除非你必须要排序,否则最好不要指定ORDER BY,最后,在这一步中是第一个也是唯一一个可以使 用SELECT列表中别名的步骤。第十一步:使用LIMIT制定需要返回的行数补充说明:①:对于包含OUTER JOIN子句的查询,到底是在ON筛选器里指定逻辑过滤条件还是用WHERE筛选器指定逻辑过滤条件呢?其实ON和WHERE的最大区别在于,如果在ON应用逻辑表达式那么在第三步OUTER JOIN中还可以把移除的行再次添加回来,而WHERE 一旦被移除那是找不回来的,那就代表左外连接和右外连接特有数据就丢失了。 简单来说就是,当有外关联表时(左连接和右连接),ON主要是针对外关联表进行筛选,保留主要的一方表信息;当不是外关联表时, 两者的作用其实是一样的;例如左外连接时,首先执行ON,筛选掉外连表中不符合ON表达式的数据,而WHERE的筛选是对ON关联后的结 果集进行筛选。 假设有一个学生表(班级,姓名)和一个成绩表(姓名,成绩),现在需要返回一个X班级的全体同学的成绩,但是这个班级有几个学生缺考, 也就是说在成绩表中没有记录。为了得到我们预期的结果我们就需要在ON子句指定学生和成绩表的关系(学生.姓名=成绩.姓名)那么我 们是否发现在执行第二步的时候,对于没有参加考试的学生记录就不会出现在vt2中,因为他们被ON的逻辑表达式过滤掉了,但是我们用 LEFT OUTER JION就可以把左表(学生)中没有参加考试的学生找回来,因为我们想返回的是X班级的所有学生,如果在ON中应用 学生.班级="n"的话,LEFT OUTER JION会把n班级的所有学生记录找回;若在WHERE中删选学生.班级="n"的话,只打印n班级学生,其它 信息则会被永久过滤。
4:补充和案例SQL说明
MySQL查询语句的七大子句标准形式:一个标准的SELECT语句可以包含多个子句,SELECT语句的定义如下: 其中SELECT子句是必选项,其余的如WHERE子句、GROUP BY子句等等都是可有可无的;一个SELECT语句中,子句的顺序是严格固定的。 例如GROUP BY子句不会位于WHERE子句的前面。 SELECT语句的执行顺序:上面说了MySQL查询语句的标准形式,我们知道SQL查询语句的结构,但是这并不意味着每次一个SELECT语句都是从SELECT子句开始 执行的,而标准的七大子句执行顺序如下(具体可以参考第3小节): 开始-> FROM子句->WHERE子句->GROUP BY子句->HAVING子句->ORDER BY子句->SELECT子句->LIMIT子句->最终结果每个子句执行后都会产生一个中间结果(虚拟表),供接下来的子句使用,如果不存在某个子句,就跳过。案例(参考第2小节的SQL语句阐述): SELECT DISTINCT t.tname "老师姓名",s.ssex "学生性别", COUNT(s.sid) "学生总数" FROM teacher t LEFT JOIN student s ON t.tid = s.tid GROUP BY t.tname,s.ssex HAVING COUNT(s.sid) >=8 ORDER BY COUNT(s.sid) DESC LIMIT 3; ①:首先会执行FROM子句把`teacher表`和`student表`连接在一起做笛卡儿积,然后就生成了vt1表,然后拿着vt1表来使用ON筛 选器进行筛选,得到具体的vt2表 ②:执行GROUP BY子句, 把`teacher表`的t.tname和`student表`的s.ssex进行分组 ③:计算 COUNT() 聚集函数, 按 "学生ID" 求出学生总数 ④:执行 HAVING 子句, 筛选"学生总数"大于等于8的 ⑥:执行 ORDER BY 子句, 把最后的结果按学生人数降序排列 ⑥:执行 LIMIT 子句限制查询条数为3条记录 说明:其实上述语句我并未使用到WHERE子句
.
关键词:
世界动态:MySQL中SQL语句的执行顺序(详细)
海外交友源码平台搭建:基础功能的实现(一)
推动戏剧事业高质量发展
售价8.99万元起 钇为3全球上市 重新定义纯电A级车|热讯
谨防诈骗!男子点30块外卖 结果没了2000元|每日热门
实时焦点:Redmi K60系列618杀疯了!全渠道销量破100万台
微动态丨女儿考满分农民工父亲买烧鸡庆祝:趁年轻多挣点钱 让孩子能有选择
网飞《三体》真人剧集中文预告 明年一月上线
天天热推荐:“降息潮”蔓延 “存款特种兵”跨城狂飙
面向故障处理的可观测性体系建设
Spring Boot 优雅实现多租户架构,so easy~!
焦点关注:祸国电视剧免费观看(祸国电视剧)
国产“水果之王”来了!首批国产榴莲6月上市开卖_聚看点
CPU都要烧掉了!女子景区坐竹筏被汽车撞了 网友:头次见|当前要闻
曾经最火SUV!比亚迪宋PLUS冠军版今日上市 买它还是银河L7?
小米MIX Fold 3关键规格曝光:首次用上潜望长焦、更耐摔-天天快看点
黑龙江首列高端旅游列车“林都号”首发:酒吧、茶室全都有
中成股份:6月16日融资买入247.82万元,融资融券余额1.3亿元
山村幼儿园计划-阳光专项基金20000_山村幼儿园计划_全球要闻
避坑指南 篇六:影帝的大肚腩也拯救不了没落的港片。
精彩看点:“楚才还乡”招才引智推介会在北京举办
氧化铝期货上市在即 从定价和套利中或可觅得交易机会_全球滚动
环球快消息!曲阜万仞宫墙南广场区域实行分时段限行 市民游客注意
宝马被大货车横着推出几百米 女司机以为只能等死 网友:远离货车的重要性
青岛新特产“巧克力大爷”火了 网友感慨还玩手机吗:这身体素质秒年轻人_今亮点
长城汽车总裁:‘放血式’价格战不是长久之计 明年目标净利润72亿元 资讯
环球观速讯丨魅族Flyme Auto首次上车 亮点一览:跟手机一样好用
多只债基提前结束募集 超470亿元资金涌向债市 今日关注
讯息:“财务顾问”被判全额连带赔偿 首例ABS欺诈发行案判决结果出炉
曾被长城举报 比亚迪秦/宋PLUS DM-i大批量OTA升级1.2系统
南京大学才女瞒着家里当主播 竟发现榜一大哥是自己爸爸_快讯
售价超50万元理想MEGA却用18英寸小轮胎 李想揭秘:比20英寸好太多
读发布!设计与部署稳定的分布式系统(第2版)笔记05_层叠
电动摩托开始崛起:传统燃油摩托车要被淘汰?
世界热讯:父亲带12岁女儿休学1年骑行游中国:不让孩子拼文化课 没意义
spring cloud 微服务治理
泰迪踢掉主人长了2年的肾结石 网友:晚饭加鸡腿 每日快播
一个电铃在牛津大学响了180多年:电池成分却至今未知 天天微头条
首尔房价暴跌40%!楼市要崩盘?韩国人纷纷表示很淡定 今日聚焦
全球微头条丨京东618最终战报:就是不说多少钱
环球时讯:魅族618销售额增速第一:同比增长500%
天天短讯!C++基础知识总结
7499元 华硕ROG新款38英寸游戏显示器上架:4K 144Hz高刷屏
北京现代沐飒正式上市:12.18万元起、百公里油耗低至6.86L-全球热闻
【全球独家】银行股迎来回调,不急,我们最不缺的就是时间
董明珠称:全世界只有格力空调不吹人! 环球观察
【Unity3D】法线贴图和凹凸映射 视点
每日讯息!中邮策略:央行降息提振信心 市场有望震荡上行
吃小龙虾戴了手套 为啥还是满手油? 每日快看
天天精选!AMD做了一个201MB缓存的怪物!可惜流产了
今年“6·18”河南消费力全国第八!胡辣汤、洛阳汉服、河南老字号美食全国热卖
k8s 深入篇———— 一些容器操作的原理[三]|报资讯
政治权利名词解释电大 政治权利名词解释 最新资讯
微软确认月初遭DDoS网络攻击:一度导致Microsoft 365服务中断
终末的女武神同人 毗沙门天VS宇智波斑-资讯
249元 雷柏推出VT9S无线鼠标:原相3395引擎、26000 DPI|全球微头条
大四男生实习薪资1万4妈妈仰天大笑 姐姐回应:要在船上写论文 全球聚焦
一箭41星创中国纪录!当天传回超清大图:英格兰一览无余 环球观察
全球热讯:拜耳医药保健有限公司属于哪个国家_拜耳公司是哪个国家
头条焦点:全国大数据与计算智能挑战赛:面向低资源的命名实体识别基线方案,排名13/64
STL vector容器存储键值对
世界滚动:美国加速跌落美债深渊
天天快消息!苹果M2 Ultra首次开盖:Intel 56核心相形见绌
“迈克·马龙,你为什么不买詹姆斯的账?”
环球报道:美团一面:OOM后,JVM一定会退出吗?为什么?
JS(入门)-焦点速读
东土科技:定增募资不超8.75亿元申请获证监会注册批复 环球热文
当前滚动:最便宜折叠手机!moto razr 40开售:3999元起
官方通报“特校校长刘某某强制猥亵残障学生案”
Python调用外部系统命令
【环球报资讯】Python第三方模块:pymongo模块的用法
马斯克:针对智能电视的推特视频应用即将问世 世界快消息
速递!国内首款市域C型动车组亮相:时速达160公里
最新民调:超半数非裔美国人预计美国种族主义会变得更糟 环球报道
500元到5000元 各价位最值得买的10款CPU集合
世界今日报丨独特16:18“方形”比例辨识度拉满:LG推出新款DualUp 28MQ750显示器
演员胡兵50万航司积分被清零引关注 东航客服回应:没办法核实-热门
k8s 深入篇———— docker 镜像是什么[二]
马斯克脑机接口新进展:首例人体植入试验今年开展 环球热资讯
攀升618秒杀:12代酷睿16英寸护眼屏轻薄本仅1999元_全球通讯
天天热资讯!《变形金刚》独占鳌头:2023暑期档票房达15亿元
看了“细菌量” 你还敢给孩子用卷纸来擦嘴吗?_天天快资讯
网飞爆火网剧续作来了!《鱿鱼游戏》第二季官宣:老角色回归|焦点要闻
浦发银行:共湘发展十九载 奋楫扬帆正当时
满血8核+32GB+1TB 机械革命S mini主机到手2929元:办公神器|世界即时看
资讯推荐:上线12年的“QQ安全达人”将下线 网友:你为它装过腾讯电脑管家没?
商职全称是什么 济南商职全称是什么
2023中国高校计算机大数据挑战赛:论文学科分类baseline|清华主办|今日看点
【技术积累】算法中的排序算法【一】
极限科技旗下软件产品 INFINI Easysearch 通过统信 UOS 认证|天天热议
【环球财经】日本为何出现巨额贸易逆差
便宜的瓜不甜?百果园回应女子团购西瓜被嘲讽:是误解 已道歉|全球热闻
京东618发布“35711”梦想:打造3家万亿收入公司 创造100万就业_通讯
演员胡兵向东航维权失败:价值一万多的白金卡50万积分一夜清零
天天快讯:在 Cenntos6.8 下安装 Oracle11g
当前播报:京东限时优惠:Redmi 27英寸4K显示器享大降价
世界头条:人气漫改!网飞真人版《海贼王》预告片出炉:路飞橡胶手无敌
全球车企第一高!马斯克曝特斯拉市值上涨主要动力 今日快看
关注:广州一龙舟队全是富婆?当地:事实 但身价不是参赛门槛
焦点热门:一公司端午节只发了三颗荔枝 员工吐槽:是不是公司要凉了?