Java实现数据库表中的七种连接【Mysql】

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介: Java实现数据库表中的七种连接【Mysql】

前言

2023-8-4 16:51:42

以下内容源自《【Mysql】》

仅供学习交流使用

版权

禁止其他平台发布时删除以下此话

本文首次发布于CSDN平台

作者是CSDN@日星月云

博客主页是https://blog.csdn.net/qq_51625007

禁止其他平台发布时删除以上此话

推荐

Java实现数据库表中的七种连接

左外连接

  /**
     * 左外连接
     * 计算
     *     SELECT cla1.`id`,cla1.`type`,cla2.`name`
     *     FROM cla1
     *     LEFT JOIN cla2
     *     ON cla1.`id`=cla2.`id`
     *     (Where cla2.id IS NULL);
     *
     * @param list1
     * @param list2
     * @param isNull 有没有括号中的IS NULL这条语句
     * @param out 输出吗?
     * @return
     */
    public static  List<Cla3> leftJoin(List<Cla3> list1, List<Cla3> list2,boolean isNull,boolean out) {
       List<Cla3> leftJoin=new ArrayList<>();
       //左表遍历
       list1.forEach(c1->{
           //在右表中有没有找到
           AtomicBoolean flag= new AtomicBoolean(false);
           list2.forEach(c2->{
               //找到了
               if(c1.id.equals(c2.id)){
                   //如果cla2.id is null,就不需要添加
                   if (!isNull) {
                       leftJoin.add(new Cla3(c1.id, c1.type, c2.name));
                   }
                   flag.set(true);
               }
           });
           //没有找到添加 右表属性 NULL
           if(!flag.get()){
               leftJoin.add(new Cla3(c1.id,c1.type,"null"));
           }
       });
        return leftJoin;
    }

右外连接

    /**
     * 右外连接
     * 计算
     *     SELECT cla2.`id`,cla1.`type`,cla2.`name`
     *     FROM cla1
     *     RIGHT JOIN cla2
     *     ON cla1.`id`=cla2.`id`
     *     (WHERE cla1.`id` IS NULL);
     *
     * @param list1
     * @param list2
     * @param isNull 有没有括号中的IS NULL这条语句
     * @return
     */
    public static  List<Cla3> rightJoin(List<Cla3> list1, List<Cla3> list2,boolean isNull,boolean out) {
        List<Cla3> rightJoin=new ArrayList<>();
        //右表遍历
        list2.forEach(c2->{
            //在左表中有没有找到
            AtomicBoolean flag= new AtomicBoolean(false);
            list1.forEach(c1->{
                //找到了
                if(c1.id.equals(c2.id)){
                    //如果cla1.id is null,就不需要添加
                    if (!isNull){
                        rightJoin.add(new Cla3(c2.id, c1.type,c2.name));
                    }
                    flag.set(true);
                }
            });
            //没有找到添加 左表属性 NULL
            if(!flag.get()){
                rightJoin.add(new Cla3(c2.id,"null",c2.name));
            }
        });
        return rightJoin;
    }

其他连接

外连接
 * 左外+右外
 * 右外+左外
内连接
 * 左外-左外ISNULL
 * 右外-右外ISNULL
外连接-内连接

附录

七种连接

MySQL笔记:第06章_多表查询


SQL测试

CREATE DATABASE cla;
USE cla;
CREATE TABLE cla1(
  `id`  VARCHAR(10),
  `type`  VARCHAR(10)
);
CREATE TABLE cla2(
  `id`  VARCHAR(10),
  `name`  VARCHAR(10)
);
INSERT INTO cla1 VALUES('22','cde');
INSERT INTO cla1 VALUES('11','abc');
INSERT INTO cla1 VALUES('44','cdef');
INSERT INTO cla1 VALUES('55','cdefg');
INSERT INTO cla2 
VALUES
('11','name1'),
('22','name2'),
('33','name3'),
('44','name4'),
('aa','nameaa');
#leftJoin 
SELECT cla1.`id`,cla1.`type`,cla2.`name`
FROM cla1
LEFT JOIN cla2
ON cla1.`id`=cla2.`id`
/*
id  type  name
22  cde name2
11  abc name1
44  cdef  name4
55  cdefg \N
*/
#leftJoin isnull
SELECT cla1.`id`,cla1.`type`,cla2.`name`
FROM cla1
LEFT JOIN cla2
ON cla1.`id`=cla2.`id`
WHERE cla2.`id` IS NULL;
/*
id  type  name
55  cdefg \N
*/
#rightJoin 
SELECT cla2.`id`,cla1.`type`,cla2.`name`
FROM cla1
RIGHT JOIN cla2
ON cla1.`id`=cla2.`id`
/*
id  type  name
11  abc name1
22  cde name2
33  \N  name3
44  cdef  name4
aa  \N  nameaa
*/
#rightJoin ISNULL
SELECT cla2.`id`,cla1.`type`,cla2.`name`
FROM cla1
RIGHT JOIN cla2
ON cla1.`id`=cla2.`id`
WHERE cla1.`id` IS NULL;
/*
id  type  name
33  \N  name3
aa  \N  nameaa
*/
#innerJoin leftBefore
SELECT cla1.`id`,cla1.`type`,cla2.`name`
FROM cla1
INNER JOIN cla2
ON cla1.`id`=cla2.`id`
/*
id  type  name
11  abc name1
22  cde name2
44  cdef  name4
*/
#innerJoin rightBefore
SELECT cla2.`id`,cla1.`type`,cla2.`name`
FROM cla2
INNER JOIN cla1
ON cla2.`id`=cla1.`id`
/*
id  type  name
11  abc name1
22  cde name2
44  cdef  name4
*/
#outJoin leftBefore
#左1+右2
SELECT cla1.`id`,cla1.`type`,cla2.`name`
FROM cla1
LEFT JOIN cla2
ON cla1.`id`=cla2.`id`
UNION ALL
SELECT cla2.`id`,cla1.`type`,cla2.`name`
FROM cla1
RIGHT JOIN cla2
ON cla1.`id`=cla2.`id`
WHERE cla1.`id` IS NULL;
/*
id  type  name
22  cde name2
11  abc name1
44  cdef  name4
55  cdefg \N
33  \N  name3
aa  \N  nameaa
*/
#outJoin rightBefore
#右1+左2
SELECT cla2.`id`,cla1.`type`,cla2.`name`
FROM cla1
RIGHT JOIN cla2
ON cla1.`id`=cla2.`id`
UNION ALL
SELECT cla1.`id`,cla1.`type`,cla2.`name`
FROM cla1
LEFT JOIN cla2
ON cla1.`id`=cla2.`id`
WHERE cla2.`id` IS NULL;
/*
id  type  name
11  abc name1
22  cde name2
33  \N  name3
44  cdef  name4
aa  \N  nameaa
55  cdefg \N
*/

Java测试

转换方法

package test.algo;
import test.algo.main2.Cla1;
import test.algo.main2.Cla2;
import test.algo.main2.Cla3;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
public class testJoin {
    static List<Cla1> claList1 = new ArrayList<>();
    static List<Cla2> claList2 = new ArrayList<>();
    static List<Cla3> list1 = new ArrayList<>();
    static List<Cla3> list2 = new ArrayList<>();
    public static void main(String[] args) {
        test();
        init(claList1,claList2);
        leftJoin(list1, list2,false,true);
        /*
        {id: 22, type: cde, name: name2}
        {id: 11, type: abc, name: name1}
        {id: 44, type: cdef, name: name4}
        {id: 55, type: cdefg, name: null}
         */
        leftJoin(list1, list2,true,true);;
        /*
        {id: 55, type: cdefg, name: null}
         */
        rightJoin(list1, list2,false,true);
        /*
        {id: 11, type: abc, name: name1}
        {id: 22, type: cde, name: name2}
        {id: 33, type: null, name: name3}
        {id: 44, type: cdef, name: name4}
        {id: aa, type: null, name: nameaa}
         */
        rightJoin(list1, list2,true,true);
        /*
        {id: 33, type: null, name: name3}
        {id: aa, type: null, name: nameaa}
         */
        outJoin(list1, list2,true,true);
        /*
        {id: 22, type: cde, name: name2}
        {id: 11, type: abc, name: name1}
        {id: 44, type: cdef, name: name4}
        {id: 55, type: cdefg, name: null}
        {id: 33, type: null, name: name3}
        {id: aa, type: null, name: nameaa}
         */
        outJoin(list1, list2,false,true);
        /*
        {id: 11, type: abc, name: name1}
        {id: 22, type: cde, name: name2}
        {id: 33, type: null, name: name3}
        {id: 44, type: cdef, name: name4}
        {id: aa, type: null, name: nameaa}
        {id: 55, type: cdefg, name: null}
         */
        innerJoin(list1,list2,true,true);
        /*
        {id: 22, type: cde, name: name2}
        {id: 11, type: abc, name: name1}
        {id: 44, type: cdef, name: name4}
         */
        innerJoin(list1,list2,false,true);
        /*
        {id: 11, type: abc, name: name1}
        {id: 22, type: cde, name: name2}
        {id: 44, type: cdef, name: name4}
         */
        outJoin_InnerJoin(list1,list2,true,true);
        /*
        {id: 55, type: cdefg, name: null}
        {id: 33, type: null, name: name3}
        {id: aa, type: null, name: nameaa}
         */
        outJoin_InnerJoin(list1,list2,false,true);
        /*
        {id: 33, type: null, name: name3}
        {id: aa, type: null, name: nameaa}
        {id: 55, type: cdefg, name: null}
         */
    }
    /**
     * 初始两个表中的数据
     */
    public static void test(){
        claList1.add(new Cla1("22", "cde"));
        claList1.add(new Cla1("11", "abc"));
        claList1.add(new Cla1("44", "cdef"));
        claList1.add(new Cla1("55", "cdefg"));
        claList2.add(new Cla2("11", "name1"));
        claList2.add(new Cla2("22", "name2"));
        claList2.add(new Cla2("33", "name3"));
        claList2.add(new Cla2("44", "name4"));
        claList2.add(new Cla2("aa", "nameaa"));
    }
    /**
     * 初始结果表中的数据
     */
    public static void init(List<Cla1> claList1, List<Cla2> claList2){
        claList1.forEach(cla1 -> list1.add(new Cla3(cla1.getId(), cla1.getType(), "null")));
        claList2.forEach(cla2 -> list2.add(new Cla3(cla2.getId(), "null", cla2.getName())));
    }
    /**
     *外连接-内连接
     * @param list1
     * @param list2
     * @param leftBefore 左边在前
     * @param out 是否输出
     * @return
     */
    public static List<Cla3> outJoin_InnerJoin(List<Cla3> list1, List<Cla3> list2,boolean leftBefore,boolean out){
        List<Cla3> outJoin_InnerJoin=new ArrayList<>();
        outJoin_InnerJoin.addAll(outJoin(list1, list2, leftBefore, false));
        outJoin_InnerJoin.removeAll(innerJoin(list1, list2, leftBefore, false));
        if(out){
            System.out.println("--------------------outJoin_InnerJoin"+((leftBefore)?"leftBefore":"rightBefore")+"-------------------------------");
            outJoin_InnerJoin.forEach(System.out::println);
            System.out.println("--------------------outJoin_InnerJoin"+((leftBefore)?"leftBefore":"rightBefore")+"-------------------------------");
        }
        return outJoin_InnerJoin;
    }
    /**
     * 内连接
     * 左外-左外ISNULL
     * 右外-右外ISNULL
     * @param list1
     * @param list2
     * @param leftBefore 左边在前
     * @param out 是否输出
     * @return
     */
    public static List<Cla3> innerJoin(List<Cla3> list1, List<Cla3> list2,boolean leftBefore,boolean out){
        List<Cla3> innerJoin=new ArrayList<>();
        if(leftBefore){
            innerJoin.addAll(leftJoin(list1, list2, false, false));
            innerJoin.removeAll(leftJoin(list1, list2, true, false));
        }else {
            innerJoin.addAll(rightJoin(list1, list2, false, false));
            innerJoin.removeAll(rightJoin(list1, list2, true, false));
        }
        if(out){
            System.out.println("--------------------innerJoin"+((leftBefore)?"leftBefore":"rightBefore")+"-------------------------------");
            innerJoin.forEach(System.out::println);
            System.out.println("--------------------innerJoin"+((leftBefore)?"leftBefore":"rightBefore")+"-------------------------------");
        }
        return innerJoin;
    }
    /**
     * 左外连接
     * 计算
     *     SELECT cla1.`id`,cla1.`type`,cla2.`name`
     *     FROM cla1
     *     LEFT JOIN cla2
     *     ON cla1.`id`=cla2.`id`
     *     (Where cla2.id IS NULL);
     *
     * @param list1
     * @param list2
     * @param isNull 有没有括号中的IS NULL这条语句
     * @param out 输出吗?
     * @return
     */
    public static  List<Cla3> leftJoin(List<Cla3> list1, List<Cla3> list2,boolean isNull,boolean out) {
       List<Cla3> leftJoin=new ArrayList<>();
       list1.forEach(c1->{
           AtomicBoolean flag= new AtomicBoolean(false);
           list2.forEach(c2->{
               if(c1.id.equals(c2.id)){
                   if (!isNull) {
                       leftJoin.add(new Cla3(c1.id, c1.type, c2.name));
                   }
                   flag.set(true);
               }
           });
           if(!flag.get()){
               leftJoin.add(new Cla3(c1.id,c1.type,"null"));
           }
       });
       if(out){
            System.out.println("--------------------leftJoin---"+((isNull)?"isNull":"----")+"-------------------------------");
            leftJoin.forEach(System.out::println);
            System.out.println("--------------------leftJoin---"+((isNull)?"isNull":"----")+"-------------------------------");
            System.out.println();
       }
        return leftJoin;
    }
    /**
     * 右外连接
     * 计算
     *     SELECT cla2.`id`,cla1.`type`,cla2.`name`
     *     FROM cla1
     *     RIGHT JOIN cla2
     *     ON cla1.`id`=cla2.`id`
     *     (WHERE cla1.`id` IS NULL);
     *
     * @param list1
     * @param list2
     * @param isNull 有没有括号中的IS NULL这条语句
     * @return
     */
    public static  List<Cla3> rightJoin(List<Cla3> list1, List<Cla3> list2,boolean isNull,boolean out) {
        List<Cla3> rightJoin=new ArrayList<>();
        list2.forEach(c2->{
            AtomicBoolean flag= new AtomicBoolean(false);
            list1.forEach(c1->{
                if(c1.id.equals(c2.id)){
                    if (!isNull){
                        rightJoin.add(new Cla3(c2.id, c1.type,c2.name));
                    }
                    flag.set(true);
                }
            });
            if(!flag.get()){
                rightJoin.add(new Cla3(c2.id,"null",c2.name));
            }
        });
        if (out){
            System.out.println("--------------------rightJoin---"+((isNull)?"isNull":"----")+"-------------------------------");
            rightJoin.forEach(System.out::println);
            System.out.println("--------------------rightJoin---"+((isNull)?"isNull":"----")+"-------------------------------");
            System.out.println();
        }
        return rightJoin;
    }
    /**
     * 外连接
     * 左外+右外
     * 右外+左外
     *     SELECT *
     *     FROM tableA A
     *     FULL OUTER JOIN TableB B
     *     ON A.key=B.key
     *
     * @param leftBefore 结果集左表在前还是右边在前
     * @param out 输出吗
     * @return
     */
    public static List<Cla3> outJoin(List<Cla3> list1, List<Cla3> list2,boolean leftBefore,boolean out) {
        List<Cla3> outJoin=new ArrayList<>();
        List<Cla3> leftJoin = leftJoin(list1, list2,!leftBefore,false);
        List<Cla3> rightJoin = rightJoin(list1, list2,leftBefore,false);
        if (leftBefore){
            outJoin.addAll(leftJoin);
            outJoin.addAll(rightJoin);
        }else {
            outJoin.addAll(rightJoin);
            outJoin.addAll(leftJoin);
        }
        if(out){
            System.out.println("--------------------outJoin"+((leftBefore)?"leftBefore":"rightBefore")+"-------------------------------");
            outJoin.forEach(System.out::println);
            System.out.println("--------------------outJoin"+((leftBefore)?"leftBefore":"rightBefore")+"-------------------------------");
        }
        return outJoin;
    }
}

类 Cla1

package test.algo.main2;
public class Cla1 {
    public String id;
    public String type;
    public Cla1(String id, String type) {
        this.id = id;
        this.type = type;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    @Override
    public String toString() {
        return "{id: " + id + ", type: " + type + "}";
    }
}

类 Cla2

package test.algo.main2;
public class Cla2 {
    public String id;
    public String name;
    public Cla2(String id, String name) {
        this.id = id;
        this.name = name;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "{id: " + id + ", name: " + name + "}";
    }
}

类Cla3

需要重写equals()

id==id

package test.algo.main2;
import java.util.Objects;
public class Cla3 {
    public String id;
    public String name;
    public String type;
    public Cla3(String id, String type, String name) {
        this.id = id;
        this.type = type;
        this.name = name;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Cla3 cla3 = (Cla3) o;
        return Objects.equals(id, cla3.id);
    }
    @Override
    public int hashCode() {
        return Objects.hash(id);
    }
    @Override
    public String toString() {
        return "{id: " + id + ", type: " + type + ", name: " + name + "}";
    }
}

最后

2023-8-4 17:04:28

我们都有光明的未来

祝大家考研上岸

祝大家工作顺利

祝大家得偿所愿

祝大家如愿以偿

点赞收藏关注哦

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
5月前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
444 158
|
5月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
5月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
1041 152
|
5月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
817 156
|
5月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(中)
使用MYSQL Report分析数据库性能
428 156
|
5月前
|
缓存 监控 关系型数据库
使用MYSQL Report分析数据库性能(上)
最终建议:当前系统是完美的读密集型负载模型,优化重点应放在减少行读取量和提高数据定位效率。通过索引优化、分区策略和内存缓存,预期可降低30%的CPU负载,同时保持100%的缓冲池命中率。建议每百万次查询后刷新统计信息以持续优化
530 161
|
5月前
|
关系型数据库 MySQL 分布式数据库
阿里云PolarDB云原生数据库收费价格:MySQL和PostgreSQL详细介绍
阿里云PolarDB兼容MySQL、PostgreSQL及Oracle语法,支持集中式与分布式架构。标准版2核4G年费1116元起,企业版最高性能达4核16G,支持HTAP与多级高可用,广泛应用于金融、政务、互联网等领域,TCO成本降低50%。
|
5月前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
5月前
|
SQL 关系型数据库 MySQL
Mysql数据恢复—Mysql数据库delete删除后数据恢复案例
本地服务器,操作系统为windows server。服务器上部署mysql单实例,innodb引擎,独立表空间。未进行数据库备份,未开启binlog。 人为误操作使用Delete命令删除数据时未添加where子句,导致全表数据被删除。删除后未对该表进行任何操作。需要恢复误删除的数据。 在本案例中的mysql数据库未进行备份,也未开启binlog日志,无法直接还原数据库。

推荐镜像

更多