❶ 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
