2.1 SELECT语句基础

2.1.1 从表中选取数据

SELECT语句:基本SELECT语句包含了SELECT和FROM两个子句(clause)

SELECT <列名>, 
  FROM <表名>;

其中,SELECT子句中列举了希望从表中查询出的列的名称,而FROM子句则指定了选取出数据的表的名称。

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

WHERE语句:不需要取出全部数据,而是选取出满足等某些条件的数据时,使              用 WHERE语句。SELECT 语句通过WHERE子句来指定查询数据的条件。

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

2.1.3 相关法则

  • 星号(*)代表全部列的意思。
  • SQL中可以随意使用换行符,不影响语句执行(但不可插入空行)。
  • 设定汉语别名时需要使用双引号(")括起来。
  • 在SELECT语句中使用DISTINCT可以删除重复行。
  • 注释是SQL语句中用来标识说明或者注意事项的部分。分为1行注释"-- "和多行注释两种"/* */"。

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

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

2.2.1 算术运算符

2.2.2 比较运算符

2.2.3 常用法则

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

2.3 逻辑运算符

2.3.1 NOT运算符

想要表示 不是…… 时,除了前文的<>运算符外,还存在另外一个表示否定、使用范围更广的运算符:NOT。

NOT不能单独使用,必须和其他查询条件组合起来使用。

例:SELECT product_name, product_type, sale_price
       FROM product
       WHERE NOT sale_price >= 1000;

2.3.2 AND运算符和OR运算符

AND 相当于“并且”,类似数学中的取交集;

OR 相当于“或者”,类似数学中的取并集。

2.3.3 真值表

当碰到条件较复杂的语句时,理解语句含义并不容易,这时可以采用真值表来梳理逻辑关系。

什么是真值?

本节介绍的三个运算符 NOT、AND 和 OR 称为逻辑运算符。这里所说的逻辑就是对真值进行操作的意思。真值就是值为真(TRUE)或假 (FALSE)其中之一的值。

AND 运算符两侧的真值都为真时返回真,除此之外都返回假。

OR 运算符两侧的真值只要有一个不为假就返回真,只有当其两侧的真值都为假时才返回假。

NOT运算符只是单纯的将真转换为假,将假转换为真。

含有NULL时的真值:

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

2.4 对表进行聚合查询

2.4.1 聚合函数

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

  • SUM:计算表中某数值列中的合计值

  • AVG:计算表中某数值列中的平均值

  • MAX:计算表中任意列中数据的最大值,包括文本类型和数字类型

  • MIN:计算表中任意列中数据的最小值,包括文本类型和数字类型

  • COUNT:计算表中的记录条数(行数)

使用 DISTINCT 进行删除重复值的聚合运算 :

当对整表进行聚合运算时,表中可能存在多行相同的数据,DISTINCT 函数用于删除重复数据。

例:SELECT COUNT(DISTINCT product_type)
           FROM product;

2.4.2 聚合函数应用法则

  • COUNT 聚合函数运算结果与参数有关,COUNT(*) / COUNT(1) 得到包含 NULL 值的所有行,COUNT(<列名>) 得到不包含 NULL 值的所有行。

  • 聚合函数不处理包含 NULL 值的行,但是 COUNT(*) 除外。

  • MAX / MIN 函数适用于文本类型和数字类型的列,而 SUM / AVG 函数仅适用于数字类型的列。

  • 在聚合函数的参数中使用 DISTINCT 关键字,可以得到删除重复值的聚合结果。

2.5 对表进行分组

2.5.1 GROUP BY语句

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

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

聚合键中包含NULL时 :

此时会将NULL作为一组特殊数据进行聚合运算。

GROUP BY书写位置

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

  1. SELECT ➡️ 2. FROM ➡️ 3. WHERE ➡️ 4. GROUP BY

其中前三项用于筛选数据,GROUP BY对筛选出的数据进行处理

2.5.2 常见错误

在使用聚合函数及GROUP BY子句时,经常出现的错误有:2.6 为聚合结果指定条件

  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 子句配合使用,且限定的是分组聚合结果,WHERE 子句是限定数据行(包括分组列),二者各司其职,不要混淆。

2.6.2 HAVING特点

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

例:    SELECT product_type, COUNT(*)
             FROM product
           GROUP BY product_type
           HAVING COUNT(*) = 2;          -- 常数

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

2.7 对查询结果进行排序

2.7.1 ORDER BY

SELECT <列名1>, <列名2>, <列名3>, ……
  FROM <表名>
 ORDER BY <排序基准列1> [ASC, DESC], <排序基准列2> [ASC, DESC], ……

其中,参数 ASC 表示升序排列,DESC 表示降序排列,默认为升序,此时,参数 ASC 可以缺省。

注:由于 NULL 无法使用比较运算符进行比较,也就是说,无法与文本类型,数字类型,日期类型等进行比较,当排序列存在 NULL 值时,NULL 结果会展示在查询结果的开头或者末尾。

2.7.2 ORDER BY 子句中使用别名

SQL 在使用 HAVING 子句时 SELECT 语句的执行顺序为:

FROM → WHERE → GROUP BY → SELECT → HAVING → ORDER BY

其中 SELECT 的执行顺序在 GROUP BY 子句之后,ORDER BY 子句之前。

当在 ORDER BY 子句中使用别名时,已经知道了 SELECT 子句设置的别名,但是在 GROUP BY 子句执行时还不知道别名的存在,所以在 ORDER BY 子句中可以使用别名,但是在GROUP BY中不能使用别名。(但是如果在select中有case语句的别名,好像可以在group by 中使用别名)如;

2.7.3 ORDER BY 遇上 NULL

在MySQL中,NULL 值被认为比任何 非NULL 值低,因此,当顺序为 ASC(升序)时,NULL 值出现在第一位,而当顺序为 DESC(降序)时,则排序在最后。

如果想指定存在 NULL 的行出现在首行或者末行,需要特殊处理。

一般有如下两种需求:

  • 将 NULL 值排在末行,同时将所有 非NULL 值按升序排列。

(1)对于数字或者日期类型,可以在排序字段前添加一个负号(minus)来得到反向排序。(-1、-2、-3....-∞

例:  SELECT * FROM user 
          ORDER BY -date_login DESC;

(2) 对于字符型或者字符型数字,此方法不一定能得到期望的排序结果,可以使用 IS NULL 比较运算符。另外 ISNULL( ) 函数等同于使用 IS NULL 比较运算符。

上述语句先使用 ISNULL(name) 字段进行升序排列,而只有当 name 列值为 NULL 时,ISNULL(name) 才为真,所以其排到末行,而 name ASC 则实现了 非NULL 值升序排列。

还可以使用 COALESCE 函数实现需求:

SELECT * FROM user 
 ORDER BY COALESCE(name, 'zzzzz') ASC;

注: COALESCE 函数:作用是将返回传入的参数中第一个非null的值。例如上面程序中,如果传入的name为非NULL则返回传入的name,否则返回后面设置的'zzzzz'。

--select coalesce(a,b,c);    参数说明:如果a==null,则选择b;如果b==null,则选择c;如果a!=null,则选择a;如果a b c 都为null ,则返回为null(没意义)。

  • 将 NULL 值排在首行,同时将所有 非NULL 值按倒序排列。

(1)对于数字或者日期类型,可以在排序字段前添加一个负号(minus)来实现。                    (-∞...-3、-2、-1

(2) 对于字符型或者字符型数字,此方法不一定能得到期望的排序结果,可以使用 IS NOT NULL 比较运算符。另外 !ISNULL( ) 函数等同于使用 IS NOT NULL 比较运算符。

上述语句先使用 !ISNULL(name) 字段进行升序排列,而只有当 name 列值不为 NULL 时,!ISNULL(name) 才为真,所以其排到说行,而 name DESC 则实现了 非NULL 值降序排列。

还可以使用 COALESCE 函数实现需求:

SQL 02 基础查询与排序相关推荐

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

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

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

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

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

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

  4. Tas02 基础查询与排序

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

  5. 【SQL】SQL(基础查询)、SQL(关联查询)

    原文链接:https://blog.csdn.net/kuangzhixuan/article/details/74299047?utm_source=blogxgwz2 SQL(基础查询) 1.1. ...

  6. SQL学习—基础查询

    目录 一.基础查询 1.基础查询 2.查询结果简单处理 Ⅰ 查询结果去重 Ⅱ.查询结果限制行数 Ⅲ.查询结果排序 Ⅳ.条件查询 二.高级查询 1.聚合函数 2.多表查询 三.常用函数 1.条件函数 2 ...

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

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

  8. DAY 2 基础查询与排序

    目录 2.1 SELECT语句基础 2.1.1 从表中选取数据 2.1.2 从表中选取符合条件的数据 2.1.3 相关法则 2.2 算术运算符和比较运算符2.2.1 算术运算符 2.2.2 比较运算符 ...

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

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

最新文章

  1. TensorFlow的基础概念03
  2. drf解决跨域问题 使用 django-corse-headers扩展
  3. TensorRT学习笔记1 - 环境配置
  4. OpenCV —数据持久化: FileStorage类的数据存取操作与示例
  5. 自己实现的atof()和atoi()代码 (转)
  6. dio拦截器 flutter_详解flutter之网络请求dio,请求,拦截器简单示例
  7. 谈谈我在敏捷开发中遇到的那些坑
  8. ubuntu服务器无法运行chromedriver解决方法(转)
  9. 输入一个整数(1~7),显示对应星期英文的缩写
  10. 【渝粤教育】广东开放大学 电算化会计 形成性考核 (44)
  11. 正则表达式常用的校验方法
  12. Leetcode 120. Triangle 三角形问题(动态规划经典) 解题报告
  13. 启动openoffice命令
  14. 移动安全规范 — 1 -WIFI连接安全规范
  15. 设计模式 访问者模式
  16. 冬天让手脚不再冰凉的秘方
  17. 选下拉框的的值对应上传相应的图片_如何在excel中实现,选择下拉菜单某一项,该表格中就出现选项对应的数据?(excel表格制作选择数据)...
  18. python筛选股票_GitHub - sundroid/stock_pick: 这时一个通过设定选股条件来帮我们筛选股票的python程序...
  19. 怎样制作微信小程序?
  20. python读取部分文件_Python------补充部分文件操作

热门文章

  1. 安装bcftools
  2. FDC2214电容检测芯片-液位检测(金属探针探测液面)方案分析
  3. 爆料:955不加班公司名单(2023最新版)
  4. 软件测试什么是产品质量,软件测试过程质量的度量是什么?
  5. Friedman 检验--Matlab
  6. Java 获取疫情数据
  7. Linux下使用github
  8. redis状态与性能监控
  9. 教师计算机培训考勤表,之江汇平台的使用-信息技术培训
  10. python基础-闰年判断