1. 多表查询
-
去重
-
显式
sqlselect [distinct] A.列名,B.列名,C.列名,... from C join A on A.key=C.FKeyA join B on B.key=C.FKeyA and B.key=A.key [GROUP BY 字段名]
-
隐式
sqlselect [distinct] A.列名,B.列名,C.列名,... from 表A, 表B, 表C where 表A.字段1 = 表B.字段1 and 表B.字段2 = 表C.字段2 and .... [GROUP BY 表名.字段名]
-
-
排序
sqlselect A.列名,B.列名,C.列名,... from C join A on A.key=C.FKeyA join B on B.key=C.FKeyA and B.key=A.key [ORDER BY 表名.字段名]
2. 子查询
- 子查询只返回一个值
- 子查询首选使用in做匹配
- 子查询在其他查询结果的基础上提供了一种有效的方式来表示where字句的条件 。
- 子查询的selec查询总是使用圆括号括起来。
- 对于子查询来说,外查询条件要什么,子查询就查什么。 一一对应的关系。
- 子查询结果分类:
-
标量子查询(子查询结果为单个值):
- 子查询返回的结果是单个值〔数字、字符串、日期等)
- 常用操作符:= <> > >= <= <
-
列子查询(子查询结果为一列):子查询返回的结果是一列
- 常用操作符:in、not in、any、some、all
sqlselect 列表名 from 表名 where 字段名 > all (子查询语句); select 列表名 from 表名 where 字段名 > any (子查询语句)
-
行子查询(子查询结果为一行):
- 常用操作符:=、<>、 in、not in
sqlselect 字段名,... from 表名A where (字段名1,字段名2,...) = (select 字段名1值,字段名2值,... from 表名B where 条件)
-
表子查询(子查询结果为多行多列):in
*sqlselect 字段名,... from 表名A where (字段名1,字段名2,...) in (select 字段名1值,字段名2值,... from 表名B where 条件)
-
3. 内连接:只有匹配到的情况下才会返回结果值
-
格式一(隐式):
sqlfrom 表名1.列名1,表名1.列名2,表名2.列名1,表名2.列名2... form 表名1,表名2 where 表名1.列=表名2.列; //列为相同的列
-
格式二(显式):
sqlselect 表名1.列名1,表名1.列名2,表名2.列名1,表名2.列名2... from 表名1 inner join 表名2 on 表名1.列=表名2.列
4. 外连接
-
外部连接会返回from字句中提到的至少一个表或视图中的所有行
-
左连接:显示左边所有行。如果左表的某行在右表中没有找到匹配的行,则结果集中的右表相对应位置为null。
sqlselect 表名1.列名1,表名1.列名2,表名2.列名1,表名2.列名2 from 表名1 left outer join 表名2 on 表名1.列=表名2.列; //列为大家共有的列
-
右连接:
显示右边所有行
sqlright outer join select 表名1.列名1,表名1.列名2,表名2.列名1,表名2.列名2 from 表名1 right outer join 表名2 on 表名1.列=表名2.列;
-
区分是左连接还是右连接:左连接以坐标为参考,左表没有则返回null,右连接以右表为参考,右表没有则返回null
5.联合查询
-
把多次查询的结果合并起来,形成一个新的查询结果集
-
对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致。
-
union all会将全部的数据直接合并在一起,union 会对合并之后的数据去重。
sqlselect 字段名 from 表A .... UNION [ALL] select 字段名 from 表B ...;