在数据驱动的时代,数据库已成为存储和管理信息的核心基石,而SQL(Structured Query Language,结构化查询语言)则是与这些数据库进行沟通的桥梁,掌握SQL查询,意味着你拥有了从海量数据中精准提取、筛选、分析和整合信息的能力,本文将系统性地介绍如何使用SQL查询表格数据库,从基础语法到高级应用,助你构建坚实的数据查询技能。
SQL查询的基础:SELECT语句
几乎所有SQL查询的核心都围绕着一个基本结构:SELECT...FROM...WHERE...
,它定义了“要什么”、“从哪里来”以及“需要满足什么条件”。
假设我们有一个名为 employees
的员工信息表,其结构如下:
id | name | department | salary | hire_date |
---|---|---|---|---|
1 | 张三 | 销售部 | 9000 | 2025-01-15 |
2 | 李四 | 技术部 | 12000 | 2021-03-22 |
3 | 王五 | 销售部 | 8500 | 2025-05-30 |
4 | 赵六 | 人事部 | 7000 | 2025-02-10 |
5 | 孙七 | 技术部 | 15000 | 2020-11-05 |
查询所有数据
最简单的查询是获取表中的所有列和所有行,使用星号()作为通配符代表“所有列”。
SELECT * FROM employees;
这条语句会返回 employees
表中的全部内容。
查询特定列
我们并不需要所有数据,只关心特定的几个字段,这时,可以直接在 SELECT
后面列出列名,用逗号分隔。
SELECT name, salary FROM employees;
这条语句只会返回员工姓名和薪资两列。
带条件的查询(WHERE子句)
WHERE
子句是SQL查询的精髓所在,它允许我们根据指定的条件筛选出符合条件的记录。
基本条件: 等于()、大于(
>
)、小于(<
)、不等于(<>
或 )。-- 查询薪资大于10000的员工 SELECT * FROM employees WHERE salary > 10000;
逻辑条件:
AND
(且)、OR
(或)、NOT
(非)。-- 查询技术部且薪资大于11000的员工 SELECT * FROM employees WHERE department = '技术部' AND salary > 11000; -- 查询销售部或人事部的所有员工 SELECT * FROM employees WHERE department = '销售部' OR department = '人事部';
范围条件:
BETWEEN...AND...
。-- 查询薪资在8000到12000之间的员工(包含边界值) SELECT * FROM employees WHERE salary BETWEEN 8000 AND 12000;
列表条件:
IN
。-- 查询部门为销售部或技术部的员工(效果同上例的OR) SELECT * FROM employees WHERE department IN ('销售部', '技术部');
模糊匹配:
LIKE
,配合通配符 (匹配任意多个字符)和_
(匹配单个字符)。-- 查询所有姓“张”的员工 SELECT * FROM employees WHERE name LIKE '张%';
排序与限制结果
排序(ORDER BY)
获取数据后,我们通常需要按照特定顺序进行展示,例如按薪资从高到低排序。ORDER BY
子句可以实现这个功能,默认是升序(ASC
),可以指定为降序(DESC
)。
-- 按薪资降序排列 SELECT name, salary FROM employees ORDER BY salary DESC; -- 先按部门升序,再按薪资降序 SELECT name, department, salary FROM employees ORDER BY department ASC, salary DESC;
限制返回数量(LIMIT)
当只需要查询结果的前几条记录时,可以使用 LIMIT
,这在分页或获取“Top N”记录时非常有用。(注意:在SQL Server中使用 TOP N
,Oracle中使用 FETCH FIRST N ROWS ONLY
)。
-- 获取薪资最高的前两名员工 SELECT name, salary FROM employees ORDER BY salary DESC LIMIT 2;
数据聚合与分组
SQL的强大之处不仅在于查询原始数据,更在于对数据进行分析和汇总,这需要用到聚合函数和 GROUP BY
子句。
常用聚合函数
COUNT()
:计数SUM()
:求和AVG()
:求平均值MAX()
:求最大值MIN()
:求最小值
-- 计算员工总数 SELECT COUNT(*) FROM employees; -- 计算所有员工的平均薪资 SELECT AVG(salary) FROM employees; -- 计算技术部的最高薪资 SELECT MAX(salary) FROM employees WHERE department = '技术部';
分组(GROUP BY)
GROUP BY
子句将具有相同值的行分组,然后聚合函数会作用于每个分组,而不是整个表,这是进行分类统计的基础。
-- 计算每个部门的平均薪资 SELECT department, AVG(salary) AS average_salary FROM employees GROUP BY department;
这里的 AS
关键字用于给计算出的列起一个别名,使结果更具可读性。
分组后筛选(HAVING)
WHERE
子句用于在分组前筛选行,而 HAVING
子句则用于在分组后筛选分组结果。
-- 查询平均薪资大于8000的部门 SELECT department, AVG(salary) AS average_salary FROM employees GROUP BY department HAVING AVG(salary) > 8000;
这条语句的逻辑是:先按 department
分组,然后计算每个组的平均薪资,最后只保留那些平均薪资大于8000的组。
连接查询(JOIN)
在关系型数据库中,数据通常被分散存储在多个表中以减少冗余。JOIN
操作允许我们将这些表中的数据关联起来查询。
假设我们还有一个部门表 departments
:
dept_id | dept_name | location |
---|---|---|
101 | 销售部 | 北京 |
102 | 技术部 | 上海 |
103 | 人事部 | 北京 |
employees
表中有一个 dept_id
字段与 departments
表关联。
内连接(INNER JOIN)
INNER JOIN
返回两个表中连接键相匹配的行,这是最常用的连接类型。
-- 查询员工姓名及其所在部门的位置 SELECT e.name, d.location FROM employees AS e INNER JOIN departments AS d ON e.dept_id = d.dept_id;
这里使用了 AS
为表起别名,简化了书写。ON
子句指定了连接的条件。
左连接(LEFT JOIN)
LEFT JOIN
返回左表(FROM
后的第一个表)的所有行,以及右表中与左表匹配的行,如果右表中没有匹配项,则结果中右表的列将为 NULL
。
-- 查询所有员工及其部门信息,即使某些员工没有分配部门 SELECT e.name, d.dept_name FROM employees AS e LEFT JOIN departments AS d ON e.dept_id = d.dept_id;
通过以上这些核心概念和操作,你已经可以应对绝大多数数据库查询场景,从简单的数据检索到复杂的多表关联和聚合分析,SQL提供了一套强大而灵活的工具集,持续练习和探索更高级的用法,如子查询、窗口函数等,将使你在数据的世界里更加游刃有余。
相关问答FAQs
问题1:WHERE
和 HAVING
有什么区别?
解答: WHERE
和 HAVING
都是用于筛选的子句,但它们作用的阶段不同。WHERE
在数据分组(GROUP BY
)之前对原始表的行进行筛选,它不能使用聚合函数,而 HAVING
在数据分组之后对分组结果进行筛选,它通常与聚合函数一起使用。WHERE
筛选行,HAVING
筛选组。
问题2:SQL查询语句中的关键字和表名、列名是否区分大小写?
解答: 这取决于具体的数据库系统及其配置,在大多数情况下(如MySQL, SQL Server的默认配置),SQL关键字(如 SELECT
, FROM
, WHERE
)以及表名、列名是不区分大小写的,这意味着 select * from Employees;
和 SELECT * FROM employees;
是等效的,查询的数据值(字符串)通常是区分大小写的,'张三'
和 '张三'
可能是不同的,为了保证代码的可移植性和规范性,建议统一使用大写编写SQL关键字,小写编写表名和列名。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复