SQL 内连接
SQL – 内连接 是指在数据库中基于共同字段/列,将多个相关表进行组合的一种连接方式。
有两种主要类型的连接: 内连接 和 外连接 。其他连接类型,如左连接、右连接、全连接等,只是这两种连接的子类型。在本教程中,我们只学习内连接。
SQL 内连接
SQL 内连接是一种通过检索在两个表中具有匹配值的记录来组合多个表的连接类型(在共同列中)。
它将第一个表的每一行与第二个表的每一行进行比较,找到满足连接谓词的所有行对。当连接谓词得到满足时,两个表的列值将被合并为一个新表。
内连接也被称为 等值连接 。它是默认的连接方式;即使使用“ 连接 ”关键字代替“ 内连接 ”,表也是使用共同列的匹配记录进行连接。
解释
让我们通过一个例子场景来更好地理解。
假设我们有一个公司的雇员信息分为两个表,分别是EmpDetails和Marital status。其中,
- EmpDetails表包含雇员ID、姓名和工资等详情。
-
MaritalStatus表包含雇员ID、年龄和婚姻状况等详情。
语法
以下是SQL内连接的基本语法:
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;
示例
假设我们已经创建了一个名为CUSTOMERS的表,其中包含了客户的个人详细信息,包括姓名、年龄、地址和薪水等,使用以下查询语句-
CREATE TABLE CUSTOMERS (
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25),
SALARY DECIMAL (18, 2),
PRIMARY KEY (ID)
);
现在使用INSERT语句将值插入到这个表中,方法如下:
INSERT INTO CUSTOMERS VALUES
(1, 'Ramesh', 32, 'Ahmedabad', 2000.00 ),
(2, 'Khilan', 25, 'Delhi', 1500.00 ),
(3, 'Kaushik', 23, 'Kota', 2000.00 ),
(4, 'Chaitali', 25, 'Mumbai', 6500.00 ),
(5, 'Hardik', 27, 'Bhopal', 8500.00 ),
(6, 'Komal', 22, 'MP', 4500.00 ),
(7, 'Muffy', 24, 'Indore', 10000.00 );
表格将被创建为 –
ID | NAME | AGE | ADDRESS | SALARY |
---|---|---|---|---|
1 | Ramesh | 32 | Ahmedabad | 2000.00 |
2 | Khilan | 25 | Delhi | 1500.00 |
3 | Kaushik | 23 | Kota | 2000.00 |
4 | Chaitali | 25 | Mumbai | 6500.00 |
5 | Hardik | 27 | Bhopal | 8500.00 |
6 | Komal | 22 | MP | 4500.00 |
7 | Muffy | 24 | Indore | 10000.00 |
让我们创建另一个名为ORDERS的表,包含制定的订单的详细信息和订单日期。
CREATE TABLE ORDERS (
OID INT NOT NULL,
DATE VARCHAR (20) NOT NULL,
CUSTOMER_ID INT NOT NULL,
AMOUNT DECIMAL (18, 2)
);
以以下方式使用INSERT语句向该表中插入值−
INSERT INTO ORDERS VALUES
(102, '2009-10-08 00:00:00', 3, 3000.00),
(100, '2009-10-08 00:00:00', 3, 1500.00),
(101, '2009-11-20 00:00:00', 2, 1560.00),
(103, '2008-05-20 00:00:00', 4, 2060.00);
该表格的显示如下所示− OID | DATE | CUSTOMER_ID | AMOUNT |
---|---|---|---|
102 | 2009-10-08 00:00:00 | 3 | 3000.00 |
100 | 2009-10-08 00:00:00 | 3 | 1500.00 |
101 | 2009-11-20 00:00:00 | 2 | 1560.00 |
103 | 2008-05-20 00:00:00 | 4 | 2060.00 |
让我们现在使用 内连接查询 将这两张表组合起来,如下所示:
SELECT ID, NAME, AMOUNT, DATE
FROM CUSTOMERS
INNER JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID;
输出
这个查询的结果如下所得:
ID | NAME | AMOUNT | DATE |
---|---|---|---|
3 | Kaushik | 3000.00 | 2009-10-08 00:00:00 |
3 | Kaushik | 1500.00 | 2009-10-08 00:00:00 |
2 | Khilan | 1560.00 | 2009-11-20 00:00:00 |
4 | Chaitali | 2060.00 | 2008-05-20 00:00:00 |
使用内连接连接多个表
到目前为止,我们只学会了如何使用内连接连接两个表。但是,我们也可以使用内连接连接尽可能多的表,只需指定用于连接这些表的条件。
语法
以下是使用内连接连接多个表的语法−
SELECT column1, column2, column3...
FROM table1
INNER JOIN table2
ON condition_1
INNER JOIN table3
ON condition_2
....
....
INNER JOIN tableN
ON condition_N;
请注意,即使在这种情况下,也只能根据一个条件将两个表连接在一起。这个过程按顺序进行,直到所有的表都被组合在一起。
示例
让我们利用之前的CUSTOMERS和ORDERS表以及一个新的表EMPLOYEE。我们将使用以下查询语句创建EMPLOYEE表-
CREATE TABLE EMPLOYEE (
EID INT NOT NULL,
EMPLOYEE_NAME VARCHAR (30) NOT NULL,
SALES_MADE DECIMAL (20)
);
现在,我们可以使用INSERT语句将值插入到这些空表中,如下所示−
INSERT INTO EMPLOYEE VALUES
(102, 'SARIKA', 4500),
(100, 'ALEKHYA', 3623),
(101, 'REVATHI', 1291),
(103, 'VIVEK', 3426);
下面可以看到EMPLOYEE表的详细信息。
EID | EMPLOYEE_NAME | SALES_MADE |
---|---|---|
102 | SARIKA | 4500 |
100 | ALEKHYA | 3623 |
101 | REVATHI | 1291 |
103 | VIVEK | 3426 |
使用以下查询,我们可以将三个表CUSTOMERS,ORDERS和EMPLOYEE合并。
SELECT OID, DATE, AMOUNT, EMPLOYEE_NAME FROM CUSTOMERS
INNER JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID
INNER JOIN EMPLOYEE
ON ORDERS.OID = EMPLOYEE.EID;
输出
上述内连接查询的结果如下所示 −
OID | DATE | AMOUNT | EMPLOYEE_NAME |
---|---|---|---|
102 | 2009-10-08 00:00:00 | 3000.00 | SARIKA |
100 | 2009-10-08 00:00:00 | 1500.00 | ALEKHYA |
101 | 2009-11-20 00:00:00 | 1560.00 | REVATHI |
103 | 2008-05-20 00:00:00 | 2060.00 | VIVEK |
内连接与WHERE子句
SQL中的子句用于在使用SQL查询检索数据时应用约束。SQL使用各种子句来约束数据,例如WHERE子句、GROUP BY子句、ORDER BY子句、UNION子句等。
WHERE子句用于过滤表中的数据。该子句指定了一个条件,只检索满足该条件的记录。
内连接使用WHERE子句对要检索的数据应用更多约束。例如,当检索一个组织的员工记录时,如果我们只想检查那些每月收入超过25000的员工数据,我们需要指定一个WHERE条件(salary > 25000)来仅检索这些员工记录。
语法
在使用WHERE子句时,内连接的语法如下所示−
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name
WHERE condition;
示例
在此示例中,我们正在使用内连接查询连接CUSTOMERS和ORDERS两个表,并使用WHERE子句对结果应用一些约束。
在这里,我们从CUSTOMERS表中检索ID和NAME,并从ORDERS表中检索DATE和AMOUNT,其中支付金额大于2000。
SELECT ID, NAME, DATE, AMOUNT FROM CUSTOMERS
INNER JOIN ORDERS
ON CUSTOMERS.ID = ORDERS.CUSTOMER_ID
WHERE ORDERS.AMOUNT > 2000.00;
输出
应用内连接后的where子句后,结果表包含AMOUNT值大于2000.00的行−
ID | NAME | DATE | AMOUNT |
---|---|---|---|
3 | Kaushik | 2009-10-08 00:00:00 | 3000.00 |
4 | Chaitali | 2008-05-20 00:00:00 | 2060.00 |