首页 > 数据库 >SQL基础总结(六):联结

SQL基础总结(六):联结

时间:2023-09-14 14:05:09浏览次数:39  
标签:总结 JOIN SQL 使用 联结 子句 table SELECT


本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)

--------------------------------

限定名称是一个表名后跟一个点号和表中的列名。限定名称可以在整个数据库中唯一的标识出某个列。如:table.column。

要提高性能,应该在联结查询中对所有列使用限定名称。

 

创建表的别名,在子查询的上下文中也称为相关名称:table [AS] alias

AS关键字是可选的。

 

SELECT子句可以在后面的语句定义别名之前先使用别名。

别名隐藏了表名,如果为表命名了别名,则必须在所有的限定引用中使用它的别名。

SELECT authors.au_id FROM authors au; //这样是不合法的。

也可以使用AS为视图分配别名。

 

使用联结

交叉联结:返回第一个表的每一行和第二个表的所有行组合得到的表的所有行。

自然联结:对第一个表所有列和第二个表具有名字相同的列进行等同比较的联结。

内联结:最普通的联结。使用比较操作符基于每一个表中共同列的值。

左外联结:返回左表中的所有行,不管与右表是否有匹配的联结列。如果左表中的行在右表中没有匹配的行,关联的结果对于右表所有SELECT子句列包含空值。

右外联结:返回右表中的所有行。

全外联结:返回左表和右表中的所有行。

自联结:表和它自身的联结。

如果关键字是复合的,通常应该联结所有关键字列。

如果联结列包含空值,空值无法联结。

不能联结二进制对象。

 

为了提高性能,应该对联结列建立索引。

 

可以将视图联结表或其它视图。

 

处理联结时,按照下面顺序执行整个查询:

1. 在JOIN子句中应用联结条件。

2. 在WHERE子句中应用联合条件和查询条件。

3. 按照GROUP BY分组。

4. 在HAVING子句中对分组进行过滤。

5. 按照ORDER BY排序。

当联结两个表时,对左表每一行和右表每一行进行组对,形成交叉联结,然后使用联结条件从交叉联结中筛选行。

 

被联结的列不必有相同的数据类型。如果数据类型不可以被隐式地转换,联结条件需要使用CAST()函数显示的转换数据类型。大多数使用联结的查询可以改写为嵌套在另一个查询中的查询(子查询),反之,大多数子查询可以改写为联结。

 

对于使用JOIN语法,如果被联结列有相同的名字且被用于比较是否相等,SQL标准定义了替代ON子句的USING子句。FROM table1 JOINTYPE table2 USING (columns).

 

使用CROSS JOIN 创建交叉联结

SELECT * FROM authors CROSS JOIN publishers;

等价于:

SELECT * FROM authors , publishers;

 

使用NATURAL JOIN创建自然联结

比较一个表中所有列和另一个表中具有名称相同的相应列的等同性。

使用自然联结,需要确保两个联结表中所有相关列有相同的列名,且非相关列有唯一的列名。

 

使用INNER JOIN创建内联结

使用比较操作符(=,,<>,>,<,>=,<=)匹配两个表的行。

只返回满足联结条件的联结行的结果。

SELECT columns FROM table1 INNER JOIN table2 ON join_conditions;

SELECT columns FROM table1 , table2 WHERE join_conditions;

 

默认情况下,JOIN等价于INNER JOIN。

使用>,<,>=,<=的联结很常见,<>很少用到,不等联结仅当用于自联结时才有意义。

 

使用OUTER JOIN创建外联结

内联结:两表中至少有一行满足联结条件才返回行,内联结删除在另一表中没有匹配的行。

外联结:外联结至少返回其中一个表的行。

 

左外联结:返回左表中的所有行,不管与右表是否有匹配的联结列。如果左表中的行在右表中没有匹配的行,关联的结果对于右表所有SELECT子句列显示空值。

SELECT columns FROM left_table LEFT [OUTER] JOIN right_table ON join_conditions;

 

右外联结:

SELECT columns FROM left_table RIGHT [OUTER] JOIN right_table ON join_conditions;

 

全外联结:

SELECT columns FROM left_table FULL [OUTER] JOIN right_table ON join_conditions;

 

关键字OUTER可选。

 

SQL有联合联结(union join):返回删除匹配行的全外联结。在联合联结中每行是一个表的列与另一个表为空值的列。

联合联结很少使用,很多DBMS不支持。t1 UNION JOIN t2等价于t1 FULL OUTER JOIN t2 ON 1=2.1=2是永远为假的条件。

 

创建自联结

自联结是一个表和自身的联结,并通过比较同一个表的一列或多列值,从表中检索行的常规SQL联结。

自联结常被使用在有反身联系的表。

反身联系是指主键/外键同为一个表中的列或列的组合。

 

像任何联结一样,自联结需要两个表,但只是添加同一个表的另一个实例。DBMS组合并返回满足联结条件的行。将它们想象成两个表就很容易理解。

自联结经常被改写为子查询。

标签:总结,JOIN,SQL,使用,联结,子句,table,SELECT
From: https://blog.51cto.com/u_6978506/7469703

相关文章

  • SQL基础总结(七):子查询
    本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)--------------------------------不要在子查询中使用ORDERBY子句,子查询返回的中间结果是看不到的,对子查询排序没有意义。子查询是单个SELECT......
  • SQL基础总结(五):汇总和分组数据
    本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)-------------------------只对单个值进行操作的是标量函数。对一组值进行操作以产生一个汇总值的是SQL聚合函数或集合函数。可以对行的集合进行......
  • SQL基础总结(十一):视图
      本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)--------------------------------除了ORDERBY子句通常是被禁止的,几乎所有有效的SELECT语句都可以定义视图。可以嵌套视图,视图的SELECT语句......
  • SQL基础总结(九):插入更新删除行及创建更新删除表
    本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)--------------------------------插入更新删除行 使用INSERT插入行INSERTINTOtableVALUES(value1,value2,value3…);INSERTINTOtable(col......
  • SQL基础总结(八):集合操作
    本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)--------------------------------使用UNION合并行UNION操作将两个查询返回的结果合并成一个结果。UNION从结果中去掉重复的行,UNIONALL不去掉重......
  • SQL基础总结(十):索引
      本系列blog源自前年写的SQL学习笔记,汇总一下发上来。(1月份发了前三篇笔记,原以为后面的笔记误操作删了,今天在硬盘里又找到了,一起发上来)--------------------------------对于以下列创建索引是恰当的,这些列经常被:查询、排序、分组、联结、用来计算顺序统计(MIN、MAX或中值)。对于......
  • MySQL篇:bug2_ Navicate无法添加或更新子行-外键约束失败
    问题产生原因Mysql中如果表和表之间建立的外键约束,则无法删除表及修改表结构。解决办法解决方法是在Mysql中取消外键约束:SETFOREIGN_KEY_CHECKS=0;再添加值,然后再设置外键约束:SETFOREIGN_KEY_CHECKS=1;查看当前FOREIGN_KEY_CHECKS的值可用如下命令:SELECT@@FOR......
  • 7 项目总结
    Webserver项目webserver项目总结1项目介绍使用多线程模型,利用信号量实现线程间加锁;利用I0复用技术Epoll与线程池实现多线程的Reactor高并发模型;利用RAII机制实现了数据库连接池,减少数据库连接建立与关闭的开销;利用正则与状态机解析HTTP请求报文实现处理静态资源的请求;基......
  • 2023.9.14-每日总结
    今天,我完成了软件需求与分析课堂测试02–业务需求。软件需求与分析课堂测试02–业务需求  ----------------------------------------------------------------------根据下列描述,说明新的直接销售和财务处理系统的业务需求有哪些?EspeciallyforYouJewelers是大学......
  • N天爆肝数据库——MySQL(2)
    (N天爆肝数据库——MySQL(2))链接:link这是csdn专栏链接,大家可以看一看,提提意见本篇文章,主要对DMLDQL进行知识总结和学习。期待和大家一起学习进步。DML-介绍DML(数据库操作语言),用来对数据库中表的数据记录进行增删改操作。添加数据(INSERT)修改数据(UPDATE)删除数据(DELET......