《MySQL必知必会》读书笔记 —— 第4章 检索数据、第5章 排序检索数据、第6章 过滤数据、第7章 数据过滤、第8章 用通配符进行过滤

这几章都只讲了一个事情,就是如何进行有条件限制地查找数据。

文章目录

  • 第4章 检索数据
    • 语法
      • 通配符 *
      • 检索不同的行(DISTINCT)
      • 限制结果(LIMIT)
      • 使用完全限定的表名
  • 第5章 排序数据
    • ORDER BY子句
      • 指定排序方向(DESC)
      • ORDER BY和LIMIT的组合
      • 子句的位置顺序
  • 第6章 过滤数据
    • 使用WHERE子句
    • WHERE子句操作符
    • 空值检查(IS NULL)
  • 第7章 数据过滤
    • 7.1 组合WHERE子句
      • 7.1.1 AND操作符
      • 7.1.2 OR操作符
      • 7.1.3 计算次序
    • 7.2 IN操作符
    • 7.3 NOT操作符
  • 第8章 用通配符进行过滤
    • 8.1 LIKE操作符
    • 8.1.1 百分号(%)通配符
    • 8.1.2 下划线(_)通配符
    • 8.2 使用通配符的技巧

第4章 检索数据

第四章没太多好讲的,简单讲一个重点就好。

语法

SELECT field1,field2,[fieldn] FROM my_table;

SQL语句不区分大小写,因此
SELECT与select是相同的。同样,写成Select也没有关系。
许多SQL开发人员喜欢对所有SQL关键字使用大写,而对所有
列和表名使用小写,这样做使代码更易于阅读和调试。

分号不要忘记

通配符 *

SELECT* FROM my_table;

一般,除非你确实需要表中的每个列,否则最
好别使用*通配符。虽然使用通配符可能会使你自己省事,不
用明确列出所需列,但检索不需要的列通常会降低检索和应
用程序的性能。

检索不同的行(DISTINCT)

此关键字指示MySQL,只返回不同的值。

  • DISTINCT关键字应用于所有列的一个组合,而不仅是前置它的列。

限制结果(LIMIT)

SELECT语句返回所有匹配的行,它们可能是指定表中的每个行。为
了返回第一行或前几行,可使用LIMIT子句。

select语句的最后,加上

LIMIT start, cols

或者:

LIMIT cols OFFSET start

几个注意点:

  1. 行索引从0开始
  2. start表示开始查的行索引,cols 是查询允许的最多函数。
  3. 在行数不够的时候,能返回多少就返回多少。

比如 LIMIT 1,2 表明最多查第2行和第三行

使用完全限定的表名

使用完全限定的名字来引用列(同时使用表名和列字)。在后面的多表联查会用到。

第5章 排序数据

这一章内容也比较简单,主要就讲了排序。

子句(clause) SQL语句由子句构成,有些子句是必需的,而
有的是可选的。一个子句通常由一个关键字和所提供的数据组
成。子句的例子有SELECT语句的FROM子句,我们在前一章看到过这个子
句。

ORDER BY子句

  • ORDER BY子句取一个或多个列的名字,据此对输出进行排序。
  • 按多个列排序时,排序完全按所规定的顺序进行。
  • 通过非检索列进行排序,也是可行的。

如:
意思就是将学生的分数按从低到高排列,分数相同的学生按名字排序。

SELECT id,score 
FROM  student_score
ORDER BY score,name;

指定排序方向(DESC)

为了进行降序排序,
必须指定DESC关键字。

下面的SQL的功能就是让学生的分数从高到低排序了。

SELECT id,score 
FROM  student_score
ORDER BY score DESC,name;
  • 在多个列上降序排序 如果想在多个列上进行降序排序,必须对每个列都指定DESC关键字

ORDER BY和LIMIT的组合

下面的SQL就是只找出分数最高的学生的信息。

SELECT id,name
FROM  student_score
ORDER BY score DESC;
LIMIT 1;

子句的位置顺序

  • 在给出ORDER BY子句时,应该保证它
    位于FROM子句之后。
  • 如果使用LIMIT,它必须位于ORDER BY
    之后。使用子句的次序不对将产生错误消息。

后面讲到其他子句的时候,还会在讲到子句的顺序。

第6章 过滤数据

使用WHERE子句

FROM子句后面,加上WHERE子句来过滤数据。

WHERE子句的位置 在同时使用ORDER BY和WHERE子句时,应
该让ORDER BY位于WHERE之后,否则将会产生错误(关于ORDER
BY的使用,请参阅第5章)。

WHERE子句操作符

  1. 等于 =
  2. 不等于 != (<>)
  3. 小于 <
  4. 小于等于 <=
  5. 大于 >
  6. 大于等于 >=
  7. 介于两者之间 BETWEE

如:

SELECT num FROM test WHERE num BETWEEN 1 AND 3;

几个注意点:

  • =匹配字符串的时候,字符串用单引号’'包裹,此匹配不区分大小写。(可以根据MySQL的配置去改)。
  • 范围匹配的BETWEEN的包括左右端点 ;

空值检查(IS NULL)

  • NULL与不匹配的问题。
    注意值为NULL和字段不匹配不是一回事,MYSQL为null有特殊的含义。
    比如where name != 'tiger'想过滤出那些名字不是tiger的记录,但是那么name字段为null的记录没有筛选出来!

第7章 数据过滤

本章讲授如何组合WHERE子句以建立功能更强的更高级的搜索条件。 我们还将学习如何使用NOT和IN操作符。

7.1 组合WHERE子句

操作符(operator) 用来联结或改变WHERE子句中的子句的关键
字。也称为逻辑操作符(logical operator)。

7.1.1 AND操作符

为了通过不止一个列进行过滤,可使用AND操作符给WHERE子句附加
条件。

SELECT [filed] FROM tb WHERE [field1满足的条件] AND [...] AND [...] …… AND [...];

7.1.2 OR操作符

OR操作符与AND操作符不同,它指示MySQL检索匹配任一条件的行。

7.1.3 计算次序

WHERE可包含任意数目的AND和OR操作符。允许两者结合以进行复杂
和高级的过滤。
在综合使用 ANDOR的时候,一句话,多加括号使得计算顺序明确。

任何时候使用具有AND和OR操作
符的WHERE子句,都应该使用圆括号明确地分组操作符。不要
过分依赖默认计算次序。

7.2 IN操作符

IN操作符用来指定条件范围,范围中的每个条件都可以进行匹配。IN取合法值的由逗号分隔的清单,全都括在圆括号中。

SELECT idtest,num 
FROM test
WHERE num IN (1,2);

上面的功能完全可以使用OR代替。

  • IN 和 OR 的联系
    • 在使用长的合法选项清单时,IN操作符的语法更清楚且更直观。
    • 在使用IN时,计算的次序更容易管理(因为使用的操作符更少)。
    • IN操作符一般比OR操作符清单执行更快。
    • IN的最大优点是可以包含其他SELECT语句,使得能够更动态地建
      立WHERE子句。第14章(子查询)将对此进行详细介绍。

7.3 NOT操作符

WHERE子句中的NOT操作符有且只有一个功能,那就是否定它之后所
跟的任何条件,在WHERE子句中使用。

MySQL支持使用NOT对IN、BETWEEN和
EXISTS子句取反,这与多数其他DBMS允许使用NOT对各种条件
取反有很大的差别。

如:

SELECT idtest,num  FROM test WHERE num NOT IN (1,2);

第8章 用通配符进行过滤

通配符(wildcard) 用来匹配值的一部分的特殊字符。
搜索模式(search pattern)① 由字面值、通配符或两者组合构
成的搜索条件。

8.1 LIKE操作符

为在搜索子句中使用通配符,必须使用LIKE操作符。LIKE指示MySQL,
后跟的搜索模式利用通配符匹配而不是直接相等匹配进行比较。

8.1.1 百分号(%)通配符

%表示任何字符出现任意次数。
比如LIKE %ab%就是检索任何包含’ab‘的字符串。

尾空格可能会干扰通配符匹配。

  • 虽然似乎%通配符可以匹配任何东西,但有一个例
    外,即NULL,因为我们说过,NULL是什么也没有,具有特殊的含义,不能被%匹配。

8.1.2 下划线(_)通配符

下划线只匹配单个字符而不是多个字符,不能多也不能少。

8.2 使用通配符的技巧

  1. 不要过度使用通配符。如果其他操作符能达到相同的目的,应该
    使用其他操作符。
  2. 在确实需要使用通配符时,除非绝对有必要,否则不要把它们用
    在搜索模式的开始处
    。把通配符置于搜索模式的开始处,搜索起
    来是最慢的。

你可能感兴趣的:(数据库,#,MySQL)