教程链接:Datawhale - 一个热爱学习的社区
知识学习
前提:
上一次任务中提出了本课程的用表,但是我并没有加入这个表,这次学习前先对这个表进行插入。
INSERT INTO product VALUES('0001', 'T恤衫', '衣服', 1000, 500, '2009-09-20');
INSERT INTO product VALUES('0002', '打孔器', '办公用品', 500, 320, '2009-09-11');
INSERT INTO product VALUES('0003', '运动T恤', '衣服', 4000, 2800, NULL);
INSERT INTO product VALUES('0004', '菜刀', '厨房用具', 3000, 2800, '2009-09-20');
INSERT INTO product VALUES('0005', '高压锅', '厨房用具', 6800, 5000, '2009-01-15');
INSERT INTO product VALUES('0006', '叉子', '厨房用具', 500, NULL, '2009-09-20');
INSERT INTO product VALUES('0007', '擦菜板', '厨房用具', 880, 790, '2008-04-28');
INSERT INTO product VALUES('0008', '圆珠笔', '办公用品', 100, NULL, '2009-11-11');
COMMIT;
注意这里每一行都是一个语句,千万不要只运行最后一行。
1 SELECT
在插入了完整的表之后,我们就可以正式学习这一课的内容了。
总结:用SELECT选择列名,用FROM选择表名,用WHERE表达条件,用AS为列设定别名,中文列名要加双引号。
此外
-- 使用DISTINCT删除product_type列中重复的数据
SELECT DISTINCT product_type
FROM product;
关于SQL语言中的注释,“--”是单行注释,/* */是多行注释。
2 算术运算符和比较运算符
算术运算符没有什么特别的,比较运算符中与常见计算机语言不同的是,用“=”可以同时表示和或相等,而用“<>”也可同时表示和或不相等。
在常用法则方面:
这个语句是将sale_price翻倍并显示,由于表格中并没有这个列,因此它是只读的。
-- WHERE子句的条件表达式中也可以使用计算表达式
SELECT product_name, sale_price, purchase_price
FROM product
WHERE sale_price - purchase_price >= 500;
此外还有is null、is not null的使用方法
-- 选取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;
3 逻辑运算符
逻辑运算符当然就是与或非这些,用法上主要用于条件选择。
非运算NOT放在条件之前,使用AND和OR要注意使用括号确定优先级避免报错。
练习题-第一部分
2.1
-- 2.1
SELECT product_name, regist_date
FROM product
WHERE regist_date > '2009-4-28';
2.2 说出对product 表执行如下3条SELECT语句时的返回结果
SELECT *
FROM product
WHERE purchase_price = NULL;
应为 0006 和0008 记录的全部列数据。(但是我运行了什么也没有?)
SELECT *
FROM product
WHERE purchase_price <> NULL;
应为除了0006 和 0008 记录的完整列数据。(也什么都没有,是我的数据库出问题了吗,上面哪些语句都没问题啊)
SELECT *
FROM product
WHERE product_name > NULL;
应为全部列。(运行了也什么都没有)
2.3 取出“销售单价(sale_price
)比进货单价(purchase_price
)高出500日元以上”的商品
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;
这两条语句都可以得到结果
2.4 打九折
4 对表进行聚合查询
就是求和、求平均、最大最小、计数等“函数”
当对整表进行聚合运算时,表中可能存在多行相同的数据,比如商品类型(product_type 列)。在某些场景下,就不能直接使用聚合函数进行聚合运算了,必须搭配 DISTINCT
函数使用。
COUNT 聚合函数运算结果与参数有关,COUNT(*) / COUNT(1) 得到包含 NULL 值的所有行,COUNT(<列名>) 得到不包含 NULL 值的所有行。
聚合函数不处理包含 NULL 值的行,但是 COUNT(*) 除外。
MAX / MIN 函数适用于文本类型和数字类型的列,而 SUM / AVG 函数仅适用于数字类型的列。
在聚合函数的参数中使用 DISTINCT 关键字,可以得到删除重复值的聚合结果。
5 对表进行分组
之前使用聚合函数都是会将整个表的数据进行处理,当你想将进行分组汇总时(即:将现有的数据按照某列来汇总统计),GROUP BY可以帮助你
若聚合建中包含NULL,则会将NULL 作为一组特殊数据进行聚合运算。
6 为聚合结果指定条件
可以在 GROUP BY 后使用 HAVING 子句。用法类似WHERE。
7 对查询结果进行排序
想要按照顺序排序,需使用 ORDER BY 子句。其中,参数 ASC 表示升序排列,DESC 表示降序排列,默认为升序,此时,参数 ASC 可以缺省。
需要特别说明的是:由于 NULL 无法使用比较运算符进行比较,也就是说,无法与文本类型,数字类型,日期类型等进行比较,当排序列存在 NULL 值时,NULL 结果会展示在查询结果的开头或者末尾。
练习题-第二部分
2.5 请指出下述SELECT语句中所有的语法错误。
SELECT product_id, SUM(product_name)
--本SELECT语句中存在错误。
FROM product
GROUP BY product_type
WHERE regist_date > '2009-09-01';
答:WHERE语句应该写在GROUP BY语句之前。
2.6 请编写一条SELECT语句,求出销售单价( sale_price
列)合计值大于进货单价( purchase_price
列)合计值1.5倍的商品种类
SELECT product_type, SUM(sale_price) AS sum, SUM(purchase_price) AS sum
FROM product
GROUP BY product_type
HAVING SUM(sale_price) - SUM(purchase_price)*1.5 > 0;
2.7 请根据下列执行结果,思考 ORDER BY
子句的内容。
SELECT * FROM product
ORDER BY -regist_date ASC, purchase_price ASC ;
-- 为了使得日期列NULL在第一行,不使用DESC而使用-? ASC。
-- 有三个日期相同的,根据进价排序