MySQL SELECT语句详解:从基础查询到多表联查

原创 2025-07-26 09:55:15编程技术
333

在MySQL数据库管理系统中,SELECT语句是使用最为频繁且功能强大的语句之一,它承担着从数据库中检索数据的关键任务。无论是简单的单表数据查询,还是复杂的多表关联查询,SELECT语句都能灵活应对。本文ZHANID工具网将深入剖析SELECT语句的各个方面,从基础语法到高级的多表联查技巧,帮助读者全面掌握SELECT语句的使用方法。

一、基础查询语法

1.1 基本结构

SELECT语句的基本语法结构如下:

SELECT [DISTINCT] 列名1, 列名2,...
FROM 表名
[WHERE 条件表达式]
[GROUP BY 分组列名]
[HAVING 分组条件表达式]
[ORDER BY 排序列名 [ASC|DESC]]
[LIMIT [偏移量,] 行数];

各部分功能说明

  • SELECT:指定要查询的列,可以使用*表示所有列。

  • DISTINCT:可选关键字,用于去除查询结果中的重复行。

  • FROM:指定数据来源的表。

  • WHERE:可选子句,用于筛选满足条件的行。

  • GROUP BY:可选子句,将结果集按照指定列进行分组。

  • HAVING:可选子句,对分组后的结果进行筛选。

  • ORDER BY:可选子句,对结果集按照指定列进行排序,ASC表示升序(默认),DESC表示降序。

  • LIMIT:可选子句,限制返回的行数,可指定偏移量。

1.2 简单查询示例

查询所有列

SELECT * FROM employees;

此语句将返回employees表中的所有行和所有列的数据。

查询特定列

SELECT first_name, last_name, salary FROM employees;

该语句仅返回employees表中的first_namelast_namesalary这三列的数据。

1.3 使用DISTINCT去重

当查询结果中存在重复行时,可以使用DISTINCT关键字去除重复。例如,查询employees表中所有不同的部门编号:

SELECT DISTINCT department_id FROM employees;

此语句将返回employees表中不重复的department_id值。

二、条件查询(WHERE子句)

2.1 简单条件运算符

  • 等于(=):用于比较两个值是否相等。例如,查询部门编号为10的员工信息:

SELECT * FROM employees WHERE department_id = 10;
  • 不等于(<> 或 !=):判断两个值是否不相等。例如,查询工资不等于5000的员工:

SELECT * FROM employees WHERE salary <> 5000;
  • 大于(>)、小于(<)、大于等于(>=)、小于等于(<=):用于数值类型的比较。例如,查询工资大于8000的员工:

SELECT * FROM employees WHERE salary > 8000;

2.2 逻辑运算符

  • AND:当多个条件都满足时返回结果。例如,查询部门编号为10且工资大于5000的员工:

SELECT * FROM employees WHERE department_id = 10 AND salary > 5000;
  • OR:当任意一个条件满足时返回结果。例如,查询部门编号为10或者工资大于8000的员工:

SELECT * FROM employees WHERE department_id = 10 OR salary > 8000;
  • NOT:对条件取反。例如,查询不在部门10的员工:

SELECT * FROM employees WHERE NOT department_id = 10;

2.3 模糊查询(LIKE)

使用LIKE运算符结合通配符进行模糊匹配。

  • %:匹配任意多个字符(包括0个字符)。例如,查询姓氏以“S”开头的员工:

SELECT * FROM employees WHERE last_name LIKE 'S%';
  • _:匹配单个字符。例如,查询姓氏第二个字母为“a”的员工:

SELECT * FROM employees WHERE last_name LIKE '_a%';

2.4 范围查询(BETWEEN...AND...)

用于查询某个范围内的值。例如,查询工资在5000到8000之间的员工:

SELECT * FROM employees WHERE salary BETWEEN 5000 AND 8000;

2.5 空值查询(IS NULL 和 IS NOT NULL)

用于判断字段值是否为NULL。例如,查询没有分配部门的员工:

SELECT * FROM employees WHERE department_id IS NULL;

查询有分配部门的员工:

SELECT * FROM employees WHERE department_id IS NOT NULL;

三、排序和限制(ORDER BY 和 LIMIT)

3.1 排序(ORDER BY)

使用ORDER BY子句对查询结果进行排序。例如,按照工资升序排列员工信息:

SELECT * FROM employees ORDER BY salary ASC;

按照工资降序排列员工信息:

SELECT * FROM employees ORDER BY salary DESC;

可以按照多个列进行排序,例如先按部门编号升序,再按工资降序排列:

SELECT * FROM employees ORDER BY department_id ASC, salary DESC;

3.2 限制返回行数(LIMIT)

使用LIMIT子句限制返回的行数。例如,返回前5条员工记录:

SELECT * FROM employees LIMIT 5;

返回从第6条开始的5条记录(偏移量为5,行数为5):

SELECT * FROM employees LIMIT 5, 5;

四、聚合函数

聚合函数用于对一组值进行计算并返回单个值。常用的聚合函数有:

  • COUNT:计算行数。例如,计算员工总数:

SELECT COUNT(*) FROM employees;

计算部门编号为10的员工人数:

SELECT COUNT(*) FROM employees WHERE department_id = 10;
  • SUM:计算数值列的总和。例如,计算所有员工的工资总和:

SELECT SUM(salary) FROM employees;
  • AVG:计算数值列的平均值。例如,计算员工的平均工资:

SELECT AVG(salary) FROM employees;
  • MAX:返回数值列中的最大值。例如,查询最高工资:

SELECT MAX(salary) FROM employees;
  • MIN:返回数值列中的最小值。例如,查询最低工资:

SELECT MIN(salary) FROM employees;

五、分组查询(GROUP BY 和 HAVING)

5.1 GROUP BY

GROUP BY子句用于将结果集按照指定列进行分组。例如,按照部门编号分组统计员工人数:

SELECT department_id, COUNT(*) 
FROM employees 
GROUP BY department_id;

5.2 HAVING

HAVING子句用于对分组后的结果进行筛选。例如,筛选出员工人数大于5的部门:

SELECT department_id, COUNT(*) 
FROM employees 
GROUP BY department_id 
HAVING COUNT(*) > 5;

HAVING与WHERE的区别

  • WHERE在分组前对行进行筛选,而HAVING在分组后对组进行筛选。

  • WHERE子句中不能使用聚合函数,而HAVING子句中可以使用聚合函数。

mysql.webp

六、多表联查

6.1 内连接(INNER JOIN)

内连接返回两个表中满足连接条件的行。语法如下:

SELECT 列名1, 列名2,...
FROM 表1
INNER JOIN 表2 ON 表1.列名 = 表2.列名;

示例:查询员工及其所属部门的信息。假设有两个表employeesdepartments,通过department_id进行关联:

SELECT e.first_name, e.last_name, d.department_name
FROM employees e
INNER JOIN departments d ON e.department_id = d.department_id;

6.2 左外连接(LEFT OUTER JOIN)

左外连接返回左表的所有行,以及右表中满足连接条件的行。如果右表中没有匹配的行,则右表的列值为NULL。语法如下:

SELECT 列名1, 列名2,...
FROM 表1
LEFT OUTER JOIN 表2 ON 表1.列名 = 表2.列名;

示例:查询所有员工及其所属部门的信息,包括没有分配部门的员工:

SELECT e.first_name, e.last_name, d.department_name
FROM employees e
LEFT OUTER JOIN departments d ON e.department_id = d.department_id;

6.3 右外连接(RIGHT OUTER JOIN)

右外连接返回右表的所有行,以及左表中满足连接条件的行。如果左表中没有匹配的行,则左表的列值为NULL。语法如下:

SELECT 列名1, 列名2,...
FROM 表1
RIGHT OUTER JOIN 表2 ON 表1.列名 = 表2.列名;

示例:查询所有部门及其员工信息,包括没有员工的部门:

SELECT e.first_name, e.last_name, d.department_name
FROM employees e
RIGHT OUTER JOIN departments d ON e.department_id = d.department_id;

6.4 全外连接(FULL OUTER JOIN)

MySQL不直接支持全外连接,但可以通过UNION组合左外连接和右外连接来实现。全外连接返回左表和右表中的所有行,如果某一边没有匹配的行,则对应边的列值为NULL。示例如下:

SELECT e.first_name, e.last_name, d.department_name
FROM employees e
LEFT OUTER JOIN departments d ON e.department_id = d.department_id
UNION
SELECT e.first_name, e.last_name, d.department_name
FROM employees e
RIGHT OUTER JOIN departments d ON e.department_id = d.department_id
WHERE e.employee_id IS NULL;

6.5 自连接

自连接是指表与自身进行连接。通常用于查询具有层次关系的数据。例如,查询员工及其领导的信息,假设employees表中有一个manager_id列,表示员工的领导ID:

SELECT e1.first_name AS employee_name, e2.first_name AS manager_name
FROM employees e1
LEFT JOIN employees e2 ON e1.manager_id = e2.employee_id;

6.6 子查询

子查询是指嵌套在其他SQL语句中的查询语句。子查询可以出现在SELECTFROMWHERE等子句中。 在WHERE子句中的子查询

-- 查询工资高于平均工资的员工
SELECT * FROM employees 
WHERE salary > (SELECT AVG(salary) FROM employees);

在FROM子句中的子查询

-- 查询每个部门的平均工资,并按照平均工资降序排列
SELECT department_id, avg_salary
FROM (
  SELECT department_id, AVG(salary) AS avg_salary
  FROM employees
  GROUP BY department_id
) AS dept_avg_salary
ORDER BY avg_salary DESC;

七、联合查询(UNION)

UNION用于合并两个或多个SELECT语句的结果集。使用UNION时,每个SELECT语句必须有相同数量的列,且对应列的数据类型必须兼容。 示例:查询工资大于8000的员工和部门编号为10的员工:

SELECT employee_id, first_name, last_name, salary
FROM employees
WHERE salary > 8000
UNION
SELECT employee_id, first_name, last_name, salary
FROM employees
WHERE department_id = 10;

UNION与UNION ALL的区别

  • UNION会去除重复行,而UNION ALL会保留所有行,包括重复行。

  • UNION ALL的性能通常比UNION好,因为它不需要进行去重操作。

八、总结

SELECT语句是MySQL中用于数据检索的核心语句,通过掌握其基础语法、条件查询、排序限制、聚合函数、分组查询以及多表联查等技巧,可以灵活地从数据库中获取所需的数据。无论是简单的单表查询还是复杂的多表关联查询,都需要根据实际需求选择合适的查询方式和优化策略,以提高查询效率和准确性。希望本文的内容能够帮助读者深入理解SELECT语句的使用方法,并在实际项目中灵活应用。

mysql查询 mysql select
THE END
战地网
频繁记录吧,生活的本意是开心

相关推荐

如何在 MySQL 中实现定时任务?Event Scheduler 全攻略
MySQL 自5.1.6版本起内置的 Event Scheduler(事件调度器) 功能,允许直接在数据库层面实现定时任务调度,无需依赖外部工具如Cron或Quartz。本文ZHANID工具网将系统梳理Even...
2025-09-15 编程技术
364

Java 与 MySQL 性能优化:MySQL全文检索查询优化实践
本文聚焦Java与MySQL协同环境下的全文检索优化实践,从索引策略、查询调优、参数配置到Java层优化,深入解析如何释放全文检索的潜力,为高并发、大数据量场景提供稳定高效的搜...
2025-09-13 编程技术
405

Java与MySQL数据库连接实战:JDBC使用教程
JDBC(Java Database Connectivity)作为Java标准API,为开发者提供了统一的数据访问接口,使得Java程序能够无缝连接各类关系型数据库。本文ZHANID工具网将以MySQL数据库为例...
2025-09-11 编程技术
409

MySQL数据类型使用场景详解:INT、VARCHAR、DATE、TEXT等核心类型实战指南
在MySQL数据库设计中,数据类型的选择直接影响存储效率、查询性能和数据完整性。本文ZHANID工具网聚焦INT、VARCHAR、DATE、TEXT等常用数据类型,通过存储特性对比、典型应用场...
2025-09-11 编程技术
415

MySQL基础语法大全:SELECT、INSERT、UPDATE、DELETE使用详解
MySQL作为最流行的开源关系型数据库管理系统,其核心操作围绕数据增删改查(CRUD)展开。本文ZHANID工具网将系统解析SELECT、INSERT、UPDATE、DELETE四大基础语句的语法规范、...
2025-09-09 编程技术
427

MySQL修改字段长度提示“Too large column size”怎么办?
当尝试修改MySQL字段长度时遇到“Too large column size”错误,通常是由于字段长度超过MySQL引擎限制或索引约束导致。本文ZHANID工具网将系统梳理错误原因、诊断方法及解决方...
2025-09-08 编程技术
420