显示来自多个表的数据——JOIN

简介: 表关系简介 一、语法 SELECT 字段列表 FROM TABLE1 [CROSS JOIN TABLE2 ] | [NATURAL JOIN TABLE2 ] | [JOIN TABLE2 USING (字段名) ] | [JOIN TABLE2 ON (TABLE.

表关系简介



一、语法

SELECT 字段列表
  FROM TABLE1 
[CROSS JOIN TABLE2 ] | 
[NATURAL JOIN TABLE2 ] | 
 [JOIN TABLE2 USING (字段名) ] | 
 [JOIN TABLE2 ON (TABLE.COLUMN_NAME = TABLE2.COLUMN_NAME) ] |
[(LEFT | RIGHT | FULL OUT) JOIN TABLE2 ON (TABLE1.COLUMN_NAME = TABLE2.COLUMN_NAME) ];

二、自然连接

1、USING
  如果不希望参照被连接表的所有同名列进行等值连接,自然连接将无法满足要求,可以在连接时使用USING子句来设置用于等值连接的列(参照列)名。
不允许在参照列上使用表名或者别名作为前缀
--99语法
SELECT EMPNO, ENAME, SAL, EMP.DEPTNO, DNAME
  FROM EMP
  JOIN DEPT
 USING (DEPTNO);
 
 --92语法
SELECT EMPNO, ENAME, SAL, EMP.DEPTNO, DNAME
  FROM EMP, DEPT
 WHERE EMP.DEPTNO = DEPT.DEPTNO;
2、ON
  如果要参照非同名的列进行等值连接,或想设置任意的连接条件,可以使用On子句
SELECT EMPNO, ENAME, SAL, EMP.DEPTNO, DNAME
  FROM EMP
  JOIN DEPT
    ON (EMP.DEPTNO = DEPT.DEPTNO);

三、自连接

  自己和自己做链接
--99语法
SELECT WORKER.LAST_NAME EMP, MANAGER.LAST_NAME MGR
  FROM EMPLOYEES WORKER
  JOIN EMPLOYEES MANAGER
    ON (WORKER.MANAGER_ID = MANAGER.EMPLOYEE_ID);
    
--92语法
SELECT WORKER.LAST_NAME EMP, MANAGER.LAST_NAME MGR
  FROM EMPLOYEES WORKER, EMPLOYEES MANAGER
 WHERE WORKER.MANAGER_ID = MANAGER.EMPLOYEE_ID;

四、非等值连接

--99语法
SELECT E.LAST_NAME, E.SALARY, J.GRADE_LEVEL
  FROM EMPLOYEES E
  JOIN JOB_GRADES J
    ON E.SALARY BETWEEN J.LOWEST_SAL AND J.HIGHEST_SAL;
    
--92语法
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;

五、INNER|OUTER 连接

1、INNER 连接
  两个表连接,只返回匹配的行,被称为内连接。
--查询所有员工以及其部门名字
--99语法
SELECT LAST_NAME, DEPARTMENT_NAME
  FROM EMPLOYEES E
 INNER JOIN DEPARTMENTS D
    ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;

--92语法
SELECT LAST_NAME, DEPARTMENT_NAME
  FROM EMPLOYEES E, DEPARTMENTS D
 WHERE E.DEPARTMENT_ID = D.DEPARTMENT_ID;
2、LEFT OUTER | RIGHT OUTER 连接
  两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行,这种连接称为左(或右)外连接。
--哪些部门没有员工,看出部门名字
--99语法
SELECT DEPARTMENT_NAME
  FROM EMPLOYEES E
 RIGHT JOIN DEPARTMENTS D
    ON E.DEPARTMENT_ID = D.DEPARTMENT_ID
 WHERE LAST_NAME IS NULL;

--92语法
SELECT DEPARTMENT_NAME
  FROM EMPLOYEES E, DEPARTMENTS D
 WHERE E.DEPARTMENT_ID(+) = D.DEPARTMENT_ID
   AND LAST_NAME IS NULL;
3、FULL OUTER 连接
  两个表在连接过程中除了返回满足连接条件的行以外还返回两个表中不满足条件的行,这种连接称为全外联接。
--99
SELECT E.LAST_NAME, D.DEPARTMENT_ID, D.DEPARTMENT_NAME
  FROM EMPLOYEES E
  FULL OUTER JOIN DEPARTMENTS D
    ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;

--92
SELECT E.LAST_NAME, D.DEPARTMENT_ID, D.DEPARTMENT_NAME
  FROM EMPLOYEES E, DEPARTMENTS D
    ON E.DEPARTMENT_ID(+) = D.DEPARTMENT_ID(+);

六、笛卡尔积

笛卡尔集会在下面条件下产生:

1、连接条件被遗漏

2、连接条件不正确

3、所有表中的所有行互相连接

--99语法
SELECT E.LAST_NAME, D.DEPARTMENT_ID, D.DEPARTMENT_NAME
  FROM EMPLOYEES E
 CROSS JOIN DEPARTMENTS D;

--92语法
SELECT E.LAST_NAME, D.DEPARTMENT_ID, D.DEPARTMENT_NAME
  FROM EMPLOYEES E, DEPARTMENTS D;

目录
相关文章
|
SQL 前端开发 Oracle
mysql合并查询(多张表) union 和 union all
简介 小序 :今天写首页动态业务的时候,用到了两张表,还需要分页查询,刚开始以为需要关联查询,后来发现关联的话不会放到一个实体,然后我就上网找方法,然后发现了一个我没学过的sql语句union,union all,卧槽 还是得好好学习啊,前端我想学,mysql我想学,真的时间不够用啊,还得给学弟学妹拍趣味编程课看的视频,真的是烦啊! 如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字。union(或称为联合)的作用是将多个结果合并在一起显示出来。 UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
894 0
mysql合并查询(多张表) union 和 union all
|
3月前
|
SQL 数据库
SQL FULL OUTER JOIN 关键字:左右表中所有记录的全连接解析
SQL RIGHT JOIN关键字返回右表(table2)中的所有记录以及左表(table1)中的匹配记录。如果没有匹配,则左侧的结果为0条记录。
90 0
|
10月前
|
SQL
一条集多表查询、字段与字段拼接、合并每张表共同字段、新增列并赋值的SQL
一条集多表查询、字段与字段拼接、合并每张表共同字段、新增列并赋值的SQL
41 0
|
11月前
|
SQL
SQL两张表中有关联id,但是字段名不同查询
SQL两张表中有关联id,但是字段名不同查询
66 0
|
SQL 算法 关系型数据库
Mysql使用left join连表查询时,因连接条件未加索引导致查询很慢
Mysql使用left join连表查询时,因连接条件未加索引导致查询很慢
156 0
|
SQL C++ Python
SQL高级查询技巧(两次JOIN同一个表,自包含JOIN,不等JOIN)
掌握了这些,就比较高级啦 Using the Same Table Twice 如下面查询中的branch字段 SELECT a.account_id, e.emp_id, b_a.name open_branch, b_e.
4574 0
|
SQL
SAP利用内表删除多条数据(自定义表)
之前博文提到了使用abap中的sql语句删除某一条自定义表中的记录。下面ji介绍一下,如何通过内表,一次性删除多行记录。自定义表的结构 FUNCTION ZFM_FI_ZFIT00200. *"----------------------------------------------------.
3247 0