SQL -3

Posted yuexiuping

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL -3相关的知识,希望对你有一定的参考价值。

4.从不订购的客户

需求:某网站包含两个表,Customers表和Orders表,编写SQL查询,找出所有从不订购商品的客户。

展示效果:

Customers
Henry
Max

建表语句:

Create table If Not Exists Customers (Id int, Name varchar(255));
Create table If Not Exists Orders (Id int, CustomerId int);
Truncate table Customers;
insert into Customers (Id, Name) values (1, \'Joe\');
insert into Customers (Id, Name) values (2, \'Henry\');
insert into Customers (Id, Name) values (3, \'Sam\');
insert into Customers (Id, Name) values (4, \'Max\');
Truncate table Orders;
insert into Orders (Id, CustomerId) values (1, 3);
insert into Orders (Id, CustomerId) values (2, 1);

方法1:

select 
	c.name as `customer`
from Customers
where c.id not in (select customerid from Orders);

方法2:

select 
	c.name as `customer`
from Customers c
left join 
	Orders o 
on c.id = o.Customerid 
where o.id is null ;  --  或者 custmerid is null 

5.部门工资最高的员工

需求1:编写一个 SQL 查询,找出每个部门工资最高的员工。例如,根据上述给定的表格,Max 在 IT 部门有最高工资,Henry 在 Sales 部门有最高工资。

效果展示:

Department Employee Salary
IT Jim 90000
IT Max 90000
Sales Henry 80000

建表语句:

Create table If Not Exists Employee (Id int, Name varchar(255), Salary int, DepartmentId int);
Create table If Not Exists Department (Id int, Name varchar(255));
Truncate table Employee;
insert into Employee (Id, Name, Salary, DepartmentId) values (1, \'Joe\', 75000, 1);
insert into Employee (Id, Name, Salary, DepartmentId) values (2, \'Jim\', 90000, 1);
insert into Employee (Id, Name, Salary, DepartmentId) values (3, \'Henry\', 80000, 2);
insert into Employee (Id, Name, Salary, DepartmentId) values (4, \'Sam\', 60000, 2);
insert into Employee (Id, Name, Salary, DepartmentId) values (5, \'Max\', 90000, 1);
insert into Employee (Id, Name, Salary, DepartmentId) values (6, \'Randy\', 85000, 1);
insert into Employee (Id, Name, Salary, DepartmentId) values (7, \'Will\', 70000, 1);
Truncate table Department;
insert into Department (Id, Name) values (1, \'IT\');
insert into Department (Id, Name) values (2, \'Sales\');

方法1:

select 
	d.name as \'department\',
	e.name as \'employee\',
	Salary
from 
	Employee as e 
join 
	Department d
on
	e.departmentid = d.id 
where 
	(e.department,Salary ) in 
	(select 
     	department ,
     	max(salary)
     from department 
     group by departmentid 
    );

方法2:

select 
	department ,employee, salary
from (
	select 
    	d.name as \'department\',
    	e.name as \'employee\',
    	e.salary,
    	rank() over(partition by d.id order by salary desc ) rk 
    from
    	employee e
    join 
    	department d
    on e.demartmentid = d.id
) t1
where rk = 1;

需求2:找出每个部门获得前三高工资的所有员工。

展示效果:

Department Employee Salary
IT Max 90000
IT Jim 90000
IT Randy 85000
IT Joe 75000
Sales Henry 80000
Sales Sam 60000

方法1:

select 
	d.name as \'department\',
	e.name as \'employee\',
	e1.salary
from
	employee e1
join 
	department d
on
	e1.departmentid = d.id
where 
	(select 
    	distinct count(e2.salary)
    from 
    	employee e2 
    where 
    	e1.salary < e2.salary
    and 
    	e1.deparmentid = e2.departmentid) < 3
order by department,e1.salary desc;    	

方法2:

select 
	department,
	emplyee,
	salary
from 
	(
        select
        	d.name as \'department\',
        	e.name as \'employee\',
        	e.salary,
        	dense_rank() over(partition by d.id order by salary desc ) rk
        from 
        	employee e
        join  
        	department d
        on
        	e.departmentid = d.id 
    )t1
where rk <= 3;

6.超过经理收入的员工

需求:Employee 表包含所有员工,他们的经理也属于员工。每个员工都有一个 Id,此外还有一列对应员工的经理的 Id。编写一个 SQL 查询,该查询可以获取收入超过他们经理的员工的姓名。

效果展示:

Employee
Joe

建表语句:

create table If Not Exists Employee (Id int, Name varchar(255), Salary int, ManagerId int);
truncate table Employee;
insert into Employee (Id, Name, Salary, ManagerId) values (1, \'Joe\', 70000, 3);
insert into Employee (Id, Name, Salary, ManagerId) values (2, \'Henry\', 80000, 4);
insert into Employee (Id, Name, Salary, ManagerId) values (3, \'Sam\', 60000, null);
insert into Employee (Id, Name, Salary, ManagerId) values (4, \'Max\', 90000, null);

方法:

select
	e1.name as \'employee\'
from 
	employee e1
join 
	emplyee e2
on 
	e1.managerid = e2.id 
where e1.salary > e2.salary

以上是关于SQL -3的主要内容,如果未能解决你的问题,请参考以下文章

sql [sql技巧]一些sql技巧#sql

SQL基础

有大神知道,sql server 中如何批量执行sql语句吗?

sql SQL Server和Oracle SQL的SQL语法的一些示例

请推荐一本SQL教程

plsqldeveloper导入sql文件速度