首页 > 代码库 > 数据库原理-数据多表查询

数据库原理-数据多表查询

连接查询

数据库中涉及两个表之间的数据查询通常使用连接的方法实现。连接分为内连接和外连接。

内连接:指连接结果仅包含符合连接条件的行,参与连接的两个表都应该符合连接条件。

外连接:连接结果不仅包含符合连接条件的行同时也包含自身不符合条件的行。包括左外连接、右外连接和全外连接。

左外连接:左边表数据行全部保留,右边表保留符合连接条件的行

右外连接:右边表数据行全部保留,左边表保留符合连接条件的行

全外连接:左外连接 union 右外连接

 

内连接,即最常见的等值连接,例:

 

SELECT * 
FROM TESTA,TESTB
WHERE TESTA.A=TESTB.A

 

外连接查询分为做左外连接、右外连接和全外联接查询。

 

  •  左外连接 left outer join 或者 left join

左外连接就是在等值连接的基础上加上主表中的未匹配数据,例:

 

SELECT *
FROM TESTA 
LEFT OUTER JOIN TESTB 
ON TESTA.A=TESTB.A

 

Oracle 支持另一种写法

 

SELECT * 
FROM TESTA,TESTB
WHERE TESTA.A=TESTB.A(+)

 

  • 右外连接 right outer join 或者 right join

右外连接是在等值连接的基础上加上被连接表的不匹配数据

 

SELECT *
FROM TESTA 
RIGHT OUTER JOIN TESTB 
ON TESTA.A=TESTB.A

Oracle支持的另一种写法

 

SELECT *
FROM TESTA,TESTB
WHERE TESTA.A(+)=TESTB.A

 

  • 全外连接 full outer join 或者 full join

全外连接是在等值连接的基础上将左表和右表的未匹配数据都加上

 

SELECT * 
FROM TESTA 
FULL OUTER JOIN TESTB
ON TESTA.A=TESTB.A

 

全外连接的等价写法,对同一表先做左连接,然后右连接

 

嵌套查询

嵌套查询的工作方式是:先处理内查询,由内向外处理,外层查询利用内层查询的结果嵌套查询不仅仅可以用于父查询select语句使用。还可以用于insert、update、delete语句或其他子查询中。

语法规则:

1、子查询的select查询总是使用圆括号括起来。

  2、不能包括compute或for.browse子句。

  3、如果同时指定top子句,则可能只包括order by子句。

  4、子查询最多可以嵌套到32层。个别查询可能会不支持32层嵌套。

  5、任何可以使用表达式的地方都可以使用子查询,只要它返回的是单个值。

  6、如果某个表只出现在子查询中二不出现在外部查询中,那么该表的列就无法包含在输出中。

  • 比较查询
实例1:
1 select name,age from person 2 where age > 3 (4     select age from person 5     where name = ‘孙权‘6 )
  • in查询

  实例2:

select name from person where countryid in (    select countryid from country    where countryname = ‘魏国‘)

 

  • some查询
some在sql中的逻辑运算符号,如果在一系列比较中,有些值为True,那么结果就为True
实例3:
1 select name from person 2 where countryid = some       --用等号和以下查询到的值比较,如果与其中一个相等,就返回3 (4     select countryid from country5     where countryname = ‘魏国‘6 )

 

  • all嵌套查询

实例4:

1 select name from person 2 where countryid > all   --当countryid大于以下返回的所有id,此结果才为True,此结果才返回3 (4     select countryid from country5     where countryname = ‘魏国‘6 )

 

exists嵌套查询
exists是sql中的逻辑运算符号。如果子查询有结果集返回,那么就为True。exists代表“存在”的意义,它只查找满足条件的那些记录。一旦找到第一个匹配的记录后,就马上停止查找。
实例5:
 1 WHERE exists 2 ( 3     SELECT 1      --SELECT 0  SELECT NULL 返回结果都一样,因为这三个子查询都有结果集返回,因此总是True  SELECT * FROM Person照常执行 4 ) 5  6 SELECT * FROM Person 7 WHERE exists 8 ( 9     SELECT * FROM Person 10     WHERE Person_Id = 100    --如果不存在Person_Id的记录,则子查询没有结果集返回,主语句不执行11 )

 

集合查询

操作的嵌套查询要求属性具有相同的定义,包括类型和取值范围。

1、并操作【union】的嵌套查询
语句范例 :(select 部门编号 from 雇员表) union (select 部门编号 from 部门表)
说明:并操作就是集合中并集的概念。属于集合A或集合B的元素的总和就是并集。

2、交操作【intersect】的嵌套查询    

语句范例 :(select 部门编号 from 雇员表) intersect (select 部门编号 from 部门表)
说明:   交操作就是集合中交集的概念。属于集合A且属于集合B的元素的总和就是交集。

3、差操作【minus】的嵌套查询

语句范例 :(select 部门编号 from 部门表) minus (select 部门编号 from 雇员表)

 说明:差操作就是集合中差集的概念。属于集合A(前一个孒查询结果)且不属于集合B(后一个孒查询结果)的元素的总和就是差集。

子查询

1 select ename,deptno,sal2         from emp3         where deptno=(select deptno from dept where loc=NEW YORK);

 

数据库原理-数据多表查询