MySQL中简单的DQL(select)语句

MySQL中简单的DQL(select)语句:

1、简单的查询语句(DQL)
语法格式:select 字段名1,字段名2… from 表名字;

注意:任何一条SQL语句都必须以“;”结尾。
sql语句不区分大小写。


例题:查询员工表的全部字段数据。
select * from emp;

注意:实际开发中不建议使用 *,效率较低,就是不要把 * 写进代码里,自己查询可以用。


例题:查询员工的编号,年薪。(列可以参与数学运算
select eno, sal * 12 from emp;


例题:给查询结果的列重命名。
select eno, sal * 12 as yearsal from emp;

别名中有中文怎么办?
select eno, sal * 12 as 年薪 from emp; // 错误的写法
select eno, sal * 12 as ‘年薪’ from emp;

as 关键字可以省略:select eno, sal * 12 ‘年薪’ from emp;
当别名是英文时,可以不加单引号。当别名是中文时,必须加单引号。

注意:标准sql语句中,字符串使用单引号括起来。


2、简单条件查询:条件查询需要用到where语句,where必须放在from语句表的后面。

支持如下运算符:
= 等于
<>或!= 不等于
< 小于
<= 小于等于
> 大于
>= 大于等于
between…and… 两个值之间,闭区间,相当于>= and <=
is null 为null(is not null表示不为空)
and 并且
or 或者
in 包含
not not可以取非,主要和is或者in联合使用
like like称为模糊查询,支持%或下划线匹配


条件查询的语法格式:select 字段1, 字段2…from 表名 where 条件;

执行时候的顺序:先from,再where,最后select。


例题:查询ename为张三的员工的月薪。
select sal from emp where ename=‘张三’;


例题:查询月薪大于4000的员工编号,姓名。
select eno, ename from emp where sal > 4000;


例题:查询工资不为5000的员工编号,姓名。
select empno, ename from emp where sal <> 5000;

select eno, ename from emp where sal != 5000;


例题:查询工资在3000-6000之间的员工编号,姓名。
select empno, ename from emp where sal >= 3000 and sal <= 6000;

select empno, ename from emp where sal between 3000 and 6000;


between…and…写的时候,数据要左小右大。
between 6000 and 1000翻译为<= 6000 and >= 1000,这样的数据不存在,查询不到数据。

了解一下:between…and…还可以用在字符方面,左闭右开,不过这种写法基本用不着。


在数据库当中,null不是一个值,而是代表没有,因此不能使用=null来判断是否为空,而是使用is null或者is not null。


例如:查询奖金为null的员工编号,姓名.
select empno, ename from emp where comm is null;

例题:查询工作岗位是manager和salesman的员工编号,姓名。
select empno, ename from emp where job = ‘manager’ or job = ‘salesman’;


and和or的联合使用:查询月薪大于3000并且部门编号是20或者30的员工编号,姓名。
select empno, ename from emp where sal > 3000 and deptno = 20 or deptno = 30; // 错误的写法

select empno, ename from emp where sal > 3000 and (deptno = 20 or deptno = 30); // 正确写法

结论:and的优先级大于or。当运算符的优先级不确定的时候,建议使用括号括起来。


例题:查询工作岗位是manager和salesman的员工。
select empno, ename from emp where job = ‘manager’ or job = ‘salesman’;

select empno, ename from emp where job in(‘manager’, ‘salesman’);

例题:来看一下这句sql语句是什么意思?
select ename from emp where sal in(3000, 5000);

语义:查询月薪是3000或者5000的员工姓名。
结论:in后面括号里的数据是具体值,并不是区间。

not in表示不在这几个值当中。
注意:not in后面括号里的值至少有2个,并且不能包含null,否则结果什么都查询不到。

模糊查询like,其中%代表任意多个字符,_代表任意一个字符。


例题:查询姓张的员工编号,姓名。
select empno, ename from emp where ename like ‘张%’;

例题:找出名字第二个字是“三”的员工编号,姓名。
select empno, ename from emp where ename like ‘_三%’;

例题:来个难的,查询名字中含有下划线_的员工编号。
select empno from emp where ename like ‘%_%’; // 需要将_转义


3、查询排序(升序asc,降序desc)

关键字:order by,默认是升序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, ename asc;

注意:order by后面的第一个字段名很重要,只有当sal相同时,后面才会再继续按照ename排序。


例题:查询工作岗位是salesman的员工,并且按照月薪的降序排列。
select ename, job, sal from emp where job = ‘salesman’ order by sal desc;

执行时候的顺序:from,where,select,order by。


4、分组函数(group function)

count 计数
sum 求和
avg 平均值
max 最大值
min 最小值

注意:所有的分组函数都是对“某一组数据”进行操作的。


例题:
查询员工的工资总和: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(empno) from emp;

分组函数一共就这5个,分组函数也被称为:多行处理函数。
多行处理函数的特点:输入多行,最终输出的结果是1行。

注意:分组函数自动忽略null。
数据库中规定,当有null参与数学运算时,无论表达式怎么样,结果都是null。

所以分组函数能计算出结果,必须忽略掉null。

注意:分组函数不能出现在where语句中。


例题:查询工资高于平均工资的员工。
select ename, sal from emp where sal > avg(sal); // 语法出错,使用分组函数不当。

怎么解决?等看了group by再说。

count(*)和count(某个字段),它们有什么区别?
count(*):统计总记录条数,即总行数。
count(xx字段):表示统计xx字段中不为null的数据总数,即字段不为null的总行数。


5、单行处理函数

什么是单行处理函数?
答:输入一行,输出一行。

例题:计算每个员工的年薪。
select eno, ename, (sal + comm) * 12 as ‘年薪’ from emp; // 不准确的写法,comm可能为null

ifnull():空处理函数,属于单行处理函数。
语法格式:ifnull(可能为null的数据,被当做什么处理)

例题:计算每个员工的年薪。用ifnull()判断处理。
select empno, ename, (sal + if(comm, 0)) * 12 as ‘年薪’ from emp;


6、group by和having

group by:按照某个字段或某些字段进行分组。
having:对分组之后的数据再次进行过滤筛选。


例题:查询每个工作岗位的最高月薪。
select job, max(sal) from emp group by job;

注意:分组函数一般都会和group by联合使用,这也是为什么它被称为分组函数的原因。

并且任何一个分组函数(count,sum,avg,max,min)都是在group by语句执行结束后再执行的。

当一条sql语句中没有group by的话,整张表的数据会自动成为一组。

这就可以解释,为什么不能在where子句中使用分组函数,因为group by是在where执行后才会执行的。


例题:所以怎么查询工资高于平均工资的员工?
select ename, sal from emp where sal > (select avg(sal) from emp);

语句执行顺序:
select …5
from …1
where …2
group by …3
having …4
order by …6


例题:那么再来看一下这条语句,是什么意思?
select ename, job, max(sal) from emp group by job;

这条语句表示按照job分组后,找出ename,job,max(sal)。显然ename写在这是没有意义的。

结论:当一条语句中有group by的话,select后面只能跟分组函数和参与分组的字段。


例题:查询每个工作岗位的平均月薪。
select job, avg(sal) from emp group by job;

多个字段能不能联合起来一块分组?可以的。
例题:找出每个部门不同工作岗位的最高月薪。
select deptno, job, max(sal) from emp group by deptno, job;

例题:找出每个部门的最高月薪,要求只显示月薪大于3000的数据。
select max(sal), deptno from emp group by deptno having max(sal) > 3000; // 这种方式执行效率太低,max(sal)执行了2次

select max(sal), deptno from emp where sal > 3000 group by deptno; // 效率较高

例题:找出每个部门的平均月薪,要求只显示平均月薪大于3000的数据。
select deptno, avg(sal) from emp where avg(sal) > 3000 group by deptno; // 语法错误,分组函数不可出现在where子句中

select deptno, avg(sal) from emp group by deptno having avg(sal) > 3000;

结论:尽量减少一个语句中分组函数的重复使用,能用where过滤就用where,where不能过滤的,再采用having过滤。
having语句只能和group by联合使用。having出现,group by一定出现。group by出现,可以没有having语句。


7、总结一个完整的DQL语句怎么写?
select…from…where…group by…having…order by…

执行顺序:from,where,group by,having,select,order by。

注意:分组函数(count,sum,avg,max,min)只能在group by分组之后执行,即where语句中不能使用分组函数。

having语句必须和group by联合使用,having是专门为group by分组后的数据进行再次过滤。

where是第一次过滤筛选,having是第二次过滤筛选。
order by排序,默认是升序,asc升序,desc降序。


8、关于查询结果集的去重
在字段前面加distinct关键字。

例题:查询员工的所有工作岗位,并去除重复记录。
select distinct job from emp;

例题:判断这条查询语句是否正确?
select ename, distinct job from emp; // 语法错误

注意:distinct只能出现在所有字段的最前面。


例题:再来看一下这条查询语句的意思。
select distinct deptno, job from emp;
表示查询所有部门的不同工作岗位。

例题:算出岗位的数量。
select count(distinct job) from emp;

注意:distinct如果出现在最前面,表示后面所有的字段联合起来按行去重,并不是某个字段单独去重。

所以说distinct只能出现在字段的最前面,控制后面所有字段联合起来按行去重。

猜你喜欢

转载自blog.csdn.net/pipizhen_/article/details/107850364