oracle的简单学习

  1. 云栖社区>
  2. 博客>
  3. 正文

oracle的简单学习

技术小胖子 2017-11-09 15:02:00 浏览461
展开阅读全文

1.获得当前的日期时间

select sysdate from dual;


2.获取当前系统的日期和时间

select to_char(sysdate,'yyyy-MM-dd hh:mm:ss') from dual;


3.MONTHS_BETWEEN(date1,date2):返回date1和date2之间的月份数量,结果为正数或负数

select months_between(sysdate,to_date('2013-01-01','yyyy-MM-dd')) from dual;


4.add_MONTHS(date,n):向date加上n个月,n必须是正整数

select add_months(sysdate,2) from dual;


5.next_day(date,char):求出date之后一周内某天char的日期,char是一个有效表示星期几的数字或字符串

select next_day(sysdate,7) from dual;


6.last_day(date):求出date所在月的最后一天

select last_day(sysdate) from dual;



一:等值查询

1.输出每人所在的部门及部门所在地:

select ename,dname,loc from emp,dept where emp.deptno = dept.deptno;


2.查询deptno为10的员工及部门所在地:

select ename,dname,loc from emp,dept where emp.deptno = dept.deptno and dept.deptno = 10;



二:外部连接

【外部连接运算符(+)只能放在连接条件表达式的一侧】

【外部连接条件中不能使用in操作符,也不能用or运算符与其他运算符相连】


1.显示员工对应的部门,并显示所有部门:

select ename,dept.dname,emp.empno,dept.deptno from emp,dept where emp.deptno(+) = dept.deptno;


2.显示员工对应的部门,并显示所有的员工:

select ename,dept.dname,emp.empno,dept.deptno from emp,dept where emp.deptno = dept.deptno(+);



三:标准连接查询

1.内连接:select ename,dname from emp inner join dept on emp.deptno = dept.deptno;


2.左外连接: select ename,dname from emp left join dept on emp.deptno = dept.deptno;


3.右外连接:select ename,dname from emp right join dept on emp.deptno = dept.deptno;



四:子查询

1.显示比id为7655销售额高的记录:

select * from emp where sal > (select sal from emp where empno = 7566);


2.显示和ID为7369相同工作并且工资大于7876的员工信息:

select ename from emp where job = (select job from emp where empno = 7369) and sal > (select sal from emp where empno = 7876);


3.显示工资最低的员工信息:

select * from emp where sal = (select min(sal) from emp);


说明:

1.子查询要使用括号括起来

2.将子查询放在比较运算符的右边

3.不要在子查询中使用order by字句,select语句中只能有一个order by字句,并且它只能是主select语句的最后一个字句


五:获取序列信息

select sequence_name,max_value,min_value,increment_by,last_number from user_sequences;

1.sequence_name:序列名称

2.max_value:最大的值

3.min_value:最小的值

4.increment_by:增长量

5.last_number:使用的或缓存的最后一个序列号,一般大于缓冲区中的最后一个值


六:查询索引

select * from user_indexes;


七:分页

分页查询格式:


SELECT * FROM ( SELECT A.*, ROWNUM RN

FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40 ) WHERE RN >= 21


其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句。ROWNUM <= 40和RN >= 21控制分页查询的每页的范围。



上面给出的这个分页查询语句,在大多数情况拥有较高的效率。分页的目的就是控制输出结果集大小,将结果尽快的返回。在上面的分页查询语句中,这种考虑主要体现在WHERE ROWNUM <= 40这句上。



选择第21到40条记录存在两种方法,一种是上面例子中展示的在查询的第二层通过ROWNUM <= 40来控制最大值,在查询的最外层控制最小值。而另一种方式是去掉查询第二层的WHERE ROWNUM <= 40语句,在查询的最外层控制分页的最小值和最大值。这是,查询语句如下:



SELECT * FROM ( SELECT A.*, ROWNUM RN

FROM (SELECT * FROM TABLE_NAME) A ) WHERE RN BETWEEN 21 AND 40


对比这两种写法,绝大多数的情况下,第一个查询的效率比第二个高得多。



这是由于CBO优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。对于第一个查询语句,第二层的查询条件WHERE ROWNUM <= 40就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。



而第二个查询语句,由于查询条件BETWEEN 21 AND 40是存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层(即使推到最内层也没有意义,因为最内层查询不知道RN代表什么)。因此,对于第二个查询语句,Oracle最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成,显然这个效率要比第一个查询低得多。



eg.

select * from (select A.*,rownum rn from (select * from tbl_pay_taobaoshop) A where rownum < 40 ) where rn > 21


select * from (select A.*,rownum rn from (select * from tbl_pay_taobaoshop) A ) where rn between 21 and 40



==================================================================

修改字段存储范围:

alter table GAME_BILLING.TBL_JDSHOP_ITEM modify item_tsc NVARCHAR2(50);




     本文转自韩立伟 51CTO博客,原文链接http://blog.51cto.com/hanchaohan/1300613:,如需转载请自行联系原作者


网友评论

登录后评论
0/500
评论
技术小胖子
+ 关注