当前位置:  首页>> 技术小册>> MySQL从入门到精通(三)

第9章 数据检索与查询优化

9.2 单表查询

在MySQL数据库中,单表查询是最基础也是最重要的数据检索方式之一。它允许用户从单个表中检索出满足特定条件的数据行。掌握单表查询技巧,对于理解更复杂的SQL查询语句、提升数据库操作效率以及优化数据检索性能至关重要。本节将详细探讨单表查询的各个方面,包括基本SELECT语句的使用、条件筛选、排序、分组以及限制结果集等。

9.2.1 SELECT语句基础

SELECT语句是SQL中用于数据检索的基本命令。其基本语法结构如下:

  1. SELECT column1, column2, ...
  2. FROM table_name
  3. WHERE condition
  4. ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...
  5. LIMIT number_of_rows OFFSET offset;
  • SELECT 部分指定了要从表中检索的列名。使用*可以检索所有列。
  • FROM 指定了包含数据的表名。
  • WHERE 子句(可选)用于设置检索数据的条件。
  • ORDER BY 子句(可选)用于对结果集进行排序。
  • LIMITOFFSET 子句(可选)用于限制返回的记录数,并可以指定从哪条记录开始返回。
9.2.2 检索所有列与指定列
  • 检索所有列

    1. SELECT * FROM employees;

    这条语句会检索employees表中的所有列和所有行。

  • 检索指定列

    1. SELECT employee_id, first_name, last_name FROM employees;

    这里只检索了employee_idfirst_namelast_name三列。

9.2.3 使用WHERE子句进行条件筛选

WHERE子句允许你根据一个或多个条件来过滤结果集。

  • 单一条件筛选

    1. SELECT * FROM employees WHERE department_id = 5;

    检索部门ID为5的所有员工。

  • 多条件筛选(使用AND、OR、NOT):

    1. SELECT * FROM employees WHERE department_id = 5 AND salary > 5000;

    检索部门ID为5且薪资超过5000的所有员工。

    1. SELECT * FROM employees WHERE (department_id = 5 OR department_id = 10) AND salary > 5000;

    检索部门ID为5或10且薪资超过5000的所有员工。

    1. SELECT * FROM employees WHERE NOT department_id = 5;

    检索部门ID不是5的所有员工。

9.2.4 使用ORDER BY进行排序

ORDER BY子句用于对结果集进行排序。默认情况下,排序是升序的(ASC),但你可以通过指定DESC来改为降序。

  • 单列排序

    1. SELECT * FROM employees ORDER BY hire_date ASC;

    按入职日期升序排列所有员工。

  • 多列排序

    1. SELECT * FROM employees ORDER BY department_id ASC, hire_date DESC;

    首先按部门ID升序排列,如果部门ID相同,则按入职日期降序排列。

9.2.5 使用LIMIT和OFFSET限制结果集

LIMIT子句用于限制查询结果返回的记录数,而OFFSET子句用于指定从哪条记录开始返回。

  • 使用LIMIT

    1. SELECT * FROM employees LIMIT 5;

    返回employees表中的前5条记录。

  • 结合使用LIMIT和OFFSET

    1. SELECT * FROM employees LIMIT 5 OFFSET 10;

    跳过前10条记录,返回接下来的5条记录。

9.2.6 使用DISTINCT去除重复行

当查询结果集中包含重复行时,可以使用DISTINCT关键字来去除这些重复行。

  1. SELECT DISTINCT department_id FROM employees;

这条语句会返回所有不同的部门ID,即使某个部门ID在employees表中出现了多次。

9.2.7 使用聚合函数进行统计

聚合函数(如COUNT(), SUM(), AVG(), MAX(), MIN())允许你对一组值执行计算,并返回一个单一的值。

  • 计算行数

    1. SELECT COUNT(*) FROM employees;

    返回employees表中的总行数。

  • 计算平均值

    1. SELECT AVG(salary) FROM employees;

    返回employees表中所有员工薪资的平均值。

  • 最大值与最小值

    1. SELECT MAX(salary), MIN(salary) FROM employees;

    返回薪资的最大值和最小值。

9.2.8 实战案例:员工信息查询

假设我们需要查询薪资高于公司平均薪资的所有员工信息,并按部门ID和薪资降序排列。

  1. SELECT *
  2. FROM employees
  3. WHERE salary > (SELECT AVG(salary) FROM employees)
  4. ORDER BY department_id ASC, salary DESC;

这个查询首先计算了公司所有员工的平均薪资,然后选出了薪资高于这个平均值的员工,最后按照部门ID升序和薪资降序排列了结果。

总结

单表查询是SQL数据检索的基础,掌握其基本概念和技巧对于进行复杂的数据分析和报表生成至关重要。通过本节的学习,你应该能够熟练使用SELECT语句、WHERE子句、ORDER BY子句、LIMITOFFSET子句以及聚合函数来执行各种单表查询任务。此外,理解并应用DISTINCT关键字去除重复行也是提高查询结果准确性的重要手段。希望这些内容能够帮助你在MySQL数据库操作中更加得心应手。


该分类下的相关小册推荐: