ORACLE SQL基础

一、oracle安装、熟悉sqlplus基本操作、scott账户。

1.安装时启用样本数据库实例

2.账户解锁

普通用户scott/tiger

普通管理员system/manager

超级管理员sys/change_on_install

3.oralce服务

监听服务-客户端想连接数据库,此服务必须打开。

OracleServie命名服务-数据库的主服务

4.sqlplus主机字符串:如果一个电脑上有多个数据库时,则要在此处输入数据库的名称。如果不输,表示默认服务。

5.设置环境变量 select * from emp;

此时原本应该一行显示的数据没有按一行显示,显示比较混乱。

如果要使用sqlplus,需设置环境设置。

设置每行显示的长度:

set linesize 300; 

修改每页长度:设置标题不重复(oracle采用一页一页的方式输出规则):

set pagesize 30;

6.sqlplus命令  clear scr;--清屏

1).在sqlplus中没法修改输入的内容,一般采用本机记事本程序进行编译。

在命令窗口中输入“ed 文件名”即可。选择创建文件。

@文件名 可以执行。 @文件路径[\]文件名 也针对于本地文件。

执行时要指定文件的路径。如果文件名为“*.sql”,可省略后缀。

sql> ed a;

sql> @a;
--导出数据Demo

--注:sqlplus执行文件中的sql语句不能超过2500个字符。

SET TRIMSPOOL ON

SET HEADING OFF

SET NEWPAGE NONE

SET SPACE 0

set feedback off 

SET PAGESIZE 0 

SET TRIMOUT ON

SET LINESIZE 2500

SET ECHO OFF

SPOOL e:\dg_201204.txt

select destaddr||'|'||time||'|'||task_name||'|'||t2.userdata||'|'||retno||'|'||sms_type_name from t_batch_sms_dg_0 t1,t_batch_task t2,t_sms_type t3 where t1.sms_type_id=t3.sms_type_id and t1.task_id=t2.task_id and time like '2012-04%' union all select destaddr||'|'||time||'|'||task_name||'|'||t2.userdata||'|'||retno||'|'||sms_type_name from t_batch_sms_dg_1 t1,t_batch_task t2,t_sms_type t3 where t1.sms_type_id=t3.sms_type_id and t1.task_id=t2.task_id and time like '2012-04%' union all select destaddr||'|'||time||'|'||task_name||'|'||t2.userdata||'|'||retno||'|'||sms_type_name from t_batch_sms_dg_2 t1,t_batch_task t2,t_sms_type t3 where t1.sms_type_id=t3.sms_type_id and t1.task_id=t2.task_id and time like '2012-04%' union all select destaddr||'|'||time||'|'||task_name||'|'||t2.userdata||'|'||retno||'|'||sms_type_name from t_batch_sms_dg_3 t1,t_batch_task t2,t_sms_type t3 where t1.sms_type_id=t3.sms_type_id and t1.task_id=t2.task_id and time like '2012-04%' union all select destaddr||'|'||time||'|'||task_name||'|'||t2.userdata||'|'||retno||'|'||sms_type_name from t_batch_sms_dg_4 t1,t_batch_task t2,t_sms_type t3 where t1.sms_type_id=t3.sms_type_id and t1.task_id=t2.task_id and time like '2012-04%' union all select destaddr||'|'||time||'|'||task_name||'|'||t2.userdata||'|'||retno||'|'||sms_type_name from t_batch_sms_dg_5 t1,t_batch_task t2,t_sms_type t3 where t1.sms_type_id=t3.sms_type_id and t1.task_id=t2.task_id and time like '2012-04%' union all select destaddr||'|'||time||'|'||task_name||'|'||t2.userdata||'|'||retno||'|'||sms_type_name from t_batch_sms_dg_6 t1,t_batch_task t2,t_sms_type t3 where t1.sms_type_id=t3.sms_type_id and t1.task_id=t2.task_id and time like '2012-04%' union all select destaddr||'|'||time||'|'||task_name||'|'||t2.userdata||'|'||retno||'|'||sms_type_name from t_batch_sms_dg_7 t1,t_batch_task t2,t_sms_type t3 where t1.sms_type_id=t3.sms_type_id and t1.task_id=t2.task_id and time like '2012-04%' union all select destaddr||'|'||time||'|'||task_name||'|'||t2.userdata||'|'||retno||'|'||sms_type_name from t_batch_sms_dg_8 t1,t_batch_task t2,t_sms_type t3 where t1.sms_type_id=t3.sms_type_id and t1.task_id=t2.task_id and time like '2012-04%' union all select destaddr||'|'||time||'|'||task_name||'|'||t2.userdata||'|'||retno||'|'||sms_type_name from t_batch_sms_dg_9 t1,t_batch_task t2,t_sms_type t3 where t1.sms_type_id=t3.sms_type_id and t1.task_id=t2.task_id and time like '2012-04%';

SPOOL off;

2).sqlplus中也可以使用其他用户连接。

conn sys/wean as sysdba

 --超级管理员必须用as sysdba

管理员权限下查询不到select * from emp;如果一定要访问,必须加上用户名“scott.emp”;

select * from scott.emp;

emp是scott用户下的表。

3).显示当前正在连接的用户是哪一个:

show user;

4).获取数据库中全部表名称:

select * from tab;--用scott账户。

5).查看表结构:

desc emp;

set linesize 100;

6).NUMBER(7,2)--表示小数位2位,整数位5位,总数为7位。

7).重复执行上一条语句的操作:"/"。

7.scott下的几张表

1).雇员表:emp

EMPNO:雇员编号 NUMBER(4) 



EMPNAME:雇员姓名 VARCHAR2(10) 



JOB:职位 VARCHAR2(9) 



MGR:雇员领导编号 NUMBER(4) 



HIREDATE:雇佣日期 DATE 



SAL:月薪 NUMBER(7,2) 



COMM:奖金、佣金 NUMBER(7,2) 



DEPTNO:部门编号 NUMBER(2)

2).部门表:dept

DEPTNO 部门编号 NOT NULL NUMBER(2) 



DNAME 部门名称 VARCHAR2(14) 



LOC 部门位置 VARCHAR2(13)

3).工资表:salgrade

GRADE 等级名称 NUMBER 



LOSAL 此等级的最低工资 NUMBER 



HISAL 此等级的最高工资 NUMBER

4).奖金表:bonus  

ENAME 雇员姓名 VARCHAR2(10)  



JOB 雇员工作 VARCHAR2(9)  



SAL 雇员工资 NUMBER  



COMM 雇员奖金 NUMBER

 

二、Oracle常用查询关键字

1.distinct:如果查询多列,必须保证所有列的数据完全重复。

2.||:字符串连接操作,"'":表示固定信息。

select '编号是:' || empno || '的雇员,姓名是:' || ename || ',工作是:' || job || '' from emp;

3.四则运算,+、-、*、/,先乘除后加减。

select ename,sal*12 from emp;

4.取别名--避免中文别名。

select ename,sal*12 income from emp;

5.查询是否为空的列的数据,“is not null”,“is null”

select * from emp where comm is not null;

6.查询条件并且“and”,或者“or”

select * from emp where comm is not null and ename='WARD'; 
select * from emp where comm is not null or ename='WARD';

7.取反“not”。

select * from emp where not(comm is not null and ename='WARD');

8.指定过滤范围“between and”--等价于sal>=1500 and sal<=3000。

select * from emp where sal between 1500 and 3000; 

between and 支持查询日期,oracle date格式“20-2月 -81”

select * from emp where hiredate between '1-1月 -81' and '31-12月 -81';

9.oracle中查询字符串时,对大小写敏感。

10.范围语法“in(值1,值2,值3...)”,“not in(值1,值2,值3...)”。

11.模糊查询“like '%M%'”。

"%"表示任意长度的内容;

"_"表示一个长度的内容。

 

三、函数,各种数据库中最大的区别是函数的语法。

1.对查询的结果排序order by(列1,列2)、ASC默认-升序,DESC-降序。

2.oralce单行函数 funtion_name(column|exception[arg1,arg2...]);

分类:

1).字符函数

--将小写字符变成大写字符 

select * from emp where ename=upper('smith');
--变成小写 

select lower('hello world') from dual;
--将雇员姓名变成首字母大写 

select initcap(ename) from emp;
--字符串除了使用||,还可以使用concat() 

select concat('hello','world') from dual;
SQL> --字符串截取

SQL> --字符串长度

SQL> --字符串内容替换

SQL> select substr('hello',1,3) 截取字符串,

  2         length('hello') 字符串长度,

  3          replace('hello','1','x') 字符串替换 

  4  from dual;



截  字符串长度 字符

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

hel          5 hello

--substr函数中注意:oracle中substr的截取点是从0开始还是从1开始?

--从0或1开始效果都一样,因为oracle比较智能。
--显示所有雇员的姓名及姓名的后三个字符。

SQL> select ename,substr(ename,length(ename)-2) from emp;



ENAME      SUBSTR(ENAME,LENGTH(

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

SMITH      ITH

ALLEN      LEN

--substr函数中可以采用倒着截取的方式,只要位置是负数表示倒着就行。与上面结果一样。

SQL> select ename,substr(ename,-3,3) from emp;

2).数值函数

--四舍五入:round(数字)

SQL> select round(189.536) from dual;



ROUND(189.536)

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

           190
--保留两位小数

SQL> select round(189.536,2) from dual;



ROUND(189.536,2)

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

          189.54
--对整数进行四舍五入

SQL> select round(189.536,-2) from dual;   



ROUND(189.536,-2)

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

              200
--截断小数点:trunc(数字)

SQL> select trunc(189.536) from dual;



TRUNC(189.536)

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

           189
--指定小数点后的保留位数,保留2位

SQL> select trunc(189.536,2) from dual;



TRUNC(189.536,2)

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

          189.53
--指定小数点前的保留位数,保留2位

SQL> select trunc(189.536,-2) from dual;



TRUNC(189.536,-2)

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

              100
--取余数(取模):mod(数字)

SQL> select mod(10,3) from dual;



 MOD(10,3)

----------

         1

3).日期函数

日期-数字=日期;
日期+数字=日期;
日期-日期=数字(天数);

--获取当前日期

SQL> select sysdate from dual;



SYSDATE

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

18-5月 -12
--获取被雇佣的星期数

SQL> select empno,ename,round((sysdate-hiredate)/7) from emp;



     EMPNO ENAME      ROUND((SYSDATE-HIREDATE)/7)

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

      7369 SMITH                             1639

      7499 ALLEN                             1630
--给定日期范围的月数:months_between()

SQL> select empno,ename,round(months_between(sysdate,hiredate)) from emp;



     EMPNO ENAME      ROUND(MONTHS_BETWEEN(SYSDATE,HIREDATE))

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

      7369 SMITH                                          377

      7499 ALLEN                                          375
--求出指定日期上加上指定月数的日期:add_month()

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



ADD_MONTHS(SYS

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

18-9月 -12
--下一个的今天是哪一个日期:next_day()

--下一个星期一

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



NEXT_DAY(SYSDA

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

21-5月 -12
--给定日期的最后一个日期:last_day()

--本月的最后一天

SQL> select last_day(sysdate) from dual;



LAST_DAY(SYSDA

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

31-5月 -12

4).转换函数

--to_char()

--转换日期

SQL> select empno,ename,to_char(hiredate,'yyyy-mm-dd') from emp;



     EMPNO ENAME      TO_CHAR(HI

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

      7369 SMITH      1980-12-17

      7499 ALLEN      1981-02-20
--去掉前导0

SQL> select empno,ename,to_char(hiredate,'fmyyyy-mm-dd') from emp;



     EMPNO ENAME      TO_CHAR(HI

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

      7369 SMITH      1980-12-17

      7499 ALLEN      1981-2-20
--用在数字上

--数字中以“,”分割进行格式化

SQL> select empno,ename,to_char(sal,'L99,999') from emp;



     EMPNO ENAME      TO_CHAR

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

      7369 SMITH          800

      7499 ALLEN        1,600
--表示明确的区域

$:美元;L:本地金额显示。

 select empno,ename,to_char(sal,'L99,999') from emp;



 EMPNO ENAME      TO_CHAR(SAL,'L99,

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

  7369 SMITH                  ¥800
--to_number()

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



TO_NUMBER('123')+TO_NUMBER('123')

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

                              246
--to_date()

--将字符串转换成date类型

SQL> select to_date('2009-12-01','yyyy-mm-dd') from dual;



TO_DATE('2009-

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

01-12月-09

5).通用函数

--查询所有雇员的年薪

SQL> select empno,ename,(sal+comm)*12 from emp;



     EMPNO ENAME      (SAL+COMM)*12

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

      7369 SMITH

      7499 ALLEN              22800

      7521 WARD               21000

      7566 JONES

      7654 MARTIN             31800

--之所有出现这种情况,是因为有些雇员的奖金为NULL,此情况可以改查询语句:

--nvl();将制定的空值按0显示,不为空按默认显示。

SQL> select empno,ename,(sal+nvl(comm,0))*12 from emp;



     EMPNO ENAME      (SAL+NVL(COMM,0))*12

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

      7369 SMITH                      9600

      7499 ALLEN                     22800

      7521 WARD                      21000

      7566 JONES                     35700

      7654 MARTIN                    31800
--decode();类似于if...elseif...elseif...else...

SQL> select decode(1,1,'内容是1',2,'内容是2',3,'内容是3') from dual;



DECODE(

-------

内容是1



--雇员

 

四、多表连接查询
1.在使用多表查询的时候,会产生笛卡尔积(两张表的记录会交错出现),如果两张表的数据越多,笛卡尔积越大。
因此多表查询在开发中不建议过多使用。
如果需要去掉笛卡尔积,需要用字段进行关联的操作。

2.连接查询 

select e.empno,e.ename,d.deptno,d.dname,d.loc

from emp e,dept d

--右连接

where e.deptno(+)=d.deptno;



select e.empno,e.ename,d.deptno,d.dname,d.loc

from emp e,dept d

--左连接

where e.deptno=d.deptno(+);

3.sql:1999
1).交叉连接:cross join,产生笛卡尔积。

select e.empno,e.ename,d.deptno,d.dname,d.loc

from emp e cross join dept d;

2).自然连接:natural join,自动匹配。

select * from emp natural join dept;

3).指定连接:using子句,直接指定关联的列。

select * from emp e join dept d using(deptno);

4).自定连接:on子句,用户自己指定关联的条件。

select * from emp e join dept d on(e.deptno=d.deptno);

5).左连接、右连接:left outer join,right outer join。

select * from emp e right outer join dept d on(e.deptno=d.deptno);

 

五、组函数、分组查询、子查询。

1.组函数 count(); max(); min(); avg(); sum();

2.分组查询group by

3.子查询的三种查询操作符号

--"in"

--求出每个门本的最低工资的雇员信息

select * from emp 

where sal in (select min(sal) from emp group by deptno);



--"=any",与"in"一样

select * from emp 

where sal =any (select min(sal) from emp group by deptno);



--">any",比里面最小的值要大

select * from emp 

where sal >any (select min(sal) from emp group by deptno);



--"<any",比里面最大的值要小

select * from emp 

where sal >any (select min(sal) from emp group by deptno);



--">all",比里面最大的值要大

select * from emp 

where sal >all (select min(sal) from emp group by deptno);



--"<all",比里面最小的值要小

select * from emp 

where sal <all (select min(sal) from emp group by deptno);

4.子查询可以用where后、from后、having后、select列中。

 

六、事务处理。

1.提交事务:commit;

2.回滚事务:rollback;

3.oracle事务处理的死锁。

 

七.表的管理。

1.oracle中常用数据类型
No     数据类型               描述
1      varchar、varchar2      字符串,有限长度,为255
2      number              number(n):长度为n的整数;number(m,n):小数为n,整数长度为m-n,也可以使用float;
3      date                  日期类型
4      clob                 大对象,大文本数据,一般可以存放4G文本
5      blod                 大对象,表示二进制数据,最大可以存放4G,如电影、歌曲、图片...

2.表的创建

--语法

create table 表名称(

 字段名称1 字段类型 [default 默认值],

 字段名称2 字段类型 [default 默认值],

 ...

 字段名称n 字段类型 [default 默认值]

);



--demo

create table person(

 pid varchar2(18),

 name varchar2(18),

 age varchar2(18),

 birthday varchar2(18),

 sex varchar(2) default ''

);

3.表的复制

--复制表结构及数据

create table 表名称 as (子查询);

--复制表结构:加上where 永远不成立的条件

create table 表名称 as (子查询) where 1=2;

4.表的删除

--语法

drop table 表名称;

--demo

drop table person;

5.表结构的修改(数据库程序开发中,很少有修改表结构,IBM DB2无此语法) 

--增加列语法

alter table 表名称 add

(

 列名称1 列类型 default 默认值,

 列名称2 列类型 default 默认值,

 ...

 列名称n 列类型 default 默认值

);

--demo

alter table person add

(

 address varchar(30) default '暂无地址'

);
--修改列语法

--注意:如果原数据过大,修改后的类型过小,无法修改。

alter table 表名称 modify

(

 列名称 列类型 default 默认值

);

--demo

alter table person modify

(

 name varchar(20) default '无名氏'

);

6.表的重命名(仅限Oralce中使用)

--语法

rename 旧表名称 to 新表名称;

--demo

rename person to t_person;

7.截断表(清空表数据)(仅限Oralce中使用)

--如果将person表中的一条数据delete掉,可以通过rollback回滚;

--如果要清空一张表的数据,但不需要回滚,可以立刻释放资源,需要用到截断表。

--语法

truncate table 表名称;

--demo

truncate table t_person;

 

八.约束(保证数据库中数据的完整性)

1.约束的分类(5)

主键约束:唯一的标识,本身不能为空(身份证号);

唯一约束:一张表中,只能建立一个主键约束,若其他列不希望重复,可以使用唯一约束;

检查约束:检查一个列的内容是否合法;

非空约束:字段内容不能为空;

外键约束:两张表中进行关联的约束。

2.约束的创建

1).primary key

--方式1

create table person

(

 pid varchar2(18) primary key,

 name varchar2(200),

 age number(3),

 birthdaty date,

 sex varchar2(2) default ''

);

--方式2

create table person

(

 pid varchar2(18),

 name varchar2(200),

 age number(3),

 birthdaty date,

 sex varchar2(2) default '',

 constraint person_pid_pk primary key(pid)

);

2).not null

create table person

(

 pid varchar2(18) primary key,

 name varchar2(200) not null,

 age number(3) not null,

 birthdaty date,

 sex varchar2(2) default ''

);

3).unique

--方式1

create table person

(

 pid varchar2(18) primary key,

 name varchar2(200) unique not null,

 age number(3) not null,

 birthdaty date,

 sex varchar2(2) default ''

);

--方式2

create table person

(

 pid varchar2(18),

 name varchar2(200) not null,

 age number(3) not null,

 birthdaty date,

 sex varchar2(2) default '',

 constraint person_pid_pk primary key(pid),

 constraint person_name_uk unique(name)

);

4).check

--方式1

create table person

(

 pid varchar2(18) primary key,

 name varchar2(200) unique not null,

 age number(3) not null check(age between 0 and 150),

 birthdaty date,

 sex varchar2(2) default '' check(sex in ('',''))

);

--方式2

create table person

(

 pid varchar2(18),

 name varchar2(200) not null,

 age number(3) not null,

 birthdaty date,

 sex varchar2(2) default '',

 constraint person_pid_pk primary key(pid),

 constraint person_name_uk unique(name),

 constraint person_age_ck check(age between 0 and 150),

 constraint person_sex_ck check(sex in ('',''))

);

5).foreign key

--删除子表再删除父表

--可以使用级联删除方式强制删除表

drop table person cascade constraint;
--主外键使用

create table person

(

 pid varchar2(18),

 name varchar2(200) not null,

 age number(3) not null,

 birthdaty date,

 sex varchar2(2) default '',

 constraint person_pid_pk primary key(pid),

 constraint person_name_uk unique(name),

 constraint person_age_ck check(age between 0 and 150),

 constraint person_sex_ck check(sex in ('',''))

);



create table book

(

 bid varchar2(2) primary key not null,

 bname varchar2(30) not null,

 bprice number(5,2) not null,

 pid varchar2(18),

 constraint person_book_pid_fk foreign key(bid) references person(pid)

);
--级联删除,当主表中的数据删除时,子表中的数据自动删除

create table person

(

 pid varchar2(18),

 name varchar2(200) not null,

 age number(3) not null,

 birthdaty date,

 sex varchar2(2) default '',

 constraint person_pid_pk primary key(pid),

 constraint person_name_uk unique(name),

 constraint person_age_ck check(age between 0 and 150),

 constraint person_sex_ck check(sex in ('',''))

);



create table book

(

 bid varchar2(2) primary key not null,

 bname varchar2(30) not null,

 bprice number(5,2) not null,

 pid varchar2(18),

 constraint person_book_pid_fk foreign key(bid) references person(pid) on delete cascade

);

3.约束的修改

--语法

alter table 表名称 add constraint 约束名称 约束类型(约束字段)



drop table person cascade constraint;

create table person

(

 pid varchar2(18),

 name varchar2(200) not null,

 age number(3) not null,

 birthdaty date,

 sex varchar2(2) default ''

);

alter table person add constraint person_pid_pk primary key(pid);

alter table person add constraint person_name_uk unique(name);

alter table person add constraint person_age_ck check(age between 0 and 150);

alter table person add constraint person_sex_ck check(sex in ('',''));



drop table book;

create table book

(

 bid varchar2(2) not null,

 bname varchar2(30) not null,

 bprice number(5,2) not null,

 pid varchar2(18)

);

alter table book add constraint book_bid_pk primary key(bid);

alter table book add constraint person_book_pid_fk foreign key(bid) references person(pid) on delete cascade;

4.约束的删除

alter table book drop constraint book_bid_pk;

5.伪类rownum

--查询5-10条记录

select * from (select rownum rn,empno from emp where rownum<=20) t1 where t1.rn>=5 and t1.rn<=10;

 

九、同义词

select * from scott.emp;

 

十、少用的用法

基础

数据查询语言 SELECT

数据操作语言 INSERT,DELETE,UPDATE

事务控制语言 COMMIT,ROLLBACK,SAVEPOINT

数据定义语言 CREATE,ALTER,DROP

数据控制语言 GRANT,REVOKE



一.SELECT

1.DATE类型数据默认显示格式 DD-MON-YY

TO_CHAR(,'YYYY-MM-DD') 按指定格式显示

SQL> SELECT ename,hiredate FROM emp WHERE rownum<=1;



ENAME      HIREDATE

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

SMITH      17-12月-80



SQL> SELECT ename,TO_CHAR(hiredate,'YYYY-MM-DD') FROM emp WHERE rownum<=1;



ENAME      TO_CHAR

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

SMITH      1980-12-17



SQL> SELECT ename,TO_CHAR(hiredate,'YYYY-MM-DD hh-mm-ss') FROM emp WHERE rownum<=1;



ENAME      TO_CHAR

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

SMITH      1980-12-17 12-12-00



2.处理NULL,NULL表示未知值,既不是空,也不是0

NVL(expr1,expr2)

NVL2(expr1,expr2,expr3) 9i后新特性

SQL> SELECT ename,sal,comm,sal+nvl(comm,0) as "月收入" FROM emp WHERE rownum<=3;



ENAME             SAL       COMM     月收入

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

SMITH             800                   800

ALLEN            1600        300       1900

WARD             1250        500       1750



SQL> SELECT ename,sal,comm,nvl2(comm,comm+sal,sal) as "月收入" FROM emp WHERE rownum<=3;



ENAME             SAL       COMM     月收入

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

SMITH             800                   800

ALLEN            1600        300       1900

WARD             1250        500       1750



3.使用多列排序

第一列中有重复的,第二列排序第一列中重复的数据,以此类推

SQL> SELECT ename,sal,comm FROM emp WHERE deptno=30

  2  ORDER BY sal ASC,comm DESC;



ENAME             SAL       COMM

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

JAMES             950

MARTIN           1250       1400

WARD             1250        500

TURNER           1500          0

ALLEN            1600        300

BLAKE            2850



已选择6行。



SQL> SELECT ename,sal,comm FROM emp WHERE deptno=30

  2  ORDER BY sal ASC;



ENAME             SAL       COMM

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

JAMES             950

WARD             1250        500

MARTIN           1250       1400

TURNER           1500          0

ALLEN            1600        300

BLAKE            2850



已选择6行。



4.使用非选择列排序

SQL> SELECT ename FROM emp WHERE rownum<=5 ORDER BY sal;



ENAME

----------

SMITH

WARD

MARTIN

ALLEN

JONES



5.使用列别名排序

SQL> SELECT ename,sal*12 year FROM emp WHERE rownum<=5 ORDER BY year;



ENAME            YEAR

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

SMITH            9600

WARD            15000

MARTIN          15000

ALLEN           19200

JONES           35700



6.使用列位置排序

SQL> SELECT ename,sal*12 year FROM emp WHERE rownum<=5 ORDER BY 2 DESC;



ENAME            YEAR

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

JONES           35700

ALLEN           19200

MARTIN          15000

WARD            15000

SMITH            9600



7.使用CASE表达式

SQL> SELECT ename,sal,CASE WHEN sal>3000 THEN 3 WHEN sal>2000 THEN 2 ELSE 1 END grade

  2  FROM emp

  3  WHERE deptno=10;

 

ENAME            SAL      GRADE

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

CLARK        2450.00          2

KING         5000.00          3

MILLER       1300.00          1



8.查询历史记录

SQL> SELECT ename,sal

  2  FROM emp

  3  AS OF TIMESTAMP to_timestamp('2012-07-27 15:21:00','YYYY-MM-DD HH24:MI:SS')

  4  WHERE ename='CLARK';



ENAME             SAL

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

CLARK            2450



9.使用WITH子句重用子查询

SQL> WITH summary AS(

  2  SELECT dname,SUM(sal) AS dept_total

  3  FROM emp,dept

  4  WHERE emp.deptno=dept.deptno

  5  GROUP BY dname)

  6  SELECT dname,dept_total

  7  FROM summary

  8  WHERE dept_total>(SELECT SUM(dept_total)*1/3 FROM summary);



DNAME          DEPT_TOTAL

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

RESEARCH             9375

SALES                9400

 

 

 

 

你可能感兴趣的:(Oracle SQL)