Oracle学习——多表查询

  本章将会介绍SQL中的多表查询语句。多表查询是指当查询的数据不是来源于一个表是,需要使用多表链接操作才能完成查询。根据不同表中的数据之间的关系查询相关的数据。

  多表链接一般包括有:内连接、外连接、子查询这三种方式。

  内连接:连接两个表,通过相等或不相等判断连接列,称为内连接。在内连接中典型的联接运算有=或<>之类的比较运算符。包括等值联接和自然联接。

  外连接:在两个表之间的连接,返回内连接的结果,同时还返回不匹配行的左(或右)表的连接,称为左(或右)连接。返回内连接的结果,同时还返回左和右连接,称为全连接。左外连接:会返回左表中的孤儿数据,右外连接:会返回右表中的孤儿数据,全外连接:左右表的孤儿数据都会返回。孤儿数据是指在连接中是null从而导致无法与另一表匹配的数据行。

  子查询:当一个查询是另一个查询的条件时,称之为子查询。

1、多表连接语法

1.1、语法结构(SQL 86语法)

SELECT table1.column, table2.column
FROM table1,table2
WHERE table1.column1 = table2.column2
  •  WHERE 子句中写连接条件,如果没有连接条件,将会出现笛卡尔乘积。
  • 当多个表中有相同的列名时,需要将表名或者表的别名作为前缀。

1.2、定义连接

  当数据从多表中查询时,要使用连接(join)条件。一个表中的行按照存在于相应列中的值被连接到另一个表中的行。

1.3、原则

  • 写一个连接表的SELECT语句时,在列名前面用表名或者表别名可以使得语言清楚,并且加快数据库访问。
  • 为了连接n个表在一起,至少需要n-1个连接条件。例如,为了连接4个表,则最少需要3个连接条件

2、内连接

2.1、等值连接

  等值连接也被称为简单连接或者内连接。是通过等号来判断连接条件中的数据是否相匹配。主要是采用WHERE中来进行限制,其语法结构与1.1部分一致,我们还可以使用AND来增加限制条件。

2.2、内连接——非等值连接

  一个非等值连接是一种不使用=作为连接条件的查询。比如使用!=、<、>、BETWEEN AND等都是非等值链接的条件判断。

SELECT *
FROM employee em, job_grades gr
WHERE em.salary BETWEEN gr.lowest_sal AND gr.highest_sal

  上述查询代码中,在WHERE语句中是用的一种非等于的筛选条件,只有在em.salary在gr.lowest_sal和gr.highest_sal是才会返回那一行的数据。其实对于这种非等值链接,我们可以先看成将所有表先得到一个笛卡尔乘积结果,最后使用WHERE来进行筛选而已。

2.3、内连接——自连接

  使用一个表连接它自身的操作,被称为自连接。我们依然可以先认为将这个表自己与自己做一个笛卡尔乘积(表1的第一行与表2的每一行进行cat,再让表2的第二行与表2的每一行进行cat....最后把得到的所有行合在一起就可以了,总共会有m*n条数据行),再使用WHERE进行筛选。

  一般自连接用在数据集具有上下级关系时进行检索查询。

3、外连接(OUTER JOIN)

  外连接是指查询出符合连接条件的数据同时还包含孤儿数据。左外连接包含左表的孤儿数据,右外连接包含右表的孤儿数据,全外连接包含两个表的孤儿数据。

  孤儿数据:被连接的列的值为NULL,即当前行与另一个表没有任何关系。

3.1、语法格式(SQL 99语法)

SELECT *
FROM table1 别名1
LEFT/RIGHT/FULL OUTER JOIN table2 别名2 ON 连接条件1 AND 连接条件2 AND ...

  ON作为保留字,后面紧跟连接条件,也就是WHERE后面写的那些东西。

3.2、Oracle扩展的外连接

  在Orcale数据库中对外连接中的左外和右外连接做了扩展,可以简化外连接的语法。通过在连接条件的后侧使用(+)来表示是否显示孤儿数据,有(+)表示不显示孤儿数据而另一侧则表示孤儿数据。该用法仅在Oracle数据库中使用。下面分别是右外连接和左外连接语法

SELECT *
FROM table1 别名1, table2 别名2
WHERE table1.column1(+) = table2.column2
SELECT *
FROM table1 别名1, table2 别名2
WHERE table1.column1 = table2.column2(+)

4、交叉连接(SQL 99语法)

  • CROSS JOIN 子句导致两个表的交叉乘积
  • 该连接和两个表之间的笛卡尔乘积是一样的(不指定连接条件)
SELECT *
FROM table1 别名1
CROSS JOIN table2 别名2

5、自然联接(NATURAL JOIN)

  NATURAL JOIN 子句基于两个表之间有相同名字的所有列作为连接列。它从两个表中选择在所有的匹配列中有等值的行(其实就是一种等值连接)。如果有相同的名字的列数据类型不同,会返回一个错误。

语法格式:

SELECT *
FROM table1 别名1
NATURAL JOIN table2 别名2

5.1、注意事项

1、如果做自然连接的两个表中有多个字段都满足有相同名称和类型,那么他们都会被作为自然连接的条件(AND)。

2、如果自然连接的两个表仅仅是字段名称相同,但数据类型不同,则会返回一个错误。

3、由于Orcale中可以进行非常简单的自然连接,因此在设计表时对具有相同含义的字段需要考虑使用相同的名称和数据类型

5.2、USING子句创建连接

  当有多个字段都满足有相同名称和类型,那么使用NATURAL JOIN,那么这些列都会作为自然连接的条件,如果我们只想用某一列或者某几列作为连接,那我们可以使用 USING子句。

  • 当有多个列匹配时,用USING子句匹配唯一的列。
  • 如果某列在USING中使用,那么在使用该列时不要使用表名或者列别名(因为两个表中列名都一样嘛也不用指定了,指定会报错)。
  • NATURAL JOIN 和 USING子句是相互排斥的(不能一起用)。
SELECT *
FROM table1 别名1
JOIN table2 别名2
USING(column1,column2)
WHERE ...

6、内连接(INNER JOIN)

  内连接和等值连接(或不等值连接)没有差别,主要是语法结构不同。内连接通过INNER JOIN连接两个表,并使用ON子句给定连接条件。INNER JOIN在性能上与其他语句没有性能差别。

语法结构:

SELECT *
FROM table1 别名1
INNER JOIN table2 别名2
ON 别名1.column =(>,<...) 别名2.column
[INNER JOIN table3 别名3
ON ....]
WHERE ...

  

 

posted @ 2022-08-09 19:00  Circle_Wang  阅读(1724)  评论(0编辑  收藏  举报