使用外來鍵
作為橋梁連線連個表進行查詢。
笛卡爾積
select e.fname, e.lname, d.name from employee e join department d;
在from
子句中包含了兩個表,並使用join
關鍵字隔開。
當查詢中沒有指定兩個表如何連線時會產生笛卡爾積,即兩張表的所有置換(18條employee x 3個department = 54個置換),這種連線也稱為交叉連線(cross join)。
內連線當加入兩個表是如何關聯的,就會產生內連線。employee.dept_id列起到連線兩個表的作用。
select e.fname, e.lname, d.name from employee e join department d on e.dept_id = d.dept_id;
當沒有指定連線時預設使用內連線,所以一般最好使用inner顯式指定。
select e.fname, e.lname, d.name from employee e inner join department d on e.dept_id = d.dept_id;
當連線的兩個表列名是相同的時候可以使用using代替。不建議使用
select e.fname, e.lname, d.name from employee e inner join department d using (dept_id);
連線3個或更多的表select a.account_id, c.fed_id from account a inner join customer c on a.cust_id = c.cust_id inner join employee e on a.open_emp_id = e.emp_id where c.cust_type_cd = 'b';
任意交換多個表的順序不會影響最終的查詢結果(sql是一種非過程化的語言)。資料庫會根據所收集的資料庫物件資訊,在多個表中選擇乙個作為開始點(這張表稱為驅動表),然後其他確定連線順序。
將子查詢結果作為查詢表
select a.account_id, a.cust_id, a.open_date, a.product_cd from account a inner join (select amp_id, assigned_branch_id from employee where start_date < '2007-01-01' and title = 'teller') e on a.open_id = e.open_id inner join (select branch_id from branch where name = 'woburn branch') b on e.assigned_branch_id = b.branch_id;
其中,括號內的兩個分別是兩個子查詢(e
和b
)。
連續兩次使用同乙個表
select a.account_id, e.emp_id, b_a.name, b_e.name from account a inner join branch b_a on a.open_branch_id = b_a.branch_id inner join employee e on a.open_emp_id = e.emp_id inner join branch b_e on e.assigned_branch_id = b_e.branch_id where a.product_cd = 'chk';
其中,branch表被包含了兩次,別名分別為b_a
和b_e
,通過使用不同的別名,伺服器能夠區分所引用的例項。 SQL 多表查詢
不同的 sql join inner join 內連線 如果表中至少有乙個匹配,也從左表返回所有的行 left join 左連線 即使右表中沒有匹配,也從右表返回所有的行 right join 右連線 即使左表中沒有匹配,也從右表返回所有的行 full join 全連線 只有其中乙個表中存在匹配也從...
SQL 多表查詢
join操作符 1.笛卡爾積,rxs 可直接轉換為sql語句 2.等值連線,記作 可直接轉換為sql語句 3.自然連線,記作 可轉換為sql語句 4.左外連線和右外連線的表示方法及轉換為sql 注意若多個關係有同名屬性,則用 關係名.屬性名 指出重名屬性 連線也可以與投影,選擇等結合使用。1.查詢選...
SQL 多表查詢 巢狀查詢
多表查詢 1 結構 select from where 2 笛卡爾積查詢 select from student,course select from student,sdept 3 查詢每個學院的學生情況 select from student,sdept where student.deptno...