mysql left join查询,比较两个表不同的行

本文介绍如何使用SQL左向外联接查询两个表中不同数据值的方法,并通过具体案例展示如何筛选出特定条件下未匹配的数据记录。

怎样查询两个表中同一字段的不同数据值

例如:

A表中的字段a40000条数据
B
表中的字段a60000条数据,其中的40000条数据跟A表是一样的
怎样能把那不一样的20000条数据查询出来啊?

 

--建表table1,table2   
create   table   table1(id   int,name   varchar(10));  
create   table   table2(id   int,score   int);  
insert   into   table1   select   '1','lee';
insert   into   table1   select   '2','zhang';
insert   into   table1   select   '3','steve';
insert   into   table1   select   '4','wang';  
insert   into   table2   select   '1','90';  
insert   into   table2   select   '2','100';  
insert   into   table2   select   '3','70';  

如表
-------------------------------------------------  
table1   
-------------------------------------------------  
id name 
1 lee
2 zhang

3 steve
4 wang

-------------------------------------------------  

table2

------------------------------------------------- 

id score
1 90
2 100

3 70

------------------------------------------------- 

 

(1)左向外联接的结果集包括   left   outer   子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值(null)  

(2)sql语句  

select * from table1 t1 left join table2 t2 on t1.id = t2.id

-------------结果-------------  
id name id score  
------------------------------  
1 lee 1 90  
2 zhang 2 100  

3 steve 3 70
4 wang null null  
------------------------------  

注释:包含table1的所有子句,根据指定条件返回table2相应的字段,不符合的以null显示

(3)那么获取差值

select * from table1 t1 left join table2 t2 on t1.id = t2.id WHERE t2.id is null

-------------结果-------------  
id name id score  

4 wang null null  
------------------------------  

 

下面是工作中实际遇到的情况:

##过滤出0销售人员(即没有销售记录的员工信息列表)。

#销售人员(用户角色中间表)

select userid from bbscs_role_user where roleid = 'sales'

 # ---> 11条记录

 

#统计表(用户销售记录表)

select refid from bbscs_sales_income_stat where type = 4 and month = '2012-02' and amount != 0

 # ---> 4条记录

要求为:另外7个销售人员的记录列出来为目的。

 

##########这个是SQL语句模型 BEGIN##########

select * from b t2 left join a t1 on t1.a1 = t2.b1 WHERE t1.a1 is null

#########这个是SQL语句模型 END############

说明:左表是数据多的那个表(基准表如b表)。left join查询。where条件是右边的那个表(a表)某个字段(a1)为Null作为(判断字段)

 

##SQL返回结果作为临时表来查询

select * from (select userid from bbscs_role_user where roleid = 'sales') t2 left join (select refid from bbscs_sales_income_stat where type = 4 and month = '2012-02' and amount != 0) t1 on t2.userid = t1.refid WHERE t1.refid is null

 # --->7条记录

 

 

测试一:

##SQL语句,mysql 查询两个表中不同的值(主要是差值)  这个语句查询还是存在问题。

select t1.Userid from bbscs_role_user t1 left join bbscs_sales_income_stat t2 on t1.userid = t2.refid and t1.roleid = 'sales' and t2.type = 4 and t2.month = '2012-02' and t2.amount != 0 where t2.id is null; ##表与表,条件与条件独立出来。

 # --->18条记录

 

 

测试二:

select t1.Userid from bbscs_role_user t1 left join bbscs_sales_income_stat t2 on t1.userid = t2.refid and t1.roleid = 'sales' and t2.type = 4 and t2.month = '2012-02' and t2.amount != 0 and t2.id is null ##where or and 区别

 # --->22条记录

 

 

###更为强大的临时表查询功能,将以上查询结果作为一个整体放入。

##跟用户部门中间表关联,按部门id排序显示。

select t4.userid from( select * from (select userid from bbscs_role_user where roleid = 'sales') t2 left join (select refid from bbscs_sales_income_stat where type = 4 and month = '2012-02' and amount != 0) t1 on t2.userid = t1.refid WHERE t1.refid is null ) t3, bbscs_org_user t4 where t3.userid = t4.userid order by orgId

 

MySQL 中,`LEFT JOIN` 是一种非常常用的多查询方式,它用于从两个或多个中检索数据,并以左(第一个)为基础,返回左中的所有记录,即使右中没有匹配的,也会返回 `NULL` 值。`LEFT JOIN` 也被称为 `LEFT OUTER JOIN`。 ### 基本语法 ```sql SELECT 列名 FROM 左 LEFT JOIN ON 左.列名 = 右.列名; ``` 在多查询中,可以连续使用多个 `LEFT JOIN` 来连接多个。例如: ```sql SELECT 列名 FROM 1 LEFT JOIN 2 ON 1.列名 = 2.列名 LEFT JOIN 3 ON 1.列名 = 3.列名 LEFT JOIN 4 ON 1.列名 = 4.列名; ``` ### 使用示例 以下是一个使用 `LEFT JOIN` 查询多个的示例: 假设有以下三张: 1. `runoob_tbl`(文章): | huthon_id | huthon_title | huthon_author | |-----------|---------------------|---------------| | 1 | MySQL 入门教程 | 张三 | | 2 | Python 编程基础 | 李四 | | 3 | Java 核心编程 | 王五 | 2. `tcount_tbl`(文章计数): | runoob_author | huthon_count | |----------------|---------------| | 张三 | 10 | | 李四 | 5 | 3. `category_tbl`(文章分类): | category_id | category_name | |-------------|----------------| | 1 | 数据库 | | 2 | 编程语言 | #### 查询目标: 查询每位作者的文章信息,包括作者名、文章标题、文章数量以及所属分类。 ```sql SELECT a.huthon_author AS author, a.huthon_title AS title, b.huthon_count AS count, c.category_name AS category FROM runoob_tbl a LEFT JOIN tcount_tbl b ON a.huthon_author = b.runoob_author LEFT JOIN category_tbl c ON a.huthon_id = c.category_id; ``` #### 查询结果: | author | title | count | category | |--------|-------------------|-------|-----------| | 张三 | MySQL 入门教程 | 10 | 数据库 | | 李四 | Python 编程基础 | 5 | 编程语言 | | 王五 | Java 核心编程 | NULL | NULL | 在这个查询中: - `LEFT JOIN tcount_tbl b ON a.huthon_author = b.runoob_author` 确保了即使某个作者在 `tcount_tbl` 中没有对应的计数记录,也会显示文章信息,只是 `huthon_count` 为 `NULL`。 - `LEFT JOIN category_tbl c ON a.huthon_id = c.category_id` 确保了即使某篇文章没有分类信息,也会保留文章信息,只是 `category_name` 为 `NULL`。 ### 注意事项: - `LEFT JOIN` 会返回左中的所有记录,即使右中没有匹配的。 - 如果右中没有匹配的,则相关字段的值为 `NULL`。 - 在多连接中,`LEFT JOIN` 的顺序可能会影响查询结果,因此需要根据业务逻辑选择合适的连接顺序。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值