MySql稍微高级一点的操作。


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。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM