select
基本select语句包含两个子句:
SELECT <列名>,
FROM <表名>;
当不需要列的全部数据。。:where
SELECT <列名>, ……
FROM <表名>
WHERE <条件表达式>;
- * 全部
- distinct
SELECT DISTINCT column1, column2, ...
FROM table_name;
- 示例
-- 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;
运算符:算数、比较、逻辑
-
+ - * /
-
= <>(不等于)
-
>= > <= <
-
希望选取NULL记录时,需要在条件表达式中使用IS NULL运算符。希望选取不是NULL的记录时,需要在条件表达式中使用IS NOT NULL运算符。
-
示例
-- SQL语句中也可以使用运算表达式
SELECT product_name, sale_price, sale_price * 2 AS "sale_price x2"
FROM product;
-- WHERE子句的条件表达式中也可以使用计算表达式
SELECT product_name, sale_price, purchase_price
FROM product
WHERE sale_price - purchase_price >= 500;
/* 对字符串使用不等号
首先创建chars并插入数据
选取出大于‘2’的SELECT语句*/
-- DDL:创建表
CREATE TABLE chars
(chr CHAR(3)NOT NULL,
PRIMARY KEY(chr));
-- 选取出大于'2'的数据的SELECT语句('2'为字符串)
SELECT chr
FROM chars
WHERE chr > '2';
-- 选取NULL的记录
SELECT product_name, purchase_price
FROM product
WHERE purchase_price IS NULL;
-- 选取不为NULL的记录
SELECT product_name, purchase_price
FROM product
WHERE purchase_price IS NOT NULL;
- NOT:不能单独使用,要和其他查询条件组合;
NOT sale_price >= 1000
与sale_price < 1000
是等价的 - AND、OR
真值表
真值就是值为真(TRUE)或假 (FALSE)其中之一的值。
例如,对于 sale_price >= 3000 这个查询条件来说,由于 product_name 列为 ‘运动 T 恤’ 的记录的 sale_price 列的值是 2800,因此会返回假(FALSE),而 product_name 列为 ‘高压锅’ 的记录的sale_price 列的值是 5000,所以返回真(TRUE)。
NULL真值是除真假之外的第三种值——不确定(UNKNOWN)
我的理解是,假<不确定<真,AND总取下界,OR总取上界
练习题
- 编写一条SQL语句,从
product
(商品) 表中选取出“登记日期(regist_date
)在2009年4月28日之后”的商品,查询结果要包含product name
和regist_date
两列。
2. 请说出对product 表执行如下3条SELECT语句时的返回结果。
SELECT *
FROM product
WHERE purchase_price = NULL;
0006 叉子 厨房用具 500 2009-09-20
0008 圆珠笔 办公用品 100 2009-11-11
SELECT *
FROM product
WHERE purchase_price <> NULL;
0001 T恤 衣服 1000 500 2009-09-20
0002 打孔器 办公用品 500 320 2009-09-11
0003 运动T恤 衣服 4000 2800
0004 菜刀 厨房用具 3000 2800 2009-09-20
0005 高压锅 厨房用具 6800 5000 2009-01-15
0007 擦菜板 厨房用具 880 790 2008-04-28
SELECT *
FROM product
WHERE product_name > NULL;
-- 同上
2.2.3
章节中的SELECT语句能够从product
表中取出“销售单价(sale_price
)比进货单价(purchase_price
)高出500日元以上”的商品。请写出两条可以得到相同结果的SELECT语句。执行结果如下所示:
product_name | sale_price | purchase_price
-------------+------------+------------
T恤衫 | 1000 | 500
运动T恤 | 4000 | 2800
高压锅 | 6800 | 5000
select product_name, sale_price, purchase_price
from product
where sale_price >= purchase_price + 500;
select product_name, sale_price, purchase_price
from product
where not sale_price < purchase_price + 500;
- 请写出一条SELECT语句,从
product
表中选取出满足“销售单价打九折之后利润高于100
日元的办公用品和厨房用具”条件的记录。查询结果要包括product_name
列、product_type
列以及销售单价打九折之后的利润(别名设定为profit
)。
聚合查询
- 聚合函数:用于汇总的函数。SUM,AVG, MAX,MIN,COUN
-- 计算销售单价和进货单价的合计值
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;
- 去重
SELECT COUNT(DISTINCT product_type)
FROM product;
- count。聚合函数不处理包含 NULL 值的行,但是 COUNT(*) 除外。
group by
按某列汇总。
在 GROUP BY 子句中指定的列称为聚合键或者分组列。
聚合键包含null,将null作为一组特殊数据,进行聚合运算。
子句顺序
按照以下顺序:
避免错误:
-
错误示范
select product_name, product_type from product where sale_price > 500 group by product_type ;
-
错误示范
SELECT product_type, COUNT(*) FROM product;
-
使用COUNT等聚合函数时,SELECT子句中如果出现列名,只能是GROUP BY子句中指定的列名(也就是聚合键)。
-
先执行group by,再执行select。所以select可以用as指定别名,但是group by不能使用别名。
-
聚合函数是用于计算整个结果集或分组后的聚合值(如 COUNT、SUM、AVG 等)。由于聚合函数在计算结果时需要已经确定的数据集,所以不能在 WHERE 子句中直接使用聚合函数,否则会引发错误。如果想指定条件,可以在SELECT,HAVING(下面马上会讲)以及ORDER BY子句中使用聚合函数。
having
- 得到特定分组。
- HAVING 子句必须与 GROUP BY 子句配合使用,且限定的是分组聚合结果,WHERE 子句是限定数据行(包括分组列),二者各司其职,不要混淆。
-- 常数
SELECT product_type, COUNT(*)
FROM product
GROUP BY product_type
HAVING COUNT(*) = 2;
-- 错误形式(因为product_name不包含在GROUP BY聚合键中)
SELECT product_type, COUNT(*)
FROM product
GROUP BY product_type
HAVING product_name = '圆珠笔';
order by
SELECT <列名1>, <列名2>, <列名3>, ……
FROM <表名>
ORDER BY <排序基准列1> [ASC, DESC], <排序基准列2> [ASC, DESC], ……
-
FROM → WHERE → GROUP BY → SELECT → HAVING → ORDER BY
其中 SELECT 的执行顺序在 GROUP BY 子句之后,ORDER BY 子句之前。
当在 ORDER BY 子句中使用别名时,已经知道了 SELECT 子句设置的别名,但是在 GROUP BY 子句执行时还不知道别名的存在,所以在 ORDER BY 子句中可以使用别名,但是在GROUP BY中不能使用别名。
练习题
- 请指出下述SELECT语句中所有的语法错误。
SELECT product_id, SUM(product_name)
--本SELECT语句中存在错误。
FROM product
GROUP BY product_type
WHERE regist_date > '2009-09-01';
where 应在group by 之前;product_name不能求和;没有在聚合键中包含product_id
- 请编写一条SELECT语句,求出销售单价(
sale_price
列)合计值大于进货单价(purchase_price
列)合计值1.5倍的商品种类。执行结果如下所示。
product_type | sum | sum
-------------+------+------
衣服 | 5000 | 3300
办公用品 | 600 | 320
select product_type,sum(sale_price),sum(purchase_price)
from product
group by product_type
having sum(sale_price)>sum(purchase_price)*1.5;
- 此前我们曾经使用SELECT语句选取出了product(商品)表中的全部记录。当时我们使用了 ORDER BY 子句来指定排列顺序,但现在已经无法记起当时如何指定的了。请根据下列执行结果,思考 ORDER BY 子句的内容。
select *
from product
order by -regist_date asc, sale_price asc;