oracle、mysql、postgresql数据库的几种表关联方法

目录

简介

创建测试数据

语法

左关联

右关联

​编辑

内关联(交集)

补集

并集

简介

在数据开发过程中,常常需要判断几个表直接的数据包含关系,便需要使用到一些特定的关键词进行处理。在数据库中常见的几种关联关系,本文以oracle、mysql、postgresql三种做演示

创建测试数据

oracle

-- 创建表 p1
CREATE TABLE p1 (
    txt VARCHAR2(100),
    id VARCHAR2(100)
);

-- 插入数据到表 p1
INSERT INTO p1 (txt, id) VALUES ('社会事业项目', '11');
INSERT INTO p1 (txt, id) VALUES ('交通项目', '12'); 
INSERT INTO p1 (txt, id) VALUES ('城建项目', '34'); 
INSERT INTO p1 (txt, id) VALUES ('城建项目', '34');
INSERT INTO p1 (txt, id) VALUES ('工业区项目', '50');
INSERT INTO p1 (txt, id) VALUES ('经济适用房项目', '60');

-- 创建表 p2
CREATE TABLE p2 (
    txt VARCHAR2(100),
    id VARCHAR2(100)
);

-- 插入数据到表 p2
INSERT INTO p2 (txt, id) VALUES ('社会事业项目', '11');
INSERT INTO p2 (txt, id) VALUES ('社会事业项目', '11');
INSERT INTO p2 (txt, id) VALUES ('交通项目', '12');
INSERT INTO p2 (txt, id) VALUES ('农业水利项目', '33');
INSERT INTO p2 (txt, id) VALUES ('城建项目', '34'); 
INSERT INTO p2 (txt, id) VALUES ('经济适用房项目', '60');

postgresql/mysql

-- 创建表 p1
CREATE TABLE p1 (
    txt VARCHAR(100),
    id VARCHAR(100)
);

-- 插入数据到表 p1
INSERT INTO p1 (txt, id) VALUES ('社会事业项目', '11');
INSERT INTO p1 (txt, id) VALUES ('交通项目', '12'); 
INSERT INTO p1 (txt, id) VALUES ('城建项目', '34'); 
INSERT INTO p1 (txt, id) VALUES ('城建项目', '34');
INSERT INTO p1 (txt, id) VALUES ('工业区项目', '50');
INSERT INTO p1 (txt, id) VALUES ('经济适用房项目', '60');

-- 创建表 p2
CREATE TABLE p2 (
    txt VARCHAR(100),
    id VARCHAR(100)
);

-- 插入数据到表 p2
INSERT INTO p2 (txt, id) VALUES ('社会事业项目', '11');
INSERT INTO p2 (txt, id) VALUES ('社会事业项目', '11');
INSERT INTO p2 (txt, id) VALUES ('交通项目', '12');
INSERT INTO p2 (txt, id) VALUES ('农业水利项目', '33');
INSERT INTO p2 (txt, id) VALUES ('城建项目', '34'); 
INSERT INTO p2 (txt, id) VALUES ('经济适用房项目', '60');

语法

左关联

 

在使用left join语法时,可以看到,如果关联字段并不是唯一字段,数据并不会去重

 重复数据:“社会事业项目” 两条数据行会出现数据重复

右关联

 在使用right join语法时,可以看到,如果关联字段并不是唯一字段,数据并不会去重

 重复数据:“社会事业项目”,“工业区项目”  两条数据行会出现数据重复

 在使用right join语法时,可以看到,如果关联字段并不是唯一字段,数据并不会去重

 重复数据:“社会事业项目” 两条数据行会出现数据重复

内关联(交集)

select   *  from p1 inner join p2 on p1.id =p2.id 

--等效于
select   *  from p1  join p2 on p1.id =p2.id 
 

 在使用inner join语法时,可以看到,如果关联字段并不是唯一字段,数据并不会去重

 重复数据:“社会事业项目”   两条数据行会出现数据重复

inner是一个可选关键字

 

 内链接的去重写法(此时exists 替换成not exists 便是补集结果)

select   *  from p1 where exists (select 1 from p2 where p1.id = p2.id )

--使用此写法不会因为匹配表有重复匹配记录而发生笛卡尔交叉,产生重复项,但是主表的重复项不会进行去重 

--oracle、postgresql、mysql
 select  id ,txt  from p1 
intersect
 select  id ,txt from p2

--使用此写法不会因为匹配表有重复匹配记录而发生笛卡尔交叉,产生重复项,但是主表的重复项也会进行去重,此写法适用于mysql、postgresql、oracle  

补集

此时再加入一条数据,查看不同语法下的去重效果

对p1表增加一条测试数据


INSERT INTO p1 (txt, id) VALUES ('工业区项目', '50');

此时p1表的数据状态 

 补集可以使用上文提到的eixsts 写法

select   *  from p1 where not exists (select 1 from p2 where p1.id = p2.id )

 可以使用minus

--oracle 
 select  id ,txt  from p1 
  minus 
 select  id ,txt from p2

--postgresql,mysql
 select  id ,txt  from p1 
  except 
 select  id ,txt from p2

使用exits 不会对主表的重复数据进行去重,使用minus 会对结果进行去重后再展示。

并集

 并集主要使用union  、union all 的语法,两者语法的区别主要在于对结果的去重处理 

--oracle/postgresql/mysql 
--结果去重
select  id ,txt  from p1 
union
 select  id ,txt from p2
--结果不去重
 select  id ,txt  from p1 
union  all
 select  id ,txt from p2

union  结果去重效果

union all结果不去重效果

        附加:进来国产数据信创政策下,很多数据库都在做迁移,学会这几种表关联关系,可以对比数据库之间的数据差异,方便更好的排错。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用以下步骤将MySQL结构同步到PostgreSQL数据库中: 1. 使用Go语言的MySQL驱动和PostgreSQL驱动分别连接MySQL数据库PostgreSQL数据库。 2. 查询MySQL数据库中需要同步的结构信息,可以使用SHOW CREATE TABLE语句获取结构信息。 3. 解析MySQL结构信息,并将其转换为PostgreSQL结构信息,比如将MySQL的VARCHAR转换为PostgreSQL的TEXT。 4. 使用Go语言的PostgreSQL驱动在PostgreSQL数据库创建新的结构。 完整代码示例如下: ``` package main import ( "database/sql" "fmt" "log" _ "github.com/go-sql-driver/mysql" _ "github.com/lib/pq" ) func main() { // connect to MySQL mysqlDB, err := sql.Open("mysql", "user:password@tcp(127.0.0.1:3306)/database") if err != nil { log.Fatal(err) } defer mysqlDB.Close() // connect to PostgreSQL postgresDB, err := sql.Open("postgres", "postgres://user:password@localhost/postgres?sslmode=disable") if err != nil { log.Fatal(err) } defer postgresDB.Close() // query MySQL table structure rows, err := mysqlDB.Query("SHOW CREATE TABLE mytable") if err != nil { log.Fatal(err) } defer rows.Close() // parse MySQL table structure and convert to PostgreSQL table structure var tableName string var createTableStmt string for rows.Next() { err := rows.Scan(&tableName, &createTableStmt) if err != nil { log.Fatal(err) } } if err := rows.Err(); err != nil { log.Fatal(err) } postgresTableStmt := convertMySQLToPostgreSQL(createTableStmt) // create new table in PostgreSQL _, err = postgresDB.Exec(postgresTableStmt) if err != nil { log.Fatal(err) } fmt.Println("Table structure synced from MySQL to PostgreSQL") } func convertMySQLToPostgreSQL(mysqlTableStmt string) string { // TODO: implement conversion logic return mysqlTableStmt } ``` 在上述代码中,需要根据实际情况修改MySQLPostgreSQL的连接信息,以及需要同步的名和结构信息。同时,还需要实现convertMySQLToPostgreSQL函数,用于将MySQL结构信息转换为PostgreSQL结构信息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值