sql数据库之联表查询
表准备:
在网站 https://www.bejson.com/runcode/sql/ 或者 https://www.liaoxuefeng.com/wiki/1177760294764384/1179611432985088
执行下列sql创建表
CREATE TABLE jobs( employee varchar(30), title varchar(30));
CREATE TABLE ranks( title varchar(30), rank varchar(30));
CREATE TABLE salary( rank varchar(30), payment int(11));
insert into jobs values('张三','经理'),('李四','总经理'),('王五','总经理助理');
insert into ranks values('经理','三'),('总经理','一'),('总经理助理','二'),('董事长','零');
insert into salary values('一',20000),('二',8000),('三',7000),('四',7000);
这次我们用到3张表:
jobs 表:
ranks 表:
salary 表:
一、 内连接——Inner Join
内连接Inner join基于连接谓词将两张表(如A和B)的列组合在一起,产生新的结果表。
select ranks.title,ranks.rank,salary.rank,salary.payment from ranks,salary where salary.rank=ranks.rank; 隐式内连接 select * from ranks r inner join salary s on s.rank=r.rank; 显式内连接
查询结果如下:
r!title | r!rank | s!rank | s!payment |
---|---|---|---|
经理 | 三 | 三 | 7000 |
总经理 | 一 | 一 | 20000 |
总经理助理 | 二 | 二 | 8000 |
二、左外连接(left outer join,outer可省略)
左表全部出现在结果集中,若右表无对应记录,则相应字段为NULL
select * from ranks r left join salary s on r.rank=s.rank;
结果如下:
r!title | r!rank | s!rank | s!payment |
---|---|---|---|
经理 | 三 | 三 | 7000 |
总经理 | 一 | 一 | 20000 |
总经理助理 | 二 | 二 | 8000 |
董事长 | 零 | NULL | NULL |
select * from ranks r left join salary s on r.rank=s.rank where s.rank is null;
结果如下:
r!title | r!rank | s!rank | s!payment |
---|---|---|---|
董事长 | 零 | NULL | NULL |
三、右外连接(right outer join,outer可省略)
右表全部出现在结果集中,若左表无对应记录,则相应字段为NULL
select * from ranks r right join salary s on r.rank=s.rank;
结果如下:
r!title | r!rank | s!rank | s!payment |
---|---|---|---|
经理 | 三 | 三 | 7000 |
总经理 | 一 | 一 | 20000 |
总经理助理 | 二 | 二 | 8000 |
NULL | NULL | 四 | 7000 |
select * from ranks r right join salary s on r.rank=s.rank where r.rank is null;
结果如下:
r!title | r!rank | s!rank | s!payment |
---|---|---|---|
NULL | NULL | 四 | 7000 |
四、全外连接(full outer join)
全外连接=左外连接+右外连接
select * from ranks r full outer join salary s on r.rank=s.rank;
结果如下:
r!title | r!rank | s!rank | s!payment |
---|---|---|---|
经理 | 三 | 三 | 7000 |
总经理 | 一 | 一 | 20000 |
总经理助理 | 二 | 二 | 8000 |
董事长 | 零 | NULL | NULL |
NULL | NULL | 四 | 7000 |
select * from ranks r full outer join salary s on r.rank=s.rank where r.rank is null or s.rank is null;
结果如下:
r!title | r!rank | s!rank | s!payment |
---|---|---|---|
董事长 | 零 | NULL | NULL |
NULL | NULL | 四 | 7000 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!