第三课:MySQL 数据查询

一、select语句

select语句基本语法结构:

select [all | distinct | distinctrow] <目标列表达式1> [,<目标列表达式2>]...

from <表名1 or视图1> [,<表名2 or视图2>]...

[where <条件表达式>]

[group by <列名1> [having <条件表达式>]]

[order by <列名2> [asc | desc]]

[limit [m,] n];

•all | distinct | distinctrow:是否返回结果集中的重复值。默认为all,即返回所有包括重复的行;distinct | distinctrow会消除结果集中的重复行

•where子句用于指定对记录的过滤条件

•group by子句用于将查询结果集按指定的字段分组,having子句指定分组结果集的过滤条件

•order by子句将查询结果按指定字段值的升序或降序排序

•limit子句指定查询结果集包含的记录数

陈双义博客

二、单表查询

1、选择字段

语法格式:

select 目标列表达式1,目标列表达式2,......

from 表名;

•查询所有字段:select * from 表名;

•定义字段名别名:select 字段名 [AS] 字段别名 from 表名;字段的别名不可以出现在where子句中

2、选择指定记录

语法格式:

select 目标列表达式1,目标列表达式2,......

from 表名

where 查询条件;

常用的查询条件

查询条件

操作符

比较

=,<>,!=,<,<=,>,>=,!<,!>,not+含比较运算符的表达式

确定范围

between and,not between and

确定集合

in,not in

字符匹配

like,not like

空值

is null,is not null

多重条件

and,or

•like字符串匹配查询:通配符有两种“%”和“_”,“%”代表任意长度的字符串,“_”代表任意单个字符。

•正则表达式查询:[not] [regexp | rlike] <正则表达式>

正则表达式常用字符匹配

选项

说明

举例

匹配示例

<字符串>

匹配包含指定字符串的文本

‘fa’

fan,afa,faad

[ ]

匹配[ ]中任一个字符

‘[ad]’

day,dig,app

[^ ]

匹配不在[ ]中任一个字符

‘[^ad]’

cool,big,six

^

匹配文本的开始字符

‘^a’

apple,aike,aline

$

匹配文本的结束字符

‘er$’

driver,worker,famer

.

匹配任意单个字符

‘b.t’

better,bit,bite

*

匹配0或多个*前面指定的字符

‘f*n’

fn,fan,begin

+

匹配+前面的字符1次或多次

‘ba+’

bat,baa,battle

{n}

匹配前面的字符至少n次

‘b{2}’

bb,bbba,bbbbbb

3、对查询结果排序

语法格式:

order by 列名1[,列名2...] [ASC | DESC];

•使用order by子句将查询结果集中的记录按一个或多个字段值的升序或降序排列。

•关键字ASC表示升序排列,关键字DESC表示降序排序,默认为ASC

4、限制查询结果的数量

语法格式:

limit [位置偏移量,] 行数;

limit 行数 offset 位置偏移量;

•行数必须为非负整数常量;第一条数据的位置偏移量为0,以此类推

•select语句中若有order by子句,又有limit子句时,limit子句必须放在order by子句之后

三、分组聚合查询

1、聚合函数查询

MySQL常用聚合函数

函数名

说明

count([distinct | all] *)

统计数据表中的记录数

count([distinct | all] <l列名>)

统计数据表的一列中值的个数

max([distinct | all] <l列名>)

求数据表的一列值中的最大值

min([distinct | all] <l列名>)

求数据表的一列值中的最小值

sum([distinct | all] <l列名>)

计算数据表的一列中值的总和

avg([distinct | all] <l列名>)

计算数据表的一列中值的平均值

•distinct | all:distinct表示在计算时取消指定列中的重复值,默认为all

•除了count([distinct | all] *)外,其余聚合函数都会忽略空值

2、分组聚合函数

group by子句语法格式:

[group by 字段列表1[,字段列表2...]]

[having <条件表达式>]

•group by子句中列出的每个字段都必须是检索列或有效表达式,不能是聚合函数。在select语句中使用表达式,必须在group by子句中指定相同表达式,不能使用别名

•select语句中每个列,除聚合函数之外,都必须在group by子句中给出来

•用于分组的列中有null值,则null将作为一个单独的分组返回。若存在多个null值,则将这些null值所在的列分为一组

where和having两者的区别:

■where子句作用于基本表或视图,用于过滤基本表或视图中的数据行;having短语作用于分组后的每个组,主要用来过滤分组,即having短语是基于分组的聚合值而不是特定行的值来过滤数据

■having短语中的条件可以包含聚合函数,where子句不能;where子句在数据分组前过滤,having短语在数据分组后过滤

一条select语句包含having短语,而没有group by子句,则会把表中的所有记录都分在一个组中

四、连接查询

连接查询包含:交叉连接,内连接,外连接

1、交叉连接

交叉连接(笛卡尔积)语法结构:

select * from 表1 cross join 表2;

select * from 表1 表2;

2、内连接

内连接:通过在查询中设置连接条件来移除交叉连接查询结果集中某些数据行。

内连接所对应的SQL语句两种表示形式:

●使用inner join的显式语法结构

select 目标列表达式1,目标列表达式2,...,目标列表达式n

from table1 [inner] join table2

on连接条件

[where 过滤条件];

●使用where子句定义连接条件的隐式语法结构

select 目标列表达式1,目标列表达式2,...,目标列表达式n

from table1,table2

where 连接条件 [and 过滤条件];

2.1、等值与非等值连接

连接查询中用来连接两个表的条件为连接条件,一般格式为:

[<表名1>.]<字段名1> <比较运算符> [<表名2>.]<字段名2>

比较运算符主要有:=、>、<、>=、<=、!=(<>)

当表名很长,可以为表名指定别名,其语法结构为:

表名 [AS] 表别名

2.2、自连接

某个表与自身进行连接,叫自连接。使用自连接,需要为表指定多个不同的别名,且对所有查询字段的引用必须使用别名限定

2.3、自然连接

自然连接:只有当连接字段在两张表中的字段名都相同时才可以使用。自然连接在from子句中使用关键字natural join。自然连接不需要指定连接条件,系统会自动根据两张表中相同的字段名来连接

3、外连接

外连接将连接的两张表分为基表和参照表,然后以基表为依据返回满足和不满足连接条件的记录。

外连接根据连接表的顺序,可以分为左外连接和右外连接

3.1、左外连接

左外连接(左连接),用于返回该关键字左边表(基表)的所有记录,并用这些记录与该关键字右边表(参考表)中的记录进行匹配,如果左表的某些记录在右表中没有匹配的记录,右表对应的字段值均被设置为空值null

左连接语法结构:

select 目标列表达式1,目标列表达式2,...,目标列表达式n

from table1 left [outer] join table2

on连接条件;

3.2、右外连接

右外连接(右连接),用于返回该关键字右边表(基表)的所有记录,并用这些记录与该关键字左边表(参考表)中的记录进行匹配,如果右表的某些记录在左表中没有匹配的记录,左表对应的字段值均被设置为空值null

右连接语法结构:

select 目标列表达式1,目标列表达式2,...,目标列表达式n

from table1 right [outer] join table2

on连接条件;

五、子查询

子查询(嵌套查询),将一个查询语句嵌套在另一个查询语句的where子句或having短语中,前者被称为内层查询或子查询,后者被称为外层查询父查询

在整个select语句中,先计算子查询,在将子查询的结果作为父查询的过滤条件

1、带in关键字的子查询

带in关键字的子查询是最常用的一类子查询,使用in关键字的子查询时,内层查询语句仅仅返回一个数据列,其值将提供给外层查询进行比较操作

语法结构:

select 目标列表达式1,目标列表达式2,...,目标列表达式n

from 表名

where 列名 in

( select 目标列表达式1,目标列表达式2,...,目标列表达式n

from 表名

);

select语句也可以使用not in关键字的子查询来判定一个给定值不属于子查询的结果集。表示否定的查询不能用连接查询来改写

2、带比较运算符的子查询

带比较运算符的子查询是指父查询与子查询之间用比较运算符进行连接。当用户能够确切知道内层查询返回的是单值时,可以用<、>、<=、>=、=、<>、!=等比较运算符构造子查询

比较运算符还可以与all、some、any关键字一起构造子查询:

●all用于指定表达式需要与子查询结果集中的每个值都进行比较,当表达式与每个值都满足比较关系时,返回true,否则返回false

●some与any是同义词,表示表达式与子查询结果集中的某个值满足比较关系时,就返回true,否则返回false

比较运算符与all、some、any构造的子查询还可以通过聚合函数来实现

any或all与聚合函数的对应关系:


=

!=

<

<=

>

>=

any

in

--

<max

<=max

>min

>=min

all

--

not in

<min

<=min

>max

>=max

3、带exists关键字的子查询

使用exists关键字构造子查询时,系统对于子查询进行运算来判断是否返回结果集。若返回的结果集不为空,则exists返回true,此时外层查询语句将进行查询;若返回的结果集为空,则exists返回false,此时外层查询语句将不进行查询

由于带exists关键字的子查询只返回true或false,所以内层查询的select子句给出的字段名没有意义,通常目标列表达式都用星号“*”

使用关键字exists构造子查询时内层的where子句中需要指定连接条件

not exists与exists关键字使用方法相同,返回的结果相反

六、联合查询 union

使用union关键字可以把多个select语句的结果集组合到一个结果集中,这种查询方式叫并运算或联合查询。合并时,多个select子句中对应的字段数和数据类型必须相同

联合查询语法结构:

select ... from ... where ...

union [all]

select ... from ... where ...

[...union [all]

select ... from ... where ...]

使用union语句是需要注意的几点:

■union语句必须由两条或两条以上的select语句组成

■union语句中的每个select子句必须包含相同的列,表达式或聚合函数

■每个select子句中对应的目标列的数据类型必须兼容

■第一个select子句中的目标列名称会被称为union语句结果集的列名称

■联合查询中只能使用一条order by子句或limit子句,且必须置于最后一条select语句之后

打赏 支付宝打赏 微信打赏
本文标题:第三课:MySQL 数据查询
本文链接:https://chenshuangyi.com/post/555.html
作者授权:除特别说明外,本文由 陈双义 原创编译并授权 陈双义博客 刊载发布。
版权声明:本文使用「署名-非商业性使用-相同方式共享」创作共享协议,转载或使用请遵守署名协议。

为您推荐

干货 | 软件性能测试基本测试概念

干货 | 软件性能测试基本测试概念

一、性能测试的目的1、 评估当前系统2、 寻找瓶颈3、 预测未来性能二、性能测试的前提:接...

  第十二课:MySQL 数据库的应用编程

第十二课:MySQL 数据库的应用编程

一、使用PHP进行MySQL数据库应用编程1、建立与MySQL数据库服务器的连接1.1、使用函数mysql_connec...

2019-03-21 标签:MySQL数据库软件测试
第十一课:MySQL 数据库备份与恢复

第十一课:MySQL 数据库备份与恢复

一、MySQL数据库备份与恢复1、使用SQL语句备份和恢复表数据1.1、select into...outfile语句导...

2019-03-21 标签:MySQL数据库软件测试
第十课:MySQL 访问控制与安全管理

第十课:MySQL 访问控制与安全管理

一、用户账户管理1、创建账户基本语法结构:create user user_specification[,us...

2019-03-20 标签:MySQL数据库软件测试
第九课:MySQL 存储过程和存储函数

第九课:MySQL 存储过程和存储函数

一、存储过程存储过程是一组为了完成某特定功能的SQL语句集。一个存储过程是一个可编程的函数,同时可以看做是在数据库编程中...

2019-03-18 标签:MySQL数据库软件测试
第八课:MySQL 事件

第八课:MySQL 事件

一、事件事件和触发器相似,都是在某些事情发生的时候启动,事件也叫作临时触发器事件基于特定时间周期触发来执行某些任务,而触...

2019-03-05 标签:MySQL数据库软件测试
第七课:MySQL 触发器

第七课:MySQL 触发器

一、触发器触发器是一个被指定关联到一个表的数据库对象。触发器用于保障数据库中数据的完整性,以及多个表之间数的一致性。触发...

2019-03-05 标签:MySQL数据库软件测试
第六课:MySQL 视图

第六课:MySQL 视图

一、视图视图是从一个或多个表或者视图中导出的表,也包含一系列带有名称的数据列和若干条数据行视图不同于数据库真实存在的表:...

2019-03-05 标签:MySQL数据库软件测试

发表评论

百度一下
百度搜索
百度广告
站点信息
  • 文章总数:735
  • 页面总数:9
  • 分类总数:19
  • 标签总数:1179
  • 评论总数:149
  • 浏览总数:320169

当前非电脑浏览器正常宽度,请使用移动设备访问本站!