什么是SQL表達(dá)式?在SQL語句中,表達(dá)式可以是函數(shù),也可以是列和列之間的混合運(yùn)算。
很多時候,對于表達(dá)式的使用,可以比單獨(dú)操作表上的列,帶來更多方便。
一. 在HAVING中使用表達(dá)式
--
drop table t
create
table
t(c1
int
,c2
int
)
insert
into
t
select
1
,
100
union
all
select
1
,
200
union
all
select
2
,
100
union
all
select
2
,
200
union
all
select
2
,
300
union
all
select
3
,
50
union
all
select
3
,
200
union
all
select
4
,
50
union
all
select
4
,
200
union
all
select
4
,
300
返回c1,滿足:有3個且都大于等于100 的c2 (學(xué)校的考試題中很多見)。
select
c1
from
t
group
by
c1
having
min
(c2)
>=
100
and
count
(
1
)
=
3
?同樣,表達(dá)式也可以用于group by 子句。
二. 在ORDER BY中使用表達(dá)式
--
drop table t_orderby
create
table
t_orderby
(
c1
int
null
,
c2
varchar
(
10
)
null
,
c3
varchar
(
10
)
null
)
insert
into
t_orderby
select
1
,
'
2
'
,
'
a1
'
union
all
select
1
,
'
1
'
,
'
a2
'
union
all
select
3
,
'
1
'
,
'
ab
'
union
all
select
1
,
'
4
'
,
'
b1
'
?
1. c2列的數(shù)據(jù)按'4','1','2'的指定順序排序
(1) 使用union
select
*
from
t_orderby
where
c2
=
'
4
'
union
all
select
*
from
t_orderby
where
c2
=
'
1
'
union
all
select
*
from
t_orderby
where
c2
=
'
2
'
? (2) 使用表達(dá)式方法1
select
*
from
t_orderby
order
by
charindex
(c2,
'
4,1,2
'
)
? (3) 使用表達(dá)式方法2 ,再加個按照c1倒序
select
*
from
t_orderby
order
by
case
when
c2
=
'
4
'
then
1
when
c2
=
'
1
'
then
2
when
c2
=
'
2
'
then
3
end
,c1
desc
?
2. 隨機(jī)排序
(1) 要求c2='4'排第一行,其他的行隨機(jī)排序
select
*
from
t_orderby
order
by
case
when
c2
=
'
4
'
then
1
else
1
+
rand
()
end
? (2) 所有行隨機(jī)排序
select
*
from
t_orderby
order
by
newid
()
? (3) 隨機(jī)取出第一行
select
top
1
*
from
t_orderby
order
by
newid
()
?
3. 要求列c3中數(shù)據(jù),先按第一個字符排序,再按第二個字符排序
select
*
from
t_orderby
order
by
left
(c3,
1
),
ASCII
(
substring
(c3,
2
,
1
))
?
三. 在COUNT中使用表達(dá)式
--
drop table t_count
create
table
t_count
(
c1
varchar
(
10
)
null
,
c2
varchar
(
10
)
null
)
insert
into
t_count
values
(
null
,
null
)
insert
into
t_count
values
(
'
a
'
,
'
b
'
)
insert
into
t_count
values
(
'
a
'
,
'
b
'
)
insert
into
t_count
values
(
'
c
'
,
'
d
'
)
?
1. 使用常量表達(dá)式避免忽略NULL值
select
COUNT
(c1)
from
t_count
--
3
select
COUNT
(
distinct
c1)
from
t_count
--
2
?聚合函數(shù)中, SUM/AVG/COUNT中的NULL會被忽略,比如:這里的count(c1)忽略了null
select
COUNT
(
*
)
from
t_count
--
4
select
COUNT
(
1
)
from
t_count
--
4
select
COUNT
(
1000
)
from
t_count
--
4
用count(*)不會忽略NULL,同樣用count(1)也不會忽略NULL,這里的1就是一個常量表達(dá)式,換成其他常量表達(dá)式也可以,比如count(1000)。
另外,count(1)和order by 1,2那里的數(shù)字意思不一樣,order by后面的序號表示列號。
2. 小心表達(dá)式值為NULL被忽略
--
正常
select
count
(
*
)
from
(
select
c1,c2
from
t_count
group
by
c1,c2) t
--
3
select
count
(
*
)
from
(
select
distinct
c1,c2
from
t_count) t
--
3
--
有NULL參與了運(yùn)算,所以表達(dá)式值為NULL
select
count
(
distinct
c1
+
c2)
from
t_count
--
2
?
四. 在JOIN中使用表達(dá)式
--
drop table t1,t2
create
table
t1
(
url
varchar
(
1000
)
)
create
table
t2
(
code
varchar
(
1000
)
)
--
insert
insert
into
t1
select
'
http://www.baidu.com/test1
'
union
all
select
'
http://www.baidu.com/test2
'
union
all
select
'
http://www.baidu.com/test3
'
union
all
select
'
www.baidu.com/test1
'
union
all
select
'
www.baidu.com/test2
'
union
all
select
'
http://www.google.com/test1
'
union
all
select
'
http://www.google.com/test2
'
union
all
select
'
http://www.sogou.com/test3
'
union
all
select
'
http://www.sogou.com/test4
'
insert
into
t2
select
'
baidu.com
'
union
all
select
'
sogou.com
'
要求t1,t2表的兩個列之間做匹配,t2的列值包含在t1的列值里。
事實(shí)上,在join或者where條件中,只要能構(gòu)造出比較運(yùn)算表達(dá)式(返回boolean值),就可以用作判斷條件。?
select
t2.code,t1.url
from
t1
inner
join
t2
on
CHARINDEX
(t2.code,t1.url)
>
0
--
結(jié)果如下
/*
baidu.com http://www.baidu.com/test1
baidu.com http://www.baidu.com/test2
baidu.com http://www.baidu.com/test3
baidu.com www.baidu.com/test1
baidu.com www.baidu.com/test2
sogou.com http://www.sogou.com/test3
sogou.com http://www.sogou.com/test4
*/
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

