SQL和MySQL不能调用别名的一些理解
在编写SQL,因为一些别名不能称,百度的原因,原来由于不同的别名机制造成的。为了避免同样的错误下次重复,我们总结了在网上找到的信息今天,SQL和MySQL的执行顺序,并发现内部机制同样的,最大的区别是在别名参考。一、SQL执行命令
(1)
(3)加入
(2)关于
(4)在何处
(5)按组
(6)平均值、和…
(7)有
(8)选择
(9)明显的
(10)按顺序
从这个序列中,我们可以很容易地发现所有查询都是从。在执行过程中,每个步骤将生成下一步的虚拟表,该表将被输入到下一步。
第一步:首先,执行一个FROM子句中的第一个表的笛卡尔积,当虚拟表VT1产生(选择基表相对小的表)。
第二步:下一步是应用过滤器。逻辑表达式在将应用在VT1的每一行,并满足逻辑表达式的行被选中来生成虚拟表VT2。
第三步:如果外加入后这一步骤将添加一个外部的线,左外连接把左表增加滤波器的第二步,如果右外部联接将右表中添加第二步过滤掉线,这个虚拟表VT3
第四步:如果FROM子句中的表的数量是两个以上的表,然后将VT3第三表计算笛卡尔积和生成虚拟表。这个过程是一个1-3步骤,最后得到一个新的虚拟表VT3。
第五步:在滤波器中的应用,对一步法生产参考滤波器生成虚拟表VT4虚拟表,在这个非常重要的细节要说的,因为含有查询外加入条款,到底有一个令人困惑的问题,对过滤器或过滤指定的逻辑表达最大的区别在哪里是如果应用到逻辑表达式,然后在第三步外的加入,删除的行也可以添加回来,和那里的最终去除。一个简单的表一个学生的例子(类名)和评分(姓名,成绩),我需要所有的学生都对现在的X级成绩的回报,但是这个班有几个学生缺席,不记录在结果表。为了得到想要的结果的子句指定学生得分,我们需要(得分=名称。学生关系。然后我们发现这个名字)在第二步骤的实施,学生没有参与检查的记录将不会出现在VT2、因为他们是逻辑表达式过滤掉对然而,我们使用左外部联接左表(学生)不参与学生的检查回来,因为我们想回到X班所有的学生,如果学生在。类= 'x',然后左外连接不会把X班回顾所有的记录,所以学生只能应用在滤波器。过滤器类= 'x'因为这是最后的。
第六步:GROUPBY子句将只值在组成一组,和虚拟表VT5得到。如果应用组,然后所有步骤后,只能得到的VT5或聚合函数列(计数,求和,平均值,等等)。原因是最终的结果集中每个组只有一行。请记住这一点。
第七步:使用CUBE或ROLLUP选项为VT5生成VT6产生超级组。
第八步:使用具有滤波产生VT7,具有过滤是第一位的,是适用于已分组数据的过滤。
第九步:处理SELECT子句,在选择出现的VT7列生成vt8过滤掉。
第十步:使用不同的条款,同样被排除在vt8,和VT9产生。事实上,如果你使用GROUP BY子句,则明显是多余的。原因是当分组时,列的唯一值被划分为一个组,每个组返回一行记录,因此记录将不同。
第十一步:使用ORDER BY子句。排序VT9的order_by_condition,光标回到此时,不是一个虚拟的table.sql是基于集合理论,设定将不会提前他的线排序,它只是一个逻辑组的成员,和其成员的顺序是无关紧要的。查询这是在表的排序可以返回一个包含一个特定的物理顺序的逻辑组织,这个对象被称为光标,返回值是一个指针,通过查询订单的条款不适用于表的排序是非常有成本意识的表达。除非您必须排序,最好不要指定顺序,最后,在这一步中,这是在SELECT列表中使用别名的第一步和唯一步骤。
第十二步:应用顶部选项。此时,结果返回给请求者,用户。
二、mysql的执行顺序
SELECT语句的定义
一个完整的SELECT语句包含几个可选子句。SELECT语句的定义如下所示:
SQL代码
复制代码代码如下所示:
{ { } { } { } { }
选择子句是必需的,其他子句,如WHERE子句、组子句是可选的。
在SELECT语句中,子句的顺序是固定的。例如,BY子句不在WHERE子句的前面。
选择语句执行顺序
SELECT子句的执行顺序与SELECT子句的输入顺序不同,所以它不是从select子句执行的,而是按以下顺序执行的。
> > WHERE子句>组子句子句>具有子句>按子句子句>选择子句>限制子句>最后结果
在执行每个子句之后,将为下一个子句使用一个中间结果,如果没有子句,它将跳过。
与此相反,MySQL和SQL执行序列基本上是相同的,标准的sql语句是:
SQL代码
复制代码代码如下所示:
选择考生姓名,最大(总分)为马克斯总分
从tb_grade
考生姓名不为空
考生姓名
拥有最大(总成绩)> 600
按马克斯总分排序
在上面的例子中,SQL语句的执行顺序如下所示:
(1)。首先执行FROM子句从tb_grade表的数据源的数据集合
(2)。执行WHERE子句中的过滤器tb_grade表不为空的所有数据
(3)。执行GROUPBY子句和组tb_grade表由学生姓名栏
(4)。计算最大(聚合)函数,根据总成绩找出总结果的最大数目。
(5)。为了执行有保留的条款,筛选课程的总成绩超过600。
(7)。执行按订单子句,并根据最大得分排序最终结果。
这里有一个例子来说明根本不使用别名的根本原因。
例1
SQL代码
复制代码代码如下所示:
选择m.mname作为用户名,
AVG(分数)作为Rscore,
(案例
当AVG(分数)<60
穷人
当AVG(分数)或60和AVG(分数)< = 80
好的
当AVG(分数)> 80和AVG(分数)< = 100
好的
其他的
非法
结束)
从分数s,学生M
在s.mid = m.mid
集团通过m.mname
通过Rscore倒序;
如果AVG(分数)内箱改为别名Rscore,下运行SQL是错误的
例二
SQL代码
复制代码代码如下所示:
从计数组中选择计数(*)为C,计数为(*)> 2;
如果我们把计数(*)变成别名C,这句话在SQL中是错误的,在mysql下是正确的。我们很长时间都不能理解它。
为了执行GroupBy,在哪里,和订货报表:
最后,解释执行顺序的几个报表分组,有,在哪里,和订货。SQL语句往往会产生更多的临时观点,那么这些词的执行顺序是很重要的,因为你必须知道的关键是在现场操作前的相应观点的形成或临时视图表的操作,在别名视图的使用问题是特别重要的。上面列出的关键词按以下顺序执行:哪里,分组,有,第一,将OrderBy。条件不符合原始记录的记录删除,然后分组条件为GROUPBY关键字后,该将筛选得到的视图分组,然后根据筛选标准RIA具有指定的关键字后,数据包视图不满足条件的记录进行筛选,然后根据订货报表查看这种最终结果的产生。在这四个键,只有最后的视图的列名称可以使用orderby语句,如:
SQL代码
复制代码代码如下所示:
选择fruitname,出产全国,价格,ID为IDE,折扣fromt_test_fruitinfo秩序的
只有在OrderBy语句,IDE可以使用,和其他条件语句只能如果需要参考的列名称使用身份证,但没有IDE。