数据库学习

SQL-查询(二、多表查询)

2019-11-25  本文已影响0人  Manfestain

使用外键作为桥梁连接连个表进行查询。


笛卡尔积

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;

其中,括号内的两个分别是两个子查询(eb)。

连续两次使用同一个表

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_ab_e,通过使用不同的别名,服务器能够区分所引用的实例。

上一篇下一篇

猜你喜欢

热点阅读