SQL执行顺序-以MySQL为例

一、总结-太长不看浓缩版

SQL的执行顺序从前到后依次是:

  • FROM:获取第一张表,称为原表table1,获取第二张表,称为原表table2,将两张表做笛卡尔积,生成第一张中间表Temp1。
  • ON:根据筛选条件,在Temp1上筛选符合条件的记录,生成中间表Temp2。
  • JOIN:根据连接方式的不同,选择是否在Temp2的基础上添加外部行。左外就把左表在Temp2中筛选掉的表添加回来生成Temp3,右外则是右表。
  • WHERE:筛选表中的记录,对中间表temp3的记录进行过滤,生成temp4。
  • GROUP BY:根据聚合键对表进行分组,即在temp4的基础上做分组,生成temp5。
  • WITH:应用cube或rollup生成超组,在Temp5的基础上添加超组,生成Temp6。
  • HAVING:对组进行筛选,生成temp7。
  • SELECT:选取字段,对temp7进行字段的选取,生成temp8。
  • DISTINCT:对字段进行去重,对temp8进行去重,生成temp9。
  • ORDER BY:按照排序键对表进行排序,对temp9中的表进行排序,生成temp10。
  • LIMIT(TOP):对表进行分页,对temp10进行分页,生成temp11。

二、实际演示-囉里囉唆小白版

(一)MySQL版本

8.0.29 社区版


(二)表内容展示说明与创建代码

本次演示用到两张表,存放商品信息的“product”表与存放商店信息的“shopproduct”表。表内容与代码的来源均来自于日本作家MICK所著的《SQL基础教程》,此处仅为学习分享使用,如有不妥请联系我删除。

product表的表结构与具体内容如下:

  • product表的表结构

product表-表结构

  • product表的字段含义
字段名称 实际含义
product_id 商品编号,具有唯一性
product_name 商品名称
product_type 商品种类
sale_price 商品销售单价
purchase_price 商品进货单价
regist_data 商品信息登记日期
  • product表的具体内容

shopproduct表的表结构与具体内容如下:

  • shopproduct表的表结构

shopproduct表-表结构

  • shopproduct表的字段含义
字段名称 字段含义
shop_id 商店编号
shop_name 商店名称
product_id 商品编号
quantity 商店内商品库存数量
  • shopproduct表的具体内容

shopproduct表-具体内容


为了方便小伙伴自己动手理解过程,创建表两张表的代码如下:

#创建product表
CREATE TABLE Product
(product_id CHAR(4) NOT NULL,
product_name VARCHAR(100) NOT NULL,
product_type VARCHAR(32) NOT NULL,
sale_price INTEGER ,
purchase_price INTEGER ,
regist_date DATE ,
PRIMARY KEY (product_id));

#向product表中插入具体记录
INSERT INTO Product VALUES ('0001', 'T恤衫', '衣服', 1000, 500,'2009-09-20');
INSERT INTO Product VALUES ('0002', '打孔器', '办公用品', 500,320, '2009-09-11');
INSERT INTO Product VALUES ('0003', '运动T恤', '衣服', 4000,2800, NULL);
INSERT INTO Product VALUES ('0004', '菜刀', '厨房用具', 3000,2800, '2009-09-20');
INSERT INTO Product VALUES ('0005', '高压锅', '厨房用具', 6800,5000, '2009-01-15');
INSERT INTO Product VALUES ('0006', '叉子', '厨房用具', 500,NULL, '2009-09-20');
INSERT INTO Product VALUES ('0007', '擦菜板', '厨房用具', 880,790, '2008-04-28');
INSERT INTO Product VALUES ('0008', '圆珠笔', '办公用品', 100,NULL, '2009-11-11');

#创建shopproduct表
CREATE TABLE ShopProduct
(shop_id CHAR(4) NOT NULL,
shop_name VARCHAR(200) NOT NULL,
product_id CHAR(4) NOT NULL,
quantity INTEGER NOT NULL,
PRIMARY KEY (shop_id, product_id));

#向shopproduct表中插入具体记录
INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000A', '东京', '0001', 30);
INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000A', '东京', '0002', 50);
INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000A', '东京', '0003', 15);
INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000B', '名古屋', '0002', 30);
INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000B', '名古屋', '0003', 120);
INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000B', '名古屋', '0004', 20);
INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000B', '名古屋', '0006', 10);
INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000B', '名古屋', '0007', 40);
INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000C', '大阪', '0003', 20);
INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000C', '大阪', '0004', 50);
INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000C', '大阪', '0006', 90);
INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000C', '大阪', '0007', 70);
INSERT INTO ShopProduct (shop_id, shop_name, product_id, quantity) VALUES ('000D', '福冈', '0001', 100);

<< · Back Index ·>>

发表回复

相关推荐

家用NAS开源方案

关于家庭NAS NAS就是有一台家用主机,也可以使一台家用电脑,但是这台电脑的存储空间特别大,比如买电脑时选择硬盘空间大的 ...

· 2分钟前

2024年高中必刷题(九科人教版必修一)大合集-可打印pdf

2024年恐成“高考难年”,3大改变要关注,部分学生或无缘本科:教育政策并不是一成不变的,而是随着时代的发展不断的改革和调 ...

· 3分钟前

五凉古都,这样的武威你了解吗?

武威地处甘肃河西走廊的东端, 东邻兰州,西通金昌, 南依祁连山,北接腾格里沙漠。 武威在历史上不仅是古丝绸之路上的重镇 ...

· 4分钟前

如何做一份优秀的个人简历

送你一份简历制作全攻略,小白也能做出优秀简历。

· 9分钟前

狼人殺中的貼臉與場外

今天我們來講解一下狼人殺中的兩項註意事項——貼臉與聊場外。在狼人殺遊戲中,這兩種行為都是被禁止的,盡量在遊戲中避免貼臉...

· 15分钟前