连接查询
1、内连=join=inner join
2、外连接(左连接/右连接)
left join(左联接)返回包括左表中的所有记录和右表中联结字段相等的记录
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
inner join(等值连接) 只返回两个表中联结字段相等的行
---------------------------------------------------------------------------------------------------------------------------------------------------------
一、例子1:结果以红色表示
表A记录如下:
A_PersonID |
PersonName |
1 |
张三 |
2 |
李四 |
3 |
王五 |
4 |
赵六 |
5 |
周七 |
表B记录如下:
B_PersonID |
Love_Fruit |
1 |
香蕉 |
2 |
苹果 |
3 |
橘子 |
4 |
梨 |
8 |
桃 |
--------------------------------------------
1.left join
select A.PersonName , B.Love_Fruit from A left join B on A.A_PersonID= B.B_PersonID
A_PersonID |
PersonName |
B_PersonID |
Love_Fruit |
1 |
张三 |
1 |
香蕉 |
2 |
李四 |
2 |
苹果 |
3 |
王五 |
3 |
橘子 |
4 |
赵六 |
4 |
梨 |
5 |
周七 |
null |
null |
(所影响的行数为 5行)结果说明:left join是以A表的记录为基础的,A可以看成左表,B可以看成右表,left join是以左表为准的.换句话说,左表(A)的记录将会全部表示出来,而右表(B)只会显示符合搜索条件的记录(例子中为: A.A_PersonID= B.B_PersonID).B表记录不足的地方均为NULL.
2.right join
select A.PersonName , B.Love_Fruit from A right join B on A.A_PersonID= B.B_PersonID
结果如下:(所影响的行数为 5行)
A_PersonID |
PersonName |
B_PersonID |
Love_Fruit |
1 |
张三 |
1 |
香蕉 |
2 |
李四 |
2 |
苹果 |
3 |
王五 |
3 |
橘子 |
4 |
赵六 |
4 |
梨 |
null |
null |
8 |
桃 |
结果说明:仔细观察一下,就会发现,和left join的结果刚好相反,这次是以右表(B)为基础的,A表不足的地方用NULL填充.
3.inner join
select A.PersonName , B.Love_Fruit from A inner join B on A.A_PersonID= B.B_PersonID
A_PersonID |
PersonName |
B_PersonID |
Love_Fruit |
1 |
张三 |
1 |
香蕉 |
2 |
李四 |
2 |
苹果 |
3 |
王五 |
3 |
橘子 |
4 |
赵六 |
4 |
梨 |
结果说明:很明显,这里只显示出了 A.aID = B.bID的记录.这说明inner join并不以谁为基础,它只显示符合条件的记录.
-------------------------------------------------------------------------------------------------------------------------------------------
例子2:
以下一hibernate为例子,搜索条件就没有了,hibernate的映射文件做了这项工作
左连接: select c.name, s.name from Student s left join c.students s
右连接: select c.name, s.name from Student s left join c.students
JoinQueryTest.java
package com.ncepu.hibernate; import java.util.Iterator; import java.util.List; import org.hibernate.Session; import junit.framework.TestCase; /** * 连接查询 * @author Administrator * */ public class JoinQueryTest extends TestCase { public void testQuery1() { Session session = null; try { session = HibernateUtils.getSession(); session.beginTransaction(); //List students = session.createQuery("select c.name, s.name from Student s join s.classes c").list(); List students = session.createQuery("select c.name, s.name from Student s inner join s.classes c").list(); for (Iterator iter=students.iterator(); iter.hasNext();) { Object[] obj = (Object[])iter.next(); System.out.println(obj[0] + "," + obj[1]); } session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } public void testQuery2() { Session session = null; try { session = HibernateUtils.getSession(); session.beginTransaction(); List students = session.createQuery("select c.name, s.name from Classes c left join c.students s").list(); for (Iterator iter=students.iterator(); iter.hasNext();) { Object[] obj = (Object[])iter.next(); System.out.println(obj[0] + "," + obj[1]); } session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } public void testQuery3() { Session session = null; try { session = HibernateUtils.getSession(); session.beginTransaction(); List students = session.createQuery("select c.name, s.name from Classes c right join c.students s").list(); for (Iterator iter=students.iterator(); iter.hasNext();) { Object[] obj = (Object[])iter.next(); System.out.println(obj[0] + "," + obj[1]); } session.getTransaction().commit(); }catch(Exception e) { e.printStackTrace(); session.getTransaction().rollback(); }finally { HibernateUtils.closeSession(session); } } }