交叉连接
交叉连接(cross join),又称笛卡尔连接(cartesian join)或叉乘(Product),它是所有类型内连接的基础。它把表看作是行记录的集合,交叉连接即返回这两个集合的笛卡尔积。这其实等价于内连接的连接条件始终为”真”,或连接条件不存在。
笛卡尔积引用自数学,在数学中,两个集合X和Y的笛卡尔积(Cartesian product),又称直积。假设集合X={a,b},集合Y={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}。可以扩展到多个集合的情况。1
2SELECT * FROM user CROSS JOIN orders
内连接
inner join on
通过on后面的条件,将两张表中的数据过滤。1
2--inner join on
SELECT * FROM user INNER JOIN orders ON user.uid=orders.uid
inner join using:
通过指定两张表中比较的字段来进行等式消除迪卡尔积1
2--inner join using
SELECT * FROM user INNER JOIN orders USING(uid)
在inner join on和inner join using中,可以将inner省略,因为join默认就是内连接(inner join),省略inner后的查询语句如下,效果与有inner是一样的。1
2
3--省略inner
SELECT * FROM user JOIN orders ON user.uid=orders.uid;
SELECT * FROM user JOIN orders USING(uid);
隐式内连接
在实际开发中,使用最多的一种内连接叫做隐式内连接,其实就是将inner join省略,也不在使用on进行条件过滤,而是直接使用where进行过滤,查询语句如下,结果与inner join on一样。1
2--隐式内连接
SELECT * FROM user,orders WHERE user.uid=orders.uid;
小结cross join 只是将两个表连接起来,产生笛卡尔积。
natural join 使用表中主外键关联来消除迪卡尔积。
inner join using 可省略inner,在using后直接书写比较的字段名称,注意要加括号。
inner join on 可省略inner,在on后面直接书写比较条件,通过条件来消除迪卡尔积。
隐式内连接,在开发应用比较多,可以省略inner join,表与表之间用逗号分开,通过where条件来消除迪卡尔积。
外链接
内连接只是将两个或多个表中有关联的数据集查询出来,而没有关联的数据(只有一个表中有,而另外一个表中没有的数据)则无法查询出来。如果在开发中需要将所有用户及其订单查询出来,如果用户没有订单,也要查询出用户信息。那么,使用内连接显然是做不到的,这时就需要使用外连接。
外连接并不要求连接的两表的每一条记录在对方表中都一条匹配的记录。连接表保留所有记录,甚至某条记录没有匹配的记录也要保留.,外连接可依据连接表保留左表、右表或全部表的行而进一步分为左外连接、右外连接和全连接。注意:mysql只支持左外连接与右外连接,而不支持全连接。左外连接:left outer join on 注意 outer 可以省略
右外连接:right outer join on 注意 outer可以省略
执行下面sql语句查询结果如下:1SELECT * FROM user LEFT OUTER JOIN orders ON user.uid=orders.uid;
可以看出,即便mike和marry没有订单,其orders表中的数据以null显示出来。
上述sql语句使用的是左外连接,也就是说以user表为准,保留user表中所有数据,右表orders中没有关联的数据,以null关联显示出来。右外连接也是同理,执行下面sql语句查询结果如下:1SELECT * FROM orders RIGHT OUTER JOIN user ON orders.uid=user.uid