当前位置: 首页 > news >正文

mysql面试(2)

MySQL面试考点通关:DQL查询操作全解析

前面我们讲了MySQL的基础概念、DDL和DML操作,今天重点攻克DQL(数据查询语言)——这可是面试中最常考、日常开发中用得最多的部分。无论是简单查询还是复杂的多表关联,掌握这些知识点,就能轻松应对面试官的各种"刁难"。

一、DQL基础:查询语句的"骨架"

DQL的核心就是 SELECT语句,记住这个固定格式,写查询就不会乱:

select 字段                -- 要显示什么
from 表名                  -- 从哪张表查
where 筛选条件             -- 过滤掉不需要的数据
group by 分组字段          -- 按规则分组
having 分组后的筛选条件    -- 对分组结果再过滤
order by 排序字段          -- 结果排序
limit 分页参数             -- 只取部分结果

面试必问:DQL的执行顺序

很多人写查询没问题,但说不出执行顺序,这会让面试官觉得你只是"背语法"。记住这个流程:

  1. from 表名 → 先确定要查哪张表
  2. where 筛选条件 → 先过滤掉大部分无关数据(缩小范围)
  3. group by 分组字段 → 按规则分组
  4. having 分组条件 → 对分组后的结果再筛选(必须跟group by一起用)
  5. select 字段 → 确定最终要显示的内容
  6. order by 排序字段 → 对结果排序
  7. limit 分页参数 → 截取部分结果(比如只看第1页数据)

二、SELECT子句:决定显示什么内容

这部分是查询的"脸面",决定了最终展示的数据样式,高频考点都在这:

1. 查所有字段:select *

简单直接,但实际开发中不推荐(效率低+字段变动有风险):

select * from emp;  -- 查emp表所有字段

2. 别名:让结果更易懂

as(可省略)给字段起别名,中文别名加单引号:

select empno as 员工编号,ename '员工姓名',  -- 省略assal*12+comm 年薪   -- 计算结果也能起别名
from emp;

3. 简单计算:直接在查询中处理数据

比如计算年薪(月薪×12+奖金):

select ename, sal*12 + ifnull(comm,0) as 年薪 from emp;

注意:用 ifnull(comm,0)处理null值(null参与计算结果还是null)

4. 去重:distinct

去掉重复值,比如查有哪些经理(排除重复的mgr):

select distinct mgr from emp where mgr is not null;

三、WHERE子句:精准筛选数据

这是过滤数据的关键,各种条件组合是面试重点:

1. 基础运算符

类型常用符号示例
关系运算符>、>=、<、<=、!=、=where sal > 3000
逻辑运算符and(且)、or(或)、!(非)where sal > 3000 and deptno=10
模糊查询like(%匹配任意字符,_匹配1个字符)where ename like '%A%'(含A的姓名)
null值查询is null / is not nullwhere comm is null(没奖金的员工)

2. 优先级处理:用()包裹整体条件

比如查"没奖金,且(入职早于1984年底或姓名含a)"的员工:

where comm is null and (hiredate < '1984-12-31' or ename like '%a%')

3. 函数在WHERE中的应用(高频考点)

MySQL的函数很多,但面试重点考时间函数流程函数

时间函数(必背)
-- 1. 获取当前时间
select curdate(), curtime(), now();  -- 日期、时间、日期+时间-- 2. 计算日期差(DATEDIFF)
select datediff(curdate(), '2004-04-04') as 相差天数;-- 3. 查工作超过15000天的员工(经典面试题)
select * from emp where datediff(curdate(), hiredate) > 15000;-- 4. 日期格式化(DATE_FORMAT)
select date_format(hiredate, '%Y年%m月%d日') as 入职日期 from emp;
流程函数(case when)

类似编程语言的if-else,比如给部门编号转成部门名称:

select ename,case deptno when 10 then '开发部'when 20 then '测试部'when 30 then '运维部'end as 部门名称
from emp;

四、GROUP BY:分组查询(统计分析必备)

分组就是"把相同特征的数据放一起统计",比如"每个部门有多少人":

-- 按部门分组,统计每个部门的人数
select deptno, count(empno) as 人数 
from emp 
group by deptno;  -- 有n个不同的deptno就分n组

常用统计函数(多行函数)

这些函数专门配合分组使用,面试高频考点:

函数作用示例
count(字段)统计行数count(empno) 员工总数
max(字段)最大值max(sal) 最高工资
min(字段)最小值min(sal) 最低工资
avg(字段)平均值avg(sal) 平均工资
sum(字段)总和sum(sal) 工资总和

五、HAVING:分组后的筛选条件

havingwhere都能筛选,但 having针对分组结果的,必须跟 group by一起用:

-- 查平均工资低于2000的部门(先分组算平均,再筛选)
select deptno, avg(sal) as 平均工资
from emp
group by deptno
having 平均工资 < 2000;  -- 这里用别名更简洁

面试题:where和having的区别?

  • where在分组前筛选,不能用统计函数(比如 where avg(sal)>2000是错的)
  • having在分组后筛选,可以用统计函数和别名

六、ORDER BY:让结果有序

查询结果默认无序,用 order by指定排序规则:

-- 按部门号升序(默认asc),同一部门按经理编号降序
select * from emp 
order by deptno asc, mgr desc;

注意:时间字段排序很常用(比如按创建时间倒序查最新数据)

七、多表查询:关联数据怎么查?

实际开发中很少查单表,多表关联是必考点,重点掌握内连接和外连接:

1. 内连接([inner] join … on)

只查两张表中匹配成功的数据(地位平等):

-- 查员工姓名和对应的部门地址(员工表emp关联部门表dept)
select e.ename, d.loc
from emp e
inner join dept d 
on e.deptno = d.deptno;  -- 关联条件(避免笛卡尔积)

2. 外连接(left/right join … on)

分主次表,主表数据全部显示,次表只显示匹配的:

-- 左外连接:emp是主表,即使没部门的员工也会显示
select e.ename, d.loc
from emp e
left join dept d 
on e.deptno = d.deptno;

面试必问:内连接和外连接的区别?

  • 内连接:只显示两表匹配的数据(交集)
  • 外连接:主表数据全显示,次表匹配不上的用null填充

3. 自连接:自己关联自己

把一张表当两张表用,比如查"员工的经理信息":

-- e1是员工表,e2是经理表(经理也是员工)
select e1.ename as 员工, e2.ename as 经理
from emp e1
left join emp e2 
on e1.mgr = e2.empno;  -- 员工的mgr等于经理的empno

八、子查询:查询里套查询

子查询就是"用一个查询的结果当另一个查询的条件",分两种:

1. 不相关子查询(子查询可独立执行)

子查询先执行,结果给主查询用:

-- 查所有比"CLARK"工资高的员工(单行子查询)
select * from emp
where sal > (select sal from emp where ename='CLARK');

2. 相关子查询(子查询依赖主查询)

子查询需要主查询的数据才能执行,比如"查工资高于本部门平均工资的员工":

select * from emp e2
where sal > (select avg(sal) from emp e1 where e1.deptno = e2.deptno);

(子查询里的e1.deptno依赖主查询的e2.deptno)

九、总结:DQL面试考什么?

  1. 执行顺序:from→where→group by→having→select→order by→limit(必背)
  2. 函数应用:尤其是时间函数(datediff、date_format)和case when
  3. 分组查询:group by与统计函数的配合,having和where的区别
  4. 多表关联:内连接和外连接的区别,自连接的应用场景
  5. 子查询:能看懂并写出简单的相关/不相关子查询

记住这些核心点,再结合实际场景多练(比如"统计每个部门的最高工资和人数"),DQL部分的面试就能应对自如了!下一篇可以讲讲索引和事务这些进阶知识点,一步步成为MySQL高手~


文章转载自:

http://byJHJlaE.xhjjs.cn
http://Zanf0bl7.xhjjs.cn
http://1dAS6g0j.xhjjs.cn
http://SVBXc2xA.xhjjs.cn
http://cdDjP5x2.xhjjs.cn
http://gXEBdIA9.xhjjs.cn
http://Zv34nQwX.xhjjs.cn
http://mLQx9rLT.xhjjs.cn
http://paSQVpdP.xhjjs.cn
http://BIICwkAs.xhjjs.cn
http://eQsAwsl6.xhjjs.cn
http://gTOr5luF.xhjjs.cn
http://J90F2hyT.xhjjs.cn
http://mjDDS0j2.xhjjs.cn
http://HIJOA298.xhjjs.cn
http://F6Jp0zvS.xhjjs.cn
http://dinOiQst.xhjjs.cn
http://62GFrC6S.xhjjs.cn
http://neQrVcKy.xhjjs.cn
http://VESDfL8a.xhjjs.cn
http://CptLi4Ld.xhjjs.cn
http://OMrNb8Xc.xhjjs.cn
http://7PuknbCa.xhjjs.cn
http://U1cQ8OYD.xhjjs.cn
http://6TUrZaWw.xhjjs.cn
http://VnptAEit.xhjjs.cn
http://6HQ9WwC3.xhjjs.cn
http://JzYMfJN1.xhjjs.cn
http://omqf4Ici.xhjjs.cn
http://QLM64ZLw.xhjjs.cn
http://www.dtcms.com/a/388105.html

相关文章:

  • Linux系统DNS服务
  • 如何通过跳板机访问内网 Mysql 服务器
  • SSH 远程连接内网 Linux 服务器
  • Spring Cloud - 微服务监控
  • Flutter-[1]入门指导
  • Linux服务器运维自动化巡检工具
  • Java 大视界 -- Java 大数据在智能家居设备联动与场景化节能中的应用拓展(413)
  • Node.js 部署:PM2 的 Fork 与集群模式
  • 【C++上岸】C++常见面试题目--网络篇(第二十五期)
  • LangChain使用方法以OpenAI 的聊天模型GPT-4o为例
  • CephFS存储文件系统介绍
  • Java Swagger2 能显示页面但看不到一个接口
  • SSL证书有效期缩短:自动化解决方案
  • C# 多线程编程 (.NET Framework 4.0)
  • 一个手艺活 - 跨语言编程
  • docker安装ollama、下载模型详细步骤
  • 微服务和分布式的基础学识
  • 自动化测试框架pytest---Json Schema
  • 阿里云PolarDB MySQL版与MCP集成方案:数据处理分析全流程的效能革命
  • Python实现霸王龙优化算法(Tyrannosaurus Optimization Algorithm, TROA)(附完整代码)
  • 弥合安全分析与故障仿真之间差距的方法
  • JavaEE---9.网络原理TCP/IP
  • @Value
  • 安装es、kibana、logstash
  • Leetcode-148.排序链表
  • 基于ETF底仓的网格交易系统实现动态参数优化与动量因子融合
  • C++底层刨析章节三: 函数对象与适配器:STL中的智能操作单元
  • MySQL多表联合查询与数据备份恢复全解析
  • 说说对React的理解?有哪些特性?
  • 深入理解 C 语言指针(二):数组与指针的深度绑定