mysql 内联接、左联接、右联接、完全联接、交叉联接 区别

测试表SQL语句

create table a (
    id int unsigned not null primary key auto_increment,
    name char(50) not null default ‘‘
)engine=myisam default charset=utf8;

create table b (
    id int unsigned not null primary key auto_increment,
    name char(50) not null default ‘‘,
    a_id int not null
)engine=myisam default charset=utf8;

insert into a values
(null,‘张三‘),
(null,‘李四‘),
(null,‘王五‘);

insert into b values
(null,‘tom‘,1),
(null,‘jack‘,2),
(null,‘wally‘,1),
(null,‘joan‘,4);

表结果:

表a.        表b

 

内连接(join 或 inner join):使用比较运算符根据每个表共有的列的值匹配两个表中的行

/*内联接*/
select a.*,b.*
from a
inner join b
on a.id = b.a_id;

/*相当于*/
select a.*,b.*
from a,b
where a.id = b.a_id;

外联接。外联接可以是左向外联接、右向外联接或完整外部联接。

左外联接(left join 或 left outer join):如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。

/*左外联接*/
select a.*,b.*
from a
left join b
on a.id = b.a_id;

右外联接(right join 或 right outer join):左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。

/*右外联接*/
select a.*,b.*
from a
right join b
on a.id = b.a_id;

完全联接(full join 或 full outer join):完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。

/*全联接*/
select a.*,b.*
from a
full join b
on a.id = b.a_id;

结果报错,什么原因?

交叉连接(cross join):没有WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。(table1和table2交叉连接产生3*3=9条记录)

/*交叉联接(带where语句)*/
select a.*,b.*
from a
cross join b
on a.id = b.a_id;

/*交叉联接(不带where语句)*/
select a.*,b.*
from a
cross join b;

/*相当于*/select a.*,b.* from a,b;

时间: 2024-11-10 07:45:15

mysql 内联接、左联接、右联接、完全联接、交叉联接 区别的相关文章

mysql 内连接 左连接 右连接 外连接

mysql> desc student;+-------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+-------------+------+-----+---------+-------+| ID | int(11) | NO | PRI | 0 | || NAME | varchar(16) | YES | | NULL | || A

解析:内联,左外联,右外联,全连接,交叉连接的区别

连接分为:内连接.外连接.交叉连接 一.内连接--最常用 定义:仅将两个表中满足连接条件的行组合起来作为结果集. 在内连接中,只有在两个表中匹配的行才能在结果集中出现 关键词:INNER JOIN 格式:SELECT 列名表 FROM 表名1 [INNER] JOIN 表名2 ON或WHERE 条件表达式 说明: (1)列名表中的列名可以出自后面的两个表,但如果两个表中有同名列,应在列名前标明出处,格式为:表名.列名 (2)若连接的两个表名字太长,可以为它们起个别名. 格式为:表名 AS 别名 

SQL Server 2008 R2——内连接 左连接 右连接 全连接 交叉连接

SELECT * FROM Table_A GO SELECT * FROM Table_B GO --内连接 SELECT a.*, b.* FROM Table_A a JOIN Table_B b ON a.ID = b.ID SELECT a.*, b.* FROM Table_A a INNER JOIN Table_B b ON a.ID = b.ID GO --内连接等价直接多表from的形式 SELECT a.*, b.* FROM Table_A a INNER JOIN Ta

SQL联接 外联接 内联接 完全联接 交叉联接

联接分为: 内联接????????????????????????[inner join] 外联接????????(左外联接,右外联接)????????[left join/left outer join, right join/right outer join] 完全联接????????????????????[full join] 交叉联接????????????????????[cross join] a表???? id????ebcid????name????????b表 ????uid

左连接,右连接,内连接,外连接, join, left join, right join ,mysql ,oracle

2016-6-12 22:35:51 工作用了一年多的oracle,最近在学mysql, 仔细想想 各种连接,感觉这些概念还是蛮烦人的! 最近整理了一下,分享一下自己的理解,有些东西是借鉴网上并自己吸收了的. 1.不管是什么连接,oracle和mysql的原理是一模一样的,只是有些写法不一样而已.说到写法,这里提一下, select * from A, B where a.filed1=b.filed2; --这是第1种写法, 内连接,这样写,很方便, oracle和mysql通用 select

sql 内连接 外连接 左连接 右连接

1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接.     内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 students和courses表中学生标识号相同的所有行.       2.外联接.外联接可以是左向外联接.右向外联接或完整外部联接.     在 FROM子句中指定外联接时,可以由下列几组关键字中的一组指定:     1)LEFT  JOIN或LEFT OUTER JOIN     左向外联接的结果集包括  LEF

mysql左连接右连接(查询两张表不同的数据)

left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 :right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录:inner join(等值连接) 只返回两个表中联结字段相等的行: 表A数据: 表B数据: 1.查询两张表中都有的记录: sql: SELECT a.* FROM a INNER JOIN b ON a.a_id = b.b_id; 2.查询表A中有,表B中没有的数据: sql: SELECT a.* FROM a LEFT JO

联接-----交叉联接

在逻辑上,交叉联接是一种最简单的联接.交叉联接只实现一个逻辑查询步骤(笛卡尔积).这一步是对输入的两个表进行操作,把它们联接起来,生成二者的笛卡尔积.也就是将一个输入表的每行与另一个表的所有行进行匹配.如果一个表有m行,而另一个表有n行,将得到m*n行的结果集. SQL Server 支持交叉联接的两种标准语法: ANSI SQL-92 SELECT C.custid,E.empid FROM dbo.Customers AS C CROSS JOIN dbo.Employees AS E AN

oracle 内连接 左外连接 右外连接的用法,(+)符号用法

1. 内连接很简单 select A.*, B.* from A,B where A.id = B.id select A.*, B.* from A inner join B on A.id = B.id 以上两句是完全等价的 2. 左外连接 select * from emp a left join dept d on a.deptno=d.deptno select * from emp a,dept d where a.deptno=d.deptno(+) 以上两句是完全等价的 3. 右