学会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;  --从自己表中进行蠕虫复制