CONTENT
一、基本查询操作
二、MySQL数据排序、分组查询
三、MySQL对查询结果去重
一、基本查询操作
1、条件查询使用where语句,运算符如下所示:
2、字段可以参与数学运算,比如查询员工的年薪(我是用Linux下MariaDB,SQL语句基本都是通用的)
select ENAME ,SAL*12 from EMP;
给查询的结果重命名,中文要加单引号,用as关键字:
select ENAME ,SAL*12 as '年薪' from EMP;
as关键字可以省略:
select ENAME,EMPNO,SAL*12 yearsal from EMP;
3、下面举出一些查询例子:
查询SMITH的工资:
select SAL from EMP where ENAME = 'SMITH' ;
找出工资高于3000的员工:
select ENAME,SAL from EMP where SAL > 3000;
找出工资不等于3000的员工:
select ENAME,SAL from EMP where SAL != 3000;
找出工资在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还可以使用在字符串上面,例如查出名字在A与C之间的员工(左闭右开,所以右边是D,这个很少用):
select ENAME from EMP where ENAME between 'A' and 'D';
查出哪些人没有津贴:(空值null和COMM值为0不一样,要区别开!)
select ENAME,SAL,COMM from EMP where COMM = 0 or COMM is null;
4、and和or要区别开,
如找出薪资大于1000的并且部门编号是20或30部门的员工(运算符的优先级不确定时加小括号):
select ENAME,SAL,DEPTNO from EMP where SAL>1000 and (DEPTNO = 20 or DEPTNO=30);
5、in等同于or:
找出工作岗位是MANAGER和SALESMAN的员工
select ENAME,JOB from EMP where JOB in('SALESMAN','MANAGER');
找出工资为800和5000的员工:
select ENAME,SAL from EMP where SAL in(800,5000);
not in 不在这些值中:
select ENAME,SAL from EMP where SAL not in(800,5000);
6、_和%的运用
找出名字含有C或者首字母为C的员工(_代表一个字符,%代表多个字符,)
若查询名字含有_的员工,要用转义符号,模仿格式,如:
select name from EMP where name like '%\_%';
二、MySQL数据排序、分组查询
1、排序:默认是升序,可以指定升序(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;//降序
按照工资的降序排列,当工资相同时再按照,名字的升序排列,注意前面的字段起主导作用,前面相同时再匹配后面的。
select ENAME,SAL from EMP order by SAL desc;
select ENAME,SAL from EMP order by SAL desc,ENAME asc;
找出工作岗位是SALESMAN的员工,并且要求按照薪资的降序排列:
select ENAME,JOB,SAL from EMP where JOB ='SALESMAN' order by SAL desc;
2、分组函数(多行处理函数),特点输入多行最终输出的结果是1行。
count(计数)、sum(求和)、avg(平均值)、max(最大值)、min(最小值)
注意所有的分组函数都是对某一组数据进行操作的。
eg:
select sum(SAL) from EMP; -- 找出工资总和:
select max(SAL) from EMP; -- 找出最高工资:
select min(SAL) from EMP; -- 找出最低工资:
select avg(SAL) from EMP; -- 找出平均工资
select count(*) from EMP; -- 找出总人数
select count(ENAME) from EMP; -- 也是找出总人数
分组函数自动忽略NULL,所以一般查询语句后面无需额外添加过滤条件。
select count(COMM) from EMP;
3、单行处理函数(输入一行,输出一行)
计算每个员工的年薪:
select ENAME,(SAL+COMM)*12 as yearsal from EMP;-- (数据库规定,只要有NULL参与运算,结果为NULL)
要使用ifnull函数
select ENAME,(SAL+(ifnull(COMM,0)))*12 as yearsal from EMP; -- 如果COMM为NULL则当0处理)
分组函数可以组合一起用:
select count(*),sum(SAL),avg(SAL),max(SAL),min(SAL) from EMP;
where后可以再接一个查询语句,如找出工资高于平均工资的员工:
select ENAME,SAl from EMP where SAL>(select avg(SAL) from EMP);
4、SQL中有一个语法规则,分组函数不可直接使用在where子句当中。因为group by是在where执行后才会执行。
5、group by(按照某个字段或者某些字段进行分组) 和having(对分组之后的数据进行再过滤)
分组函数一般都会和group by联合使用,这就是它被称为分组函数的原因。
还有一个规则,当一条语句有group by的话,select后面只能和分组函数和参与分组的字段。如:
select ENAME,MAX(SAL),JOB from EMP group by JOB; -- 这和在Oracle数据库会报错,MySQL中不报错,但没有意义。
group by案例:
找出每个工作岗位的最高薪资:
select max(SAL),JOB from EMP group by JOB;
每个工作岗位的平均薪资:
select JOB,avg(SAL) from EMP group by JOB;
多个字段联合起来一块分组,如找出每个部门不同岗位的最高薪资:
select DEPTNO,JOB,max(SAL) from EMP group by DEPTNO,JOB;
having案例:
找出每个部门的最高薪资,要求显示薪资大于2900的数据:
select max(SAL),DEPTNO from EMP group by DEPTNO having max(SAL)>2900; -- 效率比较低
select max(SAL),DEPTNO from EMP where SAL>2900 group by DEPTNO; --或者用这个效率较高建议使用where过滤
有时候就必须用having过滤,如找出每个部门的平均薪资并要求薪资大于2000的数据:
select DEPTNO,avg(SAL) from EMP group by DEPTNO having avg(SAL)>2000;
注意只有出现了group by才能使用having ,this is very important.
三、MySQL对查询结果去重
(1)用distinct关键字去除重复记录,比如查询EMP表中JOB的种类:
select distinct JOB from EMP;
注意://下面这句sql语句是错误的,distinct只能出现在所有字段的最前面
select ENAME,distinct JOB from EMP;
(2)查询DEPTNO和JOB两栏都不重复的数据:
select distinct DEPTNO,JOB from EMP;
常见的案例:查询岗位的数量:
select count(distinct JOB) from EMP;