需求 查詢出所有的寫生,且要顯示學(xué)生所在班級的信息
1.連接查詢 :將多張表 進行記錄的連接(按照某個指定的條件,進行數(shù)據(jù)的拼接)
最終結(jié)果 記錄數(shù)可能有變化,字段數(shù)一定會增加(至少兩張表合并)
連接咨詢的意義,在用戶查看數(shù)據(jù)的時候,需要顯示的數(shù)據(jù)來自多張表
連接查詢:join
使用方式 :左表 join 右表?
其中 左表為在join 關(guān)鍵字左邊的表,
右表為在join關(guān)鍵字右邊的表


2.連接查詢在SQL中分成四類
內(nèi)連接 外連接 自然連接 交叉連接
--1.交叉連接 cross join
從一張表中,循環(huán)取出每一條記錄,每條記錄都去另外一張表中進行匹配:
匹配一定保留(沒有條件匹配),而連接本身字段就會增加(保留),最終形成結(jié)果為笛卡爾集

其中 select * from my_stu;

select * from king_class;

sososo
select * from my_stu cross join king_class;
----->等價于 select * from my_stu,king_class;
實際開發(fā)中cross join 并沒有什么卵用,其存在價值在于 保證連接這種結(jié)構(gòu)的完整性
--2.內(nèi)連接 inner join 其中 inner 關(guān)鍵字可以省略
從左表中取出每一條記錄,去右表中與所有的記錄進行匹配(匹配必須是某個條件在左表中和在右表中相同)才會保留結(jié)果,否則不保留;
基本語法
左表 [inner] join 右表 on 條件 and 條件and 條件。。。。。
inner join 不加 限制語句 on。。。。。。。時,結(jié)果相當于一個笛卡爾集
其中on 表示連接條件,條件字段就是代表相同的業(yè)務(wù)含義

inner join 添加 on 。。。。。條件?

其中
某字段 為兩張表中特有的,其表名可以省略
例如=====>
select * from my_stu inner join stu_info on class_id = stu_info.id?
字段別名以及表別名的使用:
在查詢數(shù)據(jù)的時候,不同表有同名字段,這個時候需要加上表名進行區(qū)分

更多篩選條件的添加

連接查詢時的字段別名和表別名的使用

select s.* ,c.name as c_name,c.id from -- 字段別名
my_stu as s inner join stu_info as c -- 表別名
?on s.class_id = c.id;
這個例子也說明了 select 。。。。。。。 from 是基于 后面一部分存在的 因為后半部分后執(zhí)行,才在select中可以訪問 s.*
on 和 where?
內(nèi)連接 還可以使用 where 代替 on 關(guān)鍵字 但是(on 的效率高于 where)
--3.外連接?
外連接? outer join 以某張表為主,取出里面的所有記錄,每條與另外一張表進行連接,無論能不能匹配上條件,最終都會保留:能匹配,正確保留,不能匹配,其他表的字段都置空NULL
外連接分為兩種:是以某張表為主:有主表
left join 左外連接(左連接),以左表為主表
right join? 右外連接(右連接),以右表為主表
基本語法:
左表 left / right join 右表 on 條件(如: 左表.字段 = 右表.字段)且 外連接必須有條件
左連接

右連接

雖然左連接和右連接有主表差異,但是顯示的結(jié)果,左表的數(shù)據(jù)在左邊,右表的數(shù)據(jù)在右邊
左連接和右連接可以互轉(zhuǎn)
--4.自然連接 natural join?
既自動匹配連接條件:系統(tǒng)以字段名作為匹配模式(同名字段就作為條件,多個同名字段都作為條件)
自然連接分為:
自然內(nèi)連接
左表 natural join 右表;


自然外連接
左表 natural left/right join 右表

其實 內(nèi)連接和外連接都可以模擬自然連接;使用同名字段 ,合并字段
左表 left / right? inner join 右表 using (字段名);--同名字段作為連接條件:自動合并條件
外連接模擬自然外連接
