MySQL表的內(nèi)外連接和視圖使用實(shí)戰(zhàn)練習(xí)
一、表的內(nèi)外連接
表的連接分為內(nèi)連和外連。
1. 內(nèi)連接
內(nèi)連接實(shí)際上就是利用 where 子句對(duì)兩種表形成的笛卡爾積進(jìn)行篩選,我們前面學(xué)習(xí)的查詢都是內(nèi)連接,也是在開發(fā)過程中使用的最多的連接查詢。
語法:
select 字段 from 表1 inner join 表2 on 連接條件 and 其他條件;
例如:
- 顯示 JAMES 的名字和部門名稱
用前面的寫法直接用笛卡爾積:
select ename, dname from emp, dept where emp.deptno=dept.deptno and ename='JAMES';
用標(biāo)準(zhǔn)的內(nèi)連接寫法:
select ename, dname from emp -> inner join dept -> on emp.deptno = dept.deptno -> and ename = 'JAMES';
2. 外連接
外連接分為左外連接和右外連接。
(1)左外連接
如果聯(lián)合查詢,左側(cè)的表完全顯示,我們就稱作是左外連接。
語法:
select 字段名 from 表名1 left join 表名2 on 連接條件;
例如,先創(chuàng)建兩張表:
學(xué)生表,并插入數(shù)據(jù):
成績表,并插入數(shù)據(jù):
接下來要做的:
- 查詢所有學(xué)生的成績,如果這個(gè)學(xué)生沒有成績,也要將學(xué)生的個(gè)人信息顯示出來
我們使用左外連接,將學(xué)生表的信息在左邊顯示,當(dāng)左邊表和右邊表沒有匹配時(shí),也會(huì)顯示左邊表的數(shù)據(jù):
select * from stu left join exam on stu.id = exam.id;
(2)右外連接
如果聯(lián)合查詢,右側(cè)的表完全顯示我們就說是右外連接。
語法:
select 字段 from 表名1 right join 表名2 on 連接條件;
對(duì) stu 表和 exam 表聯(lián)合查詢,把所有的成績都顯示出來,即使這個(gè)成績沒有學(xué)生與它對(duì)應(yīng),也要顯示出來
select * from stu right join exam on stu.id=exam.id;
接下來我們繼續(xù)使用員工表進(jìn)行練習(xí):
- 列出部門名稱和這些部門的員工信息,同時(shí)列出沒有員工的部門
方法一:
select d.dname, e.* from dept d left join emp e on d.deptno = e.deptno;
方法二:
select d.dname, e.* from emp e right join dept d on d.deptno = e.deptno;
3. 練習(xí)
二、視圖
1. 視圖的使用
我們上面所使用的內(nèi)外連接所生成的表都是一個(gè)臨時(shí)表,假設(shè)我們頻繁地使用該表,那么有沒有辦法將這個(gè)臨時(shí)表轉(zhuǎn)化為虛擬表呢?
視圖就是一個(gè)虛擬表,其內(nèi)容由查詢定義。同真實(shí)的表一樣,視圖包含一系列帶有名稱的列和行數(shù)據(jù)。視圖的數(shù)據(jù)變化會(huì)影響到基表,基表的數(shù)據(jù)變化也會(huì)影響到視圖。
創(chuàng)建視圖
create view 視圖名 as select語句;
例如我們使用內(nèi)連接:
而創(chuàng)建視圖:
我們會(huì)發(fā)現(xiàn)多了一個(gè)表結(jié)構(gòu),我們查看該表:
如上,我們發(fā)現(xiàn)該表和我們用內(nèi)連接的結(jié)果一樣。
- 修改了視圖,對(duì)基表數(shù)據(jù)有影響
- 修改了基表,對(duì)視圖有影響
刪除視圖
drop view 視圖名;
2. 視圖規(guī)則和限制
- 與表一樣,必須唯一命名(不能出現(xiàn)同名視圖或表名);
- 創(chuàng)建視圖數(shù)目無限制,但要考慮復(fù)雜查詢創(chuàng)建為視圖之后的性能影響;
- 視圖不能添加索引,也不能有關(guān)聯(lián)的觸發(fā)器或者默認(rèn)值;
- 視圖可以提高安全性,必須具有足夠的訪問權(quán)限;
- order by 可以用在視圖中,但是如果從該視圖檢索數(shù)據(jù) select 中也含有 order by ,那么該視圖中的 order by 將被覆蓋;
- 視圖可以和表一起使用。
修改視圖中數(shù)據(jù)對(duì)原表中數(shù)據(jù)有影響,修改原表中數(shù)據(jù)對(duì)視圖中數(shù)據(jù)也有影響
例如:
針對(duì)actor表創(chuàng)建視圖actor_name_view,只包含first_name以及l(fā)ast_name兩列,并對(duì)這兩列重新命名,first_name為first_name_v,last_name修改為last_name_v:
CREATE TABLE IF NOT EXISTS actor ( actor_id smallint(5) NOT NULL PRIMARY KEY, first_name varchar(45) NOT NULL, last_name varchar(45) NOT NULL, last_update timestamp NOT NULL DEFAULT (datetime(‘now',‘localtime'))) create view actor_name_view as select first_name first_name_v,last_name last_name_v from actor;
總結(jié)
到此這篇關(guān)于MySQL表的內(nèi)外連接和視圖使用的文章就介紹到這了,更多相關(guān)MySQL表內(nèi)外連接和視圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mysql中find_in_set()函數(shù)用法詳解以及使用場景
前幾天在sql查詢的時(shí)候,想要判斷數(shù)據(jù)庫中表的某一列中的值是否在List集合中,接觸到了find_in_set的使用,用起來方便快捷,下面這篇文章主要給大家介紹了關(guān)于Mysql中find_in_set()函數(shù)用法詳解以及使用場景的相關(guān)資料,需要的朋友可以參考下2023-03-035個(gè)常用的MySQL數(shù)據(jù)庫管理工具詳細(xì)介紹
本篇文章是對(duì)5個(gè)常用的MySQL數(shù)據(jù)庫管理工具進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06MySQL中的聚簇索引、非聚簇索引、聯(lián)合索引和唯一索引詳細(xì)介紹
本文主要介紹了MySQL的索引類型,根據(jù)索引的存儲(chǔ)方式來劃分,索引可以分為聚簇索引和非聚簇索引。聚簇索引的特點(diǎn)是葉子節(jié)點(diǎn)包含了完整的記錄行,而非聚簇索引的葉子節(jié)點(diǎn)只有所以字段和主鍵ID,感興趣的同學(xué)可以閱讀本文2023-04-04Mysql數(shù)據(jù)庫連接失敗SSLException: Unsupported record
這篇文章主要介紹了Mysql數(shù)據(jù)庫連接失敗SSLException: Unsupported record version Unknown-0.0問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06全面分析MySQL?ERROR?1045出現(xiàn)的原因及解決
這篇文章主要介紹了全面分析MySQL?ERROR?1045出現(xiàn)的原因及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07MySQL實(shí)例精講單行函數(shù)以及字符數(shù)學(xué)日期流程控制
SQL函數(shù)即數(shù)據(jù)庫的內(nèi)置函數(shù),可以運(yùn)用在SQL語句中實(shí)現(xiàn)特定的功能。SQL單行函數(shù)對(duì)于每一行數(shù)據(jù)進(jìn)行計(jì)算后得到一行輸出結(jié)果。SQL單行函數(shù)根據(jù)數(shù)據(jù)類型分為字符函數(shù)、數(shù)字函數(shù)、日期函數(shù)、轉(zhuǎn)換函數(shù),另外還有一些別的函數(shù)2021-10-10