第3章 SQL 習題 - 3.9
阿新 • • 發佈:2018-11-19
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)