ICode9

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

天池SQL训练营TASK2打卡

2021-09-20 15:32:27  阅读:158  来源: 互联网

标签:product GROUP price 子句 TASK2 SQL 打卡 WHERE SELECT


  1. SELECT语句查询

    1. select语句

      SELECT <列名>,FROM <表名>;

    2. 从表中选取符合条件的数据——where语句

      当选出满足某些条件的数据时,使用WHERE语句,SELECT语句通过WHERE子句来指定查询数据的条件,在WHERE子句中可以指定“某一列的值和这个字符串相等”或“某一列的值大于这个数字”等条件。

      • eg.SELECT ,

        FROM

        WHERE

      • SELECT product_name, product_type
        
        FROM product
        
        WHERE product_type = '衣服'
        

        用来选取product type 列为衣服的SELECT语句,其中product_name不是查询的列

      • SELECT product_name
        
        FROM  product
        
        WHERE product_type = '衣服';
        

        也可以选取出不是WHERE查询条件的列

    3. 相关

      • 星号"*"代表全部列

      • SQL语句中可以随意使用换行符,不影响语句执行(但不可插入空行)

      • 设置汉语别名时需要使用双引号("")括起来,类似于字符串

      • DISTINCT 关键字可以删除重复行

      • 注释是SQL语句中用来标识说明或注意事项的部分,分为1行注释“–”和多行注释两种"/* */".

      • eg. --查询所有数据,使用星号"*"

        SELECT *

        FROM

        ;

        -- SQL语句可以使用"**AS**"关键字为列名设定别名(用中文时需要双引号("")).
        
        SELECT product_id AS id,
        
        ​				product_name AS name,
        
        ​				purchase_price AS "进货单价"
        
        FROM product;
        
        -- 使用 DISTINCT删除product_type列中重复的数据
        
        SELECT DISTINCT product_type
        
        FROM product;
        
  2. 算术运算符和比较运算符

    1. 算术运算符:

      +,-,*,/

    2. 比较运算符:

      -- 选取sale_price列为500的记录
      SELECT product——namep, roduct_type
      FROM product
      WHERE sale_price = 500;
      

      常见比较运算符:=,<>(和~不相等),>=,>,<,<=;

    3. 常用法则

      • SELECT子句中可以使用常数或者表达式

      • 使用比较运算符时一定要注意不等号的位置和等号的位置 不等号总是在等号("=")前面

      • 选取NULL记录时,需要在条件表达式中使用IS NULL运算符。 希望选取不是NULL记录时,需要在条件表达式中使用IS NOT NULL运算符

      • -- SQL语句中也可以使用运算表达式
        SELECT product_name, sale_price, sale_price * 2 AS "sale_price x2"
        FROM product;
        -- WHERE子句的条件表达式中也可以使用计算表达式
        SELECT product_name, sale_price, purchase_price
        FROM product
        WHERE sale_price - purchase_price >=500;
        /* 对字符串使用不等号首先创建chars并插入数据选取出大于'2'的SELECT语句 */
        -- DDL:创建表
        CREATE TRABLE chars(
        chr CHAR(3) NOT NULL,
        PRIMARY KEY(chr);
        )
        -- 选取出大于'2'的数据SELECT语句('2'为字符串)
        SELECT chr
          FROM chars
        WHERE chr > '2';
        -- 选取NULL的记录
        SELECT product_name, purchase_price 
        FROM product
        WHERE purchase_price IS NULL;
        -- 选取不为NULL的记录
        SELECT product_name, purchase_price
        FROM product
        WHERE purchase_price IS NOT NULL
        
  3. 逻辑运算符

    1. NOT运算符

      想要表示"不是…"时,除了前文的<>运算符外,还存在另外一个表示否定、使用范围更广的运算符:NOT

      NOT不能单独使用, 如下

      eg.

      -- 选取出销售单价大于等于1000日元的记录
      SELECT product_name, product_type, sale_price FROM product
      WHERE sale_price >= 1000;
      -- 添加NOT运算符
      SELECT product_name, product_type, sale_price 
      FROM producct
      WHERE NOT sale_price >= 1000;
      
    2. AND运算符和OR运算符

      当希望同时使用多个查询条件时,可以使用AND或者OR运算符.

      AND相当于"并且",类似于数学中的取交集;

      OR相当于"或者", 类似数学中的取并集。

    3. 通过括号优先处理
      -- 通过使用括号让OR运算符优先于AND运算符执行
      SELECT product_name, product_type, regist_date
      FROM product
      WHERE product_type = '办公用品'
        AND (regist_DAte = '2009-09-11'
        or regist_date = '2009-09-20');
      

      这里需要注意因为AND运算符优先级高于or往往不注意使用括号将or运算括起来

    4. 含有NULL时的真值

      NULL的真值结果既不为真,也不为假,因为并不知道这样一个值

      这时真值是除真假之外的第三种值——不确定。一般的逻辑运算并不存在这第三种值。SQL之外的语言也基本上只使用真和假这两种真值。与通常的逻辑运算被称为二值逻辑相对,只有SQL中的逻辑运算被称为三值逻辑。

      三值逻辑下的AND和OR真值表为(不确定指NULL):

img

  1. 聚合查询

    1. 聚合函数

      SQL中用于 汇总的函数叫做 聚合函数,常用如下

      • COUNT:计算表中的记录数(行数)
      • SUM:计算表中数值列中数据的合计值
      • AVG:计算表中数值列中数据的平均值
      • MAX:求出表中任意列中数据的最大值
      • MIN:求出表中任意列中数据的最小值
    2. 常用法则
      • COUNT函数的结果根据参数的不同而不同。COUNT(*)会得到包含NULL的数据行数,而COUNT(COL NAME)会得到NULL之外的数据行数
      • 聚合函数会将NULL排除在外,但COUNT(*)例外,并不会排除NULL
      • MAX/MIN函数几乎适用于所有数据类型的列,SUM/AVG函数值适用于数值类型的列
      • 计算值的种类时,可以在COUNT函数的参数中使用DISTINCT
      • 在聚合函数的参数中使用DISTINCT,可以删除重复数据,如SUM(DISTINCT COLNAME)
  2. 对表进行分组

    1. GROUP BY语句:

      将现有数据按照某列来汇总统计,使用GROUP BY

      SELECT <COL>,...,
      	FROM <TABLE>
      GROUP BY<COL1>, <COL2>,...,;
      
    2. 使用GROUP BY 与不使用的差异
      -- 按照商品种类统计数据行数
      SELECT product_type,COUNT(*)
      FROM product;
      GROUP BY product_type;
      -- 不含GROUP BY
      SELECT produc_type, COUNT(*)
      FROM product;
      

      聚合函数与GROUP BY的使用必须针对某一列,若出现歧义则会报错,如上述第二段SQL缺少GROUP BY只含有COUNT(*)故报错。

    3. 按商品种类对表进行切分

      img

      GROUP BY子句就像切蛋糕那样将表进行了分组,GROUP BY子句中指定的列称为聚合建或者分组列

    4. 聚合键中包含NULL时

      将进货单价(purchas_price)作为聚合键举例:

      SELECT purchase_price, COUNT(*)
       FROM product
       GROUP BY purchase_price;
      

      COUNT(COL)具体到列名时筛选结果不包含NULL,COUNT(*)筛选时结果包含NULL,此时NULL作为一组特殊数据处理。

    5. GROUP BY书写位置

      GROUP BY的子句书写顺序有严格要求,不按照顺序SQL会报错。

      **顺序:**SELECT --FROM–WHERE–GROUP BY

      前三项用于筛选数据,GROUP BY对筛选出的数据进行处理

    6. WHERE子句中使用GROUP BY

      SELECT purchase_price, COUNT(*)
       FROM product
      WHERE product_type = '衣服'
      GROUP BY purchjase_pricel;
      
    7. 常见错误

      在使用聚合函数及GROUP BY子句时,经常出现的错误:

      • 聚合函数的SELECT子句中书写了聚合键以外的列:使用COUNT等聚合函数时,SELECT子句中如果出现列名,只能是GROUP BY子句中指定的列名,即聚合键
      • **GROUP BY子句中使用列的别名:**SELECT子句中可以通过AS来指定别名,但在GROUP BY中不能使用别名,因为 在DBMS中,SELECT子句在GROUP BY子句后执行
      • 在WHERE中使用聚合函数:聚合函数的使用前提是结果集已经确定,而WHERE还处于确定结果集的过程中,所以相互矛盾会引发错误,如果想指定条件,可以在SELECT, HAVING以及ORDER BY子句中使用聚合函数。
  3. 为聚合结果指定条件

    1. 使用HAVING得到特定分组

      将表使用GROUP BY分组后,如何取出其中两组?

      img

      此时WHERE不可行,因为WHERE子句中只能指定记录(行)的条件,而不能用来指定组的条件(eg.“数据行数为2行"或者"平均值为500”)。

      可在GROUP BY后使用HAVING子句,HAVING的用法类似WHERE

    2. 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 = '圆珠笔'
      

      HAVING语句可以过滤出特定筛选的聚合对象,如有两行数据的COUNT(*)=2

  4. 对查询结果进行排序

    1. ORDER BY

      SQL中执行结果为随机排列,当需要按特定顺序,可以使用ORDER BY 子句

      SELECT <COL>,....,
      FROM <COL>
      ORDER BY <排列基准>,...;
      

      默认为升序排列,降序排列为DESC

      -- 降序排列
      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;
      
    2. ORDER BY中列名可以使用别名

      GROUP BY子句中不能使用SELECT子句中定义的别名,但在ORDER BY 子句中却可以使用别名,为什么呢?因为SQL在使用SELECT语句的执行顺序为:

      FROM - WHERE - GROUP BY - HAVING - SELECT - ORDER BY

      其中SELECT 的执行顺序在GROUP BY子句之后,ORDER BY子句之前,也就是说当在ORDER BY中使用别名时,已经知道了SELECT设置的别名存在,但是在GROUP BY中使用别名时还不知道别名的存在,故在 ORDER BY中可以使用别名,但是在GROUP BY中不能使用别名

    3. SQL语句书写顺序: SELECT–FROM–WHERE–GROUP BY–HAVING–ORDER BY

标签:product,GROUP,price,子句,TASK2,SQL,打卡,WHERE,SELECT
来源: https://blog.csdn.net/qq_39757112/article/details/120391685

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

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

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

ICode9版权所有