DML 操作是指对数据库中表记录的操作,主要包括记录插入、删除、更新、和查询,是开发人员日常使用最频繁的操作。
1.插入记录
1.插入单条记录
insert into tablename(field1,field2,...,fieldn) values (value1,value2,...,valuen);
//也可以不用指定字段,但是values后边的顺序应该和字段的排列顺序一致;
insert into tablename values (value1,value2,...,valuen);
2.插入多条记录
insert into tablename(field1,field2,...,fieldn)
values
(record1_value1,record1_value2,...,record1_valuen),
(record2_value1,record2_value2,...,record2_valuen),
...
(recordn_value1,recordn_value2,...,recordn_valuen);
2.1.注
.含可空字段、非空但有默认值的字段、自增字段,可以不用在insert后边的字段列表里出现,values后边
只写相应字段名称的value。这些没写的字段可以自动设置为null、默认值、自增下的一个数字,这样在某
些情况下可以大大缩短SQL语句的复杂性。
1.删除单表记录
delete from tablename [where condition];
2.删除多表数据
delete t1,t2,...,tn from t1,t2,...,tn [where condition];
2.1.注
.无论是单表还是多表,不加where条件将会把表中所有的记录全部删除,操作小心。
3.清空表
truncate table tablename;
4.truncate与delete语句的区别
.返回值:truncate返回值为0,delete返回值是被删除的记录条数。
.自增:truncate会重置为1,delete会保留最大自增值。
.效率:truncate相当于重新建表,所以效率高,delete会扫描全表,并根据where语句判断,所以效率低。
1.更新单条记录
update tablename set field1=value1,field2=value2,...fieldn=valuen where [where condition]
2.更新多条记录,mysql并没有提供直接的方法来实现批量更新,但是可以用点小技巧来实现。
update tablename set
myfield = case id
when 1 then 'value'
when 2 then 'value'
when 3 then 'value'
end
where id in (1,2,3);
3.更新多条多列
update tablename set
myfield1 = case id
when 1 then 'value1'
when 2 then 'value1'
when 3 then 'value1'
end,
myfield2 = case id
when 1 then 'value2'
when 2 then 'value2'
when 3 then 'value2'
end,
where id in (1,2,3);
4.更新多表
update t1,t2,tn set t1.field1=exprn,tn.fieldn=exprn [where condition];
1.基本语法
select * from tablename [where condition];
.比较运算符:=、>、<、>=、<=、!=。
.多条件之间可以用or或and。
.模糊查询:like %元字符%,用 _ 或 % ,一个_匹配一个(可以多个_),一个%匹配数量不限制。
2.查询不重复记录
select distinct field from tablename;
.distinct关键字可以配合聚合函数使用
.举个栗子:select max(distinct field) from tablename;
3.排序
select * from tablename order by [field1 [asc/desc],field2 [asc/desc],...fieldn [asc/desc]];
3.1.注
.asc 升序,desc 降序,order by 后边可以跟多个不同的排序字段,并且每个字段都可以用不同的排序顺序。
.如果只有一个排序字段,则这些相同的数据将会无序排列。
.个人理解:如果先按照field1来排序,但是第5到第10条数据一样,那么这5条记录就会按照field2来排序,并以此类推。
4.获取部分数据
select * from tablename [limit offset_start,row_count];
4.1.注
.offset_start表示记录的起始偏移量,row_count表示显示的行数。
.默认偏移量为0,只需要些记录行数就行。
5.聚合函数
select * fun_name from tablename from
[where condition]
[group by field1,field2,...fieldn]
[with rollup]
[having condition];
5.1五个聚合函数
.count(*) 返回被选列行数(包括null)
.count(field) 返回某列的行数(不包括null值)
.sum(field) 求和
.max(field) 求最大值
.min(field) 求最小值
.avg(field) 求平均值
5.2.注
.fun_name表示要做的聚合操作,也就是聚合函数,常用的有。
.group by 关键字表示要分类的字段。
.with rollup 表明是对分类聚合后的结果是否进行再汇总。
.having 表名是对分类后的结果再进行条件的过滤。
.where是在聚合前进行过滤,having是对聚合后的结果进行过滤,如果逻辑允许,尽可能的先用where进行过滤,
因为结果集减少,聚合的效率会提高很多。
6.表连接
6.1.内连接:
... from tab1 inner join tab2 on condition ...
6.2.外连接
左连接:... from tab1 left join tab2 on condition ...
右连接:... from tab1 right join tab2 on condition ...
6.3.注:
.内连接和外连接的区别是:内连接仅会选出两张表想匹配的记录,而外连接外会选出其他不匹配的记录。
.外连接
.左连接:包含所有的左边表的记录,甚至是右边表中没有和它匹配的记录。
.右连接:包含所有的右边表的记录,甚至是左边表中没有和它匹配的记录。
6.4.个人理解:
.左右表:join左边的表就是左表,右边的表就是右表,
.获取记录:如果用左连接,就是将左表做为主表,右表为从表,获取主表中所有的记录,
匹配从表中的记录,反之亦然。
6.5.where中使用连接语句(这种目前我只会两个表连接,弄懂了就补充 ^(* ̄(oo) ̄)^ )
select * from tab1, tab2... [where condition1 [and[or]] condition2.....
6.5.1.相关资料:
.where子句中使用的连接语句,在数据库语言中,被称为隐性连接。inner join 子句产生的连接称为
显性连接。(其他JOIN参数也是显性连接)where和inner join产生的连接关系,没有本质区别,结果
也一样。
6.6.全连接(这个暂时不会弄)
... from tab1 full join tab2 on condition ...
6.6.1.注
全连接结合的左,右外连接的结果。连接表将包含的所有记录来自两个表,并使用NULL值作为两侧缺失匹
配结果
7.子查询
select * from tab1 where field operator (select * from tab1 [where condition]);
7.1.注
.operator操作的关键字有in、not in、=、!=、exists、not exists等。
.表连接在很多情况下用于优化子查询
.insert、delete、update句中可以使用子查询。[具体示例,待更新...]。
8.记录联合
select * from tab1
union/union all
select * from tab2
...
union/union all
select * from tabn;
8.1.union和union all 的主要区别
.union all 结果集直接合并在一起
.union是将union all后的结果进行一次distinct,去除重复记录后的结果.。
改变自增值 ALTER TABLE tablename auto_increment = 3