Oracle学习笔记(六)

《子查询的妙用》
当使用values字句时,一次能插入一行数据,当使用子查询插入数据时,一条insert语句可以插入大量的数据。当处理行迁移或者装载外部表的数据到数据库时,可以使用子查询来插入数据。
用子查询插入数据:
例子:新建一张表,把10号部门的信息插入表中。
create table kkk(
  myid number(4),
  myname varchar(50),
  myDept number(5)
)
insert into kkk (myid,myname,myDept) select empno,ename,deptno from emp where deptno=10;
select * from kkk;
用子查询更新数据:
例子:希望员工scott的岗位、工资、补助与smith员工的一样。
update emp set (job,sal,comm)=(select job,sal,comm from emp where ename='smith') where ename='scott';
-------------
事务:用于保证数据的一致性,它由一组相关的dml语句(增,删,改)组成.
提交事务:commit;
回退事务:先设置保存点(可以设置多个保存点),savepoint a;回滚 rollback to a;commit后,保存点消失。如果没有commit,但exit了,则它会自动提交。
事务的几个重要操作:设置保存点 savepoint a,取消部分事务rollback to a,取消全部事务 rollback
《java程序中如何使用事务》
例子:从一个账户减去10,在另一个账户加10
package yzh;
import java.sql.*;
public class OracleConnect2 {
 
 public static void main(String[] args) {
  Connection con=null;
  Statement st=null;
  ResultSet rs=null;
  try{
   System.out.println("++++++++++++++++++");
   Class.forName("oracle.jdbc.driver.OracleDriver");
   con=DriverManager.getConnection("jdbc:oracle:thin:@WWW-EB6353B8576:1521:orcl","system","yzh");
   //加入事务处理
   con.setAutoCommit(false);
   
      st=con.createStatement();
      st.executeUpdate("update emp set sal=sal-10 where ename='heizi'");
   //加入异常
   //int i=7/0;
      st.executeUpdate("update emp set sal=sal+10 where ename='xiaohei'");
   //提交事务
   con.commit();
  }catch(Exception e){
      try{
     con.rollback();
   }catch(Exception ee){
     ee.printStackTrace();
   }
   e.printStackTrace();
  }finally{
   try{
    rs.close();
    st.close();
    con.close();
   }catch(Exception ex){
    ex.printStackTrace();
   }
  }
 }

}
------------
只读事务:只允许执行查询的操作,而不允许执行任何其他dml操作的事务,使用它可以确保用户只能取得某时间点的数据。
设置只读事务:set transaction read only
-------------
《Sql函数的使用》
字符函数:
lower(char) :将字符串转化为小写格式//select lower(name) from student;
upper(char) :将字符串转化为大写格式//select upper(name) from student;
length(char):返回字符串长度//select * from student where length(name)=5;
substr(char,m,n):取字符串的子串,m代表从第几位取,n代表取几个字符//select substr(name,2,3) from student;//
首字母大写,其余小写:
第一步:select upper(substr(name,1,1)) from student;
第二步:select lower(substr(name,2,length(name)-1)) from student;
合并:select upper(substr(name,1,1))||lower(substr(name,2,length(name)-1)) from student;
instr(char1,char2,[,n[,m]]):取子串在字符串中的位置
replace(char1,search_string,replace_string):替换
数学函数:
cos,cosh,exp,ln,log,sin,sinh,sqrt,tan,tanh,acos,asin,atan,round
常用的有
round(n,[m]),用于执行四舍五入,如果省去m,则四舍五入到整数;如果m是正数,则四舍五入到小数点的m位后;如果m是负数,则四舍五入到小数点的m位前
trunc(n,[m]),用于截取数字。如果省掉m,就截掉小数部分,如果m是正数,则截取到小数点m位后,如果m是负数,则截取到小数点的前m位
mod(m,n),取模
floor(n),返回小于或是等于n的最大整数
ceil(n),返回大于或是等于n的最小整数
abs(n),返回绝对值
power(m,n),返回m的n次幂
日期函数:
默认情况下日期格式是dd-mon-yy 即12-5月-88
sysdate:该函数返回系统时间
add_months(d,n)
last_day(d):返回指定日期所在月份的最后一天
例子:查询入职8个多月的员工信息
select * from emp where sysdate>add_months(hiredate,8);//add_months(hiredate,8);表示雇佣时间加上八个月时间
显示满十年服务年限的员工的姓名和受雇日期
select * from emp where sysdate>add_months(hiredate,8);//add_months(hiredate,12*10);
对于每个员工,显示其加入公司的天数
select trunc(sysdate-hiredate) "入职天数" from emp ;
找出各月倒数第三天受雇的所有员工
select * from emp where  last_day(hiredate)-2=hiredate;
转换函数:
Oracle可以进行隐含的数据类型的转换,但是它并不适应所有情况。
to_char()
日期是否可以显示为时/分/秒?
select ename,to_char(hiredate,'yyyy-mm-dd hh24:mi:ss') from emp;
薪水是否可以显示指定的货币符号?
//已知:sal number(7,2)
select ename,to_char(sal,'L99999.99') from emp;//L表示本地货币符号
select ename,to_char(sal,'L99,999.99') from emp;
select ename,to_char(sal,'$99,999.99') from emp;//美金符号
显示1980年入职的所有员工?
select * from emp where to_char(hiredate,'yyyy')=1980;
显示所有12月份入职的员工?
select * from emp where to_char(hiredate,'mm')=12;
to_date()函数:
系统函数:
sys_context
参数:
terminal:当前会话客户所对应的终端的标识符
language:语言
db_name:当前数据库名称
nls_date_format:当前会话客户所对应的日期格式
session_user:当前会话客户所对应的数据库用户名
current_schema:当前会话客户所对应的默认方案名
host:返回数据库所在主机的名称
例子:select sys_context('USERENV','db_name')from dual;
select sys_context('USERENV','language')from dual;
select sys_context('USERENV','session_user')from dual;
select sys_context('USERENV','current_schema')from dual;
方案名跟用户名一样的.Oracle以方案的方式组织数据对象。方案中有视图、函数、表等。

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值