史上最简单MySQL教程详解(基础篇)之SQL语句(二)
查询语句——SELECT
查询语句将是我们在使用数据库的时候使用得最多,最灵活,也是最能体现能力的语句。接下来,我们将介绍几种比较常用的【SELECT】语句的查询方式。其的基础语法为:
SELECT 列名1,列名2,列名3,...From 表名 WHERE 条件表达式
例如:我们想查出【user】表中名字为【张三】的人
mysql> SELECT * FROM user WHERE name =”张三” ;
+——–+——+——+
| userId | name | sex |
+——–+——+——+
| 1 | 张三 | 0 |
+——–+——+——+
1 row in set (0.00 sec)
注意事项:
- 推荐使用指定列名的查询方式:
因为我们测试表中只有三个字段,对于数据库的查询影响不是很大。但是在实际的生产开发环境中,使用【*】来获取所有列的数据的话,那些不需要使用的列将会造成很大的内存浪费,从而进一步的影响SQL语句的执行速度。除了想确认表中所有数据的场合,是不建议使用 【*】的。 - 对于【WHERE】后面的【=】的理解我在之前的文章中也已经进行了解释,这里再重申一遍,我们应将那个符号理解为【比较运算符】,而不是所谓的【赋值】符号,常用的【比较运算符】有很多,我们将在史上最简单MySQL教程详解(基础篇)之运算符和常用数据库函数(一)中列举出常用的运算符。
模糊查询(LIKE)
模糊查询就是以列中数据是否含有指定的字符串为条件的检索。
例如:我们查询表中【name】包含【张】字为例子
mysql> SELECT * FROM user WHERE name LIKE “%张%”;
+——–+——–+——+
| userId | name | sex |
+——–+——–+——+
| 1 | 张三 | 0 |
| 5 | 小张 | 1 |
| 6 | 张三丰 | 0 |
+——–+——–+——+
3 rows in set (0.00 sec)
注意事项:
- 其中【%】叫做通配符。如果是【张%】表示以【张】开头的所有数据,【%张】表示的是以张结尾的所有数据。【%张%】则表示数据中所有含有张字的数据。
常用的通配符:
通配符 | 说明 | 条件表达式举例 |
---|---|---|
% | 表示零个,一个或多个字符 | name LIKE “%a%” |
_ | 表示单个字符 | name LIKE “李_” (【李某】是符合条件的,但【李某某】就不符合了) |
[] | 定义要匹配的字符集和范围 | name LIKE ‘[bsp]%’ |
[^]或[!] | 定义不匹配字符的集合和范围 | name LIKE ‘[!bsp]%’ (不以“b”,“s”或“p”开头的所有数据) |
NULL条件
当我们想要检索某个为空的字段的时候,是不能使用【=】比较运算符的,而是使用【IS】
例如:我们想要查出【user】表中【name】为【NULL】的字段
mysql> SELECT * FROM user WHERE name Is null;
+——–+——+——+
| userId | name | sex |
+——–+——+——+
| 7 | NULL | 0 |
+——–+——+——+
1 row in set (0.00 sec)
mysql> SELECT * FROM user WHERE name = null;
Empty set (0.00 sec)
我们可以看出,当我们使用【IS】的时候成功查出数据,但是当我们使用【=】的时候并没与查出数据;
多个条件表达式的组合(NOT,AND,OR)
当我们想要符合多个条件的数据时,就需要使用【AND】,【OR】,【NOT】三个运算符号。当然,它们三者之间自然也存在优先级的关系。优先级为:NOT->AND->OR.
例如:
我们将查询【user】表中【name】为【李四】,【sex】为【1】的数据。
mysql> SELECT * FROM user WHERE name =”李四” and sex =1;
+——–+——+——+
| userId | name | sex |
+——–+——+——+
| 2 | 李四 | 1 |
+——–+——+——+
1 row in set (0.00 sec)
我们就查到了我们预想的数据。
查询结果排序(ORDER BY)
我们使用【ORDER BY】语句进行数据的排序。排序总共有【DESC】(降序)和【ASC】(升序)两种。语法如下:
ORDER BY 字段1,字段2...DESC/ASC
例如,我们将查询到的数据进行降序:
mysql> SELECT * FROM user ORDER BY userId DESC;
+——–+——–+——+
| userId | name | sex |
+——–+——–+——+
| 7 | NULL | 0 |
| 6 | 张三丰 | 1 |
| 5 | 小张 | 1 |
| 4 | 王五 | 0 |
| 3 | 李四 | 0 |
| 2 | 李四 | 1 |
| 1 | 张三 | 0 |
+——–+——–+——+
7 rows in set (0.00 sec)
可以看出,我们这次查出的数据就根据【userId】的大小进行了降序排列;
注意事项:
- 当我们需要以多个字段进行排序时,将按照上面的排序表达式的优先顺序进行排序;
- 如果省略了排序方式。那么默认为【ASC】;
获取指定数量的数据(LIMIT )
我们使用【limit】语句来实现获取指定数量的数据。语法如下:
LIMIT N,M;
例如,我们对数据排序以后,取出前三条数据:
mysql> SELECT * FROM user ORDER BY userId DESC LIMIT 2,3;
+——–+——+——+
| userId | name | sex |
+——–+——+——+
| 5 | 小张 | 1 |
| 4 | 王五 | 0 |
| 3 | 李四 | 0 |
+——–+——+——+
3 rows in set (0.00 sec)
【LIMIT N,M】的含义是:从第N条数据开始,取M条数据;那么我们上面运行的含义是:将表中的数据降序排列以后,获取从第二条数据以后的三条数据;
注意事项:
- 原则上,【LIMIT】语句是要和【ORDER BY】语句一起使用的,如果没有明确的排序方式,数据会按照随机的顺序取出,可能会得到不同的结果;
数据分组(GROUP BY)
当我们想要对查询出来的数据按照某个字段进行分组时,我们就需要使用到【GROUP BY】语句。语法如下:
GROUP BY 字段名
例如,我们将查询出来的结果按照【sex】进行分组:
mysql> SELECT count(userId),sex FROM user GROUP BY sex;
+—————+——+
| count(userId) | sex |
+—————+——+
| 4 | 0 |
| 3 | 1 |
+—————+——+
2 rows in set (0.00 sec)
这样我们就将每个性别的人数统计了出来(这里使用了MySQL的【COUNT】函数,后面我们会进行介绍);
注意事项:
- 在具有多个分组字段时,和【ORDER BY】语句一样,将根据你编写的SQL语句中的先后顺序进行优先级分组;
列的别名(AS)
有时候,我们需要对查询出来的列重新进行命名,这个时候就用到了【AS】命令。
例如,我们将上面查询到的【sex】数量重新命名为【NUM】:
mysql> SELECT count(userId) AS NUM ,sex FROM user GROUP BY sex;
+—–+——+
| NUM | sex |
+—–+——+
| 4 | 0 |
| 3 | 1 |
+—–+——+
2 rows in set (0.00 sec)
这里,我们就讲完了【SELECT】语句的一些基本查询情况,如果想要学习关于数据的插入/更新/删除的小伙伴可以查看另一篇博文史上最简单MySQL教程详解(基础篇)之SQL语句(一);接下来,我们讲解MySQL的运算符和常用数据库函数(一),为我们的多表查询打下基础。