在学习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,'套现')
假如你是一家银行的审核人员,有人向你进行贷款,但是你要查询出哪些人有不诚信记录,然后根据查询的结果判断是否放贷,你会怎么利用你学过的知识去解决这些问题?
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
但是现在我们值需要查询违规名单上出现的人员名单,我们应该:
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'就可以成功实现
SELECT *
FROM thing t
RIGHT JOIN people p
ON p.id=t.user_id
在我们生活中左翩子比较多,所以right join不经常用,可以用right join也可以用left join进行替换,left join用起来比较顺手
SELECT *
FROM thing t
INNER JOIN people p
ON p.id=t.user_id
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
SELECT p.*
FROM people p
LEFT anti JOIN
thing t ON p.id=t.user_id
有的版本不一样是不支持left semi join 和left anti 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')
因为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
这里还是用full join来讲解吧,SqlYog中的函数真的是少的可怜
coalesce(**,**,**)函数返回参数中第一个不为null的值,经常和full join联合使用
比如:coalesce(215,269)返回的是215 coalesce(null,22) 返回的是22