天池SQL训练营TASK2打卡

2021/9/20 19:27:13

本文主要是介绍天池SQL训练营TASK2打卡,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

  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



这篇关于天池SQL训练营TASK2打卡的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程