Ⅰ 這幾句sql麻煩高手仔細解答一下 意義以及用法 3KS
count (*) over() total, -- total 是 count (*) over() 的別名, count (*) over() 是分析函數求總數,OVER()是分析函數的格式
cast (count(*)over() as decimal)/2 mid --同上 mid 是別名,
ceiling(cast(count(*)over() as decimal)/2) next,
row_number() over(order by UID) --row_number() 行號
分析函數語法:
FUNCTION_NAME(<argument>,<argument>...)
OVER
(<Partition-Clause><Order-by-Clause><Windowing Clause>)
例:
sum(sal) over (partition by deptno order by ename) new_alias
sum就是函數名
(sal)是分析函數的參數,每個函數有0~3個參數,參數可以是表達式,例如:sum(sal+comm)
over 是一個關鍵字,用於標識分析函數,否則查詢分析器不能區別sum()聚集函數和sum()分析函數
partition by deptno 是可選的分區子句,如果不存在任何分區子句,則全部的結果集可看作一個單一的大區
order by ename 是可選的orderby 子句,有些函數需要它,有些則不需要.依靠已排序數據的那些函數,如:用於訪問結果集中前一行和後一行的LAG和LEAD,必須使用,其它函數,如AVG,則不需要.在使用了任何排序的開窗函數時,該子句是強制性的,它指定了在計算分析函數時一組內的數據是如何排序的.
1)FUNCTION子句
ORACLE提供了26個分析函數,按功能分5類
分析函數分類
等級(ranking)函數:用於尋找前N種查詢
開窗(windowing)函數:用於計算不同的累計,如SUM,COUNT,AVG,MIN,MAX等,作用於數據的一個窗口上
例:
sum(t.sal) over (order by t.deptno,t.ename) running_total,
sum(t.sal) over (partition by t.deptno order by t.ename) department_total
製表(reporting)函數:與開窗函數同名,作用於一個分區或一組上的所有列
例:
sum(t.sal) over () running_total2,
sum(t.sal) over (partition by t.deptno ) department_total2
製表函數與開窗函數的關鍵不同之處在於OVER語句上缺少一個ORDER BY子句!
LAG,LEAD函數:這類函數允許在結果集中向前或向後檢索值,為了避免數據的自連接,它們是非常用用的.
VAR_POP,VAR_SAMP,STDEV_POPE及線性的衰減函數:計算任何未排序分區的統計值
2)PARTITION子句
按照表達式分區(就是分組),如果省略了分區子句,則全部的結果集被看作是一個單一的組
3)ORDER BY子句
分析函數中ORDER BY的存在將添加一個默認的開窗子句,這意味著計算中所使用的行的集合是當前分區中當前行和前面所有行,沒有ORDERBY時,默認的窗口是全部的分區 在Order by 子句後可以添加nulls last,如:order by comm descnulls last 表示排序時忽略comm列為空的行.
4)WINDOWING子句
用於定義分析函數將在其上操作的行的集合
Windowing子句給出了一個定義變化或固定的數據窗口的方法,分析函數將對這些數據進行操作
默認的窗口是一個固定的窗口,僅僅在一組的第一行開始,一直繼續到當前行,要使用窗口,必須使用ORDER BY子句
根據2個標准可以建立窗口:數據值的范圍(RANGES)或與當前行的行偏移量.
5)Rang窗口
Range 5 preceding:將產生一個滑動窗口,他在組中擁有當前行以前5行的集合
ANGE窗口僅對NUMBERS和DATES起作用,因為不可能從VARCHAR2中增加或減去N個單元
另外的限制是ORDER BY中只能有一列,因而范圍實際上是一維的,不能在N維空間中
例:
avg(t.sal) over(order by t.hiredate asc range 100 preceding) 統計前100天平均工資
6)Row窗口
利用ROW分區,就沒有RANGE分區那樣的限制了,數據可以是任何類型,且ORDER BY 可以包括很多列
7)Specifying窗口
UNBOUNDED PRECEDING:這個窗口從當前分區的每一行開始,並結束於正在處理的當前行
CURRENT ROW:該窗口從當前行開始(並結束)
Numeric Expression PRECEDING:對該窗口從當前行之前的數字表達式(Numeric Expression)的行開始,對RANGE來說,從從行序值小於數字表達式的當前行的值開始.
Numeric Expression FOLLOWING:該窗口在當前行Numeric Expression行之後的行終止(或開始),且從行序值大於當前行Numeric Expression行的范圍開始(或終止)
range between 100 preceding and 100 following:當前行100前,當前後100後
注意:分析函數允許你對一個數據集進排序和篩選,這是SQL從來不能實現的.除了最後的Order by子句之外,分析函數是在查詢中執行的最後的操作集,這樣的話,就不能直接在謂詞中使用分析函數,即不能在上面使用where或having子句!!!
Ⅱ 將兩條sql的查詢結果拼接在一起顯示
拼接代碼如下:
select * from
(
select * from a)a1,
select * from b)a2,
)a3
Ⅲ SQL期末考試題,來個大神幫解答一下
select fph from mz_brsf
whereje > 200;
2.select sum(je) from mz_brsf
where sfsj >= '2012-01-01'
and sfsj < '2012-02-01';
3.delete from mz_bfsf
where cfh is null;
4.update mz_bfsf
set substr(sfsj,1,4) =2013
where ks ='內科' ;
5. select ks, sum(je) from mz_bfsf
group by ks
having sum(je) >500;
6.select top 2 ys,sum(je)
from mz_bfsf
group by ys
order by sum(je) desc;
7.update a
set a.zc = b.zc
from mz_bfsf a,mz_brxx b
where a.ys = b.ys
Ⅳ SQL語句,將數據按照廠商分組,然後按照月份橫向顯示。
select TID,TName,count(TBNO) as '銷售筆數',sum(case month(TBDate) when '1' then Total else 0 end) as '1月份'
,sum(case month(TBDate) when '2' then Total else 0 end) as '2月份'
,sum(case month(TBDate) when '3' then Total else 0 end) as '3月份'
,sum(case month(TBDate) when '4' then Total else 0 end) as '4月份'
,sum(case month(TBDate) when '5' then Total else 0 end) as '5月份'
,sum(case month(TBDate) when '6' then Total else 0 end) as '6月份'
,sum(case month(TBDate) when '7' then Total else 0 end) as '7月份'
,sum(case month(TBDate) when '8' then Total else 0 end) as '8月份'
,sum(case month(TBDate) when '9' then Total else 0 end) as '9月份'
,sum(case month(TBDate) when '10' then Total else 0 end) as '10月份'
,sum(case month(TBDate) when '11' then Total else 0 end) as '11月份'
,sum(case month(TBDate) when '12' then Total else 0 end) as '12月份' from Orders group by TID,TName
Ⅳ sql存儲過程,查詢一個時間段內的掛號人數,金額,按照課科室統計,基本代碼怎麼寫的,初學者不太明白
--按你的要求要按照科室查詢一個時間段的掛號人數,你的參數至少要有開始時間,結束時間,科室三個參數.
--而且你的過程中根本沒有使用你定義的參數@ksrq和@jsrq,你只是寫出了幾條語句而已
Ⅵ 使用T-SQL語句創建資料庫 創建表
最簡單的,CREATE DATABASE mytest 這樣就可以創建數據了,數據文件什麼的都存放在默認的目錄下了。
指定一些參數的語句:
CREATE DATABASE Sales
ON
( NAME = Sales_dat,
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\saledat.mdf',
SIZE = 10,
MAXSIZE = 50,
FILEGROWTH = 5 )
LOG ON
( NAME = Sales_log,
FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\salelog.ldf',
SIZE = 5MB,
MAXSIZE = 25MB,
FILEGROWTH = 5MB )
Ⅶ 請教sql語句 如何實現關聯表欄位更新
UPDATE多表更新(轉)(2008-05-12 15:29:04)
轉載標簽:update多表更新sql 分類:php網路編程
在開發中,資料庫來回換,而有些關鍵性的語法又各不相同,這是一件讓開發人員很頭痛的事情.本文總結了Update語句更新多表時在SQL Server,Oracle,MySQL三種資料庫中的用法.我也試了SQLite資料庫,都沒成功,不知是不支持多表更新還是咋的.
在本例中: 我們要用表gdqlpj中的gqdltks,bztks欄位數據去更新landleveldata中的同欄位名的數據,條件是當 landleveldata 中的GEO_Code欄位值與gdqlpj中的lxqdm欄位值相等時進行更新.
SQL Server語法:UPDATE { table_name WITH ( < table_hint_limited > [ ...n ] ) | view_name | rowset_function_limited } SET { column_name = { expression | DEFAULT | NULL } | @variable = expression | @variable = column = expression } [ ,...n ] { { [ FROM { < table_source > } [ ,...n ] ] [ WHERE < search_condition > ] } | [ WHERE CURRENT OF { { [ GLOBAL ] cursor_name } | cursor_variable_name } ] } [ OPTION ( < query_hint > [ ,...n ] ) ]
SQL Server示例: update a set a.gqdltks=b.gqdltks,a.bztks=b.bztks from landleveldata a,gdqlpj b where a.GEO_Code=b.lxqdm
Oracle語法: UPDATE updatedtable SET (col_name1[,col_name2...])= (SELECT col_name1,[,col_name2...] FROM srctable [WHERE where_definition])
Oracel 示例: update landleveldata a set (a.gqdltks, a.bztks)= (select b.gqdltks, b.bztks from gdqlpj b where a.GEO_Code=b.lxqdm)
MySQL語法: UPDATE table_references SET col_name1=expr1 [, col_name2=expr2 ...] [WHERE where_definition]
MySQL 示例: update landleveldata a, gdqlpj b set a.gqdltks= b.gqdltks, a.bztks= b.bztks where a.GEO_Code=b.lxqdm