使用外键
作为桥梁连接连个表进行查询。
笛卡尔积
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
,通过使用不同的别名,服务器能够区分所引用的实例。
网友评论