当前位置: 代码迷 >> 综合 >> datawhale-sql打卡之Task 2:基础查询与排序
  详细解决方案

datawhale-sql打卡之Task 2:基础查询与排序

热度:71   发布时间:2023-12-18 04:48:27.0

基本查询

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

SELECT <列名>,……FROM <表名>WHERE <条件表达式>;

SELECT * 代表查询全部列
SQL中可以随意使用换行符,不影响语句执行(但不可插入空行),以分号;结尾
设定汉语别名时需要使用双引号(")括起来。
在SELECT语句中使用DISTINCT可以删除重复行。

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

-- 想要查询出全部列时,可以使用代表所有列的星号(*)。
SELECT *FROM <表名>;
-- SQL语句可以使用AS关键字为列设定别名(用中文时需要双引号(“”))。
SELECT product_id     As id,product_name   As name,purchase_price AS "进货单价"FROM product;
-- 使用DISTINCT删除product_type列中重复的数据
SELECT DISTINCT product_typeFROM product;

算术运算符

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

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

在这里插入图片描述
希望选取NULL记录时,需要在条件表达式中使用IS NULL运算符。
希望选取不是NULL的记录时,需要在条件表达式中使用IS NOT NULL运算符。

(用=或者=!NULL并不靠谱)

逻辑运算符

1.NOT运算符

-- 选取出销售单价大于等于1200日元的记录
SELECT product_name,product_type,sale_priceFROM productWHERE sale_price >= 1200;
-- 选取出销售单价小于1200日元的记录
SELECT product_name,product_type,sale_priceFROM productWHERE sale_price <1200;-- 还可以利用not运算符
SELECT product_name,product_type,sale_priceFROM productWHERE NOT sale_price>= 1200;

2.AND运算符和OR运算符

当希望同时使用多个查询条件时,可以使用AND或者OR运算符
AND 相当于“并且”,类似数学中的取交集
OR 相当于“或者”,类似数学中的取并集

AND 运算符优先于 OR 运算符

-- 但可通过括号让OR运算符先于AND运算符执行
SELECT product_name, product_type, regist_dateFROM productWHERE product_type = '办公用品'AND ( regist_date = '2009-09-11'OR regist_date = '2009-09-20');

AND 和OR通过判断条件是否为真判断结果的True或者False
那么NULL的判断结果是什么呢?
既不为真,也不为假,因为并不知道这样一个值。
这时判断值是除真假之外的第三种值——不确定(UNKNOWN)。一般的逻辑运算并不存在这第三种值。SQL 之外的语言也基本上只使用真和假这两种真值。与通常的逻辑运算被称为二值逻辑相对,只有 SQL 中的逻辑运算被称为三值逻辑。
在这里插入图片描述

三值逻辑下的AND和OR真值表

聚合查询

1. 利用函数聚合

在这里插入图片描述

COUNT()会得到包含NULL的数据行数,而COUNT(<列名>)会得到NULL之外的数据行数。
聚合函数会将NULL排除在外。但COUNT(
)例外,并不会排除NULL。
MAX/MIN函数几乎适用于所有数据类型的列。
SUM/AVG函数只适用于数值类型的列。
想要计算值的种类时,可以在COUNT函数的参数中使用DISTINCT。
在聚合函数的参数中使用DISTINCT,可以删除重复数据。

2.分组聚合

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

GROUP BY的子句书写顺序有严格要求,不按要求会导致SQL无法正常执行,目前出现过的子句顺序为:

1 SELECT → 2. FROM → 3. WHERE → 4. GROUP BY

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

在使用COUNT等聚合函数时,SELECT子句中如果出现列名,只能是用于聚合字段,即使加了其他字段,也极有可能是所在行不对应的

3.为聚合结果指定条件

HAVING子句用于对分组进行过滤, 这里WHERE不可行,因为,WHERE子句只能指定记录(行)的条件,而不能用来指定组的条件(例如,“数据行数为 2 行”或者“平均值为 500”等)。
在这里插入图片描述
having中条件可以使用聚合函数和GROUP BY中指定的列名(聚合键)

SELECT product_type, COUNT(*)FROM productGROUP BY product_type
HAVING COUNT(*) = 2;

对查询排序

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

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

-- 降序排列
SELECT product_id, product_name, sale_price, purchase_priceFROM productORDER BY sale_price DESC;
-- 多个排序键
SELECT product_id, product_name, sale_price, purchase_priceFROM productORDER BY sale_price, product_id;

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

-- 当用于排序的列名中含有NULL时,NULL会在开头或末尾进行汇总。
SELECT product_id, product_name, sale_price, purchase_priceFROM productORDER BY purchase_price;

SQL中执行顺序一般如下:
FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY
所以在ORDER BY中可以使用select中字段的别名

练习题

  • 2.1

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

SELECT product_name,regist_date
FROM product
WHERE  regist_date > "2009-04-28";
  • 2.2

对NULL操作,需要用is null 或者is not null,三个语句写法都不对,结果并不靠谱

  • 2.3
SELECT product_name,sale_price,purchase_price
FROM product
WHERE sale_price-purchase_price >500;--利用not运算符
SELECT product_name,sale_price,purchase_price
FROM product
WHERE NOT  sale_price-purchase_price <=500;
  • 2.4
SELECT product_name,product_type, (sale_price*0.9-purchase_price ) as profit
FROM product
WHERE (sale_price*0.9-purchase_price )>100 AND product_type IN("办公用品","厨房用具“);
  • 2.5

1.where语句需要再group by 之前
2.select中包含非聚合列的字段

  • 2.6
SELECT  product_type,sum(sale_price),sum(purchase_price)
FROM product
GROUP BY product_type
HAVING sum(sale_price)/sum(purchase_price)>1.5;
  • 2.7
SELECT *
FROM product
ORDER BY regist_date DESC,sale_price ASC;

Task 02 基础查询与排序

  相关解决方案