目录
(6),between...and... 两个值之间,等同于>= and <=
(7),is null 为null(is not null 不为空)
(10),in 包含,相当于多个or(not in不在这个范围中)
例:找出工资在1250到3000之间的员工信息,要求按照薪资降序排列
(3),substr 取子串(substr(被截取的字符串,起始下标,截取的长度))
(6),综合lower,upper,substr,concat和length的案例
(11),case...when...then...when...then...else...end
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 设置千分位
(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 |
+------------+---------------+