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