个人学习 | MySQL学习(SQL查询语句)

select查询语句

一个完整的select语句格式如下:

select 字段				5
from 表名				1
where 条件				2
group by 分组条件		3
having 分组后的过滤条件	4
order by 排序字段		6

以上语句的执行顺序为:

  1. 首先执行from语句找到对应数据表
  2. 执行where过滤原始数据
  3. 执行group by进行分组
  4. 执行having对分组数据进行操作
  5. 执行select选出数据
  6. 执行order by排序

因此,能在where中过滤的数据,尽量在where中过滤,效率较高。having的过滤是专门对分组之后的数据进行过滤的。

模糊查询 like

like关键字是在where条件中使用的,支持%和下划线_匹配。

例1:查询姓名以M开头的所有员工

select * from emp where ename like 'M%';

例2:查询姓名以N结尾的所有员工

select * from emp where ename like '%N';

例3:查询姓名中包含O的所有员工

select * from emp where ename like '%O%';

例4:查询姓名中第二个字符为A的所有员工

select * from emp where ename like '_A%';

例5:查询姓名中包含下划线的所有员工(转义字符\

select * from emp where ename like '%\_%';

注意:like中的表达式必须放在单引号或双引号中,建议单引号。

排序数据

排序采用order by子句,order by后面跟上排序字段,排序字段可以放多个,多个采用逗号间隔,order by默认采用升序asc如果存在where子句那么order by必须放到where语句的后面。因为order by语句晚于where语句执行。

例1:按照sal由小到大排序(系统默认由小到大)

select * from emp order by sal;
select * from emp order by sal asc;

例2:按照sal由大到小排序(手动指定排序)

select * from emp order by sal desc;

例3:按照job和sal倒序(job优先级大于sal)

select * from emp order by job desc, sal desc;

例4:使用字段的位置来排序,按照表中第6列排序(查询语句中的相对列数)

select * from emp order by 6;

分组函数(多行处理函数)

分组函数也叫多行处理函数,即将多行数据输入后,输出一行数据。分组函数一般与group by联合使用。

count 取得记录数
sum 求和
avg 取平均
max 取最大的数
min 取最小的数

注意:分组函数自动忽略空值,不需要手动的加where条件排除空值。

为什么分组函数不直接使用在where子句中?

因为,group by语句在where之后执行。任何一个分组函数都是在group by语句执行结束之后才会执行的,即分组函数在分完组后才能执行。

因此,下面的SQL语句是错误的。

select ename, sal from emp where sal > avg(sal);

可以使用子查询的方式来实现,即select语句嵌套select语句

select ename, sal from emp where sal > (select avg(sal) from emp);

count(*)和count(指定字段)的区别

count(*)的作用是计算数据表中记录的条数。
count(指定字段)的作用是对某个字段进行计数。

例1:取得工作岗位的个数(distinct 表示对不同的job值进行计数,而非记录数据条数)

select count(distinct job ) from emp;

IFNULL()函数

尽管分组函数可以自动忽略null值,但常规计算中null值会导致计算错误,如1+null=null。因此,IFNULL()函数可以将null在计算时用指定值替代。
IFNULL(字段名, 指定值)
例如:计算工资与津贴的总和

select sum(sal+IFNULL(comm, 0)) from emp;

分组查询(group by与having)

分组查询主要涉及到两个子句,分别是:group by和having

在SQL语句中若有group by 语句,那么在select语句后面只能跟分组函数+参与分组的字段

在having语句中可以使用分组函数,如取得每个岗位中平均工资大于2000的岗位。

select job, avg(sal) from emp group by job having avg(sal) >2000;

多字段分组查询

例1:找出每个部门不同工作岗位的最大薪资并按部门排序。

select deptno, job, max(sal) from emp group by deptno, job order by deptno;

having 和 where的区别和选择

例2:找出每个部门的最高薪资,要求显示薪资大于2900的数据。

select deptno, max(sal) from emp group by deptno having max(sal)>2900;

但是,使用having语句会导致执行效率太低。原因在于部分数据即使未用到,却仍被拿出来计算了,比如最高薪资不大于2900的数据。

可优化如下:

select deptno, max(sal) from emp where sal < 2900 group by deptno;

所以,在SQL语句中,能在where子句中过滤的数据就再where出过滤(where子句先执行)。除非where子句无法处理过滤的要求,如例3。

例3:找出每个部门的平均薪资,要求显示薪资大于2000的数据。

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

查询结果集的去重 (distinct关键字)

distinct关键字可以去重复记录,但该关键字只能出现在所有字段的最前面。它表示对后面所有字段的结果去重。

例1:打印每个部门中的职位

 select distinct deptno,job from emp order by deptno;

例2:统计职位的数量

select count(distinct job) from emp;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值