多表关联的话表之间必须得存在关系才行,需要建立 外键 约束:关系表中插入主表的主键做外键。
案列分析:
需求:有用户表SYS_User和角色表SYS_Role,则建一个把用户与角色关联起来的关系表我们称之为用户角色表SYS_UserRole
那么我们就可以用以下语句查询每个用户分别具备哪些角色了
select a.login_id_,a.user_name_,a.country_,b.role_id_,c.name_,c.description_
from [dbo].[SYS_User] a
left join [dbo].[SYS_UserRole] b
on a.id_=b.user_id_
inner join [dbo].[SYS_Role] c
on b.role_id_=c.id_
表关联一些基础语法
-
INNER JOIN 关键字
--在表中存在至少一个匹配时返回行。
--INNER JOIN 与 JOIN 是相同的。
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name=table2.column_name;
- LEFT JOIN 关键字
从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。
--在某些数据库中,LEFT JOIN 称为 LEFT OUTER JOIN。--
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name=table2.column_name;
- RIGHT JOIN 关键字
从右表(table2)返回所有的行,即使左表(table1)中没有匹配。如果左表中没有匹配,则结果为 NULL。
-- 在某些数据库中,RIGHT JOIN 称为 RIGHT OUTER JOIN。
SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name=table2.column_name;
总结:
A inner join B 取交集。
A left join B 取 A 全部,B 没有对应的值为 null。
A right join B 取 B 全部, A 没有对应的值为 null。
A full outer join B 取并集,彼此没有对应的值为 null。
对应条件在 on 后面填写。
on 与 where区别
在使用 left jion 时,on 和 where 条件的区别如下:
- 1、 on 条件是在生成临时表时使用的条件,它不管 on 中的条件是否为真,都会返回左边表中的记录。
- 2、where 条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有 left join 的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉。
由于left join、right join、full join 的特殊性,不管 on 上的条件是否为真都会返回 left 或 right 表中的记录,full 则具有 left 和 right 的特性的并集。
而 inner jion 没这个特殊性,则条件放在 on 中和 where 中,返回的结果集是相同的。