Oracle多表查询和分组函数

(1)自然连接(NATURAL JOIN)
在这里插入图片描述
自然连接必须要有相同的属性列才能进行,即等值连接之后要去除相同的属性列
自然连接(NATURAL JOIN)是一种特殊的等值连接,将表中具有相同名称的列自动进行匹配。
自然连接就是在两张表中寻找那些数据类型和列名都相同的记录。
(2)USING 子句
1.查询必须是等值连接。
2.等值连接中的列必须具有相同的名称和数据类型。
(3)外连接
在这里插入图片描述
outer join则会返回每个满足第一个(顶端)输入与第二个(底端)输入的联接的行。它还返回任何在第二个输入中没有匹配行的第一个输入中的行。外连接分为三种: 左外连接,右外连接,全外连接。 对应SQL:LEFT/RIGHT/FULL OUTER JOIN。 通常我们省略outer 这个关键字。 写成:LEFT/RIGHT/FULL JOIN。
左/右外连接:包含左/右边表的全部行(不管左/右的表中是否存在与它们匹配的行)以及左/右表中全部匹配的行, 左/右表不加限制,保留左/右表的数据,匹配左/右表,左/右表没有匹配到的行中的列显示为null。

在左连接和右连接时都会以一张A表为基础表,该表的内容会全部显示,然后加上A表和B表匹配的内容。 如果A表的数据在B表中没有记录。 那么在相关联的结果集行中列显示为空值(NULL)。
对于外连接, 也可以使用“(+) ”来表示。 关于使用(+)的一些注意事项:
(+)操作符只能出现在WHERE子句中,并且不能与OUTER JOIN语法同时使用。
当使用(+)操作符执行外连接时,如果在WHERE子句中包含有多个条件,则必须在所有条件中都包含(+)操作符。
(+)操作符只适用于列,而不能用在表达式上。
(+)操作符不能与OR和IN操作符一起使用。
(+)操作符只能用于实现左外连接和右外连接,而不能用于实现完全外连接。

select e.last_name,e.employee_id,e.department_id
from employees e,departments d
where e.department_id(+) = d.department_id

(+)号的作用:+号可以理解为补充的意思,加在那个表的列上就代表这个表的列为补充。加在右表的列上代表右表为补充,为左连接。加在左表的列上代表左表为补充,为右连接。注意:完全外连接中不能使用+号。
(4)----左/右外连接 sql 1999语法

select e.last_name,e.employee_id,e.department_id
from employees e left join departments d
on e.department_id = d.department_id

(5)全外连接
左右表都不加限制。即右外连接的结果为:左右表匹配的数据+左表没有匹配到的数据+右表没有匹配到的数据。
等值连接是只把满足条件的两个表的行相连,然后显示出来。完全外连接是把匹配查询条件的行、左表没有匹配到的、右表没有匹配到的都显示出来。

select e.last_name,e.department_id,d.department_name
from employees e full join departments d
on e.department_id=d.department_id

等值与非等值
(6)等值连接
等值连接必须要有等值的条件,当条件不同时连接的结果也不相同,两个关系可以没有相同的属性列

select employees.employee_id,employees.department_id,departments.department_name
from employees,departments,locations
where employees.department_id = departments.department_id
and locations.location_id = departments.location_id

(7)非等值连接
主要用除了等号之外的操作符,比如:<>、>、<、>=、<=、LIKE、IN、BETWEEN…AND。

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

在Oracle中的between A and B 相当于 时间大于等于A小于B , 即to_char(TIME,‘yyyy-mm-dd’)>= A and to_char(TIME,‘yyyy-mm-dd’)<B
(8)笛卡尔积,叉集
在这里插入图片描述
在这里插入图片描述
笛卡尔积: 在多表查询中不指定连接条件,就会出现一个表中的所有行都连接到另一个表中的所有行
定义:多张表相乘,简单的说就是两个集合相乘的积。(列数相加,行数相乘)
造成的问题:当 a ,b,c三个表的数据量较大时会造成数据库很慢
(9)分组函数
分组函数作用于一组数据,并对一组数据返回一个值。
AVG(平均值),COUNT(总数),MAX(最大值),MIN(最小值),SUM(求和)
组函数忽略空值
(10)distinct去重函数
多列去重是根据写在distinct后面的各个字段来去重的(当这几个字段所有的列的值都相同时才会被认为是重复数据)
(11)GROUP BY 子句
可以使用GROUP BY子句将表中的数据分成若干组
当查询中存在GROUP BY子句的时候,select列表中只能存在分组函数,或者Group By子句中的字段。
GROUP BY 用于归纳汇总相关数据
GROUP BY 子句可以直接在FROM之后,也可以在WHERE条件后面
GROUP BY子句经常和函数一起使用。(COUNT,AVG,SUM等)
GROUP BY是统计数据时候常用的子句,使用的时候有几点需要注意
(12)过滤分组: HAVING 子句
having子句和group by一起使用,紧跟在group by的后边,having子句可以使用结果集中的列,也可以使用聚合函数(max、min、count、sum、svg)。having的作用是对分组后的结果进行过滤。这里在提一where,where是对每一行进行过滤的,查询出符合where条件的每一行。having是对查询出结果集分组后的结果进行过滤。

SELECT   department_id, MAX(salary)
FROM     employees
GROUP BY department_id
HAVING   MAX(salary)>10000 ;

猜你喜欢

转载自blog.csdn.net/weixin_42530700/article/details/89075865