📅  最后修改于: 2020-11-30 09:20:14             🧑  作者: Mango
在本节中,我们将了解PostgreSQL内部联接的工作原理,该联接用于从许多表中选择数据。我们还将学习如何使用WHERE子句,USING子句, 运算符和联接三个表,即PostgreSQL内部联接中的表别名。
PostgreSQL INNER JOIN子句是什么?
在关系数据库中,数据自然地分布在一个以上的表中,要选择聚合数据,我们经常需要从各种表中选择数据。
PostgreSQL内部连接用于仅返回表中的那些记录,这些记录等同于定义的条件,并隐藏其他行和列。在PostgreSQL中,它是默认的Join,因此在查询中不必使用Inner Join关键字。
下面的维恩图显示了PostgreSQL内部联接,我们可以很容易地了解到内部联接仅返回Table1和Table2中的匹配记录:
内连接关键字与SELECT命令一起使用,并且必须写在FROM子句之后。
以下语法对其进行了更清晰的描述:
SELECT [column_list |*]
FROM table1
INNER JOIN table2
ON table1.column_name=table2.column.name;
PostgreSQL内部连接的语法与USING子句
SELECT [column_list |* ]
FROM table1
INNER JOIN table2
USING (column.name);
带有WHERE子句的PostgreSQL内部连接的语法
SELECT [column_list |*]
FROM table1, table2
WHERE table.column_name=table2.column_name;
我们将按照以下步骤将表A与表B连接起来:
注意:连接条件返回内部条件中描述的表之间的相似行。
让我们看一个示例,以了解PostgreSQL内部联接的工作方式:
为此,我们将在CREATE命令的帮助下创建两个名为Employee表和department表的表,并使用INSERT命令插入一些值。
首先,我们将使用CREATE命令创建一个Employee和department表:
create table Employee(
emp_id int primary key,
emp_fname varchar not null,
emp_lname varchar not null,
location varchar(30) );
以下命令用于创建部门表:
Create table department
(emp_id int primary key,
dept_id int not null,
dept_name varchar NOT NULL);
执行上述命令后,已成功创建Employee表和Department表。
一旦生成了两个表,我们就可以使用INSERT命令如下向其中插入一些值:
INSERT INTO Employee (emp_id, emp_fname, emp_lname, location)
VALUES
(1, 'John', 'Smith', 'New York'),
(2, 'Mia', 'Clark','Florida'),
(3, 'Noah','Rodriguez','Chicago'),
(4, 'Ava','Gracia','Houston'),
(5,'James','Luther','Los Angeles');
在下面的命令中,我们将值插入Department表中:
INSERT INTO department (emp_id, dept_id, dept_name)
VALUES
(1, 1, 'ACCOUNTING'),
(2, 2,'SALES'),
(3, 3,'RESEARCH'),
(4, 4,'OPERATIONS'),
(5, 5,'HUMAN RESOURCES');
在将值创建并插入Employee和department表之后,我们将获得以下输出:
表1:员工
表2:部门
以下查询用于从两个表( Employee和department )中选择记录:
SELECT emp_fname, emp_lname,location,dept_name
FROM Employee
INNER JOIN department
ON Employee.emp_id= department.dept_id;
输出量
一旦执行了上面的命令,我们将得到以下结果:
通常,我们要联接的表将具有名称相似的列,例如emp_id列。
如果我们在命令中引用不同表中具有相似名称的列,则将发生错误,并且为了避免发生此特定错误,我们需要使用以下语法。
table_name.column_name
实时地,我们将使用表别名为联接的表分配短名称,以使该命令更易于理解。
在下面的命令中,我们将使用表别名,并且它将返回与上面类似的结果:
SELECT e.emp_id, emp_fname, emp_lname,location,dept_name
FROM Employee e
INNER JOIN department d
ON e.emp_id = d.dept_id;
输出量
一旦执行了以上命令,我们将获得以下输出:
在这里,我们将看到PostgreSQL内部联接如何与USING子句一起使用,因为有时两个表中的列名都相似。这就是为什么我们可以使用USING子句获取值的原因。
在下面的示例中,我们使用USING子句,因为两个表的emp_id列均相似。
SELECT emp_id, emp_fname,location, dept_name
FROM Employee
INNER JOIN department
USING (emp_id);
输出量
执行以上语句后,我们将得到以下结果:
我们还可以将内部联接与WHERE条件一起使用。 WHERE子句允许我们返回过滤器结果。
在下面的示例中,我们将从Employee表和Department表中选择dept_name等于Sales的行:
SELECT emp_fname, dept_id, dept_name, location
FROM Employee
INNER JOIN department
USING (emp_id) WHERE dept_name ='SALES';
输出量
成功执行以上命令后,将给出以下输出:
在本教程的以上部分中,我们已经创建了两个表Employee和department 。现在,我们想再联接一个表,并在内部联接的帮助下从该特定表中获取记录。
因此,为此,我们将使用CREATE命令再创建一个表作为Jobs ,如下面的命令所示:
CREATE TABLE Jobs(
job_id int primary key,
job_description varchar not null);
成功创建Jobs表后,我们将在INSERT命令的帮助下向其中插入一些值,如以下命令所示:
INSERT INTO Jobs (job_id, job_description)
VALUES (1, 'Training'),
(2, 'Management'),
(3, 'Executive'),
(4, 'Non-Executive');
在Jobs表中创建并插入值之后,我们将获得以下输出:
表3:工作
以下命令用于连接三个表,例如Employee,department和Jobs 。因此,我们将在第一个INNER JOIN子句之后使用第二个INNER JOIN子句:
SELECT emp_id, emp_fname, dept_name, location, job_description
FROM Employee
INNER JOIN department USING (emp_id)
INNER JOIN Jobs
ON department.emp_id = jobs.job_id
ORDER BY emp_id;
输出量
一旦实现了上面的查询,我们将得到以下结果:
注意:要连接三个以上的表,我们可以使用上述方法。
PostgreSQL允许许多运算符,这些运算符可以与内部联接一起使用,例如等于(=),不等于(!=),大于(>),小于(<)等。
在下面的示例中,我们对内部联接使用不等于(!=)运算符:
SELECT emp_fname, emp_lname,location,dept_name
FROM Employee
INNER JOIN department
ON Employee.emp_id= department.dept_id
WHERE dept_name != 'SALES';
输出量
一旦单击Execute按钮,我们将获得以下输出,其中显示了dept_name不等于SALES的那些值。
在PostgreSQL内部联接部分中,我们学习了以下主题: