您的位置:首页 > 数据库 > Oracle

黑马程序员 OracleSQL编程

2013-05-14 22:25 309 查看
在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';
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: