隨著基礎(chǔ)知識的不斷深入,我們會漸漸發(fā)現(xiàn)一些有趣的概念,覺得:欸,不錯欸,好想繼續(xù)聽下去.保持這種想法,繼續(xù)前行,你會發(fā)現(xiàn)知識不僅僅是紙上談兵
MySQL編寫規(guī)范:為了方便,我們這里用的MySQL指令都是小寫,但是實際的企業(yè)開發(fā)中,MySQL的關(guān)鍵字都是用的大寫字母.
一.多表查詢-基礎(chǔ)


1.多表查詢
示例一: 默認(rèn)的多表查詢
# 多表查詢就是在以前查詢的基礎(chǔ)上再加一張表, 寫在以前表名的后面即可
# 默認(rèn)情況下多表查詢返回的結(jié)果是笛卡爾集
select * from stuinfo, stugrade;
By 極客江南
二.多表查詢-union



示例二:
union: 將多個select語句的結(jié)果集縱向結(jié)合在一起
union格式:
select 字段 from 表1 union select 字段 from 表2;
select id,name from stuinfo union select id,score from stugrade;
union注意點:
- union兩邊的select語句字段的個數(shù)必須一致
select id,name from stuinfo union select score from stugrade; #報錯
- union兩邊的select語句字段名稱可以不一樣
select id,name from stuinfo union select id,score from stugrade;
- union兩邊的select語句字段類型可以不一樣
- union結(jié)果集字段的名稱默認(rèn)是左邊select語句指定的字段名稱
- union結(jié)果集會自動去重
create table stuinfo2(
id int auto_increment primary key,
name varchar(20)
);
insert into stuinfo2 values(null, 'lnj'), (null, 'tt');
select id,name from stuinfo union select id,name from stuinfo2;
By 極客江南
三.多表查詢-內(nèi)連接

表的連接
1.內(nèi)連接 inner join
返回所有多張表中符合條件的數(shù)據(jù)集
select 字段 from 表1 inner join 表2 on 表1.公共字段=表2.公共字段
示例一:
select * from stuinfo, stugrade where stuinfo.id=stugrade.stuid;
select * from stuinfo inner join stugrade on stuinfo.id=stugrade.stuid;
By 極客江南
四.多表查詢-外連接


2.外連接
2.1左外連接 left join
包含左邊表的全部內(nèi)容(不管右邊的表中是否存在匹配的數(shù)據(jù))和右邊表符合條件的內(nèi)容
select * from stuinfo left join stugrade on stuinfo.id=stugrade.stuid;
2.2右外連接 right join
包含右邊表的全部內(nèi)容(不管右邊的表中是否存在匹配的數(shù)據(jù))和左邊表符合條件的內(nèi)容
select * from stuinfo right join stugrade on stuinfo.id=stugrade.stuid;
By 極客江南
五.多表查詢-交叉連接

3.交叉連接 cross join
- 如果沒有指定連接表達(dá)式, 返回笛卡爾集
- 如果有鏈接表達(dá)式等價于內(nèi)連接
select * from stuinfo cross join stugrade;
select * from stuinfo cross join stugrade on stuinfo.id=stugrade.stuid;
4.全連接(full join MySQL不支持)
By 極客江南
六.多表查詢-自然連接

1.自然連接 (natural)
自動判斷連接條件, 但是有一個前提條件, 就是連接條件的字段名稱一致
自然連接是用來簡化前面講解的連接語句的代碼的
2.自然內(nèi)連接
select 字段 from 表1 inner join 表2 on 表1.公共字段=表2.公共字段
select 字段 from 表1 natural join 表2;
select * from stuinfo natural join stugrade;
3.自然外連接
3.1自然左外連接
select 字段 from 表1 natural left join 表2;
select * from stuinfo natural left join stugrade;
3.2自然右外連接
select 字段 from 表1 natural right join 表2;
select * from stuinfo natural right join stugrade;
注意點:
如果沒有同名的字段, 那么返回笛卡爾集
會對返回的結(jié)果集的字段進(jìn)行優(yōu)化, 取出重復(fù)的連接條件字段
select * from stuinfo inner join stugrade on stuinfo.stuid=stugrade.stuid;
select * from stuinfo natural join stugrade;
By 極客江南
如果沒有相同的字段,會返回笛卡兒積
七.多表查詢-using

using() 指定連接字段
如果連接條件的字段名稱一致, 除了可以使用自然連接來簡化代碼以外還可以使用using來指定連接字段, 兩者達(dá)到的效果是相同的
select * from stuinfo inner join stugrade on stuinfo.stuid=stugrade.stuid;
select * from stuinfo inner join stugrade using(stuid);
By 極客江南
八.多表查詢-子查詢




1.子查詢
圓括號中的select我們稱之為子查詢, 圓括號外面的select我們稱之為父查詢
select 語句 where 條件 (select 語句);
示例一:
查詢出成績是100的人的姓名
select name from stuinfo;
select name from stuinfo where stuid=(select stuid from stugrade where score=100);
# 標(biāo)準(zhǔn)子查詢
# 標(biāo)準(zhǔn)子查詢的特點: 返回的結(jié)果只有一個
示例二: 如果返回值不止一個, 需要使用in | not in
查詢出成績是90分以上人的姓名
select name from stuinfo where stuid in (select stuid from stugrade where score>=90);
示例三: 子查詢的結(jié)果不僅僅能作為條件, 還可以作為一張表來使用, 但是作為一張表來使用必須起別名
select * from stu where score >=60;
select name, city, score from stu;
select name, city, score from stu where score >=60;
select name, city, score from (select * from stu where score >=60) as t;
By 極客江南
子查詢除了作為where后面的條件還可以作為from后面的表