第四章 检索数据
这两章主要讲得是查询相关的。
查询时默认的数据顺序:
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.仔细检查通配符的位置。如果放错地方,可能不会返回想要的数据。