连接查询:把两张或者多张表的某些记录进行连接(按照某个条件进行数据的拼接)
分类:
1.内连接查询
2.多表连接查询
3.外连接查询
MySQL-内连接查询
1.交叉连接(笛卡尔积):又称“笛卡尔连接”或“叉乘”,是所有类型的内连接的基础。如果把表视为行记录的集合,那么交叉连接即返回第一张表中符合查询条件的数据行乘以第二张表中符合查询条件的数据行。
(由于交叉连接结果集合中会有大量的数据冗余,效率非常低。因此,SQL产品会尽量避免使用交叉查询)
SQL语句:select 列名 from 表名1 cross join 表名2 等价于:select 列名 from 表名1,表名2
2.内连接查询:内连接基于连接谓词,它将两张表的列组合在一起,产生新的结果表。
SQL语句:select fieldlist from 表名1 [inner] join 表名2 on 表名1.column1=表名2.column2
[where condition]
说明:
fieldlist:表1和表2中需连接查询的字段列。
表名1 [inner] join 表名2:连接两张表,[inner] 可省略。
表名1.column1=表名2.column2:连接条件,表名1中column1的列名=表名2中column2的列名
[where condition]:条件,可省略。
例:将goods表中的goodsname列与typename连接,结果如图:
答:
select goodsname 商品,typename 分类 from goods join type on goods.typeID=type.typeID
(其中,typeID 为 goods 和 type 表的字段列)
3.自然连接:一种特殊的内连接,其连接依据必须是相同的字段(字段名相同,字段属性相同)。自然连接用于两张表中的所有列,且结果集中相同的列仅出现一次。
SQL语句:select 列名 from 表名1 natural join 表名2 [ where condition ]
说明:
[where condition]:条件,可省略。
MySQL多表连接
用于查询数据来源于三张或三张表以上的连接。
SQL语句:select fieldlist from 表名1 join 表名2 on 表名1.column1=表名2.column2_1 join
表名3 on 表名2.column2_2=表名3.column3 [where condition]
说明:
fieldlist:表1,表2和表3中需连接查询的字段列。
表名1.column1=表名2.column2_1:连接条件,表名1中column1的列名=表名2中column2_1的列名
表名2.column2_2=表名3.column3:连接条件,表名2中column2_2的列名=表名3中column3的列名
[where condition]:条件,可省略。
例:查询每个订单是谁买的,什么时候买的,买了什么,买了几个,花了多少钱。结果如图:
答:
select name 客户,ordersdate 日期,goodsname 商品,quantity 数量,purchaseprice 金额 from user join orders on user.userID=orders.userID join ordersdetail on orders.ordersID=ordersdetail.ordersID join goods on ordersdetail.goodsID=goods.goodsID
外连接查询
1, 左外
左外连接: 包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行。
(通俗:就是2张表,查左表满足条件的所有以及右表中含有左表条件的数据,where (右表条件)..is not null显示不为null的数)
# 以某张表为主,取出里面的所有记录.每条与另外一张表.不管能不能匹配上条件.最终都会保留.如果不能匹配,那么其他表的字段都置空
# left join (left join 是left outer join的简写)
# 基本语法
SELECT
...
FROM
[左表]
LEFT JOIN
[右表]
ON
[条件]
(会把左边所有的数据都显示出来,如果右表没有匹配的数据.以null显示)
例:SELECT * from a_table a LEFT JOIN b_table b on a.a_id = b.b_id (where b_id is not NULL)
2,右外
右外连接: 包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行
(通俗:就是2张表,查右表满足条件的所有以及左表中含有右表条件的数据,where (左表条件)..is not null显示不为null的数)
# right join
# 基本语法
SELECT
...
FROM
[左表]
RIGHT JOIN
[右表]
ON
[条件]
(会把右表所有的数据都显示出来,如果左表没有匹配的数据.以null显示)
例:SELECT * from a_table a RIGHT JOIN b_table b on a.a_id = b.b_id (where a_id is not NULL);