天池SQL训练营TASK2打卡
2021/9/20 19:27:13
本文主要是介绍天池SQL训练营TASK2打卡,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
-
SELECT语句查询
-
select语句
SELECT <列名>,FROM <表名>;
-
从表中选取符合条件的数据——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查询条件的列
-
-
相关
-
星号"*"代表全部列
-
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;
-
-
-
算术运算符和比较运算符
-
算术运算符:
+,-,*,/
-
比较运算符:
-- 选取sale_price列为500的记录 SELECT product——namep, roduct_type FROM product WHERE sale_price = 500;
常见比较运算符:=,<>(和~不相等),>=,>,<,<=;
-
常用法则
-
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
-
-
-
逻辑运算符
-
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;
-
AND运算符和OR运算符
当希望同时使用多个查询条件时,可以使用AND或者OR运算符.
AND相当于"并且",类似于数学中的取交集;
OR相当于"或者", 类似数学中的取并集。
-
通过括号优先处理
-- 通过使用括号让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运算括起来
-
含有NULL时的真值
NULL的真值结果既不为真,也不为假,因为并不知道这样一个值
这时真值是除真假之外的第三种值——不确定。一般的逻辑运算并不存在这第三种值。SQL之外的语言也基本上只使用真和假这两种真值。与通常的逻辑运算被称为二值逻辑相对,只有SQL中的逻辑运算被称为三值逻辑。
三值逻辑下的AND和OR真值表为(不确定指NULL):
-
-
聚合查询
-
聚合函数
SQL中用于 汇总的函数叫做 聚合函数,常用如下
- COUNT:计算表中的记录数(行数)
- SUM:计算表中数值列中数据的合计值
- AVG:计算表中数值列中数据的平均值
- MAX:求出表中任意列中数据的最大值
- MIN:求出表中任意列中数据的最小值
-
常用法则
- COUNT函数的结果根据参数的不同而不同。COUNT(*)会得到包含NULL的数据行数,而COUNT(COL NAME)会得到NULL之外的数据行数
- 聚合函数会将NULL排除在外,但COUNT(*)例外,并不会排除NULL
- MAX/MIN函数几乎适用于所有数据类型的列,SUM/AVG函数值适用于数值类型的列
- 计算值的种类时,可以在COUNT函数的参数中使用DISTINCT
- 在聚合函数的参数中使用DISTINCT,可以删除重复数据,如SUM(DISTINCT COLNAME)
-
-
对表进行分组
-
GROUP BY语句:
将现有数据按照某列来汇总统计,使用GROUP BY
SELECT <COL>,..., FROM <TABLE> GROUP BY<COL1>, <COL2>,...,;
-
使用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(*)故报错。
-
按商品种类对表进行切分
GROUP BY子句就像切蛋糕那样将表进行了分组,GROUP BY子句中指定的列称为聚合建或者分组列
-
聚合键中包含NULL时
将进货单价(purchas_price)作为聚合键举例:
SELECT purchase_price, COUNT(*) FROM product GROUP BY purchase_price;
COUNT(COL)具体到列名时筛选结果不包含NULL,COUNT(*)筛选时结果包含NULL,此时NULL作为一组特殊数据处理。
-
GROUP BY书写位置
GROUP BY的子句书写顺序有严格要求,不按照顺序SQL会报错。
**顺序:**SELECT --FROM–WHERE–GROUP BY
前三项用于筛选数据,GROUP BY对筛选出的数据进行处理
-
WHERE子句中使用GROUP BY
SELECT purchase_price, COUNT(*) FROM product WHERE product_type = '衣服' GROUP BY purchjase_pricel;
-
常见错误
在使用聚合函数及GROUP BY子句时,经常出现的错误:
- 聚合函数的SELECT子句中书写了聚合键以外的列:使用COUNT等聚合函数时,SELECT子句中如果出现列名,只能是GROUP BY子句中指定的列名,即聚合键
- **GROUP BY子句中使用列的别名:**SELECT子句中可以通过AS来指定别名,但在GROUP BY中不能使用别名,因为 在DBMS中,SELECT子句在GROUP BY子句后执行】
- 在WHERE中使用聚合函数:聚合函数的使用前提是结果集已经确定,而WHERE还处于确定结果集的过程中,所以相互矛盾会引发错误,如果想指定条件,可以在SELECT, HAVING以及ORDER BY子句中使用聚合函数。
-
-
为聚合结果指定条件
-
使用HAVING得到特定分组
将表使用GROUP BY分组后,如何取出其中两组?
此时WHERE不可行,因为WHERE子句中只能指定记录(行)的条件,而不能用来指定组的条件(eg.“数据行数为2行"或者"平均值为500”)。
可在GROUP BY后使用HAVING子句,HAVING的用法类似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 = '圆珠笔'
HAVING语句可以过滤出特定筛选的聚合对象,如有两行数据的COUNT(*)=2
-
-
对查询结果进行排序
-
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;
-
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中不能使用别名
-
SQL语句书写顺序: SELECT–FROM–WHERE–GROUP BY–HAVING–ORDER BY
-
这篇关于天池SQL训练营TASK2打卡的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南