SQL助你面大厂(Join家族介绍)

      在学习SQL时候,在多表查询的时候你肯定使用过Join,无非就是把两表联合在一起进行多表查询,但是你是真的了解它们的用法么?

Join家族一般有left Join、Rigth Join、Inner Join、Left Semi Join、Left Anti Join、Full Join为主

CREATE TABLE people(
id INT,
NAME VARCHAR(20),
sex VARCHAR(20),
age INT
)

INSERT INTO people(id,NAME,sex,age)VALUES(1,'张三','男',20),(2,'李四','男',29),(3,'王五','男',19)
,(4,'赵六','女',26),(5,'田七','女',25)

CREATE TABLE thing(
user_id INT,
TYPE VARCHAR(20)
)
INSERT INTO thing(user_id,TYPE)VALUES(1,'诈骗'),(2,'逾期'),(3,'套现')

 SQL助你面大厂(Join家族介绍)_第1张图片

       假如你是一家银行的审核人员,有人向你进行贷款,但是你要查询出哪些人有不诚信记录,然后根据查询的结果判断是否放贷,你会怎么利用你学过的知识去解决这些问题?

SQL助你面大厂(Join家族介绍)_第2张图片

  • Left Join(左表的全部以右表的关联列)

SQL助你面大厂(Join家族介绍)_第3张图片

SELECT p.*,
 IF(user_id IS NOT NULL,'True','False') AS falg
FROM people p
LEFT JOIN thing t 
ON p.id=t.user_id

SQL助你面大厂(Join家族介绍)_第4张图片

 但是现在我们值需要查询违规名单上出现的人员名单,我们应该:

SELECT*FROM
(SELECT p.*,
 IF(user_id IS NOT NULL,'True','False') AS falg
FROM people p
LEFT JOIN thing t 
ON p.id=t.user_id) AS g
WHERE falg='true'

 如果我们要查询的是没有违规的人员名单,直接将上面的where falg='fasle'就可以成功实现

  • Right Join(右边的全部以及左表的相关列)

SQL助你面大厂(Join家族介绍)_第5张图片

SELECT *
FROM thing t
RIGHT JOIN people p
ON p.id=t.user_id

SQL助你面大厂(Join家族介绍)_第6张图片

       在我们生活中左翩子比较多,所以right join不经常用,可以用right join也可以用left join进行替换,left join用起来比较顺手

  • Inner Join(等值连接)

SQL助你面大厂(Join家族介绍)_第7张图片

SELECT *
FROM thing t
INNER JOIN people p
ON p.id=t.user_id

  • Left Semi Join(查找另一张表在这张表存在的数据,不存在的不会显示,只会显示当前表的内容 )
SELECT *
FROM thing t
LEFT semi JOIN people p
ON p.id=t.user_id

 这种方式等价于:

SELECT p.*
FROM people p 
LEFT JOIN
thing t  ON p.id=t.user_id
WHERE t.user_id IS NOT NULL

 同时也等价于inner join

  • Left Andi Join(剔除另一张表在这张表存在的数据,只会显示当前表的内容 )
SELECT p.*
FROM people p 
LEFT anti JOIN
thing t  ON p.id=t.user_id

 有的版本不一样是不支持left semi join 和left anti join的连接方式的

  • Full Join
CREATE TABLE dept(
user_id INT,
amount VARCHAR(20)
)
INSERT INTO dept(user_id,amount)VALUES(1,'2000'),(2,'2900'),(3,'2100')

CREATE TABLE debt(
user_id INT,
amount VARCHAR(20)
)
INSERT INTO debt(user_id,amount)VALUES(3,'2500'),(4,'2000'),(5,'2120')

SQL助你面大厂(Join家族介绍)_第8张图片SQL助你面大厂(Join家族介绍)_第9张图片

 因为SqlYog不支持Full Join,所以我这里用left join union right join进行替换

SELECT * FROM 
dept p LEFT JOIN debt b ON p.user_id=b.user_id
UNION 
SELECT * FROM dept p
RIGHT JOIN debt b ON p.user_id=b.user_id

SQL助你面大厂(Join家族介绍)_第10张图片

 这里还是用full join来讲解吧,SqlYog中的函数真的是少的可怜

 

SQL助你面大厂(Join家族介绍)_第11张图片

 coalesce(**,**,**)函数返回参数中第一个不为null的值,经常和full join联合使用

比如:coalesce(215,269)返回的是215    coalesce(null,22) 返回的是22

SQL助你面大厂(Join家族介绍)_第12张图片

 

你可能感兴趣的:(SQL突击,sql,数据库)