本学习笔记为阿里云天池龙珠计划SQL训练营的学习内容,学习链接为https://tianchi.aliyun.com/forum/postDetail?spm=5176.20222307.J_9059755190.4.73dc4cb3O5Eh1V&postId=163422
一、学习知识点概要
1.Select语句基础
2.算术运算符和比较运算符
3.逻辑运算符
4.聚合查询
5.分组语句
6.Having子句
7.Order By子句
二、学习内容
1.Select语句基础
利用select和where搭配可以查找符合某些字段条件的记录
2.算术运算符和比较运算符
算术运算符:四则运算 +-*/
比较运算符:= != > < >= <=等
3.逻辑运算符
NOT/AND/OR
4.聚合查询
COUNT ;
MAX;MIN;AVG;SUM
5.分组语句
GROUP BY
- 在聚合函数的SELECT子句中写了聚合健以外的列
使用COUNT等聚合函数时,SELECT子句中如果出现列名,只能是GROUP BY子句中指定的列名(也就是聚合键)。
2.在GROUP BY子句中使用列的别名
SELECT子句中可以通过AS来指定别名,但在GROUP BY中不能使用别名。因为在DBMS中 ,SELECT子句在GROUP BY子句后执行。
3.在WHERE中使用聚合函数
原因是聚合函数的使用前提是结果集已经确定,而WHERE还处于确定结果集的过程中,所以相互矛盾会引发错误。 如果想指定条件,可以在SELECT,HAVING(下面马上会讲)以及ORDER BY子句中使用聚合函数。
6.Having子句
7.Order By子句
可以使用别名
原因:SQL使用 HAVING 子句时 SELECT 语句的执行****顺序为:
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
三、学习问题与解答
--1.1编写一条SQL语句,从product(商品)表中选取出“登记日期
--(regist在2009年4月28日之后”的商品,查询结果要包含product_name和regist_date两列。
SELECT product_name, regist_date
FROM PRODUCT
WHERE regist_date > TO_date('2009-04-28','YY-MM-DD');
Oracle数据库需要用to_date函数转换日期
--1.2
采用where purchase_price = NULL;<> NULL;> NULL
没有记录返回
改为IS NULL;IS NOT NULL能够正确显示结果
/*1.3 代码清单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 NOT SALE_PRICE - PURCHASE_PRICE <500;
--1.4
SELECT product_name, product_type, sale_price * 0.9 - purchase_price AS profit
FROM PRODUCT p
WHERE (product_type='办公用品' OR product_type='厨房用具')
AND sale_price * 0.9 - purchase_price > 100;
--6
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
--7
SELECT * FROM PRODUCT p
ORDER BY REGIST_DATE DESC ,SALE_PRICE
四、学习思考与总结
学习了SQL的执行过程,了解了为什么groupby子句不能使用别名而orderby子句可以