本文共 7884 字,大约阅读时间需要 26 分钟。
left join :左连接,返回左表中所有的记录以及右表中连接字段相等的记录。
right join :右连接,返回右表中所有的记录以及左表中连接字段相等的记录。
inner join: 内连接,又叫等值连接,只返回两个表中连接字段相等的行。
full join:外连接,返回两个表中的行:left join + right join。
cross join:结果是笛卡尔积,就是第一个表的行数乘以第二个表的行数。
关键字: on
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。
在使用left jion时,on和where条件的区别如下:
1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
假设有两张表:
表1:tab2
id | size |
1 | 10 |
2 | 20 |
3 | 30 |
表2:tab2
size | name |
10 | AAA |
20 | BBB |
20 | CCC |
两条SQL:
1、select * form tab1 left join tab2 on (tab1.size = tab2.size) where tab2.name=’AAA’ 2、select * form tab1 left join tab2 on (tab1.size = tab2.size and tab2.name=’AAA’)第一条SQL的过程:
|
第二条SQL的过程:
|
其实以上结果的关键原因就是left join,right join,full join的特殊性,不管on上的条件是否为真都会返回left或right表中的记录,full则具有left和right的特性的并集。 而inner jion没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。
=======================================================
下面将举出JAVA对ORACLE数据库存储过程的调用
ConnUtils连接工具类:用来获取连接、释放资源
package com.ljq.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** * 连接工具类 * * ConnUtils类声明为final类说明此类不可以被继承 * * @author jiqinlin * */ public final class ConnUtils { private static String url = " jdbc:oracle:thin:@localhost:1521:orcl " ; private static String user = " test " ; private static String password = " test " ; /** * 说明要访问此类只能通过static或单例模式 */ private ConnUtils() { } // 注册驱动 (只做一次) static { try { Class.forName( " oracle.jdbc.driver.OracleDriver " ); } catch (ClassNotFoundException e) { throw new ExceptionInInitializerError(e); } } /** * 获取Connection对象 * * @return * @throws SQLException */ public static Connection getConnection() throws SQLException { return DriverManager.getConnection(url, user, password); } /** * 释放资源 * * @param rs * @param st * @param conn */ public static void free(ResultSet rs, Statement st, Connection conn) { try { if (rs != null ) rs.close(); } catch (SQLException e) { e.printStackTrace(); } finally { try { if (st != null ) st.close(); } catch (SQLException e) { e.printStackTrace(); } finally { if (conn != null ) try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }}
创建带出参存储过程代码:
-- 带出参存储过程 CREATE OR REPLACE PROCEDURE stu_proc(v_name OUT VARCHAR2 ) AS BEGIN SELECT o.sname INTO v_name FROM student o where o.id = 2 ; END ;
使用java调用带出参的存储过程
package com.ljq.test; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.SQLException; import java.sql.Types; public class ProceTest { public static void main(String[] args) throws Exception { Connection conn = null ; CallableStatement statement = null ; String sql = " {call stu_proc(?)} " ; try { conn = ConnUtils.getConnection(); statement = conn.prepareCall(sql); statement.registerOutParameter( 1 , Types.VARCHAR); statement.executeUpdate(); // 输出:lisi String sname = statement.getString( 1 ); System.out.println(sname); } catch (SQLException e) { e.printStackTrace(); } finally { ConnUtils.free( null , statement, conn); } }}
创建带出入参存储过程代码
-- 带出入参存储过程CREATE OR REPLACE PROCEDURE stu_proc(v_id IN NUMBER, v_name OUT VARCHAR2) ASBEGIN SELECT o.sname INTO v_name FROM student o where o.id = v_id;END;
使用JAVA调用带出入参存储过程
package com.ljq.test; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.SQLException; import java.sql.Types; public class ProceTest { public static void main(String[] args) throws Exception { Connection conn = null ; CallableStatement statement = null ; String sql = " {call stu_proc(?, ?)} " ; try { conn = ConnUtils.getConnection(); statement = conn.prepareCall(sql); statement.setInt( 1 , 1 ); statement.registerOutParameter( 2 , Types.VARCHAR); statement.executeUpdate(); // 输出:zhangsan String sname = statement.getString( 2 ); System.out.println(sname); } catch (SQLException e) { e.printStackTrace(); } finally { ConnUtils.free( null , statement, conn); } }}
转载地址:http://sfzws.baihongyu.com/