学习目标
- SQL基础查询与排序
学习内容
一、SELECT语句基础
1.1 从表中选取数据
1.2从表中选取符合条件的数据
1.3 相关法则
二、算术运算符和比较运算符
2.1 算术运算符
2.2 比较运算符
2.3 常用法则
三、逻辑运算符
3.1 NOT运算符
3.2 AND运算符和OR运算符
3.3 通过括号优先处理
3.4 真值表
3.5 含有NULL时的真值
四、对表进行聚合查询
4.1 聚合函数
4.2 使用聚合函数删除重复值
4.3 常用法则
五、对表进行分组
5.1 GROUP BY语句
5.2 聚合键中包含NULL时
5.3 GROUP BY书写位置
5.4 在WHERE子句中使用GROUP BY
5.5 常见错误
六、为聚合结果指定条件
6.1 用HAVING得到特定分组
6.2 HAVING特点
七、对查询结果进行排序
7.1 ORDER BY
7.2 ORDER BY中列名可使用别名
学习产出
-
练习题-Part01
- 练习题一
编写一条SQL语句,从product(商品)表中选取出“登记日期(regist在2009年4月28日之后”的商品,查询结果要包含product_name和regist_date两列。
SELECT
product_name,
regist_date
FROM
product
WHERE
regist_date > '2009-04-28';
- 练习题二
请说出对product 表执行如下3条SELECT语句时的返回结果。
product表:
①
SELECT *
FROM product
WHERE purchase_price = NULL;
②
SELECT *
FROM product
WHERE purchase_price <> NULL;
③
SELECT *
FROM product
WHERE product_name > NULL;
运行代码后我们发现全部为空值,这是因为MySQL中不能用“ = NULL ”,而是要用“ IS NULL ”。
将上述代码进行修改,因为NULL值无法用" > ", " < "符号比较,部分③的代码没有实际意义。
①
②
- 练习题三
代码清单2-22(2-2节)中的SELECT语句能够从product表中取出“销售单价(saleprice)比进货单价(purchase price)高出500日元以上”的商品。请写出两条可以得到相同结果的SELECT语句。执行结果如下所示。
语句①:
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
sale_price - 500 >= purchase_price;
运行结果:
- 练习题四
请写出一条SELECT语句,从product表中选取出满足“销售单价打九折之后利润高于100日元的办公用品和厨房用具”条件的记录。查询结果要包括product_name列、product_type列以及销售单价打九折之后的利润(别名设定为profit)。
提示:销售单价打九折,可以通过saleprice列的值乘以0.9获得,利润可以通过该值减去purchase_price列的值获得。
SELECT
product_name,
product_type,
sale_price * 0.9 - purchase_price AS profit
FROM
product
WHERE
sale_price * 0.9 - purchase_price > 100
AND ( product_type = '办公用品' OR product_type = '厨房用具' );
-
练习题-Part02
- 练习题一
请指出下述SELECT语句中所有的语法错误。
SELECT product_id, SUM(product_name)
--本SELECT语句中存在错误。
FROM product
GROUP BY product_type
WHERE regist_date > '2009-09-01';
" GROUP BY "不应该在" WHERE "前面,并且" GROUP BY "和" SELECT "里面的字段不匹配,另外" product_name "字段无法求值。
- 练习题二
请编写一条SELECT语句,求出销售单价(sale_price列)合计值大于进货单价(purchase_price列)合计值1.5倍的商品种类。执行结果如下所示。
product_type | sum | sum
-------------+------+------
衣服 | 5000 | 3300
办公用品 | 600 | 320
SELECT
product_type,
sum( sale_price ) AS "售价",
sum( purchase_price ) AS "进价"
FROM
product
GROUP BY
product_type
HAVING
sum( sale_price ) > sum( purchase_price )* 1.5;
- 练习题三
此前我们曾经使用SELECT语句选取出了product(商品)表中的全部记录。当时我们使用了ORDERBY子句来指定排列顺序,但现在已经无法记起当时如何指定的了。请根据下列执行结果,思考ORDERBY子句的内容。
SELECT
*
FROM
product
ORDER BY
regist_date DESC,
sale_price;