增加

当前已有数据库的表为

	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 寻觅的测试表;
在这里插入图片描述

查询时消除重复行和给起别名

  1. 消除重复行
    select distinct 字段 from 表名;

  2. 起别名
    select 字段 as 名字;

例:select distinct 姓名 as 我是别名 from 寻觅的测试表;
在这里插入图片描述

条件查询

语法:select …… from 表名 where ……

比较运算符

运算符 作用
> 大于
< 小于
>= 大于等于
<= 小于等于
= 等于
!=或<> 不等于

例:

  1. select distinct 年龄 from 寻觅的测试表 where 年龄 > 5;
  2. select distinct 姓名 from 寻觅的测试表 where 年龄 <> 0;
  3. select distinct 姓名 from 寻觅的测试表 where 年龄 != 0;

进行测试
在这里插入图片描述

逻辑运算符

  1. 逻辑和: and 同时满足

  2. 逻辑或: or 满足一个条件即可

  3. 取反: not 不满足条件即可
    例:

    1. select * from 寻觅的测试表 where 年龄>3 and 性别=3;
    2. select * from 寻觅的测试表 where 年龄>3 or 性别=3;
    3. select * from 寻觅的测试表 where 年龄>3 and not 性别=3;

在这里插入图片描述

模糊查询

like

  1. ==%==替换任意多个
  2. ==_==替换一个
    例:
    1. select * from 寻觅的测试表 where 姓名 like '%寻_觅%';
    2. select * from 寻觅的测试表 where 姓名 like '%寻%觅%';

在这里插入图片描述

rlike(正则表达式)

模糊查找可以直接使用正则表达式来编写,如果不知道正则表达式是什么可以查看正则表达式学习链接
select * from 寻觅的测试表 where 姓名 rlike '^寻.*';

范围查询

  1. in(数据,……)
    一个非连续的范围内
    例:select * from 寻觅的测试表 where 年龄 in(0,3,5);
  2. between … and …
    一个连续的范围
    例:select * from 寻觅的测试表 where 序号 between 8 and 12;
    在这里插入图片描述

空判断

  1. is null 判断空
    例:select * from 寻觅的测试表 where 序号 between 8 and 12 and 身高 is null;
  2. is not null 判断非空
    例:select * from 寻觅的测试表 where 序号 between 8 and 12 and 身高 is not null;
    在这里插入图片描述

聚合函数

聚合函数添加在select之后即可
语法:select 聚合函数(字段) from 表名;

聚合函数 作用
count 总数(不是求和,输出一共有多少组数据)
max 最大值
min 最小值
sum 求和(将数据相加)
avg 平均值
round 四舍五入(格式为round(数据,保留小数位数))

实例:

  1. select count(年龄) from 寻觅的测试表;
  2. select max(年龄) from 寻觅的测试表;
  3. select sum(年龄) from 寻觅的测试表;
  4. select avg(年龄) from 寻觅的测试表;
  5. 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 中有三种连接方式

  1. 内连接:当只有两表中都存在此数据才会对齐连接。
  2. 左连接:以左表作为基准,左表中存在,右表不存在的数据会已null填充。
  3. 右连接 :和左连接相反,但极少使用,因为交换左连接左右表顺序即可实现右连接效果。

内连接

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)为左右连接