DataWhale SQL TASK2
作者:互联网
第2章 基础查询与排序
目录摘要:主要记录了SELECT基础语法、算术运算符、逻辑运算符,以及表的聚合、分组、排序
2.1 SELECT语句基础
SELECT column_name1, column_name2
FROM table_name #如果后面没有语句,要在这加上引号
WHERE 条件表达式;
--
SELECT product_id AS "号码"
FROM product;
- *表示全部列
- SQL可以随意换行,但是不能插入空行
- 汉语别名需要使用双引号引起来
- SELECT 后面加DISTINCT可以删除重复行
- 注释有3种类,#,--空格和$/**/$
下图中第一个横着的红框,最好写数据库.表名,如果直接写表名,会报错,显示列名不存在
注释方式#在MySQL中可以使用
AS关键字起别名成功显示
2.2 算术、比较运算符
- 算术运算符,加减乘除,+-*/
- 可以对列名使用运算符
- 比较运算符,大于等于>=,大于>,小于<,小于等于<=,等于=,不等于<>
- 注意SQL语言的等于符号就是赋值符号,与其他编程语言不同
- 选取NULL,使用IS NULL运算符;选取非NULL,使用IS NOT NULL运算符
2.3逻辑运算符
- 逻辑运算符
- NOT ,不能单独使用,必须配合其他使用,可以看做是对条件取反
- AND,交集
- OR,并集
- 括号提高运算符优先级
- NULL的逻辑不是真,也不是假,而是第三种逻辑,不确定(unknown)
练习题
2.1
编写一条SQL语句,从 product
(商品) 表中选取出“登记日期(regist_date
)在2009年4月28日之后”的商品,查询结果要包含 product name
和 regist_date
两列。
SELECT product_name,regist_date
FROM shop1.product
WHERE regist_date>"2009-04-28";
2.2
请说出对product 表执行如下3条SELECT语句时的返回结果。
(1)
SELECT *
FROM product
WHERE purchase_price = NULL;
什么记录都没有,因为NULL 当做查询条件,只能是IS NULL 和 IS NOT NULL
(2)
SELECT *
FROM product
WHERE purchase_price <> NULL;
什么记录都没有,因为NULL 当做查询条件,只能是IS NULL 和 IS NOT NULL
(3)
SELECT *
FROM product
WHERE product_name > NULL;
什么记录都没有,因为NULL 当做查询条件,只能是IS NULL 和 IS NOT NULL
2.3
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 shop1.product
WHERE sale_price-purchase_price>=500;
2.4
请写出一条SELECT语句,从 product
表中选取出满足“销售单价打九折之后利润高于 100
日元的办公用品和厨房用具”条件的记录。查询结果要包括 product_name
列、product_type
列以及销售单价打九折之后的利润(别名设定为 profit
)。
提示:销售单价打九折,可以通过 sale_price
列的值乘以0.9获得,利润可以通过该值减去 purchase_price
列的值获得。
SELECT product_name,product_type,sale_price*0.9-purchase_price AS profit
FROM shop1.product
WHERE sale_price*0.9-purchase_price>100
2.4 对表进行聚合查询
- 5个常用聚合函数
- COUNT,行数/记录数
- SUM,
- AVG
- MAX
- MIN
- 函数的用法,大部分是,函数(里面填写列名)
-- 计算全部数据的行数(包含NULL)
SELECT COUNT(*)
FROM product;
-- 计算NULL以外数据的行数
SELECT COUNT(purchase_price)
FROM product;
-- 计算销售单价和进货单价的合计值
SELECT SUM(sale_price), SUM(purchase_price)
FROM product;
-- 计算销售单价和进货单价的平均值
SELECT AVG(sale_price), AVG(purchase_price)
FROM product;
-- MAX和MIN也可用于非数值型数据
SELECT MAX(regist_date), MIN(regist_date)
FROM product;
-- 计算去除重复数据后的数据行数
SELECT COUNT(DISTINCT product_type)
FROM product;
-- 是否使用DISTINCT时的动作差异(SUM函数)
SELECT SUM(sale_price), SUM(DISTINCT sale_price)
FROM product;
常用法则
- COUNT(*)会得到包含NULL的数据行数,而COUNT(<列名>)会得到NULL之外的数据行数。
- 除了COUNT(*),所有的聚合函数都会将NULL排除在外
- MAX/MIN函数几乎适用于所有数据类型的列。SUM/AVG函数只适用于数值类型的列。
- 想要计算值的种类时,可以在COUNT函数的参数中使用DISTINCT。
- 在聚合函数的参数中使用DISTINCT,可以删除重复数据。
2.5 对表进行分组
- 使用GROUP BY语句,GROUP 和BY是分开写的
-- 按照商品种类统计数据行数,返回多行,每一类多少行
SELECT product_type, COUNT(*)
FROM product
GROUP BY product_type;# 如果包含NULL,会将NULL单独罗列
-- 不含GROUP BY,返回一行
SELECT product_type, COUNT(*)
FROM product;-- product为聚合键或者分组列。
GROUP BY的子句书写顺序有严格要求,不按要求会导致SQL无法正常执行,目前出现过的子句书写顺序为:
1 SELECT → 2. FROM → 3. WHERE → 4. GROUP BY
在使用聚合函数及GROUP BY子句时,经常出现的错误有:
-
在聚合函数的SELECT子句中写了聚合健以外的列 使用COUNT等聚合函数时,SELECT子句中如果出现列名,只能是GROUP BY子句中指定的列名(也就是聚合键)。
-
在GROUP BY子句中使用列的别名 SELECT子句中可以通过AS来指定别名,但在GROUP BY中不能使用别名。因为在DBMS中 ,SELECT子句在GROUP BY子句后执行。
-
不能在WHERE中使用聚合函数, 原因是聚合函数的使用前提是结果集已经确定,而WHERE还处于确定结果集的过程中,所以相互矛盾会引发错误。 如果想指定条件,可以在SELECT,HAVING(下面马上会讲)以及ORDER BY子句中使用聚合函数。
2.6 为GROUP BY结果指定条件
WHERE只能用于记录/行的条件限制,不能对分组进行限制,替他完成这项工作的是HAVING关键字
HAVING子句用于对分组进行过滤,可以使用数字、聚合函数和GROUP BY中指定的列名(聚合键)。
-- 数字
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 = '圆珠笔';
2.7 对查询结果进行排序
-
SQL中的结果排序是随机的,可以使用ORDER BY进行排序
-
默认为升序排列,降序排列为DESC,DESC写在句尾;
-
ORDER BY 可以使用别名,这是因为SQL在使用 HAVING 子句时 SELECT 语句的执行顺序为:
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
-- 降序排列
SELECT product_id, product_name, sale_price, purchase_price
FROM product
ORDER BY sale_price DESC;
-- 多个排序键
SELECT product_id, product_name, sale_price, purchase_price
FROM product
ORDER BY sale_price, product_id;
-- 当用于排序的列名中含有NULL时,NULL会在开头或末尾进行汇总。
SELECT product_id, product_name, sale_price, purchase_price
FROM product
ORDER BY purchase_price;
-
NULL被认为比所有非NULL低,如果需要指定NULL出现在开头或者结尾
-
带有NULL进行排序的时候有3种方法
-
ORDER BY 负号字段,不适用于字符型
- 看不懂不看了!
-
方法二
- ORDER BY 字段IS NULL,字段 DESC/ASC或者ORDER BY ISNULL(字段),字段 DESC/ASC;
- ISNULL表示在结尾
- ORDER BY 字段IS NOT NULL,字段 DESC/ASC或者ORDER BY !ISNULL(字段),字段 DESC/ASC;
- !ISNULL表示在开头
- 字段按照字段后面的升降序要求排列
- ORDER BY 字段IS NULL,字段 DESC/ASC或者ORDER BY ISNULL(字段),字段 DESC/ASC;
-
ORDER BY COALESCE(字段名,理论存在的最后的排序) ASC
-
ORDER BY COALESCE(name,period,1) #如果name非空,返回name的值, #如果name为空,返回period的值, #如果name和period都为空,则返回1 ORDER BY COALESCE(name,"zzzzz") #如果NAME不为NULL,返回name,为NULL,返回"zzzzz","zzzzz"本身就是最后一个
-
-
练习题
2.5
请指出下述SELECT语句中所有的语法错误。
SELECT product_id, SUM(product_name)
--本SELECT语句中存在错误。
FROM product
GROUP BY product_type
WHERE regist_date > '2009-09-01';
答:1.WHERE 应该在GROUP BY前面;2.聚合函数只能是GROUP BY 的聚合键;3.SUM用于数值型;
2.6
请编写一条SELECT语句,求出销售单价( sale_price
列)合计值大于进货单价( purchase_price
列)合计值1.5倍的商品种类。执行结果如下所示。
SELECT product_type,SUM(sale_price),SUM(purchase_price)
FROM product
GROUP BY product_type
HAVING SUM(sale_price) > 1.5 * SUM(purchase_price);
2.7
此前我们曾经使用SELECT语句选取出了product(商品)表中的全部记录。当时我们使用了 ORDER BY
子句来指定排列顺序,但现在已经无法记起当时如何指定的了。请根据下列执行结果,思考 ORDER BY
子句的内容。
第二种方法:
-- 方法2
SELECT *
FROM product
ORDER BY regist_date IS NOT NULL,regist_date DESC
,sale_price ASC
第三种方法:
-- 方法3
SELECT *
FROM product
ORDER BY COALESCE(regist_date,"2050-01-01") DESC
,sale_price ASC
标签:TASK2,GROUP,name,price,product,DataWhale,SQL,NULL,SELECT 来源: https://www.cnblogs.com/msspansion/p/16287141.html