连表查询的介绍

1、连表查询的原因

(1)如果查询结果不在一个表中,在多个表中,那就需要将表关联,进行连表查询。

(2)连表查询大多数都作用在外键得基础上。---表与表之间有关联。

2.1表与表之间存在的关系

(1)一对多:在多的一方添加外键列

(2)多对多:需要创建一个中间表,该表中至少有两个外键列

2.2连表查询

2.3内连接

 

内连接演示---结果都是一样,只是语法不同。看个人习惯用哪个?
1.查询每一个员工的姓名,及关联的部门的名称〔隐式内连接实现)

2.查询每一个员工的姓名,及关联的部门的名称〔显式内连接实现)

-- 隐式查询 select 列名.... from 表1,表2 where 连表得条件。
-- 连表查询时,如果不使用连表条件则出现笛卡尔集。
-- 所谓笛卡尔集 就是A表中每一条记录关联B中中得每条记录
1.查询每一个员工的姓名,及关联的部门的名称〔隐式内连接实现)
select * from tb_emp,tb_dept where tb_emp.dept_id=tb_dept.id;
 -- 如果表的名字很长 可以为表起别名
select * from tb_emp e, tb_dept d where e.dept_id=d.id;
 

-- 显示连接: A表 inner join B表 on 连表条件。 
2.查询每一个员工的姓名,及关联的部门的名称〔显式内连接实现)
select * from tb_emp  inner join tb_dept on tb_emp.dept_id=tb_dept.id;
select * from tb_emp e inner join tb_dept d on e.dept_id=d.id;

-- 上面的 inner可以省略。
select * from tb_emp e  join tb_dept d on e.dept_id=d.id;

2.4、外连接

 

外连接演示
--1.查询emp表的所有数据, 和对应的部门信息(左外连接)
--2.查询dept表的所有数据,和对应的员工信息(右外连接)

-- 语法: select 查询列集 from A表 left join B表 on 连表条件
-- 1.查询emp表的所有数据, 和对应的部门信息(左外连接)
select * from tb_emp e left outer join tb_dept d on e.dept_id = d.id;
select * from tb_emp e left join tb_dept d on e.dept_id=d.id;

-- 2.查询dept表的所有数据,和对应的员工信息(右外连接)
select * from tb_emp e right join tb_dept d on e.dept_id=d.id;

2.5、自联查询

自己和自己相连接查询。
select * from A表 join A表 on 连表条件。

自连接
(1)查询员工及其所属领导的名字。  
(2)查询所有员工 emp及其领导的名字emp ,如果员工没有领导,也需要查询出来

-- 1.查询员工及其所属领导的名字。你要查询的结果再一张表中,但是还不能使用单表查询得到结果。
select a.name,b.name from tb_emp a join tb_emp b on a.managerid=b.id;
 
-- 2.查询所有员工 emp及其领导的名字emp ,如果员工没有领导,也需要查询出来
select a.name,b.name from tb_emp a left join tb_emp b on a.managerid=b.id;

3、子查询---嵌套查询

一个查询的结果 作为另一个查询的条件 或者 临时表。

-- 查询市场部的员工信息-----
-- 子查询返回的结果一列一条记录。 这个时候可以用=
-- “=”后只能跟一个where条件,in后可以跟多个
select * from tb_emp where dept_id=(select id from tb_dept where name='市场部')

-- 查询市场部和研发部员工的信息。in 
 -- -- 查询市场部和研发部员工的信息。
   -- a) 查询市场部和研发部的编号
	 select id from tb_dept where name in('市场部','研发部')

   -- b) 再员工表中根据部门编号查询员工信息
	 select * from tb_emp where dept_id in (select id from tb_dept where name in('市场部','研发部'))


-- 查询在“方东白”入职之后的员工信息
select * from tb_emp where entrydate>(select entrydate from tb_emp where name='方东白')

-- -- 查询比财务部所有人工资都高的员工信息。
  a)求出财务部中最高的工资。
	select max(salary) from tb_emp e join tb_dept d on e.dept_id=d.id where d.name='财务部'
	
	b) 根据财务部最高工资查询其他员工信息
	select * from tb_emp where salary>(	select max(salary) from tb_emp e join tb_dept d on e.dept_id=d.id where d.name='财务部')

4、组合查询

多个查询的结果 组合到一起。
sql union sql --->把这两条sql查询的结果组合到一起。如果有重复记录则合并成一条。
sql union all sql--->把这两条sql查询的结果组合到一起。如果有重复记录,不合并。

注意: 这两条sql返回的字段必须一样。

 

select name from tb_emp where salary>8000
	UNION 
	select * from tb_emp where age>40;

总结:  

1.内连接---inner join  on
2.外连接---left join   on     right join  on
3.自连接---
4.子查询
5.组合查询---sql union  sql     union all 

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MyBatis-Plus 提供了多种方式进行连表查询,这里介绍其中两种方式: 1. 使用 @TableField 注解进行连表查询 在实体类中使用 @TableField 注解标识外键字段,同时使用 @TableField(exist=false) 指定该字段为非数据库字段,然后在查询时使用 Wrapper 进行连表查询,例如: ```java // User 实体类 @Data public class User { private Long id; private String name; private Integer age; private String email; @TableField("dept_id") private Long deptId; // 外键字段,对应 Dept 表的 id } // Dept 实体类 @Data public class Dept { private Long id; private String name; } // 查询操作 QueryWrapper<User> wrapper = new QueryWrapper<>(); wrapper.eq("user.id", 1); // 限定查询条件 wrapper.eq("dept.name", "IT"); // 连表查询条件 wrapper.select("user.*", "dept.name as dept_name"); // 查询结果字段 wrapper.leftJoin("dept", "user.dept_id = dept.id"); // 左连接查询 List<User> userList = userMapper.selectList(wrapper); ``` 2. 使用 LambdaWrapper 进行连表查询 LambdaWrapper 是 MyBatis-Plus 提供的一种函数式查询方式,可以更加直观地进行连表查询,例如: ```java // 查询操作 LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(User::getId, 1) // 限定查询条件 .eq(Dept::getName, "IT") // 连表查询条件 .select(User.class, info -> !info.getColumn().equals("dept_id")) // 查询结果字段 .leftJoin(Dept.class, User::getDeptId, Dept::getId); // 左连接查询 List<User> userList = userMapper.selectList(wrapper); ``` 以上两种方式都可以进行多表查询,只需要在查询条件和连接查询的表中添加相应的查询条件和连接条件即可。 ### 回答2: MyBatis-Plus是一款轻量级、功能强大的Java持久层框架,它在MyBatis的基础上进行了扩展,提供了更多便捷的特性。在MyBatis-Plus中进行连表查询,可以通过使用实体类的关联注解和条件构造器来实现。 首先,我们需要在每个涉及到外键的实体类中使用注解来建立关联,并在属性上指定对应的关联关系。比如使用@OneToOne、@OneToMany、@ManyToOne、@ManyToMany等注解来建立一对一、一对多、多对一、多对多的关系。 然后,我们可以使用MyBatis-Plus提供的条件构造器来构建复杂的查询条件。条件构造器提供了很多方法,比如eq、ne、ge、le、like等,可以方便地拼接查询条件。在连表查询中,我们可以通过条件构造器来指定关联查询的条件,比如使用eq方法来指定两个实体类的关联字段相等。 最后,使用MyBatis-Plus提供的查询方法,比如selectList、selectPage等来执行查询操作。在查询方法中,可以通过指定参数来传递条件构造器对象,从而实现连表查询操作。查询结果会返回一个包含所有查询数据的List或Page对象,可以根据需要进行处理和展示。 总结来说,MyBatis-Plus可以通过实体类的关联注解和条件构造器来实现连表查询。关联注解用于建立实体类之间的关联关系,条件构造器用于构建复杂的查询条件。使用MyBatis-Plus提供的查询方法可以执行查询操作,并获取查询结果进行处理。这样,我们就可以方便地进行连表查询操作了。 ### 回答3: MyBatis Plus是一种基于MyBatis框架的增强工具,它可以简化数据库操作。连接表查询是在数据库中同时查询多个表的操作。在MyBatis Plus中,连接表查询可以通过多种方式实现。 1. 注解方式:使用@TableName注解来指定实体类与数据库表的映射关系,使用@JoinTable注解来指定连接表的关联关系。然后使用@Select注解来编写连接表查询的SQL语句。 2. XML配置方式:在MyBatis的mapper.xml文件中,使用<resultMap>来定义结果映射关系,在<resultMap>中使用<association>或<collection>来定义连接表查询的关联关系。然后在SQL语句中使用JOIN关键字来连接表。 3. Lambda表达式方式:使用lambda表达式可以更加简洁地实现连接表查询。通过MyBatis Plus的Wrapper对象,可以使用lambda表达式来定义查询条件,并通过selectJoin方法进行连接表查询。 无论是哪种方式,连接表查询的关键是要理解好数据库表之间的关联关系,以及如何在SQL语句中使用JOIN关键字进行连接查询。另外,还要注意在查询结果中正确处理连接表查询返回的重复数据,以及对查询结果进行分页处理等操作。 总结来说,通过MyBatis Plus实现连接表查询,可以通过注解方式、XML配置方式和Lambda表达式方式来实现。根据具体的实际需求和个人喜好,选择合适的方式进行连接表查询操作。连接表查询对理解数据库的表关系和使用JOIN关键字有一定要求,需要在编写SQL语句时注意正确处理返回结果和分页操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值