学习过最简单的几种语句了,也安装过了几次数据库,本来在看那个高级编程的,但是还有一本入门的没看,就先看了再说,
多练习,熟悉掌握最基本的操作。
我以前登录的时候都是用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