SQL-多表关联查询详解

为了在工作中能更顺利的使用多表关联查询,今天这篇博客就写这个内容了。
在讲解多表关联查询之前,先生成测试表。
登录scott用户,运行以下语句生成测试表。

create table ex1 as select * from emp;
create table ex2 as select * from dept;
insert into ex1(empno,ename,job) values(8888,'EXBONG','EXWORD');
insert into ex1(empno,ename,job) values(9999,'EXZHANG','EXWORD');
insert into ex2(deptno,dname,loc) values(50,'ABONG','BEIJING');

现在看下测试表的内容:
16行数据
在这里插入图片描述
由上图可以看出,ex1表有16行数据,ex2表有5行数据。

多表关联查询

表别名

  • 给表起一个短一点的名字
  • 在多表关联查询时,如果多个表之间存在同名的列,则必须使用表别名来限定列的使用。
  • from子句中给表起别名,现起现用。
  • 由于from子句最先执行,故一旦在from子句中为表指定了别名,则必须在剩下的子句中都使用表别名(不同名的列可以不用表别名限定,但最好用),不允许再使用原来的名字。

1. 等值连接

  • 等值连接的列数=左表列数+右表列数
  • 不要求两个表具有相同的列,只看值是否相等
select e.empno,e.ename,e.deptno,d.deptno,d.dname from ex1 e,ex2 d where e.deptno=d.deptno;

在这里插入图片描述
左表和右表满足where子句的有14行,故等值连接的查询结果为14行。

2. 内连接

  • 内连接的结果均满足on子句的连接条件。
select e.empno,e.ename,e.deptno,d.deptno,d.dname from ex1 e inner join ex2 d on e.deptno=d.deptno;

在这里插入图片描述
ex1有16行数据,ex2有5行数据,满足连接条件的只有14行数据,故内连接的结果只有14行数据。

3. 外连接

左外连接
  • 左连接的结果不仅包含满足连接条件的数据行,还包括左表的不满足连接条件的数据行。
select e.empno,e.ename,e.deptno,d.deptno,d.dname from ex1 e left join ex2 d on e.deptno=d.deptno;

在这里插入图片描述
满足连接条件的有14行,左表中不满足连接条件的有2行,故左连接的查询结果应有16行。

右外连接
  • 右连接的结果不仅包含满足连接条件的数据行,还包括右表的不满足连接条件的数据行。
select e.empno,e.ename,e.deptno,d.deptno,d.dname from ex1 e right join ex2 d on e.deptno=d.deptno;

在这里插入图片描述
满足连接条件的有14行,右表中有2行不满足连接条件,故右连接的查询结果应有16行。

完全外连接
  • 完全外连接的结果不仅包含满足连接条件的数据行,还包括左表和右表中不满足连接条件的数据行。
select e.empno,e.ename,e.deptno,d.deptno,d.dname from ex1 e full join ex2 d on e.deptno=d.deptno;

在这里插入图片描述
满足连接条件的有14行,左表和右表中分别有2行不满足连接条件,故完全外连接的查询结果应该有18行。

4. 自然连接

  • 内连接、外连接的列数=左表列数+右表列数
  • 内连接、外连接可以使用别名
  • 自然连接的列数=左表列数+右表列数-左表和右表中名字相同的列数(去除重复列)
  • 自然连接不能使用别名,不需要on子句
  • 自然连接要求连接的两个表必须要有相同的列名
select * from ex1 natural join ex2;

在这里插入图片描述
左表和右表中名字相同的列为deptno,故以该列进行连接。满足连接条件的行数为14行,故自然连接的查询结果为14行。

5. 自连接

  • 若一个表的某两列存在上下级关系,可以通过自连接获取。
select e1.empno,e1.ename,e1.mgr,e2.ename from ex1 e1 inner join ex1 e2 on e1.mgr=e2.empno;

在这里插入图片描述
存在上下级关系的行数只有13行,故自连接的查询结果为13行数据。

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

  • 不需要任何连接条件的连接
  • 不需要on子句
select * from ex1 e cross join ex2 d;

在这里插入图片描述
左表有16行数据,右表有5行数据,任意连接即有16*5=80行数据。

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL(Structured Query Language)是结构化查询语言的缩写,是一种用于管理和操作关系型数据库的语言。精通SQL意味着熟练使用SQL语句进行数据查询、插入、更新和删除等操作,能够高效地处理数据库中的数据。 首先,SQL是一种声明性语言,用户只需描述要求的结果,而不需要指定具体的实现步骤。SQL语句根据一定的语法规则进行书写,通常包括关键字、函数、运算符、表名和字段名等。 结构化查询语言可以用于执行各种数据库操作,包括: 1. 数据查询:使用SELECT语句从一个或多个表中检索数据,可以使用条件、排序、分组等对结果进行限制和筛选。 2. 数据插入:使用INSERT INTO语句将数据插入到表中指定的列中。 3. 数据更新:使用UPDATE语句更新表中的数据,可以指定更新哪些列、更新的条件和新的值。 4. 数据删除:使用DELETE FROM语句从表中删除数据,可以根据条件删除指定数据。 SQL还支持数据的合并、拆分和重新组合等操作。通过使用JOIN语句,可以在不同的表之间建立关联,从而实现多表查询。同时,SQL还提供了聚合函数(如SUM、AVG、COUNT等)用于计算和统计数据。 精通SQL还需要掌握SQL的优化技巧,以提高查询的效率。这包括合理设计数据表的结构,创建索引以提高查询速度,避免使用子查询等效率较低的操作。 总之,精通SQL是一个数据库工作者必备的技能。只有掌握SQL语言的各种特性和用法,才能高效地管理和操纵数据库中的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值