数据操作,DML(数据操纵语句)(2019.7.27号更新了查询)

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语句的复杂性。
2.删除记录 具体示例
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语句判断,所以效率低。
3.更新记录 具体示例
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];
4.查询记录 具体示例
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
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值