1、主键冲突。
定义:当主键存在冲突(Duplicate key)时候,可以选择性的进行处理:更新和替换。
先查询一下student表。由表可以得知,id为主键,自增长。
可以看出 student 表中,已经有1个id为1的记录了,接下来我再插入一次id为1的编号的数据,就会显示主键冲突,插入数据失败。
这个时候,主键冲突就出现了。
a)、更新。
语法:insert into 表名字[字段列表(一定要包含主键)] values (字段值列表) on duplicate key update 字段 = 新值;
例子:将【student】表中的编号为1的姓名修改成李四。
insert into student(id,name,age) values(1,'李四',22) on duplicate key update name = '李四'; -- 这个地方值更改了name,没有更改age。
insert into student values(1,'李四',15) on duplicate key update name = '李四'; -- 这个地方值更改了name,没有更改age。
insert into student(id,name,age) values(1,'李四',22) on duplicate key update name = '李四',age = 22; -- name 与 age 都跟着改变了。
b)、替换。
语法:replace into 表明字[字段列表(一定要包含表名字)] values(字段列表值);
例子:将【userinfo】表中的id为1的name改写成王五,age改成30。
replace into student(id,name,age) values(1,'王五',30);
2、蠕虫复制。
从已有的数据中获取数据,然后将数据又进行新增操作,设局成倍成倍的增加。
表创建高级操作:从已有表创建新表(只复制表机构,不复制表内容)。
语法:create table [if not exists] 新表名 like 数据库.表名字(如果是同一个数据库,数据库.可以省略);
意义:
a、从已有表拷贝数据到新表中。
b、可以迅速让表中的数据膨胀到一定的数量,测试数据表的压力及效率。
例子:使用表创建高级操作创建一个名叫【student2】的新表。
create table if not exists student2 like student;
蠕虫复制数据语法:insert into 表名字[字段列表] select 字段列表/* from 数据表名;
例子:将【student】表中的数据通过蠕虫复制的方式复制到student2表中。student表中有5条数据
insert into student2(name,age) select name,age from student;
在执行一下sql语句就又复制5条数据到student2表中了。
还可以蠕虫复制自己表中的数据:insert into student2(name,age) select name,age from student2;
3、更新数据。
基本语法:update 表名 set 字段名 = 值 [where条件];
高级语法:update 表名 set 字段名 = 值 [where条件] [limit 更新数量];
例子:将【student2】表中的前5条age字段值更改为100。
4、删除数据。
基本语法:delete 表名 set 字段名 = 值 [where条件];
高级语法:delete 表名 set 字段名 = 值 [where条件] [limit 删除数量];
例子:删除【student2】表中的前5条数据。
delete from student2 limit 5;
5、Truncate。
如上面的设置,如果表中的主键是自增长,那么删除之后,自增长不会还原。
如果想要重置自增长,只能清空表(不会改变表结构)。
语法:truncate 表名字;
再次插入数据的时候,主键从1开始。
6、查询语句。
基本语法:select 字段列表/* from 表名 [where条件];
完整语法:select [select选项] 字段列表 [字段别名] /* from 数据源 [where条件子句] [group by子句] [haviing子句] [order by子句] [limit子句];
6.1、select 选项。
对查出来的结果的处理方式,有两种:
a)、all:默认的,保留所有的结果。
例子:查询【查询stuent】表中的所有数据。
select all * from student;
b)、distinct:去重,查出来后的结果,将重复的给去除掉(所有字段都相同)。
例子:查询【my_product】表中的重复值去重。
如果主键自增长,就不能使用所有列去重了,要使用部分列的形式去去重。
select distinct age from student;
6.2、字段别名。
当数据进行查询出来的时候,有时候名字并不一定满足需求(夺标会有同名字段),这个时候就需要为字段进行重命名了。
语法:字段名 as 别名 / 字段名 别名
例子:为【student】表中的字段添加别名。
select id as 编号,name 姓名,age 年龄 from student;
6.3、数据源。
数据源:数据的来源,MySql是关系型数据库,关系型的数据库的来源都是数据表,本质上只要保证数据类似二维表,最终都可以作为数据源。
数据源又分为多种:单表数据源、多表数据源和查询语句。
a)、单表数据源。
select * from 表名字;
b)、多表数据源。
select * from student,student2;
select * from student,student2;
多表数据源会形成“笛卡儿积”,从一张表中取出一条记录以后,再去另外一张表中匹配所有记录,而且全部保留(记录数和字段),笛卡儿积其实没什么用,应该尽量避免使用。
c)、子查询。
数据的来源是一种查询语句(查询的结果是二维表)。
语法: select * from (select * from 表名字) as 别名(别名不能省);
select * from (select * from student) as stu;
6.4、where 子句。
where 子句用来判断和筛选数据。where 子句的返回结果是 0 或者 1 ,0 代表false,1 代表true。
Where原理:where 是唯一 一个直接从磁盘获取数据的时候就开始判断的条件,从磁盘取出一条记录,开始进行where判断,如果判断的结果成立,则保存到内存中,如果判断失败,则直接放弃。
一般情况下,where 都会结合着以下判断条件使用。
比较运算符:>(大于)、<(小于)、>=(大于等于)、<=(小于等于)、<>(不等于)、!=(不等于)、like、between and(区间)、in(包含)、not in(不包含);
逻辑运算符:&&(and)、||(or)和!(not)。
7、Group by子句。
group by 是分组的意思,根据某个字段进行分组,相同的放一组,不同的放一组。
基本语法:group by 字段名 [asc|desc];
a)、单字段分组。
例子:根据【student2 】表的sex字段进行分组。
先查一下student2表中的数据。
select * from student2 group by sex;
分组后,得到的数据是2条,其实一般情况下只单纯地分组是没什么意义的。一般都会配合着一系列统计函数配合着使用。
Count():统计分组后的记录数,每一组有多少条记录。count里面可以有两种参数:*代表统计,字段名代表统计对应的字段(Null不统计,切记)。
Max():统计每组中的最大数。
Min():统计最小记录。
avg():统计平均值。
Sum():统计和。
例子:求分组后的总记录数,age字段的最大值,age字段的最小值,age字段的平均值,age字段的总和。
从上图可以看出,分组后的女生总数有3个,年龄最大的是28,最小的是20。分组后的男生总数有6人,年龄最大的是25,年龄最小的是18。
b)、多字段分组。
先根据一个字段进行分组,然后对分组后的结果再次按照其他字段进行分组。
c)、group_concat()。
可以对分组的结果中的某个字段进行字符串连接。
语法:group_concat(字段名);
例子:根据【student2】表中的sex字段进行分组,并得到分组后的name字段的值。
select sex, count(*), group_concat(name) from student2 group by sex;
8、Having子句。
与where子句一样,是进行条件判断用的。
where是针对磁盘数据进行判断,进入到内存之后,会进行分组操作,分组结果就要使用having子句进行处理,having能做where能做的几乎所有事情,但是where却不能做having能做的事情。
a)、分组统计结果或者统计函数都只有having能够使用。
例子:所有班级大于2的人数。
select c_id,count(*) from student2 group by c_id having count(*) > 2;
如果使用where,就会报错。
b)、having能够识别字段别名,where 不能(where是从磁盘中取数据,而磁盘中的数据没有别名,只可能是字段名,别名是字段进入到内存以后才会产生的)。
例子:select c_id,count(*) as tt from student2 group by c_id having tt > 2;
用where就会报错。select c_id,count(*) as tt from student2 group by c_id where tt >2;
9、Limit子句。
Limit子句是一种限制结果的语句,限制数量。
有两种使用方式:
a)、只用来限制长度。
语法:limit 长度;
例子:查询【studnet2】表中的前3条数据。
select * from student2 limit 3;
b)、主要用来实现分页的。
语法:limit 起始位置, 长度;(起始位置从0开始)。
例子:查询【student2】表中的第3条和第4条的数据。
select * from student2 limit 2,2;
10、Order by子句。
升序降序。
语法:order by 字段名 [asc|desc]; 默认是升序。
例子:根据【student2】表中的age字段,进行升序和降序操作。
End。