datawhale9月组队学习task02基础查询与排序

Posted 临风而眠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了datawhale9月组队学习task02基础查询与排序相关的知识,希望对你有一定的参考价值。

datawhale9月组队学习task02基础查询与排序

👉本task教程链接

先启动mysql,之前一直都是右键此电脑,去管理那里手动启动的…
以后直接在终端操作吧(别忘了要以管理员方式启动)

▲|O(∩_∩)O|▲ 补充学习:执行SQL脚本

一开始没发现给的GitHub教程里面有一个shop.sql文件

然后学到AND、 OR那里发现按理说不应该全都INSERT INTO进去之后

发现之后,发现没有download按钮,只能复制

然后突然想到那个方法 :在github后面加上1s

然后右键download ✌

然后打开sql文件一看,CREATE DATABASE shop

那我决定我先把我建立的shop删掉:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-97UZmTKx-1631817803733)(C:\\Users\\86171\\AppData\\Roaming\\Typora\\typora-user-images\\image-20210916234025697.png)]

额,发现其实也不用删

他会先把表删掉重建…

命令行执行SQL脚本

参考教程:https://blog.csdn.net/S0001100/article/details/106408024

datagrip执行sql脚本

复制一个sql脚本,把里面的shop改成shop2

👉参考教程

  • 找到sql脚本

  • 右键点击run

  • 麻了

成功了!

navicat执行sql脚本

复制一个sql脚本,把里面的shop改成shop3

👉参考教程

  • 右键 选择运行sql文件

  • 选择文件,点击开始

  • 点击开始

  • 再点击开始

  • 检查下子

    有shop3了

迷惑!!!

上面的navicat和datagrip搞出来的都???…

难道是因为和shop太像了??

  • 那就先把命令行里搞出来的shop先删掉,然后再用可视化工具试一试吧

  • 非也!无意间看到navicat报错,赶紧打开sql脚本

  • 是sql代码没改好!

    • 下一句也要改成shop2…

    • 相应的那个shop3也是

  • OK 都OK了

一.SELECT语句基础

1.从表中选取数据

SELECT语句

  • SELECT 顾名思义,是选择的意思

  • SELECT语句用于从数据库中选取数据

    • 结果被存储在一个结果表中,称为结果集
  • 基本语法:

    SELECT column_name,column_name
    FROM table_name;
    

    SELECT * FROM table_name;
    
    • 其中,SELECT子句中列举了希望从表中查询出的列的名称,而FROM子句则指定了选取出数据的表的名称
    • *表示全部列的意思
  • SQL语句可以使用AS关键字为列设定别名

    • 设定汉语别名时要双引号

    • 如:

      日常低级错误了属于是…

      product_name又是忘记下划线,又是d写成c 🙄🙄

      而且试了六七次才发现 🤯

  • SELECT语句中使用DISTINCT可以删除重复行(去重)

    • 语法:

      SELECT DISTINCT column_name,column_name
      FROM table_name;
      

对比MongoDB相关操作

  • MongoDB 中的集合与 SQL 数据库中的表相同

    • 像本教程里的表prodcuct在mongodb里面就叫集合
  • MongoDB 中的文档与 SQL 数据库中的记录相同

  • 选取数据:

    • db.集合名称.find()
    • db是当前数据库
      • 先要用use 选取
        • MySQL也要用use先选取数据库
        • db.集合名称 就相当于MySQL的FROM <表名>
  • 去重:

    • db.集合名称.distinct(‘去重字段’,{条件})

      • 这里的字段就相当于MySQL的列名

2.从表中选取符合条件的数据

WHERE语句

  • 语法:

    SELECT <列名>, ……
      FROM <表名>
     WHERE <条件表达式>;
    
    • 条件表达式就是: 列名 运算符 值👇
    SELECT column_name,column_name
    FROM table_name
    WHERE column_name operator value;
    

对比MongoDB相关操作

  • mongodb的条件查询

    • db.集合名称.find({条件文档})
  • mongodb中也有where ,是用于自定义查询

    • 是使用$where,在$where后面写一个函数

    • 如 返回年龄大于30的

      db.stu.find({ $where:function() { return this.age>30;} })
      

二.算术运算符和比较运算符

1.算术运算符

  • 加 +
  • 减 -
  • 乘 *
  • 除 /

2.比较运算符

  • 相等 =
  • 不相等 <>
  • 大于等于 >=
  • 大于 >
  • 小于等于 <
  • 小于 <

​ 上面WHERE 语句条件表达式里面就用到了

3.常用法则

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

    注意AS重命名的列名若有空格则也需要加双引号

  • 需要注意等号和不等号的位置

  • 字符串类型的数据原则上按照字典顺序进行排序,不能与数字的大小混淆

    • 先创建一个表

      • 插入几条记录

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-McNwMklB-1631817803760)(https://cdn.jsdelivr.net/gh/xin007-kong/picture_new/img/20210916173413.png)]

        INTO 又写成INFO…🙄

        • 看看插入了哪些

    • 查询

      111比2大,但“2”比“111”大

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

三.逻辑运算符

1.NOT

  • 表示否定

    • 比 不等号 <> 运算符应用范围广
  • 选出销售单价大于等于1000的记录 及其 否定(小于1000)

2.AND、OR

  • AND 相当于取交集
  • OR 相当于取并集

括号优先处理

  • AND运算符优先于OR运算符
  • 用括号可以做到优先执行OR运算

mysql> SELECT product_name, product_type, regist_date
    -> FROM product
    -> WHERE product_type = '办公用品'
    -> AND (regist_date ='2009-09-11'
    -> OR regist_date ='2009-09-20');

3.真值表

  • 可以用真值表梳理逻辑关系
    • 三个运算符 NOT、AND 和 OR 称为逻辑运算符。这里所说的逻辑就是对真值进行操作的意思
    • 最近正在学数电 刚学过真值表🤭
    • 真值就是值为真(TRUE)或假 (FALSE)其中之一的值

含NULL时的真值

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

  • 这时真值是除真假之外的第三种值——不确定(UNKNOWN)

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

  • 三值逻辑:

四.对表进行聚合查询

1.聚合函数

SQL中用于汇总的函数叫做聚合函数。以下五个是最常用的聚合函数:

  • 计算全部数据的行数

    SELECT COUNT(*)
    FROM product;
    

  • 计算NULL 以外数据的行数

    ​ 将 COUNT(*) 的参数改成指定对象的列,就可以得到该列的 非 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;
    

  • MIN MAX

    • 对字符串也可

      中文不知道按什么法则排序的

使用聚合函数删除重复值

  • 计算去重后的数据行数

    SELECT COUNT(DISTINCT product_type)
     FROM product;
    

    mysql> SELECT COUNT(DISTINCT purchase_price)
        -> FROM product;
    

    • SUM函数

2.常用法则

3.对比MongoDB相关操作

  • mongodb管道命令

五.对表进行分组

1.GROUP BY 语句

  • 基本语法

    SELECT <列名1>,<列名2>, <列名3>, ……
      FROM <表名>
     GROUP BY <列名1>, <列名2>, <列名3>, ……;
    
  • 试试水

    -- 按照商品种类统计数据行数
    SELECT product_type, COUNT(*)
      FROM product
     GROUP BY product_type;
     -- 不含GROUP BY
    SELECT product_type, COUNT(*)
      FROM product
    

    • 在 GROUP BY 子句中指定的列称为聚合键或者分组列

聚合键中包含NULL时

  • purchase_price作为聚合键举例

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

    此时会将NULL作为一组特殊数据进行处理

GROUP BY书写位置

在WHERE子句中使用GROUP BY

SELECT purchase_price, COUNT(*)
  FROM product
 WHERE product_type = '衣服'
 GROUP BY purchase_price;

2.常见错误

3.对比MongoDB相关操作

👉之前整理过的MongoDB博客链接

六.为聚合结果指定条件

1.用HAVING得到特定分组

  • 将表使用GROUP BY分组后,怎样才能只取出其中两组?
  • WHERE不可行,
    • WHERE子句只能指定记录(行)的条件,而不能用来指定组的条件(例如,“数据行数为 2 行”或者“平均值为 500”等)

2.HAVING特点

  • HAVING子句用于对分组进行过滤,可以使用数字、聚合函数和GROUP BY中指定的列名(聚合键)

  • 注意错误形式

七.对查询结果进行排序

1.ORDER BY

  • SQL中的执行结果是随机排列的,当需要按照特定顺序排序时,可已使用ORDER BY子句

  • 语法:

    SELECT <列名1>, <列名2>, <列名3>, ……
      FROM <表名>
     ORDER BY <排序基准列1>, <排序基准列2>, ……
    
  • 默认为升序排列,降序排列为DESC

  • 多个排序键

  • 当用于排序的列名中含有NULL时,NULL会在开头或末尾进行汇总

2. ORDER BY中列名可使用别名

3.ORDER BY 排序列中存在 NULL 时,指定其出现在首行或者末行的方式

八.练习题

1.第一部分

 SELECT product_name,regist_date
 FROM product
 WHERE regist_date >'2009-04-28';

  • 全都会无结果

    判断是否为空要写IS NULL或者IS NOT NULL

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jIkgBIbu-1631817803794)(https://cdn.jsdelivr.net/gh/xin007-kong/picture_new/img/20210917012450.png)]

  • SELECT product_name, sale_price, purchase_price
      FROM product
     WHERE sale_price-purchase_price >= 500;
    

    另一种就是取其反面再否定了

    SELECT product_name, sale_price, purchase_price
    FROM product
    WHERE NOT sale_price-purchase_price < 500;
    

2.第二部分

  • SUM只能针对数值型

  • WHERE 只能指定记录的条件,不能指定组的条件

  • 写一个能执行的:

    对着下面的product表全貌理解再理解一下

mysql> SELECT product_type,SUM(purchase_price) AS sum ,SUM(sale_price) AS sum
    -> FROM product
    -> GROUP BY product_type
    -> HAVING SUM(sale_price)>SUM(purchase_price)*1.5
    -> ;

mysql> SELECT product_id,product_name,product_type,sale_price,purchase_price,regist_date
    -> FROM product
    -> ORDER BY regist_date DESC,purchase_price;

九.总结

别忘了先打开MySQL服务

没打开MySQL服务之前,像datagrip这些可视化工具连不上的

执行脚本

暑假接触了.bat脚本

脚本可以把那些要实现的功能都写进去

直接跑shop.sql的时候感觉还蛮神奇的

以上是关于datawhale9月组队学习task02基础查询与排序的主要内容,如果未能解决你的问题,请参考以下文章

datawhale9月组队学习task01环境搭建,初始数据库

datawhale9月组队学习task04集合运算

datawhale9月组队学习task05SQL高级操作

datawhale9月组队学习task06 SQL秋招题

Datawhale7月组队学习task3数据重构

Datawhale7月组队学习task5模型建立和评估