mysql分享(1)-sql语句执行的11个步骤

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

IREDPURE

mysql执行查询语句的11个步骤(分享1)

ZERO

2016/02/19

每个人都会犯错误,有的人把犯过的错误记录下来,进一步总结,形成了自己的一套理论;有的人,则在同一个错误上一错再错,不停的抱怨,然后

再犯错,然后再抱怨,产生了一个死循环……

1、项目结束后的思考

每个项目的结束,每个人都会有自己的收获,不同水平的人总结出来的东西可能不一样!但是对自己而言,都是进步,都是让自己在原有的基础上强大

了一点点。我们在每个项目结束后,都应该对自己做一个总结,这是我们强大的来源,日记月累,必定是一笔不小的财富!

2、mysql查询语句执行的11个步骤

(8) select

(9) distinct

(1) from

(1)

(3) join (1)

(2) on

(4) where

(5) group by

(6) with {cube | rollup}

(7) having

(10) order by

(11) limit

以上是这个11个步骤,这是《mysql技术内幕之sql编程》这本书上面得出的结论,有兴趣的同学也可以去看下,很不错的一本书!

ps: Paul DuBois( 杜波依斯) Sun 公司MySQL文档团队的技术作者、开源社区和MySQL社区活跃的技术专家,同时也是一名数据库管理员。他曾参

与过MySQL在线文档的编写工作

接下来我们举一个例子,分别解释sql语句的执行流程!

3、举例说明sql语句的执行流程

【1】进行准备工作

CREATE TABLE `Customer` (

`CustomerID` varchar(10) NOT NULL,

`CityName` varchar(10) NOT NULL,

PRIMARY KEY (`CustomerID`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

LOCK TABLES `Customer` WRITE;

INSERT INTO `Customer` VALUES ('163','hangzhou'),('9you','shanghai'),('tx','hangzhou'), ('baidu','hangzhou');

UNLOCK TABLES;

================================================================================================================= CREATE TABLE `Orders` (

`OrdersID` int(11) NOT NULL AUTO_INCREMENT,

`CustomerID` varchar(10) DEFAULT NULL,

PRIMARY KEY (`OrdersID`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

LOCK TABLES `Orders` WRITE;

INSERT INTO `Orders` VALUES (1,'163'),(2,'163'),(3,'9you'),(4,'9you'),(5,'9you'),(6,'tx'),(7,null);

UNLOCK TABLES;

=====================================================================================================最终结果如下:

通过如下语句查询来杭州,且订单小于2的用户,并且查询出来他们的订单数量,查询的结果按照订单数从大到小排列:

select Customer.CustomerID, Customer.CityName, count(Orders.CustomerID) as OrdersNumber

from Customer left join Orders

on Customer.CustomerID = Orders.CustomerID

where Customer.CityName='HangZhou'

group by Customer.CustomerID

having count(Orders.CustomerID) < 2

order by OrdersNumber desc;

ps:在得出正确的语句之前,我写了两次错误的sql,个人认为还是很有借鉴意义的:

select Customer.CustomerID, Customer.CityName, count(*) as OrdersNumber

from Customer inner join Orders

on Customer.CustomerID = Orders.CustomerID where Customer.CityName='HangZhou'

group by Customer.CustomerID having count(*) < 2 order by OrdersNumber desc;

select Customer.CustomerID, Customer.CityName, count(*) as OrdersNumber

from Customer left join Orders

on Customer.CustomerID = Orders.CustomerID where Customer.CityName='HangZhou'

group by Customer.CustomerID having count(*) < 2

从结果上看是错误的,但是,为什么错误,请各位自行脑补!

【2】得到联表的笛卡尔积

也就是执行sql语句中的第一步骤,得到笛卡尔积。

在数学中,两个集合X和Y的笛卡儿积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员。假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。

执行下面的语句得到笛卡尔积,形成了虚拟表V1:

ps:每次上个步骤产生的虚拟表,作为下一步骤的输入

【3】执行on语句进行过滤

也就是语句中的Customer.CustomerID = Orders.Customer,在sql语句中的有三个条件会进行过滤,on是其中之一,此外还有where、having语句进行过滤!执行如下语句,我们可以模拟笛卡尔积(虚拟表V1)过滤后的数据,得到虚拟表V2

ps:什么是三值逻辑表达式?

在php中,逻辑表达式只有两种返回结果,true和false。但是在mysql中,却会返回三个值,true、false、unknow

var_dump(null === null);//返回结果是true

?>

相关文档
最新文档