若一個資料庫同時涉及兩個以上的表,則稱之為連接查詢。連接查詢包括內連接查詢、自連接查詢、外連接查詢。 1.等值與非等值連接查詢 連接查詢的一般格式為:select 表名1.列名,表名2.列名 from 表名1,表名2 where 表名1.列名 <比較運算符> 表名2.列名,其中比較運算符包括=、>、 ...
若一個資料庫同時涉及兩個以上的表,則稱之為連接查詢。連接查詢包括內連接查詢、自連接查詢、外連接查詢。
1.等值與非等值連接查詢
連接查詢的一般格式為:select 表名1.列名,表名2.列名 from 表名1,表名2 where 表名1.列名 <比較運算符> 表名2.列名,其中比較運算符包括=、>、<、>=、<=、!=等。內連接又包含等值連接,非等值連接,自然連接。
建立兩張表,產品表product和產品分類表category。產品表product包括產品號pno,產品分類號cno,產品名稱pname,產品分類表category包括分類號cno和分類名稱cname,接下來的示例均基於這兩張表實現。先建表並插入數據。
create table category( cno int not null, cname varchar(20) not null )ENGINE=InnoDB DEFAULT CHARSET=utf8; create table product( pno int not null, cno int not null, pname varchar(20) not null )ENGINE=InnoDB DEFAULT CHARSET=utf8; insert into product values(1,11,'老人與海'); insert into product values(1,12,'森馬服裝'); insert into product values(2,13,'老乾媽'); insert into product values(2,14,'剪刀'); insert into category values(11,'書本'); insert into category values(12,'衣物'); insert into category values(13,'食品'); insert into category values(13,'食品'); insert into category values(15,'辦公用品');
運算符為“=”的連接稱為等值連接,等值連接從category和product中取出屬性值相等的那些元素。
等值連接 select product.*,category.* from product,category where product.cno = category.cno;
等值連接查詢到的結果:
屬性名之前都加上首碼,是為了避免混淆。如果屬性名再參加各連接的表中是唯一的,則可以忽略首碼。
非等值連接是運算符除了“=”以外的連接方式,不做示例。
自然連接是特殊的等值連接。它取出屬性相同的元素,並且在結果中把重覆的屬性列去掉。
自然連接 select pno,product.cno,pname,cname from product,category where product.cno = category.cno;
自然連接查詢到的結果:
2.自連接
連接操作不僅可以在兩個表之間進行,也可以是一個表與自己進行連接,稱為表的自身連接。
自連接 select FIRST.pno,SECOND.cno from product FIRST,product SECOND where FIRST.pno=SECOND.pno;
自連接查詢結果:
3.外連接
外連接包括左外連接,右外連接,全外連接。
在等值連接中,屬性值不相同的那些元素被捨棄了。把被捨棄的元素保存下來,就叫做外連接。只保留左表中被捨棄的元素,叫做左外鏈接。
左外連接 select pno,product.cno,pname,cname from product left outer join category on(product.cno=category.cno);
左外連接的查詢結果:
可以看出,多了cno=14這一項,在category中沒有對應的值,所以對應的cname的值為null。
右外連接保留右表中被捨棄的元素。
右外連接 select pno,category.cno,pname,cname from product right outer join category on(product.cno=category.cno);
右外連接的查詢結果:
全外連接則是保留所有本應刪除的元素。mysql不支持全連接,可以用union all將左連接和右連接結合起來。
全外連接 select product.*,category.* from product left outer join category on (product.cno=category.cno) UNION ALL select product.*,category.* from product right outer join category on (product.cno=category.cno);
全外連接的查詢結果: