文档章节

连接查询

小强斋太
 小强斋太
发布于 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
MySQL学习笔记-子查询和连接

MySQL学习笔记-子查询和连接 使客户端进入gbk编码方式显示: mysql> SET NAMES gbk; 1.子查询 子查询的定义: 子查询(Subquery)是指出现在其他SQL语句内的SELECT子句。 例如: SELECT * FRO...

谢育政
06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

python:关于读取文件的指定行的问题

先来造一个文件:就叫做 test.txt吧,内容是下面这个样子: 表头1,数据12,数据23,数据34,数据45,数据56,数据67,数据7 那么我们并不打算把这个表头给读出来 怎么办呢? 先来打开文...

Oh_really
7分钟前
0
0
Rails 用现代 Rails 逃离单页面应用 “兔子洞”

在工作共总是觉得turbolinks非常爽,但是却总是被说成是过时的技术,大家都喜欢spa,哪怕不用的spa的人也是禁用掉的多,找不到很好的理由劝说别人使用,这篇文章说的很到位,或者说至少是牛人...

wmzsonic
12分钟前
0
0
Hive 分布式搭建,Spark集成Hive记录

本帖详细介绍搭建步骤,仅仅记录自己搭建过程以及采坑经历。 前提环境: Hadoop集群 版本2.7.2 Spark集群 版本2.1.0 Linux版本 Centos7 准备搭建 MySql版本5.5.61 ,Hive-2.1.0 去官网下载M...

我爱春天的毛毛雨
14分钟前
0
0
打包QML程序

1、windeployqt执行路径(D:\Qt\5.12.0\msvc2017_64\bin)加入到PATH中 2、使用Qt自带的命令行交互 Command 终端(Qt 5.12.0 64-bit for Desktop (MSVC 2017))切换到 Release 编译成功的exe...

渣渣曦
51分钟前
4
0
优秀互联网高级测试工程师应该具备的能力

概述 在之前写的互联网高级测试工程师至少具备的能力一文中,提到了测试工程师至少具备的能力,但是并没有提到优秀测试工程师应该具备的能力,下文简单的谈一谈。当然这些全部都是我的个人理...

Sam哥哥聊技术
55分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部