PL SQL 多表查詢

2021-09-30 06:19:52 字數 2086 閱讀 7936

第四章:多表查詢

4.1 笛卡兒乘積(cross join)

1) 當多表關聯查詢中沒有關聯條件、或者關聯條件是恒等的時候(如1=1),就會產出笛卡兒乘積。

2) t1有m行、t2有n行,則笛卡兒乘積返回m*n行。

4.2 連線型別

1) 如果有n個表連線,則連線條件至少應該有n-1個;如果用到復合主鍵進行連線,則可能需要到更多的連線條件。

2) 表的別名不能大於30個字元,如果定義了表的別名,則在select子句中,如果需要用到表名字首,則必須要用別名,而不是用原表名。且表的別名只能用在同一層的select語句中。

3) 等值連線

? 等值連線也稱****** join或inner join,形式是進行關聯連線時用的是」=」

? 如果返回集合有重複列名,則應在重複列名前加上表名。

4) 不等連線

連線詞為between...and 、」>」、「>」等。

5) 外連線

? 外連線分為左外連線、右外連線、全外連線;乙個左外連線 + union + 右外連線等於全外連線。

? 左外連線和右外連線都可以用(+)和left(right) outer join兩種方法表示,但全外連線只能用full outer join表示,而不能用兩個「+」代替。

? 需要返回某錶的所有記錄,就把「+」寫在等值關聯中另乙個表對應的字段上。

6) 自連線

自己與自己關聯。自連線中必須要給表置別名。

7) cross join

相當於不寫where條件,得到的就是笛卡爾乘積。

8) natural join

自然連線,不需要在where中寫等值連線表示式。有幾點需要注意:

? 自然連線中,連線的兩個表必須有列名完全一樣的列;否則返回的是笛卡爾乘積。

? 兩個表有多少個相同的列名,就會進行多少個進行等值連線。

? 在select子句中,如果是兩個表都存在的列,則不能在這些列名前加表名字首;否則可以加;如果需要在where子句中用兩個表都存在的列作為條件,則也不能在這些列名前加上表名字首。

如:t1和t2都有id列,以下sql是錯誤的:

錯誤sql:

select t1.id from t1 natural join t2;

正確應該為:

select id from t1 natural join t2;

錯誤sql:

select * from t1 join natural t2 where t1.id=1;

正確應該為:

select * from t1 natural join t2 where id=1;

? 如果在select子句中用*,則返回結果相當於是對兩個表的列名執行distinct後的結果。

如:普通連線:sql> select * from t1,t2 where t1.id=t2.id;

id id name

1 1自然連線:sql> select * from t1 natural join t2;

id name

? 兩個表的相同列對應的資料型別必須相同;或者這些列的所有資料可以隱式轉換為另乙個表對應的字段的資料型別。

9) join...using

? 如果兩個表有多個列名相同的列,而你又不想用所有的列作關聯的時候,可以用using,如:

select * from t1 join t2 using(id);

? 在select子句中,如果是兩個表都存在的列,則不能在這些列名前加表名字首;否則可以加;如果需要在where子句中用兩個表都存在的列作為條件,則也不能在這些列名前加上表名字首。

? 在using中可以用乙個或多個共有的列進行關聯;如果是多個,則不同的列之間用「,」分隔

select * from t1 join t2 using(id,name);

10) join...on

當需要用列名不相同的列進行關聯時,可以用join...on:

select * from t1 join t2 on t1.id=t2.tid;

也可以用多個join...on

select * from t1 join t2 on t1.id=t2.tid join t3 on t1.name=t3.tname;

pl sql多表查詢練習題01

1,多表連線查詢時,若兩個表有同名的列,必須使用表的別名對列名進行引用,否則出錯!2,查詢公司員工的last name,department name,city select last name,department name,city from departments s,employees e,...

pl sql多表查詢練習題02

1.顯示所有員工的姓名,部門號和部門名稱 select last name,department id,department name from employees e,departments d where e.department id d.department id select last n...

多表查詢 多表查詢 多表查詢

查詢語法 select 列表名稱 from 表明列表 where 笛卡爾積 有兩個集合a,b,取這兩個集合的所有組成情況 要完成多表查詢,需要消除無用的資料 多表查詢分類 1 內連線查詢 1 隱式內連線 使用where消除無用的資料 例子 select t1.name,t1.gender,t2.na...