连接查询

在数据库中join操作被称为连接,作用是能连接多个表的数据(通过连接条件),从多个表中获取数据合并在一起作为结果集返回给客户端。

交叉连接

交叉连接:将两张表的数据与另外一张表彼此交叉

1
2
3
4
5
select * from1 cross join2
eg:
select class.cname, student.sname from student cross join class on class.cid =
student.classid;
--其中的on代表两个表的连接条件

内连接

inner-join

1
2
3
4
5
方式一:
select * from1,表2 where1.列=表2.
方式二:
select * from1
inner join2 on1.列=表2.

外连接

左连接

左连接基础语法是 a left outer join b,其中的 outer 可以省略,与内连接相比就是在与内连接相
同条件下,在内连接的结果集中添加a表在b表中找不到匹配的记录,换句话说就是,结果集中会包含a表中的所有记录,如果b表中有匹配的记录就出现在结果集,否则使用 NULL 代替,也就是把a表看成根本,不可缺失记录。
left-join

1
2
select * from1
left join2 on1.列=表2.

右连接

右外连接基础语法是 a right outer join b,其中的 outer 可以省略,与内连接相比就是在与内连
接相同条件下,在内连接的结果集中添加b表在a表中找不到匹配的记录,换句话说就是,结果集中会包含b表中的所有记录,如果a表中有匹配的记录就出现在结果集,否则使用 NULL 代替,也就是把b表看成根本,不可缺失记录,作用与左外连接恰好相反。
right-join

1
2
select * from1
right join2 on1.列=表2.

自连接

自连接就是表与它自身相关联,进行自连接时通过给表起不同的别名来区分一个表的两个实例。

1
2
3
select 表.字段1,表.字段2,表.字段3 
from1 as 别名,表2 as 别名
where 别名.字段2=别名2.字段3

子查询

子查询指嵌套在查询内部,且必须始终出现在圆括号。子查询可以包含多个关键字或条件,如
DISTINCTGROUP BYORDER BYLIMIT函数等。
子查询的外层查询可以是:SELECTINSERTUPDATESET或DO
子查询可以返回标量,一行,一列或子查询。

将子查询作为派生表

1
select * from1 where 字段1 = (select 字段2 from2);

把子查询用在where子句中

1
2
eg:
select ename,sal from emp where sal>(select avg(sal) form emp);

在from语句中使用子查询

1
2
3
4
5
eg:
select t.deptno,t.avgsal,s.grade
from (select deptno,avg(sal) as avgsal from emp group by deptno) t
join salgrade s
on t.avgsal between s.losal and s.hisal;

集合操作(UNION)

union 作用:合并查询结果集

1
2
3
4
Eg:
select ename,job from emp where job='manager'
union
select ename,job from emp where job='salesman';

limit

1
2
3
4
5
limit 起始下标,长度
如果起始下标没有指定,默认从0开始,0表示表中第一条记录。
Eg:
--按照工资降序排列取前5个
select ename,sal from emp order by sal desc limit 5;

通用的分页SQL(只适用于mysql数据库管理系统)

1
2
3
select t.* from t
order by t.x desc/asc
limit (pageNo-1)*pageSize,pageSize;