3、条件查询

白昼怎懂夜的黑 提交于 2019-12-01 02:43:43

1 语法格式:

select

字段,字段...

from

表名

where

条件;

执行顺序:先from,然后where,最后select

1. 查询工资等于5000的员工姓名?

select enamel from emp where sal = 5000 ;

2. 查询Smith的工资

select enamel from emp where ename = 'Smith' ;字符串使用单引号括起来

注意:

在数据库中 null 不是一个值,代表什么也没有,为空

空不是一个值,不能用等号衡量

必须使用 is null 或者 is not null

  • and 和 or 连起来使用

    注意:当运算符的优先级不确定的时候加小括号。

  • in等同于 or:找出工作岗位是m 或 n的员工

    select ename,job from emp where job = 'm' or job = 'n';

    select ename,job from emp where job in('m','n');

    select ename,job from emp where job in('1000,'5000') in后面的值不是区间,是具体的值

  • not in:不在这几个值之间

  • 模糊查询 like

    • 找出名字中含有o的?

      (在模糊查询当中,必须掌握两个特殊的符号,一个是%,另一个是_)

      %代表多个字符,_代表任意一个字符。

  • 排序:(升序、降序)

    select ename,sal from emp order by sal;//升序(默认)

    select ename,sal from emp order by sal asc ;//升序

    select ename,sal from emp order by sal desc; //降序

    按照工资的降序排序,当工资相同的时候在按照名字的升序排列。

    select ename,asl from emp order by sal sesc,ename asc;

    注意:越靠前的字段越能起到主导作用。只有当前面的字段无法完成排序的时候,才会启用后面的字段。

    注意:排序的时候可以用排序的字段by 2 (第二列) 但是不能在实战用使用,必须要将字段名写死。

  • 找出工作岗位是SALESMAN的 员工,并且要求按照薪资的降序排列。

    • select

      ename,job,sal

      from

      emp

      where

      job='SALESMAN'

      order by

      sal desc;

      +--------+----------+---------+| ename  | job      | sal     |+--------+----------+---------+| ALLEN  | SALESMAN | 1600.00 || TURNER | SALESMAN | 1500.00 || WARD   | SALESMAN | 1250.00 || MARTIN | SALESMAN | 1250.00 |+--------+----------+---------+

      select

      字段 3

      from

      表名 1

      where

      条件 2

      order by

      。。。 4

  • 分组函数? where后面不能直接使用分组函数

    1. count 计数

    2. sum 求和

    3. avg 平均值

    4. max 最大值

    5. min 最小值

    注意:所有的分组函数都是对“某一组”数据进行操作的。

    • 找出工资总和?

      select sum(sal)from emp;

    • 找出总人数?

      select count(*)from emp;

      select count(ename) from emp;

    • 分组函数一共是5个。

      分组函数还有另一个名字:多行处理函数。

      多行处理函数的特点:输入多行,最终输出的结果是1行。

 

分组函数自动忽略null。

select count(comm) from emp;

找出比平均工资高的员工?

第一步:select avg(sal) from emp; //平均工资

+-------------+| avg(sal)    |+-------------+| 2073.214286 |+-------------+

第二步:select avg(sal) from emp where sal > 2073.214286

总结:select avg(sal) from emp where sal >(select avg(sal) from emp)

select ename,sal from emp where sal > avg(sal);

思考以上的错误信息:无效的使用了分组函数?

原因:SQL语句当中有一个语法规则,分组函数不可直接使用在where字句当中。 why???

怎么解释?

回答:group by是在 where之后运行

select 5

。。。

from 1

。。。。

where 2

。。。

group by 3

。。。

having 4

。。

order by 6

 

  • count(*)和count(具体的某个字段),他们有什么区别?

    1. count(*):不是统计某个字段中数据的个数,而是统计总记录的条数。(和某个字段无关)

    2. count(comm):表示统计comm字段中不为null的数据总数量。

  • 单行处理函数

    1. 什么是单行处理函数?

      输入一行,输出一行。

    2. 计算每个员工的年薪?

      select ename,(sal+comm)+ 12 as yearsal from emp;

    使用ifnull函数:

    select ename,(sal+ifnull(comm,0))*12 as yearsal from emp;

    重点:只要数据库中有null 进行运算,那最终的结果一定是null

    ifbull()空处理函数?

    ifnull(可能为NULL的数据,被当做什么处理)

  • group by 和 having

    • group by:按照某个字段或某些字段进行分组。

    • having:having是对分组之后的数据再次过滤

 

案例:找出每个工作岗位的最高薪资。

select max(sal),job from emp group by job;

注意:分组函数一般都会和group by联合使用,这也是为什么他被称为分组函数的原因。并且任何一个分组函数(count sum avg max min)都是在group by语句执行结束之后才会执行的。当一条sql语句没有group by的话,整张表的数据会自称一组。

select ename,max(sal),job from emp group by job;

以上在mysql当中,查询结果是有的,但是结果没有意义,在Oracle数据库中会报错。语法错误。

Oracle的语法规则会比mysql语法规则严谨。

记住一个规则:当一条语句中有group by 的话,select后面只能跟分组函数和参与分组的字段。

 

多个字段能不能联合起来一块分组?

案例:找出每个部分不同岗位的最高薪资。

select

deptno,job,max(sal)

from

emp

group by

deptno,job;

找出每个部门的最高薪资,要求显示薪资大于2900的数据。

第一步:找出每个部门的最高薪资

select max(sal),deptno from emp group by deptno;

+----------+--------+| max(sal) | deptno |+----------+--------+|  5000.00 |     10 ||  3000.00 |     20 ||  2850.00 |     30 |+----------+--------+

第二步:找出薪资大于2900

select max(sal),deptno from emp where sal > 2900 group by deptno //效率较高

建议:能使用where过滤的尽量使用where过滤

找出每个部门的平均薪资,要求显示薪资大于2000的数据。

第一步:找出每个部门的平均薪资

select deptno,avg(sal) from emp group by deptno;

+--------+-------------+| deptno | avg(sal)    |+--------+-------------+|     10 | 2916.666667 ||     20 | 2175.000000 ||     30 | 1566.666667 |+--------+-------------+

第二步:显示薪资大于2000的数据。

select deptno,avg(sal) from emp group by deptno having max(sal) > 2900;

+--------+-------------+| deptno | avg(sal)    |+--------+-------------+|     10 | 2916.666667 ||     20 | 2175.000000 |+--------+-------------+

where 后面不能使用分组函数。

总结:一个完整的DQL语句怎么写?

select

from

where

group by

having

order by

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!