❶ sql server 自定義函數如何查詢多條結果
一樣在裡面寫啊,返回結果的時候,返回一張table吧,這樣就可以返回多個結果了。
請試一試!
❷ SQL的基本函數
【二】SQL的基本函數
  
 2.1 關系型資料庫SQL命令類別
  
 數據操縱語言:DML: select; insert; delete; update; merge.
  
 數據定義語言:DDL: create; alter; drop; truncate; rename; comment.
  
 事務控制語言:TCL: commit; rollback; savepoint.
  
 數據控制語言:DCL: grant; revoke.
  
 2.2 單行函數與多行函數
  
 單行函數:指一行數據輸入,返回一個值得函數。所以查詢一個表時,對選擇的每一行數據都會返回一個結果。
  
  SQL>select empno,lower(ename) from emp; 
  
 多行函數:指多行數據輸入,返回一個值得函數。所以對表的群組進行操作,並且每組返回一個結果。(典型的是聚合函數)
  
  SQL>select sum(sal) from emp; 
  
 2.3 單行函數的幾種類型
  
 2.3.1 字元型函數
  
 lower('SQL Course')----->sql course 返回小寫
  
 upper('sql course')----->SQL COURSE 返回大學
  
 initcap('SQL course')-----> Sql Course 每個單字返回首字母大寫
  
 concat('good','string')---->good string 拼接 只能拼接2個字元串
  
 substr('String',1,3)---->Str 從第1位開始截取3位數,
  
 演變:只有兩個參數的
  
 substr('String',3) 正數第三位起始,得到後面所有字元
  
 substr('String',-2) 倒數第二位,起始,得到最後所有字元
  
 instr('t#i#m#r#a#n#','#') --->找第一個#字元在那個絕對位置,得到的數值
  
 Instr參數經常作為substr的第二個參數值
  
 演變:Instr參數可有四個之多
  
 如select instr('aunfukk','u',-1,1) from al; 倒數第一個u是哪個位置,結果返回5
  
 length('String')---->6 長度,得到的是數值
  
 length參數又經常作為substr的第三個參數
  
 lpad('first',10,'#39;)左填充
  
 rpad(676768,10,'*')右填充
  
 replace('JACK and JUE','J','BL')---->BLACK and BLUE
  
 trim('m' from 'mmtimranm')---->timran 兩頭截,這里的『m』是截取集,僅能有一個字元
  
 trim( ' timran ')---->timran 作用是兩頭去空字元
  
 處理字元串時,利用字元型函數的嵌套組合是非常有效的:
  
  create table customers(cust_name varchar2(20)); 
  
  insert into customers values('Lex De Hann'); 
  
  insert into customers values('Renske Ladwig'); 
  
  insert into customers values('Jose Manuel Urman'); 
  
  insert into customers values('Joson Malin'); 
  
  select * from customers; 
  
  CUST_NAME 
  
  -------------------- 
  
  Lex De Hann 
  
  Renske Ladwig 
  
  Jose Manuel Urman 
  
  Joson Malin 
  
 一共四條記錄,客戶有兩個名的,也有三個名的,現在想列出僅有三個名的客戶,且第一個名字用*號略去
  
 答案之一:
  
  SELECT LPAD(SUBSTR(cust_name,INSTR(cust_name,' ')),LENGTH(cust_name),'*') "CUST NAME" 
  
  FROM customers 
  
  WHERE INSTR(cust_name,' ',1,2)>0; 
  
 CUST NAME
  
 ------------------------------------------------------------------------------------------------------------------------
  
 *** De Hann
  
 **** Manuel Urman
  
 分析:
  
 先用INSTR(cust_name,' ')找出第一個空格的位置,
  
 然後,SUBSTR(cust_name,INSTR(cust_name,' '))從第一個空格開始往後截取字元串到末尾,結果是第一個空格以後所有的字元,
  
 最後,LPAD(SUBSTR(cust_name,INSTR(cust_name,' ')),LENGTH(cust_name),'*')用LPAD左填充到cust_name原來的長度,不足的部分用*填充,也就是將第一個空格前的位置,用*填充。
  
 where後過濾是否有三個名字,INSTR(cust_name, ' ',1,2)從第一個位置,從左往右,查找第二次出現的空格,如果返回非0值,則說明有第二個空格,則有第三個名字。
  
 2.3.2 數值型函數
  
 round 對指定的值做四捨五入,round(p,s) s為正數時,表示小數點後要保留的位數,s也可以為負數,但意義不大。
  
 round:按指定精度對十進制數四捨五入,如:round(45.923, 1),結果,45.9
  
 round(45.923, 0),結果,46
  
 round(45.923, -1),結果,50
  
 trunc 對指定的值取整 trunc(p,s)
  
 trunc:按指定精度截斷十進制數,如:trunc(45.923, 1),結果,45.9
  
 trunc(45.923),結果,45
  
 trunc(45.923, -1),結果, 40
  
 mod 返回除法後的余數
  
 SQL> select mod(100,12) from al;
  
 2.3.3 日期型函數
  
 因為日期在oracle里是以數字形式存儲的,所以可對它進行加減運算,計算是以天為單位。
  
 預設格式:DD-MON-RR.
  
 可以表示日期范圍:(公元前)4712 至(公元)9999
  
 時間格式
  
  SQL> select to_date('2003-11-04 00:00:00' ,'YYYY-MM-DD HH24:MI:SS') FROM al; 
  
  SQL> select sysdate+2 from al; 當前時間+2day 
  
  SQL> select sysdate+2/24 from al; 當前時間+2hour 
  
  SQL> select sysdate+2/1440 from al; 當前時間+2分鍾 
  
  SQL> select (sysdate-hiredate)/7 week from emp; 兩個date類型差,結果是以天為整數位的實數。 
  
 ①MONTHS_BETWEEN 計算兩個日期之間的月數
  
  SQL>select months_between('1994-04-01','1992-04-01') mm from al; 
  
 查找emp表中參加工作時間>30年的員工
  
  SQL>select * from emp where months_between(sysdate,hiredate)/12>32; 
  
 很容易認為單行函數返回的數據類型與函數類型一致,對於數值函數類型而言的確如此,但字元和日期函數可以返回任何數據類型的值。比如instr函數是字元型的,months_between函數是日期型的,但它們返回的都是數值。
  
 ②ADD_MONTHS 給日期增加月份
  
  SQL>select hiredate,add_months(hiredate,4) from emp; 
  
 ③LAST_DAY 日期當前月份的最後一天
  
  SQL>select hiredate,last_day(hiredate) from emp; 
  
 ④NEXT_DAY NEXT_DAY的第2個參數可以是數字1-7,分別表示周日--周六(考點)
  
 比如要取下一個星期六,則應該是:
  
 SQL>select next_day(sysdate,7) FROM DUAL;
  
 ⑤ROUND(p,s),TRUNC(p,s)在日期中的應用,如何舍入要看具體情況,s是MONTH按30天計,應該是15舍16入,s是YEAR則按6舍7入計算。
  
  SQL>SELECT empno, hiredate,round(hiredate,'MONTH') AS round,trunc(hiredate,'MONTH') AS trunc FROM emp; 
  
  SQL>SELECT empno, hiredate, round(hiredate,'YEAR') AS round,trunc(hiredate,'YEAR') AS trunc FROM emp; 
  
 2.3.4 幾個有用的函數和表達式
  
 1)DECODE函數和CASE表達式:
  
 實現sql語句中的條件判斷語句,具有類似高級語言中的if-then語句的功能。
  
 decode函數源自oracle, case表達式源自sql標准,實現功能類似,decode語法更簡單些。
  
 decode函數用法:
  
  SQL> SELECT job, sal, 
  
  decode(job, 'ANALYST', SAL*1.1, 'CLERK', SAL*1.15,'MANAGER', SAL*1.20, SAL) SALARY FROM emp 
  
 decode函數的另幾種常見用法:
  
  SQL>select ename,job,decode(job,'MANAGER','中層幹部') leader from emp; 
  
  SQL> select ename,job,comm,decode (comm,null,'nonsale','sale') saleman from emp; 
  
 註:單一列處理,共四個參數:含義是:comm 如果為null就取'nonsale,否則取'sale'
  
  SQL> select sal,sign(sal-1500) from emp; 
  
  SQL> select ename,decode (sign(sal-1500), 1, 'NORMAL','LOW') as "LEV" from emp; 
  
 註:sign()函數根據某個值是0、正數還是負數,分別返回0、1、-1,含義是:工資大於1500,返回1,真取'NORMAL',假取'LOW'
  
 CASE表達式第一種用法:
  
  SQL> SELECT job, sal, 
  
  case job when 'ANALYST' then SAL*1.10 
  
  when 'CLERK' then SAL*1.15 
  
  when 'MANAGER' then SAL*1.20 
  
  else sal end SALARY 
  
  FROM emp 
  
 CASE表達式第二種用法:
  
  SQL> SELECT job, sal, case 
  
  when job='ANALYST' then SAL*1.1 
  
  when job='CLERK' then SAL*1.15 
  
  when job='MANAGER' then SAL*1.20 
  
  else sal end SALARY 
  
  FROM emp 
  
 以上三種寫法結果都是一樣的
  
 CASE第二種語法比第一種語法增加了搜索功能。形式上第一種when後跟定值,而第二種還可以使用表達式和比較符。
  
 看一個例子
  
  SQL> SELECT ename,sal,case 
  
  when sal>=3000 then '高級' 
  
  when sal>=2000 then '中級' 
  
  else '低級' end 級別 
  
  FROM emp 
  
 再看一個例子:使用了復雜的表達式
  
  SQL> SELECT AVG(CASE 
  
  WHEN sal BETWEEN 500 AND 1000 AND JOB='CLERK' 
  
  THEN sal ELSE null END) "CLERK_SAL" 
  
  from emp; 
  
 比較;
  
  SQL> select avg(sal) from emp where job='CLERK'; 
  
 2)DISTINCT(去重)限定詞的用法:
  
 distinct貌似多行函數,嚴格來說它不是函數而是select子句中的一個選項。
  
  SQL> select distinct job from emp; 消除錶行重復值。 
  
  SQL> select distinct job,deptno from emp; 重復值是後面的欄位組合起來考慮的 
  
  SQL> select distinct * from emp; 消除重復記錄 
  
 3)sys_context 獲取環境上下文的函數(多用於應用環境)
  
 scott遠程登錄
  
  SQL>select SYS_CONTEXT('USERENV','IP_ADDRESS') from al; 
  
 --------------------------------------------------------------------------------
  
 192.168.0.136
  
  SQL> select sys_context('userenv','sid') from al; 
  
 SYS_CONTEXT('USERENV','SID')
  
 --------------------------------------------------------------------------------
  
 129
  
  SQL> select sys_context('userenv','terminal') from al; 
  
 SYS_CONTEXT('USERENV','TERMINAL')
  
 --------------------------------------------------------------------------------
  
 TIMRAN-222C75E5
  
 the end !!!
  
 @jackman 共築美好!
❸ SQL查詢常用函數
groud by 分組查詢
  
 order by 排序查詢
  
 比較運算符
  
 邏輯運算符
  
 is null 判斷是否為空
  
 between num1 and num2 返回在num1和num2之間的值
  
 in 返回在某個確定區間的值
  
 like 模糊查詢
❹ sql 多表組函數查詢
select a.id , sum(wt1) , sum(wt2)
from a , b
where a.id = b.id
and a.date_code>='20101101' 
and a.date_code<='20101105'
and b.date_code>='20101105' 
and b.date_code<='20101110'
group by a.id;
❺ SQL多條件查詢字元串
我關於sql函數方面的搜集資料。看了對函數你可能就會了解一些了。。。。首先樓主 寫的那條語句 絕對不能執行。。應該這樣寫
USE 資料庫名
GO
SELECT DISTINCT cuser 
FROM cat
WHERE time ='' or time >'' or time <''
ORDER BY  time 
DESC
GO
你如果想把某列,或者某欄位 的數據 由 亂七八糟的轉換成大寫的  用這個 函數 UPPER
用法   UPPER (某欄位)
關於sql函數詳解 如下:
SQL函數,詳細描述如下: Avg函數 Avg函數,計算查詢中某一特定欄位資料的算術平均值。 語法為Avg(運算式)。運算式,可為欄位名稱、運算式、或一個函數,此函數可 以是一個內部或使用者定義的,但不能為其它的SQL函數。 Avg函數在計算時,不包含任何值為 Null 的資料。 Count函數 Count函數,計算符合查詢條件的記錄條數。 語法為Count (運算式)。運算式,可為欄位名稱、*、多個欄位名稱、運算式、 或一個函數,此函數可以是一個內部或使用者定義的,但不能為其它的SQL函數。 Count 函數於計算時,不包含任何值為 Null 的資料。 但是,Count(*) 則計算所有符合查詢條件的記錄條數,包含那些Null的資料。 如果Count(欄位名稱) 的欄位名稱為多個欄位,將欄位名稱之間使用 & 分隔。 多個欄位當中,至少有一個欄位的值不為Null的情況下,Count函數才會計算為一條 記錄。如果多個欄位都為Null,則不算是一條記錄。譬如: SELECT Count(價格 & 代號) From 產品 First/Last函數 First函數、Last函數,傳回指定欄位之中符合查詢條件的第一條、最末條記錄 的資料。 語法為First(運算式) 和 Last(運算式)。運算式,可為欄位名稱、運算式、或 一個函數,此函數可以是一個內部或使用者定義的,但不能為其它的SQL函數。 Min/Max函數 Min函數、Max函數,傳回指定欄位之中符合查詢條件的最小值、最大值。 語法為Min(運算式) 和 Max(運算式)。運算式,可為欄位名稱、運算式、或一個 函數,此函數可以是一個內部或使用者定義的,但不能為其它的SQL函數。 StDev函數 StDev函數,計算指定欄位之中符合查詢條件的標准差。 語法為StDev(運算式)。運算式,可為欄位名稱、運算式、或一個函數,此函數 可以是一個內部或使用者定義的,但不能為其它的SQL函數。 如果符合查詢條件的記錄為兩個以下時,StDev函數將傳回一個Null 值,該表示 不能計算標准差。 Sum函數 Sum函數,計算指定欄位之中符合查詢條件的資料總和。 語法為Sum(運算式)。運算式,可為欄位名稱、運算式、或一個函數,此函數可 以是一個內部或使用者定義的,但不能為其它的SQL函數。 Sum函數可使用兩個欄位資料運算式,譬如計算產品的單價及數量欄位的合計: SELECT Sum(單價 * 數量) FROM 產品 Var函數 Var函數,計算指定欄位之中符合查詢條件的變異數估計值。 語法為Var(運算式)。運算式,可為欄位名稱、運算式、或一個函數,此函數可 以是一個內部或使用者定義的,但不能為其它的SQL函數。 如果符合查詢條件的記錄為兩個以下時,Var函數將傳回一個Null 值,該表示不 能計算變異數。
❻ SQL必知必會(二)函數、子查詢
#文本處理函數 
  
 UPPER()      --大寫 
  
 LOWER()     --小寫 
  
 SOUNDEX()    --讀音類似 
  
 LENGTH()    --字元串長度 
#日期和時間處理函數 
  
 SELECT order_code
  
 FROM order_table
  
 WHERE DATEPART(yy,order_date)=2012
#to_char()函數提取日期成分,MySQL可用year()函數提取年份 
  
 SELECT order_num
  
 FROM order_table
  
 WHERE to_number(to_char(order_date,'YYYY'))=2012;     --to_char提取日期成分to_number轉化為數值 
  
 SELECT order_num
  
 FROM order_table
  
 WHERE order_date BETWEEN to_date('01-01-2012') AND to_date('12-31--2012');    --字元串轉日期 
#數值處理函數 
  
 ABS()    --絕對值 
  
 COS()    --餘弦 
  
 EXP()    --指數值 
  
 PI()    --圓周率 
  
 SIN()    --正弦 
  
 SQRT()    --平方根 
  
 TAN()    --正切 
#平均數AVG() 
  
 SELECT AVG(a) AS avg_a
  
 FROM tableA
  
 WHERE a='DLL01';
#計數 
  
 SELECT COUNT(*)  AS num_cust              --對所有行計數,不管是否NULL值
  
 FROM tableA;
  
 SELECT COUNT(a) AS num_a          --指定了列名,會忽略NULL值
  
 FROM tableA;
#最值 
  
 MAX()和MIN(),忽略NULL值
#總值SUM(),忽略NULL值 
  
 SELECT SUM(price*quantity) AS total_price
  
 FROM tableA
  
 WHERE order_code=20008
#以上聚集函數只包含不同值 
  
 SELECT AVG(DISTINCT order_price) AS avg_price
  
 FROM tableA
  
 WHERE id='DLL01';
兩個子句:GROUP BY 和 HAVING
  
  #GROUP BY創建分組HAVING過濾分組 
  
 SELECT vend_id, COUNT(*) AS num_prods
  
 FROM tableA
  
 WHERE price>=4
  
 GROUP BY vend_id
  
 HAVING COUNT(*)>=2;   
  
 ORDER BY price     --GROUP BY在WHERE之後在ORDER   BY之前 
SELECT
  
 FROM
  
 WHERE
  
 GROUP BY
  
 HAVING
  
 ORDER BY
#子查詢順序為從內而外 
  
 SELECT order_num 
  
 FROM tableA
  
 WHERE id='DLL01';
  
  (輸出20007和20008) 
  
 SELECT id
  
 FROM tableB
  
 WHERE order_num IN(20007,20008);
  
  #合並為子查詢。只能查詢單個列 
  
 SELECT id
  
 FROM tableB
  
 WHERE order_num IN (SELECT order_num FROM tableA WHERE id='DLL01')
SELECT  cust_name,
  
                 cust_state
  
                 (SELECT COUNT(*) 
  
                  FROM Orders
  
                 WHERE Orders.cust_id=Customers.cust_id) AS orders
  
 FROM Customers
  
 ORDER BY cust_name;
  
  #Orders.cust_id=Customers.cust_id完全限定列名,在兩張表中名字相同列拿出來比較,防止歧義
❼ SQL 用多個聚合函數匯總查詢結果
SELECT DISTINCT
'計劃號'=A.BAT_NO,'訂單貨品名稱'=C.NAME,
'種類總數'=COUNT(DISTINCT A.MO_NO),
'件數總數'=SUM(A.QTY),
'工時總數'=SUM(B.USED_TIME),
'完成件數'=SUM(DISTINCT A.QTY) ,
'完成種數'=COUNT(DISTINCT A.MO_NO) ,
'完成工時'=SUM(DISTINCT B.USED_TIME) 
FROM MF_MO A LEFT JOIN MF_TZ B ON A.MO_NO=B.MO_NO
  LEFT JOIN PRDT C ON A.MRP_NO_SO=C.PRD_NO
WHERE BIL_MAK='T' and A.CLOSE_ID='T' and B.CLOSE_ID='T'
GROUP BY A.BAT_NO,C.NAME
ORDER BY A.BAT_NO,C.NAME
看這樣是你想要的結果嗎?
❽ sql語句 多行函數查詢
想法1
先查詢出以每個部門為單位,有多少人工資低於3000 以及 低於3000的人數 順便把部門ID也帶出來,以備後用
select sum(salary),count(id),dep_id from yuangong where salary<3000 group by dep_id
然後,將上面查詢出來的結果進行加工,得出最後結論
select 
 bumen.dep_name,
 a.renshu,
 a.money/a.renshu
from
 bumen,
 (select sum(salary) as money,count(id) as renshu,dep_id from yuangong where salary<3000 group by dep_id) a
where 
 a.dep_id = bumen.id
 
想法呢是這個想法,
想法2
先把所有的部門,工資少許8000 的數據找出來
select 
 bumen.dep_name,
 yuangong.*
from
 bumen,
 yuangong
where 
 yuangong.salary<3000 and
 yuangong.dep_id = bumen.id
 
然後對上面的數據進行分類加工,
分類的依據是部門id 或者部門名字(group by bumen.dep_name)
select 
  bumen.dep_name,
  count(yuangong.id),
  sum(yuangong.salary)/count(yuangong.id)
from
 bumen,
 yuangong
where 
 yuangong.salary<3000 and
 yuangong.dep_id = bumen.id
group by bumen.dep_name
