1. 程式人生 > >第3章 SQL 習題 - 3.9

第3章 SQL 習題 - 3.9

3.9 考慮下圖所示的僱員資料庫,其中加下劃線的是主碼。為下面每個查詢寫出SQL表示式:

employee(employee_name, street, city)
works(employee_name, company_name, salary)
company(company_name, city)
managers(employee_name, manager_name)

                                             習題3.9、3.10、3.16、3.17和3.20的僱員資料庫

為了方便測試答案的正確性,在資料庫中建立如下關係:

drop table if exists employee cascade;
drop table if exists works cascade;
drop table if exists company cascade;
drop table if exists managers cascade;
create table employee(
    employee_name varchar not null, 
    street varchar,
    city varchar, 
    primary key (employee_name)
);
create table works(
    employee_name varchar not null, 
    company_name varchar,
    salary numeric(18,2),
    primary key (employee_name)
);
create table company(
    company_name varchar not null, 
    city varchar,
    primary key (company_name)
);
create table managers(
    employee_name varchar not null,
    manager_name varchar,
    primary key (employee_name)
);
insert into employee values('僱員_1', '地址_1', '城市_1');
insert into employee values('僱員_2', '地址_1', '城市_1');
insert into employee values('僱員_3', '地址_2', '城市_2');
insert into employee values('僱員_4', '地址_2', '城市_2');
insert into employee values('僱員_5', '地址_3', '城市_3');
insert into employee values('僱員_6', '地址_3', '城市_3');

insert into works values('僱員_1', '公司_1', 8000);
insert into works values('僱員_2', '公司_1', 9000);
insert into works values('僱員_3', '公司_2', 10000);
insert into works values('僱員_4', '公司_2', 11000);
insert into works values('僱員_5', '公司_3', 12000);
insert into works values('僱員_6', '公司_3', 13000);

insert into company values('公司_1', '城市_1');
insert into company values('公司_2', '城市_2');
insert into company values('公司_3', '城市_3');

insert into managers values('僱員_1', '僱員_2');
insert into managers values('僱員_2', '僱員_2');
insert into managers values('僱員_3', '僱員_4');
insert into managers values('僱員_4', '僱員_4');
insert into managers values('僱員_5', '僱員_6');
insert into managers values('僱員_6', '僱員_6');

a.找出所有為"公司_1"工作的僱員名字及其居住城市。

select * from works where company_name = '公司_1';
 employee_name | company_name | salary  
---------------+--------------+---------
 僱員_1        | 公司_1       | 8000.00
 僱員_2        | 公司_1       | 9000.00
(2 rows)

b.找出所有為'公司_1'工作且薪金超過10000美元的僱員名字、居住街道和城市。

select E.employee_name, street, city from employee as E 
natural join works where company_name = '公司_1' and salary > 10000;

c. 找出資料庫中所有不為'公司_1'工作的僱員。

select * from works where company_name != '公司_1';
 employee_name | company_name |  salary  
---------------+--------------+----------
 僱員_3        | 公司_2       | 10000.00
 僱員_4        | 公司_2       | 11000.00
 僱員_5        | 公司_3       | 12000.00
 僱員_6        | 公司_3       | 13000.00
(4 rows)

d.找出資料庫中工資高於'公司_2'的每個僱員的所有僱員。

select * from works where salary > all(
	select salary from works where company_name = '公司_2'
);
 employee_name | company_name |  salary  
---------------+--------------+----------
 僱員_5        | 公司_3       | 12000.00
 僱員_6        | 公司_3       | 13000.00
(2 rows)

e. 假設一個公司可以在好幾個城市有分部。找出位於'公司_2'所有所在城市的所有公司。

題目的意思是應該是找出'公司_2'所在的所有城市。

select distinct city from employee natural join
works where company_name = '公司_2';
  city  
--------
 城市_2
(1 row)

f.找出僱員最多的公司。

select company_name, count(employee_name) as employee_count from works
group by company_name having count(employee_name) >= all (
	select count(employee_name) from works 
	group by company_name
);
 company_name | employee_count 
--------------+----------------
 公司_1       |              2
 公司_2       |              2
 公司_3       |              2
(3 rows)

g. 找出平均工資高於'公司_1'平均工資的那些公司。

select company_name, cast(avg(salary) as numeric(18,2)) as avg_salary from works
group by company_name having avg(salary) > all (
	select avg(salary) from works 
	where company_name = '公司_1'
);
 company_name | avg_salary 
--------------+------------
 公司_2       |   10500.00
 公司_3       |   12500.00
(2 rows)