SQL(Structured Query Language,结构化查询语言)是用于管理和操作关系型数据库的标准语言,在数据库操作中,最核心、最频繁的任务便是从表格中检索数据,掌握如何使用SQL查询表格数据库,是每一位开发者、数据分析师乃至数据库管理员的必备技能,其核心在于灵活运用SELECT语句及其一系列功能强大的子句。

SQL查询的核心:SELECT与FROM
所有查询的起点都是SELECT语句,它指定了你希望检索哪些列的数据,紧随其后的是FROM关键字,用于指明数据来源于哪一张表,这是最基础的查询结构。
最简单的形式是查询表中的所有数据:SELECT * FROM 表名;
这里的星号()是通配符,代表“所有列”,要查询一个名为Employees的员工表中的所有信息,就可以执行SELECT * FROM Employees;。
在实际应用中,我们通常只需要特定的几列数据,以提高查询效率和网络传输性能,这时,你应该明确指定列名,用逗号隔开:SELECT 列名1, 列名2 FROM 表名;SELECT EmployeeID, FirstName, LastName FROM Employees;将只返回员工的ID、名和姓。
精准筛选:WHERE子句
无差别的全表查询往往无法满足需求,我们更常需要根据特定条件来筛选数据,这时,WHERE子句便派上了用场,它跟在FROM子句之后,用于设定过滤条件,只有满足条件的行才会被返回。
SELECT 列名 FROM 表名 WHERE 条件;
条件可以非常灵活,支持多种运算符,
- 比较运算符:,
>,<,>=,<=,<>(不等于) - 逻辑运算符:
AND,OR,NOT - 范围查询:
BETWEEN ... AND ... - 列表查询:
IN (value1, value2, ...) - 模糊查询:
LIKE(配合通配符和_)
查询Employees表中所有“销售部”且年龄大于30岁的员工姓名:SELECT FirstName, LastName FROM Employees WHERE Department = '销售部' AND Age > 30;
排序结果:ORDER BY子句
查询结果的默认顺序通常是不确定的,为了使数据更具可读性或便于进一步处理,我们可以使用ORDER BY子句对结果进行排序,它可以按一个或多个列进行升序(ASC)或降序(DESC)排列,默认为升序。
SELECT 列名 FROM 表名 WHERE 条件 ORDER BY 排序列名 [ASC|DESC];
查询所有员工,并按其薪水从高到低排序:SELECT * FROM Employees ORDER BY Salary DESC;

限制数量:LIMIT子句
在某些场景下,我们可能只需要获取查询结果的前几条记录,例如实现分页功能或只查看最新的几条数据。LIMIT子句用于限制返回的行数。
SELECT 列名 FROM 表名 LIMIT 数量;
查询薪水最高的前5名员工:SELECT * FROM Employees ORDER BY Salary DESC LIMIT 5;
综合示例
假设我们有一个Products(产品)表,结构如下:
| ProductID | ProductName | Category | Price | Stock |
|---|---|---|---|---|
| 1 | 笔记本电脑 | 电子产品 | 7999 | 50 |
| 2 | 无线鼠标 | 电子产品 | 199 | 200 |
| 3 | 办公椅 | 家具 | 899 | 30 |
| 4 | 机械键盘 | 电子产品 | 599 | 120 |
| 5 | 书桌 | 家具 | 1299 | 15 |
我们想查询“电子产品”类别中,价格高于500元的产品,按价格从低到高排序,并只显示前2个产品的名称和价格。
对应的SQL查询语句为:
SELECT ProductName, Price FROM Products WHERE Category = '电子产品' AND Price > 500 ORDER BY Price ASC LIMIT 2;
查询结果将是:
| ProductName | Price |
|---|---|
| 机械键盘 | 599 |
| 笔记本电脑 | 7999 |
通过组合使用SELECT, FROM, WHERE, ORDER BY和LIMIT这些核心子句,我们已经能够应对绝大多数从表格数据库中查询数据的需求,它们是SQL语言的基石,也是开启数据世界大门的钥匙。
相关问答FAQs
*问题1:`SELECT 和SELECT 列名`有什么区别,在实际应用中应该使用哪一个?**

解答: SELECT *会返回表中的所有列,而SELECT 列名只返回你明确指定的列。
- *`SELECT `的优点**在于书写快捷,适合在数据库客户端进行快速的数据探索或调试。
- 它的缺点也很明显:
- 性能问题:如果表有很多列或包含大数据类型(如TEXT、BLOB),查询和传输的数据量会很大,降低效率。
- 可维护性差:当表结构发生变化(如增加、删除或重命名列)时,使用
SELECT *的程序代码可能会意外出错或行为不符预期。 - 不明确:代码可读性差,其他开发者无法直观地知道查询具体需要哪些数据。
在生产环境的代码中,强烈推荐始终使用SELECT 列名的方式,它更高效、更安全、代码意图也更清晰。
问题2:WHERE子句和HAVING子句有什么不同?
解答: WHERE和HAVING都用于过滤数据,但它们作用的对象和时机完全不同。
:在数据分组之前对表中的原始行进行过滤,它不能使用聚合函数(如 COUNT(),SUM(),AVG())。WHERE子句执行后,才会对满足条件的数据进行GROUP BY分组操作。:在数据分组之后对分组结果进行过滤,它通常与 GROUP BY子句配合使用,并且其条件中可以包含聚合函数。
WHERE筛选行,HAVING筛选组,要查询“平均薪水大于5000的部门”,你需要先按部门分组(GROUP BY Department),然后对每个分组的平均薪水进行过滤(HAVING AVG(Salary) > 5000),这里必须使用HAVING,而不能用WHERE。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复