黑马程序员 OracleSQL编程


在oracle中如果表达式里有一个值为null,则整个表达式为null;
如何处理null问题
nvl(comm,0)--如果comm的值为null,则用0来替代,如果不是,则保持原值
查看表结构
sql>desc 表名
添加一个字段
sql>alter table student add(classid number(2));
修改字段的长度
sql>alter table student modify(name varchar(30));
修改字段的类型/名字(不能有数据)
sql>alter table student modify(name char(30));
删除一个字段
sql>alter table student drop column sex;
修改表的名字
sql>rename student to stu;
删除表
sql>drop table student;//删除表结构和数据
sql>delete from student;//删除所有记录,表结构还在,写日志,可以恢复的,速度慢。
sql>truncate table student;//删除所有记录,表结构还在,不写日志,速度快

向表中插入数据
insert into student values('A001','张三','男','01-5月-05',10);oracle中默认的日期格式‘DD-MON-YY’
改日期的默认格式(临时生效)
sql>alter session set nls_date_formate='yyyy_mm_dd';
设置保存点(新建的保存点会把以前的保存点覆盖)
sql>savepoint aa;
回滚
sql>rollback to aa;
打开显示操作时间的开关
sql>set timing on;
自己复制自己的数据插入表中
sql>insert into user(id,name,pwd) select * from user;
使用列的别名
nvl(comm,0)--如果comm的值为null,则用0来替代,如果不是,则保持原值
sql>select ename "姓名",sal*12+nvl(comm,0)*13 as "年工资" from emp;
如何取消重复行
sql>select distinct deptno,job from emp;
查找1982.1.1后入职的员工
sql>select ename,hiredate from emp where hiredate>'1-1月-1982';

查询工资高于500或是岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为J
sql>select * from emp where (sal>500 or job='MANAGER') and ename like 'J%';
查询员工信息按照部门编号升序排序而员工的入职时间降序排序
sql>select * from emp order by deptno,hiredate desc;
使用列的别名排序
sql>select ename,sal*12 "年薪" from emp order by "年薪" asc;
group by(分组查询的字段要出现在select里)
--查询每个部门的平均工资和最高工资
sql>select avg(sal),max(sal),deptno from emp group by deptno
--查询每个部门的每个岗位的品均工资和最高工资
sql>select avg(sal),max(sal),deptno,job from emp group by deptno,job;
分组函数只能出现在选择列、having、order by字句中。
如果在select语句中同时包含有group by,having、order by 那么他们的顺序就是group by、having、order by;

自连接查询
sql>select worker.ename,boss.ename from emp worker,emp boss where worker.mgr=boss.empno;
多行子查询
--查询和部门10的工作相同的雇员的名字,岗位,工资,部门号;
sql>select * from emp where job in (select distinct job from emp where deptno=30);
在多行子查询中 使用all操作符:
--查询工资比30号部门的所有元员工的工资高的员工。
sql>select ename, sal,deptno from emp where sal>all(select sal from emp where deptno=10);
或:sql>select ename,sal,deptno from emp where sal>(
seledt max(sal) from emp where deptno=30
);
多列子查询:
--查询与smith的部门和岗位完全相同的所有雇员:
sql>seelct * from emp where (deptno,job)=(select deptno,job from emp where ename='SMITH');
sql>update emp set(job,sal,comm)=(select job,sal,comm from emp where ename='SMITH') where ename='SCOTT';
分页:
sql>select * from (select a1.*,rownum rn from(select * from emp) a1 where rownum<=3) where rn>=1;
to_date函数:
eg:to_date('1988-12-12','yyyy-mm-dd')或to_date('1988/12/12','yyyy/mm/dd');
提交(commit)后回滚无效。
用查询结果创建新表
sql>create table mytable (id,name,sal,job,deptno) as select 
empno,ename,sal,job,deptno from emp;
合并查询(比and和or速度快):
(1)union该操作符用于取两个结果的并集。即会自动去掉结果集中的重复行
sql>select ename,sal,job from emp where sal>2500
union
select ename,sal,job from emp where job='MANAGER';
(2)unino all 不会去掉重复行
(3)intersect取交集
(4)minus取两个集合的差集,它只会显示存在第一个集合中,而不存在第二个集合中的数据。
select ename,sal,job from emp where sal>2500
minus
select ename,sal,job from emp where job='MANAGER';

 

 

 

 

 

 

 

 

 

posted @ 2013-05-14 22:25  xiewen3410  阅读(131)  评论(0编辑  收藏  举报