简单的查询语句:
(1)查看表结构
desc dept;
(2)查询所有列
select * from dept;
(3)查询指定列
select ename,sal,job,deptno from emp;
(4)取消重复行
select distinct deptno,job from emp;
注:select 语句不区分大小写,但是where中的内容区分大小写。
eg:set timing on; 打开显示操作时间的开关
(5)使用算数表达式
select sal*12,name from emp;
eg:sal*12 name 即为列名字,可以为列取别名
select sal*12 "年工资",name from emp;
select sal*12+comm*12 "年工资",name from emp; 用此方法,若comm为null,则整个表达式的值为Null
(5)用nvl函数处理空值null
select sal*12+nvl(comm,0)*12 "年工资",name,comm from emp;
若comm的值为null,则使用0代替,若comm的值不为null,则使用其本值。
(6)比较时间
where hiredate > '1-1月-1982';
where的多个条件用 and 分开
(7)like操作符
%:表示任意0到多个字符
_:表示任意单个字符
(8)在where条件中使用in,批量处理查询,速度快
select * from emp where empno in (123,234,456);
(9)使用 is null
(10)使用 order by
select * from emp order by sal desc; //asc默认
多个条件:select * from emp order by depno asc, sal desc; //部门升序,部门内部工资降序,即部门号是外围,为主,工资顺序是内部,为从。
(11)使用列的别名排序
select name, sal+nvl(comm,0) [as] "年薪" from emp order by "年薪";
(12)分页查询
复杂查询
数据分组的总结:
多表查询
子查询:
嵌入在其他sql语句中的select语句。
单行子查询:子查询语句返回一行数据。
多行子查询:子查询语句返回多行数据。
子查询语句返回多行:select distincet job from emp where deptno=10;
总的:select * from emp where jobin(select distincet job from emp where deptno=10);
多行子查询中的all连接符:
select ename, sal, deptno from emp where sal > all ( select sal from emp where deptno = 30);
相当于:select ename, sal, deptno from emp where sal > ( select max(sal) from emp where deptno = 30);
多行子查询中的any连接符:select ename, sal, deptno from emp where sal > any ( select sal from emp where deptno = 30);
相当于:select ename, sal, deptno from emp where sal > ( select min(sal) from emp where deptno = 30);
多列子查询:上述子查询返回的都是一列,即子查询返回的是多列。
select deptno,job from emp where ename = 'SMITH';
总:select * from emp where (deptno,job)=(select deptno,job from emp where ename = 'SMITH');
在from子句中使用子查询:
将查询结果当做子表,取别名,来进行查询。(内嵌试图——将子查询当做表使用,给表取别名不能加as)
select a2.name , a2.sal, a2.deptno, a1.mysal from emp a2,(select deptno,avg(sal) mysal from emp group by deptno ) a1 where a2.deptno = a1.deptno and a1.sal >a1.mysal;
当在from子句中使用子查询时,该子查询会被作为一个视图来对待,因此叫做内嵌试图,当在from子句中使用子查询时,必须给子查询指定别名。
用查询结果创建新表:
create table mytable (id,name,sal,job) as select empno,name,sal,job from emp;
分页查询:
1.rownum分页
step1:子查询 select * from emp;
step2: 显示rownum(Oracle分配的)
select al.*,rownum rn from (select * from emp) al;
step3:按rownum挑选几条记录(rownum 一次用一下,使用二分机制。一次砍一半)
select al.*,rownum rn from (select * from emp) al where rownum <=10;
select * from (select al.*,rownum rn from (select * from emp) al where rownum <=10) a1 where rn>=6;
所有的改动改最里面的视图即可,如指定查询列,排序
select * from (select al.*,rownum rn from (select name,sal from emp) al where rownum <=10) a1 where rn>=6;
2.rowId分(效率最高)
3.分析函数(效率低)
合并查询:union,union all, intersect , minus
(1)union 该操作用于取得两个结果集的并集。使用该操作符时,会自动去重。
select name,sal,job from emp where sal > 2500 unionselect name,sal,job from emp where job="manager";
(2)union all 不会取消重复行
(3)intersect 交集
(4)minus 差集,存在第一个集合中,不在第二个集合中。
创建新的数据库:
(1)Oracle提供的工具向导。
database configuration assistant[数据库配置助手dbca]
(2)手工步骤