去除查询结果重复记录[distinct]
注意:原表数据不会被修改,只是查询结果去重
去重需要使用一个关键字:distinct
#语法错误
#distinct只能出现在所有字段的最前方
select deptno,distinct job from emp;
从一张表中单独查询,称为单表查询
emp表和dept表联合起来查询数据,从emp表中取员工名字,从dept表中取部门名字,
这种跨表查询,多张表联合起来查询数据,被称为连接查询
SQL92:1992年的时候出现的语法
SQL99:1999年的时候出现的语法
根据表的连接方式分类:
内连接:
外连接:
当两张表进行连接查询,没有任何条件限制的时候,最终查询结果条数,是两张表条数的乘积
这种现象被称为:笛卡尔积现象(笛卡尔发现的,这是一个数学现象)
怎么避免笛卡尔积现象
连接时加条件,满足这个条件的记录会被筛选出来
最终查询的结果条数是14条,但是匹配的过程中,匹配的次数还是56次,只不过进行了四选一,次数并没有减少
通过笛卡尔积现象得出,表的连接次数越多效率越低,尽量避免表的连接次数
use cedric;
#案例:查询每个员工所在的部门名称,显示员工名和部门名
select
d.dname,e.ename
from
dept d, emp e
where
d.DEPTNO = e.DEPTNO;
#sql92缺点:结构不清晰,表的连接条件和后期进一步筛查的条件都放到了where后面
select
e.ENAME,d.DNAME
from
emp e
join
dept d
on
e.DEPTNO = d.DEPTNO;
#sql99优点:表连接的条件是独立的,连接之后如果还需要近一步筛选,再往后继续添加where
/*
SQL99语法:
select
...
from
a
join
b
on
a和b的连接条件
where
筛选条件
*/
# inner可以省略(带着inner可读性更好,一眼就能看出来是内连接)
select
e.ENAME,d.DNAME
from
emp e
inner join
dept d
on
e.DEPTNO = d.DEPTNO; #条件是等量关系,所以被称为等值连接
use cedric;
#内连接
select
e.ename,d.dname
from
emp e
join
dept d
on
e.DEPTNO = d.DEPTNO;
#外连接(右外连接)
select
e.ename,d.dname
from
emp e
right outer join
dept d
on
e.DEPTNO = d.DEPTNO;
#right:表示将join关键字右边的这张表看成主表,主要是为了将这张表的数据全部查询出来,捎带着关联查询左边的表 在外连接当中,两张表连接,产生了主次关系
#外连接(左外连接)
# outer是可以省略的,带着可读性强
select
e.ename,d.dname
from
dept d
left outer join
emp e
on
d.DEPTNO = e.DEPTNO;
/*
带有right的是右外连接,又叫做右连接
带有left的是左外连接,又叫做左连接
任何一个右连接都有左连接的写法
任何一个左连接多有右连接的写法
*/
#查询每个员工的上级领导,要求显示所有员工的名字和领导名
select empno,ename,mgr from emp;
select
a.ename as ‘员工名‘,b.ename as ‘领导名‘
from
emp a
left join
emp b
on
a.mgr = b.empNO;
语法: select ... from a join b on a和b的连接条件 right join c on a和c的连接条件 left join d on a和d的连接条件 一条SQL中内连接和外连接可以混合,都可以出现
原文:https://www.cnblogs.com/cedric1114/p/15310039.html