学习MySQL-第三章

目录

11,条件查询

11.1什么是条件查询?

语法格式:

11.2都有哪些条件?

(1),=等于

(2),<>或!=不等于

(3),<小于

(4),<=小于等于

(5),大于>,大于等于>=类似,这里不再赘述

(6),between...and... 两个值之间,等同于>= and <=

(7),is null 为null(is not null 不为空)

(8),and并且,这里不在赘述

(9),or 或者

(10),in 包含,相当于多个or(not in不在这个范围中)

(11),not in 则不是这个数值中任意一个,比如

(12),like 模糊查询

12,排序

12.1查询所有员工薪资并排序?

12.2怎么降序?

12.3可以两个字段排序吗?或者按照多个字段排序?

12.4根据字段的位置也可以排序,了解即可

13,综合案例

例:找出工资在1250到3000之间的员工信息,要求按照薪资降序排列

14,数据处理函数

14.1数据处理函数又被称为单行处理函数

14.2常见的单行处理函数有哪些?

(1),lower 字符串转换小写

(2),upper 字符串转换大写

(3),substr 取子串(substr(被截取的字符串,起始下标,截取的长度))

(4),concat 进行字符串的拼接

(5),length 获得字符串长度

(6),综合lower,upper,substr,concat和length的案例

(7),trim 去除字符串前后空格

(8),str_to_date 将字符串转换成日期

(9),date_format 格式化日期

(10),format 设置千分位

(11),case...when...then...when...then...else...end

(12),round 四舍五入

(13),rand() 生成随机数

(14),ifnull 可以将null转换成一个具体值


11,条件查询

11.1什么是条件查询?

        不是将表中所有数据都查出来,是查询出来符合条件的

语法格式:

        select

                字段1,字段2,字段3....

        from

                表名

        where

                条件;

11.2都有哪些条件?

(1),=等于

例:查询薪资等于800的员工姓名和编号?

mysql> select empno,ename from emp where sal=800;

+-----------+----------+

| empno   | ename |

+-----------+----------+

|  7369     | SMITH |

+-----------+----------+

(2),<>或!=不等于

例:查询薪资不等于800的员工姓名和编号?

mysql-> select empno,ename from emp where sal!=800;

mysql-> select empno,ename from emp where sal<>800;//小于号和大于号组成 的不等号

例:查询SMITH的编号和薪资?

mysql> select empno,sal from emp where ename='SMITH';

+-----------+----------+

| empno   | sal    |

+-----------+----------+

|  7369     | 800.00 |

+-----------+----------+

(3),<小于

例:查询薪资小于2000的员工姓名和编号?

mysql> select empno,ename,sal from emp where sal<2000;

+-----------+-------------+---------------+

| empno   | ename     | sal             |

+-----------+-------------+----------------+

|  7369     | SMITH    |  800.00      |

|  7499     | ALLEN    | 1600.00     |

|  7521     | WARD    | 1250.00     |

|  7654     | MARTIN  | 1250.00    |

|  7844     | TURNER | 1500.00    |

|  7876     | ADAMS   | 1100.00    |

|  7900     | JAMES   |  950.00     | 

|  7934     | MILLER  | 1300.00    |

+-----------+------------+---------------+

(4),<=小于等于

例:查询薪资小于等于3000的员工姓名和编号?

mysql> select empno,ename,sal from emp where sal<=3000;

+-----------+-------------+----------------+

| empno   | ename     | sal               |

+-----------+-------------+----------------+

|  7369     | SMITH     |  800.00      |

|  7499     | ALLEN     | 1600.00      |

|  7521     | WARD     | 1250.00     |

|  7566     | JONES   | 2975.00      |  

|  7654     | MARTIN  | 1250.00     |

|  7698     | BLAKE    | 2850.00     |

|  7782     | CLARK   | 2450.00     |

|  7788     | SCOTT   | 3000.00     |

|  7844     | TURNER | 1500.00    |

|  7876     | ADAMS  | 1100.00      |

|  7900     | JAMES   |  950.00      |

|  7902     | FORD     | 3000.00     |

|  7934     | MILLER  | 1300.00     |

+-----------+------------+---------------+

(5),大于>,大于等于>=类似,这里不再赘述

(6),between...and... 两个值之间,等同于>= and <=

例:查询薪资在2450和3000之间的员工信息?包括2450和3000

第一种方式>= and <= (and是并且的意思)

mysql> select empno,ename,sal from emp where sal>=2450 and sal<=3000;

+-----------+-----------+-------------+

| empno   | ename  | sal           |

+-----------+-----------+-------------+

|  7566     | JONES | 2975.00  |

|  7698     | BLAKE | 2850.00  |

|  7782     | CLARK | 2450.00  |

|  7788     | SCOTT | 3000.00  |

|  7902     | FORD   | 3000.00   |

+-----------+----------+--------------+

第二种方式between...and...

mysql-> select empno,ename,sal from emp where sal between 2450 and 3000;

注意:使用between and的时候,必须遵循左小右大

Between and是闭区间,包括两端的值

(7),is null 为null(is not null 不为空)

例:查询哪些员工的津贴/补助为空?

mysql> select empno,ename from emp where comm is null;

+-----------+--------------+

| empno   | ename      |

+-----------+--------------+

|  7369     | SMITH     |

|  7566     | JONES    |

|  7698     | BLAKE    |

|  7782     | CLARK   |

|  7788     | SCOTT   |

|  7839     | KING       |

|  7876     | ADAMS   |

|  7900     | JAMES   |

|  7902     | FORD     |

|  7934     | MILLER  |

+-----------+--------------+

注意:在数据库中null不能使用等号进行衡量,需要使用is null

因为数据库中的null代表什么也没有,它不是一个值,所以不能使用等号衡量

例:查询哪些员工的津贴/补助不为null?

mysql> select empno,ename,comm from emp where comm is not null;

+-----------+-------------+---------------+

| empno   | ename     | comm        |

+-----------+-------------+---------------+

|  7499     | ALLEN     |  300.00     |

|  7521     | WARD     |  500.00     |

|  7654     | MARTIN  | 1400.00    |

|  7844     | TURNER |    0.00       |

+-----------+-------------+---------------+

(8),and并且,这里不在赘述

(9),or 或者

例:查询工作岗位是MANAGER或者SALESMAN的员工?

mysql> select empno,ename,job from emp where job='manager' or  job='salesman';

+------------+------------+----------------+

| empno    | ename    | job              |

+-----------+-------------+----------------+

|  7499     | ALLEN    | SALESMAN |

|  7521     | WARD    | SALESMAN |

|  7566     | JONES   | MANAGER  |

|  7654     | MARTIN | SALESMAN | 

|  7698     | BLAKE   | MANAGER  |

|  7782     | CLARK   | MANAGER  |

|  7844     | TURNER | SALESMAN |

+-----------+------------+------------------+

and和or同时出现的话,有优先级问题吗?

例:查询工资大于2500,并且部门编号为10或20部门的员工?

我们先这样写

mysql> select * from emp where sal>2500 and deptno='10' or deptno='20';

分析以上语句的问题?

        and优先级比or高

        以上语句会先执行and,然后执行or

以上这个语句表示什么含义?

        表示找出工资大于2500并且部门编号为10的员工,或者20部门所 有员工找出来

正确的做法是用括号把or括起来

mysql> select * from emp where sal>2500 and (deptno='10' or deptno='20');

这样才能表示工资大于2500,并且部门编号为10或20部门的员工

注意:and和or同时出现,and优先级较高。如果想让or先执行,需要加 括号,以后在开发中,如果不确定优先级,就加小括号就行了

(10),in 包含,相当于多个or(not in不在这个范围中)

例:查询工作岗位是MANAGER和SALESMAN的员工?

mysql> select empno,ename,job from emp where job='manager' or job='salesman';

+-----------+-------------+-----------------+

| empno   | ename    | job                |

+-----------+------------+------------------+

|  7499     | ALLEN   | SALESMAN  |

|  7521     | WARD   | SALESMAN  |

|  7566     | JONES  | MANAGER   |

|  7654     | MARTIN | SALESMAN  |

|  7698     | BLAKE   | MANAGER   |

|  7782     | CLARK   | MANAGER   |

|  7844     | TURNER | SALESMAN  |

+-----------+------------+------------------+

用in怎么实现呢?

mysql> select empno,ename,job from emp where job in('manager','salesman');

+-----------+--------------+------------------+

| empno   | ename      | job                |

+-----------+--------------+------------------+

|  7499     | ALLEN     | SALESMAN  |

|  7521     | WARD     | SALESMAN  |

|  7566     | JONES    | MANAGER   |

|  7654     | MARTIN  | SALESMAN  |

|  7698     | BLAKE    | MANAGER   |

|  7782     | CLARK    | MANAGER   |

|  7844     | TURNER | SALESMAN  |

+----------+-------------+-------------------+

可以发现

mysql> select empno,ename,job from emp where job='manager' or job='salesman';

mysql> select empno,ename,job from emp where job in('manager','salesman');

这两段的结果是一样的,所以说in相当于多个or

注意:in不是一个区间,in后面跟的是具体的值

例:查询薪资是800和5000的员工信息?

mysql> select empno,ename,sal from emp where sal in(800,5000);

+-----------+----------+--------------+

| empno   | ename | sal            |

+-----------+----------+---------------+

|  7369     | SMITH | 800.00      |

|  7839     | KING   | 5000.00    |

+-----------+---------+----------------+

这个不是表示800到5000都找出来,只是把sal是800和5000的记录找出来

可以有多个数值

mysql> select empno,ename,sal from emp where sal in(400,800,2000,5000);

(11),not in 则不是这个数值中任意一个,比如

mysql> select empno,ename,sal from emp where sal not in(800,3000,5000);

+-----------+-------------+--------------+

| empno   | ename     | sal            |

+-----------+-------------+--------------+

|  7499     | ALLEN    | 1600.00    |

|  7521     | WARD    | 1250.00    |

|  7566     | JONES   | 2975.00    |

|  7654     | MARTIN | 1250.00    |

|  7698     | BLAKE   | 2850.00    |

|  7782     | CLARK   | 2450.00   |

|  7844     | TURNER | 1500.00  |

|  7876     | ADAMS  | 1100.00    |

|  7900     | JAMES   |  950.00    |

|  7934     | MILLER  | 1300.00   |

+----------+------------+---------------+

这个是找出sal不是800,3000,5000的记录

not 用于取非,主要用在is或in中

(12),like 模糊查询

称为模糊查询,支持%下划线匹配

%匹配任意多个字符

下划线:任意一个字符

(%是一个特殊的符号,_也是一个特殊符号)

例:找出名字中含有o的?

mysql> select ename from emp where ename like '%O%';

+----------+

| ename |

+-----------+

| JONES |

| SCOTT |

| FORD   |

+----------+

例:找出名字中以T结尾的?

mysql> select ename from emp where ename like '%T';

+----------+

| ename |

+----------+

| SCOTT |

+-----------+

例:找出名字中以K开始的?

mysql> select ename from emp where ename like 'K%';

+----------+

| ename |

+----------+

| KING    |

+-----------+

例:找出第二个字母是A的?

mysql> select ename from emp where ename like '_A%';

+-------------+

| ename     |

+-------------+

| WARD     |

| MARTIN  |

| JAMES    |

+--------------+

例:找出第三个字母是R的?

mysql> select ename from emp where ename like '__R%';

+-------------+

| ename     |

+-------------+

| WARD     |

| MARTIN  |

| TURNER |

| FORD      |

+-------------+

例:找出名字中有’_’的?

mysql> select ename from emp where ename like '%_%';

这样写是不对的,不能直接用%_%,因为_是关键字,用于查找任意一个字符

这样写会把所有的名字查找出来

mysql> select ename from emp where ename like '%\_%';

这样写才是对的,用转义字符’\’就可以将’_’转换成普通字符

12,排序

12.1查询所有员工薪资并排序?

mysql> select ename,sal from emp order by sal;//默认是升序!!

+-------------+----------------+

| ename     | sal               |

+-------------+----------------+

| SMITH     |  800.00       |

| JAMES    |  950.00       |

| ADAMS   | 1100.00       |

| WARD     | 1250.00      |

| MARTIN  | 1250.00      |

| MILLER   | 1300.00      |

| TURNER | 1500.00      |

| ALLEN     | 1600.00      |

| CLARK    | 2450.00      |

| BLAKE     | 2850.00      |

| JONES     | 2975.00     |

| SCOTT     | 3000.00    |

| FORD       | 3000.00    |

| KING        | 5000.00     |

+-------------+----------------+

12.2怎么降序?

指定降序:

mysql> select ename,sal from emp order by sal desc;

+-------------+-------------+

| ename     | sal            |

+-------------+-------------+

| KING       | 5000.00   |

| SCOTT    | 3000.00   |

| FORD      | 3000.00   |

| JONES    | 2975.00   |

| BLAKE    | 2850.00   |

| CLARK    | 2450.00   |

| ALLEN     | 1600.00   |

| TURNER | 1500.00   |

| MILLER   | 1300.00   |

| WARD     | 1250.00   |

| MARTIN  | 1250.00   |

| ADAMS   | 1100.00   |

| JAMES   |  950.00    | 

| SMITH    |  800.00    |

+-------------+-------------+

指定升序:

mysql> select ename,sal from emp order by sal asc;

+-------------+----------------+

| ename      | sal              |

+-------------+----------------+

| SMITH     |  800.00       | 

| JAMES     |  950.00      |

| ADAMS    | 1100.00      |

| WARD      | 1250.00     |

| MARTIN   | 1250.00     |

| MILLER    | 1300.00     |

| TURNER  | 1500.00     |

| ALLEN     | 1600.00      |

| CLARK    | 2450.00      |

| BLAKE    | 2850.00      |

| JONES   | 2975.00       |

| SCOTT   | 3000.00       |

| FORD     | 3000.00       |

| KING      | 5000.00       |

+--------------+---------------+

12.3可以两个字段排序吗?或者按照多个字段排序?

例:查询员工名字和薪资,要求按照薪资升序,如果薪资一样的话再按照名字升序排列

mysql> select ename,sal from emp order by sal asc,ename asc;//加个逗号隔开

注意:sal在前,起主导,只有sal相等的时候,才会考虑启动ename排序

12.4根据字段的位置也可以排序,了解即可

mysql> select ename,sal from emp order by 2;//2表示emp表的第二列,第二列是sal

按照查询结果的第二列sal排序

注意:了解一下,不建议在开发中这样写,因为不健壮

因为列的顺序很容易发生改变,列顺序修改之后2就废了

13,综合案例

例:找出工资在1250到3000之间的员工信息,要求按照薪资降序排列

mysql> select empno,ename,sal from emp where sal>=1250 and sal<=3000 order by sal desc;

+-----------+-------------+-------------+

| empno   | ename     | sal          |

+-----------+-------------+------------+

|  7788     | SCOTT   | 3000.00  |

|  7902     | FORD     | 3000.00  |

|  7566     | JONES   | 2975.00  |

|  7698     | BLAKE   | 2850.00  |

|  7782     | CLARK   | 2450.00  |

|  7499     | ALLEN    | 1600.00  | 

|  7844     | TURNER | 1500.00  |

|  7934     | MILLER   | 1300.00  |

|  7521     | WARD     | 1250.00  |

|  7654     | MARTIN  | 1250.00  |

+-----------+------------+-------------+

关键字顺序不能变:

        select

                ...

        from

                ...

        where

                ...

        order by

                ...

以上语句的执行顺序必须掌握:

第一步:from

第二步:where

第三步:select

第四步:order by(排序总是在最后执行)

14,数据处理函数

14.1数据处理函数又被称为单行处理函数

单行处理函数的特点:一个输入对应一个输出

和单行处理函数相对的是:多行处理函数

多行处理函数特点:多个输入对应一个输出!

14.2常见的单行处理函数有哪些?

(1),lower 字符串转换小写

mysql> select lower(ename) as ename from emp;//同时对lower(ename)取别名

(2),upper 字符串转换大写

mysql> select upper(ename) from emp;

(3),substr 取子串(substr(被截取的字符串,起始下标,截取的长度))

mysql> select substr(ename,1,1) as ename from emp;

截取的字符串是ename,从下标1开始,截取的长度是1,同时取别名

返回的name都只有一个字符

注意:起始下标从1开始,没有0

例:找出员工名字第一个字母是A的员工信息?

第一种方式模糊查询

mysql> select ename from emp where ename like 'A%';

第二种方式substr函数

mysql> select ename from emp where substr(ename,1,1)='A';

这两种的结果是一样的

+-----------+

| ename   |

+------------+

| ALLEN   |

| ADAMS  |

+-----------+

(4),concat 进行字符串的拼接

mysql> select concat('abc','456') as result;

+-----------+

| result     |

+-----------+

| abc456  |

+-----------+

(5),length 获得字符串长度

mysql> select length('abcde') as result;

+-----------+

| result     |

+-----------+

|      5       |

+-----------+

(6),综合lower,upper,substr,concat和length的案例

例:将emp表中的ename首字母小写?

mysql> select concat(lower(substr(ename,1,1)),substr(ename,2,length(ename)-1)) as result from emp;

+-----------+

| result     |

+-----------+

| sMITH   |

| aLLEN   |

| wARD   |

| jONES  |

| mARTIN |

| bLAKE  |

| cLARK  |

| sCOTT  |

| kING   |

| tURNER |

| aDAMS  |

| jAMES  |

| fORD   |

| mILLER |

+------------+

我们要想将首字母小写,我们要运用lower函数,我们取出ename的所有首 字母,用lower变成小写,再用concat函数将首字母和剩余部分拼接在一起

(7),trim 去除字符串前后空格

mysql> select trim('  abcd ef  ') as result;

+-----------+

| result     |

+-----------+

| abcd ef |

+-----------+

可以发现把字符串的前后空格去掉了,但是中间的空格去不掉

(8),str_to_date 将字符串转换成日期

(9),date_format 格式化日期

(10),format 设置千分位

format用来数字格式化

格式:format(数字,’格式’)

比如:我们查询一下emp表中sal

 我们希望查询sal是能查到千分位,用format怎么写呢?

mysql> select ename,format(sal,'$999.999') as sal from emp;

 不常用,了解即可

(11),case...when...then...when...then...else...end

当什么时候怎么做,当什么时候怎么做,其他情况怎么办,end结束

例:当员工的工作岗位是MANAGER的时候,工资上调10%,当工作岗位是 SALESMAN的时候,工资上调50%,其他正常

(注意:不修改数据库,只是将查询结果显示为工资上调)

mysql> select ename,job,sal as oldsal,(case job when 'MANAGER' then sal*1.1 when 'SALESMAN' then sal*1.5 else sal end) as newsal from emp;

+--------------+-------------------+-------------+------------+

| ename      | job                   | oldsal      | newsal    |

+--------------+-------------------+-------------+-------------+

| SMITH      | CLERK           |  800.00    |  800.00   |

| ALLEN      | SALESMAN   | 1600.00   | 2400.00   |

| WARD      | SALESMAN   | 1250.00   | 1875.00   |

| JONES     | MANAGER    | 2975.00   | 3272.50   |

| MARTIN   | SALESMAN   | 1250.00   | 1875.00   |

| BLAKE     | MANAGER    | 2850.00   | 3135.00   |

| CLARK    | MANAGER    | 2450.00   | 2695.00    |

| SCOTT    | ANALYST      | 3000.00   | 3000.00    |

| KING       | PRESIDENT  | 5000.00   | 5000.00    |

| TURNER | SALESMAN  | 1500.00    | 2250.00    |

| ADAMS   | CLERK          | 1100.00    | 1100.00    |

| JAMES   | CLERK          |  950.00     |  950.00     |

| FORD     | ANALYST      | 3000.00    | 3000.00    |

| MILLER  | CLERK          | 1300.00    | 1300.00     |

+------------+-------------------+-------------+---------------+

(12),round 四舍五入

mysql> select round(123.515,0) as result;

+-----------+

| result     |

+-----------+

|    124     |

+-----------+

保留了0位小数,也就是保留了整数位

mysql> select round(123.515,1) as result;

这个保留了一位小数

需要注意的是:如果是负数了会发生什么?

mysql> select round(123.515,-1) as result;

+------------+

| result      |

+------------+

|    120      |

+------------+

保留-1位小数,那也就是保留到十位,所以是120,

保留-2位小数,也就是保留到百位,答案是100

以此类推

(13),rand() 生成随机数

mysql> select rand() as result;

+-----------------------------+

| result                          |

+-----------------------------+

| 0.655262130922882 |

+-----------------------------+

(14),ifnull 可以将null转换成一个具体值

ifnull是空处理函数,专门处理空的

在所有数据库当中,只要有NULL参与的数学运算,最终结果就是NULL

mysql> select 100+NULL,200*NULL;

+---------------+-----------------+

| 100+NULL |  200*NULL    |

+---------------+-----------------+

|     NULL      |     NULL      |

+---------------+-----------------+

注意:NULL只要参与运算,最终结果一定是NULL,为了避免这个现象,需要 使用ifnull函数

ifnull函数用法:ifnull(数据,被当做哪个值)

如果”数据”为NULL的时候,把这个数据结构当做哪个值

例:计算员工的年薪?

年薪=(月薪+月补助)*12

我们注意emp表的comm表示月补助,但是有的员工comm为NULL

那么在计算年薪的时候直接按照上面的公司计算的话

有的员工最终结果为NULL,所以就需要用到ifnull了

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

+-------------+-------------+

| ename  | yearsal  |

+-------------+--------------+

| SMITH    |  9600.00   |

| ALLEN    | 22800.00   |

| WARD    | 21000.00   |

| JONES   | 35700.00   |

| MARTIN  | 31800.00   |

| BLAKE    | 34200.00   |

| CLARK    | 29400.00  |

| SCOTT    | 36000.00  |

| KING       | 60000.00  |

| TURNER | 18000.00  |

| ADAMS   | 13200.00  |

| JAMES    | 11400.00  |

| FORD     | 36000.00  | 

| MILLER   | 15600.00  |

+------------+---------------+

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

真的没事鸭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值