oracle(ddldmldcl经典语法)

  • 格式:doc
  • 大小:242.50 KB
  • 文档页数:28

1搜索式CASE表达式用于UPDATE语句

UPDATE emp

SET sal =

CASE

WHEN deptno=10 THEN sal*1.1

WHEN deptno=20 THEN sal*1.05

ELSE sal

END

2简单CASE表达式用于UPDATE语句

UPDATE emp

SET sal =

CASE deptno

WHEN 10 THEN sal*1.1

WHEN 20 THEN sal*1.05

ELSE sal

END;

3CASE结构用于SELECT语句

SELECT

CASE

WHEN DUMMY='X' THEN 'Dual is OK'

ELSE 'Dual is messed up'

END

FROM DUAL;

4创建并运行一个脚本文件

1. 创建 SQL SELECT 语句.

2. 将该 SELECT语句保存到脚本文件

3. 从编辑器中调用该文件

4. 验证SELECT后的终结符

5. 保存脚本文件(如:e:\update_case.sql).

6. 输入 “START 文件名”运行脚本

SQL>start e:\update_case.sql

5使用 &替代变量

SELECT empno, ename, sal, deptno

FROM emp

WHERE empno = &employee_num;

6使用ceil函数:

SELECT ceil(2.35) FROM dual;

执行结果:

CEIL(2.35)

-------------

3

说明:该函数求得大于等于2.35的最小整数,结果为3。

7使用floor函数:

SELECT floor(2.35) FROM dual;

执行结果:

FLOOR(2.35)

----------------

2

说明:该函数求得小于等于2.35的最大整数,结果为2。

8求|sin(230o)|的值,保留一位小数:

SELECT round(abs(sin(230*3.14159/180)),1) FROM dual;

结果为:

ROUND(ABS(SIN(230*3.14159/180)),1)

---------------------------------------------------

0.8

说明:先将230o转换成为弧度,然后进行计算求值。再求绝对值。再进行四舍五入,保留小数点后1位。

9、ROUND: 四舍五入到指定的小数位

ROUND(45.926, 2) 45.93

TRUNC: 截取到指定的小数位

TRUNC(45.926, 2) 45.92

MOD: 取余数

MOD(1600, 300) 100

10【实例1】 自动转换字符型数据到数值型。

输入并执行查询:

SELECT '12.5'+11 FROM dual;

执行结果为:

'12.5'+11

------------

23.5

说明:在本实例中,因为出现+运算符,说明进行的是算术运算,所以字符串'12.5'被自动转换成数值12.5,然后参加运算。

11【实例2】 自动转换数值型数据到字符型。

执行以下查询:

SELECT '12.5'||11 FROM dual; 结果为:

'12.5'

------

12.511

说明:在本训练中,因为出现||运算符,说明进行的是字符串连接运算,数值11被自动转换成字符串'11',然后参加运算。

12 TO_CHAR 用于日期型

(1)SELECT ename, TO_CHAR(hiredate, 'fmDD Month YYYY') HIREDATE

FROM emp;

结果:

ENAME HIREDATE

---------- -----------------

SMITH 17 12月 1980

ALLEN 20 2月 1981

WARD 22 2月 1981

JONES 2 4月 1981

MARTIN 28 9月 1981

BLAKE 1 5月 1981

...

已选择16行。

(2)SELECT TO_CHAR(sysdate,'YYYY-MM-DD HH24:MI:SS AM DY')

AS 系统日期与时间

FROM dual;

结果:

系统日期与时间

-------------------------------

2009-03-15 11:49:34 上午 星期日

(3)【实例】 将日期显示转换成中文的年月日。

输入并执行查询:

SELECT TO_CHAR(sysdate,'YYYY"年"MM"月"DD"日"') FROM dual;

执行结果为:

TO_CHAR(SYSDAT

--------------

2008年04月08日

说明:双引号中的中文字“年”、“月”、“日”原样显示,单引号为字符串的界定标记,区别于双引号,不能混淆。

(4)【练习1】显示2011年的12月22日为星期几。

select '2011年12月22', to_char((to_date('2011-12-22','yyyy-mm-dd')),'DAY') 星期几

from dual;

13将NULL转换为一个实际的值

数据类型可以是date、 character、 number。

数据类型必须匹配

NVL(comm,0) 用0代替空的Comm值。

NVL(hiredate,„01-1月-97‟) 用1997年1月1日代替空的雇佣日期。

NVL(job,„No Job Yet‟) 用“No Job Yet”代替空的职务。

14使用 DECODE 函数

显示各雇员的岗位、工资及其预增工资,其中'ANALYST'增10%,'CLERK'增15%和‟MANAGER‟增20%,其余不变

SELECT job, sal,

DECODE(job, 'ANALYST', SAL*1.1,

'CLERK', SAL*1.15,

'MANAGER', SAL*1.20,

SAL)

REVISED_SALARY

FROM emp;

15使用 userenv函数

【实例】 返回用户终端或系统标识信息。

执行以下查询:

SELECT userenv('TERMINAL') FROM dual;

结果:

主机名称

16组函数的使用原则

SUM和AVG只应用于数值型的列,MAX、MIN和COUNT可以应用于字符、数值和日期类型的列。

• 除了 COUNT(*)其他所有的组函数都忽略空值,可以使用NVL函数将空值转换成一个实际的值。

• 当使用GROUP BY子句时,Oracle服务器会自动对结果集合按升序排列。要忽略改变的排序方式可以在ORDER BY子句中使用DESC关键字。

• SELECT中出现的列除了在组函数中的,必须在GROUP BY子句中出现过。

• GROUP BY列不一定必须出现在SELECT查询中。

• 列别名不能用在GROUP BY子句中。

• 分组之前仍然可以使用WHERE子句来限制数据。

17外部连接

SELECT table1.column, table2.column

FROM table1, table2

WHERE table1.column(+) = table2.column;

SELECT table1.column, table2.column

FROM table1, table2 WHERE table1.column = table2.column(+);

18自身连接

SELECT worker.ename||' works for '||manager.ename

FROM emp worker, emp manager

WHERE worker.mgr = manager.empno;

19 SQL:1999语法的连接

SELECT table1.column, table2.column

FROM table1

[CROSS JOIN table2] |

[NATURAL JOIN table2] |

[JOIN table2 USING (column_name)] |

[JOIN table2

ON(table1.column_name = table2.column_name)] |

[LEFT|RIGHT|FULL OUTER JOIN table2

ON (table1.column_name = table2.column_name)];

1 SELECT emp.empno,emp.ename,emp.sal,emp.deptno,dept.loc

FROM emp

CROSS JOIN dept;

2 SELECT empno,ename,sal,deptno,loc

FROM emp

NATURAL JOIN dept;

3使用USING子句创建连接

SELECT e.ename,e.ename,e.sal,deptno,d.loc

FROM emp e JOIN dept d USING (deptno)

WHERE deptno = 20 ;

4使用ON子句创建连接

SELECT e.empno, e.ename, e.deptno, d.deptno, d.loc

FROM emp e

JOIN dept d

ON (e.deptno = d.deptno);

5用ON 子句创建三向连接

SELECT e.empno, e.ename, d.loc,m.ename

FROM emp e

JOIN dept d

ON e.deptno = d.deptno