学会Mysql第二天
- 2020 年 4 月 11 日
- 筆記
表数据的基本操作
数据的插入
insert into 表名 [(字段列表)] values [(对应字段列表)]; insert into 表名 values (对应表结构); insert into teacher (name,age) values ("Jerry",21);
多数据的插入
insert into my_insert [(字段列表)] values(值列表),(值列表)...; --在原有基础上,跟多个值列表即可实现插入多条记录
数据的查询
查询全部数据
select * from 表名; select * from teacher; --查询teacher表中所有数据
查询部分数据
select 字段列表 from 表名; select name,age,address from teacher --从teacher表中查找所有人的姓名,年龄和住址。
带条件的查询
select *字段列表 from 表名 [where条件]; select * from teacher where age>30; --从teacher表中查找年龄大于30的所有人的信息 select name,adddress from teacher where age>30; --从teacher表中查找年龄大于30的人的姓名和地址
数据的删除
delete from 表名 [wehre条件]; delete from teacher where age<30; 删除teacher表中年龄小于30的所有人的信息。
如果没有where条件,则默认删除表中的所有数据
数据的更新
update 表名 set 字段名=新值 [where条件] update teacher set age=30 where sex="男"; --将teacher表中所有的男性的年龄都改为30
update 表1,表2,... set 表1.列1,表2.列2,...where条件 --可以同时修改多个表中的数据
查询语句
完整的SQL查询指令: select select选项 字段列表 from 数据源 where条件 group by 分组 having 条件 order by 排序 limit 限制
select 选项
系统如何对待查询得到的结果
all 保留所有的结果
distinct 去除全部重复的记录
union all 不去除重复的
字段列表
有时候需要从多张表获取数据,当遇到同名字段的时候,需要用到别名。 基本语法: 字段名 as 别名
from 数据源
实体二维表
from是为前面的表提供数据源,MySQL只要求数据源是一个符合二维表结构的数据源即可。(多表获取数据) 基本语法:from 表1,表2,表3
select * from my_date,my_simple,my_auto; --查询结果为笛卡尔积(尽量避免)
多表数据
从多张表获取数据,基本语法:
from 表1,表2.... select * from my_int,my_set;
结果:是两张表的记录相乘,字段数拼接
本质:从第一张表取出一条记录,去拼凑第二张表的所有记录,保留所有结果。得到
的结果叫笛卡尔积(尽量避免 )
动态数据
from跟的不是一个实体二维表,而是一个从其他表中查询得到的结果集(子查询) 基本语法:from (select 字段列表 from 表) as 别名 子查询的时候,作子查询的表一定要有别名
select * from (select name,id from my_simple) as int;
where子句
从数据表获取数据的时候进行条件筛选 where用运算符进行条件判断。
Group by 子句
根据指定的字段将数据进行分组,目的是为了统计
group by 将数据分组后,只会显示每组的第一条记录
select * from my_date group by sex; --将表按照性别进行分组
一些统计函数(聚合函数)
count() 统计字段数量,不统计NULL。 avg() 求平均值 sum() 求和 max() 求最大值 min() 求最小值
Group_concat():为了将分组中指定的字段进行合并(字符串拼接)
使用聚合函数统计
select id,max(age) from my_date group by class; --按照年级分组,查询每个年级年龄最大的人
group_concat() 字符串拼接,将指定字段进行拼接
多分组
将数据按照某个字段进行分组之后,对已经分组的数据进行再次分组
基本语法
group by 字段1,字段2;//先按照字段1进行排序,之后将结果再按照字段2进行排序
更新数据
1.数据更新一般是随条件更新,很少全部更新 2.在更新数据的时候,没有条件的时候,会是全表更新,可以使用limit限制更新的数量 update 表名 set 字段名=值 [where 条件] limit 数量
update my_simple set id='1' limit 4; --只更新前四条记录
删除操作
1.删除数据时,尽量不要全部删除,应该使用where条件限定 2.使用limit限制删除记录的数量
delete from my_simple limit 4; --删除前四条数据
- delete删除操作无法重置自增长auto_increment
清除自增长的语法:
truncate 表名
新增数据
多数据插入
只要写一次insert指令,可以直接插入多条记录,(写上多个值列表)
insert into my_insert [(字段列表)] values(值列表),(值列表)...; --在原有基础上,跟多个值列表即可实现插入多条记录
主键冲突
在有的表中使用了业务主键,但是插入数据时又不确定主键是否存在。
主键冲突的解决方案
1.主键冲突更新 insert into 表名 [(字段列表)] values (值列表) on duplicate key update 字段=新值(更新的是主键之外的新值)
insert into my_student values ('stu001','小婷') on duplicate key update stu_name='小婷';
2.主键冲突替换 当主键冲突之后,删除数据重新插入 replace into 表名 [(字段列表)] values (值列表);
replace into my_stu values('stu001','小婷');
replace的效率比insert的效率要低。
蠕虫复制(一般用来测试表的压力,测试表的效率或者用于数据转移)
蠕虫复制的原则:一分为二,成倍增加。 从已有数据中选择数据,插入到表中。 insert into 表名 [(字段列表)] select */字段列表 from 表
insert into my_copy select * from my_copy; --从自己表中进行蠕虫复制