增删改数据
插入数据
- 基本方式
-- 语法
insert into 表名 (字段1,,字段2,字段3,.....字段n) values (值1,值2,值3,...值n)
-- 例如向student表中添加一条数据
insert into student (id,name,age) values (1,"小明",18)
注意:
1. 插入数据时,列名和值要一一对应(包括数量 顺序 类型)
2. 插入数据时,数值以外的类型需要使用引号引起来,推荐使用单引号
3. 所有列的值都可以传入字符串类型的值,MySQL底层有隐式转换机制
4. 当一列中不需要传入值的时候,可以使用null值代替
- 批量插入
-- 语法
insert into 表名 (字段1,字段2,...字段n) values (值1,值2,...值n),(值1,值2,...值n),(值1,值2,...值n)
-- 例如向student表中插入三条学生信息
insert into student (id,name,age) values (1,'小明',20),(2,'小王',20),(3,'小李',20)
- 省略列名
注意:值的数量一定要保证跟列的数量一致,如果值中没有对应的列,使用null补齐
-- 语法
insert into 表名 values (值1,值2,...值3)
-- 例如向student表中添加数据
insert into student values (1,'小明',20)
-- 错误方式
insert into student values (1,'小明')
-- Column count doesn't match value count at row 1 在保存数据的时候, 值和列数量上不匹配
删除数据
-- 语法
delete from 表名 [where 条件字段 = 值]
-- 实例 删除 student表中name为小明的记录
delete from student where name = '小明'
注意:删除语句中如果不加条件,则会将所有的数据都删除!!
修改数据
-- 语法
update 表名 set 字段1 = 值1,字段2 = 值2 [where 条件字段 = 值]
-- 实例
-- 先根据where条件查找到对应的数据,然后修改对应的字段的数据
update student set name = '小明',age = 20 where name = '小王'
update student set name = '小李' where id = 3
注意:
1.修改语句中如果不加条件,则将所有数据都会被修改
2.set中没有处理的字段是不会被修改的
查询数据
简单查询
- 查询所有列
-- 语法
select * from 表名
-- 实例 查询student表中的所有学生信息
select * from student
- 查询部分列
-- 语法
select 列名1,列名2,...列名3 from 表名
-- 实例 查询student表中学生的姓名和对应的年龄
select name,age from student
- 去重 distinct
-- 语法
select distinct 列名 from student
-- 实例 id和name都相同的只显示一个
select distinct id,name from student
- 四则运算
-- 语法
select 列(四则) from student;
-- 实例 在查询出来所有的学生数学分数上加10分
select name,math,math+10 from student1;
- 空值处理
-- 语法
1. null跟其它值进行四则运算,得到结果都是null
2. ifnull(列,默认值) 当指定的列的值为null的时候,使用后面的默认值进行替换
-- 实例
select name,chinese+math+english from student;
select name,chinese+math+ifnull(english,0) from student;
- 别名
as后面跟别名 as可以省略
-- 语法
select 列 [as] 别名 from 表名
-- 实例
select name,chinese+math+english as total from student
# name 起别名 '名字' chinese+math+ifnull(english,0) 起别名 total
select name '名字',chinese+math+ifnull(english,0) total from student1;
条件查询
- 关系运算符
-- 语法
select * from 表名 where 条件( = >= <= != <>)
-- 实例
#查询年龄等于20的学生
select * from student where age = 20;
#查询age不等于20的学生
select * from student where age != 20;
select * from student where age <> 20;
#查询math分数大于80的学生
select * from student where math > 80;
#查询math分数小于或等于80的学生
select * from student where math math <= 80;
- 逻辑运算符
-- 语法
and 并且
or 或者
-- 实例
-- 查询age等于20岁的学生并且math分数大于80分的学生
select * from student where age = 20 and math > 80;
-- 查询age等于20岁的学生或者math分数大于80分的学生
select * from student where age = 20 or math > 80;
-- 查询id是1或3或5的学生
select * from student where id = 1 or id = 3 or id = 5;
-- 查询english成绩大于等于77,且小于等于87的学生
select * from student where english >= 77 and english <= 87;
- 范围关键字
-- 语法
#字段 in (值1,值2,值3,...值n) 表示字段 = 集合中任意一个都可以
#字段 not in (值1,值2,值3,...值n) 表示字段不在集合中才可以
#字段 between 开始值 and 结束值 查询的字段的值要在 [开始,结束]
#字段 not between 开始值 and 结束值 查询的字段的不值要在 [开始 , 结束]
-- 实例:
-- 查询id是1或3或5的学生
select * from student where id in (1,3,5);
-- 查询id不是1或3或5的学生
select * from student where id not in (1,3,5);
-- 再次查询english成绩大于等于77,且小于等于87的学生
select * from student where english between 77 and 87;
- null关键字
-- 语法
is null 为空
is not null 不为空
#注意:null是不能跟字段进行关系运算符匹配( 不能 =null != null)
-- 实例
#查询英语成绩为null的学生
select * from student where english is null;
#查询英语成绩不为null的学生
select * from student where english is not null;
- 模糊匹配
1.like
2.rlike 正则表达式
-- 语法
字段 like ''
% 匹配0个或者多个字符
_ 匹配一个字符
-- 实例
#查询姓马的学生
select * from student where name like '马%'
#查询姓名中包含'德'字的学生
select * from student where name like '%德%'
#查询姓马。且名字是三个字的学生
select * from student where name like '马__'
高级查询
- 排序
1.asc ascending
2.desc descending
-- 语法
order by 字段1 [asc|desc],字段2 [asc|desc]
注意:null字段在排列时,按照最小值处理
-- 实例
#查询所有数据,使用年龄降序排序
select * from student order by age desc;
#查询所有数据,在年龄降序排序的基础上,如果年龄相同再以数学成绩降序排序
select * from student order by age desc,math desc;
#排序有null的值
select * from student order by english desc; -- 英语成绩为null的数据排在最下面
- 结果截取 分页
-- 语法
limit 数据记录的索引,截取多少条
-- 实例
#查询学生表中的数据,从第三条开始显示,显示4条
select * from student limit 4,2;
#查询学生表中的数据,显示前四条
select * from student limit 0,4;
select * from student limit 4; #如果从0开始截取,开始索引可以省略
- 聚合函数
-- 功能
对一列数据进行计算,返回一个结果,忽略null值
对一列数据,Mysql可以统计出: 个数count 总和sum 平均数avg 最大值max 最小值min
-- 语法:
select 聚合函数(字段) from 表名
-- 实例
#查询学生总数
select count(*) from student2;
#查询数学成绩总分
select sum(math) from student2;
#查询数学成绩平均分
select avg(math) from student2;
#查询数学成绩最高分
select max (math) from student2;
#查询数学成绩最低分
select min(math) from student2;
- 分组
-- 语法
select 分组列名,聚合函数() from 表名 group by 组 GROUP BY 分组后的筛选条件
分组,一般都是和聚合函数联合使用
-- 实例
#查询所有学生, 按性别分组, 统计每组的人数
select sex,count(*) from student2 group by sex;
#查询年龄大于25岁的人, 按性别分组, 统计每组的人数
select sex,count(*) from student2 where age>25 group by sex ;
#查询男女的数学平均分 只统计年龄大于40的
select sex,avg(math) from student2 where age>40 group by sex ;
- 过滤
-- 语法
group by 分组 having 过滤条件
1. 过滤,一般都是和分组联合使用
2. 分组之前的条件过滤使用where 分组之后的条件过滤使用having
-- 实例
#查询年龄大于25岁的人,按性别分组,统计每组的人数,并只显示性别人数大于2的数据
select sex,count(*) from student2 where age > 25 group by sex having count(*) > 2;
小结
- 高级查询的顺序
1. 排序:order by 列 desc
2. 截取:limit 开始,几个
3. 集合函数:count(列)
4. 分组:group by 列
5. 过滤:having 过滤条件
6. 普通条件:where
select 聚合函数() from 表 [where 条件] [group by 分组] [having 过滤] [order by 排序] [limit 截取]