mysql複雜操做

1.聯合查詢—union:
  把多條select語句的結果合併到一塊兒的操做。
  (select * from table1 order by days limit 3,2)
  union [all]
  (select * from table2 order by days limit 5)
  使用場合:獲取數據的條件,出現邏輯衝突,或者很難在一個邏輯表內實現,就能夠拆分紅多個邏輯,分別實現並將結果合併到一塊兒。
 
  主要:使用union時,要想子語句結果實現排序,必須知足一下兩個條件:
  a.子語句必須包含在子(小)括號內;
  b.子語句的order by必須配合limit的配合。
  緣由:union在作子語句時,會對沒有limit子句的order by實施優化。
 
2.子查詢
  使用場景:查詢的結果須要兩次查詢,而且第二次的查詢須要以第一次查詢的結果做爲條件。
 
  a.標量子查詢:(做爲條件的查詢結果爲1行1列)
    select * from table1 where days = / > / < / <>  (select max(days) from table1);
  b.列子查詢:(做爲條件的查詢結果爲n(n>=1)行1列)
    select * from table1 wherr days in /=any / any/some / all/ / !all /not in / !any (select max(days) from table1);
    注:1.!any當集合的元素大於1個時,幾乎不能用,程序中不應出現的語法,面試中容易出現;
           2.all、any和some還能夠與除了=、!=以外的運算符配合使用;
  c.行子查詢:(做爲條件的查詢結果爲1行,最好使用limit來確保只有一行):使用(field1,field2)來構建一行
    select * from table1 where (gender,name) = / in (select gender,name from table where name ='XXX' limit 1);
  d.表查詢:(做爲條件的查詢結果爲多行多列)通常是在from位置出現
    select * from (select name,age,days from table where age > 20 ) as tabletemp where name like '李%';
    注;必定要給臨時表取名。
  e.exists查詢:不提供數據,只是判斷條件是否成立;(第27節:還沒看懂?)
    select * from table2 where exits (select * from table1 where id>0 );mysql

3.鏈接查詢(支持同一個表或者多個表不一樣或者本身鏈接想本身的屢次鏈接:)
  a.內鏈接:鏈接的多個數據都存在:leftTable [inner] join rightTable on 鏈接條件(多可鏈接條件能夠在鏈接條件中使用關鍵字where、and) (默認鏈接方式,能夠省略inner)
    例如:select leftTable.name,leftTalble.rigjt,rightTalbe.time from leftTable inner join rightTable on leftTabel.id=rightTable.t_id;
    注:1.內鏈接省略條件的內鏈接佳做笛卡爾鏈接,能夠用coress jion 代替inner jion.
          2.內鏈接的寫法:on(先過濾、再鏈接)、where(先鏈接、再過濾)、using(須要兩個鏈接的字段名徹底一致:using(teacher_id)).
  b.外鏈接:鏈接的多個數據有一個或多個都不存在
    例如:select leftTable.name,leftTalble.right,rightTalbe.time from leftTable left outer join rightTable on leftTabel.id=rightTable.t_id;
    注:1.只能使用on、using做爲鏈接添加,不能使用where做爲鏈接條件;
   
    外鏈接又分爲左外鏈接、右外鏈接,全外鏈接(myql暫時不支持,左外鏈接和右外鏈接union就是全外鏈接);
    左鏈接:當左邊的數據和右邊的數據鏈接不上時候,左邊的數據被保留;
    例如:select * from one left join two where one.id=two.id;
    右鏈接:當左邊的數據和右邊的數據鏈接不上的時候,右邊的數據被保留;
    例如:select * from one right_join two where on.id=two.id;面試

  c.天然鏈接:鏈接中多個內鏈接和外鏈接,即:經過mysql本身的判斷(使用相同字段做爲鏈接條件)完成鏈接,咱們不須要指定鏈接條件。
    內:natural
    外:有分爲左外和右外,左外:natrual left join;右外:natural right join;       sql

4.導出數據:outfile的使用:純數據的備份,
  將數據表保存到指定地址:select * into outfile 文件須要保存的路徑 from 表名 where 查詢條件;
  還能夠只定義數據導出的格式:
  select * into outfile 'e:/amp/three'
  fields terminated by ',' enclosed by 'X' (自定義字段分割符和字段的包裹符)
  lines terminated by '\n' starting by 'start:'(自定義記錄開始符和結束符)
  from teacher_class where t_name = '韓信';
  注意:常規狀況下,記錄是一行一行的顯示的;
        特殊狀況下,導出二進制數據的時候例外,咱們須要使用into dumpfile,能夠避免輸出空格、換行之類的輸出,很適合二進制數據的保存。數據庫

5.導入數據load file(注意數據的格式)
  將文件導出到一個數據表:
  load data in file 須要導入文件的路徑 into table 須要導入到的表名;
 函數

  當須要插入數據的主鍵與已經存在的數據的主鍵發生衝突的時候,我麼可使用一下的語句:(其實就是要執行update操做)
  insert into teacher_class (id,name,age) values
 (13,‘tom’,22)
  on duplicate key update
  name='tom' , age = 22 ;
  這種語法也能夠改爲這樣:
  replace into eacher_class (id,name,age) values
 (13,‘tom’,22)
 
  insert語句還能夠執行select出來的語句:
  insert into teacher_class (name,age)
  select name,age from teacher_class;(這半句代替須要須要插入的值:蠕蟲複製:複製本身數據表中的數據並插入)
  
  delete還能夠配置limit和order by一塊兒來使用,還支持多表同時刪除(update也是):
  模擬外鍵操做:delete from one,two using one join two on one.public_field=two.public_field where one_id = 2;
                          update one join two one.public_field=two.public_field set one_data='X' ,two_data='Y'; 
 
  清除表:truncate table 表名;
  從數據層面,truncat相似於delete;
  不一樣點:1.truncat不會返回數據影響的函數,delete會;
          2.truncat會重建id;
  緣由:truncat是直接刪除整張表,而後重建這張表;delete是逐行刪除。優化

6.視圖操做(支持全部mysql操做):用於在數據庫中建立一張新的虛擬表,用來讀取你想要的信息,同時隱藏了一些你不想讀取的信息。
  1.建立視圖:
  語法:create view view_name as 查詢語句;
  例如:create view view_infor as select id,name,age from t_teachder;
  注:當咱們操做的是視圖的時候,對應的數據表也會發生想應的變化。
  2.刪除視圖:
  語法:drop view [if_exists] view_name;
  3.修改視圖:
  alert view view_name as 查詢語句;
  也能夠給字段從新命名:
  alter view v_teacher(fieldname1,fieldname2) as select id,name from view_name;
 
  視圖還能夠優化mysql操做,所見業務邏輯:
  能夠把每次都須要操做的大表(多是屢次的聯合操做)建立成一個視圖便可達到優化做用:
  即若是每次都要操做這個語句:
  select * from join_teacher_class as tc left join join_teacher as t on tc.t_id=t.id left join join_class as c tc.c_id=c.id;
  能夠把這個語句所產生的查詢結果生成一個視圖,而後查詢這個視圖:
  create view v_table as
  select * from join_teacher_class as tc left join join_teacher as t on tc.t_id=t.id left join join_class as c tc.c_id=c.id; 
  select * from v_table;排序

相關文章
相關標籤/搜索