2. SQL函数:对数据的进一步处理

Posted 江湖@小小白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2. SQL函数:对数据的进一步处理相关的知识,希望对你有一定的参考价值。

函数:对数据的进一步处理

1. 汇总函数

这是一组函数,它们返回的数值是基于一列的(因为你不会对单个的记录求它的平均数)

1. COUNT
	该函数将返回满足 where 条件子句中记录的个数。
	select count(*) fromwhere1 < 20;
	为了是这段代码更易读,可以使用别名:
	select count(*)  num_列1_20 
	fromwhere1 < 20;
	
	注:如果你使用的 count 时无 where 子句,
	那么它将返回表中的所有记录的个数。
	 
2.SUM
	SUM 就如同它的本意一样,它返回某一列的所有数值的和。
	select sum(1) total_列1,
	sum(2) total_列2 from;
类似地,如果想找一下所有点数在300(包括300)以上的人员:
	select sum(1) total_列1 , sum(2) total_列2 
	fromwhere hits >= 300;
	
	select sum(1)/sum(2) 别名 from;
	
	sum 只能处理数字。
	如果它的处理目标不是数字,报错。
	
3. AVG
	AVG 可以返回某一列的平均数。
	select AVG(1)/AVG(2) team_average from;
	与 SUM 函数相同,AVG 函数只能对数字进行计算。
    
4. MAX
	输出某一列中的最大值。
	select max(1) team_max from;
	select max(name) team_max from;
	MAX 可以返回最高的字符串,
	即 MAX 既可以处理数值,又可以处理字符。
	
5. MIN
	MIN 与 MAX 类似 它返回一列中的最小数值.
	select min(1) team_min from;
	select min(name) team_min from;
	返回名字在字母表中排在最前面的记录
	你可以同时使用 MAX 和 MIN 函数以获得数值的界限:
	select min(1) team_min,max(1) team_max 
	from;
	
6. VARIANCE
	VARIANCE(方差)
	select variance(1) from;
	VARIANCE 也是一个只应用于数值对象的函数.

7. STDDEV
	返回某一列的标准差。
	select stddev(1) from;
	同样的,对字符列应用该函数时会得到错误信息。
	
8. 这些统计函数也可以在一个语句中使用
	select 
	count(1),
	avg(1),
	min(1),
	max(),
	stddev(1),
	variance(1),
	sum(1) 
	from;

2. 日期与时间函数

演示表 project :数据类型使用日期型(字段task,startdate,enddate)

1. ADD_MONTHS:该函数的功能是将给定的日期增加一个月。
	select task,
	startdate,
	enddate original_end, 
	add_months(enddate,2) 
	from project;

2. LAST_DAY
	LAST_DAY 可以返回指定月份的最后一天。
	select enddate,LAST_DAY(enddate) 
	from project;
	
	给出的日期是在闰年的最后一天:
	SELECT DISTINCT 
	LAST_DAY('1-FEB-95') NON_LEAP,LAST_DAY('1-FEB-96') LEAP 
	FROM PROJECT;
	
3. MONTHS_BETWEEN
	给定的两个日期中有多少个月。
	select 
	task,startdate,enddate,
	months _between(Startdate,enddate) duration 
	from project;
	
	months _between(Startdate,enddate):
	开始时间在结束时间之前,结果为负值。
	MONTHS_BETWEEN对于你所给出的月份的次序是敏感的,
	月份值为负数可能并不是一件坏事.
	例如:
	你可以利用负值来判断某一日期是否在另一个日期之前下,
	将会显示所有在 1995519 日以前开始的比赛。
	select * from 
	project 
	where 
	MONTHS_BETWEEN('19 MAY 95',startdate) > 0;

4. NEW_TIME
	调整时间到指定的时区。
	select enddate edt,new_time(enddate,'EDT','PDT') 
	from project;
	
5. NEXT_DAY
	NEXT_DAY:将返回与指定日期在同一个星期或之后一个星期内的,
	你所要求的星期天数的确切日期,
	如果你想知道你所指定的日期的星期五是几号?
	可以这样做:
	SELECT STARTDATE NEXT_DAY(STARTDATE,'FRIDAY')
	FROM
	PROJECT;
	输出的结果告诉了你距你所指定的日期最近的星期五的日期.

6. SYSDATE
	SYSDATE 将返回系统的日期和时间.
	SELECT DISTINCT SYSDATE FROM PROJECT;
	 
	 如果你想知道在今天你都已经启动了哪些项目( project 表)的话,
	 你可以输入:
	 SELECT * FROM PROJECT WHERE STARTDATE SYSDATE;

3. 数学函数

1. ABS
	ABS 函数返回给定数字的绝对值。
	SELECT ABS(A) ABSOLUTE_VALUE FROM NUMBERS;

2. CEIL 和 FLOOR
	CEIL 返回与给定参数相等或比给定参数在的最小整数,
	FLOOR 则正好相反,它返回与给定参数相等或比给定参数小的最大整数.
	SELECT B,CEIL(B) CEILING FROM NUMBERS;
	SELECT A,FLOOR(A) FLOOR FROM NUMBERS;
	
	
3. COS、COSH、IN、SINH、TAN、TANH
	COS、SIN、TAN 函数可以返回给定参数的三角函数值 
	默认的参数认定为弧度制。
	SELECT A COS(A) FROM NUMBERS;
	
	
4. EXP
	EXP 将会返回以给定的参数为指数,以 e 为底数的幂值。
	select A, EXP(A) from NUMBERS;
	
5. LN and LOG
	这是两个对数函数,其中LN返回给定参数的自然对数。
	SELECT A, LN(A) FROM NUMBERS;
	SELECT A, LN(ABS(A)) FROM NUMBERS;
	
	注意:你可以将 ABS 函数嵌入到 LN 函数中使用 
	第二个对数函数需要两个参数,其中第二个参数为底数.10 为底数的B列的对数值。
    select B, log(B,10) from NUMBERS;
    
6. MOD(取余)
 	查询就返回了 A 与 B 相除后的余数:
 	SELECT A, B,MOD(A,B) FROM NUMBERS;
 	
7. POWER
	该函数可以返回某一个数对另一个数的幂,在使用幂函数时,
	第一个参数为底数,第二个指数。
 	SELECT A,B,POWER(A,B) FROM NUMBERS;
 	你可能会认为它不允许第一个参数为负数,但这个印象是错误的,
 	因为像 -4 这样的数是可以做为底数的,
 	可是,如果第一个参数为负数的话 那么第二个参数就必须是整数,
 	负数是不能开方的,
 	对于这个问题可以使用 CEIL 或 FLOOR 函数.
	SELECT A,CEIL(B), POWER(A,CEIL(B)) FROM NUMBERS;

8. SIGN
	如果参数的值为负数,那么,SIGN 返回 -1;
	如果参数的值为正数,那么 SIGN 返回 1 ;
	如果参数为零,那么 SIGN 也返回零.
	
9. SQRT
	该函数返回参数的平方根,由于负数是不能开平方的,
	所以我们不能将该函数应用于负数.
	SELECT A, SQRT(A) FROM NUMBERS;
	可以使用绝对值(ABS)解除这一限制
	SELECT ABS(A), SQRT(ABS(A)) FROM NUMBERS;
	

4. 字符函数

1. CHR
	该函数返回与所给数值参数等当的字符,
	返回的字符取决于数据库所依赖的字符集,
	例如示例的数据库采用了 ASCLL 字符集.
	示例数据库的代码列的内容为数字.
	SELECT CODE,CHR(CODE) FROM CHARACTERS;

2. CONCAT 
	将两个字符串连接起来。
	SELECT CONCAT(FIRSTNAME,LASTNAME)
    "FIRST AND LAST NAMES" 
	FROM CHARACTERS;
	
	注:当用多个词来做为别名时需对它们使用引号,
	请检查你的解释器,
	看看它是否支持别名.
	需要注意的是尽管在看起来输出似乎是两列,
	但实际上它仍是一列,
	这是因为你所连接的Firstname字段的宽度为 15,
	函数取得了该列中的所有数据,
	包括其中用以补足宽度的空格.
	
3. INITCAP
	该函数将参数的第一个字母变为大写,此外其它的字母则转换成小写。
	SELECT FIRSTNAME BEFORE,INITCAP(FIRSTNAME) AFTER
	FROM CHARACTERS;


4. LOWER 和 UPPER
	LOWER:将参数转换为全部小写字母而 UPPER 则把参数全部转换成大写字母.
	SELECT FIRSTNAME, UPPER(FIRSTNAME),LOWER(FIRSTNAME)
	FROM CHARACTERS;


5. LPAD 与 RPAD
	这两个函数最少需要两个参数,最多需要三个参数,
	每一个参数是需要处理的字符串,
	第二个参数是需要将字符串扩充的宽度,
	第三个参数表示加宽部分用什么字符来做填补,
	第三个参数的默认值为空格,
	但也可以是单个的字符或字符串.
	
	
	向字段中加入了五个字符 该字段的定义宽度为 15:
	SELECT LASTNAME,LPAD (LASTNAME,20, '*')
    FROM CHARACTERS;
    
    右填充:
     SELECT LASTNAME,RPAD(LASTNAME,20, '*')
     FROM CHARACTERS;
     
6. LTRIM 与 RTRIM     
     LTRIM 和 RTRIM至少需要一个参数,最多允许两个参数,
     第一个参数与 LPAD 和 RPAD类似,是一个字符串,
     第二个参数也是一个字符或字符串,默认则是空格,
     如果第二个参数不是空格的话,
     那么该函数将会像剪除空格那样剪除所指定的字符.
     
     SELECT LASTNAME, RTRIM(LASTNAME) FROM CHARACTERS;
     
     可以用下边的语句来确认字符中的空格已经被剪除了
	SELECT 
	LASTNAME,
	RPAD(RTRIM(LASTNAME),20,'*') 
	FROM CHARACTERS;
	
	SELECT 
	LASTNAME,
	LTRIM(LASTNAME,'C')
	FROM CHARACTERS;
	
	
7. REPLACE
    它的工作就如果它的名字所说的那样该,
    函数需要三个参数,
    第一个参数是需要搜索的字符串,
    第二个参数是搜索的内容,
    第三个参数则是需要替换成的字符串,
    如果第三个参数省略或者是 NULL,
    那么将只执行搜索操作而不会替换任何内容.
    
    
   SELECT LASTNAME,REPLACE(LASTNAME,'ST') A1 
   FROM CHARACTERS;
   
   如果存在第三个参数,
   那么,
   在每一个目标字符串中搜索到的内容,
   将会被由第三个参数所指定的字符串替换;
	 SELECT 
	 LASTNAME,
	 REPLACE(LASTNAME,'ST','**') A1
	 FROM CHARACTERS;
	 
   如果没有第二个参数,
   那么只有将源字符串返回而不会执行任何操作.
    SELECT 
    LASTNAME,
    REPLACE(LASTNAME,NULL) A1
	FROM CHARACTERS;
	
8. SUBSTR
	这个函数有三个参数,允许你将目标字符串的一部分输出。
	第一个参数:为目标字符串,
	第二个字符:是将要输出的子串的起点,
	第三个参数:是将要输出的子串的长度.
	
	SELECT 
	FIRSTNAME,
	SUBSTR(FIRSTNAME,2,3)
	FROM CHARACTERS;
	
	注:
	如果啊第二个参数为负数,
	那么,
	将会从原字符串的尾部开始,
	向前定位至负数的绝对值的位置.
	
	 SELECT 
	 FIRSTNAME,
	 SUBSTR(FIRSTNAME,-13,2)
	 FROM CHARACTERS;
	 
	 注:
	 因为FIRSTNAME字段的宽度为15,
	 这也就是为什么参数为-13,
	 会从第三个开始的原因,
	 因为从 15 算起向前算,13 个字符正好是第 3 个字符,
	 如果没有第三个参数,
	 将会输出字符串余下的部分.
	 
	 SELECT 
	 SUBSTR(SSN,1,3) ||'-'||
	 SUBSTR(SSN,4,2) ||'-'||
	 SUBSTR(SSN,6,4) SSN 
	 FROM SSN_TABLE;
	 
	 输出eg;300-54-1110
	 
	 
9. TRANSLATE
	这一函数有三个参数,
	目标字符串、原字符串和目的字符串,
	在目标字符串与原字符串中均出现的字符串,
	将会被替换成对应的目的字符串的字符。
	
	SELECT 
	FIRSTNAME, 
	TRANSLATE(FIRSTNAME,
	'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ',
	aaaaaaaaaAAAAAAAAACCCCCCCCC) 
 	FROM
	CHARACTERS;
	
	注:这个函数对大小写是敏感的。
	
10. INSTR
	如果需要知道一个字符串中满足特定的内容的位置,
	可以使用INSTR,
	它的第一个参数是目标字符串,
	第二个参数是匹配的内容,
	第三和第四个参数是数字,
	用以指定开始搜索的起点,
	以及指出第几个满足条件的将会被返回。
	
	eg:从字符串的第二个字符开始,
	搜索并返回第一个以O开头的字符的位置。
	
	SELECT 
	LASTNAME,
	INSTR(LASTNAME,'O',2,1) 
	FROM CHARACTERS;
	
	注:默认第三个与第四个参数的数值均为1,
	如果第三个数值是负数,
	那么,
	将会从后往前搜索。
	
	
11. LENGTH
	LENGTH 将返回指定字符串的长度。
	
	SELECT 
	FIRSTNAME,
	LENGTH(RTRIM(FIRSTNAME))
  	FROM CHARACTERS;
  	
  	注意:这里使用了函数 RTRIM,
    否则 LENGTH将全部返回 15.
	

5. 转换函数

转换函数有三个:
	可以使你方便的将数据
	从一种类型变换成另外一种类型。

1. TO_CHAR
	
	该函数的最初功能是将从一个数字转换为字符型,
	不同的解释器可能会使用它来转换其他数据类型
	例如,日期转换为字符型,
	或者拥有更多的参数。
	
	SELECT 
	TESTNUM,
	TO_CHAR(TESTNUM) 
	FROM CONVERT;
	
2. TO_NUMBER

	该函数与TO_CHAR函数相对应,
	显而易见,它是将一个字符串型数字转换为数值型。
	
	SELECT NAME,
    TESTNUM,
    TESTNUM*TO_NUMBER(NAME) 
    FROM CONVERT;

	注:如果函数没有将NAME转换为数值,
	将会返回一个错误信息。

6. 其他函数

1. GREATEST 与 LEAST
    这两个函数返回几个表达式中最大和最小的.

    SELECT 
    GREATEST('ALPHA','BRAVO','FOXTROT','DELTA')
    FROM CONVERT;

    注:GREATEST 将会返回字母表中最靠后的字符开头的字符串,
    虽然看起来似乎没有必要使用 FROM 子句,
    可是如果 FROM 子句没有的话,
    你将会收到一个错误信息。

    每一个SELECT语句都需要FROM子句,
    给定的行数为n,
    则结果返回三个。

    SELECT LEAST(3,546,58,42 100)
    FROM CONVERT;
    
2. USER
	该函数返回当前使用数据库的用户的名字。
	
	SELECT USER FROM CONVERT;
	

7. 总结

根据工作需要去学习函数;

回顾+练习。。。。

以上是关于2. SQL函数:对数据的进一步处理的主要内容,如果未能解决你的问题,请参考以下文章

8 使用数据处理函数

sql数据库截取字符串函数

(93) 函数式数据处理 (下) / 计算机程序的思维逻辑

计算机程序的思维逻辑 (93) - 函数式数据处理 (下)

JAVA SQL注入测试

SQL注入漏洞