0

これらは私のテーブルです

create table employees
(emp_no integer not null,
   emp_name char(25),
   age integer,
   department_id integer not null,
   salary integer,

   CONSTRAINT employees_pk PRIMARY KEY(emp_no),
   CONSTRAINT fk_Department FOREIGN KEY(department_id) 
                            REFERENCES Department(department_id));

insert into employees values ( 15,'sara',30 ,101 ,2000 )
insert into employees values ( 12,'maha',29 ,104 ,3000 )
insert into employees values ( 14,'ahmad',24 , 102,4400 )
insert into employees values ( 11,'ali', 27, 103, 2500)
insert into employees values ( 13,'nora', 35, 101,3500 )


create table Works
(emp_no integer not null,
   hurs integer,
   department_id integer not null,

   CONSTRAINT  Works_pk PRIMARY KEY(emp_no),
   CONSTRAINT Department_fk FOREIGN KEY(department_id)
                            REFERENCES Department(department_id));

insert into Works values ( 11,7,103)
insert into Works values (12,9,104)
insert into Works values (13,5,101)
insert into Works values (14,10,102)
insert into Works values (15,8,101)

create table Department
(Department_id integer not null,
   dep_name char(50),

   CONSTRAINT Department_pk PRIMARY KEY(Department_id));

insert into Department values (101,'computer')
insert into Department values (102,'history')
insert into Department values (103,'english')
insert into Department values (104,'physics')

そして、従業員名とその部署名を選択したいのですが、これらは私のコマンドが正しく機能していません:

select emp_name 
from employees 

select dep_name 
from Department

select emp_name 
from employees 
union 
select dep_name 
from Department

select emp_name, dep_name 
from Department 
cross join employees

SELECT employees.emp_name, Department.dep_name 
FROM employees, Department 
where employees.emp_name = Department.dep_name

select emp_name, Department.dep_name  
from employees 
inner JOIN Department on employees.emp_name = Department.dep_name

select 
    count(distinct employees.emp_name) 
from 
    employees 
where 
    employees.emp_name not in (select distinct Department.dep_name 
                               from Department)

select (employees.emp_name) 
from employees 
where employees.emp_name not in (select Department.dep_name 
                                 from Department)

また、勤務時間が 20 時間以上の従業員名と給与の合計を選択したいのですが、コマンドが機能しませんでした。

select 
    emp_name, sum(salary)
from 
    employees 
union 
select 
    hurs 
from 
    works 
where 
    hurs >= 20

ここでどこで間違ったのですか

4

3 に答える 3

1

まず、労働者の名前とその部門を取得するには、テーブルemployeesをリンクし、名前ではなくをdepartment使用する必要があります。department_id

select emp_name,Department.dep_name
from employees inner JOIN Department
on employees.department_id = Department.Department_id

労働時間が 20 時間以上の従業員の場合:

select employees.emp_name
from employees join works
on employees.emp_no=works.emp_no AND works.hurs>=20

そして彼らの総給料:

select sum(employees.salary)
from employees join works
on employees.emp_no=works.emp_no AND works.hurs>=20

注:inner joinjoinは同じものです..

要するに、使用してテーブルをリンクすることjoinは比較的直感的であることを理解する必要があります..両方のテーブルが所有する「同じ」列に基づいてそれらをリンクしています..
[それらの1つは他の(主)キーの外部キーです]

アップデート:

次のように、従業員の名前と合計給与を一緒に表示できますが、冗長に思えます。

select employees.emp_name, sum(employees.salary)
from employees join works
on employees.emp_no=works.emp_no AND works.hurs>=20
group by employees.emp_name
于 2014-05-13T00:48:03.777 に答える
0

正しい構文は次のとおりです。

SELECT employees.emp_name,
       Department.dep_name
FROM employees, Department
WHERE employees.department_id = Department.department_id

または省略形で:

SELECT e.emp_name,
       d.dep_name
FROM employees as e, Department as d
WHERE e.department_id = d.department_id

何が起こっているかの説明:

SELECTセクションには、コンマで区切られた列のリストが含まれている必要があります。例に示すように、テーブルから列を明示的に参照できます。

FROMセクションには、カンマで区切られた、結合するテーブルのリストが含まれている必要があります。2 番目の例に示すように、テーブルの短縮名を指定できます。

このWHEREセクションでは、2 つのテーブル間でどの列が関連しているかをマークできます。

于 2014-05-13T00:47:57.513 に答える
0

SELECT2 つの結果を結合するには、必要な

  • 同じ選択列数
  • 同じタイプの

あなたが実際に使いたいのはINNER JOIN

SELECT emp_name,sum(salary) FROM employees 
INNER JOIN works ON employees.emp_no = works.emp_no 
WHERE works.hurs >= 20
于 2014-05-13T00:45:47.810 に答える