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

MySQL优化-MySQL常用查询命令

MySQL优化-MySQL常用查询命令

一、常用命令

1、聚合函数

MySQL提供了多种聚合函数,用于对数据进行汇总和统计分析。常用的聚合函数有COUNT()、SUM()、AVG()、MAX()、MIN()等。

  • COUNT():返回记录的数量
  • SUM():返回指定列的总和
  • AVG():返回指定列的平均值
  • MAX():返回指定列的最大值
  • MIN():返回指定列的最小值
SELECT COUNT(*) FROM employees WHERE department = 'HR';

2、GROUP BY与HAVING

GROUP BY用于将查询结果分组,它常与聚合函数一起使用。比如按部门统计员工数量:

SELECT department, COUNT(*) AS employee_count 
FROM employees 
GROUP BY department;

HAVING用于对分组结果进行过滤,它通常与GROUP BY结合使用:

SELECT department, AVG(salary) AS avg_salary 
FROM employees 
GROUP BY department 
HAVING avg_salary > 50000;

3、DISTINCT

DISTINCT用于去除查询结果中的重复值。例如,查询所有不重复的部门名称:

SELECT DISTINCT department FROM employees;

4、UNION

UNION用于合并多个查询的结果集,并去除重复的行。假设有两个不同表,分别记录了不同部门的员工数据:

SELECT name FROM employees_1
UNION
SELECT name FROM employees_2;

如果想保留重复记录,可以使用UNION ALL。

二、联接查询

在实际应用中,数据往往是分布在多个表中的,如何将这些数据结合起来进行查询呢?这就需要用到联接查询(JOIN)。MySQL支持多种联接类型:内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)等。

1、内连接(INNER JOIN)

内连接是最常用的联接方式,它返回两个表中匹配的记录。如果某一表的记录在另一个表中找不到匹配项,则该记录不会出现在结果中。

SELECT employees.name, departments.department_name 
FROM employees 
INNER JOIN departments ON employees.department_id = departments.id;

2、左连接(LEFT JOIN)

左连接会返回左表中的所有记录,即使右表中没有匹配的记录,右表中没有匹配的地方会返回NULL。

SELECT employees.name, departments.department_name 
FROM employees 
LEFT JOIN departments ON employees.department_id = departments.id;

3、右连接(RIGHT JOIN)

右连接与左连接类似,不过是返回右表中的所有记录,左表中没有匹配的地方会返回NULL。

SELECT employees.name, departments.department_name 
FROM employees 
RIGHT JOIN departments ON employees.department_id = departments.id;

4、自连接(Self Join)

自连接是一种将表与其自身进行连接的操作,通常用于查询层级结构数据。比如,查询员工及其经理的名称:

SELECT e1.name AS employee, e2.name AS manager 
FROM employees e1 
LEFT JOIN employees e2 ON e1.manager_id = e2.id;

三、子查询

子查询是指在查询语句中嵌套其他查询语句,通常用于复杂的数据过滤和逻辑判断。MySQL支持以下类型的子查询:标量子查询、行子查询、表子查询。

1、标量子查询

标量子查询返回一个单一值,通常用于WHERE子句或SELECT语句中:

SELECT name, salary 
FROM employees 
WHERE salary > (SELECT AVG(salary) FROM employees);

2、行子查询

行子查询返回一个值的集合,通常用于多列查询的场景。例如,查询工资高于公司平均工资的员工:

SELECT name, salary 
FROM employees 
WHERE (salary, department_id) IN (SELECT AVG(salary), department_id FROM employees GROUP BY department_id);

3、表子查询

表子查询返回一个表格,通常在FROM子句中使用:

SELECT t1.name, t1.salary 
FROM (SELECT name, salary FROM employees WHERE department_id = 2) t1 
WHERE t1.salary > 50000;

四、优化查询

在编写SQL查询语句时,除了正确性,还需要关注性能。以下是一些优化SQL查询的技巧:

1、使用索引

索引是提高查询效率的关键。在创建表时,为常用的查询字段(如主键、外键、频繁查询的列)创建索引,能够大幅提高查询性能。

CREATE INDEX idx_department_id ON employees(department_id);

2、避免SELECT *

使用SELECT *会查询表中的所有字段,可能会导致不必要的数据传输,影响性能。最好只查询需要的字段。

SELECT name, salary FROM employees;

3、使用LIMIT优化查询

在分页查询时,使用LIMIT可以有效减少不必要的查询数据量。

SELECT name, salary FROM employees LIMIT 10 OFFSET 20;

4、避免在查询中使用函数

在查询字段中使用函数(如NOW(), CONCAT())会影响查询性能,尤其是在大数据量的表中。尽量将函数移到应用层进行处理。

小结

以上是关于MySQL常用查询命令的部分见解

相关文章:

  • MATLAB三维可视化技术解析
  • 引用的使用
  • 什么是跨域,如何解决跨域问题
  • 脑图谱:脑机接口的必由之路——技术突破与产业转化的系统性思考
  • CI/CD与DevOps流程流程简述(给小白运维提供思路)
  • element-plus中,vue3项目,el-input密码框禁止浏览器自动弹出浏览器历史密码提示框
  • 关于Stream
  • 使用ffmpeg截取MP3等音频片段
  • ubuntu 挂载硬盘
  • Notion Windows桌面端快捷键详解
  • Solana批量转账教程:提高代币持有地址和生态用户空投代币
  • 高防ip是怎么做到分布式防御的
  • Decode rpc invocation failed: null -> DecodeableRpcInvocation
  • 计算机网络中相比于RIP,路由器动态路由协议OSPF有什么优势?
  • 多线程的出现解决了什么问题?深入解析多线程的核心价值
  • Loly: 1靶场渗透
  • C++ 备忘录模式详解
  • 【AWS+Wordpress-准备阶段】AWS注册+创建EC2实例
  • 基于nnom的多选择器
  • JNDI 注入原理解析
  • 梅花奖在上海|朱洁静:穿越了人生暴风雨,舞台是最好良药
  • 深圳市政协原副主席王幼鹏被“双开”
  • 75岁亚当·费舍尔坐镇,再现80分钟马勒《第九交响曲》
  • 特朗普政府拟终止太空污染研究,马斯克旗下太空公司将受益
  • 以军总参谋长:已进入“决定性打击计划的第二阶段”
  • 视频丨习近平主席专机抵达莫斯科,俄战机升空护航