Oracle学习记录 六 又一本学习资料练习

学习过最简单的几种语句了,也安装过了几次数据库,本来在看那个高级编程的,但是还有一本入门的没看,就先看了再说,

多练习,熟悉掌握最基本的操作。

  1. 我以前登录的时候都是用conn回车,然后再输入密码,这个文档第一个就介绍了另一种登录方法。

conn scott/xx

这样就直接登录了,/前是用户名,/后是密码

conn sys/xx as sysdba

这个就是用管理员登录

2. 然后是把刚才输入的sql保存成文件用.sql后缀

select * from emp;

save /home/oracle/sql/1.sql;

这样就把这个文件保存到了这个路径下,打开1.sql就可以看到上面那个指令了。

如果想重新保存一个别的语句,还想在这个文件,就用替换

save /home/oracle/sql/1.sql replace;

如果要运行文件中的语句,可以这样

@ /home/oracle/sql/1.sql;

这样就运行了。

3. 然后是用户下的一些操作

显示当前用户

show user;

显示这个用户下所有表

select * from tab;

显示其中一个表的结构

describe emp;

或者

desc emp;

在这个用户下查看别的用户的表,前面要加上那个用户的名用点分开

select * from oe.orders;

当然了,你必须有查看别人表的权限才行,一般用sys来查看别的都可以,这里要是用scott就看不了。

4. 一些基本的练习,基于表scott.emp的

每个员工的奖金和工资的和

select ename, sal+comm from emp;

这里有一个问题,就是奖金为null的,得不出来结果。需要解决一下。

这里使用NVL()这个函数

select ename, nvl(sal+comm, sal) from emp;

这个意思就是如果sal+comm为null,则返回sal,如果不为null就返回sal+comm,如果都为null就返回null


要不说得多练习,多找东西看呢,现在又发现一种写法

select ename, sal+nvl(comm,0) from emp;    这是我在练习下一章的时候看到的,回来补充一下。


找出部门10中既不是'MANAGER'也不是'CLERK',并且工资大于2000的员工

select ename from emp

where deptno=10 and job not in ('MANAGER', 'CLERK') and sal>2000;


找出什么工作有奖金

select distinct job from emp

where comm is not null and comm>0;


下面开始函数练习

单行函数 之 字符函数

这里要用到dual这个虚拟表了,相关介绍看这个

http://www.cnblogs.com/qiangqiang/archive/2010/10/15/1852229.html

select upper('aaaa') from dual;

把aaaa全变大写

比如:

select * from emp where ename=upper('smith');

相当于

select * from emp where ename='SMITH';

当然还有都变成小写的lower

select lower('FFF') from dual;

还有首字母大写,比如弄人名的时候

select initcap(ename) from emp;

下面又是那个连接的了concat和||

select concat(ename, job) from emp;

select (ename || ' ' || job) from emp;

计算字符串长度

select ename, length(ename) from emp;

输出子串

select ename, substr(ename, 2, 2) from emp;

替换字符

select ename, replace(ename, 'S', 'SS') from emp;

查找子串位置

select instr('hello world', 'or') from emp;

结果是or所在的位置索引

还可以设置从哪开始查找,并且第几次找到的

select instr('hello world or and', 'or', 6, 2) from emp;

这就是从第6个字符开始,第二次遇到的位置值


lpad和rpad是限制字符长度,并且不足的用特定符号补齐

select lpad(ename, 8, '*') from emp;

select rpad(ename, 8, '*') from emp;


去掉边上的头尾的空格trim ltrim rtrim

select trim('    ddd    ') from dual;

select ltrim('     ddd   ') from dual;

select rtrim('     ddd   ') from dual;


四舍五入函数round

select round(454,-2) from dual;

select round(454.3456, 2) from dual;

第二个参数是负,就是正数从第几位四舍五入

第二个参数是正,就是保留几们小数,后面四舍五入


求余mod

select mod(3,4) from dual;

select mod(4,3) from dual;


截断函数trunc和round相似,不过不进行四舍五入

select trunc(455666, -2) from dual;

select trunc(45.6666, 2) from dual;

http://database.51cto.com/art/201004/197703.htm


计算两个日期之间的月数months_between

select months_between(sysdate, hiredate) from emp;

这就可以用上上面的round了

select round(months_between(sysdate,hiredate),0) from emp;

http://blog.sina.com.cn/s/blog_63c5e4a80100o7pl.html


给日期加上月数,得到新的日期

select add_months(sysdate, 2) from dual;

select add_months(sysdate, -2) from dual;

http://blog.sina.com.cn/s/blog_4cbadf5a0100fafh.html


一个给定日期的下一个指定日期

select next_day(sysdate, 'sunday') from dual;

当前日期的下一个周日

http://blog.csdn.net/chenjinlin1/article/details/6582761

不过这个文章里一个问题,他说什么返回的都是这周的周期几,那是因为就是要返回这个,并不是说要返回下一周的周几


得到月的最后一天last_day

select last_day(sysdate) from dual;

http://www.360sdn.com/oracle/2013/0615/401.html





你可能感兴趣的:(Oracle学习记录 六 又一本学习资料练习)