MySQL数据库基本操作-DQL-基本查询
概念
- 数据库管理系统一个重要功能就是数据查询,数据查询不应只是简单返回数据库中存储的数据,还应该根据需要对数据进行筛选以及确定数据以什么样的格式显示
- MySQL提供了功能强大、灵活的语句来实现这些操作
- MySQL数据库使用select语句来查询数据
语法格式
select
[all|distinct]
<目标列的表达式1> [别名],
<目标列的表达式2> [别名]...
from <表名或视图名> [别名],<表名或视图名> [别名]...
[where<条件表达式>]
[group by<列名>]
[having<条件表达式>]
[order by<列名> [asc|desc]]
[limit<数字或者列表>];
#简化版语法
select *|列名 from 表名 where 条件;
简单查询:
#查询所有
select *|所有列名 from 表名;
#使用别名
select * from 表名 as 别名 #给表名加别名 [as可以省略]
select 列名 as 别名 from 表名 #给列名加别名 [as可以省略]
#去掉重复值
select distinct 列名 from 表名
运算符
数据库中的表结构确立后,表中的数据代表的意义就已经确定,通过MySQL运算符进行运算,就可以获取到表结构以外的另一种数据
例如:学生表中存在一个birth字段,这个字段表示学生的出生年份,而运用MySQL的算数运算符用当前的年份减学生出生的年份,那么得到的就是这个学生的实际年龄数据
MySQL支持4种运算符:
- 算术运算符
算数运算符 | 说明 |
---|---|
+ | 加法运算 |
- | 减法运算 |
* | 乘法运算 |
/或DIV | 除法运算,返回商 |
%或MOD | 求余运算,返回余数 |
- 比较运算符
比较运算符 | 说明 |
---|---|
= | 等于 |
< 和 <= | 小于和小于等于 |
> 和 >= | 大于和大于等于 |
<=> | 安全的等于,两个操作码均为null时,其所得值为1;而当一个操作码为null时,其所得值为0 |
<> 或 != | 不等于 |
is null 或 isnull | 判断一个值是否为null |
is not null | 判断一个值是否不为null |
least | 当有两个或多个参数时,返回最小值 |
greatest | 当有两个或多个参数时,返回最大值 |
between and | 判断一个值是否落在两个值之间 |
in | 判断一个值是in列表中的任意一个值 |
not in | 判断一个值不少in列表中的任意一个值 |
like | 通配符匹配 |
regexp | 正则表达式匹配 |
- 逻辑运算符
逻辑运算符 | 说明 |
---|---|
not或者! | 逻辑非 |
and或者&& | 逻辑与 |
or或者双竖线 | 逻辑或 |
xor | 逻辑异或 |
- 位运算符
位运算符 | 说明 |
---|---|
竖线 | 按位或 |
& | 按位与 |
^ | 按位异或 |
<< | 按位左移 |
>> | 按位右移 |
~ | 按位取反,反转所有比特 |
位运算符是在二进制数上进行计算的运算符,位运算会先将操作数编程二进制数,进行位运算,然后再将计算结果从二进制数变回十进制数
排序查询
如果我们需要对读取的数据进行排序,我们就可以使用MySQL的order by子句来设定你想按哪个字段哪种方式来进行排序,再返回搜索结果
select
字段名1,字段名2,...
from 表名
order by 字段名1 [asc|desc],字段名2 [asc|desc]
特点:
- asc代表升序,desc代表降序,如果不写默认升序
- order by用于子句中可以支持单个字段,多个字段,表达式,函数,别名
- order by子句放在查询语句的最后面,limit子句除外
聚合查询
聚合函数查询是属于纵向查询,它是对一列的值进行计算,然后返回一个单一的值,另外聚合函数会忽略空值
聚合函数 | 作用 |
---|---|
count() | 统计指定列不为null的记录行数 |
sum() | 计算指定列的数值和,如果指定列类型不是数值类型,那么计算结果为0 |
max() | 计算指定列的最大值,如果指定列是字符串类型,那么使用字符串排序运算 |
min() | 计算指定列的最小值,如果指定列是字符串类型,那么使用字符串排序运算 |
avg() | 计算指定列的平均值,如果指定列类型不是数值类型,那么计算结果为0 |
注意: 聚合函数对null值得处理
- count函数对null值得处理:如果count函数的参数为星号(*),则统计所有记录的个数,而如果参数为某字段,则不统计含null值得记录个数
- sum和avg函数对null值得处理:这两个函数忽略null值得存在,就好像该条记录不存在一样
- max和min函数对null值得处理:max和min两个函数同样忽略null值得存在
分组查询
分组查询是指使用group by子句对查询信息进行分组
#语法格式
select 字段1,字段2... from 表名 group by
注意: 如果要进行分组的话,则select子句之后,只能出现分组的字段和统计函数,其他的字段不能出现
分组查询后进行筛选
分组之后的条件筛选-having
- 分组之后对统计结果进行筛选的话必须使用having,不能使用where
- where子句用来筛选from子句中指定的操作所产生的行,group by子句用来分组where子句的输出,having子句用来从分组的结果中进行筛选
#语法格式
select 字段1,字段2... from 表名 group by 分组字段 having 分组条件
分页查询
分页查询在项目开发中很常见,由于数据量很大,显示屏长度有限,因此对数据需要采取分页显示方式,例如数据共30条,每页显示5条,第一页显示1-5条,第二页显示6-10条
#方式1 显示前n条
select 字段1,字段2... from 表名 limit n
#方式2 分页实现
select 字段1,字段2... from 表名 limit m,n #m:整数 表示从第几条索引开始,计算方式(当前页-1)*每页显示条数 n:整数 表示查询多少条数据
注意: limit一般放在sql语句的最后
insert into select 语句
将一张表的数据导入到另一张表中,可以使用insert into select语句
insert into table2(field1,field2,...) select value1,value2,... from table1
#或
insert into table2 select * from table1
注意: 要求目标表table2必须存在
正则表达式
正则表达式描述了一种字符串匹配的规则,正则表达式本身就是一个字符串,使用这个字符串来描述、用来定义匹配规则,匹配一系列符合某个句法规则的字符串。在开发中,正则表达式通常被用来检索、替换那些符合某个规则的文本
MySQL通过REGEXP关键字支持正则表达式进行字符串匹配