数据中最常见的操作就是查询操作,也可以称作检索操作,目的是从表中检索出所需要的数据。

select 语句:

select 字段列表 from 表名或视图名
[where 条件表达式]
[group by 分组字段 [having 条件表达式]]
[order by 排序字段 [asc | desc];
  • where 语句用于指定记录的过滤条件。
  • group by 子句用于对检索的数据进行分组。
  • having 子句通常和 group by 子句一起使用,用于过滤分组后的统计信息。
  • order by 子句用于对检索出来的数据进行排序处理,默认为 asc(升序)。

使用 select 子句指定字段列表:

字段列表有三种方式,*表名.*字段列表

  • 表示指定整个表或视图的所有字段。
  • 表名.*  表示在多表查询的时候,指定某个表的所有字段。
  • 字段列表  表示查询一个或多个指定字段。

示例:查询 user 表的 userid 和 email:

 

使用谓词过滤记录:

查询的记录可以用谓词 distinct limit 进行过滤。

select distinct 字段名 from 表名;
查询语句 limit [start,] length;
  • distinct 用于过滤重复的记录,写在 select 的后面。
  • limit 用于筛选出指定某几行的记录,start 表示开始位置,length 表示检索的长度,start 可以不写,默认为 0。

示例:查询 user 表的 email,只需要 7 行数据,邮箱不能重复:

使用 from 子句指定数据源(多表连接):

from 子句后面接表名,表示查询该表的记录,但其实,from 子句还可以查询多个表中的数据,语法如下:

from 表名1 [连接类型] join 表名2 on 表1和表2的连接条件;
from 表名1 [连接类型] join 表名2 on 表1和表2的连接条件 [连接类型] join 表3 on 表2与表3的连接条件;

连接类型主要分为内连接(inner join)外连接(outer join),外连接又可以分为左连接(left join)右连接(right join)完全连接(full join)

  • 内连接(inner join):默认的连接类型,可以不用写 inner,主要用于将两个表中指定连接条件的记录连接成一个新的结果集,并舍弃掉不满足条件的记录。
  • 外连接(out join):与内连接不用,外连接只检索一个表中的记录,再将该记录和另一个表的所有记录连接成一个新的结果集。左连接(left join)表示保留左表的所有记录,检索右表指定条件的记录;右连接(right join)保留右表的记录,检索左表;完全连接(full join)保留两个表的所有记录,但MySQL不支持完全连接。 

示例:将 shop 表和 goods 表通过两个表的 shopid 进行连接:

使用 where 子句过滤结果集:

比较运算符:

表达式1 比较运算符 表达式2;

表达式可以为任意字段名、常量、变量、函数、子查询等等,而比较运算符用于比较两个表达式,返回一个布尔类型,常用的比较运算符有:=、>、>=、<、<=、<>(不等于)、!=(也是不等于)、!<(不小于)、!>(不大于)。

 示例:查询 user 表中电话为 12345678910 的用户名称:

is NULL 运算符:

表达式 is [not] NULL;

判断表达式的值是否为空,如果写上 not,就是判断不为空。

示例:查询 user 表中用户名称为空的所有用户信息:

逻辑运算符:

逻辑运算符可以将多个查询条件组合起来,方便我们进行更加复杂的查询操作。常见的逻辑运算符有逻辑与(and)逻辑或(or)逻辑非(!)。使用方式和数学上一样,不多赘述。

示例:查询 user 表中email 为 2020@cnu 且照片为空的所有用户信息:

like 运算符:

字符串表达式 [not] like 模式;

like 运算符用于进行模糊查询,用于判断字段串是否与给定的模式相同,有点类似于正则表达式,但比正则表达式简单,通过以下通配符来实现:

  • 用于匹配 0 个或多个字符。
  • _ (下划线)  用于匹配任意一个字符。 

示例: 查询 user 表中姓尹的所有用户信息:

使用 order by 子句对结果集进行排序:

order by 字段名1 [asc|desc] [..., 字段名n [asc|desc]];

第一个字段表示为主关键字,第二个字段为次关键字,后面字段关键程度依次降低,用逗号隔开。排序时,总是将 NULL 值视为最小值。

示例:将 user 表中所有信息按照密码升序排列,密码相同按照 userid 降序排列:

常用聚合函数:

  • sum():累加求和
  • avg(): 求平均数
  • count():统计记录的行数
  • max():求最大值
  • min():求最小值

示例:求 user 表中的 userid 的和、平均数、最大值、最小值以及记录行数:

使用 group by 子句对记录进行分组统计:

group by 字段列表 [having 条件表达式] [with rollup]; 

group by 单独使用只会显示分组中的某一行记录,作用不大,因此,group by 常常和聚合函数一起使用,比如统计某个班级的平局分最高最低分什么的。

示例:统计 goods 表中每个店铺的平均预售价,根据 shop 表中的店铺名分类:

having 条件表达式:

having 条件表达式和 where 条件表达式使用方式一样,但 having 条件表达式只能用于对分组后的记录进行过滤,比如统计班级平局分大于60的班级,需要注意,having 条件表达式不能用 where 代替。

示例:统计 goods 表中平均预售价大于100的店铺的平局预售价,根据 shop 表中的店铺名分类:

with rollup选项:

用于对过滤的信息进行一个汇众,比如使用 group by 统计完各个班级的平均分后,需要对应所有班级的平均分进行一个汇总,这时候就可以在尾部加上 with rollup

统计 goods 表中每个店铺的平均预售价,根据 shop 表中的店铺名分类,并进行汇总:

合并结构集:

查询语句1 union [all] 查询语句2;

用于将多个查询的结果组合成一个新的结果集。使用 union 前必须要严格查询的字段列表个数以及数据类型相同。union 会自动过滤掉重复的记录,而 union all 不会,但是 union all 在效率上更高。

示例:合并 goods 表和 shop 表中的 shopid:

子查询:

(查询语句)

子查询用 () 包裹,主要用于一些判断语句,比如查询班里大于平均分的人。

比较运算符:

在 where 子句中介绍过,不多说。

示例:查询 goods 表中预售价大于平均价的商品名:

[not] in 运算符

用于表达式的值是否在子查询返回的一列值中。

示例:查询 goods 表中在五星店铺的商品名:

[not] exists 逻辑运算符

用于检测子查询的结果是否包含记录,如子查询的结果集至少包含一条记录返回 true。

示例:查询 goods 和 shop 表中 shopid 相等的商品名:

any 运算符和 all 运算符

两个运算符通常与比较运算符一起使用,主要用于将表达式的值与子查询返回的值一一进行比较,使用 any 运算符时,当有一个值满足条件,整个表达式就返回 true;使用 all 运算符时,只有当所有值满足条件时,才返回 true。

示例:查询 goods 表中预算价大于 task 表中任意一价格的商品名:

查询查询 goods 表中预算价大于 task 表中所有价格的商品名:

使用正则表达式进行模糊查询:

字段名 [not] regexp [binary] '正则表达式';

和 like 的作用一样,用于判断某个字符串是否与给定模型匹配,但正则表达式能表示的更加精确,灵活。正则表达式的使用这里不多说,详见:MySQL 正则表达式 | 菜鸟教程 (runoob) 。

示例:查询 user 表中密码为纯数字的用户名称:

相关参考:《MySQL 数据库基础与实例教程》 

更多推荐

MySQL学习-表记录的查询操作