MySQL表中数据基本操作
1.表中数据的插入:
1.insert
insert [into] table_name [(column [,column]...)] values (value_list) [,(value_list)] ...
创建一张学生表:
1.1单行指定列插入:
insert into student (name,qq) values (‘张三’,’1234455’);
values左侧为要插入的列,右侧为插入对应列的数据。
1.2全列插入
也可以省略values左侧,表示全列插入,对表中每一列都需要指定数据。
insert into student values (10,’李四’,’12355555’);
单行插入和全列插入的into都可以进行省略。
1.3多行插入:
在一次insert语句后用逗号分隔,可以继续进行数据插入。
例:
2.插入否则更新
在进行数据插入时,可能会遇到主键冲突或者唯一键冲突,导致数据插入失败,因此可以选择性的进行同步更新操作。
insert ... on duplicate key update column=value [,column=value] ...
例如:
insert into student values (1,’张三三’,’11111111111’) on duplicate key update name=’张三三’,qq=’11111111111’;
表示插入数据,若存在键值冲突,则将插入数据转为对表中发生冲突的数据进行修改。若不存在键值冲突,则正常进行插入。
3.插入否则替换
当插入的数据出现冲突时,将表内数据进行替换,若没有冲突,则直接插入。
例:
2.表中数据的查询:
- select
- 1全列查询:
select * from student;
- 2指定列进行查询:
select id,name from student;
1.3在select时,可以进行运行操作:
如:select id,name,10+10+10 as result from student;
其中10+10+10 as result 表示将运算结构用result重命名的列表示,也可以直接使用:
也可以不带as:
- 4在select时还可对列进行重命名:
- 5结果去重:
select distinct name from student;
对选择的指定列进行去重筛选
2.where条件
通过比较运算符进行筛选
null就是null,和零无关,不能参与数字/字符比较。
判断是否为null用is null 或者is not null。
逻辑运算符:
通过运算符进行筛选:
id<12:
10<=id<=12:
也可以用between and:
id=1或者10,11:、
3.模糊匹配:
like ---找姓刘的同学,和李某(某代表只有一个字):
where 后面可以跟逻辑计算,但是不能对在select中重命名的列进行计算,因为是先执行from再执行where,最后执行select。
并且,不能在where后面的筛选条件进行重命名。
4.结果排序--order by
asc为升序(从小到大)
desc为降序(从大到小)
默认为asc排升序
没用order by字句的查询,返回的顺序是为定义的,不能依赖这个顺序。
例:
将id按升/降序显示:
null值比任何值都小。
order可以对select时使用的重命名进行排序,因为要对表结构进行排序,先要有合适的数据---由select进行筛选
5.筛选分页结果---limit
select ... from table_name [where ...] [order by ...] limit n;
默认起始下标为零表示从零开始,筛选n条结果;
select ... from table_name [where ...] [order by ...] limit s,n;
从s开始,筛选n条结果
例:
当对未知表进行查询时,最好加一条limit 1,避免因为表中数据过大,查询全表数据导致数据库卡死。
3.表中数据的更新
update:
update table_name set column=expr[,column =expr...]
[where ...] [order by ...] [limt ...]
对查询到的结果进行列值更新----根据where查询到的结果进行更新
例:
也可以同时改变多个值:
也可以配合order by,limit使用,将id为前三名的name都改为张三:
4.表中数据的删除:
1.delete:
delete from table_name [where ...] [order by ...] [limit ...]
例:
或删除整张表的数据:
delete from table_name;
若表中有auto_increment类型的列,其值不会因为数据的删除而发生改变。
2.截断表
truncate table_name
删除表中所有数据,同时也将auto_increment计算器的值置为零。
truncate是直接清空表数据,不走事物,无法回滚----不会记录在日志。
5.插入与查询的组合使用:
insert into table_name [(column,[,column ...])] select ...
将select后的结果进行插入
实际使用:对表中数据进行去重,将去重后的数据插入到新表:
创建一张和student一样的表:
注意:只有但id,name,qq都相同时才会进行去重,若对指定列去重,会使列显示不完整,导致插入失败。
去重完成后,可以通过rename进行替换。
6.聚合函数:
例子:
count:
select count (*) from student; ---统计数据个数
也可以对count(*)做重命名:
也可以先去重再统计:
sum:
avg:
max:
min:
7.分组查询
在select中使用group by子句可以对指定列进行分组查询。
实际分组是通过指定列中行的不同信息进行分组,组内的指定列的行信息相同。
------分组的目的是为了对分组后的组使用聚合函数进行查询。
select column1,column2,...from table group by column;
例:
建立表并向其中插入数据:
按组筛选最高工资和平均工资:
也可以加上属于哪个组:
分组,就是把一组按一定条件拆成了多个组,进行各自组内的统计。
group by 不止可对一列进行分组,可以同时对多列进行筛选,将多列行信息相同的数据放在一组进行统计。
having和group by联合使用:
对group by 后经过了聚合统计的结果进行条件筛选。
having 和where的区别?
where是对具体的任意列进行筛选,having是对分组聚合之和的结果进行筛选--------他们的条件筛选的阶段是不同的。
可以通过
select 列名,avg(列名) from 表名 where ... group by ... having ...
来分析:
- 执行from找到表中所有数据
- 通过where来筛选
- 将where筛选之后的数据交给group by分组
- 将分组之后的各组交给聚合函数(avg)进行统计,重命名等工作
- 将结果交给having进行条件筛选
不止开始创建的表为表,经过where筛选后的也是表,经过分组后的也是表。。。。
mysql一切皆表。