DQL基本操作
数据选取
从表中选取数据时需要使用SELECT语句,也就是只从表中选出(SELECT)必要数据的意思。通过SELECT语句查询并选取出必要数据的过程称为匹配查询或查询(query)。
SELECT <列名>, ……
FROM <表名>
WHERE <条件表达式>;
例如
-- 用来选取product type列为衣服的记录的SELECT语句
SELECT product_name, product_type
FROM product
WHERE product_type = '衣服';
-- 也可以选取出不是查询条件的列(条件列与输出列不同)
SELECT product_name
FROM product
WHERE product_type = '衣服';
- 想要查询出全部列时,可以使用代表所有列的星号(*)。
SELECT *
FROM <表名>;
- SQL语句可以使用AS关键字为列设定别名(用中文时需要双引号(“”))
SELECT product_id As id,
product_name As name,
purchase_price AS "进货单价"
FROM product;
- 使用DISTINCT删除product_type列中重复的数据
SELECT DISTINCT product_type
FROM product;
运算符
算术运算符
SQL语句中可以使用的四则运算的主要运算符如下:
含义 | 运算符 |
---|---|
加法 | + |
减法 | - |
乘法 | * |
除法 | / |
-- 选取出sale_price列为500的记录
SELECT product_name, product_type
FROM product
WHERE sale_price = 500;
SQL常见比较运算符如下:
运算符 | 含义 |
---|---|
= | 和 ~ 相等 |
<> | 和 ~ 不相等 |
>= | 大于等于 ~ |
> | 大于 ~ |
<= | 小于等于 ~ |
< | 小于 ~ |
- SELECT子句中可以使用常数或者表达式。
- 使用比较运算符时一定要注意不等号和等号的位置。
- 字符串类型的数据原则上按照字典顺序进行排序,不能与数字的大小顺序混淆。
- 希望选取NULL记录时,需要在条件表达式中使用IS NULL运算符。希望选取不是NULL的记录时,需要在条件表达式中使用IS NOT NULL运算符。
逻辑运算符:and 、or、not
注意运算符优先级
例
SELECT *
FROM product
WHERE purchase_price <> NULL;
SELECT *
FROM product
WHERE purchase_price = NULL;
聚合查询
SQL中用于汇总的函数叫做聚合函数。以下五个是最常用的聚合函数:
-
SUM:计算表中某数值列中的合计值
-
AVG:计算表中某数值列中的平均值
-
MAX:计算表中任意列中数据的最大值,包括文本类型和数字类型
-
MIN:计算表中任意列中数据的最小值,包括文本类型和数字类型
-
COUNT:计算表中的记录条数(行数)
例
-- 计算销售单价和进货单价的合计值
SELECT SUM(sale_price), SUM(purchase_price)
FROM product;
-- 计算销售单价和进货单价的平均值
SELECT AVG(sale_price), AVG(purchase_price)
FROM product;
-- 计算销售单价的最大值和最小值
SELECT MAX(sale_price), MIN(sale_price)
FROM product;
-- MAX和MIN也可用于非数值型数据
SELECT MAX(regist_date), MIN(regist_date)
FROM product;
-- 计算全部数据的行数(包含 NULL 所在行)
SELECT COUNT(*)
FROM product;
-- 计算 NULL 以外数据的行数
SELECT COUNT(purchase_price)
FROM product;
使用 DISTINCT 进行删除重复值的聚合运算
当对整表进行聚合运算时,表中可能存在多行相同的数据。在某些场景下,就不能直接使用聚合函数进行聚合运算了,必须搭配 DISTINCT
函数使用。
比如:要计算总共有几种咖啡类型在售,该怎么计算呢?
如前所述,DISTINCT
函数用于删除重复数据,应用 COUNT 聚合函数之前,加上 DISTINCT
关键字就可以实现需求。
SELECT COUNT(DISTINCT product_type)
FROM product;
排序查询
SELECT <列名1>, <列名2>, <列名3>, ……
FROM <表名>
ORDER BY <排序基准列1> [ASC, DESC], <排序基准列2> [ASC, DESC], ……
- 默认升序 asc
- 遇到null时:
NULL
的值比非NULL
值低(可以理解为0
或者-∞
)。 - 将
NULL
值排在末行,同时将所有非NULL
值按升序排列。
对于数字或者日期类型,可以在排序字段前添加一个负号(minus)来得到反向排序。(-1、-2、-3....-∞
)
SELECT * FROM user
ORDER BY -date_login DESC;
对于字符型或者字符型数字,此方法不一定能得到期望的排序结果,可以使用 IS NULL
比较运算符。另外 ISNULL( )
函数等同于使用 IS NULL
比较运算符。
-- IS NULL
SELECT * FROM user
ORDER BY name IS NULL ASC,name ASC;
-- ISNULL()
SELECT * FROM user
ORDER BY ISNULL(name) ASC,name ASC;
上述语句先使用 ISNULL(name)
字段进行升序排列,而只有当 name
列值为 NULL
时,ISNULL(name)
才为真,所以其排到末行,而 name ASC
则实现了 非NULL
值升序排列。
还可以使用 COALESCE
函数实现需求
SELECT * FROM user
ORDER BY COALESCE(name, 'zzzzz') ASC;
将 NULL
值排在首行,同时将所有 非NULL
值按倒序排列。
对于数字或者日期类型,可以在排序字段前添加一个负号(minus)来实现。(-∞...-3、-2、-1
)
SELECT * FROM user
ORDER BY -date_login ASC;
分组查询
GROUP BY语句
之前使用聚合函数都是会将整个表的数据进行处理,当你想将进行分组汇总时(即:将现有的数据按照某列来汇总统计),GROUP BY可以帮助你:
SELECT <列名1>,<列名2>, <列名3>, ……
FROM <表名>
GROUP BY <列名1>, <列名2>, <列名3>, ……;
SELECT purchase_price, COUNT(*)
FROM product
WHERE product_type = '衣服'
GROUP BY purchase_price;