1、关于查询结果集的去重
记住:distinct只能出现在所有字段的最前面。
distinct对后面的字段是联合去重,只要其中一个字段的数据不一样就不会去重。
例子:mysql> select distinct job from emp; // distinct关键字去除重复记录。
2、连接查询
根据表的连接方式来划分,包括:
内连接:
等值连接
非等值连接
自连接
外连接:
左外连接(左连接)
右外连接(右连接)
全连接( 很少用!)
(1)笛卡尔积现象
当两张表进行连接查询的时候,没有任何条件进行限制,最终的查询结果条数是两张表记录条数的乘积。
(2)表的别名的好处(当几张表有名字一样的字段时可以区分开来)
第一:执行效率高。
第二:可读性好。
例子:select e.ename,d.dname from emp e,dept d;
将emp重命名为e,将dept重命名为d,e.ename就会查询e中的ename,d.dname就会查询d中的dname
(3)内连接之等值连接:最大特点是:条件是等量关系。
语法:
…
A
join
B
on
连接条件
where
…
例子:查询每个员工的部门名称,要求显示员工名和部门名。(从emp员工表和dept部门表中操作)
select
e.ename,d.dname
from
emp e
inner join // inner可以省略的,带着inner目的是可读性好一些。
dept d
on
e.deptno = d.deptno;
(4)内连接之非等值连接:最大的特点是:连接条件中的关系是非等量关系。
连接条件为区间。
案例:找出每个员工的工资等级,要求显示员工名、工资、工资等级。
// inner可以省略
select
e.ename,e.sal,s.grade
from
emp e
inner join
salgrade s
on
e.sal between s.losal and s.hisal;
(5)自连接:最大的特点是:一张表看做两张表。自己连接自己。
案例:找出每个员工的上级领导,要求显示员工名和对应的领导名。
±------±-------±-----+ empno为员工编号
| empno | ename | mgr | mgr为领导编号
±------±-------±-----+
| 7369 | SMITH | 7902 |
| 7499 | ALLEN | 7698 |
| 7521 | WARD | 7698 |
| 7566 | JONES | 7839 |
| 7654 | MARTIN | 7698 |
| 7698 | BLAKE | 7839 |
| 7782 | CLARK | 7839 |
| 7788 | SCOTT | 7566 |
| 7839 | KING | NULL |
| 7844 | TURNER | 7698 |
| 7876 | ADAMS | 7788 |
| 7900 | JAMES | 7698 |
| 7902 | FORD | 7566 |
| 7934 | MILLER | 7782 |
±------±-------±-----+
select
a.ename as ‘员工名’,b.ename as ‘领导名’
from
emp a
inner join
emp b
on
a.mgr = b.empno;