日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql复杂操作

發布時間:2024/9/20 数据库 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql复杂操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

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 );

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;???????

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;

?

轉載于:https://my.oschina.net/u/1771585/blog/472242

總結

以上是生活随笔為你收集整理的mysql复杂操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。