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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql复杂操作

發(fā)布時(shí)間:2024/9/20 数据库 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql复杂操作 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

1.聯(lián)合查詢—union:
? 把多條select語句的結(jié)果合并到一起的操作。
? (select * from table1 order by days limit 3,2)
? union [all]
? (select * from table2 order by days limit 5)
? 使用場(chǎng)合:獲取數(shù)據(jù)的條件,出現(xiàn)邏輯沖突,或者很難在一個(gè)邏輯表內(nèi)實(shí)現(xiàn),就可以拆分成多個(gè)邏輯,分別實(shí)現(xiàn)并將結(jié)果合并到一起。
?
? 主要:使用union時(shí),要想子語句結(jié)果實(shí)現(xiàn)排序,必須滿足一下兩個(gè)條件:
? a.子語句必須包含在子(小)括號(hào)內(nèi);
? b.子語句的order by必須配合limit的配合。
? 原因:union在做子語句時(shí),會(huì)對(duì)沒有l(wèi)imit子句的order by實(shí)施優(yōu)化。
?
2.子查詢
? 使用場(chǎng)景:查詢的結(jié)果需要兩次查詢,并且第二次的查詢需要以第一次查詢的結(jié)果作為條件。
?
? a.標(biāo)量子查詢:(作為條件的查詢結(jié)果為1行1列)
??? select * from table1 where days = / > / < / <>? (select max(days) from table1);
? b.列子查詢:(作為條件的查詢結(jié)果為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當(dāng)集合的元素大于1個(gè)時(shí),幾乎不能用,程序中不該出現(xiàn)的語法,面試中容易出現(xiàn);
?????????? 2.all、any和some還可以與除了=、!=之外的運(yùn)算符配合使用;
? c.行子查詢:(作為條件的查詢結(jié)果為1行,最好使用limit來確保只有一行):使用(field1,field2)來構(gòu)建一行
??? select * from table1 where (gender,name) = / in (select gender,name from table where name ='XXX' limit 1);
? d.表查詢:(作為條件的查詢結(jié)果為多行多列)一般是在from位置出現(xiàn)
??? select * from (select name,age,days from table where age > 20 ) as tabletemp where name like '李%';
??? 注;一定要給臨時(shí)表取名。
? e.exists查詢:不提供數(shù)據(jù),只是判斷條件是否成立;(第27節(jié):還沒看懂?)
??? select * from table2 where exits (select * from table1 where id>0 );

3.連接查詢(支持同一個(gè)表或者多個(gè)表不同或者自己連接想自己的多次連接:)
? a.內(nèi)連接:連接的多個(gè)數(shù)據(jù)都存在:leftTable [inner] join rightTable on 連接條件(多可連接條件可以在連接條件中使用關(guān)鍵字where、and) (默認(rèn)連接方式,可以省略inner)
??? 例如:select leftTable.name,leftTalble.rigjt,rightTalbe.time from leftTable inner join rightTable on leftTabel.id=rightTable.t_id;
??? 注:1.內(nèi)連接省略條件的內(nèi)連接佳作笛卡爾連接,可以用coress jion 代替inner jion.
????????? 2.內(nèi)連接的寫法:on(先過濾、再連接)、where(先連接、再過濾)、using(需要兩個(gè)連接的字段名完全一致:using(teacher_id)).
? b.外連接:連接的多個(gè)數(shù)據(jù)有一個(gè)或多個(gè)都不存在
??? 例如:select leftTable.name,leftTalble.right,rightTalbe.time from leftTable left outer join rightTable on leftTabel.id=rightTable.t_id;
??? 注:1.只能使用on、using作為連接添加,不能使用where作為連接條件;
???
??? 外連接又分為左外連接、右外連接,全外連接(myql暫時(shí)不支持,左外連接和右外連接union就是全外連接);
??? 左連接:當(dāng)左邊的數(shù)據(jù)和右邊的數(shù)據(jù)連接不上時(shí)候,左邊的數(shù)據(jù)被保留;
??? 例如:select * from one left join two where one.id=two.id;
??? 右連接:當(dāng)左邊的數(shù)據(jù)和右邊的數(shù)據(jù)連接不上的時(shí)候,右邊的數(shù)據(jù)被保留;
??? 例如:select * from one right_join two where on.id=two.id;

? c.自然連接:連接中多個(gè)內(nèi)連接和外連接,即:通過mysql自己的判斷(使用相同字段作為連接條件)完成連接,我們不需要指定連接條件。
??? 內(nèi):natural
??? 外:有分為左外和右外,左外:natrual left join;右外:natural right join;???????

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

5.導(dǎo)入數(shù)據(jù)load file(注意數(shù)據(jù)的格式)
? 將文件導(dǎo)出到一個(gè)數(shù)據(jù)表:
? load data in file 需要導(dǎo)入文件的路徑 into table 需要導(dǎo)入到的表名;
?

? 當(dāng)需要插入數(shù)據(jù)的主鍵與已經(jīng)存在的數(shù)據(jù)的主鍵發(fā)生沖突的時(shí)候,我么可以使用一下的語句:(其實(shí)就是要執(zhí)行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語句還可以執(zhí)行select出來的語句:
? insert into teacher_class (name,age)
? select name,age from teacher_class;(這半句代替需要需要插入的值:蠕蟲復(fù)制:復(fù)制自己數(shù)據(jù)表中的數(shù)據(jù)并插入)
??
? delete還可以配置limit和order by一起來使用,還支持多表同時(shí)刪除(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 表名;
? 從數(shù)據(jù)層面,truncat類似于delete;
? 不同點(diǎn):1.truncat不會(huì)返回?cái)?shù)據(jù)影響的函數(shù),delete會(huì);
????????? 2.truncat會(huì)重建id;
? 原因:truncat是直接刪除整張表,然后重建這張表;delete是逐行刪除。

6.視圖操作(支持所有mysql操作):用于在數(shù)據(jù)庫中創(chuàng)建一張新的虛擬表,用來讀取你想要的信息,同時(shí)隱藏了一些你不想讀取的信息。
? 1.創(chuàng)建視圖:
? 語法:create view view_name as 查詢語句;
? 例如:create view view_infor as select id,name,age from t_teachder;
? 注:當(dāng)我們操作的是視圖的時(shí)候,對(duì)應(yīng)的數(shù)據(jù)表也會(huì)發(fā)生想應(yīng)的變化。
? 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;
?
? 視圖還可以優(yōu)化mysql操作,所見業(yè)務(wù)邏輯:
? 可以把每次都需要操作的大表(可能是多次的聯(lián)合操作)創(chuàng)建成一個(gè)視圖即可達(dá)到優(yōu)化作用:
? 即如果每次都要操作這個(gè)語句:
? 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;
? 可以把這個(gè)語句所產(chǎn)生的查詢結(jié)果生成一個(gè)視圖,然后查詢這個(gè)視圖:
? 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;

?

轉(zhuǎn)載于:https://my.oschina.net/u/1771585/blog/472242

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。