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

首先,要获取工人的姓名和他们的部门,您应该链接表employeesdepartment使用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是相对直观的..您是基于两个表拥有的“相同”列链接它们..
[其中一个是另一个(主)键的外键]

更新:

您可以将员工的姓名和他们的总工资一起显示如下,但这似乎是多余的..

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部分应包含您希望加入的表列表,以逗号分隔。您可以为表提供简写名称,如第二个示例所示。

WHERE部分允许您标记两个表之间相关的列。

于 2014-05-13T00:47:57.513 回答
0

要合并两个SELECT结果,他们必须有

  • 相同的选定列数
  • 同类型的

你真正想要使用的是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 回答