目录

2.1 SELECT语句基础

2.1.1 从表中选取数据

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

2.1.3 相关法则

2.2 算术运算符和比较运算符2.2.1 算术运算符

2.2.2 比较运算符

2.2.3 常用法则

2.3 逻辑运算符

2.3.1 NOT运算符

2.3.2AND运算符和OR运算符

2.3.3真值表:梳理复杂语句逻辑关系

2.3.3.1真值表:

2.3.3.2含有NULL的真值-显示不确定(UNKNOWN)

【练习1】

2.1

2.2

2.3

2.4

2.4 对表进行聚合查询

2.4.1 聚合函数

2.4.2 聚合函数常用法则

2.5 对表进行分组

2.5.1 GROUP BY语句

2.6 为聚合结果指定条件

2.6.1 用HAVING得到特定分组

2.6.2  HAVING特点

2.7 对查询结果进行排序

2.7.1 ORDER BY

2.7.2 ORDER BY中列名可使用别名

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

【练习2】

2.5

2.6

2.7


2.1 SELECT语句基础

2.1.1 从表中选取数据

SELECT语句
通过SELECT语句查询并选取出必要数据的过程称为匹配查询或查询(query)。
基本SELECT语句包含了SELECT和FROM两个子句(clause)。示例如下:
SELECT <列名>,  -- 列举了希望从表中查询出的列的名称FROM <表名>;  -- 指定了选取出数据的表的名称

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

WHERE 语句
当不需要取出全部数据,而是选取出满足“商品种类为衣服”“销售单价在1000日元以上”等某些条件的数据时,使用WHERE语句。
SELECT 语句通过WHERE子句来指定查询数据的条件。在WHERE 子句中可以指定“某一列的值和这个字符串相等”或者“某一列的值大于这个数字”等条件。
示例:
SELECT <列名>, ……FROM <表名>WHERE <条件表达式>;
 -- 用来选取 product type 列为衣服的记录的 SELECT 语句SELECT product_name, product_typeFROM productWHERE product_type = '衣服';
-- 选取出不是查询条件的列
SELECT product_nameFROM productWHERE product_type = '衣服';

2.1.3 相关法则

1、星号(*)代表全部列的意思。
2、SQL中可以随意使用换行符,不影响语句执行(但不可插入空行)。
3、设定汉语别名时需要使用双引号(")括起来。
4、在SELECT语句中使用DISTINCT可以删除重复行。
5、注释是SQL语句中用来标识说明或者注意事项的部分。分为1行注释"-- "和多行注释两种/* */
-- 查询全部列,可使用代表所有列的星号(*)
SELECT *FROM product;-- SQL语句可以使用AS关键字为列设定别名,中文需双引号
SELECT product_id      AS  id,product_name    AS  name,purchase_price  AS  '进货单价'FROM product;-- 使用DISTINCT删除product_type列中重复的数据
SELECT DISTINCT product_typeFROM product;
-- 选取出sale_price列为500的记录
SELECT product_name, product_typeFROM productWHERE sale_price = 500;

2.2 算术运算符和比较运算符

2.2.1 算术运算符

+ - * /  加 减 乘 除

2.2.2 比较运算符

常见比较运算符:

=            和。。相等

<>         和。。不相等

>=         大于等于。。

>           大于

<           小于

<=         小于等于

2.2.3 常用法则

1、SELECT子句中可以使用常数或者表达式。
2、使用比较运算符时一定要注意不等号和等号的位置。
3、字符串类型的数据原则上按照字典顺序进行排序,不能与数字的大小顺序混淆。
4、希望选取NULL记录时,需要在条件表达式中使用IS NULL运算符。希望选取不是NULL的记录时,需要在条件表达式中使用IS NOT NULL运算符。

-- SELECT运算表达式示例:
SELECT product_name,sale_price,sale_price*2 AS 'sala_price ×2'FROM product;
-- WHERE子句的条件表达式中也可以使用计算表达式
SELECT product_name,sale_price,purchase_priceFROM productWHERE sale_price - purchase_price >= 500;
5、对字符串使用不等号 首先创建chars并插入数据 选取出大于’2‘的SELECT语句
-- DDL:创建表
CREATE TABLE IF NOT EXISTS 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 product
WHERE purchase_price IS NOT NULL;

2.3 逻辑运算符

2.3.1 NOT运算符

想要表示 不是…… 时,除了前文的<>运算符外,还存在另外一个表示否定、使用范围更广的运算符:NOT。
NOT不能单独使用,必须和其他查询条件组合起来使用。

-- 示例:选取出销售单价大于等于1000日元的记录
SELECT product_name,product_type,sale_priceFROM productWHERE sale_price >= 1000;
-- 添加 NOT运算符
SELECT product_name,product_type,sale_priceFROM productWHERE NOT sale_price >= 1000;
通过 NOT 运算符否定一个条件可以得到相反查询条件的结果,但是其可读性明显不如显式指定查询条件,因此,不可滥用该运算符。

2.3.2AND运算符和OR运算符

AND 交集   OR并集,注意, AND 运算符优先于 OR 运算符

-- 将查询条件原封不动地写入条件表达式,会得到错误结果
SELECT product_name, product_type, regist_dateFROM productWHERE product_type = '办公用品'AND regist_date = '2009-09-11'OR regist_date = '2009-09-20';
-- 想要优先执行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');

2.3.3真值表:梳理复杂语句逻辑关系

逻辑运算符:NOT  AND  OR
   真值就是值为真(TRUE)或假 (FALSE)其中之一的值。

2.3.3.1真值表:

AND
P    Q   P AND Q
真   真     真
真   假     假
假   真     假
假   假     假

OR
P    Q   P AND Q
真   真     真
真   假     真
假   真     真
假   假     假

NOT
P    NOT P
真    假
假    真

P AND (Q OR R)
P   Q   R   Q OR R   P AND (Q OR R)
真  真  真     真           真
真  真  假     真           真
真  假  真     真           真
真  假  假     假           假
假  真  真     真           假
假  真  假     真           假
假  假  真     真           假
假  假  假     假           假

2.3.3.2含有NULL的真值-显示不确定(UNKNOWN)

三值逻辑OR真值表
  P         Q      P OR Q
真         真       真
真         假       真
真       不确定      真
假         真       真
假         假       假
假       不确定    不确定
不确定     真        真
不确定     假      不确定
不确定   不确定    不确定

【练习1】

2.1

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

SELECT product_name,regist_dateFROM productWHERE regist_date > '2009-04-28';

2.2

请说出对product 表执行如下3条SELECT语句时的返回结果。

SELECT *FROM productWHERE purchase_price = NULL;

返回结果:选取表中所有purchase_price为空值的行列

SELECT *FROM productWHERE purchase_price <> NULL;
返回结果: 选取表中所有purchase_price不为空值的行列
SELECT *FROM productWHERE product_name > NULL;
返回结果: 选取表中所有product_name大于空值的行列,但是不能这么写,不会出现想要的结果,要把 '> NULL' 换成 ’IS NUT NULL'。

2.3

2.2.3 章节中的SELECT语句能够从 product 表中取出“销售单价(sale_price)比进货单价(purchase_price)高出500日元以上”的商品。请写出两条可以得到相同结果的SELECT语句。执行结果如下所示:

-- 教程代码
SELECT product_name,sale_price,purchase_priceFROM productWHERE sale_price - purchase_price >= 500;
-- 方式一 ,存在错误
SELECT product_name,sale_price,purchase_priceFROM productWHERE sale_price >=1000AND purchase_price >= 500;
-- 方式二,添加利润列
ALTER TABLE product ADD COLUMN product_profit FLOAT;
-- 更新 product_profit 列数据
UPDATE productSET product_profit = sale_price -purchase_priceWHERE product_name IS NOT NULL;
-- 返回利润大于500的商品表
SELECT product_name,sale_price,purchase_priceFROM productWHERE product_profit >= 500;

2.4

请写出一条SELECT语句,从 product 表中选取出满足“销售单价打九折之后利润高于 100 日元的办公用品和厨房用具”条件的记录。查询结果要包括 product_name列、product_type 列以及销售单价打九折之后的利润(别名设定为 profit)。 提示:销售单价打九折,可以通过 sale_price 列的值乘以0.9获得,利润可以通过该值减去 purchase_price 列的值获得。

-- 添加 product_profit 列
ALTER TABLE product ADD COLUMN product_profit FLOAT;
-- 更新 product_profit 列数据
UPDATE productSET product_profit = sale_price * 0.9 -purchase_priceWHERE product_name IS NOT NULL;
-- 返回利润大于100的商品表
SELECT product_name,product_type,product_profit AS "利润"FROM productWHERE product_profit >= 100;
输出结果:T恤,衣服,400
打孔器,办公用品,130
运动T恤,衣服,800
高压锅,厨房用具,1120

2.4 对表进行聚合查询

2.4.1 聚合函数

定义:SQL中用于汇总的函数叫做聚合函数
   常用5个聚合函数:
   1、COUNT:计算表中的记录数(行数)
   2、SUM:计算表中数值列中数据的合计值
   3、AVG:计算表中数值列中数据的平均值
   4、MAX:求出表中任意列中数据的最大值
   5、MIN:求出表中任意列中数据的最小值

-- 计算全部数据的行数(包含NULL)
SELECT COUNT(*)FROM product;
-- 计算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;
-- MAX和MIN也可用于非数值型数据
SELECT MAX(regist_date), MIN(regist_date)FROM product;

使用聚合函数删除重复值

-- 计算去除重复数据后的数据行数
SELECT COUNT(DISTINCT product_type)FROM product;
-- 是否使用DISTINCT时的动作差异(SUM函数)
SELECT SUM(sale_price), SUM(DISTINCT sale_price)FROM product;

2.4.2 聚合函数常用法则

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

2.5 对表进行分组

2.5.1 GROUP BY语句

GROUP BY : 分组汇总函数
GROUP BY 子句中指定的列称为聚合键或者分组列。

语法示例:
SELECT <列名1>,<列名2>, <列名3>, ……
  FROM <表名>
GROUP BY <列名1>, <列名2>, <列名3>, ……;

-- 按照商品种类统计数据行数
SELECT product_type, COUNT(*)FROM productGROUP BY product_type;-- 不含GROUP BY
SELECT product_type, COUNT(*)FROM product;
聚合键中包含NULL时,此时会将NULL作为一组特殊数据进行处理
SELECT purchase_price, COUNT(*)FROM productGROUP BY purchase_price;
注意:GROUP BY的子句书写顺序有严格要求,不按要求会导致SQL无法正常执行目前出现过的子句顺序为:1 SELECT → 2. FROM → 3. WHERE → 4. GROUP BY 
-- 在WHERE子句中使用GROUP BY:
SELECT purchase_price, COUNT(*)FROM productWHERE product_type = '衣服'GROUP BY purchase_price;

常见错误:
1、在聚合函数的SELECT子句中写了聚合健以外的列使用COUNT等聚合函数时,SELECT子句中如果出现列名,只能是GROUP BY子句中指定的列名(也就是聚合键)。
2、在GROUP BY子句中使用列的别名SELECT子句中可以通过AS来指定别名,但在GROUP BY中不能使用别名。因为在DBMS中 ,SELECT子句在GROUP BY子句后执行。
3、在WHERE中使用聚合函数原因是聚合函数的使用前提是结果集已经确定,而WHERE还处于确定结果集的过程中,所以相互矛盾会引发错误。 如果想指定条件,可以在SELECT,HAVING(下面马上会讲)以及ORDER BY子句中使用聚合函数。

2.6 为聚合结果指定条件

2.6.1 用HAVING得到特定分组

HAVING函数:将表使用GROUP BY分组后,只取出其中需要的特定分组

2.6.2  HAVING特点

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

-- 数字
SELECT product_type, COUNT(*)FROM productGROUP BY product_type
HAVING COUNT(*) = 2;
-- 错误形式(因为product_name不包含在GROUP BY聚合键中)
/*
SELECT product_type, COUNT(*)FROM productGROUP BY product_type
HAVING product_name = '圆珠笔';
*/

2.7 对查询结果进行排序

2.7.1 ORDER BY

SQL中的执行结果是随机排列的,当需要按照特定顺序排序时,可以使用 ORDER BY 子句。
语法:
SELECT <列名1>, <列名2>, <列名3>, ……
  FROM <表名>
ORDER BY <排序基准列1>, <排序基准列2>, ……
默认升序,降序为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会在开头或末尾进行汇总。
SELECT product_id, product_name, sale_price, purchase_priceFROM productORDER BY purchase_price;

2.7.2 ORDER BY中列名可使用别名

GROUP BY 子句中不能使用SELECT 子句中定义的别名,但是在 ORDER BY 子句中却可以使用别名。为什么在GROUP BY中不可以而在ORDER BY中可以呢?

这是因为SQL在使用 HAVING 子句时 SELECT 语句的顺序为:

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

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

NULL值在ORDER BY 排序后默认ASC升序在第一位,DESC降序在末尾

指定NULL出现在首行或末行分析:

默认NULL 的值比 非NULL 值低(可以理解为 0 或者 -∞)
需求:
【A】将 NULL 值排在末行,同时将所有 非NULL 值按升序排列
[解决方案]:
1)对于数字或者日期类型,可以在排序字段前添加一个负号(minus)来得到反向排序。(-1、-2、-3....-∞);
2)字符型或者字符型数字使用 IS NULL 比较运算符。另外 ISNULL( ) 函数等同于使用 IS NULL 比较运算符;
3)COALESCE 函数实现需求
【B】将 NULL 值排在首行,同时将所有 非NULL 值按倒序排列。
[解决方案]:
1)对于数字或者日期类型,可以在排序字段前添加一个负号(minus)来得到反向排序。(-1、-2、-3....-∞);
2).字符型或者字符型数字,此方法不一定能得到期望的排序结果,可以使用 IS NOT NULL 比较运算符。另外 !ISNULL( ) 函数等同于使用 IS NOT NULL 比较运算符。
3)COALESCE 函数实现需求

CREATE TABLE user(id INT NOT NULL AUTO_INCREMENT,name VARCHAR(5),date_login DATE,PRIMARY KEY (id)
);INSERT INTO user(name,date_login)VALUES
(NULL, '2017-03-12'),
('join', NULL),
('david','2016-12-24'),
('zayne','2017-03-02');-- 数字或者日期类型  NULL 值排在末行,同时将所有 非NULL 值按升序排列。
SELECT *FROM user
ORDER BY -date_login DESC ;
-- 字符型或者字符型数字使用 IS NULL 比较运算符。另外 ISNULL( ) 函数等同于使用 IS NULL 比较运算符
SELECT *FROM user
ORDER BY name IS NULL ,name ASC;
-- 使用 COALESCE 函数实现需求
SELECT *FROM user
ORDER BY COALESCE(name, 'zzzzzz') ASC;-- 数字或者日期类型  NULL 值排在首行,同时将所有 非NULL 值按降序排列。
SELECT *FROM user
ORDER BY -date_login;
-- 字符型或者字符型数字使用 IS NOT NULL 比较运算符。另外 !ISNULL( ) 函数等同于使用 IS NOT NULL 比较运算符
SELECT *FROM user
ORDER BY name IS NOT NULL ,name DESC ;
-- 使用 COALESCE 函数实现需求
SELECT *FROM user
ORDER BY COALESCE(name, 'zzzzzz') DESC ;

【练习2】

2.5

请指出下述SELECT语句中所有的语法错误。
SELECT product_id, SUM(product_name)
--本SELECT语句中存在错误。
  FROM product
GROUP BY product_type
WHERE regist_date > '2009-09-01';
[解答]:
错误部分:
1、priduct_name列填充值为字符串类型,不能使用求和函数SUM
2、括号不能为中文括号
3、SELECT子句中如果出现列名,只能是GROUP BY子句中指定的列名(也就是聚合键)。
4、WHERE函数必须在GROUP BY 前面

2.6

请编写一条SELECT语句,求出销售单价( sale_price 列)合计值大于进货单价( purchase_price 列)合计值1.5倍的商品种类。执行结果如下所示。
product_type | sum  | sum
-------------+------+------
衣服         | 5000 | 3300
办公用品      |  600 | 320

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语句选取出了product(商品)表中的全部记录。当时我们使用了 ORDER BY 子句来指定排列顺序,但现在已经无法记起当时如何指定的了。请根据下列执行结果,思考 ORDER BY 子句的内容。

【分析】:图中6列仅 regist_date 列为有序状态,NULL在首行,但是日期为降序,因此推测代码如下:

SELECT *FROM product
ORDER BY -regist_date;

DAY 2 基础查询与排序相关推荐

  1. Task02:SQL基础查询与排序-天池龙珠计划SQL训练营

    Task02:SQL基础查询与排序 一.SELECT语句基础 1.1 从表中选取数据 SELECT语句 1.2从表中选取符合条件的数据 WHERE语句 1.3 相关法则 星号(*)代表全部列的意思. ...

  2. Tas02 基础查询与排序

    二.基础查询与排序 2.1语句基础 SELECT语句: SELECT <列名>, ... FROM <表名>: WHERE语句: SELECT通过WHERE来指定查询条件 SE ...

  3. 窥探SQL: 2.基础查询与排序

    窥探SQL: 2.基础查询与排序 基础查询 语句 关键词 SELECT WHERE FROM, As, DISTINCT 基本法则 运算符 算术运算符 比较运算符 逻辑运算符 NOT AND 和 OR ...

  4. 阿里云天池龙珠计划SQL入门与实践 | Task02 SQL基础查询与排序

    本文为阿里云天池学习<SQL入门与实践>第二讲学习笔记,同时该讲内容基于<SQL基础教程>第二章(查询基础)及第三章(聚合与排序). SQL基础查询与排序 一.SELECT语句 ...

  5. SQL 02 基础查询与排序

    2.1 SELECT语句基础 2.1.1 从表中选取数据 SELECT语句:基本SELECT语句包含了SELECT和FROM两个子句(clause) SELECT <列名>,    FRO ...

  6. MySQL教程二 基础查询与排序

    文章目录 1. SELECT语句基础 1.1 从表中选取数据 1.2 从表中选取符合条件的数据 1.3 相关法则 2. 算术运算符和比较运算符 2.1 算术运算符 2.2 比较运算符 2.3 常用法则 ...

  7. 阿里云天池龙珠计划SQL训练营Task 2:SQL基础查询与排序

    一.SELECT语句基础 1.1 从表中选取数据 SELECT语句 从表中选取数据时需要使用SELECT语句,也就是只从表中选出(SELECT)必要数据的意思.通过SELECT语句查询并选取出必要数据 ...

  8. MySql-基础查询与排序

    基础查询与排序 2.1 SELECT语句基础 从表中选取数据 SELECT语句 从表中选取数据时需要使用SELECT语句,也就是只从表中选出(SELECT)必要数据的意思.通过SELECT语句查询并选 ...

  9. 07--MySQL自学教程:DQL(Data Query Language:数据库查询语言)简介、基础查询、条件查询、模糊查询以及排序(一)

    1. DQL(Data Query Language:数据库查询语言)知识点概览 DQL(Data Query Language:数据库查询语言): 用来查询数据(记录),不会对数据进行改变,而是让数 ...

最新文章

  1. 初学者SQL语句介绍
  2. Android--用手指移动画面里的照片/onTouchEvent事件判断
  3. 实验十——一维数组的定义及引用
  4. python 多线程 模块_Python多线程threading和multiprocessing模块实例解析
  5. Ajax解析JSON文件
  6. 深度 | 面向云原生数据湖的元数据管理技术解析
  7. 拜托!不要用“ ! = null “ 做判空了
  8. Win10常用快捷键
  9. 统考计算机应用基础ex,EXCEL操作题
  10. 华为智慧屏V55升级鸿蒙2,华为智慧屏将作为第一批升级鸿蒙 OS 2.0 系统的终端产品...
  11. 消息中间件之rabbitMQ实战-死信队列
  12. Yolov5(6.1)学习历险记
  13. day 09文件处理
  14. 【matlab报错问题个人总结】数组超出索引维度
  15. 酷炫命令行背景图操作步骤
  16. PAT 乙级真题 1032 挖掘机技术哪家强 (附测试点2)
  17. Windows Vista Business系统中成功安装的常用软件
  18. oracle 定义atp规则,ATP新积分规则详解
  19. 《从青铜学到王者》Python数据分析工程师之Numpy计算与文件加载 04
  20. 培训心得--做人做事方式

热门文章

  1. 同时遍历两个list
  2. C语言中void*详解及应用
  3. 计算机辅助骨科手术的常用简称,大连理工大学创客:计算机辅助骨科手术提高接骨精准度...
  4. 审计溯源 | IP-guard终端操作审计,助力高效防控泄密风险
  5. ASP.NET:母版页与内容页
  6. 2020考研计算机(408)考试大纲原文以及分析
  7. 分子对接结果分析和作图
  8. 【个人喜好诗词之一】雨巷
  9. 网易云音乐测试“云随机”播放功能 已注册产品功能相关专利
  10. vs code 不能正确补全结构体成员变量的解决方法