文档章节

连接查询

小强斋太
 小强斋太
发布于 2016/11/09 20:08
字数 732
阅读 4
收藏 0

连接查询

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);
		}
	}
	
}

 

本文转载自:http://www.cnblogs.com/xqzt/archive/2012/09/06/5637185.html

共有 人打赏支持
小强斋太
粉丝 0
博文 181
码字总数 0
作品 0
广州
私信 提问
mysql-数据查询语句-多表

连接查询 连接查询,是关系数据库中最主要的查询,包括等值查询、自然连接查询、非等值查询、自身连接查询、外连接查询和复合条件连接查询等。 1、等值与非等值连接查询 连接查询的where子句...

桓宇Harry
06/26
0
0
Hibernate HQL

4、HQL 1、基本查询 1、不带条件的查询 2、带条件的查询 3、通过参数进行查询 4、通过命名参数进行查询 5、查询空(null)元素 2、常用查询 1、列表查询(in ()) 2、投影查询 3、投影一个元...

pmos
2016/10/20
51
0
MYSQL学习笔记(四)查询数据

某个班级学生信息表t_grade结构和数据如下: 一、单表查询 1.查询所有字段 2.查询特定字段 3.where条件查询 4.带in关键字查询 5 .带between and关键字查询 6.带like的模糊查询 7.空值查询 8....

iborder
2016/09/05
2
0
【SQL】—多表查询的几种连接方式

前言 最近在项目中用到连接查询,连接查询是关系数据中最主要的查询,包括内连接、外连接等。通过连接运算符可以实现多个表查询。下面来复习一下。 正文 连接查询主要分为三种:内连接、外连...

zt15732625878
01/16
0
0
SQL查询的高级应用

一、 简单查询 简单的Transact-SQL查询只包括选择列表、FROM子句和WHERE子句。它们分别说明所查询列、查询的表或视图、以及搜索条件等。 例如,下面的语句查询testtable表中姓名为“张三”的...

长平狐
2013/01/06
205
0

没有更多内容

加载失败,请刷新页面

加载更多

程序员该如何把握黄金五年!

在Java业界流行着一种说法——黄金5年,就是从程序员入职时算起,前五年的工作选择直接影响整个职业生涯的职业发展和薪资走向。如何把握这五年,从一个刚入行的菜鸟蜕变成一个处事不惊的大佬...

James-
8分钟前
0
0
使用正则表达式实现网页爬虫的思路详解

网页爬虫:就是一个程序用于在互联网中获取指定规则的数据。这篇文章主要介绍了使用正则表达式实现网页爬虫的思路详解,需要的朋友可以参考下 网页爬虫:就是一个程序用于在互联网中获取指定规...

前端小攻略
47分钟前
3
0
vue中锚点的三种方法

第一种: router.js中添加 mode: 'history', srcollBehavior(to,from,savedPosition){ if(to.hash){ return {selector:to.hash } } } 组件: <template><div><ul class="li......

peakedness丶
49分钟前
2
0
记一次面试最常见的10个Redis"刁难"问题

导读:在程序员面试过程中Redis相关的知识是常被问到的话题。作为一名在互联网技术行业打击过成百上千名的资深技术面试官,本文作者总结了面试过程中经常问到的问题。十分值得一读。 Redis在...

小刀爱编程
今天
21
0
TiDB Lab 诞生记 | TiDB Hackathon 优秀项目分享

本文由红凤凰粉凤凰粉红凤凰队的成员主笔,他们的项目 TiDB Lab 在本届 TiDB Hackathon 2018 中获得了二等奖。TiDB Lab 为 TiDB 培训体系增加了一个可以动态观测 TiDB / TiKV / PD 细节的动画...

TiDB
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部