DOC

OraclePLSQL

By Derek Palmer,2014-05-16 02:03
11 views 0
OraclePLSQL

过过和排序.txt

    SQL> --where

    SQL> --过过过过过工大于2500的工信息过过过过

    SQL> select *

     2 form emp

     3 where sal>2500;

    form emp

    *

     2 行出过过过:

    ORA-00923: 未找到要求的 FROM 过过

    SQL> ed

    已写入 file afiedt.buf

     1 select *

     2 form emp

     3* where sal>2500

    SQL> /

    form emp

    *

     2 行出过过过:

    ORA-00923: 未找到要求的 FROM 过过

    SQL> 2

     2* form emp

    SQL> c /form/from

     2* from emp

    SQL> /

     EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

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

     7566 JONES MANAGER 7839 02-4 -81 2975 20

    SQL> --过过KING的信息

    SQL> select *

     2 from emp

     3 where ename='king';

    未定行过过过

    SQL> ed

    已写入 file afiedt.buf

     1 select *

     2 from emp

     3* where ename='KING'

    SQL> /

     EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

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

     7839 KING PRESIDENT 17-11-81 5000 10

    SQL> --日期:过过17-11-81入的工过过过过

    SQL> select *

     2 from emp

     3 where hiredate='17-11-81';

     EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

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

     7839 KING PRESIDENT 17-11-81 5000 10

    SQL> select *

     2 from emp

     3 where hiredate='1987-11-17';

    where hiredate='1987-11-17'

     *

     3 行出过过过:

    ORA-01861: 文字与格式字符串不匹配

SQL> --看当前日期格式

    SQL> select sysdate from dual;

    SYSDATE -------------- 15-8 -11 SQL> --过过过过过系置

    SQL> select * from v$nls_parameters;

    SQL> col value for a30

    SQL> /

    PARAMETER VALUE ---------------------------------------------------------------- ------------------------------ NLS_LENGTH_SEMANTICS BYTE NLS_NCHAR_CONV_EXCP FALSE 过过19行。

    SQL> --修改日期格式

    SQL> alter session set nls_date_format='yyyy-mm-dd';

    会已更改。过过过过过

    SQL> select *

     2 from emp

     3 where hiredate='1987-11-17';

    SQL> where hiredate='1981-11-17';

    SP2-0734: 未知的命令过过 "where hire..." - 忽略了剩余的行。

    SQL> select *

     2 from emp

     3 where hiredate='1981-11-17';

     EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- ---------- ----- ---------- ----------

     7839 KING PRESIDENT 1981-11-17 5000 10 SQL> alter session set nls_date_formate='DD-MON-RR';

    alter session set nls_date_formate='DD-MON-RR'

    *

     1 行出过过过:

    ORA-00922: 过过 缺失或无效

    SQL> alter session set nls_date_format='DD-MON-RR';

    会已更改。过过过过过

    SQL> --日期?格式过过(过过过过过过过过式、示)

    SQL> host cls

    SQL> --between..and

    SQL> --过过过过过工位于1000~2500的工过过

    SQL> select * from emp where sal>=1000 and sal<=2500;

SQL> select * from emp where sal>=1600 and sal<=2500;

    SQL> select * from emp where sal between 1600 and 2500;

    SQL> select * from emp where sal between 2500 and 1600;

    SQL> --注意?小在前?大在后过过过过过过过过

    SQL> --in:在集合中

    SQL> --过过过过过部号10 20的工过过

    SQL> select * from emp where deptno=10 or deptno=20;

    SQL> select * from emp where deptno in(10,20);

    SQL> host cls

    SQL> --模糊过过

    SQL> --过过姓名以S打的工过过过过

    SQL> select *

     2 from emp

     3 where ename like 'S%';

     EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------------- ----- ---------- ----------

     7369 SMITH CLERK 7902 17-12-80 800 20

     7788 SCOTT ANALYST 7566 13-7 -87 3000 20

    过过2行。

    SQL> --过过过过过过过过过过过过姓名四个字符的工信息

    SQL> select *

     2 from emp

     3 where ename like '____';

     EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------------- ----- ---------- ----------

     7521 WARD SALESMAN 7698 22-2 -81 1250 500 30

     7839 KING PRESIDENT 17-11-81 5000 10

     7902 FORD ANALYST 7566 03-12-81 3000 20

    过过3行。

    SQL> insert into emp(empno,ename) values(1234,'Tom_123');

    已建过过 1 行。

    SQL> --过过过过过过过过过姓名中含下划的工

    SQL> select *

     2 from emp

     3 where ename like '%_%';

    SQL> select *

     2 from emp

     3 where ename like '%\_%' escape '\';

     EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------------- ----- ---------- ----------

     1234 Tom_123 过过 1 行。

    SQL> select *

     2 from emp

     3 where ename like '%a_%' escape 'a';

     EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------------- ----- ---------- ----------

     1234 Tom_123 过过 1 行。

    SQL> host cls

    SQL> --排序 order by

    SQL> --按照月薪排序

    SQL> select *

     2 from emp

     3 order by sal;

    SQL> --a命令? append

    SQL> a desc;

     3* order by saldesc

    SQL> select *

     2 from emp

     3 order by sal;

    SQL> a desc;

     3* order by sal desc

    SQL> /

    SQL> --a:两个空格

    SQL> host cls

    SQL> --order by后面可以跟哪些?1. 列名 2. 3.序号

    SQL> --按照年薪排序

    SQL> select ename,sal,sal*12 年薪

     2 from emp

     3 order by 年薪;

    ENAME SAL 年薪 ---------- ----- ---------- SMITH 800 9600

    JAMES 950 11400 SQL> select ename,sal,sal*12 年薪

     2 from emp

     3 order by 3;

    ENAME SAL 年薪 ---------- ----- ---------- SMITH 800 9600 SQL> --过过过过过过过工的信息?要求按照金排序

    SQL> select *

     2 from emp

     3 order by comm;

     EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------------- ----- ---------- ----------

     7844 TURNER SALESMAN 7698 08-9 -81 1500 0 30

     7499 ALLEN SALESMAN 7698 20-2 -81 1600 300 30

    SQL> delete from emp where empno=1234;

    已除过过 1 行。

    SQL> select *

     2 from emp

     3 order by comm;

     EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------------- ----- ---------- ----------

     7844 TURNER SALESMAN 7698 08-9 -81 1500 0 30

    SQL> a desc;

     3* order by comm desc

    SQL> /

     EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------------- ----- ---------- ----------

     7369 SMITH CLERK 7902 17-12-80 800 20

    SQL> --将空排到最后过过过过过

    SQL> select *

     2 from emp

     3 order by comm desc

     4 nulls last;

     EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------------- ----- ---------- ----------

     7654 MARTIN SALESMAN 7698 28-9 -81 1250 1400 30

SQL> select *

     2 from emp

     3 order by deptno,sal;

     EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------------- ----- ---------- ----------

     7934 MILLER CLERK 7782 23-1 -82 1300 10

SQL> a desc;

     3* order by deptno,sal desc

    SQL> /

     EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------------- ----- ---------- ----------

     7839 KING PRESIDENT 17-11-81 5000 10

SQL> ed

    已写入 file afiedt.buf

     1 select *

     2 from emp

     3* order by deptno desc,sal desc

    SQL> /

     EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------------- ----- ---------- ----------

     7698 BLAKE MANAGER 7839 01-5 -81 2850 30

SQL> --升序和降序只作用于最近的一列

    SQL> --order by作用于多列?先按照第一列排序?然后按照第二列排序?以此推过过;

    SQL> spool off

    SQL> --清屏

    SQL> host cls

    SQL> --linux清屏: host clear

    SQL> --当前用下的表过过过过

    SQL> select * from tab;

    TNAME TABTYPE CLUSTERID

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

    DEPT TABLE

    EMP TABLE

    BONUS TABLE

    SALGRADE TABLE

    SQL> --emp表的构过过

    SQL> desc emp;

     过过名称是否空?

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

     EMPNO NOT NULL NUMBER(4)

     ENAME VARCHAR2(10)

    SQL> --过过过工所有信息

    SQL> select * from emp;

     EMPNO ENAME JOB MGR HIREDATE SAL COMM

    SQL> --过过置行

    SQL> set linesize 120

    SQL> --过过置列

    SQL> col sal for 9999

    SQL> /

     EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------------- ----- ---------- ----------

     7369 SMITH CLERK 7902 17-12-80 800 20

SQL> --过过过过置大小

    SQL> set pagesize 20

    SQL> /

     EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------------- ----- ---------- ----------

     7369 SMITH CLERK 7902 17-12-80 800 20

SQL> set feedback off

    SQL> /

     EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------------- ----- ---------- ----------

     7369 SMITH CLERK 7902 17-12-80 800 20

    SQL> set feedback on

    SQL> --通列名过过过

    SQL> select empno,ename,job,mgr,hiredate,sal,comm,deptno

     2 from emp;

     EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------------- ----- ---------- ----------

     7369 SMITH CLERK 7902 17-12-80 800 20

SQL> --过过?*和列名哪性能好过过过过?

    SQL> --Oracle9i之前,列名>*

    SQL> host cls

    SQL> --具体的列

    SQL> --过过过过过过过过过过过工的号?姓名?月薪

    SQL> select empno,ename,sal form emp;select empno,ename,sal form emp

     *

     1 行出过过过:

    ORA-00923: 未找到要求的 FROM 过过

    SQL> --c命名修改

    SQL> c /form/from

     1* select empno,ename,sal from empSQL> /

     EMPNO ENAME SAL

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

     7369 SMITH 800

SQL> --ed命令

    SQL> select empno,ename,sal form emp;select empno,ename,sal form emp

     *

     1 行出过过过:

    ORA-00923: 未找到要求的 FROM 过过

    SQL> ed

    已写入 file afiedt.buf

     1* select empno,ename,sal from empSQL> /

     EMPNO ENAME SAL

     7369 SMITH 800

SQL> --: 1. as 2. as可以省略 3. 跟双引号

    SQL> select empno as 过过过工号, ename 姓名, sal "姓名"

     2 from emp;

     过过 工号姓名姓名

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

     7369 SMITH 800

    SQL> --过过: 有无双引号的区?过过

    SQL> host cls

    SQL> --select含算表达式过过过过过过

    SQL> --过过过过过过过过过过过过过过工?号?姓名?月薪?年薪

    SQL> select empno,ename,sal 月薪, sal*12 年薪

     2 from emp;

     EMPNO ENAME 月薪年薪

     7369 SMITH 800 9600

    SQL> --过过过工信息,号?姓名?月薪?年薪,金?年收入

    SQL> select empno,ename,sal 月薪, sal*12 年薪, comm , sal*12+comm 年收入

     2 from emp;

     EMPNO ENAME 月薪年薪金年收入

     7369 SMITH 800 9600

SQL> /*

    SQL> sql里面?于空的使用过过过过过过过:

SQL> 1. 如果一个表达式中含空?整个表达式空过过过过过过过过过过

    SQL> 2. null != null

    SQL> */

    SQL> --过过过过过过过过过过金空的工信息

    SQL> select *

     2 from emp

     3 where comm =null;

    未定行过过过

    SQL> --1. 使用空函数过过过过 null-->0

    SQL> select empno,ename,sal 月薪, sal*12 年薪, comm , sal*12+nvl(comm,0) 年收入

     2 from emp;

     EMPNO ENAME 月薪年薪金年收入

     7369 SMITH 800 9600 9600

SQL> 2. is或者is not

    SP2-0734: 未知的命令过过 "2. is或者i..." - 忽略了剩余的行。

    SQL> -- 2. is或者is not

    SQL> select *

     2 from emp

     3 where comm is null;

     EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

     7369 SMITH CLERK 7902 17-12-80 800 20 SQL> --过过过过过工的部号

    SQL> select depnto from emp;

    select depnto from emp *

     1 行出过过过:

    ORA-00904: "DEPNTO": 过过 符无效

    SQL> select deptno from emp;

     DEPTNO

     20

SQL> select distince deptno from emp;

    select distince deptno from emp

     *

     1 行出过过过:

    ORA-00904: "DISTINCE": 过过 符无效

    SQL> select distinct deptno from emp;

     DEPTNO

     30 SQL> --distinct如果作用于多列?

    SQL> select distinct job,deptno from emp;

    JOB DEPTNO

    MANAGER 20

    SQL> --只有多列全部相同?才会是相同过过过过过

    SQL> host cls

    SQL> --接符: ||

    SQL> --Hello World

    SQL> select 'hello' || ' world' from dual;

    'HELLO'||'W

    hello world

    过过 1 行。

    SQL> --oracle一个表过过dual:1.过过过 足法2. 方便做过过

    SQL> select 3+2 from dual;

     3+2

     5

    过过 1 行。

    SQL> --过过过工的信息?*** 的工是过过***

    SQL> select ename||'的工是过过'||sal

     2 from emp;

    ENAME||'的工是过过'||SAL

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

    SMITH的工是过过800

    SQL> spool off

如何手解号和置密过过过过过过过过过过:

    1. 管理登过过过

     *. 密?过过过过sqlplus sys/password as sysdba

     *. 主机?过过过sqlplus / as sysdba ?前提?操作系的用即数据管理?过过过过过过过过过过过过过

    2. :

     alter user scott account unlock;

    3. 改密:

     alter user scott identified by paas123;

    SQL> --大小写函数

    SQL> select lower('HELLO WORLD') 小写, upper('hEhllo WorLD') 大写from dual;

    过 过 小写大写

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

    hello world HEHLLO WORLD

    过过 1 行。

    SQL> --首字母大写

    SQL> select initcap('hello world') 首字母大写 from dual

     2 ;

    首字母大写

    Hello World

    过过 1 行。

    SQL> --hello word

    SQL> select concat('hello',' world') from dual;

    CONCAT('HEL

    hello world

    过过 1 行。

    SQL> --substr: 求子串

    SQL> select substr('Hello World',3) from dual;

    SUBSTR('H

    llo World

    过过 1 行。

    SQL> select substr('Hello World',3,5) from dual;

    SUBST

    llo W

    过过 1 行。

    SQL> host cls

    SQL> --length:字符数; lengthb:字数过过

    SQL> select length('hello world') 字符数, lengthb('hello world') 字数过过 from dual;

     过过字符数字数

     11 11

    过过 1 行。

    SQL> select lenght('中国') 字符数, lengthb('中国') 字数过过 from dual;

    select lenght('中国') 字符数, lengthb('中国') 字数过过 from dual

     1 行出过过过:

    ORA-00904: "LENGHT": 过过 符无效

    SQL> select length('中国') 字符数, lengthb('中国') 字数过过 from dual;

     过过字符数字数

     2 4

    过过 1 行。

    SQL> host cls

    SQL> --instr: 求子串的位置

    SQL> select instr('hello world','ll') from dual;

    INSTR('HELLOWORLD','LL')

     3

    过过 1 行。

    SQL> select instr('hello world','abc') from dual;

    INSTR('HELLOWORLD','ABC')

     0

    过过 1 行。

    SQL> --左右填充: abcd --> 10, 并且用*填充

    SQL> select lpad('abcd',10,'*') 左填充,rpad('abcd',10,'*') 右填充 from dual;

    左填充右填充

    ******abcd abcd******

    过过 1 行。

    SQL> --trim?去掉字符串前后的指定的字符

    SQL> select trim('H' from 'Hello WorldH') from dual;

    TRIM('H'FR

ello World

    过过 1 行。

    SQL> --:

    SQL> select replace('Hello World','l','*') from dual;

    REPLACE('HE

    He**o Wor*d

    过过 1 行。

    SQL> select ename from emp;

    ENAME

    SMITH

SQL> host cls

    SQL> --数字函数

    SQL> select round(45.926,2) 四舍五入, trunc(45.926,2) 截断, mod(1600,300) 求于 from dual;

     四舍五入截断求于

     45.93 45.92 100

    过过 1 行。

    SQL> --日期函数

    SQL> select sysdate from dual;

    SYSDATE

    15-8 -11

    过过 1 行。

    SQL> host cls

    SQL> --昨天?今天?明天

    SQL> select sysdate-1 昨天, sysdate 今天, sysdate+1 明天 from dual;

    昨天今天明天

    14-8 -11 15-8 -11 16-8 -11 过过 1 行。

    SQL> --过过过过过过算工的工

    SQL> select ename, sysdate-hiredate from emp;

    ENAME

    SMITH 11198.6066

    SQL> --日期能相加?

    SQL> select ename, sysdate+hiredate from emp;

    select ename, sysdate+hiredate from emp

     *

     1 行出过过过:

    ORA-00975: 不允日期过过过 + 日期

    SQL> host cls

    SQL> --过过过过过过过过过过过过过过过过过过过算工的工?分以天?月?年方式示

    SQL> select ename, sysdate-hiredate , (sysdate-hiredate)/7 星期, (sysdate-hiredate)/30

     2 from emp;

    ENAME 天星期月

    SMITH 11198.6088 1599.80126 373.28696

    SQL> select ename,(sysdate-hiredate)/30 , months_between(sysdate,hiredate) 方式二 from emp;

    ENAME 月方式二

    SMITH 373.287032 367.955193

    SQL> --add_months: 在指定的上加上月数过过过过过过过

    SQL> --123月后

    SQL> select add_months(sysdate,123) from dual;

    ADD_MONTHS(SYS

    15-11-21

    过过 1 行。

    SQL> --本月的最后一天

    SQL> select last_day(sysdate) from dual;

    LAST_DAY(SYSDA

    31-8 -11

    过过 1 行。

    SQL> host cls

    SQL> --next_day:从某个算起?下一个出星期几的日期过过过过过过过过过过过过过过过过过

    SQL> select next_day(sysdate,'星期一') from dual;

    NEXT_DAY(SYSDA

    22-8 -11

    过过 1 行。

    SQL> host cls

    SQL> --过过过过过过过日期行四舍五入

    SQL> select round(sysdate,'month'), round(sysdate,'year') from dual;

ROUND(SYSDATE, ROUND(SYSDATE,

    01-8 -11 01-1 -12

    过过 1 行。

    SQL> --过过过过过日期行截断

    SQL> select trunc(sysdate,'month'),trunc(sysdate,'year') from dual;

    TRUNC(SYSDATE, TRUNC(SYSDATE,

    01-8 -11 01-1 -11

    过过 1 行。

    SQL> select sysdate from dual;

    SYSDATE

    15-8 -11

    过过 1 行。

    SQL> --RR:表示年?有?过过过过

    SQL> --千年虫过过

    SQL> host cls

    SQL> --过过过过示当前系

    SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

    TO_CHAR(SYSDATE,'YY

    2011-08-15 14:58:35

    过过 1 行。

    SQL> --今天星期几

    SQL> select to_char(sysdate,'day') from dual;

    TO_CHAR(S

    星期一

    过过 1 行。

    SQL> --格式化示日期过过过过: 今天是2011-08-15,过过过14:58:35

    SQL> select to_char(sysdate,'"今天是"yyyy-mm-dd "过过过"hh24:mi:ss') from dual;

    TO_CHAR(SYSDATE,'"今天是"YYYY-MM-

    今天是2011-08-15 过过过15:01:03

    过过 1 行。

    SQL> host cls

    SQL> select * from v$nls_parameters;

    PARAMETER VALUE

    NLS_LANGUAGE SIMPLIFIED CHINESE

    SQL> host cs

    SQL> --过过过过过过过过过过过过过过过过过过过过过工的工?要求有千位符?代?两位小数

    SQL> select ename,to_char(sal,'L9,999.99') from emp;

    ENAME TO_CHAR(SAL,'L9,999

    SMITH ?800.00

    SQL> select to_number('123') from dual;

    TO_NUMBER('123')

     123

    过过 1 行。

    SQL> host cls

    SQL> select *

     2 from emp

     3 where hiredate=to_date('1981-12-17','yyyy-mm-dd');

    未定行过过过

    SQL> select *

     2 from emp

     3 where hiredate=to_date('1981-11-17','yyyy-mm-dd');

     EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

     7839 KING PRESIDENT 17-11-81 5000 10 过过 1 行。

    SQL> --通用函数

    SQL> --空函数: nvl(a,b):a过过过过过空?返回b?反返回过过过a

    SQL> -- nvl2(a,b,c):a过过过过过空?返回c?否返回过过过b;

    SQL> select ename,sal,sal*12 年薪, comm , sal*12+nvl2(comm,comm,0) 年收入 from emp;

    ENAME SAL 年薪金年收入

    SMITH 800 9600 9600

    SQL> host cls

    SQL> --nullif(a,b):a=b?返回null?不等?返回过过过过a

    SQL> select nullif('abc','abc') from dual;

    NUL

    过过 1 行。

    SQL> select nullif('abc','abcd') from dual;

Report this document

For any questions or suggestions please email
cust-service@docsford.com