1.关于查询结果集的去重 使用关键字distinct
例如:eg1去除emp中的重复记录
select distinct deptno,job from emp;
注意:distinct只能出现在所有字段的最前面!!!
eg2统计岗位的数量
select count(distinct job) from emp;
2.连接查询
2.1在实际开发过程中,大部分的情况都不是从单表之中查询,都是许多表关联起来查询。
2.2连接查询的分类
内连接,包括等值连接,非等值连接,自连接
外连接,包括左外连接(左连接),右外连接(右连接)
全连接
2.3在表的连接查询中有一种现象叫做笛卡尔积现象
例如:找出每一个员工的部门名称,要求显示员工名和部门名。
select ename,dname from emp,dept; //这里能看到一共有56条记录
笛卡尔乘积现象:当两张表进行连接查询的时候,没有任何条件进行限制,最终的查询结果条数是两张表记录条数的乘积。
但一般都是用表的别名这种语句进行查询
select e.ename,d.dname from emp e,dept d;
表的别名有什么好处?
No1.执行效率高 No2.可读性好
2.4避免笛卡尔积现象可以采用加条件过滤,但是避免笛卡尔积现象不会减少匹配次数,加条件只不过是显示出了有效记录。
2.5 内连接中的等值连接
最大的特点是:条件是等量关系
常用语法 select e.ename,d.dname from emp e inner join dept d on e.deptno = d.deptno;//SQL99语法,这里的inner可以省略。效果如下所示
SQL99语法比较清晰,表的连接条件和之后的where条件分离了
2.6内连接中的非等值连接
最大的特点是:连接条件中的关系是非等量关系
例如:找出每个员工的工资等级,要求显示员工名,工资,工资等级
select e.ename,e.sal,s.grade from emp e join s.salgrade on e.sal between s.losal and s.hisal;
2.7内连接中的自连接
最大特点是:一张表可以看作两张表,自己连自己。
例如:找出每个员工的上级领导,要求显示员工名和对应的领导名。
select a.ename as '员工名',b.ename as '领导名' from emp a join emp b on a.mgr = b.empno;
2.8外连接
外连接和内连接的区别
内连接:假设A和B进行连接,使用内连接的话,凡是A表和B表能够匹配上的记录都查询出来,这就是内连接。AB两张表没有主副之分,两张表是平等的。
外连接:
假设A和B表进行连接,使用外连接的话,AB两张表中有一张表是主表,一张表是副表,主要查询主表中的数据,捎带着查询副表,当副表中的数据没有和主表中的数据匹配上,副表自动模拟出NULL与之匹配。
外连接的分类?
左外连接(左连接):表示左边的这张表是主表。
右外连接(右连接):表示右边的这张表是主表。
左连接有右连接的写法,右连接也会有对应的左连接的写法。
例如:找出每个员工的上级领导
select a.ename as '员工名',b.ename as '领导名' from emp a left join emp b on a.mgr = b.empno;
这里之所以比上面的查询数据多了一个KING,是因为KING也算是员工,但是他是大BOSS,没有上级领导。
外连接最重要的特点是:主表的数据无条件的全部都查出来
例如:找出哪个部门没有员工
select d.* from dept d left join emp e on d.deptno = e.deptno where e.empno is null;
2.9三张表的连接查询
例如:找出每一个员工的部门名称以及工资等级
EMP e
+-------+--------+---------+--------+
| empno | ename | sal | deptno |
+-------+--------+---------+--------+
| 7369 | SMITH | 800.00 | 20 |
| 7499 | ALLEN | 1600.00 | 30 |
| 7521 | WARD | 1250.00 | 30 |
| 7566 | JONES | 2975.00 | 20 |
| 7654 | MARTIN | 1250.00 | 30 |
| 7698 | BLAKE | 2850.00 | 30 |
| 7782 | CLARK | 2450.00 | 10 |
| 7788 | SCOTT | 3000.00 | 20 |
| 7839 | KING | 5000.00 | 10 |
| 7844 | TURNER | 1500.00 | 30 |
| 7876 | ADAMS | 1100.00 | 20 |
| 7900 | JAMES | 950.00 | 30 |
| 7902 | FORD | 3000.00 | 20 |
| 7934 | MILLER | 1300.00 | 10 |
+-------+--------+---------+--------+
DEPT d
+--------+------------+----------+
| DEPTNO | DNAME | LOC |
+--------+------------+----------+
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
+--------+------------+----------+
SALGRADE s
+-------+-------+-------+
| GRADE | LOSAL | HISAL |
+-------+-------+-------+
| 1 | 700 | 1200 |
| 2 | 1201 | 1400 |
| 3 | 1401 | 2000 |
| 4 | 2001 | 3000 |
| 5 | 3001 | 9999 |
+-------+-------+-------+
select e.ename,d.dname,s.grade from emp e left join dept d on a.deptno = d.deptno left join salgrade s on e.sal between s.losal and s.hisal;
3.子查询
3.1什么是子查询?子查询都可以出现在哪里?
select语句当中嵌套select语句,被嵌套的select语句是子查询。
子查询可以出现在哪里?
select
..(select).
from
..(select).
where
..(select).
3.2where子句中使用子查询
例如:找出高于平均薪资的员工信息
select * from emp where sal > (select avg(sal) from emp);
3.3from后面嵌套子查询
例如:找出每个部门平均薪水的薪资等级。
第一步:找出每个部门平均薪水(按照部门编号分组,求sal的平均值)
select deptno,avg(sal) as avgsal from emp group by deptno;
第二步:将以上的查询结果当作临时表t,让t表和salgrade s表连接,条件是:t.avgsal between s.losal and s.hisal;
select t.*,s.grade from (select deptno,avg(sal) as avgsal from emp group by deptno) t left join salgrade s on t.avgsal between s.losal and s.hisal;
3.4在select后面嵌套子查询
4.union(可以将查询结果集相加)
例如:找出工作岗位是salesman和manager的员工
按照之前讲的也能写出来
第一种:select ename,job from emp where job = 'salesman' or job = 'manager';
第二种:用in。select ename,job from emp where job in ('manager','salesman');
第三种:用union。select ename,job from emp where job = 'manager'
union
select ename,job from emp where job = 'salesman';
采用union就是将表与表之间的查询结果做拼接。 注意:用union查询时,必须保证前面的查询结果的列的数量和后一个查询结果的列的数量保持一致。
5.limit(重点中的重点,以后分页查询全靠它了)
5.1 limit是MySQL中所特有的,其他的数据库都没有,不通用。
5.2 limit取结果集中的部分数据,这是它的作用
5.3 语法机制
limit startIndex,length startIndex表示起始位置,length表示取几个
例如:取出工资前五名的员工
select ename,sal from emp order by sal limit 5;//我这里是按照升序排
也可以这样写:select ename,sal from emp order by sal limit 0,5;
5.4 limit是sql语句最后执行的一个环节!!!
执行顺序如下:
select 5
...
from 1
...
where 2
...
group by 3
...
having 4
...
order by 6
...
limit 7
...;
例如:找出工资排名在第4到第9名的员工
select ename,sal from emp order by sal limit 3,6;
5.6 通用的标准分页sql
例如:每页显示3条信息
第一页:0,3;
第二页:3, 3;
第三页:6,3;
此时就能发现规律
每页显示n条消息,那么规律如下
第pageNo页:(pageNo - 1) * n,n //这里的pageNo就是显示第几页,n表示每页显示多少条记录
感谢观看!我是酷酷的涛!!!