查询结果去重:
select distinct xxx from yyy;
distinct只能出现在所有字段的最前面
- 连接查询的分类:
-
根据语法出现年代划分:
- sql92(一些老的dba可能还在用这种语法,database administrator)
- sql99(比较新的语法)
-
根据表的连接方式划分:
- 内连接(假设AB两表进行连接,查询的是AB匹配的上的数据,两表没有主副之分):
- 等值连接 :最大特点,条件是等量关系
- 非等值连接 :最大特点,连接条件的关系是非等量关系
- 自连接:最大特点,一张表看作两张表,自己连自己
- 外连接(假设AB两表进行连接,AB中有一张是主表,另一张是副表,主要查询主表中的数据,捎带查询副表,当副表中没有数据和主表匹配上,副表的匹配值为null):
- 左外连接(左连接):左边的表为主表,有右连接的写法
- 右外连接(右连接):右边的表为主表,有左连接的写法
- 全连接(很少用)
- 内连接(假设AB两表进行连接,查询的是AB匹配的上的数据,两表没有主副之分):
-
连接原理(sql92):
select
e.ename, d.dname
from
emp e, dept d
where
e.deptno = d.deptno;
连接原理(sql99,等值连接):
select
e.ename, d.dname
from
emp e
join
dept d
on
e.deptno = d.deptno;
非等值连接:
select
e.ename, e.sal, s.grade
from
emp e
join
salgrade s
on
e.sal between s.losal and s.hisal;
自连接:
select
a.ename as '员工名', b.ename as '领导名'
from
emp a
inner join
emp b
on
a.mgr = b.empno;
左连接(outer可以省略):
select
a.ename as '员工名', b.ename as '领导名'
from
emp a
left (outer) join
emp b
on
a.mgr = b.empno;
右连接(outer可以省略):
select
a.ename as '员工名', b.ename as '领导名'
from
emp b
right (outer) join
emp a
on
a.mgr = b.empno;
子查询:
哪里可以出现子查询:
select
(select)
from
(select)
where
(select)
where例子:
select
*
from
emp
where
sal > (select avg(sal) from emp);
from例子:
select
t.*, s.grade
from
(select
deptno, avg(sal) as avgsal
from
emp
group by
septno) t
join
salgrade s
on
t.avgsal between s.losal and s.hisal;
例子(可以用from子查询,但没必要,处理慢,麻烦):
select
e.deptno, avg(s.grade)
from
emp e
join
salgrade s
on
e.sal between s.losal and s.hisal
group by
e.deptno;
select例子:
select
e.ename,
(select
d.dname
from
dept d
where
e.deptno = d.deptno) as dname
from
emp e;