jdbc连接oracle、oracle函数、高级查询

一、课程目标

【掌握】jdbc连接Oracle
【理解】Oracle函数
【理解】Oracle高级查询

二、Oarcle的连接

1、导入jar包

2、注册驱动

3、创建连接

4、准备sql进行预编译

5、执行处理结果集

6、关闭连接释放资源

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class OracleJDBC {
    public static void main(String[] args) throws Exception {
//        1、导入jar包
//        2、注册驱动
        Class.forName("oracle.jdbc.driver.OracleDriver");
//        3、创建连接
        Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "ahx", "123456");
//        4、准备sql进行预编译
//        String sql="update dept set loc=? where deptno=? ";
        String sql = "select * from dept ";
        PreparedStatement ps = con.prepareStatement(sql);
//        ps.setObject(1,"test");
//        ps.setObject(2,5);
//        int i = ps.executeUpdate();
        ResultSet rs = ps.executeQuery();
//        5、执行处理结果集
        while (rs.next()) {
            for (int i = 1; i <= 4; i++) {
                System.out.print(rs.getObject(i) + " ");
            }
            System.out.println();
        }

//        6、关闭连接释放资源
        rs.close();
        ps.close();
        con.close();
    }
}

三、Oracle函数

3.1 字符串函数

在这里插入图片描述

initcap将首字母转换为大写

select initcap('hello') from dual;

在这里插入图片描述

lower将所有字母转换为小写

select lower('HELLO') from dual

在这里插入图片描述

upper将所有字母转换为大写

select upper('hello') from dual

在这里插入图片描述

ltrim将执行字符串左侧删除

select ltrim('hello','he') from dual

在这里插入图片描述

ltrim将执行字符串右侧删除

select rtrim('hello','llo') from dual

在这里插入图片描述

translate按位进行替换

select translate('hello','e','1') from dual

在这里插入图片描述

在这里插入图片描述

查找字符串出现位置

从1开始

select instr('hello','e') from dual

在这里插入图片描述

substr截取字符串

第一个数值为起始位置,第二个数字为截取长度

select substr('hello',3,2) from dual

在这里插入图片描述

concat拼接字符串

select concat('hello',' world!') from dual

在这里插入图片描述

replace替换字符串

将操作字符串中所有的指定字符替换为另一个字符串

select replace('hello','ll','r') from dual

在这里插入图片描述

3.2 日期函数

在这里插入图片描述

months_between返回两个月之间的月份

如果不满一个月返回小数

select months_between(birthday2,birthday1) from test;

在这里插入图片描述

add_months在指定日期月份添加指定月

select add_months(birthday1,-1) from test;

在这里插入图片描述

next_day获取指定日期后的第一个指定星期

select next_day (birthday1,'fri') from test;

在这里插入图片描述

last_day获取指定日期当月最后一天

select last_day (birthday2) from test;

在这里插入图片描述

round对指定日期四舍五入

按照year、month、day分别对日期进行四色五入

select round (birthday2,'day') from test;

在这里插入图片描述

trunc截取日期

只获取指定year的数据

在这里插入图片描述

3.3 转换函数

to_number(数值类型的字符):将字符转换为数值

select to_number('1234124214') from dual;

to_char(数值或者是日期):将数值或者日期转换为字符

可以设置转换的样式进行转换

select birthday1,substr(to_char(birthday1,'yyyy-MM-dd'),1,4)  from test;

to_date(‘要转的字符’,‘日期格式’)函数将字符转换为日期

select to_date('2020-01-01','yyyy-mm-dd') from dual;

在这里插入图片描述

3.4 数字函数

在这里插入图片描述

dbms_random.value(1,100)随机数函数

select ceil(dbms_random.value(1,100)) from dual;

四、Oracle高级查询

4.1 多表查询

内连接: inner join 只展示两个表向关联的数据

--等值连接
select  e.empno,e.ename,e.sal,d.dname from emp e, dept d where e.deptno=d.deptno;
--内连接
select  e.empno,e.ename,e.sal,d.dname from emp e inner join dept d on(e.deptno=d.deptno)

左连接: left join 左表展示所有数据,右表只展现向关联的数据

select  e.empno,e.ename,e.sal,d.dname from emp e left join dept d on(e.deptno=d.deptno)
select  e.empno,e.ename,e.sal,d.dname from emp e ,dept d  where e.deptno=d.deptno(+);

右连接: right join 右表展示所有数据,左表只展现向关联的数据

select  e.empno,e.ename,e.sal,d.dname from emp e right join dept d on(e.deptno=d.deptno)
select  e.empno,e.ename,e.sal,d.dname from emp e ,dept d where e.deptno(+)=d.deptno;

交叉连接: cross join 笛卡尔乘积

select * from emp,dept
select  e.empno,e.ename,e.sal,d.dname from emp e cross join dept d 

全连接: full join

select  e.empno,e.ename,e.sal,d.dname from emp e full join dept d on(e.deptno=d.deptno)

注意:如果进行分组查询,只能查询分组字段与聚合函数字段,因为其余字段在进行聚合后都没有实际的意义

4.2 子查询

就是将其他sql查询的结果当做当前sql使用的数据的值继续查询

如果返回的是单个数值可以直接使用=进行判断,如果返回的是多行数据一般使用in或者not in 进行范围操作

--查询平均工资>2000,的部门编号,部门名称,平均工资
--平均工资>2000的部门编号

--查询平均工资>2000的部门编号的部门编号和平均工资
select deptno,avg(sal)from emp group by deptno having avg(sal)>2000
 
select d1.deptno,d1.dname,d2.savg from dept d1 inner join 
       (select deptno,avg(sal) savg from emp group by deptno having avg(sal)>2000) d2 --将查询的结果看成一张表进行连接查询
       on (d1.deptno=d2.deptno)      
 
--查询平均工资>2000,的部门编号,部门名称
--查询平均工资>2000的部门编号
select deptno from emp group by deptno having avg(sal)>2000

select deptno,dname from dept where deptno in(select deptno from emp group by deptno having avg(sal)>2000)
--查询平均工资>2000,的部门编号,部门名称,平均工资
select d.deptno,d.dname,avg(e.sal) from emp e,dept d where e.deptno=d.deptno 
group by d.deptno,d.dname having avg(e.sal)>2000

4.3 分页查询

分页的原因如下:

提高性能,一次查20个,比一次查20000个性能肯定更好;另外如果数据量很大,一次性将内容都查询出来,查询出来的结果是放在内存里面的,内存没有这么大

不需要这么多数据,如新闻,一般人可能只看最近前20条;如果我们将后面的也都查询出来了,就是浪费

展现层面的考虑:如果一次展现太多的数据,不管是排版,还是美观上都不好

在oracle不能使用limit关键字对结果集分集分割,但是oracle提供了rownum伪列操作,对每个表中的数据创建了一个伪列用于标识行在当前表中的数据位置(行号)

rownum:是一个伪列,它会根据返回的记录生成一个序列化的数字。可以使用ROWNUM列返回查询结果集中前N条记录

在进行分页查询时,可以使用关联查询或子查询的形式获取伪列与实际数据的关系之后通过between进行分页操作

由于rownum是伪列所以不能直接通过添加进行使用,所以需要先将数据与伪列查询出来当做临时表继续查询

select e2.* from (select rownum rn, e.* from 表名 e) e2 where e2.rn>0 and e2.rn<=5

注意:在oracle中表名起别名时不能使用as 但是在对列起别名时可以

分页的语法

select e2.* from (select rownum rn, e.* from 表名 e) e2 where e2.rn>(page-1)*pagenum and e2.rn<=pagenum*page
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!对于Oracle JDBC调用函数,可以按照以下步骤进行操作: 1. 导入必要的库:首先,确保您已经导入了Oracle JDBC驱动程序的相关库文件。 2. 创建数据库连接:使用JDBC连接字符串和凭据创建一个数据库连接。例如: ```java String url = "jdbc:oracle:thin:@localhost:1521:XE"; String username = "your_username"; String password = "your_password"; Connection conn = DriverManager.getConnection(url, username, password); ``` 3. 准备调用函数的SQL语句:使用带有函数名和参数的SQL语句准备一个CallableStatement对象。例如: ```java String sql = "{ ? = call your_function(?, ?) }"; CallableStatement cstmt = conn.prepareCall(sql); ``` 4. 设置输入参数:如果函数有输入参数,使用set方法为每个参数设置值。例如: ```java cstmt.setString(2, "input_value1"); cstmt.setInt(3, 123); ``` 5. 注册输出参数:如果函数有输出参数,使用registerOutParameter方法注册每个输出参数的类型。例如: ```java cstmt.registerOutParameter(1, Types.INTEGER); ``` 6. 执行函数调用:使用execute方法执行函数调用。例如: ```java cstmt.execute(); ``` 7. 获取输出结果:如果函数有输出参数,可以使用get方法获取每个输出参数的值。例如: ```java int outputValue = cstmt.getInt(1); ``` 8. 关闭连接和语句:最后,记得关闭CallableStatement对象和数据库连接。 ```java cstmt.close(); conn.close(); ``` 请注意,上述代码中的参数索引可能需要根据您的具体情况进行调整。另外,您需要根据实际情况替换代码中的数据库连接字符串、用户名、密码、函数名称和参数类型等信息。 希望以上信息对您有所帮助!如果您有任何进一步的问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值