大家好,作为一名互联网行业的小白,写博客只是为了巩固自己学习的知识,但由于水平有限,博客中难免会有一些错误出现,有不妥之处恳请各位大佬指点一二!
博客主页:链接: 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”运算符。