1、ORACLE数据库教程,你可以不知道,但是绝对不能不懂,-毁人不倦语录,2007年5月,SQL基础知识篇,SQL-001,简介,SQL(Structured Query Language)结构化查询语言是IBM公司San Jose实验室为System R而设计的查询语言,后被国际标准化组织(ISO)批准作为关系数据库语言的国际标准。SQL目前遵循的是1992年标准,即SQL-92。各数据库厂家对SQL-92标准均有扩充,扩充部分不能完全保证数据库之间的兼容性。,我的热情会灼伤一些人,但我是无心的,-毁人不倦语录,简介,SQL可以分为: (基础篇只介绍前两种) DML:数据操作语言(Data M
2、anipulation Language): select, insert, update, delete, (其他:truncate) DDL:数据定义语言 (Data Definition Languages): create, drop , alter,(其他:rename) DCL数据控制语言:grant、revoke、set role 事务控制:commit、rollback、savepoint(其他:lock table、set constraint(s)、set transaction) 审计控制:audit、noaudit 系统控制:alter system 会话控制:alte
3、r session 其他语句:comment(添加注释)、explain plan、analyze、validate、call,如果我的话没有错,一定是你听错了,-毁人不倦语录,DDL数据定义语言,CREATE(建立)ALTER(修改)DROP(删除),无知者无畏,无畏者不一定无知,-毁人不倦语录,语言描述约定, :表示可选项 | :表示选择项 CREATE:粗体表示关键字或必输项 Table_name:斜体表示用户输入项 创建 :蓝色表示说明,如果1+12,我相信那说的是团队的力量,-毁人不倦语录,DDL数据定义语言,CREATE-创建用户 CREATE USER user_name IDE
4、NTIFIED BY password DEFAULT TABLESPACE tablespace_name TEMPORARY TABLESPACE tablespace_name; 创建user_name用户,密码为password,使用tablespace_name表空间,如果没有指定表空间,默认表空间为system表空间。Oracle10g有用户默认表空间设置。 建议在创建用户时一定要指名表空间。,先有鸡,还是先有蛋,这么重要的问题还是留给鸡去考证吧,-毁人不倦语录,DDL数据定义语言,CREATE-创建数据表 CREATE TABLE table_name( Column1 data
5、type defaultnot null primary key, , constraint key_name primary key(column_list) using index tablespace tablespace_name )tablespace tablespace_name;Datatype 是数据类型:varchar2(x), number(x,x), date, integer等。 Not null非空限制,如果不写表示可为空。 Primary key主键,可以紧跟在字段后,或在最后使用constraint。 未指名表空间,数据表建立在用户默认的表空间中。,笔只留下了痕
6、迹,人用笔留下了文化,-毁人不倦语录,DDL数据定义语言,CREATE-创建索引 CREATE UNIQUE INDEX index_name ON table_name(column_list)tablespace tablespace_name;在table_name表上按照column_list建立索引,索引名为index_name,索引保存在tablespace_name表空间中。 UNIQUE:唯一性索引。,-毁人不倦语录,你可以不听,但是我一定要说,DDL数据定义语言,ALTER-修改表 ALTER TABLE table_name RENAME TO new_table_name
7、; 将table_name表名修改为new_table_name。 ALTER TABLE table_name ADD(column1 datatype default not null,column2 datatype default not null, ); 在table_name表中增加column1,column2字段,追加到字段最后。 ALTER TABLE table_name MODIFY(column1 datatype default not null|nullable,column2 datatype default not null|nullable, 修改table_
8、name表字段属性,长度或精度不能小于原长度或精度。 ALTER TABLE table_name DROP COLUMN column_name; 删除table_name表中的column_name字段。 ALTER TABLE table_name RENAME COLUMN old_name TO new_name; 修改table_name表的old_name字段名为new_name。 ALTER TABLE table_name ADD CONSTRAINT pk_name PRIMARY KEY(column_list); 建立table_name表的主键,主键名pk_name,
9、主键字段column_list。 ALTER TABLE table_name DROP CONSTRAINT pk_name; 删除table_name表的pk_name主键。一个表只能有一个主键,-毁人不倦语录,不说了,再说就该吐了。补充一点:站着进,扶着出也许是侃爷的最高境界吧,DDL数据定义语言,DROP -删除 DROP TABLE table_name; 删除table_name表。 DROP INDEX index_name; 删除index_name索引。 删除主键(强制限制的一种),使用ALTER TABLE table_name DROP CONSTRAINT pk_nam
10、e;,-毁人不倦猜想,数据库和水库之间不可能没有区别,DML小结,从ALTER和CREATE及DROP语法数量再一次证明需求是易变的。 如果增加表字段,并要求字段的排列位置,可以使用: CREATE TABLE temp_table_name AS SELECT * FROM table_name; DROP TABLE table_name; CREATE TABLE table_name(column); INSERT INTO table_name VALUES(column_list) (SELECT column_list1 FROM temp_table_name); DROP T
11、ABLE table_name; 需要注意的是,删除表后,表中的索引也被删除,所以,在执行上述操作前要保留好表的索引脚本。 这里没有写DROP DATABASE的语法,如果大家想要尝试删除数据库的话,最好在专家的指导下进行!,人间本无对错,因为计算机才有了对与错,-毁人不倦语录,DDL数据操作语言,SELECT(查询)INSERT(插入)UPDATE(更新)DELETE(删除),如果老天能再给我一次机会,我一定做甲方,-毁人不倦语录,DDL数据操作语言,SELECT-查询SELECT ALL | DISTINCT ON ( expression , . ) * | expression AS
12、output_name , . INTO TEMPORARY | TEMP TABLE new_table FROM from_item , . WHERE condition GROUP BY expression , . HAVING condition , . UNION | INTERSECT | EXCEPT ALL select ORDER BY expression ASC | DESC | USING operator , . FOR UPDATE OF class_name , . LIMIT count | ALL OFFSET | , start 后续查询范例均以orac
13、le中的SCOTT/TIGER用户表为例,如果失眠了,就看看上面的语法吧,-毁人不倦语录,DDL数据操作语言,SCOTT/TIGER表介绍 DEPT部门定义表,DEPTNO是主键EMP职工表,EMPNO主键,DEPTNO外键关联DEPT其他表没有数据或没有关系,不在这里介绍,将复杂问题简单化是修养,将简单问题复杂化是艺术,综合起来叫艺术修养,-毁人不倦语录,DDL数据操作语言,SELECT-单表查询 查询表中所有字段和所有记录,select后跟* 表示所有字段 SELECT * FROM DEPT;查询指定字段,在select后跟查询的字段名列表,字段间用,隔开 SELECT DEPTNO,
14、DNAME FROM DEPT;条件查询,FROM后面使用WHERE,在WHERE中可以使用=, , ,=,=,BETWEEN,LIKE,IN,返回WHERE条件为true的数据 SELECT * FROM DEPT WHERE DEPTNO = 20; -返回部门编码为20的部门数据SELECT * FROM DEPT WHERE DEPTNO BETWEEN 20 AND 30; -返回部门编码在20到30之间的部门数据(包括20和30),同意的从门出去,反对的请走窗户,-毁人不倦语录,DDL数据操作语言,SELECT-单表查询SELECT * FROM DEPT WHERE DNAME
15、LIKE ACCOUNT%; -返回部门名称以ACCOUNT开始的部门数据SELECT * FROM DEPT WHERE DNAME LIKE %UNT%; -返回部门名称含UNT的部门数据,%全匹配符,?单匹配符SELECT * FROM DEPT WHERE DEPTNO IN (20, 30) AND (DNAME LIKE %UNT% OR DNAME = SALES); -返回部门编码等于20和30并且部门名称含UNT或等于SALES的部门数据,AND与,OR或,IN和(等同OR),知识可以拷贝,思想无法复制,-毁人不倦语录,DDL数据操作语言,SELECT-多表查询 在FROM中
16、列举表名,WHERE中写表关联 SELECT EMP.EMPNO, EMP.ENAME, EMP.JOB, DEPT.DEPTNO, DEPT.DNAME FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNOAND DEPT.DEPTNO = 20; -字段名前使用表名.指定表字段,在WHERE中先写表关联关系,从FROM的内侧(即左侧)向外侧写(即右侧),表关联写完后再写查询条件,不要把表管理和查询条件混在一起写,这虽然不是必须的,但却是规范推荐的。 SELECT E.EMPNO AS 职工编码, E.ENAME 姓名, E.JOB, D.DEPTNO,
17、 D.DNAME FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNOAND D.DEPTNO = 20; -字段和表名可以使用别名,方法为 AS 别名,或直接写别名,表如果指定别名,原表名在该查询中不能再被使用。,淹死的都是会游泳的,累死的都是能干的,-毁人不倦语录,DDL数据操作语言,SELECT-Joins(连接) 语法 T1 NATURAL INNER | LEFT | RIGHT | FULL OUTER JOIN T2 ON search condition | USING ( join column list ) 一个条件 JOIN 必须通过提
18、供一个(并且只能有一个) NATURAL,ON,或者 USING 这样的关键字来声明它的 连接条件 ON 子句 接受一个 search condition, 它与一个 WHERE 子句相同USING 子句接受一个用逗号分隔的 字段名列表,连接表中必须都有这些字段, 并且用那些字段连接这些表。 NATURAL 是 USING 子句的缩写,它列出两个表中所有公共 的字段名字。对于所有 JOIN 而言,INNER 和 OUTER 都是可选的INNER 是缺省 LEFT,RIGHT和 FULL 只用于 OUTER JOIN。,DDL数据操作语言,SELECTINNER JOIN 内连接 对于T1的每行
19、R1,连接成的表在T2里都有一行满足与R1的连接条件。 SELECT EMP.EMPNO, EMP.ENAME, EMP.JOB, DEPT.DEPTNO, DEPT.DNAME FROM EMP JOIN DEPT USING (DEPTNO); 结果同: SELECT EMP.EMPNO, EMP.ENAME, EMP.JOB, DEPT.DEPTNO, DEPT.DNAME FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNOINNER JOIN完全可以写成WHERE子句,重复两遍后你就应该把他变为程序,-毁人不倦语录,DDL数据操作语言,SELEC
20、TOUTER JOIN 外连接 LEFT OUTER JOIN 首先执行一次INNER JOIN,然后,如果T1里有一行对任何 T2 的行都不满足连接条件,那么返回一个连接行,该行的T2的字段为null。 左表数据全部返回,右表无对应数据返回NULL。 Oracle也可以写成:WHERE EMP.DEPTNO = DEPT.DEPTNO (+) RIGHT OUTER JOIN 首先执行一次INNER JOIN,然后,如果T2里有一行对任何T1的行都不满足连接条件,那么返回一个连接行,该行的T1的字段为null。 右表数据全部返回,左表无对应数据返回NULL。 Oracle也可以写成:WHER
21、E EMP.DEPTNO (+) = DEPT.DEPTNO FULL OUTER JOIN 首先执行一次INNER JOIN,然后,如果T1里有一行对任何T2的行都不满足连接条件,那么返回一个连接行,该行的T1的字段为null。 同样,如果T2里有一行对任何T1的行都不满足连接条件,那么返回一个连接行,该行的T2的字段为 null。 两个表数据全部返回,相互之间没有对应数据返回NULL。,三分技术,七分管理,-毁人不倦语录,DDL数据操作语言,SELECT-DISTINCT 取差异数据,在SELECT查询列表中只返回有差异的结果集。 SELECT-统计函数 统计操作(AVG,COUNT,SU
22、M,MIN,MAX)以表达式为参数。 满足 WHERE 子句的行均被计算, 通常,一个聚集对整个 SELECT 语句 生成一个计算结果。如果在一个查询里面声明了分组, 那么数据库将对每个组进行一次独立的计算。 SELECT-分组操作 SQL 使用GROUP BY 实现查询结果的分组,GROUP BY 后面跟着字段列表,字段列表值均相同的记录成为一组。 分组操作伴随聚集操作使用才有使用价值(注意:是分组伴随聚集,而不是聚集伴随分组)。 SELECT-HAVING 在分组操作后可以跟HAVING子句,限定分组统计函数的查询结果。WHERE是分组之前限定查询结果,HAVING是对分组后的限定,即:H
23、AVING 伴随GROUP BY 子句才有意思。,难道我现在是和上帝说话?怎么总是没有回答!,-毁人不倦语录,DDL数据操作语言,SELECT-范例 查询人数和人次,KC61是中心门诊报销表,其中AAC001是个人编码,一个人只有一个唯一的编码,可以使用DISTINCT和聚集查询 SELECT COUNT(*) AS 人次, COUNT(DISTINCT(AAC001) ) AS 人数 FROM KC61; 统计各部门人数、工资总额和平均工资 SELECT DEPTNO, COUNT(*) AS 人数, SUM(SAL) AS 工资总额, AVG(SAL) AS平均工资 FROM EMP GR
24、OUP BY DEPTNO; 如果需要显示部门名称,必须关联DEPT表 SELECT D.DEPTNO, D.DNAME, COUNT(*) AS人数, SUM(E.SAL) AS工资总额, AVG(E.SAL) AS 平均工资 FROM SCOTT.DEPT D, SCOTT.EMP E WHERE D.DEPTNO = E.DEPTNO GROUP BY D.DEPTNO, D.DNAME; -非聚集字段必须在GROUP BY 中列举,如果列举字段太多势必影响性能,可以使用查询子句解决此问题,有关查询子句见后详述。,解决问题的问题,而不是问题,这是关键性问题,-毁人不倦语录,DDL数据操作
25、语言,SELECT-UNION,UNION ALL,MINUS, INTERSECT 返回两个查询结果的集合操作,两个查询结果集必须字段相同。 UNION和UNION ALL并集操作,UNION并集后去掉重复结果,UNION ALL直接并集 MINUS差集操作 INTERSECT交集操作SELECT * FROM SCOTT.DEPT UNION SELECT * FROM SCOTT.DEPT WHERE DEPT.DEPTNO = 20; -返回所有部门,因为去掉了重复的结果SELECT * FROM SCOTT.DEPT UNION ALL SELECT * FROM SCOTT.DEP
26、T WHERE DEPT.DEPTNO = 20; -返回所有部门,部门编码为20的有两条。,工作境界:吃苦耐劳,苦中作乐,乐在其中,无苦无乐,-毁人不倦语录,DDL数据操作语言,SELECT-ORDER BY ORDER BY排序,跟数字(代表字段位置)或字段名,ASC升序,DESC降序,默认升序。 SELECT DEPTNO, DNAME FROM SCOTT.DEPT WHERE DEPTNO 10 GROUP BY DEPTNO, DNAME HAVING COUNT(*) 0 ORDER BY DEPTNO DESC; -ORDER BY 是对返回的结果进行排序,所以必须放在最后一句
27、。SELECT DEPTNO, DNAME FROM SCOTT.DEPT WHERE DEPTNO 10 GROUP BY DEPTNO, DNAME HAVING COUNT(*) 0 ORDER BY 1 DESC; -结果同第一个查询,字段位置从1开始。,我是来做项目的,不是来创造奇迹的,-毁人不倦语录,DDL数据操作语言,SELECT-FOR UPDATE 锁等待查询。当查询结果中有被锁定记录时等待解锁,当记录被解锁后返回结果集,并锁定返回的记录。如果FOR UPDATE后跟NOWAIT,遇到锁后不等待,返回错误。 ORACLE使用记录级锁定,当事物被提交或回滚后锁定被释放。 死锁问
28、题 当两个事物以不同的顺序同时更新多个表时就会发生死锁(对牛),解决死锁的途径是手工杀掉死锁的进程或者重新启动数据库。因此,在使用事物更新多表数据时一定要小心,使用面向对象的方法封装数据操作可以在很大程度上解决死锁问题。,没有经过严格测试的软件开发进度报告不看也罢,-毁人不倦语录,DDL数据操作语言,SELECT-子查询 查询语句可以嵌套,任何产生数值的地方都可以使用子查询。 在查询条件中使用子查询时,当子查询返回多个结果时只能使用IN。 查询顺序是先执行被依赖的底层查询,然后一层层向上查。 子查询只被执行一次。 查询平均工资最低的部门情况 SELECT DEPTNO, AVG(SAL) FR
29、OM SCOTT.EMP GROUP BY DEPTNO HAVING AVG(SAL) = (SELECT MIN(AVG(SAL) FROM SCOTT.EMP GROUP BY DEPTNO); -子查询先查询出最低的部门平均工资,然后查询部门最低平均工资等于子查询工资的部门,就是喜欢编程也不能为了编程而放弃和用户的功能确认,如果你把用户对程序的任意修改提升为对你自身价值的否定,你还不先确认吗?,-毁人不倦语录,DDL数据操作语言,SELECT-子查询 在FROM中使用子查询,子查询在这里相对与VIEW SELECT D.DEPTNO, D.DNAME, S.AVG_SAL, S.SUM
30、_SAL, S.NUM FROM SCOTT.DEPT D, (SELECT DEPTNO, AVG(SAL) AS AVG_SAL, SUM(SAL) AS SUM_SAL, COUNT(*) AS NUM FROM SCOTT.EMP GROUP BY DEPTNO) S WHERE D.DEPTNO = S.DEPTNO;在WHERE中使用子查询,例子不好,应该直接写表关联,这里只是为了说明语法。 SELECT * FROM SCOTT.EMP WHERE DEPTNO IN (SELECT DEPTNO FROM SCOTT.DEPT WHERE DEPTNO = 20);,驴怎么了?
31、人家采用的可是软件工程中的螺旋法则,-毁人不倦语录,DDL数据操作语言,SELECT-子查询 使用EXISTS(NOT EXISTS)替换IN(NOT IN) IN(NOT IN)在执行数据库操作时性能非常低下,应该使用EXISTS(NOT EXISTS)替换,特别是NOT IN子句将执行一个内部的排序和合并; EXISTS子查询使用主表的字段限制查询数据 SELECT * FROM SCOTT.EMP E WHERE EXISTS (SELECT * FROM SCOTT.DEPT WHERE DEPT.DEPTNO = E.DEPTNO AND DEPTNO = 20); -因为EXIST
32、S可以看到外表,所以,如果表名重复,使用表别名区分,在子查询中一定写清楚和外表的关联关系,另外,子查询写SELECT * 是对的,不用写字段名。,多做一点,早知道一点,-毁人不倦语录,DDL数据操作语言,UPDATE修改 用来更新数据表中的数据 UPDATE table_name SET column_name = new_value, WHERE condition; 更新DEPT表,将20号部门名称修改为销售部,地址修改为北京 UPDATE DEPT SET DNAME = 销售部, LOC = 北京 WHERE DEPTNO = 20; 子查询也可在UPDATE中使用,将职工领导是KIN
33、G的人员薪资增加100元 UPDATE SCOTT.EMPSET SAL = SAL + 100 WHERE EMPNO IN (SELECT E.EMPNO FROM SCOTT.EMP E, SCOTT.EMP G WHERE E.MGR = G.EMPNO AND G.ENAME = KING); UPDATE SCOTT.EMP SET SAL = SAL + 100 WHERE EXISTS (SELECT * FROM SCOTT.EMP E, SCOTT.EMP G WHERE E.MGR = G.EMPNO AND E.EMPNO = EMP.EMPNO AND G.ENAME
34、 = KING);,金保工程是“阳光工程”,所以我才阳光,-毁人不倦语录,DDL数据操作语言,INSERT-插入 语法: INSERT INTO table_name (column,.) VALUES (expression ,) | SELECT query 当表字段和插入值相同时,可以省略字段列表 INSERT INTO SCOTT.BONUS VALUES(TURNER, SALESMAN, 200, 40); 当只插入部分字段时,必须列举字段,未赋值字段使用默认值或为空 INSERT INTO SCOTT.BONUS(ENAME, JOB, SAL) VALUES(CLARK, MA
35、NAGER, 100); 也可以使用查询给表插入数据 INSERT INTO SCOTT.BONUS(ENAME, JOB, SAL) SELECT ENAME, JOB, SAL FROM SCOTT.EMP WHERE MGR = 7698;,理论上都是问题,做起来没有问题,-毁人不倦语录,DDL数据操作语言,DELETE-删除 语法: DELETE FROM table_name WHERE condition; 删除BONUS中ENAME为CLARK的记录 DELETE FROM SCOTT.BONUS WHERE ENAME = CLARK 删除重复记录,ROWID是记录的物理位置,
36、一经确定永不改变 DELETE FROM SCOTT.BONUS B WHERE ROWID 1); -删除ENAME重复记录,自己先擦块玻璃再交代给别人擦,安排工作同理,-毁人不倦语录,序列号,创建 CREATE SEQUENCE name INCREMENT BY n START WITH nMAXVALUE n | NOMAXVALUE MINVALUE n | NOMINVALUECYCLE | NOCYCLE CACHE n | NOCACHE; 说明:INCREMENT BY n 一次增长n 个数字 START WITH n 初始值 NOMAXVALUE 缺省值10E+27 NOM
37、INVALUE 缺省值1 NOCYCLE 不循环, 常用于唯一关键字 CACHE n 在内存里缓存n个序列,出错回退时会丢失 创建从1开始,不缓存的EMP_EMPNO序列。 CREATE SEQUENCE EMP_EMPNO START WITH 1 NOCACHE; 修改 ALTER SEQUENCE name INCREMENT BY n MAXVALUE n | NOMAXVALUE MINVALUE n | NOMINVALUE CYCLE | NOCYCLE CACHE n | NOCACHE; -起始值不能改变,如果要改变序列的起始值, 先删除, 再新建。 删除 DROP SEQU
38、ENCE name; DROP SEQUENCE EMP_EMPNO;,序列号,使用 NEXTVAL下一个序列号值 CURRVAL当前序列号值 如果EMP_EMPNO是一个序列号,可以用下面SQL取序列值 -去序列的当前值 SELECT EMP_EMPNO.CURRVAL FROM DUAL; -去序列的下一个值 SELECT EMP_EMPNO.NEXTVAL FROM DUAL; -使用序列插入数据 INSERT INTO EMP(EMPNO, ENAME,) VALUES(EMP_EMPNO.NEXTVAL, JONE,);不能用序列号的nextval和currval的地方 视图查询、d
39、istinct查询、有group by,having,order by的查询、 有子查询的查询、表里的缺省值,注释,/* 注释内容 */ -注释内容 -SELECT * DELETE FROM EMP WHERE DEPTNO = 20; 提示:删除数据前最好先查询一下。可以先写SELECT *,然后把SELECT *注释掉,增加DELETE。,如果再想不出来就去上厕所,-毁人不倦语录,常用函数,数字函数 ABS 取绝对值 POWER 乘方 LN 10为底数取幂 SQRT 平方根 EXP e的n次乘方 LOG(m,n) m为底数n取幂 数学运算函数:ACOS ATAN ATAN2 COS CO
40、SH SIGN SIN SINH TAN TANH CEIL 大于或等于取整数 FLOOR 小于或等于取整数 MOD 取余数 ROUND(n,m) 按m的位数取四舍五入值如果round(日期): 中午12以后将是明天的日期. round(sysdate,Y)是年的第一天 TRUNC(n,m) 按m的位数取前面的数值如果trunc(日期), 确省的是去掉时间,冲锋号响起后执行的是命令而不是计划,-毁人不倦语录,常用函数,字符函数 CHR 按数据库的字符集由数字返回字符 CONCAT(c1,c2) 把两个字符c1,c2组合成一个字符, 和 | 相同 REPLACE(c,s,r) 把字符c里出现s的
41、字符替换成r, 返回新字符 SUBSTR(c,m,n) m大于0,字符c从前面m处开始取n位字符,m等于0和1一样, m小与0,字符c从后面m处开始取n位字符 TRANSLATE(c,f1,t1) 字符c按f1到t1的规则转换成新的字符串 INITCAP 字符首字母大写,其它字符小写 LOWER 字符全部小写 UPPER 字符全部大写 LTRIM(c1,c2) 去掉字符c1左边出现的字符c2 RTRIM(c1,c2) 去掉字符c1右边出现的字符c2 TRIM(c1,c2) 去掉字符c1左右两边的字符c2 LPAD(c1,n,c2) 字符c1按指定的位数n显示,不足的位数用c2字符串替换左边的空
42、位 RPAD(c1,n,c2) 字符c1按指定的位数n显示,不足的位数用c2字符串替换右边的空位 提示:去掉字符串中间的空格可以使用replace,如果有三条路供你选择,不要选中间的,剩下两条可以扔硬币决定,-毁人不倦语录,常用函数,日期函数 ADD_MONTHS(d,n) 日期值加n月 LAST_DAY(d) 返回当月的最后一天的日期 MONTHS_BETWEEN(d1,d2) 两个日期值间的月份 NEXT_DAY(d) 返回日期值下一天的日期 SYSDATE 当前的系统时间 DUAL是SYS用户下一个空表,它只有一个字段dummy 提示:dual可以理解为虚表,多在查询系统函数返回值时使用
43、,以满足SELECT语法规则,如select sysdate from dual; select 3 + 4 from dual;,零也是钱,-毁人不倦语录,常用函数,转换函数 TO_CHAR(date,日期显示格式) TO_CHAR(number) 用于显示或报表的格式对齐 TO_DATE(char,日期显示格式) TO_LOB 把long字段转换成lob字段 TO_NUMBER(char) 用于计算或者比较大小 日期显示格式 年: YYYY, YEAR, YY 季:Q 月: MM, MONTH, MON 日: DD, DAY, DY 时: HH24, HH12, HH(12小时) 分: M
44、I 秒: SS,还差最后一点,-毁人不倦语录,常用函数,逻辑比较函数 NVL(EXPR1, EXPR2) 当EXPR1为空用EXPR2替代 DECODE(EXPRV1R1V2R2) 当EXPR=V1时返回R1 当EXPR=V2是放回V2 EXPR后条件和返回值成对出现,最后一个单值是不在条件中的返回值,如果没有单值,不满足条件的返回NULL。 SELECT ENAME, DECODE(JOB, MANAGER, 经理, PRESIDENT, 总裁, SALESMAN, 销售, 不详) FROM SCOTT.EMP; CASE WHEN condition THEN express1 ELSE express2 END 当condition成立返回express1否则返回express2 SELECT ENAME, HIREDATE, (CASE WHEN TO_NUMBER(TO_CHAR(HIREDATE, MM) 6 THEN 下半年 ELSE 上半年 END) AS 入职时间 FROM SCOTT.EMP; -TO_CHAR(HIREDATE, MM)取时间月份,写SQL时小心一点,别让硬盘飞出来伤到你,-毁人不倦语录,