一、条件查询---where
列值为null 和 不为null
- select......where XX is/is not null;
别名 as
- select XX as xx from 表名;
去重 distinct
- select distinct XX from 表名;
比较运算符 > < = >= <= !=(<>)
and/or
查询字段的值为多个时用in
- select......where XX in (value1,value2,value3...);
查询字段的值在某两个数值之间, 包含and两边的数值用between x and y
like
- _:代表单个未知字符
- %:代表多个未知字符
- -以a开头 a%
- -以a结尾 %a
- -第二个字符是a _a%
- -包含a %a%
- -倒数第三个字符是a %a_ _
- -第二个和最后一个是a _a%a
二、查询结果排序---order by
升序:asc(默认)
降序:desc
多字段排序时,当第一个字段值相同时开始第二个字段排序
三、分页查询---limit
limit 要跳过的条数 要查询的条数
- 第2页数据每页5条 select ... from ... limit 5,5;
- 第3页数据每页3条 select ... from ... limit 6,3;
- 最大数据 select ... from ... order by ... desc limit 0,1;
- 最小数据 select ... from ... order by ... asc limit 0,1;
四、分组查询---group by
分组查询通常和聚合函数搭配使用,查询条件中的每个xxx,xxx就作为分组的条件,group by xxx;
聚合函数:sum(求和)、avg(平均值)、max(最大值)、min(最小值)、count(统计数量)
- 查询每个部门的最高工资 select deptno,max(sal) from emp group by deptno;
- 查询每个部门的最低工资 select deptno,min(sal) from emp group by deptno;
- 查询每个部门的平均工资 select deptno,avg(sal) from emp group by deptno;
- 查询每个部门的工资总和 select deptno,sum(sal) from emp group by deptno;
- 查询每个部门工资大于2000的人数 select deptno,count(*) from emp where sal>2000 group by deptno;
五、有条件的分组查询---Having
写在 group by 后面,通常是和group by结合使用
普通字段的条件筛选写在where后面,聚合函数条件筛选写在having后面
- 查询每个部门的平均工资,要求平均工资大于2000; select deptno,avg(sal) a from emp group by deptno having a>2000;
六、子查询
嵌套在sql语句里面的查询sql语句 称为子查询
子查询可以有多层嵌套
子查询可以写在的位置有:
- 写在where/having后面做查询条件的值
- 写在from后面当成一张新的表 必须起别名 select * from (select * from xxx) t1;
- 可以写在创建表的时候 create table XXX as (select * from xxx);
查询部门平均工资最高的部门信息
-1.得到最高的平均工资 select avg(sal) a from emp group by deptno order by a desc limit 0,1;
-2.得到最高平均工资的部门编号 select deptno from emp group by deptno having avg(sal)=(select avg(sal) a from emp group by deptno order by a desc limit 0,1);
-3.查询所有部门详情 条件是-2的结果 select * from dept where deptno in (select deptno from emp group by deptno having avg(sal)=(select avg(sal) a from emp group by deptno order by a desc limit 0,1));
七、关联查询
同时查询多张表的数据称为关联查询
笛卡尔积
- 关联查询如果不写关联关系,则查询结果的总条目数为两张表的乘积,这个乘积称为笛卡尔积.是一种错误的查询结果
等值连接和内连接
等值连接和内连接都是关联查询的查询方式,效果相同.内连接可读性更高
- 等值连接格式: select * from A,B where A.x=B.x and A.y=abc;
- 内连接格式: select * from A [inner] join B on A.x=B.x where A.y=abc;(inner可省略)
- 查询在new york工作的所有员工信息 select e.* from emp e join dept d on e.deptno=d.deptno where d.loc='new york';
外连接
关联查询时有时只查询两张表有关系的数据,不能满足需求,如果需要查询某一张表所有数据(包含没有关系的),则使用外连接查询方式
- 左外连接:以join 左边表为主表查询所有数据,右边表只查询有关系的数据
- 右外连接:以join 右边表为主表查询所有数据,左边表只查询有关系的数据
- 查询所有员工的名字和对应的部门名(使用左外) select e.ename,d.dname from emp e left join dept d on e.deptno=d.deptno;
- 查询所有部门和对应的员工名(使用右外) select e.ename,d.dname from emp e right join dept d on e.deptno=d.deptno;
八、自关联
在一张表中有一个字段指向当前表的id,这种称为自关联。当保存的数据有层级关系并且不确定有多少层的时候使用自关联.
查询员工姓名和对应的上级姓名
select e.ename,m.ename from emp e join emp m on e.mgr = e.empno;