【mysql复习】——单表查询知识复习

本文详细介绍了SQL中的条件查询、数据排序、分组函数(如count、sum、avg等)以及groupby和having的使用规则,强调了在编写SELECT语句时的关键字顺序和注意事项,包括null值的处理和优化查询性能的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很喜欢一句话:这个世上只有一种真正的英雄主义,就是你认清了生活的真相,却仍然热爱它;

目录

条件查询(查询满足条件的数据)

注意点:

        在学习数学公式以及排序等关键字时,首先你要明白他们使用在语句的那个位置,格式要求等等;

数据排序(order by 字段)

关键字书写顺序

select ...

from ...

where ...

group by ... 

order by ...

执行顺序

from ...

where ...

group by ...

having ...

select ...

order by ...

常见函数

常见的单行处理函数

分组函数

注意点:

分组查询(可分组 )

重点结论:

在一条select语句中,如果有group by语句的话,select后面只能跟:参加分组的字段,以及分组函数,其他的一律不行;

你也可以联合两个字段成一个字段看(两个字段联合分组)

注意点

having可以对分组之后的数据进行过滤,但它必须和group by 联合使用(但单独使用时效率低);

单表查询总结



条件查询(查询满足条件的数据)

常见的条件查询(查询语句后面添加where + 条件):

  1. =(等于)、<>或!=(不等于)、大于等于等等

  2. between .... and .... (处于两个值之间的)

    • 注意:必须遵循左小右大原则且闭区间

  3. is null、is not null

    • 数据库中的null不能使用等号来衡量,他的实际意义是没有值、什么都没有,因此不能有(=null)这种语法

       where  salary is null;
  4. and(并且),or(或者)

     where job = "MANAGER" and salary > 3000;
     where job = "MANAGER" or salary > 3000;
    • and和or同时出现,and优先级高,同时出现可以使用小括号;

     //找出工资大于2500并且编号是10或20的;
     where sal > 2500 and deptno = 10 or deptno =20;//这么写容易出现歧义
     where sal > 2500 and (deptno = 10 or deptno =20);
  5. in(包含,相当于当个or)、not in

     //找出工资大于2500并且编号是10或20的;
     where sal > 2500 and deptno in (10,20)

    注意:此处的in不是区间,而是集合;

  6. like (模糊查询),%或下划线匹配;

    注意:%匹配任意字符;下划线只能匹配一个字符;

     //名字中含有A
     where dname like '%A%';
     //第二个字母是A
     where dname like '_A%';
     //找出名字中带有下划线的
     where name like '%_%';//这样就会查出所有
     where name like '%\_%'//转义字符

注意点:

        在学习数学公式以及排序等关键字时,首先你要明白他们使用在语句的那个位置,格式要求等等;

数据排序(order by 字段)

常见排序方式:

  1. asc 升序

  2. desc降序

 order by salary asc, ename asc;
 //salary在前,起主导作用,只有salary相同时,才会使用ename升序排列;

关键字书写顺序

关键字使用的先后顺序是不能改变的;

select ...
from ...
where ...
group by ... 
order by ...

执行顺序

from ...
where ...
group by ...
having ...
select ...
order by ...

常见函数

常见的函数分为单行处理函数(处理几行输出几行),和多行处理函数(处理多行返回一行结果)

常见的单行处理函数
  1. lower() 转换小写

    select lower(uname) as ename from emp;
  2. upper() 转换大写

  3. substr()取子串,格式:substr(被截取的字符串,起始下标,截取长度)

    注意:起始下标从1开始

     where substr(ename,1,1) = 'A';
  4. length()取长度

  5. trim()去空格

  6. str_to_date() 将字符串转换成日期

  7. date_format()格式化日期

  8. round()四舍五入

  9. rand()生成随机数

  10. ifnull()可以将null转换成一个具体值


分组函数

分组函数又称多行处理函数

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

  2. 注意:分组函数必须先分组,然后才能使用,也就是说按照执行顺序,在group by后面才能使用分组函数

        错误演示:

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

    理论上这是没问题的,但实际运行中会报错 ;

     正确示例:

    select min(sal) from emp;
  3. 如果没有分组,那么就默认一张表就是一组

    select max(salary) from emp;

注意点:

  1. 在数据库中运算时遇见null其结果就是null,但是在分组函数中自动会排除null;

  2. null不是一个值,他表示什么也没有;

  3. count(某个字段)得到的结果是该数据表中的,该字段不为null的字段个数;

分组查询(可分组 )

实际需求中我们会遇到先需要对数据表进行分组,分完组之后在进行查询;

  案例演示:

 select ename,job ,sum(sal) from emp group by job;

上面这条语句只能在的MySQL在运行,本身无意义,但在Oracle中会报错,应为Oracle的语法要求相对mysql而言比较严格,

重点结论:
在一条select语句中,如果有group by语句的话,select后面只能跟:参加分组的字段,以及分组函数,其他的一律不行;
你也可以联合两个字段成一个字段看(两个字段联合分组)
 select deptno,job,max(sal) from emp group by deptno,job;

注意点

  1. 加了group by 之后,select后面的字段就不能随意写了,你就只能写group by后面的字段和分组函数;

  2. 分组函数不能写在where后面,这个执行顺序有关,先分组后使用分组函数;

  3. 为什么在select后面可以使用分组函数呢,也和执行顺序有关,select执行在group by后面;

 //找出每个部门中薪资最高的,显示的最高薪资要大于3000
 select ename,job,max(sal) from emp where sal>3000  group by ename,job;
having可以对分组之后的数据进行过滤,但它必须和group by 联合使用(但单独使用时效率低);

效率低代码演示:

 select ename,job,max(sal) from emp   group by ename,job having sal>3000;

为解决上面效率低的问题,我们可以采用where和having联合使用,此时条件删选会优先考虑where,where完成不了才会考虑having;

优化后策略:

 select ename,job,max(sal) from emp where sal>3000  group by ename,job having sal>30;
//这个having加的没有意义,我只想在此处强调where和having可以联合使用以及优先级;

这样的优化看似愚蠢,但实际上一些实际运用中还真有where解决不了的需要having解决的例如:找出每个部门平均薪资,要求显示的平均薪资高于2500的,针对这个需求,就要having解决了

单表查询总结

  1. 可以先从表中查数据,先通过where筛选,然后对筛选后的结果通过having进行过滤;

  2. 对于分组函数,他的语法位置是在select后面;

  3. 在使用group by进行分组查询之后,要格外注意select后面的字段;

  4. 关键字执行顺序,from -- where -- group by -- having -- select -- order by;

### MySQL 期末考试复习要点 #### 数据库管理系统概述 数据库管理系统(DBMS)用于管理和操作数据库中的数据。通过 DBMS 可以执行创建、读取、更新和删除(CRUD)操作[^1]。 常见的数据库管理系统有多种,其中包括广泛使用的开源关系型数据库——MySQL。对于学习者而言,掌握 MySQL 的基本概念和技术细节至关重要。 #### 考试题型分布 针对期末考试准备,了解题目的构成有助于更有效地分配复习时间: - **选择题**:共20道题目,每题两分,总计40分; - **填空题**:共有十个空白处需填写正确答案,每个一分,共计十分; - **简答题**:三道大题,每题四分,总共十二分; - **SQL编程部分**:此板块占到三十多分,具体细分为不同类型的查询语句编写任务;另外还有关于触发器、存储过程等内容的考察; - **设计类问题**:大约二十几分的设计题目涉及实体联系模型(ER图),以及规范化理论的应用实践等[^2]。 #### 关键概念解析 ##### 实体-关系模型 (Entity Relationship Model, ER) 这是描述现实世界信息的一种方式,在绘制 ER 图时会涉及到实体(Entity)及其属性(Attribute),还有它们之间的关联(Relationship)。 ##### SQL 查询基础 结构化查询语言(SQL) 是访问并处理关系型数据库的标准工具。学生应该熟悉 SELECT 语句来检索记录,INSERT INTO 来新增条目,UPDATE 修改现有数据项,DELETE FROM 移除不需要的数据行。此外还应理解聚合函数如 AVG() 计算平均值的方法。 ##### 视图(Views) 视图是从一个或多个中导出的虚拟格。它允许用户定义自己的逻辑视角来看待底层物理的内容而不必关心实际存储布局。 ##### 存储程序组件 包括但不限于: - **触发器**(Trigger): 当特定事件发生时自动激活的过程。 - **存储过程**(Stored Procedure): 预编译的一组 SQL 语句集合,可接受参数输入并返回结果集给调用方。 - **函数**(Function): 类似于存储过程但是通常只计算达式的值而不是影响大量数据的操作。 ```sql CREATE TRIGGER before_salary_update BEFORE UPDATE ON employees FOR EACH ROW BEGIN IF NEW.salary < 0 THEN SET NEW.salary = OLD.salary; END IF; END; ``` 上述代码展示了如何创建一个简的触发器实例,该触发器会在 `employees` 上任何尝试设置负数工资之前阻止这种更改的发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值