接上文Python开发从零开始-49.12-数据库操作,本文小编与大家分享 Python 数据库操作的相关知识。
(24)多表查询概述
多表查询是指在一条 SQL 语句中同时从两张及以上关联表中提取数据的操作。SQLite 的多表查询主要包括:
连接查询(JOIN):用于结合两个或多个数据库中表的记录;
联合查询(UNION):合并两个或多个 SELECT 语句的结果,不返回任何重复的行;
子查询(SUBQUERY):是指在一个 SQL 查询语句中嵌套的另一个查询。子查询通常用于从数据集中选择数据,然后将这些数据用作外部查询的条件、表达式或结果。
为方便多表查询示例,除使用前文中的 COMPANY 表外,另外新建 DEPARTMENT 表,该表定义如下:
CREATE TABLE DEPARTMENT(DEP_ID INT PRIMARY KEY,DEPT CHAR (50) NOT NULL,EMP_ID INT NOT NULL);
插入 3 条数据如下:
INSERT INTO DEPARTMENT (DEP_ID, DEPT, EMP_ID)VALUES (1, 'IT Billing', 1 );INSERT INTO DEPARTMENT (DEP_ID, DEPT, EMP_ID)VALUES (2, 'Engineering', 2 );INSERT INTO DEPARTMENT (DEP_ID, DEPT, EMP_ID)VALUES (3, 'Finance', 7 );
DEPARTMENT 表查询结果为:

(25)多表查询-JOIN 查询
JOIN 子句用于结合两个或多个数据库中表的记录。JOIN 是一种通过共同值来结合两个表中字段的手段。
SQL 定义了三种主要类型的连接:
1)交叉连接(CROSS JOIN)
把第一个表的每一行与第二个表的每一行进行匹配。如果两个输入表分别有 x 和 y 行,m 列和 n 列,则结果表有 x * y 行,m + n 列。交叉连接返回被连接的两个表所有数据行的笛卡尔积,可能产生非常大的表,使用时必须谨慎,只在适当的时候使用它们。
【小编提示】 笛卡尔积是数学中两个集合所有可能有序对组成的集合,数据库中指多表无条件连接。
|
交叉查询的基本语法如下:
|
使用 COMPANY 表和 DEPARTMENT 表进行交叉连接查询示例如下:
① 查询语句
SELECT * FROM COMPANY CROSS JOIN DEPARTMENT;② 查询结果
2)内连接(INNER JOIN)
内连接用于返回两表中连接条件匹配的行,不匹配者被排除。内连接是最常见的连接类型,是默认的连接类型。INNER 关键字是可选的。
内连接的基本语法如下:
SELECT column_list FROM table1 [INNER] JOIN table2 ON conditional_expression; 语法解释:
|
使用 COMPANY 表和 DEPARTMENT 表进行内连接查询示例如下:
① 查询语句
SELECT EMP_ID, NAME, DEPTFROM COMPANYJOIN DEPARTMENTON COMPANY.ID = DEPARTMENT.EMP_ID;
② 查询结果

当两表的连接字段名完全相同时,为了避免冗余,可以使用 USING 表达式声明内连接条件,这个表达式指定一个或多个列的列表。相关语法如下:
SELECT column_list FROM table1 JOIN table2 USING(column1, column2,,,) 注意:column1, column2,,, 等字段名在 table1 和 table2 中应完全相同。 |
内连接有一种自连接(SELF JOIN)的特殊方式,它是同一张表别名化后相互连接,常用于层级数据(如员工所属领导编号 = 领导的员工编号)。其基本语法为:
SELECT column_list FROM table1 AS a JOIN table1 AS b ON a.column = b.column; |
SQLite 中还有一种自然连接(NATURAL JOIN)语法,它可以自动查找两个表中同名且同类型的字段做等值匹配,并在结果里去重。但是,自然连接在实际项目中基本不会使用,因为它依赖表结构自动匹配,如果字段增删容易导致静默错连或丢数据,且缺乏显式契约和跨库一致性。所以,小编不做介绍。
受文章篇幅所限,下文将继续介绍 Python 数据库操作的相关知识。