SQL之Join的使用详解

一.基本概念

关于sql语句中的连接(join)关键字,是较为常用而又不太容易理解的关键字,下面这个例子给出了一个简单的解释 –建表user1,user2:

table1 : create table user2(id int, user_name varchar(10), over varchar(10));
insert into user1 values(1, ‘tangseng', ‘dtgdf');
insert into user1 values(2, ‘sunwukong', ‘dzsf');
insert into user1 values(1, ‘zhubajie', ‘jtsz');
insert into user1 values(1, ‘shaseng', ‘jslh');
table2 : create table user2(id int, user_name varchar(10), over varchar(10));
insert into user2 values(1, ‘sunwukong', ‘chengfo');
insert into user2 values(2, ‘niumowang', ‘chengyao');
insert into user2 values(3, ‘jiaomowang', ‘chengyao');
insert into user2 values(4, ‘pengmowang', ‘chengyao');

SQL标准中Join的类型

SQL之Join的使用详解

1. 内连接(inner join或join)

(1).概念:内联接是基于连接谓词将两张表的列结合在一起,产生新的结果表

(2).内连接维恩图:

SQL之Join的使用详解

(3).sql语句

select a.id, a.user_name, b.over from user1 a inner join user2 b alt="SQL之Join的使用详解" />

2. 外连接

外连接包括左向外联接、右向外联接或完整外部联接

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

(2)左外连接维恩图:

SQL之Join的使用详解

(3)sql语句:

select a.id, a.user_name, b.over from user1 a left join user2 b alt="SQL之Join的使用详解" />

b.右外连接:right join 或 right outer join
(1)右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
(2)右外连接维恩图:

SQL之Join的使用详解

(3)sql语句

select b.user_name, b.over, a.over from user1 a right join user2 b alt="SQL之Join的使用详解" />

c.全外连接:full join 或 full outer join

(1)完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
(2)右外连接维恩图:

SQL之Join的使用详解

(3)sql语句

select a.id, a.user_name, b.over from user1 a full join user2 b alt="SQL之Join的使用详解" />

3. 笛卡尔连接(交叉连接)

1.概念:没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。(user1和user2交叉连接产生4*4=16条记录)
2.交叉连接:cross join (不带条件on)
3.sql语句:
select a.user_name,b.user_name, a.over, b.over from user1 a cross join user2 b;

二.使用技巧

1. 使用join更新表
我们使用下面语句将user1表中同时存在user1表和user2表中记录的over字段更新为 ‘qtda'。

update user1 set over='qtds'where user1.user_name in (select b.user_name from user1 a inner join user2 b alt="SQL之Join的使用详解" />

4. 实现分组选择数据

要求查询出user1中每个人kills对多的前两天。
首先,我们可以通过下面语句查询出某个人kills最多的两天;

select a.user_name, b.timestr, b.kills from user1 a join user_kills b alt="SQL之Join的使用详解" />

到此这篇关于SQL之Join的使用详解的文章就介绍到这了,更多相关SQL之Join内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

SQL之Join的使用详解

扫一扫手机访问