USE crashcourse;
--------------- CHAPTER 4 检索数据 -------------------
-- 4.1 SEELCT 语句
# SELECT检索表数据,必须至少给出两条信息:想选择什么,以及从什么地方选择。
-- 4.2 检索单个列
SELECT prod_name
FROM products;
## 利用SELECT语句从products表中检索一个名为prod_name的列。
## *未排序数据* 如果没有明确排序查询结果,则返回的数据的顺序没有特殊意义。返回数据的顺序可能是数据被添加到表中的顺序,也可能不是。
-- 4.3 检索多个列
# 在SELECT关键字后给出多个列名,列名之间必须以逗号分隔。但最后一个列名后不加逗号。
SELECT prod_id, prod_name, prod_price
FROM products;
-- 4.4 检索所有列
# SELECT语句检索所有的列不必逐个列出它们,使用通配符 * 来达到。
SELECT *
FROM products;
# 返回列的顺序一般是列在表定义中出现的顺序。但有时候并不是这样的,表的模式的变化(如添加或删除列)可能会导致顺序的变化。
## *检索未知列* 使用通配符有一个大优点,由于不明确指定列名(因为星号检索每个列),所以能检索出名字未知的列。
-- 4.5 检索不同的行
# SELECT返回所有匹配的行,但是,如果你不想要每个值每次都出现时,使用DISTINCT关键字,顾名思义,此关键字指示MySQL只返回不同的值。
SELECT vend_id
FROM products;
SELECT DISTINCT vend_id
FROM products;
# SELECT DISINCT vend_id 告诉MySQL只返回不同(唯一)的vend_id行,因此只返回4行,如下面的输出所示。如果使用DISTINCT关键字,它必须直接放在列名的前面。
## *不能部分使用DISTINCT* DISTINCT关键字应用于所有列而不仅是前置它的列。如果给出 SELECT DISTINCT vend_id,prod_price,除非指定的两个列都不同,否则所有行都将被检索出来。
-- 4.6 限制结果
# SELECT语句返回所有匹配的行,它们可能是指定表中的每个行。为了返回第一行或前几行,可使用LIMIT子句。
SELECT prod_name
FROM products
LIMIT 5;
-- 4.7 使用完全限定的表名
# SQL例子会通过列名引用列,也可能会使用完全限定的表名来引用列(同时使用表名和列名)。
SELECT products.prod_name
FROM products;
# 表名也可以完全限定
SELECT products.prod_name
FROM crashcourse.products;
---------------- CHAPTER 5 排序检索数据 -----------------------
-- 5.1 排序数据
SELECT prod_name
FROM products;
# 为了明确地排序用SELECT语句检索出的数据,可使用ORDER BY子句。ORDER BY子句取一个或多个列的名字,据此对输出进行排序。
SELECT prod_name
FROM products
ORDER BY prod_name;
## *通过非选择列进行排序* 通常,OREDER BY子句中使用的列将是为显示所选择的列。但是,实际上并不一定要这样,用非检索的列排序数据是完全合法的。
-- 5.2 按多个列排序
SELECT prod_id, prod_price, prod_name
FROM products
ORDER BY prod_price, prod_name;
# 按多个列排序时,排序完全按所规定的顺序进行。
-- 5.3 指定排序方向
# 默认升序排序,指定DESC关键字进行降序排序。
SELECT prod_id, prod_price, prod_name
FROM products
ORDER BY prod_price DESC; -- 按单个列排序
SELECT prod_id, prod_price, prod_name
FROM products
ORDER BY prod_price DESC, prod_name; -- 按多个列排序
# 以价格降序排序产品,然后再对产品名升序排序。
# DESC关键字只应用到直接位于其前面的列名。 *在多个列上降序排序* 如果想在多个列上进行降序排序,必须对每个列指定DESC关键字。
## 使用ORDER BY 和 LIMIT的组合,能够找出一个列中最高或最低的值。
SELECT prod_price
FROM products
ORDER BY prod_price DESC
LIMIT 1;
# prod_price DESC 保证行是按照由最昂贵到最便宜的检索,而 LIMIT 1告诉MySQL进返回一行。
------------------- CHAPTER 6 过滤数据 -------------------
-- 6.1 使用WHERE子句
# 数据库表一般包含大量的数据,很少需要检索表中的所有行。通常只会根据特定操作或报告的需要提取表数据的子集。
# 只检索所需数据需要指定搜索条件(search criteria),搜索条件也被称为过滤条件(filter condition)
# 在SELECT语句中,数据会根据WHERE子句中指定的搜索条件进行过滤。WHERE子句在表名(FROM子句)之后给出。
SELECT prod_name,prod_price
FROM products
WHERE prod_price= 2.50;
# 这条语句从products表中检索两个列,但不返回所有行,只返回prod_price值为2.50的行
-- 6.2 WHERE子句操作符
-- 6.2.1 检查单个值 = < <=
SELECT prod_name, prod_price
FROM products
WHERE prod_name = 'fuses'; ## 单引号用来限制字符串
# 检查WHERE prod_name = 'fuses'语句,它返回prod_name的值为Fuses的一行。MySQL在执行匹配时默认不区分大小写,所以fuses与Fuses匹配。
#-列出价格小于10美元的所有产品
SELECT prod_name, prod_price
FROM products
WHERE prod_price < 10;
#-检索价格小于等于10美元的所有产品
SELECT prod_name, prod_price
FROM products
WHERE prod_price <= 10;
-- 6.2.2 不匹配检查 <> !=
#- 列出不是由供应商1003制造的所有产品
SELECT vend_id,prod_name
FROM products
WHERE vend_id <> 1003;
SELECT vend_id, prod_name
FROM products
WHERE vend_id != 1003;
-- 6.2.3 范围值检查 between A and B
#- 检索价格在5美元和10美元之间的所有产品
SELECT prod_name, prod_price
FROM products
WHERE prod_price BETWEEN 5 AND 10;
-- 6.2.4 空值检查
#- 在创建表时, 表设计人员可以指定其中的列是否可以不包含值。 在一个列不包含值时,称其为包含空值NULL。
#- NULL 无值(no value),它与字段包含0、空字符串或仅仅包含空格不同。
SELECT prod_name
FROM products
WHERE prod_price IS NULL;
SELECT cust_id
FROM customers
WHERE cust_email IS NULL;
-------------- CHAPTER 7 数据过滤 ------------
# 如何组合 WHERE子句以建立功能更强的更高级的搜索条件
-- 7.1 组合WHERE子句
# 为了进行更强的过滤控制,MySQL允许给出多个WHERE子句。这些子句可以两种方式使用:以AND子句的方式或OR子句的方式使用。
-- 7.1.1 AND操作符
# 为了通过不止一个列进行过滤,可使用AND操作符给 WHERE子句附加条件。
SELECT prod_id, prod_price, prod_name
FROM products
WHERE vend_id = 1003 AND prod_price <= 10; # 这条SELECT语句中的WHERE子句包含两个条件,并且用AND关键字联结它们。
# *AND 用在WHERE子句中的关键字,用来指示检索满足所有给定条件的行。 * 还可以添加多个过滤条件,每添加一条就要使用一个AND。
-- 7.1.2 OR操作符
# OR 操作符与 AND 操作符不同,它指示MySQL检索匹配任一条件的行。
SELECT prod_name, prod_price, vend_id
FROM products
WHERE vend_id = 1002 OR vend_id = 1003;
# *OR WHERE子句使用的关键字,用来表示检索匹配任一给定的条件的行。
-- 7.1.3 计算次序
# WHERE可包含任意数目的AND和OR的操作符。允许两者结合以进行复杂和高级的过滤。
# SQL在处理OR操作符前,优先处理AND操作符
SELECT prod_name, prod_price
FROM products
WHERE prod_price >= 10 AND (vend_id = 1002 OR vend_id = 1003); # 圆括号具有较AND或OR操作符更高的计算次序。
-- 7.2 IN操作符
# 圆括号在WHERE子句中还有另外一种用法。 IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN取合法值得由逗号分隔得清单,全都括在圆括号里。
SELECT prod_name, prod_price
FROM products
WHERE vend_id IN (1002,1003)
ORDER BY prod_name;
# 此语句检索供应商1002和1003制造得所有产品。
# IN操作符完成与OR相同的功能。
SELECT prod_name, prod_price
FROM products
WHERE vend_id = 1002 OR vend_id = 1003
ORDER BY prod_name;
-- 7.3 NOT操作符
# WHERE子句中的NOT操作符有且只有一个功能,那就是否定它之后所跟的任何条件。
# *NOT WHERE子句中用来否定后跟条件的关键字。*
#- 列出除1002和1003之外的所有供应商制造的产品
SELECT vend_id, prod_name
FROM products
WHERE vend_id NOT IN (1002,1003)
ORDER BY prod_name;
### MySQL中的NOT MySQL支持使用NOT对IN、BETWEENT和EXISTS子句取反。
---------------- CHAPTER 8 用通配符过滤 -------------
# 通配符用来匹配值的一部分的特殊字符。
# 搜索模式 有字面值、通配符或两者组合构成的搜索条件。
# 通配符本身实际是SQL的WHERE子句中有特殊含义的字符。
-- 8.1 LIKE操作符
# 为在搜索子句中使用通配符,必须使用LIKE操作符。LIKE指示MySQL,LIKE后跟的搜索模式利用通配符进行匹配而不是直接相等匹配。
-- 8.1.1 百分比(%)通配符 区分大小写,不匹配NULL
# 在搜索中,%表示任何字符出现任意次数。
#- 为了找出所有以词jet起头的产品
SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE 'jet%';
# 通配符可在搜索模式中任意位置使用,并且可以使用多个通配符。
SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE '%anvil%';
# 通配符也可以出现在搜索模式的中间
SELECT prod_name
FROM products
WHERE prod_name LIKE 's%e';
# 除了一个或多个字符外,%还能匹配0个字符。%代表搜索模式中给定位置的0个、1个或多个字符。
## *注意尾空格* 尾空格可能会干扰通配符匹配。
## *注意NULL* 虽然似乎%通配符可以匹配任何东西,但有一个例外,即NULL.
-- 8.1.2 下划线 (_) 通配符
# _总是匹配一个字符,不能多也不能少。
SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE '_ ton anvil';
SELECT prod_id, prod_name
FROM products
WHERE prod_name LIKE '% ton anvil';
-- 8.2 使用通配符的技巧
# 1. 不要过度使用通配符。如果其它操作符能达到相同的目的,应该使用其他操作符。
# 2. 在确实需要通配符时,除非绝对有必要,否则不要把它们用在搜索模式的开始处。
# 3. 仔细注意通配符的位置。
--------------- CHAPTER 9 用正则表达式进行搜索 ------------------
-- 9.1 正则表达式介绍
# 正则表达式是一些用来匹配和处理文本的字符串。
# 如果你想从一个文本文件中提取电话号码,可以使用正则表达式。
-- 9.2 使用MySQL正则表达式
-- 9.2.1 基本字符匹配
#- 检索列prod_name包含文本1000的所有行
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000'
ORDER BY prod_name; # 它告诉MySQL: REGEXP后跟的东西作为正则表达式处理。
SELECT prod_name
FROM products
WHERE prod_name LIKE '1000'
ORDER BY prod_name;
# 为什么要费力地使用正则表达式?在上面的例子中,正则表达式确实没有带来太多的好处(可能还会降低性能),不过,请考虑下面的例子:
SELECT prod_name
FROM products
WHERE prod_name REGEXP '.000'
ORDER BY prod_name;
# 这里使用了正则表达式.000。 .是正则表达式语言中一个特殊的字符。它表示匹配任意一个字符。
## *LIKE和REGEXP* 在LIKE和REGEXP之间有一个重要的差别。
## 请看以下两个语句:
SELECT prod_name
FROM products
WHERE prod_name LIKE '1000'
ORDER BY prod_name;
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000'
ORDER BY prod_name;
## 如果执行上述两条语句,会发现第一条语句不返回数据,而第二条返回数据。WHY?
## LIKE 匹配整个列,如果被匹配的文本在列值中出现,LIKE将不会找到它,相应的行也不被返回(除非使用通配符)。
## REGEXP 在列值内进行匹配,如果被匹配的文本在列值中出现,REGEXP将会找到它。
## *匹配不区分大小写* 为区分大小写,可使用BINARY关键字。
-- 9.2.2 进行OR匹配
# 为搜索两个串之一 (或者为这个串,或者为另一串),使用 |
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1000|2000'
ORDER BY prod_name;
# |为正则表达式的OR操作符。它表示匹配其中之一,因此1000和2000都匹配并返回。
# *两个以上的OR条件* 可以给出两个以上的OR条件。例如,'1000 | 2000 | 3000'将匹配1000或2000或3000
-- 9.2.3 匹配几个字符之一
# 匹配任何单一字符
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[123] Ton'
ORDER BY prod_name;
# 这里使用了正则表达式[123] Ton。 [123]定义一组字符,它的意思是匹配1或2或3,因此,1 ton 和 2 ton都匹配且返回(没有3 ton).
# 正如所见,[]是另一种形式的OR语句。事实上,正则表达式[123] Ton 为[1|2|3] Ton的缩写,也可以使用后者。但是,需要用[]来定义OR语句查找什么。
SELECT prod_name
FROM products
WHERE prod_name REGEXP '1|2|3 Ton'
ORDER BY prod_name;
# 尽管[123]匹配字符1、2或3,但[^123]却匹配出这些字符外的任何东西。
-- 9.2.4 匹配范围
# 集合可用来定义要匹配的一个或多个字符。
# 下面的集合将匹配数字 0到9:[0123456789]
# 为简化这种类型的集合,可使用 - 来定义一个范围。下面的式子功能上等同于上述数字列表:[0-9]
# 范围不限于完整的集合,[1-3]和[6-9]也是合法的范围。此外,范围不一定只是数值的,[a-z]匹配任意字母字符。
# 举一个例子;
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[1-5] Ton'
ORDER BY prod_name;
-- 9.2.5 匹配特殊字符 -- 反斜杠转义特殊字符
# 正则表达式语言由具有特定含义的特殊字符构成。我们已经看到.、[]、|、和-、等,还有一些其他字符。
# 如果你需要匹配这些字符,应该怎么办呢?
#- 如果要找出包含.字符的值,怎样搜索?
SELECT vend_name
FROM vendors
WHERE vend_name REGEXP '.'
ORDER BY vend_name;
# 这并不是期望的输出,.匹配任意字符,因此每个行都被检索出来。
# 为了匹配特殊字符,必须用\\未前导。\\-表示查找-,\\.表示查找.
SELECT vend_name
FROM vendors
WHERE vend_name REGEXP '\\.'
ORDER BY vend_name;
# 这种处理就是所谓的转义(escaping),正则表达式内具有特殊意义的所有字符都必须以这种方式转义。
# \\也用来引用元字符(具有特殊含义的字符)
## 元字符 说 明
## \\f 换页
## \\n 换行
## \\r 回车
## \\t 制表
## \\v 纵向制表
## *匹配\* 为了匹配反斜杠(\)字符本身,需要使用\\\。
-- 9.2.6 匹配字符类
# 为了更方便工作,可以使用预定义的字符集,称为字符类(character class)。
## 类 说 明
## [:alnum:] 任意字母和数字(同[a-zA-Z0-9])
## [:alpha:] 任意字符(同[a-zA-Z])
## [:blank:] 空格和制表(同[\\t])
-- 9.2.7 匹配多个实例
# 重复元字符
## 元字符 说 明
## * 0个或多个匹配
## + 1个或多个匹配 ( 等于{1,} )
## ? 0个或1个匹配 ( 等于{0,1} )
## {n} 指定数目的匹配
## {n,} 不少于指定数目的匹配
## {n,m} 匹配数目的范围(m不超过225)
SELECT prod_name
FROM products
WHERE prod_name REGEXP '\\([0-9] sticks?\\)'
ORDER BY prod_name;
# \\(匹配(, [0-9]匹配任意数字,sticks?匹配stick和sticks(s后的?使s可选,因为?匹配它前面的任何字符的0次或1次出现),\\)匹配)。
#- 匹配连在一起的4位数字
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[[:digit:]]{4}'
ORDER BY prod_name;
SELECT prod_name
FROM products
WHERE prod_name REGEXP '[0-9][0-9][0-9][0-9]'
ORDER BY prod_name;
-- 9.2.8 定位符
# 目前所有例子都是匹配一个串中任意位置的文本。为了匹配特定位置的文本,需要使用定位符。
# 定位元字符
## 元字符 说 明
## ^ 文本的开始
## $ 文本的结尾
## [[:<:]] 词的开始
## [[:>:]] 词的结果
#- 如果你想找出以一个数(包括以小数点开始的数)开始的所有产品,解决方法使用^定位符。
SELECT prod_name
FROM products
WHERE prod_name REGEXP '^[[0-9]\\.]'
ORDER BY prod_name;
# * ^的双重用途 * ^有两种用法。在集合中(用[和]定义),用它来否定该集合,否则,用来指串的开始处。
# * 使REGEXP起类似LIKE的作用 * LIKE和REGEXP的不同在于,LIKE匹配整个串而REGEXP匹配子串。 利用定位符,通过用^开始每个表达式,用$结束每个表达式。
SELECT 'hello' REGEXP '[0-9]'; -- 简单的正则表达式测试 REGEXP检查总是返回0(没有匹配)或1(匹配)。
------------------- CHAPTER 10 创建计算字段 ----------------------
# 本章介绍什么是计算字段,如何创建计算字段以及怎样从应用程序中使用别名它们。
-- 10.1 计算字段
# 存储在数据库表中的数据一般不是应用程序所需要的格式。
# 1. 如果象在一个字段中既显示公司名,又显示公司的地址,但这两个信息一般包含在不同的表列中。
# 2. 城市、州和邮政编码存储在不同的列中(应该这样),但邮件标签打印程序却需要把它们作为一个恰当格式的字段检索出来。
# 3. 物品订单表存储物品的价格和数量,但不需要存储每个物品的总价格(用价格乘以数量)。为打印发票,需要物品的总价格。
# 4. 列数据是大小写混合的,但报表程序需要把所有数据按大小写表示出来。
# 5. 需要根据表数据进行总数、平均数计算或其他计算。
## 计算字段并不实际存在于数据库表中。计算字段是运行时在SELECT语句内创建的。
# *字段(field)* 基本上与列(column)的意思相同,术语字段通常用在计算字段的连接上。
## 要着重注意的是, 只有数据库知道SELECT语句中哪些列是实际的表列,哪些列是计算字段。从客户机(如应用程序)的角度来看,计算字段的数据是以与其他列的数据相同方式返回的。
-- 10.2 拼接字段
## *拼接(concatenate)* 将值联结到一起构成单个值。
# 为了说明如何使用计算字段,举一个创建由两列组成的标题的简单的例子。
#- vendors表包含供应商名和位置信息。假如要生成一个供应商表,需要在供应商的名字中按照name(location)这样的格式列出供应商的位置。
#- 此报表需要单个值,而表中数据存储在两个列vend_name和vend_country中。此外, 需要用括号将vend_country括起来,这些东西都没有明确存储在数据库表中。
#- 解决办法是把两个列拼接起来。 在MySQL的SELECT语句中,可使用Concat()函数来拼接两个列。
SELECT * FROM vendors;
SELECT Concat(vend_name, ' (',vend_country, ')')
FROM vendors
ORDER BY vend_name;
# Concat()拼接串,即把多个串连接起来形成一个较长的串。
# Concat()需要一个或多个指定的串,各个串之间用逗号分隔。
# 上面的SELECT语句连接以下4个元素
# 1. 存储在vend_name列中的名字
# 2.包含一个空格和一个左圆括号的串
# 3.存储在vend_country列中的国家
# 4.包含一个右圆括号的串
# 从上述描述中可以看到,SELECT语句返回包含上述4个元素的单个列(计算字段)。
# 使用MySQL的RTrim()函数来完成删除数据右侧多余的空格的操作。
SELECT Concat(RTrim(vend_name), ' (', RTrim(vend_country), ')')
FROM vendors
ORDER BY vend_name;
# Trim函数 LTrim()(去掉串左边的空格) 以及 Trim()(去掉串左右两边的空格)
# 使用别名
SELECT Concat(RTrim(vend_name), ' (', RTrim(vend_country), ')') AS vend_title
FROM vendors
ORDER BY vend_name;
# 文本 AS vend_title指示SQL创建一个指定计算的名为vend_title的计算字段。
-- 10.3 执行算术计算
# 计算字段的另一常见用途是对检索出的数据进行算术计算。
#- 检索出订单号20005中的所有物品:
SELECT prod_id,quantity,item_price
FROM orderitems
WHERE order_num = 20005;
SELECT prod_id,quantity,item_price AS expanded_price
FROM orderitems
WHERE order_num = 20005;
-- 10.4 小结
## 本章介绍了计算字段以及如何创建计算字段。使用例子说明了计算字段在串拼接和算术计算的用途。
-------------------- CHAPTER 11 使用数据处理函数 ----------------------
-------------------- CHAPTER 12 汇总数据 ------------------------------
-- 12.1 聚集函数
# 汇总数据而不用把它们实际检索出来
# 这种类型的检索例子有以下几种:
# 1. 确定表中行数
# 2. 获得表中行组的和
# 3.找出表列的最大值、最小值和平均值
# 上述需要的是表中数据的汇总,而不是实际数据本身。
## *聚集函数* 运行在行组上,计算和返回单个值得函数。
# SQL聚集函数
# 函 数 说明
# AVG() 返回某列的平均值
# COUNT() 返回某列的行数
# MAX() 返回某列的最大值
# MIN() 返回某列的最小值
# SUM() 返回某列值之和
-- 12.1.1 AVG() 函数
# AVG()通过对表中行数计数并计算特定列值之和,求得该列得平均值。
# AVG()可用来返回所有列得平均值,也可以用来返回特定列或行得平均值。
#- 使用AVG()返回products表中所有产品的平均价格。
SELECT AVG(prod_price) AS avg_price
FROM products;
# 返回特定列或行得平均值。
#- 返回特定供应商所提供产品的平均价格
SELECT AVG(prod_price) AS avg_price
FROM products
WHERE vend_id = 1003;
## *只用于单个列* AVG()只能用来确定特定数值列的平均值,而且列名必须作为函数参数给出。为了获得多个列的平均值,必须使用多个AVG()函数。
## *NULL值* AVG()函数忽略列值为NULL的行。
-- 12.1.2 COUNT()函数
# COUNT()函数进行计数。
# COUNT()函数有两种使用方式。
# 1. 使用COUNT(*)对表中行的数目进行计数,不管列中中包含的是空值(NULL)还是非空值。
# 2. 使用COUNT(column)对特定列中具有的行进行计数,忽略NULL值。
#- 返回customers表中客户的总数
SELECT COUNT(*) AS num_cust
FROM customers;
#- 对具有电子邮件地址的客户计数
SELECT COUNT(cust_email) AS num_cust
FROM customers;
# 这条SELECT语句使用COUNT(cust_email)对cust_email列中有值的行进行计数。
-- 12.1.3 MAX()函数 --忽略列值为NULL的行。
# MAX()返回指定列中的最大值。MAX()要求指定列名。
SELECT MAX(prod_price) AS max_price
FROM products;
-- 12.1.4 MIN()函数 --忽略列值为NULL的行。
# 返回指定列的最小值。
SELECT MIN(prod_price) AS min_price
FROM products;
-- 12.1.5 SUM()函数 -- 忽略列值为NULL的行。
# SUM()用来返回指定列值的和(总计)。
#- 检索所订购物品的总数(所有quantity值之和)
SELECT SUM(quantity) AS items_ordered
FROM orderitems
WHERE order_num = 20005;
# 函数SUM(quantity)返回订单中所有物品数量之和,WHERE子句保证只统计某个物品订单中的物品。
# SUM()也可以用来合计计算值。
SELECT SUM(item_price * quantity) AS total_price
FROM orderitems
WHERE order_num = 20005;
-- 12.2 聚集不同值
# 以上5个聚集函数都可以如下使用:
# 1. 对所有的行执行计算,指定ALL参数或不给参数(因为ALL是默认行为)
# 2. 只包含不同的值,指定DISTINCTC参数。
SELECT AVG(DISTINCT prod_price) AS avg_price
FROM products
WHERE vend_id = 1003;
# 使用AVG()函数返回特定供应商提供的产品的平均价格。但是用了DISTINCT参数,因此平均值只考虑各个不同的价格。
# *注意* 如果指定列名,则DISTINCT只能用于COUNT()。DISTINCT不能用于COUNT(*)。
-- 12.3 组合聚集函数
# SELECT语句可根据需要包含多个聚集函数
SELECT COUNT(*) AS num_items,
MIN(prod_price) AS price_min,
MAX(prod_price) AS price_max,
AVG(prod_price) AS price_avg
FROM products;
SQL 入门基础知识 04
最新推荐文章于 2021-10-13 02:08:26 发布