数据中最常见的操作就是查询操作,也可以称作检索操作,目的是从表中检索出所需要的数据。
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学习-表记录的查询操作
发布评论