mysql支持with.as.语法么

mysql支持with.as.语法么,第1张

mysql

with

as

用法如下:

WITH

AS短语,也叫做子查询部分(subquery

factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到。有的时候,是为了让SQL语句的可读性更高些,也有可能是在UNION

ALL的不同部分,作为提供数据的部分。

特别对于UNION

ALL比较有用。因为UNION

ALL的每个部分可能相同,但是如果每个部分都去执行一遍的话,则成本太高,所以可以使用WITH

AS短语,则只要执行一遍即可。如果WITH

AS短语所定义的表名被调用两次以上,则优化器会自动将WITH

AS短语所获取的数据放入一个TEMP表里,如果只是被调用一次,则不会。而提示materialize则是强制将WITH

AS短语里的数据放入一个全局临时表里。很多查询通过这种方法都可以提高速度。

二.使用方法

先看下面一个嵌套的查询语句:

复制代码

代码如下:

select

*

from

person.StateProvince

where

CountryRegionCode

in

(select

CountryRegionCode

from

person.CountryRegion

where

Name

like

'C%')

上面的查询语句使用了一个子查询。虽然这条SQL语句并不复杂,但如果嵌套的层次过多,会使SQL语句非常难以阅读和维护。因此,也可以使用表变量的方式来解决这个问题,SQL语句如下:

复制代码

代码如下:

declare

@t

table(CountryRegionCode

nvarchar(3))

insert

into

@t(CountryRegionCode)

(select

CountryRegionCode

from

person.CountryRegion

where

Name

like

'C%')

select

*

from

person.StateProvince

where

CountryRegionCode

in

(select

*

from

@t)

虽然上面的SQL语句要比第一种方式更复杂,但却将子查询放在了表变量@t中,这样做将使SQL语句更容易维护,但又会带来另一个问题,就是性能的损失。由于表变量实际上使用了临时表,从而增加了额外的I/O开销,因此,表变量的方式并不太适合数据量大且频繁查询的情况。为此,在SQL

Server

2005中提供了另外一种解决方案,这就是公用表表达式(CTE),使用CTE,可以使SQL语句的可维护性,同时,CTE要比表变量的效率高得多。

下面是CTE的语法:

复制代码

代码如下:

[

WITH

<common_table_expression>

[

,n

]

]

<common_table_expression>::=

expression_name

[

(

column_name

[

,n

]

)

]

AS

(

CTE_query_definition

)

现在使用CTE来解决上面的问题,SQL语句如下:

复制代码

代码如下:

with

cr

as

(

select

CountryRegionCode

from

person.CountryRegion

where

Name

like

'C%'

)

select

*

from

person.StateProvince

where

CountryRegionCode

in

(select

*

from

cr)

其中cr是一个公用表表达式,该表达式在使用上与表变量类似,只是SQL

Server

2005在处理公用表表达式的方式上有所不同。

sql

with

as

用法(适用sqlserver,好像oracle也适用)

Server

2005中提供了公用表表达式(CTE),使用CTE,可以使SQL语句的可维护性,同时,CTE要比表变量的效率高得多。

下面是CTE的语法:

[

WITH

<common_table_expression>

[

,n

]

]

<

common_table_expression>::=

expression_name

[

(

column_name

[

,n

]

)

]

AS

(

CTE_query_definition

)

现在使用CTE来解决上面的问题,SQL语句如下:

with

cr

as

(

select

CountryRegionCode

from

person.CountryRegion

where

Name

like

'C%'

)

select

*

from

person.StateProvince

where

CountryRegionCode

in

(select

*

from

cr)

其中cr是一个公用表表达式,该表达式在使用上与表变量类似,只是SQL

Server

2005在处理公用表表达式的方式上有所不同。

在使用CTE时应注意如下几点:

1.

CTE后面必须直接跟使用CTE的SQL语句(如select、insert、update等),否则,CTE将失效。如下面的SQL语句将无法正常使用CTE:

with

cr

as

(

select

CountryRegionCode

from

person.CountryRegion

where

Name

like

'C%'

)

select

*

from

person.CountryRegion

--

应将这条SQL语句去掉

--

使用CTE的SQL语句应紧跟在相关的CTE后面

--

select

*

from

person.StateProvince

where

CountryRegionCode

in

(select

*

from

cr)

2.

CTE后面也可以跟其他的CTE,但只能使用一个with,多个CTE中间用逗号(,)分隔,如下面的SQL语句所示:

with

cte1

as

(

select

*

from

table1

where

name

like

'abc%'

),

cte2

as

(

select

*

from

table2

where

id

>

20

),

cte3

as

(

select

*

from

table3

where

price

<

100

)

select

a.*

from

cte1

a,

cte2

b,

cte3

c

where

a.id

=

b.id

and

a.id

=

c.id

3.

如果CTE的表达式名称与某个数据表或视图重名,则紧跟在该CTE后面的SQL语句使用的仍然是CTE,当然,后面的SQL语句使用的就是数据表或视图了,如下面的SQL语句所示:

--

table1是一个实际存在的表

with

table1

as

(

select

*

from

persons

where

age

<

30

)

select

*

from

table1

--

使用了名为table1的公共表表达式

select

*

from

table1

--

使用了名为table1的数据表

4.

CTE

可以引用自身,也可以引用在同一

WITH

子句中预先定义的

CTE。不允许前向引用。

5.

不能在

CTE_query_definition

中使用以下子句:

(1)COMPUTE

COMPUTE

BY

(2)ORDER

BY(除非指定了

TOP

子句)

(3)INTO

(4)带有查询提示的

OPTION

子句

(5)FOR

XML

(6)FOR

BROWSE

6.

如果将

CTE

用在属于批处理的一部分的语句中,那么在它之前的语句必须以分号结尾,如下面的SQL所示:

declare

@s

nvarchar(3)

set

@s

=

'C%'

--

必须加分号

with

t_tree

as

(

select

CountryRegionCode

from

person.CountryRegion

where

Name

like

@s

)

select

*

from

person.StateProvince

where

CountryRegionCode

in

(select

*

from

t_tree)

7、CTE除了可以简化嵌套SQL语句外,还可以进行递归调用

求如何用mysql实现计算上下两条记录的差的方法。

如下参考:

1.创建一个表并插入数据,如下图所示。

2.按字段名顺序从表名中选择*,如下图。

3.根据班级分组程度(groupby),将数据分为三类:肉类、蔬菜和水果。

4.按类分组后,对结果进行处理,分别计算三个类的总金额。在本例中,sum是mysql提供的一个内置函数(聚合函数),它是统计组合的。

5.分组之后,可以使用聚合函数执行一系列查询 *** 作,询问每个类中有多少个查询 *** 作。

6.组后面跟着过滤器,如下所示。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/7265910.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-03
下一篇 2023-04-03

发表评论

登录后才能评论

评论列表(0条)

保存