首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第4章 数据更新
4-1 数据的插入(INSERT语句的使用方法)
什么是INSERT
INSERT语句的基本语法
列清单的省略
插入NULL
插入默认值
从其他表中复制数据
4-2 数据的删除(DELETE语句的使用方法)
DROP TABLE语句和DELETE语句
DELETE语句的基本语法
指定删除对象的DELETE语句(搜索型DELETE)
4-3 数据的更新(UPDATE语句的使用方法)
UPDATE语句的基本语法
指定条件的UPDATE语句(搜索型UPDATE)
使用NULL进行更新
多列更新
4-4 事务
什么是事务
创建事务
ACID特性
第5章 复杂查询
5-1 视图
视图和表
创建视图的方法
视图的限制① ——定义视图时不能使用ORDER BY子句
视图的限制② ——对视图进行更新
删除视图
5-2 子查询
子查询和视图
子查询的名称
标量子查询
标量子查询的书写位置
使用标量子查询时的注意事项
5-3 关联子查询
普通的子查询和关联子查询的区别
关联子查询也是用来对集合进行切分的
结合条件一定要写在子查询中
第6章 函数、谓词、CASE表达式
6-1 各种各样的函数
函数的种类
算术函数
字符串函数
日期函数
转换函数
6-2 谓词
什么是谓词
LIKE谓词——字符串的部分一致查询
BETWEEN谓词——范围查询
IS NULL、IS NOT NULL——判断是否为NULL
IN谓词——OR的简便用法
使用子查询作为IN谓词的参数
EXIST谓词
6-3 CASE表达式
什么是CASE表达式
CASE表达式的语法
CASE表达式的使用方法
第7章 集合运算
7-1 表的加减法
什么是集合运算
表的加法——UNION
集合运算的注意事项
包含重复行的集合运算——ALL选项
选取表中公共部分——INTERSECT
记录的减法——EXCEPT
7-2 联结(以列为单位对表进行联结)
什么是联结
内联结——INNER JOIN
外联结——OUTER JOIN
3张以上的表的联结
交叉联结——CROSS JOIN
联结的特定语法和过时语法
当前位置:
首页>>
技术小册>>
SQL基础教程(中)
小册名称:SQL基础教程(中)
### 联结的特定语法和过时语法 在SQL(Structured Query Language)的世界中,联结(JOIN)是构建复杂查询、整合来自不同表的数据的基石。随着SQL标准的演进和数据库管理系统的不断升级,联结的语法也经历了从简单到复杂、从特定到标准化的过程。本章将深入探讨SQL联结的特定语法与那些逐渐淡出历史舞台的过时语法,帮助读者理解并掌握高效、标准的SQL查询编写方法。 #### 一、引言 SQL联结允许用户将两个或多个表中的行结合起来,基于这些表之间的共同属性(通常是主键和外键关系)。联结操作是SQL中最强大的特性之一,它极大地扩展了数据查询的灵活性和能力。然而,不同数据库系统(如MySQL、PostgreSQL、SQL Server等)在支持SQL标准的同时,也发展出了自己的一些特定语法,同时,随着技术的进步,一些早期广泛使用的联结语法已逐渐被视为过时。 #### 二、SQL标准的联结语法 首先,我们回顾一下SQL标准中定义的几种基本联结类型及其语法: 1. **INNER JOIN(内联结)**:返回两个表中匹配的行。 ```sql SELECT columns FROM table1 INNER JOIN table2 ON table1.common_field = table2.common_field; ``` 2. **LEFT JOIN(左联结)**:返回左表的所有行,即使右表中没有匹配的行。如果右表中没有匹配,则结果中右表的部分将包含NULL。 ```sql SELECT columns FROM table1 LEFT JOIN table2 ON table1.common_field = table2.common_field; ``` 3. **RIGHT JOIN(右联结)**:与LEFT JOIN相反,返回右表的所有行。 ```sql SELECT columns FROM table1 RIGHT JOIN table2 ON table1.common_field = table2.common_field; ``` 4. **FULL OUTER JOIN(全外联结)**:返回两个表中的所有行。当某行在另一个表中没有匹配时,另一表的部分将包含NULL。 ```sql SELECT columns FROM table1 FULL OUTER JOIN table2 ON table1.common_field = table2.common_field; ``` 5. **CROSS JOIN(交叉联结)**:返回两个表中所有行的笛卡尔积。 ```sql SELECT columns FROM table1 CROSS JOIN table2; ``` #### 三、特定数据库的联结语法 尽管上述语法是SQL标准的一部分,但不同数据库系统可能提供了额外的语法糖或特定实现,以适应特定的使用场景或优化性能。 ##### 1. MySQL的特定语法 - **USING子句**:在MySQL中,可以使用USING子句来简化ON子句,当两个表连接的字段名相同时特别有用。 ```sql SELECT columns FROM table1 JOIN table2 USING (common_field); ``` - **NATURAL JOIN**:MySQL支持NATURAL JOIN,它自动基于两个表中所有同名字段进行联结,但通常不推荐使用,因为它可能引入不可预测的行为。 ```sql SELECT columns FROM table1 NATURAL JOIN table2; ``` ##### 2. SQL Server的特定语法 - **MERGE语句**:虽然严格来说不是联结语法,但SQL Server的MERGE语句提供了在单个操作中执行INSERT、UPDATE、DELETE操作的能力,可以在特定条件下基于两个表的数据差异来更新表。 ```sql MERGE INTO target_table AS target USING source_table AS source ON target.common_field = source.common_field WHEN MATCHED THEN UPDATE SET target.column = source.column WHEN NOT MATCHED BY TARGET THEN INSERT (column) VALUES (source.column); ``` #### 四、过时的联结语法 随着SQL标准的普及和数据库技术的发展,一些早期的联结语法逐渐被淘汰或不再推荐使用。 1. **逗号分隔的表列表(隐式内联结)**:在较旧的SQL版本中,人们常常通过在FROM子句中简单地列出表名(用逗号分隔)并在WHERE子句中指定联结条件来实现内联结。这种语法虽然在某些数据库中仍然有效,但已不被视为最佳实践。 ```sql SELECT columns FROM table1, table2 WHERE table1.common_field = table2.common_field; ``` 2. **ANSI JOIN之前的特定数据库语法**:在SQL标准统一之前,不同的数据库系统发展出了各自独特的联结语法。例如,一些系统使用`*=`和`=*`来表示左外联结和右外联结,但这种语法既不直观也不符合SQL标准,因此在现代数据库系统中已很少见到。 #### 五、最佳实践 - **遵循SQL标准**:尽可能使用SQL标准中定义的联结语法,这有助于增强代码的可移植性和可读性。 - **避免使用过时语法**:避免使用逗号分隔的表列表或特定于数据库的过时联结语法,以减少维护成本和潜在的兼容性问题。 - **利用数据库特性**:了解并合理利用你所使用的数据库系统提供的特定联结优化和特性,如MySQL的USING子句或SQL Server的MERGE语句。 - **编写清晰、可维护的SQL代码**:在编写联结查询时,注意选择适当的联结类型,并在ON子句中明确指定联结条件,以提高代码的可读性和可维护性。 #### 六、总结 SQL联结是数据库查询中不可或缺的一部分,掌握其标准语法和特定数据库的特定语法对于高效地进行数据整合和分析至关重要。随着技术的进步,我们应积极拥抱新的标准和最佳实践,同时避免使用过时的语法,以确保我们的SQL代码既高效又易于维护。通过本章的学习,希望读者能够深入理解SQL联结的特定语法与过时语法之间的差异,并在实际工作中灵活运用。
上一篇:
交叉联结——CROSS JOIN
该分类下的相关小册推荐:
高性能的Postgres SQL
SQL基础教程(下)
SQL基础教程(上)
PostgreSQL入门教程