大型数据库的重启是一件很麻烦的事情,需要很多天;像国外的某个大公司十年都没有重启数据库了;
Oracle数据库是靠插件收费的;插件解决了很多问题;
Oracle必备的是Oracle官方文档
Temp一定要作为独立的文件,要不然系统越运行越慢
数据库:小型 :access
中型:mysql ;sql server ;相对大型数据库而言的
大型数据库:sybase;oracle;db2
选择使用哪种数据库考虑以下方面:
1.项目的规模;
2.用户多少;
3.成本;
4.安全性;
如果选择小型:负载量小 100人内;比如留言板,信息系统;成本在千元内;对安全性要求不高;
如果选择中型:日访问量5000-150000;成本在万元内;比如商务网站;
如果选择大型:负载 海量数据库。处理海量数据比较:sybase<oracle<db2;安全性很高,比较昂贵。
iso镜像文件如何用?打开虚拟光驱,关联到镜像文件所在地址,就生成了该镜像光驱,然后点击该镜像光驱就可以了
如何打开服务界面:选择计算机---右击---管理---在服务和应用程序中
Oracle核心服务:TNSListener和OracleServiceMYORA1(后面数据库服务后面的大写单词就是定义的服务名,视频中
定义的全局数据库名是:myora1,所以这里的就是大写的)
Oracle中,创建了一个数据库,就会在服务中开启一个以该数据库名大写结尾的Oracle服务;也就是创建了一个Oracle实例
先启动服务,再启动Listener,
pl/sql developer 属于第三方软件,主要用于开发,测试,优化oracle pl/sql的存储过程;此软件oracle不带,需要单独安装;
1. 连接用户:conn [用户名/密码]
举例:conn scott/tiger;//则当前用户为scott
conn system/manager;//执行的过程是先从第一次连接的scott中退出,然后连接system;如果密码错误,则显示未登陆
2. disc [connect] 断开连接
3.passw[ord] 用于修改用户的密码;如果想要修改其他用户的密码,需要用sys/system登陆;
举例:假设现在登陆上了 scott/tiger;
passw
更改SCOTT的口令
旧口令:tiger
新口令:123
重新键入新口令:123
口令已更改
4.show user 显示当前用户名
5.exit 断开与数据库的连接,同时退出
文件操作命令
1.start和@ 说明:运行sql脚本
举例:sql>@ d:\a.sql; 或者 sql>START d:\a.sql;
2.edit 说明:该命令可以编辑指定的sql脚本
举例:sql>edit d:\a.sql;
3.spool 说明:该命令可以将sql*plus屏幕上的内容输出到指定文件中去。
举例:sql>spool d:\b.sql;
sql>select * from emp;
sql>spool off;
这时,第二行语句执行的结果,在第三行执行完之后将输出到第一行指定的文件路径中去
交互式命令
1.& 说明:可以替代变量,而该变量在执行时,需要用户输入
举例:sql>select * from emp where job='&job'//当执行后,会弹出一个窗口让输入job的值,毫无价值的
显示和设置环境变量
1.linesize 说明:设置显示行的宽度,默认是80个字符
如果需要在屏幕上显示内容多些,可以设置
举例:sql>show linesize;
sql>set linesize 90;
sql>select * from emp;//该行输出结果行内容之间的宽度将以90个字符宽度间隔;
2.pagesize 说明:设置每页显示的行数目,默认是14,用法和linesize一样
举例:sql>set pagesize 5;
sql>select * from emp;//该行执行后,5行与下5行之间以空白行为间隔,然后列名一行,下面再几行数据
注意:上面的两个功能在打印报表方面有帮助
Oracle密码创建必须以字母开头,否则创建密码不成功;
scott是一个普通用户,用其登录后,不能修改别的用户的密码
举例:sql>create user xiaoming identified by m123;//会显示权限不足
用超级用户登录:sys或system
SQL>conn system/manager;
已连接
SQL>create user xiaoming identified by m123;
用户已创建
给用户修改密码:
1.如果给自己修改密码可以直接使用下面语句:
sql> password 用户名
2.如果给别人修改密码则需要具有dba的权限,或是拥有alter user的系统权限:
sql>alter user 用户名 identified by 新密码
删除用户:
一般以dba的身份去删除某个用户,自己删除自己是不允许的
创建新用户:
创建的新用户是没有任何权限的,甚至连登录的数据库的权限都没有,需要为其指定相应的权限;
给一个用户赋权限使用命令grant,回收权限使用命令revoke;注意不要轻易将dba权限赋给
普通用户;resource权限赋给谁,谁就有了在任何地方建表的权限;
举例:SQL>conn system/manager;
已连接
SQL>grant connect to xiaoming
系统权限:用户对数据库的相关权限。
对象权限:用户对其它用户的数据对象(表,视图,过程等)操作的权限。
假设有一个人,他对一块地有所有权,这时他想将这块土地租给别人,则将土地租给别人是他的权限;
这时,他把土地租给了李四,则李四就有了使用这块土地的权限;只有主人允许了,他才有权限;
当然主人也可以收回土地撤销李四的权限;李四有了土地使用权限后,他也可以将土地使用权限给别人;
别人的土地,不是李四说他有权限就有权限的,他需要主人的允许,主人的允许就是授权的过程。
将查询用户存在的某表的权限赋给某用户:
SQL>conn system/manager;
已连接
SQL>create user xiaohong identified by m123;
用户已创建
SQL>grant connect to xiaohong;
授权成功。
SQL>conn xiaoming/m1234;
已连接。
SQL>grant select on xiaoming.temp to xiaohong ;//登录xiaoming后,将小明的temp表的查询权限授给xiaohong;
授权成功。
撤销权限:
SQL>conn scott/m123;
已连接。
SQL>revoke select on emp from xiaoming;
撤销成功。
使用profile管理用户口令:
profile是口令限制,资源限制的命令集合,当建立数据库时,oracle会自动建立名称为default的profile.
当建立用户没有指定profile选项,那oracle就会将default分配给用户。
1.账户锁定
指定该账户(用户)登录时最多可以输入密码次数,也可以指定用户锁定的时间(天)一般用dba的身份
去执行该命令。
举例:指定tea这个用户最多只能尝试3次登录,锁定时间为2天
sql>create profile lock_account limit failed_login_attempts 3 password_lock_time 2;//lock_account这个位置的名字随便起
sql>alter user tea profile lock_account;//tea 受lock_account文件约束
只要将系统时间改了,锁定就消失了,但是oracle数据库一般都是远程访问的,不可能是本机访问的。
2.给账户(用户)解锁
sql>alter user tea account unlock;
3.终止口令
为了让用户定期修改密码可以使用终止口令的指令来完成,同样这个命令也需要dba身份来操作。
举例:给用户tea创建一个profile文件,要求该用户每隔10天要修改自家的登录密码,宽限期为2天;
sql>create profile myprofile limit password_life_time 10 password_grace_time 2;
sql>alter user tea profile myprofile//tea用户受myprofile约束
口令历史:
如果希望用户在修改密码时,不能使用以前使用过的密码,可使用口令历史,这样oracle就会将口令
修改的信息存放到数据字典中,这样当用户修改密码时,oracle就会对新旧密码进行比较,发现新旧
密码一样时,就提示用户重新输入密码。
1)建立profile
sql>create profile password_history limit
password_life_time 10 password_grace_time 2
password_reuse_time 10;//password_reuse_time 指定口令可重用时间即10天后就可以重用
2)分配给某个用户
删除profile:sql>drop profile password_history;//该文件一删除,用该文件约束的用户将通通被释放。
在真实项目里,图片和声音和视频都放在一个文件夹下,在数据库里放这些文件的路径;如果保密性要求高的话
可以将他们放在数据库里。
建表:
sql>create table student(
xh number(4),
xm varchar2(20),
sex char(2),
birthday date,
sal number(7,2)//最大7位,小数点后2位
);
1.添加一个字段
sql>alter table student add(classid number(2));
2.修改字段的长度
sql>alter table student modify (xm varchar2(30));
3.修改字段的类型或是名字
sql>alter table student modify(xm char(30));
4.删除一个字段
sql>alter table student drop column sal;
5.修改表的名字
sql>rename student to stu;
6.删除表
sql>drop table student;
7.oracle默认的日期是:11-12月-1997,其中汉字月不能少,否则就报错;
sql>alter session set nls_date_format='yyyy-mm-dd';//只有用这行sql语句指定了日期格式,表的日期就会不是默认的了
sql>insert into student values(2,'小明','男','1997-12-11',2345.6);
8.查询birthday为null的行
sql>select * from student where birthday is null;
9.查询birthday不是null的行
sql>select * from student where birthday is not null;
10.改一个字段
sql>update student set sex='女' where xh='A001';
11.修改多个字段
sql>update student set sex='男',birthday='1980-04-01' where xh='A001';
12.删除数据
sql>delete from student//表结构还在,表的记录全部删除了
sql>drop table student;//删除表的结构和数据
sql>delete from student where xh='A001';//删除一条记录
sql>truncate table student;//删除表中记录,表结构还在,不写日志,无法找回删除的记录,速度快
13.查看表结构
sql>desc dept;
14.查询所有列
sql>select * from dept;
15.查询指定列
sql>select ename,sal,job,deptno from emp;
16.取消重复行
sql>select distinct deptno,job from emp;//把字段deptno,job相同的行合并成一行
额外:数据库操作中,添加和删除花费的时间不是太多,查询花的时间是最多的,尤其是数据库文件非常大的情况下;
Oracle内容区分大小写;字段不区分大小写,语句关键字不区分大小写;
17.使用列的别名
sql>select ename "姓名",sal*12 as "年收入" from emp;
18.sql>select sal*13,ename from emp;//执行后,原为sal列字段名将变成sal*13,这一列的值将都分别乘以13;
19.如果奖金为空,不是null
sql>select sal*13+comm*13 as "年工资",ename,comm from emp;//as 不要也行;这句sql语句执行后,年工资就为空,因为奖金为空的;
如何解决这个问题?用nvl()函数;
sql>select sal*13+nvl(comm,0)*13 as "年工资",ename,comm from emp;//nvl(comm,0)前一个参数是字段,如果这个字段有null值就用0代替,也就是第二个参数代替;
如果不为null,则使用原值计算;
20查询1982年1月1日后入职的员工:
注意:修改日期格式只是临时生效的,也就是说字段里是'1987-1-1',但是查询还是用'1-1月-1987'
sql>select ename,hiredate from emp where hiredate>'1-1月-1987';
21.使用模糊查询like
% 表示任意0到多个字符
_ 表示单个字符
举例:显示员工首字母为大S的员工姓名和工资
sql>select ename,sal from emp where ename like 'S%';
举例:显示员工姓名第三个字符为大写O的所有员工的姓名和工资
sql>select ename,sal from emp where ename like '__O%';
22.查询部门在123,234,456的员工的信息
sql>select * from emp where empno in (123,234,456);
23.查询没有上级的员工
sql>select * from emp where mgr is null;
24.查询工资高于500或是岗位为MANAGER的雇员,同时姓名首写字母为大写J
sql>select * from emp where (sal>500 or job='MANAGER') and ename like 'J%';
25.使用order by
升序:从上往下逐渐增大;降序:从上往下逐渐减小;
根据雇员薪水从高到底显示雇员信息:
sql>select * from emp order by sal desc;
根据雇员薪水从低到高显示雇员信息:
sql>select * from emp order by sal asc;
26.按照部门号升序而雇员的工资降序排列:
sql>select * from emp order by deptno asc, sal desc;//asc可以省略,默认是升序排列的
解析:按照多个条件排序的话,假设有3个部门,9个人分别属于三个部门;则部门号小的是一个组在最上面,部门号次之的
在中间一个组,最下面的是部门号最大的一个组,接着组里的人又按照工资降序排列;
27.显示所有员工中最高工资和最低工资
sql>select max(sal),min(sal) from emp;
显示最高工资的雇员名:
sql>select ename,sal from emp where sal=(select max(sal) from emp);
28.显示所有员工的平均工资和工资总和
sql>select avg(sal),sum(sal) from emp;
显示工资高于平均工资的员工信息
sql>select * from emp where sal>(select avg(sal)from emp) as a;
29.计算共有多少员工
sql>select count(*) from emp;
30.group by 和 having子句
group by 用于对查询的结果分组统计,
having 子句用于限制分组显示结果。
显示每个部门的平均工资和最高工资
sql>select avg(sal),max(sal),deptno from emp //注意这里deptno必须存在,否则按其分组就没有了
order by deptno;//整个sql语句,先按order by 分组,再按组分别求最大和平均值
显示每个部门的每种岗位的平均工资和最高工资
sql>select avg(sal),max(sal),deptno,job from emp
group by deptno,job;//先按照deptno分组,然后在每组里按照job再分组,然后根据job组计算平均工资和最高工资
显示平均工资低于2000的部门号和它的平均工资
sql>select deptno,avg(sal) from emp
group by deptno
having avg(sal)<2000;//先按照deptno分组,然后计算出每组的平均值,最后平均值小于2000的满足条件;先group by,然后函数,最后having
31.如果在select 语句中同时包含group by,having,order by;则
先group by,再having,最后order by
32.显示雇员名,雇员工资以及所在部门的名字
sql>select e.ename,e.sal,d.dname from emp e,dept d
where e.deptno=d.deptno;
33.显示部门号为10的部门名、员工名和工资
sql>select e.ename,e.sal,x.dname from emp e,dept x where e.deptno=x.deptno and e.deptno=10;
34.显示各个员工的姓名,工资,及其工资的级别(等级一(700-1200);等级2(1201-1400);等级3(1401-2000);等级4(2001-3000);等级5(3001-9999))
sql>select a1.ename,a1.sal,a2.grade from emp a1,salgrade a2 where a1.sal between a2.losal and a2.hisal;
//根据between and 的值自动判断其所在的等级
35.自连接:也就是说将自身再当做另外一张表与自身来连接;
EMPNO ENAME MGR
7902 FORD 7566
7566 JONES 7839
显示一个员工的上司
sql>select worker.ename,boss.ename from emp worker,emp boss where worker.mgr=boss.empno;
显示FORD的上司
sql>select worker.ename,boss.ename from emp worker,emp boss where worker.mgr=boss.empno and worker.ename='FORD';
36.子查询
单行子查询是指只返回一行数据的子查询语句,可以直接用等号
显示与SMITH在同一部门的所有员工
sql>select * from emp where deptno=(select deptno from emp where ename='SMITH');
sql语句是从左往右执行的;如果有可以快速过滤大量数据的可以放在左边;
多行子查询:多行子查询指返回多行数据的子查询,用 in
查询和部门10的工作相同的雇员的名字、岗位、工资、部门号
sql>select * from emp where job in (
select distinct job from emp where deptno=10
)
在多行子查询中使用all操作符
显示工资比部门30的所有员工的工资高的员工的姓名、工资和部门号
1.sql> select ename,sal,deptno from emp where sal>
all(select sal from emp where deptno=30);
2.sql>select enaame,sal,deptno from emp where sal>(select max(sal) ftom emp where deptno=30);//特点变成了单行子查询
该行执行效率要比第一个用all的效率高
在多行子查询中使用 any操作符
显示工资比部门30的任意一个员工的工资高的员工的姓名、工资和部门号
1.sql>select ename,sal,dept from emp where sal>any (select sal from emp where deptno=30);
2.sql>select ename,sal,dept from emp where sal>(select max(sal) from emp where deptno=30);
多列子查询:指查询返回多个列数据的子查询语句
查询与smith的部门和岗位完全相同的所有雇员
sql>select * from emp where (deptno,job)=(select deptno,job from emp where ename='SMITH');
37.在from 子句中使用子查询
显示高于自己部门平均工资的员工信息
1.查询出各个部门的平均工资和部门号
select deptno,avg(sal) mysal from emp group by deptno;
2.把上面的查询看做是一张子表
sql>select a2.ename,a2.sal,a2.deptno,a1.mysal from emp a2,(select deptno,avg(sal) mysal from emp group by deptno)a1
where a2.deptno=a1.deptno and a2.sal>a1.mysal;//在from 后的子查询必须有一个别名,而且还不能用as添加
38.分页查询
//oracle分页一共有三种方式
1.rownum分页[分页效率比第二种差,比第三种好]
选出6到10行的数据
sql>select * from (select a1.*,rownum rn from (select * from emp) a1 where rownum<=10) where rn>=6;//a1.*代表将子查询中的所有列取出来,rownum 自动分配一个行号,rn是行号列的列名
里面用rownum,外面的用rn不能是别的,就像是一个公式
假设现在只需要两列的数据,则只需要修改最里层的,也就是select * from emp
1.指定查询列
sql>select * from (select a1.*,rownum rn from (select ename,sal from emp) a1 where rownum<=10) where rn>=6;
2.需要排序取
sql>select * from (select a1.*,rownum rn from (select ename,sal from emp order by sal) a1 where rownum<=10) where rn>=6;
rownum一次select执行只能用一次,下面语句执行不通过:
sql>select a1.*,rownum rn from (select * from emp) a1 where rownum<=10 and rownum>=6;
2.根据ROWID分页[分页执行效率最高]
sql>select * from t_xiaoxi where rowid in (select rid from (select rownum rn,rid from
(select rowid rid,cid from
t_xiaoxi order by cid desc ) where rownum<10000) where rn>9980)
order by cid desc;
3.按分析函数分页[分页执行效率最差]
sql>select * from (select t.*,row_number() over(order by cid desc) rk from
t_xiaoxi t) where rk<10000 and rk>9980;
39.用查询结果创建新表
这个命令是一种快捷的建表方法;
sql>create table mytable (id,name,sal,job,deptno)
as select empno,ename,sal,job,deptno from emp;
40.java程序如何操作oracle
写一个ShowEmp.java,分页显示emp表的用户信息
1.如何使用jdbc_odbc桥连接方式
public class TestOra{
public static void mian(String[] args){
try{
1.加载驱动
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
2.得到连接
Connection ct=DriverManager.getConnection("jdbc:odbc:testsp","scott","m123");//三个问号 是数据源,所以必须先配置数据源,jdbc:odbc不允许远程连接,因为这里没有写Ip地址,解决办法是用jdbc
//如何配置数据源?
控制面板-管理工具-ODBC-添加-选中oracle-完成-取一个数据源名称-TNS Service Name-下拉选择自己的oracle数据库-点击Test Connection 测试一下
Statement sm=ct.createStatement();
ResultSet rs=sm.executeQuery("select * from emp");
while(rs.next()){
System.out.println("用户名"+rs.getString(2));
}
}catch(Exception e){e.printstackTrace();}
}
}
2.使用jdbc连接Oracle,Oracle驱动包-classes12.jar,如何导入Oracle驱动包?
项目右击-属性-Java Build Path-Add JARs-找到Oracle驱动包解压路径
public static void mian(String[] args){
try{
//1.加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
//2.得到连接
Connection ct=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:myoral","scott","m123");
Statement sm=ct.createStatement();
ResultSet rs=sm.executeQuery("select * from emp");
while(rs.next()){
System.out.println("用户名"+rs.getString(2));
}
}catch(Exception e){e.printStackTrace();}
}
41.当使用values子句时,一次只能插入一行数据,当使用子查询插入数据时,一条insert语句可以插入大量的数据。
当处理行迁移或者装载外部表的数据到数据库时,可以使用子查询来插入数据。(insert + 子查询=大量数据插入)
有一张表有大量数据,现在新建一个表,然后将存在数据的表的一部分数据导入到新建表中
sql>create table kkk (myId number(4),myname varchar2(50),myDept number(5));
kkk表被创建
sql>insert into kkk (myId,muname,mydept) select empno,ename,deptno from emp
where deptno=10;//这样表emp中部门号是10的员工信息就插入到了kkk表中了
42.使用update语句更新数据时,既可以使用表达式或者数值直接修改数据,也可以使用子查询修改数据
希望员工scott的岗位、工资、补助与smith员工一样
sql>update emp set (job,sal,comm)=(select job,sal,comm from emp where eame='SMITH')
where ename='SCOTT';
43.事务?事务用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml语句要么全部成功,要么全部失败
如:网上转账就是典型的要用事务来处理,用以保证数据的一致性。(dml语句也就是增加、删除、修改语句)
保存点是因为回退而存在的,也就是在某一时刻保存,保存点是没有限制的;
sql>savepoint a1;
Savepoint 被创建
sql>delete from emp where emptno=7782;
sql>savepoint a2;
Savepoint 被创建
sql>delete from emp where emptno=7799;
假设现在emptno=7799的不能删除,则
sql>rollback to a2;
回滚完成
现在emptno=7782的也操作错误了
sql>rollback to a1;
回滚完成
(当操作数据库时,首先上来创建一个保存点)
44.提交事务
执行commit语句可以提交事务,当执行了commit语句后,会确认事务的变化、结束事务、删除保存点、释放锁,
当使用commit语句结束事务后,其它会话将可以查看到事务变化后的新数据。
sql>savepoint a1;
Savepoint 被创建
sql>delete from emp where empno=9996;
sql>commit;
sql>rollback to a1;
ORA-01086:从未创建保留点'a1'
45.事务的几个重要操作
1.设置保存点:sql>savepoint a;
2.取消部分事务:sql>rollback to a;
3.取消全部事务:sql>rollback;
46.java程序中使用事务
public static void mian(String[] args){
Connection ct=null;
try{
1.加载驱动
Class.forName("oracle.jdbc.driver.OracleDriver");
2.得到连接
ct=DriverManager.getConnection(
"jdbc:oracle:thin:@127.0.0.1:1521:myoral","scott","m123"
);
Statement sm=ct.createStatement();
//加入事务作为整体
ct.setAutoCommit(false);
sm.executeUpdate("update emp set sal=sal-100 where ename='SCOTT'");
int i=7/0;
sm.executeUpdate("update emp set sal=sal+100 where ename='SMITH'");
ct.commit();//事务提交
sm.close();
ct.close();
}cathc(Exception e){
//如果发生异常就回滚
try{
ct.rollback();
}catch(Exception e){e.printStackTrace();}
e.printStackTrace();}
}
47.只读事务
只读事务是指只允许执行查询的操作,而不允许执行任何其它dml操作事务,
使用只读事务可以确保用户只能取得某时间点的数据。假定机票代售点每天18点
开始统计今天的销售情况,这时可以使用只读事务,在设置了只读事务后,尽管
其它会话可能会提交新的事务,但是只读事务将不会取得最新数据的变化,从而
可以保证取得特定时间点的数据信息。
设置只读事务:set transaction read only
sql>set transaction read only
事务处理集。
[用scott账户登录,然后在其emp表添加一条记录,然后在里面查询有18条记录]
sql>seiect * from scott.emp;//这个查询结果只有17条记录
48.字符函数
字符函数是oracle中最常用的函数
1.lower(char):将字符串转化为小写的格式
将所有员工的名字按小写的方式显示
sql>select lower(ename) from emp;//将字段名放到括号里就可以了
2. upper(char):将字符串转化为大写的格式
将所有员工的名字按大写的方式显示
sql>select upper(ename) from emp;
3.length(char):返回字符串的长度
显示所有员工姓名正好为5个字符的员工的姓名
sql>select ename from emp where length(ename)=5;
4.substr(char,m,n):取字符串的子串//从m位开始取,取n个
显示所有员工姓名的前三个字符
sql>select substr(ename,1,3) from emp;//从第一个字符开发取,取三个
5. 以首字母大写,其余字母小写的方式显示所有员工的姓名
1.首字母大写:select upper(substr(ename,1,1)) from emp
2.其余字母小写:select lower(substr(ename,2,length(ename)-1)) from emp;
3.合并:sql>select upper(substr(ename,1,1)) || lower(substr(ename,2,length(ename)-1)) from emp;
6.replace(char1,search_string,replace_string)
第一个参数是字段,第二个参数是字段数据里的字符,第三个是将字符修改成第三个参数的内容
sql>select replace(ename,'A','我') from emp;
49.数学函数
对数字的处理,在财务系统或银行系统中用的最多,不同的处理方法,对财务报表有不同的结果。
1.round(n,[m])
该函数用于四舍五入,如果没有m,则四舍五入到整数;如果m为正,则四舍五入保留m位小数
;如果m为负,则四舍五入到小数点的m位前。
sql>select round(sal,1),sal from emp where ename='shunping';
round(39.45,1)则为39.5
round(39.45,-1)则为40;5->4->9
2.trunc(n,[m])
该函数用于截取数字。如果没有m,就截去小数部分;如果m是正数就截去到小数点的m位后;
如果m是负数,则截去到小数点的前m位
trunc(45.56):45
trunc(45.56,1):45.06;//截去部分变为0
trunc(45.56,-1):45.00;//6->5
3.mod(m,n):取余数
sql>select mod(10,2) from dual;//dual是哑原表,也就是一个形式表,用来测试的
4.floor(n):返回小于或等于n的最大整数
sql>select floor(comm) from emp where ename='SMITH';
原本58.6,现在变成58.
5.ceil(n):返回大于或等于n的最小整数
sql>select ceil(comm) from emp where ename='SMITH';
原本58.6,现在变成59
50.日期函数:日期函数用于处理date类型的数据
1.sysdate:该函数返回系统时间
sql>select sysdate from dual;//dual是虚拟表
2.add_months(d,n)//d+n
3.last_day(d):返回指定日期所在月份的最后一天
举例:
1.查找已经入职8个月多的员工
sql>select * from emp where sysdate>add_months(hiredate,8);//注意这句sql不够严谨
2.显示满10年服务年限的员工的姓名和受雇日期
sql>select * from emp where sysdate>=add_months(hiredate,12*10);
3.对于每个员工,显示其加入公司的天数
sql>select trunc(sysdate-hiredate) "入职天数" from emp;//系统时间减去雇佣时间就是天数,得到的天数有小数,因为考虑到小时了,用函数截断后就得到完整天数了
4.找出各月倒数第3天受雇的所有员工
sql>select hiredate,ename from emp where last_day(hiredate)-2=hiredate;
51.转换函数
转换函数用于将数据类型从一种转为另外一种。
1.to_char()
yy:2015->15
yyyy:2015
mm:8月->08
dd:30号->30
hh24:晚上8点->20
hh12:晚上8点->08
mi、ss->显示分钟\秒
9:显示数字
0:显示数字,如果位数不足,用0补齐
.:指定位置显示小数点
,:在指定位置显示逗号
$:在数字前加美元
L:显示本地货币符号,中国自动显示人民币
C:数字前加国际货币符号
G:在指定位置显示组分隔符
D:在指定位置显示小数点符号
sql>select ename,to_char(hiredate,'yyyy-mm-dd hh24:mi:ss') from emp;
//显示 2015-3-14 00:00:00
sql>select sal,to_char(sal,"L99,999.99") from emp;//假设工资为9876,则RMB9,876.00
案例: 1.显示1990年雇佣的员工
sql>select * from emp where to_char(hiredate,'yyyy')=1990;
2.to_date:
用于将字符串转换成date类型的数据
52.系统函数
1.sys_context
1.terminal:当前会话客户所对应的终端的标识符
2.language:语言
3.db_name:当前数据库名称
4.nls_date_format:当前会话客户所对应的日期格式
5.session_user:当前会话客户所对应的数据库用户名
6.current_schema:当前会话客户所对应的默认方案名(方案名和用户名一致)
7.host:返回数据库所在主机的名称
举例:
sql>select sys_context('userenv','host') from dual;//dual是哑原表,也就是虚拟表
第一个参数是固定的,只要在第二个参数里填就可以了
sys是oracle权限最高的用户
sys必须以as sysdba 或as sysoper 形式登录,不能以normal方式登录数据库
system如果正常登录,它其实就是一个普通的dba用户,但是如果以as sysdba登录,其结果实际上
它是作为sys用户登录的