oracle多表查询知识点

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/czh500/article/details/82655324
--补充一下distinct去重知识点
--distinct是去重的意思,此句无法去重,只有distinct后面跟着的所有的字段的值全部一样才能去重
select distinct emp.employee_id, emp.last_name, emp.department_id, emp.manager_id 
from employees emp
where emp.department_id = 90 
and emp.manager_id = 100

--此句可以去重,因为distinct后面跟着的department_id和manager_id这2个字段的值一模一样,所以可以去重
select distinct emp.department_id, emp.manager_id 
from employees emp
where emp.department_id = 90 
and emp.manager_id = 100


--多表查询
--写成连接和联接都可以,字面意思都一样
--内联接:1.等值连接和不等值连接 2.非自连接和自连接
--外连接:左外联接,右外连接,满外连接


--内联接:等值连接和不等值连接
--外链接:左外联接和右外连接,满外连接

--如下这条语句,得到的是笛卡尔积employees表有107条记录,departments表有27条记录,所以这样查询的结果是2889条记录
select employees.employee_id, employees.last_name, employees.department_id, departments.department_name 
from employees,departments


--使用sql:1999语法连接
--cross join叉集,使用cross join产生叉集(叉集和笛卡尔积是相同的)
select emp.employee_id, emp.last_name, emp.department_id, dep.department_name 
from employees emp
cross join departments dep

--自然连接(将employees表和departments表这2张表中的相同字段作为连接条件[等值连接])
select employee_id, last_name, department_id, department_name 
from employees emp
natural join departments dep

--上面的natural join自然连接等价于下面这条语句
select employee_id, last_name, emp.department_id, department_name 
from employees emp, departments dep
where emp.department_id = dep.department_id
and emp.MANAGER_ID = dep.MANAGER_ID

--using这种方式有局限性(局限性:2张表中的字段名字,类型都要一样,如下:employees表和departments表中都叫department_id,这样就可以使用using(department_id)了)
--如果employees表中叫department_id,而departments表中叫dep_id,这样的话,使用using()就做不到了
select employee_id, last_name, department_id, department_name 
from employees emp
join departments dep
using(department_id)

--
select employee_id, last_name, emp.department_id, department_name 
from employees emp
join departments dep
on emp.department_id = dep.department_id

--
select employee_id, last_name, emp.department_id, department_name, city 
from employees emp
join departments dep
on emp.department_id = dep.department_id
join locations loc
on dep.location_id = loc.location_id

--查询所有有奖金的员工的last_name,department_name,location_id,city
select employee_id, last_name, emp.department_id, department_name, dep.location_id, city 
from employees emp
join departments dep
on emp.department_id = dep.department_id
join locations loc
on dep.location_id = loc.location_id
where emp.commission_pct is not null

--选择city在Toronto工作的员工的last_name,job_id,department_id,department_name
select last_name,job_id,emp.department_id,department_name
from employees emp, departments dep, locations loc
where (emp.department_id = dep.department_id) and (dep.location_id = loc.location_id) and (loc.city = 'Toronto')


--左外联接(outer关键字可以省略)
select employee_id, last_name, emp.department_id, department_name 
from employees emp
left outer join departments dep
on emp.department_id = dep.department_id

--右外联接
select employee_id, last_name, emp.department_id, department_name 
from employees emp
right outer join departments dep
on emp.department_id = dep.department_id

--满外连接(完全外连接)
select employee_id, last_name, emp.department_id, department_name 
from employees emp
full outer join departments dep
on emp.department_id = dep.department_id

--自连接(查询员工chen的manager的信息,manager也是一个员工)
select emp1.last_name as "员工名字", emp2.last_name as "上司名字", emp2.salary as "上司薪水", emp2.email as "上司邮箱" 
from employees emp1, employees emp2
where emp1.manager_id = emp2.employee_id and lower(emp1.last_name) = 'chen'

--也可以使用子查询(感觉有局限性,没办法通过emp2.last_name把员工的last_name显示出来,只能通过emp1显示上司信息,个人觉得还是自连接方便些)
select  emp1.last_name as "上司名字", emp1.salary "上司薪水", emp1.email "上司邮箱"
from employees emp1
where employee_id = (
select manager_id
from employees emp2
where lower(last_name) = 'chen'
)

-- 107 乘以 27 = 2889
select 107 * 27 from dual;

--为了避免笛卡尔积错误,我们可以用where加入有效的连接条件(等值连接)
select employees.employee_id, employees.last_name, employees.department_id, departments.department_name 
from employees,departments
where employees.department_id = departments.department_id

--可以使用别名来简写
select emp.employee_id, emp.last_name, emp.department_id, dep.department_name 
from employees emp ,departments dep
where emp.department_id = dep.department_id

--最简写
select employee_id, last_name, emp.department_id, department_name 
from employees emp ,departments dep
where emp.department_id = dep.department_id

--
select last_name, emp.department_id, department_id from employees emp
--查找部门编号为空的
select last_name, emp.department_id, department_id from employees emp where department_id is null

--
select employees.employee_id, employees.department_id, employees.last_name, departments.department_id, departments.department_name 
from employees,departments
where employees.department_id != departments.department_id

--3张表联查
select emp.employee_id, emp.last_name, emp.department_id, dep.department_name, loc.city 
from employees emp ,departments dep, locations loc
where emp.department_id = dep.department_id and dep.location_id = loc.location_id

--(非等值连接)
select employee_id, last_name, salary, grade_level 
from employees emp, job_grades gra
where emp.salary between gra.lowest_sal and gra.highest_sal

--
select last_name from employees where last_name between 'C' and 'F';
--
select count(employee_id) from employees;
select count(*) from employees;
--
select * from departments where department_id is null or department_name is null

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

--左外连接(左外联接)方式1
select employees.employee_id, employees.last_name, employees.department_id, departments.department_name 
from employees,departments
where employees.department_id = departments.department_id(+)

--左外连接(左外联接)(outer关键字可以省略)方式2
select employees.employee_id, employees.last_name, employees.department_id, departments.department_name 
from employees 
left outer join departments
on employees.department_id = departments.department_id


--左外连接(左外联接)
select employees.employee_id, employees.last_name, employees.department_id, departments.department_name 
from employees 
left join departments 
on employees.department_id = departments.department_id


--右外连接(右外联接)
select employees.employee_id, employees.last_name, employees.department_id, departments.department_name 
from employees,departments
where employees.department_id(+) = departments.department_id

--右外连接(右外联接)
select employees.employee_id, employees.last_name, employees.department_id, departments.department_name 
from employees 
right join departments
on employees.department_id = departments.department_id

--查询90号部门员工的job_id和location_id
--
select emp.job_id, dep.location_id 
from employees emp, departments dep
where emp.department_id(+) = dep.department_id
and dep.department_id = 90
--
select emp.job_id, dep.location_id 
from employees emp, departments dep
where emp.department_id(+) = dep.department_id
and emp.department_id = 90

--
select emp.job_id as "工作id", dep.location_id as "地址id"
from employees emp left outer join departments dep
on emp.department_id = dep.department_id
where emp.department_id = 90

--distinct关键字是去重的意思
select distinct emp.job_id as "工作id", dep.location_id as "地址id"
from employees emp left outer join departments dep
on emp.department_id = dep.department_id
where emp.department_id = 90
--
select emp.job_id as "工作id", dep.location_id as "地址id"
from employees emp left outer join departments dep
on emp.department_id = dep.department_id
where dep.department_id = 90

--
select emp.last_name, emp.department_id, dep.department_id, dep.department_name
from employees emp left outer join departments dep
on emp.department_id = dep.department_id

--
select emp.job_id as "工作id", dep.location_id as "地址id"
from employees emp join departments dep
on emp.department_id = dep.department_id
where emp.department_id = 90




----------------------看看下面的sql语句有哪些问题和歧义
--
select emp.job_id as "工作id", emp.*, dep.location_id as "地址id", dep.*
from employees emp left outer join departments dep
on emp.department_id = 90


--
select emp.job_id as "工作id", emp.*, dep.location_id as "地址id", dep.*
from employees emp right outer join departments dep
on emp.department_id = dep.department_id
and emp.department_id = 90

--
select emp.job_id as "工作id", emp.*, dep.location_id as "地址id", dep.*
from employees emp right outer join departments dep
on emp.department_id = dep.department_id

--
select emp.job_id as "工作id", emp.*, dep.location_id as "地址id", dep.*
from employees emp join departments dep
on emp.department_id = 90

--
select emp.job_id as "工作id", emp.*, dep.location_id as "地址id", dep.*
from employees emp, departments dep
where emp.department_id = 90


----------------------
--
select * from employees emp where emp.department_id = 90
--
select * from departments


--自连接
select emp1.employee_id as "员工编号", emp1.last_name as "员工名字", emp2.employee_id as "上司工号", emp2.last_name as "上司名字"
from employees emp1, employees emp2
where emp1.manager_id = emp2.employee_id

--自连接(同时也是左外联接)
select emp1.employee_id as "员工编号", emp1.last_name as "员工名字", emp2.employee_id as "上司工号", emp2.last_name as "上司名字"
from employees emp1, employees emp2
where emp1.manager_id = emp2.employee_id(+)

--补充一下distinct去重知识点
--distinct是去重的意思,此句无法去重,只有distinct后面跟着的所有的字段的值全部一样才能去重
select distinct emp.employee_id, emp.last_name, emp.department_id, emp.manager_id
from employees emp
where emp.department_id = 90
and emp.manager_id = 100

--此句可以去重,因为distinct后面跟着的department_id和manager_id这2个字段的值一模一样,所以可以去重
select distinct emp.department_id, emp.manager_id
from employees emp
where emp.department_id = 90
and emp.manager_id = 100


--多表查询
--写成连接和联接都可以,字面意思都一样
--内联接:1.等值连接和不等值连接 2.非自连接和自连接
--外连接:左外联接,右外连接,满外连接


--内联接:等值连接和不等值连接
--外链接:左外联接和右外连接,满外连接

--如下这条语句,得到的是笛卡尔积employees表有107条记录,departments表有27条记录,所以这样查询的结果是2889条记录
select employees.employee_id, employees.last_name, employees.department_id, departments.department_name
from employees,departments


--使用sql:1999语法连接
--cross join叉集,使用cross join产生叉集(叉集和笛卡尔积是相同的)
select emp.employee_id, emp.last_name, emp.department_id, dep.department_name
from employees emp
cross join departments dep

--自然连接(将employees表和departments表这2张表中的相同字段作为连接条件[等值连接])
select employee_id, last_name, department_id, department_name
from employees emp
natural join departments dep

--上面的natural join自然连接等价于下面这条语句
select employee_id, last_name, emp.department_id, department_name
from employees emp, departments dep
where emp.department_id = dep.department_id
and emp.MANAGER_ID = dep.MANAGER_ID

--using这种方式有局限性(局限性:2张表中的字段名字,类型都要一样,如下:employees表和departments表中都叫department_id,这样就可以使用using(department_id)了)
--如果employees表中叫department_id,而departments表中叫dep_id,这样的话,使用using()就做不到了
select employee_id, last_name, department_id, department_name
from employees emp
join departments dep
using(department_id)

--
select employee_id, last_name, emp.department_id, department_name
from employees emp
join departments dep
on emp.department_id = dep.department_id

--
select employee_id, last_name, emp.department_id, department_name, city
from employees emp
join departments dep
on emp.department_id = dep.department_id
join locations loc
on dep.location_id = loc.location_id

--查询所有有奖金的员工的last_name,department_name,location_id,city
select employee_id, last_name, emp.department_id, department_name, dep.location_id, city
from employees emp
join departments dep
on emp.department_id = dep.department_id
join locations loc
on dep.location_id = loc.location_id
where emp.commission_pct is not null

--选择city在Toronto工作的员工的last_name,job_id,department_id,department_name
select last_name,job_id,emp.department_id,department_name
from employees emp, departments dep, locations loc
where (emp.department_id = dep.department_id) and (dep.location_id = loc.location_id) and (loc.city = 'Toronto')


--左外联接(outer关键字可以省略)
select employee_id, last_name, emp.department_id, department_name
from employees emp
left outer join departments dep
on emp.department_id = dep.department_id

--右外联接
select employee_id, last_name, emp.department_id, department_name
from employees emp
right outer join departments dep
on emp.department_id = dep.department_id

--满外连接(完全外连接)
select employee_id, last_name, emp.department_id, department_name
from employees emp
full outer join departments dep
on emp.department_id = dep.department_id

--自连接(查询员工chen的manager的信息,manager也是一个员工)
select emp1.last_name as "员工名字", emp2.last_name as "上司名字", emp2.salary as "上司薪水", emp2.email as "上司邮箱"
from employees emp1, employees emp2
where emp1.manager_id = emp2.employee_id and lower(emp1.last_name) = 'chen'

--也可以使用子查询(感觉有局限性,没办法通过emp2.last_name把员工的last_name显示出来,只能通过emp1显示上司信息,个人觉得还是自连接方便些)
select  emp1.last_name as "上司名字", emp1.salary "上司薪水", emp1.email "上司邮箱"
from employees emp1
where employee_id = (
select manager_id
from employees emp2
where lower(last_name) = 'chen'
)

-- 107 乘以 27 = 2889
select 107 * 27 from dual;

--为了避免笛卡尔积错误,我们可以用where加入有效的连接条件(等值连接)
select employees.employee_id, employees.last_name, employees.department_id, departments.department_name
from employees,departments
where employees.department_id = departments.department_id

--可以使用别名来简写
select emp.employee_id, emp.last_name, emp.department_id, dep.department_name
from employees emp ,departments dep
where emp.department_id = dep.department_id

--最简写
select employee_id, last_name, emp.department_id, department_name
from employees emp ,departments dep
where emp.department_id = dep.department_id

--
select last_name, emp.department_id, department_id from employees emp
--查找部门编号为空的
select last_name, emp.department_id, department_id from employees emp where department_id is null

--
select employees.employee_id, employees.department_id, employees.last_name, departments.department_id, departments.department_name
from employees,departments
where employees.department_id != departments.department_id

--3张表联查
select emp.employee_id, emp.last_name, emp.department_id, dep.department_name, loc.city
from employees emp ,departments dep, locations loc
where emp.department_id = dep.department_id and dep.location_id = loc.location_id

--(非等值连接)
select employee_id, last_name, salary, grade_level
from employees emp, job_grades gra
where emp.salary between gra.lowest_sal and gra.highest_sal

--
select last_name from employees where last_name between 'C' and 'F';
--
select count(employee_id) from employees;
select count(*) from employees;
--
select * from departments where department_id is null or department_name is null

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

--左外连接(左外联接)方式1
select employees.employee_id, employees.last_name, employees.department_id, departments.department_name
from employees,departments
where employees.department_id = departments.department_id(+)

--左外连接(左外联接)(outer关键字可以省略)方式2
select employees.employee_id, employees.last_name, employees.department_id, departments.department_name
from employees
left outer join departments
on employees.department_id = departments.department_id


--左外连接(左外联接)
select employees.employee_id, employees.last_name, employees.department_id, departments.department_name
from employees
left join departments
on employees.department_id = departments.department_id


--右外连接(右外联接)
select employees.employee_id, employees.last_name, employees.department_id, departments.department_name
from employees,departments
where employees.department_id(+) = departments.department_id

--右外连接(右外联接)
select employees.employee_id, employees.last_name, employees.department_id, departments.department_name
from employees
right join departments
on employees.department_id = departments.department_id

--查询90号部门员工的job_id和location_id
--
select emp.job_id, dep.location_id
from employees emp, departments dep
where emp.department_id(+) = dep.department_id
and dep.department_id = 90
--
select emp.job_id, dep.location_id
from employees emp, departments dep
where emp.department_id(+) = dep.department_id
and emp.department_id = 90

--
select emp.job_id as "工作id", dep.location_id as "地址id"
from employees emp left outer join departments dep
on emp.department_id = dep.department_id
where emp.department_id = 90

--distinct关键字是去重的意思
select distinct emp.job_id as "工作id", dep.location_id as "地址id"
from employees emp left outer join departments dep
on emp.department_id = dep.department_id
where emp.department_id = 90
--
select emp.job_id as "工作id", dep.location_id as "地址id"
from employees emp left outer join departments dep
on emp.department_id = dep.department_id
where dep.department_id = 90

--
select emp.last_name, emp.department_id, dep.department_id, dep.department_name
from employees emp left outer join departments dep
on emp.department_id = dep.department_id

--
select emp.job_id as "工作id", dep.location_id as "地址id"
from employees emp join departments dep
on emp.department_id = dep.department_id
where emp.department_id = 90


----------------------看看下面的sql语句有哪些问题和歧义
--
select emp.job_id as "工作id", emp.*, dep.location_id as "地址id", dep.*
from employees emp left outer join departments dep
on emp.department_id = 90


--
select emp.job_id as "工作id", emp.*, dep.location_id as "地址id", dep.*
from employees emp right outer join departments dep
on emp.department_id = dep.department_id
and emp.department_id = 90

--
select emp.job_id as "工作id", emp.*, dep.location_id as "地址id", dep.*
from employees emp right outer join departments dep
on emp.department_id = dep.department_id

--
select emp.job_id as "工作id", emp.*, dep.location_id as "地址id", dep.*
from employees emp join departments dep
on emp.department_id = 90

--
select emp.job_id as "工作id", emp.*, dep.location_id as "地址id", dep.*
from employees emp, departments dep
where emp.department_id = 90


----------------------
--
select * from employees emp where emp.department_id = 90
--
select * from departments


--自连接
select emp1.employee_id as "员工编号", emp1.last_name as "员工名字", emp2.employee_id as "上司工号", emp2.last_name as "上司名字"
from employees emp1, employees emp2
where emp1.manager_id = emp2.employee_id

--自连接(同时也是左外联接)
select emp1.employee_id as "员工编号", emp1.last_name as "员工名字", emp2.employee_id as "上司工号", emp2.last_name as "上司名字"
from employees emp1, employees emp2
where emp1.manager_id = emp2.employee_id(+)

猜你喜欢

转载自blog.csdn.net/czh500/article/details/82655324