ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

DataWhale SQL TASK2

2022-05-19 08:02:29  阅读:45  来源: 互联网

标签:TASK2 GROUP name price product DataWhale SQL NULL SELECT


第2章 基础查询与排序

摘要:主要记录了SELECT基础语法、算术运算符、逻辑运算符,以及表的聚合、分组、排序

目录

2.1 SELECT语句基础

SELECT column_name1, column_name2 
FROM table_name #如果后面没有语句,要在这加上引号
WHERE 条件表达式;
-- 
SELECT product_id AS "号码"
FROM product;
  1. *表示全部列
  2. SQL可以随意换行,但是不能插入空行
  3. 汉语别名需要使用双引号引起来
  4. SELECT 后面加DISTINCT可以删除重复行
  5. 注释有3种类,#,--空格和$/**/$

image-20220517180314001

下图中第一个横着的红框,最好写数据库.表名,如果直接写表名,会报错,显示列名不存在

注释方式#在MySQL中可以使用

image-20220517180436999

AS关键字起别名成功显示

image-20220517180710625

2.2 算术、比较运算符

  1. 算术运算符,加减乘除,+-*/
    1. 可以对列名使用运算符
  2. 比较运算符,大于等于>=,大于>,小于<,小于等于<=,等于=,不等于<>
    1. 注意SQL语言的等于符号就是赋值符号,与其他编程语言不同
  3. 选取NULL,使用IS NULL运算符;选取非NULL,使用IS NOT NULL运算符

2.3逻辑运算符

  1. 逻辑运算符
    1. NOT ,不能单独使用,必须配合其他使用,可以看做是对条件取反
    2. AND,交集
    3. OR,并集
    4. 括号提高运算符优先级
    5. NULL的逻辑不是真,也不是假,而是第三种逻辑,不确定(unknown)

练习题

2.1

编写一条SQL语句,从 product(商品) 表中选取出“登记日期(regist_date)在2009年4月28日之后”的商品,查询结果要包含 product nameregist_date 两列。

SELECT product_name,regist_date
FROM shop1.product
WHERE regist_date>"2009-04-28";

image-20220518142648218

2.2

请说出对product 表执行如下3条SELECT语句时的返回结果。

(1)

SELECT *
  FROM product
 WHERE purchase_price = NULL;

image-20220518144753054

什么记录都没有,因为NULL 当做查询条件,只能是IS NULL 和 IS NOT NULL

(2)

SELECT *
  FROM product
 WHERE purchase_price <> NULL;

image-20220518144712375

什么记录都没有,因为NULL 当做查询条件,只能是IS NULL 和 IS NOT NULL

(3)

SELECT *
  FROM product
 WHERE product_name > NULL;

image-20220518144636227

什么记录都没有,因为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

image-20220518150616443

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 列的值获得。

image-20220518151739941

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 对表进行聚合查询

  1. 5个常用聚合函数
    1. COUNT,行数/记录数
    2. SUM,
    3. AVG
    4. MAX
    5. MIN
  2. 函数的用法,大部分是,函数(里面填写列名)
-- 计算全部数据的行数(包含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子句时,经常出现的错误有:

  1. 在聚合函数的SELECT子句中写了聚合健以外的列 使用COUNT等聚合函数时,SELECT子句中如果出现列名,只能是GROUP BY子句中指定的列名(也就是聚合键)。

  2. 在GROUP BY子句中使用列的别名 SELECT子句中可以通过AS来指定别名,但在GROUP BY中不能使用别名。因为在DBMS中 ,SELECT子句在GROUP BY子句后执行。

  3. 不能在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 对查询结果进行排序

  1. SQL中的结果排序是随机的,可以使用ORDER BY进行排序

  2. 默认为升序排列,降序排列为DESC,DESC写在句尾;

  3. 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;
  1. NULL被认为比所有非NULL低,如果需要指定NULL出现在开头或者结尾

  2. 带有NULL进行排序的时候有3种方法

    1. ORDER BY 负号字段,不适用于字符型

      1. 看不懂不看了!
    2. 方法二

      1. ORDER BY 字段IS NULL,字段 DESC/ASC或者ORDER BY ISNULL(字段),字段 DESC/ASC;
        1. ISNULL表示在结尾
      2. ORDER BY 字段IS NOT NULL,字段 DESC/ASC或者ORDER BY !ISNULL(字段),字段 DESC/ASC;
        1. !ISNULL表示在开头
      3. 字段按照字段后面的升降序要求排列
    3. ORDER BY COALESCE(字段名,理论存在的最后的排序) ASC

      1. 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);

image-20220518225529823

2.7

此前我们曾经使用SELECT语句选取出了product(商品)表中的全部记录。当时我们使用了 ORDER BY 子句来指定排列顺序,但现在已经无法记起当时如何指定的了。请根据下列执行结果,思考 ORDER BY 子句的内容。

image-20220518225709311

第二种方法:

-- 方法2
SELECT *
FROM product
ORDER BY  regist_date IS NOT NULL,regist_date DESC
		,sale_price ASC

image-20220518230741091

第三种方法:

-- 方法3
SELECT *
FROM product
ORDER BY COALESCE(regist_date,"2050-01-01") DESC
		,sale_price ASC

image-20220518230549977

标签:TASK2,GROUP,name,price,product,DataWhale,SQL,NULL,SELECT
来源: https://www.cnblogs.com/msspansion/p/16287141.html

专注分享技术,共同学习,共同进步。侵权联系[admin#icode9.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有