12.条件查询
语法格式:
select 字段,字段... from 表名 where 条件;
执行顺序:先from,然后where,最后select
查询工资等于5000的员工姓名?
select ename from emp where sal = 5000;
(1)查询条件是字符串
查询SMITH的工资?
select sal from emp where ename = 'SMITH'; // 字符串使用单引号括起来。
(2)大于,等于,不等于
找出工资高于3000的员工?
select ename,sal from emp where sal > 3000;
select ename,sal from emp where sal >= 3000;
select ename,sal from emp where sal < 3000;
select ename,sal from emp where sal <= 3000;
找出工资不等于3000的?
select ename,sal from emp where sal <> 3000;
select ename,sal from emp where sal != 3000;
(3)and,between and
找出工资在1100和3000之间的员工,包括1100和3000?
select ename,sal from emp where sal >= 1100 and sal <= 3000;
select ename,sal from emp where sal between 1100 and 3000; // between...and...是闭区间 [1100 ~ 3000]
select ename,sal from emp where sal between 3300 and 1100;
#between and 在使用时要左小右大。
between and除了在数字方面之外,还可以在字符串方面
select ename from emp where ename between 'A' and 'C';//左闭右开
(4)is null,is not null
找出那些人津贴(comm)为null?在数据库中null不是一个值,代表什么都没有,为空。
空不是值,不能用等号衡量。必须用is null或者is not null
select ename,sal,comm from emp where comm is null;
找出那些人津贴不为null?
select ename,sal,comm from emp where comm is not null;
找出那些人没有津贴(comm)?
select ename,sal,comm from emp where comm is null or comm = 0;
(5)or,and,in,not in
找出岗位是MANAGER和SAlESMAN的员工?
select ename,job from emp where job ='MANAGER' or job = 'SAlESMAN';
and和or联合使用:找出薪资大于2000并且部门编号是20或30的部门员工
select ename,sal,deptno from emp where sal > 2000 and (deptno =20 or deptno =30);
注意:运算符优先级不确定时加小括号。
in等同于or:找出岗位是MANAGER和SAlESMAN的员工?
select ename,job from emp where job in ('MANAGER','SALESMAN');
select ename,sal from emp where sal in ('800','5000');//in后面的值不是区间,是具体的值。
not in:不在这几个值当中
select ename,sal from emp where sal not in ('800','5000');
(6)模糊查询like
找出名字中有o的?
(在模糊查询中,%代表任意多个字符,_代表任意一个字符)
select ename from emp where ename like '%o%';
'%o%';
找出名字中第二个字母为a的?
select ename from emp where ename like '_a%';
转义字符 \:找出名字中有下划线的?
select ename from emp where ename like '%\_%';
13.排序(升序,降序)
order by 关键词 asc/desc
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;
(1)当进行两次排序时
按照工资的降序排,当工资相同的时候安装名字的升序排?
select ename,sal from emp order by sal desc,ename asc;
(2)指定列排序(不够健壮,当列改变后就会出错)
select ename,sal from emp order by 2;(对查询出的第二列进行排序)
(3)where+order by的使用
select 字段,字段 3
from 表 1 最先执行
where 条件 2
order by 关键词; 4
找出工作岗位是SALESMAN的员工,并且要求按照薪资的降序排列。
select ename,job,sal from emp where job = 'SALESMAN' order by 3 desc;
14.分组函数
count 计数
sum 求和
avg 平均值
max 最大值
min 最小值
注意:所有分组函数都是对“某一组”数据进行操作的
找出工资总和?
select sum(sal) from emp;
找出最高工资,最低工资,平均工资,总人数
select max(sal),min(sal),avg(sal),count(*) from emp;
分组函数又叫多行处理函数:输入多行,输出一行。
注意:分组函数自动忽略null
select count(comm) from emp;
找出高于平均工资的员工?
select ename,sal from emp where sal > avg(sal); 报错1111
原因:sql语句中分组按时不能直接使用在where子句当中。???
count(*)和count(字段)的区别:
count(*):部署统计某个字段的个数,而是统计总记录条数。和字段无关
count(字段):表示统计字段中不为null的数据总数量。
15.单行处理函数
输入一行,输出一行
计算每个员工的年薪?
select ename,(sal+comm)*12 as yearsal from emp;
重点注意:在所以数据库中,只要有null参与运算 结果都为null。
ifnull() 空处理函数
ifnull(可能为null的数据,null被当做什么来处理);
select ename,(sal+ifnull(comm,0))*12 as yearsal from emp;
16.group by 和having
group by:安装某个或某些字段进行分组
having:对分组之后的数据进行再次过滤
找出每个工作岗位的最高薪资?
select max(sal),job from emp group by job;
注意:分组函数一般会和group by联合使用
任何一个分组函数都是在group by执行结束后才会执行
在一条sql语句中,如果没有group by,整张表的数据会自成一组。