• 学习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的员工姓名和编号?

    1. mysql-> select empno,ename from emp where sal!=800;
    2. 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  |

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

    可以发现

    1. mysql> select empno,ename,job from emp where job='manager' or job='salesman';
    2. 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  |

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

  • 相关阅读:
    LabVIEW性能和内存管理 7 LabVIEW中局部和全局变量的内存分配
    导师演讲稿
    基础复习——共享参数SharedPreferences——记住密码项目——存储卡的文件操作(读写文件&读写图片)...
    linux 查看系统版本
    Java项目:基于jsp+sevlet+mysql日记系统
    基于springboot+vue的纺织品企业财务管理系统
    Ubuntu安装MySQL 在线和离线方式
    (一)docker:建立oracle数据库
    QStyleFactor和QPalette
    Feign应用及源码剖析
  • 原文地址:https://blog.csdn.net/qq_52905520/article/details/126679419