第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

sql里面如何引用列的別名

sql里面如何引用列的別名

德瑪西亞99 2019-03-30 09:31:30
描述:selectcolumn1+10asc1,c1+10asc2fromtable1;想實現(xiàn)上面的效果,結(jié)果在mysql里面報錯了,提示找不到c1這個列;但是selectcolumn1+10asc1wherec1>0fromtable1;這種又是可以的;問題:想知道為什么存在這個問題,還有如果想在表達式中引用列別名,有沒有方法可以實現(xiàn)?希望有大牛能貼個詳細點的回答出來,介紹下這背后的sql機制,分析下為什么不支持這種方式;這個問題我在stackoverflow有查過,找到的方案也是用子查詢跟@申明變量這兩種方式;另外個人感覺子查詢跟@申明變量這兩種方式不夠簡潔,不知道有沒有更好的方案;
查看完整描述

2 回答

?
BIG陽

TA貢獻1859條經(jīng)驗 獲得超6個贊

mysql中的SQL語句執(zhí)行是有一定順序的,如下:
1.from
2.on
3.join
4.where
5.groupby
6.with
7.having
8.select
9.distinct
10.orderby
11.limit
一條SQL會經(jīng)過這11步的,中間的每一步都會生成一張?zhí)摂M表,后面的步驟都是在上一張?zhí)摂M表中進行篩選與查詢的,下面假設(shè),經(jīng)過了7步也就是經(jīng)過了having這一步,生成的虛擬表假設(shè)為:
idcolumn1column2alias(having后的別名)
11010aaa
22020bbb
現(xiàn)在到了SELECT這一步的時候,你的查詢字段為column1+10asc1,那么sql解析器在這個虛擬表中可以找到column1這個字段,那么計算和設(shè)置別名成功,現(xiàn)在你要c1+10,它發(fā)現(xiàn)這個虛擬表中不存在這個字段,那么就會報錯,如果你想這樣做:aliasasxxx,那么也不會報錯,因為having篩選過后,這個別名字段已經(jīng)在虛擬表中了,所以其實道理很簡單,select的執(zhí)行順序是排在第8步的,而select是針對以上幾步生成的虛擬表進行操作的,所以你所要使用的字段,如果虛擬表中不存在,那么則會報錯,如果樓主的那句SQL硬要執(zhí)行的話,也只能改成selectcolumn1+10asc1,column1+10+10asc2fromtable1;
                            
查看完整回答
反對 回復(fù) 2019-03-30
?
ABOUTYOU

TA貢獻1812條經(jīng)驗 獲得超5個贊

官方說列表別名可以在GROUPBY,ORDERBY,HAVING中被引用,而標準的SQL禁止在where中被引用,因為where語句有可能執(zhí)行在先。
官方?jīng)]有說能否在select語句中引用別名,但根據(jù)錯誤提示可以想到它是先檢查所需要的字段名是否存在于被查詢的數(shù)據(jù)中,再進行數(shù)據(jù)提取。
真正引用別名是做不到了,可以用其它方式,子查詢,變量什么的@Foccy的連接中有很多答案
                            
查看完整回答
反對 回復(fù) 2019-03-30
  • 2 回答
  • 0 關(guān)注
  • 409 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號