SQL语句基本语法详解:从查询到操作完整指南

陈默
陈默
发布时间:2026-10-14| 4人浏览过
原创

本文全面解析SQL语句的核心语法,包括SELECT查询结构、WHERE条件过滤、多表连接(INNER/LEFT/RIGHT JOIN)、聚合统计(GROUP BY)以及Update、Delete、Insert等操作查询。文章还深入讲解UNION联合查询、交叉表(TRANSFORM)及子查询的高级应用,是掌握SQL数据检索与操作的实用指南。

SELECT语句的完整结构与核心子句

SQL(Structured Query Language)是用于管理关系数据库的标准语言。一个完整的SELECT语句通常由多个子句组成,遵循特定的执行顺序。理解其基本语法是进行复杂查询的基础。

第1步:理解SELECT语句的基本骨架

SELECT语句的最基本语法结构如下,其中方括号[]表示可选部分,大括号{}表示需选择的一项:

SELECT [ALL|DISTINCT|DISTINCTROW|TOP] {* | table.* | [table.]field1 [AS alias1], ...}
FROM tableexpression [, ...] [IN externaldatabase]
[WHERE condition]
[GROUP BY groupfields]
[HAVING searchcondition]
[ORDER BY field [ASC|DESC]]
[WITH OWNERACCESS OPTION]
  • SELECT子句:指定要返回的列。*代表所有字段,可以使用AS关键字为字段定义别名。
    • ALL:默认值,返回所有匹配记录。
    • DISTINCT:去除结果集中完全重复的行。
    • TOP N或TOP N PERCENT:返回前N条或前N%的记录,通常配合ORDER BY使用以确定“前几”的定义。
  • FROM子句:指定数据来源的表或查询。可以包含外部数据库路径(IN子句)。

数据过滤:WHERE子句与比较运算

WHERE子句用于筛选满足特定条件的记录。它是提高查询效率的关键,应在数据库层面尽早过滤数据。

第2步:掌握比较运算符与逻辑组合

常见的比较运算符包括:=(等于)、>(大于)、<(小于)、>=、<=、<>或!=(不等于)。在SQL中,逻辑组合通常使用AND、OR和NOT。

示例:查找1996年1月份的订单。

SELECT OrderID, CustomerID, OrderDate
FROM Orders
WHERE OrderDate > #1/1/96# AND OrderDate < #1/30/96#;

注意:在Microsoft Jet SQL(如Access)中,日期字面量通常用#包裹。字符串则使用单引号'包裹。尾随空格在字符串比较中可能被忽略,具体取决于设置。

第3步:使用范围与列表查询(BETWEEN & IN)

对于连续范围或离散列表,可使用更简洁的操作符:

  • BETWEEN...AND...:指定闭区间范围。例如Where Price BETWEEN 10 AND 20等同于Price >= 10 AND Price <= 20。
  • IN (value1, value2...):匹配列表中的任意值。常用于替代多个OR条件。例如:WHERE City IN ('London', 'Paris')。
  • LIKE:用于模式匹配,支持通配符:
    • *或%:零个或多个字符(不同数据库引擎可能不同,Access常用*,标准SQL用%)。
    • ?或_:单个字符。
    • [!...]或[^...]:不在列表中的字符。
    • [a-z]:指定范围内的字符。

示例:查找电话以(171)555开头的客户。

SELECT * FROM Customers
WHERE Phone LIKE '(171)555-*';

多表关联:JOIN连接的类型与应用

当数据分散在多个表中时,需要使用JOIN操作将它们关联起来。JOIN分为内部连接和外部连接。

第4步:使用INNER JOIN获取匹配记录

INNER JOIN仅返回两个表中连接字段相匹配的行。这是最常用的连接方式。

语法:

SELECT fields
FROM Table1
INNER JOIN Table2 ON Table1.field1 compopr Table2.field2;

示例:找出员工及其对应的订单信息。

SELECT FirstName, LastName, OrderID
FROM Employees
INNER JOIN Orders ON Employees.EmployeeID = Orders.EmployeeID;

第5步:使用LEFT/RIGHT JOIN保留未匹配记录

外部连接(Outer Join)会保留主表中的所有记录,即使它们在另一表中没有匹配项。未匹配的另一侧字段将显示为NULL。

  • LEFT JOIN:返回左表(Table1)的所有记录,以及右表(Table2)中匹配的记录。
  • RIGHT JOIN:返回右表(Table2)的所有记录,以及左表(Table1)中匹配的记录。

场景:希望列出所有产品,即使该产品从未被订购过。

SELECT Products.ProductName, Orders.OrderID
FROM Products
LEFT JOIN Orders ON Products.ProductID = Orders.ProductID;

提示:如果要检查某字段是否为空值(NULL),外连接是有效方法,因为普通的比较运算符无法直接处理NULL值。

数据聚合与分组:GROUP BY与HAVING

当需要对数据进行统计分析时,需要使用聚合函数(如COUNT, SUM, AVG, MAX, MIN)并配合GROUP BY子句进行分组。

第6步:实施分组与条件过滤

执行逻辑:先通过WHERE过滤原始行,再对剩余行进行GROUP BY分组,最后使用HAVING对分组后的结果进行过滤(不能在此处使用WHERE)。

示例:统计每个头衔下薪资总额超过一定阈值的部门(假设按地区WA筛选)。

SELECT Title, Count(*) as TotalEmployees
FROM Employees
WHERE Region = 'WA'
GROUP BY Title
HAVING Count(*) > 1;

注意:聚合函数会自动忽略NULL值。在Jet SQL中,备注(Memo)或OLE对象字段不能用于分组或聚合。

数据操作查询:增删改查之外的工作流

除了SELECT,SQL还提供了直接修改数据的“操作查询”(Action Queries)。这些查询不返回数据集,而是直接更改数据库内容。

第7步:执行Update、Delete、Insert和Select Into

  • UPDATE(更新查询):批量修改现有记录。
    UPDATE Orders SET Freight = Freight * 1.05
    WHERE ShipCountry = 'UK';
    警告:执行UPDATE前务必确认WHERE条件,建议先在SELECT中预览待更新的数据。
  • DELETE(删除查询):从表中删除匹配的行。
    DELETE FROM Orders
    WHERE OrderDate < #1/1/94#;
    风险:删除操作不可逆(除非有备份),生产环境需谨慎。
  • INSERT INTO(追加查询):向表中添加新记录。
    INSERT INTO Customers (CustomerName, City)
    VALUES ('New Company', 'Beijing');
    也可从另一个表导入数据:
    INSERT INTO TargetTable (Fields)
    SELECT Fields FROM SourceTable WHERE ...;
  • SELECT INTO(生成表查询):创建一个新表并从现有查询结果中复制数据和结构。
    SELECT * INTO OldOrdersArchive
    FROM Orders
    WHERE OrderDate < #1/1/94#;
    这常用于数据归档或创建临时表。

高级查询技术:UNION、交叉表与子查询

第8步:合并结果集——UNION

UNION用于将两个或多个SELECT语句的结果垂直合并。默认情况下,UNION会去除重复行;若需保留所有行,请使用UNION ALL。

要求:参与UNION的每个查询必须拥有相同数量的列,且对应列的数据类型必须兼容。

SELECT Name, City FROM Customers WHERE Country = 'Brazil'
UNION
SELECT Name, City FROM Suppliers WHERE Country = 'Brazil';

第9步:数据透视——TRANSFORM (交叉表查询)

交叉表查询(Crosstab Query)可以将行数据转换为带有行列标题的矩阵形式,便于直观展示汇总数据(如总和、计数、平均值)。

语法结构:

TRANSFORM AggFunction
SELECT SelectStatement
FROM FromStatement
GROUP BY GroupStatement
PIVOT PivotField [IN (ValueList)];

示例:显示1996年每位员工每季度的订单数量。

TRANSFORM Count(OrderID)
SELECT FirstName & ' ' & LastName AS FullName
FROM Orders
GROUP BY FirstName & ' ' & LastName
PIVOT DatePart('q', OrderDate) & '季度';

第10步:嵌套逻辑——子查询

子查询是一个嵌入在其他SQL语句(通常是SELECT、INSERT、UPDATE或DELETE)中的SELECT语句。它可以出现在WHERE、HAVING或FROM子句中。

  • 比较操作符 + ANY/SOME/ALL:
    • expr > ANY (subquery):如果expr大于子查询结果集中的任意一个值,则为真。
    • expr > ALL (subquery):如果expr大于子查询结果集中的所有值,则为真。
  • IN / NOT IN:判断表达式的值是否存在于子查询返回的集合中。
    SELECT ProductName FROM Products
    WHERE ProductID IN (SELECT ProductID FROM [Order Details] WHERE Quantity > 100);
  • EXISTS / NOT EXISTS:测试子查询是否返回至少一行记录。如果子查询返回非空结果集,则EXISTS为True。

以上就是SQL语句基本语法的详细内容,更多关于数据库查询优化及高级SQL应用的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。