二、查询01

MySQL学习

二、查询(1)(DQL 数据查询语言)

1. 简单的查询语句
语法格式:

	select 字段名1,字段名2,字段名3,..... from 表名;

提示:1. 任何一条sql语句以";"结尾。

2. sql语句不区分大小写。

1.1 查询员工的年薪(字段可以参与数学运算):

​ select ename,sal*12 from emp;

1.2 给查询结果的列重命名(用as)

​ select ename,sal*12 as yearsal from emp;

​ select ename,sal*12 as ‘年薪’ from emp;

​ ▲as关键字可以省略。

​ select ename,sal*12 yearsal from emp;

​ 注意:标准sql语句中要求字符串使用’'括起来。虽然MySQL支持双引号,但是不通用。

1.3 查询全部字段(一般不用)

​ select * from emp; //实际开发中不建议使用* ,效率较低。


2.条件查询

语法格式:

	select

				字段1,字段2,.....

		from

				表名

		where

				条件;

执行顺序:先from,然后where,最后select。

不等于: <>(大于小于就是不等于)!=也是不等于

between…and… :

​ ①两个值之间,等同于>= and <=(闭区间,使用的时候必须 左小右大)

​ ②除了可以使用在数字方面之外,还可以使用在字符串方面。…between ‘A’ and ‘C’ // 左闭右开,查询出首字母为A和B的字段(几乎不用)

is null : 为null(is not null不为空)

​ 在数据库中NULL不是一个值,代表什么也没有,为空,空不是一个值,不能用=衡量,必须使用is null或者is not null。(为null和为0不是一个意思,一个是空,一个是数值为0)

and : 并且 or : 或者

​ select ename,deptno,sal from emp where sal > 1000 and deptno = 20 or deptno =30;//错误

​ and和or碰在一起,and的优先级会比较高,加粗的部分会优先组队。

​ select ename,deptno,sal from emp where sal > 1000 and (deptno = 20 or deptno =30);加了括号之后才是想要的结果。

​ 注意:当运算符优先级不确定时,加(),()里优先级较高

in : 包含,相当于多个or(not in 表示不在这个范围里)

​ …in (…,…); (可读性更好)(中不是区间,in后面的每一个都是具体值。)

not : 可以取非,主要用在is或者in中

like : 模糊查询,支持%或下划线_匹配

​ %:代表任意多个字符。_ : 代表任意一个字符。

​ 下划线的前面加一个\,\具有转义作用,代表是一个普通的_字符。


3.排序(升序、降序)

order by ①asc 表升序 ②desc表降序 (默认升序排列)

​ 按照工资(SAL)升序排序,找出员工名(ENAME)和薪资(SAL):

​ 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, ENAME asc;

​ ▲多个字段同时排序,越靠前的字段越能起到主导作用,只有当前面的字段无法完成排序时,才会启用后面的字段。

4.分组函数
4.1

​ 分组之后才能用分组函数!(group by 之后)

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(ENAME) from emp;或者select count(*) from emp;

​ ▲所有分组函数自动忽略NULL,不需要额外添加过滤条件。(所有数据库都是这样规定的,只要有NULL参与的运算,最后的运算结果都是NULL)

4.2 ifnull() : 空处理函数(对空进行预处理)

​ ifnull(可能为NULL的数据,被当作什么处理)

​ 找出工资高于平均工资的员工。

​ select ENAME,SAL from emp where SAL >= avg(SAL); // ❌无效的使用了分组函数。❗SQL语句的一个语法规则:分组函数不可直接使用在where字句中。因为group by 是在where执行之后才执行的。

4.3 count(*)和count(具体字段)

​ count(*) : 统计的是总记录条数(与字段没有关系)

​ count(具体字段) : 统计的是某个字段中不为NULL的数据条数总数量

4.4 分组函数也能组合起来用

​ select count(*),sum(SAL),avg(SAL),max(SAL),min(SAL) from emp;


5.分组查询 group by 和 having
5.1 group by

group by : 按照某个或某些字段进行分组。

▲分组函数是在group by语句执行结束之后再执行的,所以where后面不能直接用分组函数。

5.1.1 案例:找出每个工作岗位的最高薪资。

​ select JOB,max(SAL) from emp group by JOB;

​ ▲分组函数一般都会和group by联合使用,这也是被称为分组函数的原因,并且任何一个分组函数都是在group by 语句执行结束之后才会执行。当一条sql语句没有group by 整张表的数据会自成一组。

5.1.2 找出工资高于平均工资的员工。

​ select ENAME,SAL from emp where SAL >= (select avg(SAL) from emp;); // select语句嵌套select语句,子查询

​ 找出每个工作岗位的最高薪资。

​ select ENAME,JOB,max(SAL) from emp group by JOB; // 以上结果是有的,但结果没有意义,在Oracle数据库中会报错(语法错误)。

​ ▲记住一个规则:当一条语句中有group by的话,select后面只能跟分组函数和参与分组的字段

​ 找出工作岗位的平均薪资 : select JOB,avg(SAL) from emp group by JOB;

5.1.3 多个字段联合起来一块分组

​ 找出不同工作岗位的最高薪资: select JOB,max(SAL) from emp group by JOB;

​ 找出每个部门(DEPTNO)不同工作岗位(JOB)最高薪资(SAL): select DEPTNO,JOB,max(SAL) from emp group by DEPTNO,JOB;(联合分组)

5.2 having

having : 对分组之后的数据进行再次过滤。(having是group by的搭档,只有group by出现时才能用having)

5.2.1 优先使用where来过滤

​ 找出每个部门的最高薪资,要求显示薪资大于2900的数据: select DEPTNO,max(SAL) from emp group by DEPTNO having max(SAL) > 2900; // 这种方式效率低

​ select DEPTNO,max(SAL) from emp where SAL > 2900 group by DEPTNO; // 推荐这种写法来过滤,效率较高,where无法解决的过滤问题使用having来解决.

5.2.2 where无法解决的过滤问题使用having来解决。

​ 找出每个部门的平均薪资,要求显示薪资大于2000的数据: select DEPTNO,avg(SAL) from emp group by DEPTNO having avg(SAL) > 2000; // where后面不能用分组函数


6.总结:一个完整的DQL语句怎么写

​ ❗顺序不能换,是固定的

select              5

			...

		from                1

			....

		where              2

			...

		group by          3

			....

		having              4

            ...

		order by           6

             ...

6.总结:一个完整的DQL语句怎么写

​ ❗顺序不能换,是固定的

select              5

			...

		from                1

			....

		where              2

			...

		group by          3

			....

		having              4

            ...

		order by           6

             ...
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值