多表查询
一:笛卡尔积
1.假设有两个集合X和Y,则X和Y的笛卡尔积就是X和Y的所有可能组合。
2.多表查询若缺少多表连接条件,返回的结果可能出现笛卡尔积错误。
例:SELECT employee_id,job_id
FROM employees,departments // From employees CROSS JOIN departments;
#上述语句会使两表中的employee_id和job_id全部交叉连接,出现笛卡尔积错误
3.笛卡尔积错误出现可能原因:
a.省略多个表的连接条件;
b.连接条件无效;
c.所有表中的所有行互相连接。
二:多表查询
1.在WHERE后加入有效的连接条件:
SELECT table1.colum,table2.colum
FROM table1,table2
WHERE table1.colum1 = table2.colum2; #连接条件
2.如果查询语句中出现了多个表中都存在的字段,必须指明该字段的表。
例如 job_id在table1和table2中都存在,查询又需FROM table1,table2;则应SELECT table1.job_id 或 table2.job_id。
3.从sql优化的角度,建议多表查询时,每个字段前都加上其所在的表。
4.可以给表起别名,在SELECT和WHERE中使用表的别名,使代码更简洁: FROM 原表名 表别名;
***一旦给表起了别名,则在SELECT 和 WHERE 中用到表名时都只能用表的别名,不能用表的原名。
***此处区别于列的别名,列起了别名后仍可以用原名
例:查询员工的employee_id,last_name,department_name,city
SELECT e.employee_id,e.last_name,d.department_name,l.city
FROM employees e,departments d,locations l
WHERE e.department_id = d.department_id #表e和表d的连接条件
AND d.location_id = l.location_id; #表d和表l的连接条件
#如果有n个表需要多表查询,则至少需要有n-1个连接条件。 少于n-1个则会出现笛卡尔积的错误。