MySQL 数据库中的多表查询操作

大家好,作为一名互联网行业的小白,写博客只是为了巩固自己学习的知识,但由于水平有限,博客中难免会有一些错误出现,有不妥之处恳请各位大佬指点一二!
博客主页:链接: https://blog.csdn.net/weixin_52720197?spm=1018.2118.3001.5343

1. 交叉连接查询

select * from table1 cross join table2;

2. 自然连接查询

select column_name1, column_name2, ···
from table1 natural join table2;

3. 内连接查询

select column_name1, column_name2, ···
from table1[[as] t1] [inner] join table2 [[as] t2]
on join_condition
[where where_condition];

内连接查询是一种典型的连接运算,在连接条“join_condition”中使用像=<>><之类的比较运算符来实现记录的筛选。内连接根据连接条件的不同可以分为等值连接和非等值连接。

3.1.等值连接

select e.empno, e.ename, e.job, e.sal, d.deptno, d.dname, d.loc
from emp e inner join dept d
on e.deptno=d.deptno;

等值连接(SQL92)

select e.empno, e.ename, e.job, e.sal, d.deptno, d.dname, d.loc
from emp e, dept d
where e.deptno=d.deptno;

推荐大家使用 SQL99 中的语法结构这是因为在 SQL92 中,连接条件和查询条件均是放在 WHERE 子句中,如果连接条件和查询条件数量较多时,会产生混淆;而 SQL99 中专门使用 ON 子句来指定连接条件,使用WHERE 子句指定查询条件,不会产生混淆,可读性更高。

3.2. 自连接

select e.empno,e.ename,e.job,m.empno,m.ename,m.job
from emp e inner join emp m
on e.mgr=m.empno
自连接查询(SQL92)
select e.empno,e.ename,e.job,m.empno,m.ename,m.job
from emp e, emp m
where e.mgr=m.empno

3.3.非等值连接

select e1.empno , e1.ename, e1.job ejob, e2.empno lno, e2.ename lname, e2.job
ljob
from emp e1 inner join emp e2
on e1.mgr=e2.empno and e1.empno>e2.empno;
内连接查询—非等值连接(SQL92)
select e1.empno , e1.ename, e1.job ejob, e2.empno lno, e2.ename lname, e2.job
ljob
from emp e1, emp e2
where e1.mgr=e2.empno and e1.empno>e2.empno;

4. 外连接查询

select column_name1, column_name2, ···
from table1[[as] t1] left|right [outer] join table2 [[as] t2]
on join_condition
[where where_condition];

4.1. 左外连接

select e1.ename, e1.job ejob, e2.ename lname, e2.job ljob
from emp e1 left outer join emp e2
on e1.mgr=e2.empno;

4.2.右外连接

select d.*, avg(e.sal) avg_sal
from emp e right outer join dept d
on e.deptno = d.deptno
group by deptno
order by avg_sal;

5.子查询

5.1. 标量子查询

标量子查询指的是子查询(内层查询)返回的结果是一个单一值的标量,如一个数字或者一个字符串,这种方式是子查询中最简单的返回形式。在标量子查询中可以使用“>”、“>=”、“<”、“<=”、“=”、“<>”或者“!=”这些比较运算符对子查询的标量结果进行比较,通常子查询的位置在比较式的右侧。

5.2.行子查询

行子查询指的是子查询(内层查询)返回的结果集是一行 N(N>=1)列,该结果集通常来自于对表中某条记录的查询。在行子查询中也可以使用“>”、“>=”、“<”、“<=”、“=”、“<>”或者“!=”这些比较运算符对子查询的结果进行比较,通常子查询的位置在比较式的右侧。

5.3.列子查询

列子查询指的是子查询(内层查询)返回的结果集是 N(N>=1)行一列,该结果集通常来自于对表中某个字段的查询。在列子查询中可以使用“IN”、“ANY”、“SOME”、
“ALL”操作符,不能直接使用“>”、“>=”、“<”、“<=”、“=”、“<>”或者“!=”这些比较标量结果的比较运算符。

5.4.表子查询

表子查询指的是子查询(内层查询)返回的结果集是 N 行 N 列(N>=1),该结果集通常来自于对表中多条记录的查询。表子查询的结果集可以当做一张临时表来处理,因此这种子查询通常用在 FROM 子句中。

5.5.使用子查询的注意事项

在使用子查询时,我们需要注意以下事项:
(1) 基于未知值时的查询可以考虑使用子查询;
(2) 子查询必须包含在括号内;
(3) 建议将子查询放在比较运算符的右侧,以增强可读性;
(4) 如果子查询返回单行结果(标量子查询和行子查询),则可以在外层查询中对其使
用相应的单行记录比较运算符,如“>”、“>=”、“<”、“<=”、“=”、“<>”或者“!=”;
(5) 如果子查询返回多行结果(列子查询和表子查询),则此时不允许对其直接使用单行记录比较运算符,但可以使用“IN”、“ANY”、“SOME”、“ALL”、“EXISTS”运算符。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值