日期:2014-05-16  浏览次数:20443 次

表的联结、运算符学习笔记
表的联结:
1.等值联结
两个表的相同列的值必须相等。
等值联结也称为 简单联结 或 内联结
SELECT
      e.last_name,
      e.department_id,
      d.department_name
FROM
      employees e,
      departments d
WHERE
       e.department_id = d.department_id ;

2.非等值联结
非等值联结是包含非等号运算符的联结条件
SELECT
     e.last_name,
     e.salary,
      j.grade_level
FROM
      employees e,
      job_grades j
WHERE
       e.salary BETWEEN j.lowest_sal AND j.highest_sal;

3.外联结
通过外联结返回不直接匹配的记录。
外联结运算符只能出现在表达式的一侧,即缺少信息的那一侧。他将从一个表中返回在另一个表中没有直接匹配的行。
包含外联结的条件不能用IN 运算符,也不能通过OR运算符链接到另一个条件。
SELECT
      e.last_name,
      e.department_id,
      d.department_name
FROM
      employees e,
      departments d
WHERE
       e.department_id(+) = d.department_id ;

4.自联结
自己联结自己的一种联结形式
SELECT
      worker.last_name||'works for '||manager.last_name
FROM
      employees as worker,
      employees as manager
WHERE
      worker.manager_id = manager.employee_id;

5.交叉联结:
返回两个表的交叉乘积 这与两个表之间的笛卡尔乘积是相同的 CROSS JOIN
SELECT
      last_name,
      department_name
FROM
      employees
CROSS JOIN
      departments;
该语句的另外一种写法就是 不加任何条件的SELECT 语句

SELECT      
      last_name,
      department_name
FROM      
      employees,
      departments;
6.自然联结:
NATURAL JOIN 子句是以两个表中具有相同名称的所有列为基础。
它选择两个表中那些在所有匹配的列中值相等的行。
如果列具有相同的名称 但是数据类型不同,就会返回一个错误。
同时需要注意的是,选择的字段是两个共有的,则不需要制定列名,否则会报错
SELECT  
      a.last_name,   department_id,   b.department_name
FROM 
      employees a NATURAL JOIN departments b;

7.USING子句
如果几个列具有相同的名称,但是数据类型不匹配,则可以使用USING 子句来修改NATURAL JOIN子句 以指定要用于等值联结的列。
在多个列匹配时,使用USING子句只匹配一个列。
在引用列中不要使用表名或别名
NATURAL JOIN 和 USING 子句是互不相容的。
SELECT
      l.city,
      d.department_name
FROM
      locations l
JOIN
      department d
USING (location_id)
WHERE location_id = 1400;

对于使用Using限制只用一个相同列来关联的,where条件当中出现的相同的列则必须限定为某一个表的列 否则因产生歧义而抛出错误
SELECT
     a.hire_date,
     b.department_name
FROM
      employees a
JOIN
      departments b
USING (manager_id)
WHERE a.department_id IN (20,30,100);

8.使用ON子句创建联结
自然联结的联结条件基本上是具有相同名称的所有列的等值联结。
要制定任意条件或指定要联结的列,可以使用ON子句。
联结条件与其他搜索条件分开。
ON子句使代码非常易于理解
两表关联
SELECT             
      e.employee_id,
      e.last_name,
      e.department_id,
      d.department_id,
 &