SQL常用函数(终)
3、直接调用——由程序直接实现。 • 在动态SQL发展以前内嵌SQL在编程中应用最 为流行。这种方法在今天也仍然在使用。由于 静态的SQL——它的意思就是SQL语句已经被 编译在了应用程序之中,不能在运行的过程中 改变。这与编译程序同解释程序的区别类似, 也就是说这种类型的SQL速度很快,但是灵活 性很差,这在今天的商业应用领域是不适宜的。 动态SQL这里就不多说了。
SELECT name as na FROM dual ORDER BY na DESC;
4) 对查询结果进行去重 DISTINCT SELECT DISTINCT(dept) From dual; 5) 对查询结果进行分组GROUP BY select name,sex,dept from dual group by dept; 6) 对分组结果进行条件筛选HAVING select name,sex,dept,COUNT(1) from dual group by dept HAVING COUNT(1)>2;
• ANSI-92标准将SQL语言标准扩展为一种国际化的 标准,它定义了SQL的三种编译级别:登录调用、 内嵌子句和完全编译。主要的新特性如下 1、 联接到数据库 2、 移动游标 3、 动态SQL 4、 外连接 • 关于SQL编程方面的知识,感兴趣的同学可以在 网上查找资料自学,今天我们讲课的内容是讲述 SQL最常用的功能——查询。
• 3、函数 • 3.1汇总函数 *** COUNT() 函数返回指定列的数目(null不计入) select count(1) from dual; *** SUM() 返回一列范围内所有非空值的总和 select sum(type_code) from dual; *** MAX() 用于返回最大值 select max(salary) from dual; * ** AVG() 平均值 select avg(salary) from dual;
*** UPPER() SELECT * FROM emp WHERE ename=UPPER('smith'); *** LOWER() SELECT * FROM emp WHERE ename=LOWER('SMITH'); *** INITCAP() SELECT INITCAP(user_name) FROM sa_user; *** CONCAT() SELECT CONCAT('hello','world')FROM dual;
7) 抽取结果的不重复合集UNION,这里要注意union 内部的select查询语句必须拥有相同数量的列,且 列也必须拥有相似的数据类型,同时,每条select 语句中的列的顺序必须相同。 select name, sex from dual union select name, sex from dual_1; 如果需要查询重复合集可以使用union all select name, sex from dual union all select name, sex from dual_1;
• 对于SQL大家可能还不明白S即Structured 结构, L即Language 语言,这是显而易见的,但是Q 的意思容易让人误解,Q的意思当然是Query 查询。如果你直译的话可是这只限于你对数据 库提问,但是SQL能干的不只是查询,通过它 你可以建立一个库添加和删除数据,对数据作 联合,当数据库改变时触发动作并把你的查询 存储在程序或数据库中。
• 3.2 数学函数 *** MOD() 求余 select mod(10,7),mod(10,5) from dual; 返回:3,0 *** ROUND() 取整 select round(123.456) from dual; 返回:123 *** TRUNC() select trunc(123.456) from dual; 返回:123 trunc(SYSDATE, 'mm') TRUNC()与ROUND()不同的是,不会保留任 何小数,而且小数点也不会执行四舍五入的进位.
*如果不希望显示前导0,可以使用fm 去掉这些前导 0; SELECT empno,ename,TO_CHAR(hiredate,'fmyyyy-mmdd')FROM emp; *TO_CHAR 函数除了可以使用在日期上,也可以 使用在数字上 SELECT empno,ename,sTO_CHAR(sal,'99,999')FROM emp; 此时可以使用TO_CHAR()进行数字格式化
• 3.6 通用函数 *** NVL() SELECT empno, ename, (sal+NVL(comm,0))*12 FROM emp; *** DECODE() DECODE(col(expression),条件1,result 1, 条件 2,result,2); 范例:SELECT DECODE(1,1,"内容是1",2,"内容是2"); SELECT empno 雇员编号,ename 雇员姓名, DECODE(job,'CLERK','业务员','SALEMAN','销售人员 ','MANAGER','经理') FROM emp;
• 1.2 对象名和列名不区分大小写,它们既可以使用大 写格式,也可以使用小写格式,或者混用大小写格式。 select name,sex,dept from dual; select NAME,sex,dept from DUAL; • 1.3 字符值和日期值区分大小写。当在SQL语句中引 用字符值和日期值时,必须要给出正确的大小写数据, 否则不能返回正确信息。 select name,sex,dept from dual where name='JONE'; select name,sex,dept from dual where name='jone';
• 4、子句 • 4.1 WHERE 4.1.1先说空值NULL 在数据库领域NULL的意义就是在一个字段之 中没有数据,这与在该字段中数据为零或为空格 不是同一个概念,为零或为空是一种特殊的数值, 而NULL则表示在这个字段之中什么也没有, NULL不支持加减乘除比大小比相等,比的结果只 能是空。如何查询某一列的数据为空的呢? SELECT * FROM emp WHERE comm IS NOT NULL;
*** LAST_DAY() select * From epc_xj.s_95598_wkst t where t.handle_time = last_day(SYSDATE) 2; *** NEXT_DAY SELECT NEXT_DAY(SYSDATE,'星期一 ')FROM CHAR() SELECT b.receive_time dt, to_char(b.receive_time, 'yyyy-mm-dd') d, to_char(b.receive_time, 'hh24:mi:ss') t, to_char(b.receive_time, ‘hh24’) h FROM sa_busi_proc b WHERE to_char(b.receive_time, 'hh24:mi:ss') BETWEEN '10:00:00' AND '19:00:00';
• 3.4日期时间函数、 *** ADD_MONTH() SELECT add_months(trunc(SYSDATE, 'mm'), -1), trunc(SYSDATE, 'mm') - 1, trunc(SYSDATE, 'mm'), add_months(trunc(SYSDATE, 'mm') - 1, 1), add_months(trunc(SYSDATE, 'mm'), -12), add_months(trunc(SYSDATE, 'mm'), -11) - 1 FROM dual;
• 3.3字符函数 *** SUBSTR() Substr(name,1,3)
SUBSTR()函数中有一点要提醒大家注意, 和面试有关: Oracle 中的SUBSTR()函数的截取点是从0 还是从1 开始?
*** LENGTH() Length(char) *** REPLACE() select t.agentid 工号, t.agentname 姓名, replace(replace(t.state, 'kx', '空闲'), 'th','通话') 坐席状态 from agentstate t where t.state != 'qc' and t.localid = '65101';
二、SQL在编程中的应用
• SQL的最初标准是ANSI-1986 而在ANSI-1989 中定义的SQL在应用程序中的三种接口类型: • 1、模块语句——在程序中使用过程 该过程可 以通过主调参数向主调函数返回值。 • 2、内嵌SQL——可以在编写程序的过程中内嵌 SQL语句,该方式在经常需要对SQL语句进行 预编译处理时所需要,在Pascal,FORTRAN, COBOL,PL/1 中均定义了这样的子句。
• 2、表达式、条件式与运算 1) 最简单的查询:查询表中的所有行与列
SELECT * FROM dual;
2) 查询指定的列,给列赋予新的别名 AS SELECT name as na FROM dual; 3) 对查询结果进行排序 ORDER BY ASC DESC
SELECT name as na FROM dual ORDER BY na ASC;