Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何从两个表中选择两列_Sql_Two Columns - Fatal编程技术网

Sql 如何从两个表中选择两列

Sql 如何从两个表中选择两列,sql,two-columns,Sql,Two Columns,这些是我的桌子 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_i

这些是我的桌子

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

我在这里哪里出了问题

要联合两个
选择他们必须得到的结果

  • 相同的选定列计数
  • 同类
您实际想要使用的是
内部联接

SELECT emp_name,sum(salary) FROM employees 
INNER JOIN works ON employees.emp_no = works.emp_no 
WHERE works.hurs >= 20

正确的语法如下所示:

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
部分应包含要用逗号分隔的列列表。您可以显式引用表中的列,如示例所示

来自
部分应包含希望联接的表的列表,列表之间用逗号分隔。您可以提供表的简写名称,如第二个示例所示


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

首先,要获取员工的姓名及其所在部门,您应该使用
部门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
注意:
内部连接
连接
是同一件事

简而言之,您应该意识到使用
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

我得到了msgMsg 4104,16级,状态1,第1行多部分标识符“emp_no.employees”无法绑定。在我第一次提交时,它的顺序错误,已修复。现在我得到了Msg 8120,16级,状态1,第1行“employees.emp_name”列在选择列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY子句中。这很好,但我希望它同时显示两列(emp_name和工资总和)。这也是一个答案,但无法选择2