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;排序