什么是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)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
