结构化查询语言(SQL)入门指南
立即解锁
发布时间: 2025-08-23 01:01:53 阅读量: 11 订阅数: 30 


数据库处理:从理论到实践的全面指南
### 结构化查询语言(SQL)入门指南
#### 1. SQL SELECT 语句中的表达式
在 SQL 语句中,我们可以进行基本的算术运算。比如,若要计算扩展价格的值,以验证 `ORDER_ITEM` 表中数据的准确性,可在 SQL 查询里使用 `Quantity * Price` 这个 SQL 表达式:
```sql
/* *** SQL-Query-CH02-42 *** */
SELECT OrderNumber, SKU, (Quantity * Price) AS EP
FROM ORDER_ITEM
ORDER BY OrderNumber, SKU;
```
SQL 表达式本质上是一个公式或一组值,用于确定 SQL 查询的精确结果。它可以是跟在实际或隐含的等号(=)比较运算符(或其他比较运算符,如大于 [>]、小于 [<] 等)之后的内容,也可以是跟在某些 SQL 比较运算符关键字(如 `LIKE` 和 `BETWEEN`)之后的内容。例如,在上述查询的 `SELECT` 子句中,就隐含了等号,即 `EP = Quantity * Price`。再如,在以下 `WHERE` 子句中:
```sql
WHERE Buyer IN ('Nancy Meyers', 'Cindy Lo', 'Jerry Martin');
```
这里的 SQL 表达式是跟在 `IN` 关键字后的由三个文本值组成的集合。
知道如何用 SQL 表达式计算扩展价格后,我们可以通过以下 SQL 查询,将计算值与 `ORDER_ITEM` 表中已存储的 `ExtendedPrice` 值进行比较:
```sql
/* *** SQL-Query-CH02-43 *** */
SELECT OrderNumber, SKU,
(Quantity * Price) AS EP, ExtendedPrice
FROM ORDER_ITEM
ORDER BY OrderNumber, SKU;
```
表达式也能在 SQL `WHERE` 子句中使用(但不能包含 SQL 内置聚合函数)。例如,若要测试 `(Quantity * Price)` 是否等于 `ExtendedPrice`,并仅在两者不相等时显示 `OrderNumber` 和 `SKU`,可使用以下 SQL 查询:
```sql
/* *** SQL-Query-CH02-44 *** */
SELECT OrderNumber, SKU
FROM ORDER_ITEM
WHERE (Quantity * Price) <> ExtendedPrice
ORDER BY OrderNumber, SKU;
```
该语句的结果为空集,这意味着不存在 `(Quantity * Price)` 不等于 `ExtendedPrice` 的行,即所有值都是正确的。需要注意的是,`Quantity * Price` 表达式外的括号并非必需,不影响计算,但有助于我们在 SQL 查询语法中看清该表达式。
SQL 表达式在 SQL 语句中的另一个用途是进行字符串操作。假设要将 `Buyer` 和 `Department` 列合并为一个名为 `Sponsor` 的列,可使用以下 SQL 语句:
```sql
/* *** SQL-Query-CH02-45 *** */
SELECT SKU, SKU_Description,
(Buyer+' in '+Department) AS Sponsor
FROM SKU_DATA
ORDER BY SKU;
```
不过,该语句的结果因每行存在额外空格而不太美观。我们可以使用更高级的函数来消除这些额外空格,但不同的数据库管理系统(DBMS)中,此类函数的语法和用法有所不同。以下是 SQL Server 2017 使用 `RTRIM` 函数(该函数在 Microsoft Access、Oracle Database 和 MySQL 中也适用)的示例,它能去除 `Buyer` 和 `Department` 右侧的尾随空格:
```sql
/* *** SQL-Query-CH02-46 *** */
SELECT SKU, SKU_Description,
RTRIM(Buyer)+' in '+RTRIM(Department) AS Sponsor
FROM SKU_DATA
ORDER BY SKU;
```
不同的 DBMS 产品,其连接运算符也不同。例如,Oracle Database 使用双竖线(||)作为连接运算符,上述查询在 Oracle Database 中的写法为:
```sql
/* *** SQL-Query-CH02-45-Oracle-Database *** */
SELECT SKU, SKU_Description,
(Buyer||' in '||Department) AS Sponsor
FROM SKU_DATA
ORDER BY SKU;
```
MySQL 使用连接字符串函数 `CONCAT()` 作为连接运算符,元素用逗号分隔并置于括号内,查询写法如下:
```sql
/* *** SQL-Query-CH02-45-MySQL *** */
SELECT SKU, SKU_Description,
CONCAT(Buyer,' in ',Department) AS Sponsor
FROM SKU_DATA
ORDER BY SKU;
```
#### 2. SQL SELECT 语句中的行分组
在 SQL 查询中,可使用 `GROUP BY` 子句根据共同值对行进行分组。这是一个强大的功能,但理解起来可能有难度。
假设你在 Cape Codd 销售分析团队,老板问:“2017 年印刷的 Cape Codd 目录中,每个部门有多少产品?”通过查看 `CATALOG_SKU_2017` 表中的数据,可发现根据 `Department` 值,行可分为三组:水上运动(第 1 - 5 行)、露营(第 6 - 7 行)和攀岩(第 8 - 9 行)。快速统计每组的行数可知,水上运动有 5 行,露营有 2 行,攀岩有 2 行。查看 `CatalogPage` 值,只有第 3 行的值为 `NULL`,这意味着除了 SKU 100400 外,所有 SKU 都出现在 2017 年的目录中。所以,水上运动在 2017 年目录中有 4 项产品,露营和攀岩各有 2 项。
若要为老板准备报告,可将这些信息放入电子表格。若要在 SQL 查询中生成类似的分组数据输出,可在 SQL `SELECT` 语句中使用 `GROUP BY` 子句,如下所示:
```sql
/* *** SQL-Query-CH02-47 *** */
SELECT Department, COUNT(SKU) AS NumberOfCatalogItems
FROM CATALOG_SKU_2017
GROUP BY Department;
```
不过,此查询结果中,水上运动部门的 `NumberOfCatalogItems` 存在错误,因为 SKU 100400 被计入但未出现在目录中。为解决该问题,可添加 `
0
0
复制全文
相关推荐










