之前我們簡單的了解了增、刪、改、查這幾類T-SQL語法來操縱數據表,但是為了更方便快捷地完成大量任務,SQL Server 提供了一些內部函數,可以和SQL Server 的SELECT語句來聯合使用,進行類型轉換、日期處理、數學計算、實現系統功能。
字符串在信息處理時有特殊的地位,幾乎所有信息都需要轉化成字符串才能正確顯示,尤其是不同數據拼接起來顯示的使用更加廣泛。
字符串之間使用“+”拼接
select '運維工程師' + '姓名'+'的基本工資是:'+ cast(基本工資 as varchar(10))+'元'
from *表名* #“基本工資 as varchar(10)”是將基本工資列的類型轉換為字符串
where 職務='運維工程師'
例:
顯示距離當前10天后的日期和時間:select dateadd (DD,10,getdate())#“getdate()”取得當前系統日期,DD:單位為日
顯示所有人的姓名和年齡:select 姓名,datediff (yy,出生日期,getdate()) as 年齡 from ***表名***
顯示表中所有90后的員工姓名和出生月份:
select 姓名,datename (year,出生日期) as 出生月份 # as 后可以配置別名(新生成的列名)
from *表名*
where 出生日期 between '1990-01-01' and '1999-12-31' # and:和、到
聚合函數:
用于對一組值執行計算,并返回單個值
如:求總和、平均值、最大或最小值等
SUN:求總和、AVG:求平均數、MAX和MIN:返回最大最小值
COUNT:返回非空值的計數
查詢表中所有員工基本工資的綜合:
select sum(基本工資) as 總工資
from *表名*
查詢表中所有員工的平均工資:
select avg(基本工資) as 平均工資
from *表名*
查詢表中最高和最低的基本工資:
select max(基本工資) as 最高工資,min(基本工資) as 最低工資
from *表名*
查詢表中90后員工的人數:
select count(基本工資) as '90后人數'
from *表名*
where 出生日期>='1990-01-01'
分組查詢:
將表中的數據通過 group by 子句分類組合,再根據需要得到的統計信息,只顯示限定條件的組,需要使用 HAVING 子句
查詢表中每個職務的平均工資:
select 職務,avg(基本工資) as 職務基本工資
from *表名*
group by 職務
查詢表中平均工資小于10000的職務:
select 職務,avg(基本工資) as 職務平均工資
from *表名*
group by 職務
having avg(基本工資)<10000
函數的綜合應用:
查詢未滿30歲的員工的生日和年齡,并且計算出距離30歲的天數,最后用字符串拼接顯示結果:
查詢正確的結果
select 姓名,出生日期,DATEDIFF(YY,出生日期,GETDATE()) 年齡,
DATEDIFF(DD,GETDATE(),DATEADD(YY,30,出生日期)) 距離三十歲的天數
from test
where DATEDIFF(YY,出生日期,GETDATE())<=30
order by 出生日期
將結果用字符串拼接:
select '員工'+姓名+'的生日是:'+CONVERT(varchar(10),出生日期,111)+
',現在年齡是'+CAST(DATEDIFF(YY,出生日期,GETDATE()) AS varchar(10))
+'歲'+',距離三十歲還有'+
CAST( DATEDIFF(DD,GETDATE(),DATEADD(YY,30,出生日期)) AS varchar(10))+'天'
from employee
where DATEDIFF(YY,出生日期,GETDATE())<=30
order by 出生日期
使用 T-SQL 實現多表查詢:
使用內聯接在表A和表B中使用內聯接查詢學生姓名、學校和職業。(兩種查詢方式)
select a.name 姓名,a.school 學校,b.name,b.job
from A,B
where a.name=b.name
或:
select a.name 姓名,a.school 學校,b.name,b.job
from A inner join B on a.name=B.name
使用左外聯接查詢在表A和表B中使用內聯接查詢學生姓名、學校和職業
select a.name 姓名,a.school 學校,b.name,b.job
from A left join B on a.name=B.name
使用右外聯接查詢在表A和表B中使用內聯接查詢學生姓名、學校和職業。
select a.name 姓名,a.school 學校,b.name,b.job
from A right join B on a.name=B.name
使用完整外聯接查詢在表A和表B中使用內聯接查詢學生姓名、學校和職業。
select a.name 姓名,a.school 學校,b.name,b.job
from A full join B on a.name=B.name
以上四個案例,看似復雜,實則只是 inner、left、reght、full 這四個切換了一下而已
以下是一個實際實例:
源數據表如圖所示:
查詢出廠日期晚于2011年4月的水果信息:
select * from products
where 種類='水果'
and 出廠日期>'2011-04-01'
分組查詢所有水果、蔬菜、堅果的總成本:
select 種類,SUM(成本) from products
group by 種類
查詢所有水果的名稱和出廠日期,以特定格式拼接字符串,如:“西瓜的出廠日期是:2017/05/06”
select 種類+'的出廠日期是:'
+CONVERT(varchar(10),出廠日期,111)
from products
查詢所有蔬菜的平均成本:
select 種類,AVG(成本)
from products
group by 種類
having 種類='蔬菜'
多表查詢的實例:
源數據表如圖所示:
查詢產品的名稱、種類、成本、銷售地點和銷售價格:
select products.名稱,products.種類,
products.成本,sales.銷售地點,sales.銷售價格
from products inner join sales
on products.名稱=sales.名稱
查詢銷往海南的產品名稱、種類、成本和銷售價格:
select products.名稱,products.種類,
products.成本,sales.銷售價格
from products inner join sales
on products.名稱=sales.名稱
and sales.銷售地點='海南'
查詢銷往北京的蔬菜名稱、種類、成本和銷售價格:
select products.名稱,products.種類,
products.成本,sales.銷售價格
from products inner join sales
on products.名稱=sales.名稱
and sales.銷售地點='北京'
where 種類='蔬菜'
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。