《MYSQL必知必会》读书笔记(中)

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 《基础》

第四章 检索数据

这两章主要讲得是查询相关的。

查询时默认的数据顺序:

SELECT prod_name FROM products;点击复制代码复制出错复制成功

如果是不设置任何排序条件,以这种方式来进行查询,返回的数据的顺序是根据它们在底层表中出现的顺序(可以是数据最初添加到表中的顺序,但是如果数据进行过更新或删除,顺序会受到MySQL重用回收存储空间的影响)

使用DISTINCT去重:

SELECT DISTINCT vend_id FROM products;点击复制代码复制出错复制成功

如果想要对让返回的数据不包含重复值,可以使用DISTINCT来对列进行修饰

SELECT DISTINCT vend_id,prod_price FROM products;点击复制代码复制出错复制成功

DISTINCT关键字是对所有字段进行修饰的,只有当所有列都相同时,才会进行排除,在上面这个例子中,只有vend_id和prod_price都相同的数据,才会进行排除,也就是可以允许一些vend_id相同,prod_price不同的数据出现。

使用LIMIT来限制结果

SELECT prod_name FROM products LIMIT 5;点击复制代码复制出错复制成功

可以限制返回的数据为5条

SELECT prod_name FROM products LIMIT 4,5;点击复制代码复制出错复制成功

可以限制返回的数据是从第4行开始后面的5条

上面这条查询语句,MySQL 5以后还支持另外一种更加容易理解的写法

SELECT prod_name FROM products LIMIT 4 offset 5;点击复制代码复制出错复制成功

使用完全限定的表名

SELECT products.prod_name FROM crash_course.products;点击复制代码复制出错复制成功

可以限制在某个数据库的某个表中进行查询,上面的例子是限制了,必须在crash_course数据库的products表取prod_name列的数据

第五章 排序检索数据

这一章主要讲的是ORDER BY对查询结果进行排序,以及使用ASC,DESC控制升序,降序。

使用ORDER BY进行排序

SELECT prod_name FROM products ORDER BY product_name;点击复制代码复制出错复制成功

按多个列进行排序

SELECT prod_id, prod_price, prod_name FROM products ORDER BY product_price, product_name;点击复制代码复制出错复制成功

在 ORDER BY 指定多个字段,可以按规定的顺序,按多个列排序,例子中的数据会先根据 product_price 从低到高进行排序,如果 product_price相同,再按 product_name ,就进行比较从A到Z进行排序,如下图所示

指定排序方向

默认的排序方向是升序,也就是ASC,有时候需要进行降序排序,例如价格从高到低进行排序,可以使用降序DESC

第六章 过滤数据

这一章其实主要讲得是WHERE语句对数据进行过滤。

条件判断符

一些常见的WHERE语句的条件判断符,大家已经知道了。 例如:

=  等于
!= 不等于
< 小于
> 大于
<= 小于等于
>= 大于等于 
BETWEEN 在指定两个值之间
除了上面这些,有一个不太常见的操作符号
<>,代表不等于,与!= 同义点击复制代码复制出错复制成功

!= 与 IS NULL

!= 是返回不具备特定值的行,NULL值代表未知,所以不会拿NULL值去跟特定值比较,所以不会具有NULL值的行。如果想要获取具有NULL值的行,必须使用IS NULL 例如:

对下面这个表执行 SELECT * FROM table WHERE value != 100;

id value
1 100
2 NULL
3 200

返回的结果:

只会返回value为200的这一行,不会返回值为NULL的行

id value
3 200

BETWEEN

使用BETWEEN操作符会匹配范围中所有的值,包括指定的开始值和结束值

例如:

第七章 数据过滤

这一章主要说的是AND,OR, IN,NOT这四个操作符,

计算次序

组合AND和OR使用时,因为AND优先级最高计算时会优先处理AND操作符,会将AND两边的条件进行提取,所以上面这个SQL语句其实会等价于

SELECT prod_name, prod_price FROM products WHERE vend_id = 1002 OR (vend_id = 1003 AND prod_price >= 10);点击复制代码复制出错复制成功

可能会与我们想要的结果会有一定差距,我们是想要

SELECT prod_name, prod_price FROM products WHERE vend_id = 1002 OR (vend_id = 1003 AND prod_price >= 10);点击复制代码复制出错复制成功

可能会与我们想要的结果会有一定差距,我们是想要vend_id为1002或1002,且prod_price大于10的数据,所以在日常使用中,最好使用()明确地分组相应的操作符,而不是依赖操作符的优先级,像下面这样:

SELECT prod_name, prod_price FROM products WHERE (vend_id = 1002 OR vend_id = 1003) AND prod_price >= 10;点击复制代码复制出错复制成功

IN操作符

OR操作符

在指定条件范围进行匹配时,IN和OR都能满足需求,但是IN有一些优点:

1.IN操作符语法更加简洁直观,容易管理

2.IN操作符执行更快。

3.IN的最大优点是可以包含其他SELECT语句,从而可以动态地简历WHERE语句,第14章会对此进行详细介绍。

NOT操作符

其他DBMS允许使用NOT对各种条件取反,但在MySQL中,只支持使用NOT对IN、BETWEEN和EXISTS子句取反。

第八章 用通配符进行过滤

这一章主要是介绍了LIKE操作符,以及%,_ 这两个通配符。

LIKE操作符

LIKE主要是配合通配符一起使用的,LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。

%通配符

%代表搜索模式中给定位置的0个、1个或多个字符。 在一个查询语句中也可以使用多个%通配符

尾空格

可能会干扰通配符匹配。例如,在保存词 anvil时,如果它后面有一个或多个空格,则子句WHERE prod_name LIKE '%anvil'将不会匹配它们,因为在最后的l 后有多余的字符。解决这个问题的一个简单的办法是在搜索模式最后附加一个%。一个更好的办法是使用函数(第11章将会 介绍)去掉首尾空格。 注意NULL 虽然似乎%通配符可以匹配任何东西,但有一个例 外,即NULL。即使是WHERE prod_name LIKE '%'也不能匹配 用值NULL作为产品名的行。 下划线(_)通配符 _通配符与%通配符类似,只不过只能匹配单个字符,不能匹配0个字符,也不能匹配多个字符

使用通配符的技巧

1.在能使用其他操作符的请款下,尽量不要使用通配符,因为它的搜索事件要比其他操作符的长

2.尽量不要把通配符用在搜索模式的开始处。放在搜索模式的开始处,搜索起来是最慢的。

3.仔细检查通配符的位置。如果放错地方,可能不会返回想要的数据。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
SQL 关系型数据库 MySQL
MySQL必知必会—读书笔记
MySQL必知必会—读书笔记
|
7月前
|
存储 缓存 关系型数据库
《高性能Mysql》读书笔记之Schema与数据类型优化
《高性能Mysql》读书笔记之Schema与数据类型优化
|
11月前
|
SQL 关系型数据库 MySQL
|
存储 关系型数据库 MySQL
|
关系型数据库 MySQL 数据库
|
SQL 关系型数据库 MySQL
|
SQL Oracle 关系型数据库
|
SQL 存储 安全
mysql必知必会读书笔记
mysql必知必会读书笔记
mysql必知必会读书笔记