文章目录
增加
当前已有数据库的表为
create table 寻觅的测试表(
序号 int primary key not null auto_increment,
姓名 varchar(30),
年龄 tinyint unsigned default 3,
身高 decimal(5,2),
性别 enum('男','女','保密') default '保密'
);
全列插入
语法:insert [into] 表名 values(...)
如果出现自增的属性(主键),我们可以用0或null或default来占位
例如:insert into 寻觅的测试表 values(0,'不亏是我',0,18.00,'男');
insert into 寻觅的测试表 values(null,'不亏是我',0,18.00,1);
上述两个例子输入的信息是相同的
部分插入
语法:insert [into] 表名(列,……) values(值,……)
例如:insert into 寻觅的测试表(姓名) values('寻寻觅觅');
insert into 寻觅的测试表(姓名, 年龄) values('寻寻觅觅', 5);
列可以用``扩起来,也可以不扩,看个人习惯,但是要注意,这里并不是单引号’’,而是键盘右上角esc键下放那个符号!
多行插入
insert into 寻觅的测试表 values
(0,'顶不住啊',6,15,1),
(0,'顶不住啊',6,15,2),
(0,'顶不住啊',6,15,3)
;
查询
查询在数据库中的使用率是最高的一个操作,查询会有很多方式和方法。
一般不建议用MySQL做这些复杂查询运算,推荐我们可以先将数据查询出后在使用其他编程语言(比如说Python)进行运算。
查询测试表
常规查询
查询所有字段
语法:select * from 表名;
例:select * from 寻觅的测试表;
查询指定字段
语法:select 列,…… from 表名;
例:select 姓名,身高 from 寻觅的测试表;
查询时消除重复行和给起别名
-
消除重复行
select distinct 字段 from 表名;
-
起别名
select 字段 as 名字;
例:select distinct 姓名 as 我是别名 from 寻觅的测试表;
条件查询
语法:select …… from 表名 where ……
比较运算符
运算符 | 作用 |
---|---|
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
= | 等于 |
!=或<> | 不等于 |
例:
select distinct 年龄 from 寻觅的测试表 where 年龄 > 5;
select distinct 姓名 from 寻觅的测试表 where 年龄 <> 0;
select distinct 姓名 from 寻觅的测试表 where 年龄 != 0;
进行测试
逻辑运算符
-
逻辑和: and 同时满足
-
逻辑或: or 满足一个条件即可
-
取反: not 不满足条件即可
例:select * from 寻觅的测试表 where 年龄>3 and 性别=3;
select * from 寻觅的测试表 where 年龄>3 or 性别=3;
select * from 寻觅的测试表 where 年龄>3 and not 性别=3;
模糊查询
like
- ==%==替换任意多个
- ==_==替换一个
例:select * from 寻觅的测试表 where 姓名 like '%寻_觅%';
select * from 寻觅的测试表 where 姓名 like '%寻%觅%';
rlike(正则表达式)
模糊查找可以直接使用正则表达式来编写,如果不知道正则表达式是什么可以查看正则表达式学习链接
select * from 寻觅的测试表 where 姓名 rlike '^寻.*';
范围查询
- in(数据,……)
一个非连续的范围内
例:select * from 寻觅的测试表 where 年龄 in(0,3,5);
- between … and …
一个连续的范围
例:select * from 寻觅的测试表 where 序号 between 8 and 12;
空判断
- is null 判断空
例:select * from 寻觅的测试表 where 序号 between 8 and 12 and 身高 is null;
- is not null 判断非空
例:select * from 寻觅的测试表 where 序号 between 8 and 12 and 身高 is not null;
聚合函数
聚合函数添加在select之后即可
语法:select 聚合函数(字段) from 表名;
聚合函数 | 作用 |
---|---|
count | 总数(不是求和,输出一共有多少组数据) |
max | 最大值 |
min | 最小值 |
sum | 求和(将数据相加) |
avg | 平均值 |
round | 四舍五入(格式为round(数据,保留小数位数)) |
实例:
select count(年龄) from 寻觅的测试表;
select max(年龄) from 寻觅的测试表;
select sum(年龄) from 寻觅的测试表;
select avg(年龄) from 寻觅的测试表;
select round(avg(年龄),0) from 寻觅的测试表;
分组
将数据根据指定字段进行分组
group by
语法: select …… from 表名 group by 字段
例: select 性别,count(*) from 寻觅的测试表 group by 性别;
select 年龄,count(*) from 寻觅的测试表 group by 年龄;
查看组内信息
group_concat(…)
显示组内详情。在select 后添加即可。
例:select 年龄,count(*),group_concat(姓名) from 寻觅的测试表 group by 年龄;
select 年龄,count(*),group_concat(序号) from 寻觅的测试表 group by 年龄;
分组之后进行筛选
having
having在句末使用,和where效果虽然相近,分组后的数据筛选不能使用where,否则会出现一些未知错误。
语法:select …… from 表名 group by 字段 having 筛选条件;
注意:这里的筛选条件必须和group by 中的字段有关,否则会报错
例:select 年龄,count(*),group_concat(姓名) from 寻觅的测试表 group by 年龄 having 年龄>3;
select 身高,count(*),group_concat(姓名) from 寻觅的测试表 group by 身高 having 身高>3;
排序
order by(默认asc:从小到大排序,desc:从大到小排序)
排序支持多字段排序(优先排序靠前的字段,在靠前字段相同时按下一个排序字段进行排序)。
语法 :select * from 表名 order by 字段1,…… asc;
例:select * from 寻觅的测试表 order by 年龄;
select * from 寻觅的测试表 where 性别='保密' order by 年龄,身高 desc;
分页
limit 起始位置,显示个数起始位置从0开始计算
语法 : select * from 表名 limit 起始位置,显示个数;
select * from 寻觅的测试表 limit 2;
select * from 寻觅的测试表 limit 0,2;
select * from 寻觅的测试表 limit 2,2;
连接查询
MySQL 中有三种连接方式
- 内连接:当只有两表中都存在此数据才会对齐连接。
- 左连接:以左表作为基准,左表中存在,右表不存在的数据会已null填充。
- 右连接 :和左连接相反,但极少使用,因为交换左连接左右表顺序即可实现右连接效果。
内连接
inner join … on
将同一个数据库中的多张表链接
语法:select …… from 表1 inner join 表2 on 关联字段
关联字段可以为空
为了测试连接表,我们先来创建一个新表进行连接测试
insert into 寻觅的年龄连接表 values
(0, '小屁孩'),
(6, '糟老头子')
;
我们直接连接两表进行测试(数据过多,这里只查询序号16以后的)
select * from 寻觅的测试表 inner join 寻觅的年龄连接表;having 序号>16;
这时候会将两表进行笛卡尔积。(人话:将两表中的数据一一匹配对应,然后显示输出)
这个数据实际作用并不大,我们很少会用到
我们一般使用on将两表中的一个字段进行管理查找,如下
select * from 寻觅的测试表 as 测试 inner join 寻觅的年龄连接表 as 年龄 on 测试.年龄 = 年龄.年龄;
左连接
left join
以左表为基准,将右表并入左表中
select * from 寻觅的测试表 as 测试 left join 寻觅的年龄连接表 as 年龄 on 测试.年龄 = 年龄.年龄;
子查询
SQL语句支持子查询,也就是嵌套查询,比如我们查询年龄最大的女生,首先我们要查找女生,然后在其中找年龄最大的一个。
虽然你可以使用select id,max(年龄) from 寻觅的测试表 where 性别='女';
来查询,但是这样只能查询出年龄这一个数据,你要是想知道这个女生的id或者姓名,都是无法实现。如果你想添加group_concat来查询会发现其他数据会发现输出的结果并不是我们想要的select max(年龄),group_concat(姓名,'-',序号) from 寻觅的测试表 where 性别='女';
这时候我们通过子查询就可能快速解决问题。
select * from 寻觅的测试表 where 年龄=(select max(年龄) from 寻觅的测试表 where 性别='女') and 性别 = '女';
常用单词汇总
单词 | 在数据库中的作用 |
---|---|
insert | 插入,数据库增加数据 |
into | 向,数据库增加数据指定目标表 |
values | 值,数据库增加数据指定值 |
from | 从,数据库查询指定表 |
as | 作为,起别名 |
distinct | 分离,查询数据库去重 |
where | 哪里,条件查询 |
rlike | 使用正则表达式 |
between … and … | 在…还有… ,连续范围查找 |
group by | 分组依据,在分组的时候使用 |
group_concat | 分组后的组内信息 |
having | 对分组后的数据筛选 |
order by | 排序,从大到小desc |
inner join … on | 内部连接…在 ,内连接两个数据表时使用,将inner替换为(left ,right)为左右连接 |