ICode9

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

DataWhale SQL TASK2

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

标签: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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

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

ICode9版权所有