内连接和外连接的语法:
联合查询就是将两张表,通过笛卡尔积排列组合成一张新表,在这张新表中通过where条件来查询所需要的数据,语法为
select * from (表名),(表名) where 条件 ;
或者
select * from (表名)(left/right)join (表名)on 条件;
这两种写法分别是内连接和外连接的写法
第一种写法 中(表名),(表名) 表示在将两张表进行笛卡尔积生成一张临时表,然后再在where条件下在临时表中 找出符合条件的数据,
第二钟写法 中 (表名)join(表名)on 条件 表示两张表进行笛卡尔积,并且找出在满足on后面条件下的数据,我的理解是
(表名)(left/right)join (表名)代表两张表进行笛卡尔积,on代替了第一种写法中的where
left和join代表进行条件查询输出最后结果时,会尽可能的把左边(left)(右边(right))的表展示出来
内连接和外连接的差别
情形:游戏公司数据库中有两张表,一张为游戏账号表,分别有列:游戏账号,密码,游戏id;
drop table if exists account;
create table account(id int,ikey int,name varchar(20));
一张为为 游戏装备表 ,有列:装备名称,装备归属账号;
drop table if exists equipment;
create table equipment(name varchar(20),account_id int);
测试用例:
insert into account values(001,123,"王德发");
insert into account values(002,123,"周德快");
insert into account values(003,123,"振德刁");
insert into equipment values("屠龙刀",001);
insert into equipment values("麻痹戒指",001);
insert into equipment values("毒刀",001);
insert into equipment values("饮血剑",002);
insert into equipment values("沙漏",002);
insert into equipment values("无尽",002);
insert into equipment values("法爆",002);
insert into equipment values("羊刀",002);
insert into equipment values("龙牙",002);
当用内连接要查询每个游戏账号有哪些装备时
select *from equipment,account where equipment.account_id=account.id;
我们发现最后查出来的只有王德发和周德快的数据,没有振德刁的数据
这是因为振德刁在游戏内没有装备,所以使用内连接查询装备时,无法查询到振德刁
使用外连接
select * from equipment right join account on account.id =equipment.account_id;
此时使用了right外连接 ,会展示join右边的表account的全部数据
如果左表没有完全与右表对应的列,则会用null替代,直到右表完全展示完毕
综上所述 ,内外连接有两个主要区别
1.写法区别
内连接用from 表名,表名 where 条件
外连接用 表名 (left/right)join 表名 on 条件
2.打印区别
外连接用left和right来控制尽可能展现哪个表
当两个表在指定的条件下能满足每一行数据都在另一个表中有数据对应,则内外连接的打印没有区别,但是当某个表中某一行数据在该条件下,在另一个表中没有指定的数据,外连接接可以通过left和right来强制展现出未展示的数据行