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);