ORACLE学习笔记

   

大型数据库的重启是一件很麻烦的事情,需要很多天;像国外的某个大公司十年都没有重启数据库了;

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用户登录的

                         

                    

                    

                    


   


你可能感兴趣的:(oracle,server,Access,留言板,大型数据库)