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