and与or的优化级
- and优先级高于or。
: 比如查询薪水大于1800,并且部门编号为20或30的员工
select * from emp where sal>1800 and deptno=20 or deptno = 30;
上输出的结果不是我们预期的结果,首先SQL语句过滤了 sal > 1800 and deptno = 20,然后再将deptno = 30的员工合并过来,所以是不正确的。
正确:select * from emp where sal>1800 and (deptno=20 or deptno=30);
not和in
- :查询出薪水不是是1600和薪水不是3000的员工 :
1: elect ename,sal from emp where sal <> 1600 and sal <> 3000;
2: select ename,sal from emp where sal !=1600 and sal !=3000;
3: select ename,sal from emp where not (sal = 1600 or sal = 3000;
4: select ename,sal from emp where sal not in (1600,3000);
like模糊查询
- 查询姓名以 M 开头的所有员工
—select ename from emp where ename like ‘M%’; - 查诟姓名以N结尾的所有员工
—select ename from emp where ename like ‘%N’; - 查诟姓名中包含O的所有员工
—select ename from emp where ename like ‘%O%’; - 查诟姓名中第二个字符为A的所有员工
—select ename from emp where ename like ‘_A%’; - 查诟姓名中第三个字符为R的所有员工姓名
—select ename from emp where ename like ‘__R%’;
注:第N个字符,需加N-1个“_”.
order by asc、desc
含义:排序采用 order by 子句,order by 后面跟上排序字段,排序字段可以放多个,多个采 用逗号间隔,order by默认采用升序(asc),如果存在 where 子句,那么 order by 必须放到 where 询句后面.
- 按照 job 和薪水倒序排序
—select ename,job,SAL from emp order by job desc,sal desc;
注:如果采用多个字段排序,如果根据第一个字段排序重复了,会根据第二个字段排序;
处理函数
查询员工姓名,将员工姓名全部转换成小写
—-select lower(ename) as ename from emp;查询显示所员工姓名的第二个字母
——select substr(ename,2,1) from emp;
注:substr(被截取字段名称,起始下标,截取长度) ,起始下标:从1开始取得员工姓名长度
——–select ename,length(ename) as nameLength from emp;ifnull(字段名,替换值)函数:空值处理函数
用法:ifnull(字段名称,将要替换) 结论:在数据库中,有Null参不数学运算的结果一定为Null;为了防止计算结果出现Null, 建议先使用ifnull函数预先处理。
查诟员工姓名及补劣,如果补劣为Null设置为0。
select ename,ifnull(comm,0) from emp;
- . case…when…then…else…end
用法:匹配工作岗位,当为MANAGER时,薪水上调10%,当为SALESMAN时,薪水上调50%,其它岗位薪水不变.
SELECT
ename,
job,
SAL,
(
CASE job
WHEN 'MANAGER' THEN
sal * 1.1
WHEN 'SALESMAN' THEN
sal * 1.5
ELSE
sal
END
) AS newsal
FROM
emptrim(‘字符串’)函数:去除首尾空格
作用:trim函数去除首尾空格,不会去除中间空格
round(数字,保留小数位数)函数:四舍五入
- 保留整数位或无保留小数位:select round(125.18);或者者select round(125.18,0); =======125
- 保留1位小数:select round(125.18,1); ======125.2
个数位四舍五入:select round(125.18,-1); =======130
max(字段名)函数 min(字段名)函数 (自动忽略null的值)
—— 可用于日期类型大小比较 ,比如查询最早入职的员工或者最晚入职的员工count函数
——用法:count(字段名称) 或 count(*)
——注意: 1.count(*)表示取得当前查询表所有记录
2.count(字段名称),不会统计为 null 的记录distinct 去除重复记录
——-作用:将查询结果中某一字段的的重复记录去除掉
——-用法:distinct 字段名或distinct 字段名1, 字段名2 …
——-distinct 字段名A:去除与字段名A相同的记录
——-distinct 字段名A,字段名B:去除与字段名A和字段名B同时相同的记录
——-注意:distinct只能出现在所有字段最前面,后面如果有多个字段及为多字段联合去重 。分组查诟:group by
1. 计算出不同部门不同岗位的最高薪水
select MAX(sal) as maxSal,job,DEPTNO from emp GROUP BY job,DEPTNO order BY maxSal asc
2.找出每个工作岗位的最高薪水,除MANAGER之外
select MAX(sal) as maxSal,job from emp WHERE job != 'PRESIDENT' GROUP BY job order BY maxSal asc
3.找出每个工作岗位的平均薪水,要求显示平均薪水大于2000的
select job,avg(sal) from emp group by job having avg(sal) > 2000
where 不 having 区别:
- where 和 having 都是为了完成数据的过滤,它们后面都是添加条件。
- where 是在 group by之前完成过滤。
- having 是在 group by 之后完成 。
- 能够在where在过滤的数据不要放到having中进行过滤,否则影响SQL询句的执行效率 。