前言

主要是记录一下select命令的使用。根据《MySQL基础教程西泽梦路》学习,简单的做一下笔记。

记录于此,方便自己回忆。

正文

我这以Window版的phpstudy软件验证。

需要进入这个目录,才可以使用mysql命令

D:\phpstudy_pro\Extensions\MySQL5.7.26\bin

进入正文

创建info表,列表结构和数据如下

mysql> desc info;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int(11)      | NO   | PRI | NULL    |       |
| name  | varchar(100) | YES  |     | NULL    |       |
| page  | int(11)      | YES  |     | 100     |       |
+-------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> select * from info;
+----+------------+------+
| id | name       | page |
+----+------------+------+
|  1 | 笔友城堡     |  100 |
|  2 | 笔友城堡3    |  100 |
|  3 | dushu      |    4 |
|  4 | shu        |   66 |
|  5 | shuuu      |  300 |
+----+------------+------+
5 rows in set (0.00 sec)

where

使用WHERE设置条件并取出与条件相匹配的记录

* from 表 where 限定查询条件;

查询符合page页数大于80的所有数据

mysql> select * from info where page> 80;
+----+------------+------+
| id | name       | page |
+----+------------+------+
|  1 | 笔友城堡     |  100 |
|  2 | 笔友城堡3    |  100 |
|  5 | shuuu      |  300 |
+----+------------+------+
3 rows in set (0.00 sec)
比较运算符

mysql支持如下的比较运算符,主要是跟where组合使用。

比较运算符               含义
=                       等于
>                       大于
>=                      大于等于
<                       小于
<=                      小于等于
<>                        不等于
a in b                  a在b列表中
a not in b               a不知b列表中
a between b and c         a在[b,c]之间
a not between b and c     a不在[b,c]之间

来几个例子看看

# 查询page不等于100的数据
mysql> select * from info where page <> 100;
+----+-------+------+
| id | name  | page |
+----+-------+------+
|  3 | dushu |    4 |
|  4 | shu   |   66 |
|  5 | shuuu |  300 |
+----+-------+------+
3 rows in set (0.00 sec)
# 查询page在[0,100]之间的数据
mysql> select * from info where page between 0 and 100;
+----+------------+------+
| id | name       | page |
+----+------------+------+
|  1 | 笔友城堡     |  100 |
|  2 | 笔友城堡3    |  100 |
|  3 | dushu      |    4 |
|  4 | shu        |   66 |
+----+------------+------+
4 rows in set (0.00 sec)
# 查询page不在[0,100]之间的数据
mysql> select * from info where page not between 0 and 100;
+----+-------+------+
| id | name  | page |
+----+-------+------+
|  5 | shuuu |  300 |
+----+-------+------+
1 row in set (0.00 sec)
like

like,像什么,也就是模糊查询。

select * from 表名 where 查询的列名 like 匹配对象;

先试试手

mysql> select * from info where name like 'shu';
+----+------+------+
| id | name | page |
+----+------+------+
|  4 | shu  |   66 |
+----+------+------+
1 row in set (0.00 sec)

咦,怎么只查询到一个呢?

因为LIKE可以把包含某字符串的所有内容当成查询对象

如果需要模糊匹配,需要使用通配符。

通配符
通配符				含义
%				  任意字符串
_ 				  任意一个字符(一个就匹配一个,多个就匹配多个)

简单介绍一下

指定的字符串			符合的例子
%县                   石城县、宝安县、县、赣县
宝%                   宝贝、宝能、宝,宝宝
%中%                  中国、中华、中环、中了(只要包含中的都可以)
石_县                 石城县、石龙县、石头县
_呗                   花呗、送呗、借呗
# 一个%
mysql> select * from info where name like "%shu";
+----+-------+------+
| id | name  | page |
+----+-------+------+
|  3 | dushu |    4 |
|  4 | shu   |   66 |
+----+-------+------+
2 rows in set (0.00 sec)
# 两个_
mysql> select * from info where name like "__shu";
+----+-------+------+
| id | name  | page |
+----+-------+------+
|  3 | dushu |    4 |
+----+-------+------+
1 row in set (0.00 sec)
# 查询包含shu的name
mysql> select * from info where name like "%shu%";
+----+-------+------+
| id | name  | page |
+----+-------+------+
|  3 | dushu |    4 |
|  4 | shu   |   66 |
|  5 | shuuu |  300 |
+----+-------+------+
3 rows in set (0.00 sec)
not like

跟like相反,not like 提取不包含某字符串的记录。

mysql> select * from info where name not like "%shu%";
+----+------------+------+
| id | name       | page |
+----+------------+------+
|  1 | 笔友城堡     |  100 |
|  2 | 笔友城堡3    |  100 |
+----+------------+------+
2 rows in set (0.00 sec)
is 和 is not

NULL表示空值。如果没有向列中输入数据,也没有给列设置默认值,就会输入NULL。

在info表中插入新的数据,name不赋值,默认会设置为NULL

# 插入数据
mysql> insert into info(id, page) values(6,120);
# 查询
mysql> select * from info ;
+----+------------+------+
| id | name       | page |
+----+------------+------+
|  1 | 笔友城堡     |  100 |
|  2 | 笔友城堡3    |  100 |
|  3 | dushu      |    4 |
|  4 | shu        |   66 |
|  5 | shuuu      |  300 |
|  6 | NULL       |  120 |
+----+------------+------+
6 rows in set (0.00 sec)

查询name是null的数据

# 查询name是null的数据
mysql> select * from info where name is null;
+----+------+------+
| id | name | page |
+----+------+------+
|  6 | NULL |  120 |
+----+------+------+
1 row in set (0.00 sec)

# 查询name不是null的数据
mysql> select name from info where name is not null;
+------------+
| name       |
+------------+
| 笔友城堡     |
| 笔友城堡3    |
| dushu      |
| shu        |
| shuuu      |
+------------+
5 rows in set (0.00 sec)
or 和 and

mysql语句中也可以使用or和and进行设置多个条件查询。

条件a or 条件b       符合a或b中任意一个条件就可以
条件a and 条件b      符合a和b两个条件的才可以

上面介绍的between and或 not between and 可以进行一定的范围查询

# between and
select * from info where page between 0 and 100;
# not between and
select * from info where page not between 0 and 100;

这里也可以分别用and或or进行查询

# 使用and
mysql> select * from info where page >=0 and page <=100;
+----+------------+------+
| id | name       | page |
+----+------------+------+
|  1 | 笔友城堡     |  100 |
|  2 | 笔友城堡3    |  100 |
|  3 | dushu      |    4 |
|  4 | shu        |   66 |
+----+------------+------+
4 rows in set (0.00 sec)
# 使用or
mysql> select * from info where page > 100 or page < 0;
+----+-------+------+
| id | name  | page |
+----+-------+------+
|  5 | shuuu |  300 |
|  6 | NULL  |  120 |
|  7 | NULL  |  170 |
|  8 | NULL  |  173 |
+----+-------+------+
4 rows in set (0.00 sec)

当然,除了上面的,可以组合其他多个命令,也就多个条件进行限制。

mysql> select * from info where name like "%shu%" and page>50;
+----+-------+------+
| id | name  | page |
+----+-------+------+
|  4 | shu   |   66 |
|  5 | shuuu |  300 |
+----+-------+------+
2 rows in set (0.00 sec)
混合使用

当AND和OR混合使用时,会优先处理AND。

来几个例子玩玩

  1. 查询page在(0,100)之间的或包含”shu”的数据

# and 的优先级比or高 ,可以不用(),但为了阅读性,我是特意加上
mysql> select * from info where (page>0 and page<100 ) or name like "%shu%";
+----+-------+------+
| id | name  | page |
+----+-------+------+
|  3 | dushu |    4 |
|  4 | shu   |   66 |
|  5 | shuuu |  300 |
+----+-------+------+
3 rows in set (0.00 sec)
  1. 查询page>200且不等于 66 范围内的且name包含“shu”的数据

# 这里or必须包含括号,否则查询
mysql> select * from info where (page<>66 or page>200 ) and name like "%shu%
+----+-------+------+
| id | name  | page |
+----+-------+------+
|  3 | dushu |    4 |
|  5 | shuuu |  300 |
+----+-------+------+
2 rows in set (0.00 sec)

# 如果or不加(),查询到完全不符合我们的题意
mysql> select * from info where page<>66 or page>200  and name like "%shu%";
+----+------------+------+
| id | name       | page |
+----+------------+------+
|  1 | 笔友城堡     |  100 |
|  2 | 笔友城堡3    |  100 |
|  3 | dushu      |    4 |
|  5 | shuuu      |  300 |
|  6 | NULL       |  120 |
|  7 | NULL       |  170 |
|  8 | NULL       |  173 |
+----+------------+------+
7 rows in set (0.00 sec)

distinct

distinct不同的或不重复的。

我们继续给info表插入几条数据,name依旧不赋值(为null)。[上面有]

对比一下添加了distinct后的区别

# 不添加distinct
mysql> select name from info;
+------------+
| name       |
+------------+
| 笔友城堡     |
| 笔友城堡3    |
| dushu      |
| shu        |
| shuuu      |
| NULL       |
| NULL       |
| NULL       |
+------------+
8 rows in set (0.00 sec)
# 添加distinct
mysql>
mysql> select distinct name from info;
+------------+
| name       |
+------------+
| 笔友城堡     |
| 笔友城堡3    |
| dushu      |
| shu        |
| shuuu      |
| NULL       |
+------------+
6 rows in set (0.00 sec)

参考文章

  1. 《MySQL基础教程-西泽梦路》

相关文章

暂无评论

none
暂无评论...