-
in后面的跟着具体的值,不是区间!!
注意:in的用法和普通的不加in的用法一样,只不过可读性强(个人认为)
例如:select ename, sal from emp where sal in (1000, 5000);
上述语句指的不是查找出来工资在1000到5000之间的,而是工资为1000和工资为5000的!!
若要查找区间的:
SELECT ENAME, SAL FROM EMP WHERE SAL >= 1000 AND SAL <= 5000;+--------+-----------+---------+| ENAME | JOB | SAL |+--------+-----------+---------+| ALLEN | SALESMAN | 1600.00 || WARD | SALESMAN | 1250.00 || JONES | MANAGER | 2975.00 || MARTIN | SALESMAN | 1250.00 || BLAKE | MANAGER | 2850.00 || CLARK | MANAGER | 2450.00 || SCOTT | ANALYST | 3000.00 || KING | PRESIDENT | 5000.00 || TURNER | SALESMAN | 1500.00 || ADAMS | CLERK | 1100.00 || FORD | ANALYST | 3000.00 || MILLER | CLERK | 1300.00 |+--------+-----------+---------+
2.NOT和is或者in相互搭配,取非。
3.模糊查询like:select ename from emp where ename like ‘_A%’;
3.1):找出名字中含有A的员工:select ename from emp where ename like '%A%';+--------+| ename |+--------+| ALLEN || WARD || MARTIN || BLAKE || CLARK || ADAMS || JAMES |+--------+3.2):找出名字中第二个字母为A的员工:select ename from emp where ename like '_A%';+--------+| ename |+--------+| WARD || MARTIN || JAMES |+--------+3.3):找出名字中有'_'的员工:select ename from emp where ename like '%\_%';3.4):找出名字中最后一个字母是'T'的:select ename from emp where ename like '%T';重点:_代表的任意一个字符,%代表的任意多个字符。
-
排序(升序、降序):
按照工资排序找出员工名和薪资:
语法:order by :
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 | +--------+---------+ 14 rows in set (0.00 sec)
注意:默认按照升序排序。如何指定排序规则?asc表示升序,desc表示降序。
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; //降序+--------+---------+| 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 |+--------+---------+14 rows in set (0.00 sec)
案例:按照工资的降序排列,当工资相同时按照名字的升序排列。
select ename, sal from emp order by sal desc, ename asc;
字段越靠前,起的主导作用就越大,只有当前面的字段排序后出现相等的情况才会执行后面的字段排序
否则后面的字段排序不会执行。EXAMPLE:找出工作岗位是SALESMAN的员工,并且要求按照薪资的降序排列:
select
ename, sal, job 3
from
emp 1
where
job = ‘salesman’ 2
order by
sal desc; 4order by 是最后执行的。
5、分组函数(多行处理函数):
count 计数
sum 求和
ave 平均值
max 最大值
min 最小值
重点:所有的分组函数都是对“某一组”数据进行操作的。找出工资总和?select sum(sal) from emp;
找出最高工资?select max(sal) from emp;
找出最低工资?select min(sal) from emp;
找出平均工资?select ave(sal) from emp;
找出总人数?select count(*) from emp;select count(ename) from emp;重点:分组函数自动忽略NULL:
select count(comm) from emp;
输出:
+-------------+
| count(comm) |
+-------------+
| 4 |
+-------------+全表:
+---------+
| comm |
+---------+
| NULL |
| 300.00 |
| 500.00 |
| NULL |
| 1400.00 |
| NULL |
| NULL |
| NULL |
| NULL |
| 0.00 |
| NULL |
| NULL |
| NULL |
| NULL |
+---------+
共十四条数据,但是自动忽略NULL重点1. sum函数会自动忽略null!select sum(comm) from emp;+-----------+| sum(comm) |+-----------+| 2200.00 |+-----------+1 row in set (0.00 sec) 运算结果不是null,但是数据里有null,所以不需要在后面加上过滤条件where。重点2. 找出高于平均工资的员工:错误实例:select sal, ename from emp where sal > ave(sal);注意:SQL语句中有一个语法规则:分组函数不能直接使用在where子句当中。因为分组函数必须在分组之后才能执行,如果没有group by语句,默认有一个group by语句将整张表自成一组。where语句必须在group by语句执行结束之后才会执行,如果在where语句中套用分组函数,那么此时没有分组,所以一定不会执行这个,报错!正确方式:一:分组查询:select ave(sal) from emp;+-------------+| avg(sal) |+-------------+| 2073.214286 |+-------------+select sal, ename from sal > 2073.214286二:select ename, sal from sal > (select ave(sal) from emp); (子查询);count(*)和count(某个具体的字段)有什么区别?count(*):不是统计某个字段中数据的个数,而是统计总记录条数。(和某个字段无关)count(comm):表示统计comm字段不为NULL的数据总数量。
6、单行处理函数:
什么是单行处理函数?
输入一行,输出一行!
计算员工的年薪?select ename, (sal + comm) * 12 as yearsal from emp; ---------->数据结果不合理!!重点:所有的数据库都是这样规定的:只要有NULL参与了数学运算,其运算结果一定是NULL!处理方法:空值处理函数: ifnull(可能为null的数据,被当作什么处理) : 属于单行处理函数!
上述问题的处理方法: select ename, (sal + ifnull(comm, 0)) * 12 from emp; //值为null的数被当做0处理。数据处理正确!
7、group by和having
group by:按照某个字段或某些字段进行分组。
having:having对分组之后的数据进行再次过滤。1.查找每个工作岗位的最大薪资:
select max(sal) from emp group by job;
select max(sal), job from emp group by job;+----------+-----------+
| max(sal) | job |
+----------+-----------+
| 1300.00 | CLERK |
| 1600.00 | SALESMAN |
| 2975.00 | MANAGER |
| 3000.00 | ANALYST |
| 5000.00 | PRESIDENT |
+----------+-----------+注意:分组函数一般都会和group by联合使用,并且分组函数一定会在group by执行完成后在执行,当一个sql语句中没有group by
时,整张表的数据自成一组。重点:当一个sql语句中有group by的话,select后面只能跟分组函数和参与分组的字段。2. 找出每个部门不同工作岗位的最高薪资:selectdeptno, job, max(sal)fromempgroup by job, deptno;3.找出每个部门的最高薪资,要求显示薪资大于2900的数据:第一步:找出每个部门的最高薪资:select max(sal), deptno from emp group by deptno;第二部:找出薪资大于2900的:select max(sal), deptno from emp group by deptno having max(sal) > 2900;注解:考虑到效率问题,这种方式效率较低,有些数据在刚开始就该被过滤掉,这样就减少了数据量,增加了数据但是以上方式有很多无效数据参与了处理过程。高效处理:select max(sal), deptno where sal > 2900 from emp group by deptno;4.找出每个部门的平均薪资,要求显示薪资大于2900的数据:第一步:找出每个部门的平均薪资:select avg(sal), deptno from emp group by deptno;第二步:显示薪资大于2900的数据select avg(sal), deptno from emp group by deptno having avg(sal) > 2900;
8.总结一个DQL语句怎么写
select 5..
from 1..
where 2..
group by 3..
having 4..
order by 6..