笛卡尔积
SELECT 查询字段列表 FROM 表1,表2
-- 表1*表2的数据
表1中的每一条数据都会和表2的每一条数据相关联。
连接查询
MySQL连接查询分类
1、按推出年份划分
SQL92标准:仅支持内连接;
SQL99标准:支持除了全外连接的所有连接的类型;
2、按功能划分
内连接
SQL92 内连接
语法:
SELECT 查询字段列表
FROM 表1,表2
WHERE 表1和表2关联关系;
代码实例:
select o.*,u.name
from b_order o,b_user u
where o.user_id = u.user_id;
SQL99 内连接
语法:
SELECT查询字段列表
FROM 表1 别名1
INNER JOIN 表2 别名2
ON 表1和表2的关联关系;
代码实例:
select o.*,u.name
from b_order o
inner join b_user u
on o.user_id=u.user_id;
SQL99 非等值内连接
SELECT o.*,u.name
FROM b_order o
INNER JOIN b_user u
ON
o.user_id between u.user_id and u.age;
SQL99 自连接
自连接一般用于一张表中有上下级关系的表,一般会有一个指向上级的字段,用法和等值连接一致,我们将同一张表起不同的别名进行等值连接。
select * from china province
inner join china city
on province.id = city.pid;
外连接
左外连接
语法:
SELECT <SELECT_LIST>
FROM TABLE A
LEFT JOIN TABLE B
ON A.KEY=B.KEY;
注意:
1. 确定主表 ;
2. 在左外连接中,LEFT 左边的就是主表 ;
3. 显示所有的主表记录,并关联显示从表中的数据,如果从表中没有和主表可以关联的数据,使用NULL 进行匹配;
代码实例:
查询订单信息,并关联信息用户姓名
SELECT o.*,u.name
FROM b_order o
LEFT JOIN b_user u
ON o.user_id = u.user_id;
加个条件(is null)
SELECT o.*,u.name
FROM b_order o
LEFT JOIN b_user u
ON o.user_id = u.user_id
WHERE u.user_id is NULL;
右外连接
语法:
SELECT <SELECT_LIST>
FROM TABLE A
RIGHT JOIN B
ON A.KEY=B.KEY;
注意:
1. 确定主表 ;
2. 在右外连接中,RIGHT 右边的就是主表 ;
3. 显示所有的主表记录,并关联显示从表中的数据,如果从表中没有和主表可以关联的数据,使用NULL 进行匹配;
代码实例:
SELECT o.*,u.name
FROM b_user u
RIGHT JOIN b_order o
ON u.user_id = o.user_id;
加个条件(is null)
SELECT o.*,u.name
FROM b_user u
RIGHT JOIN b_order o
ON u.user_id = o.user_id
WHERE u.user_id is NULL;
交叉(CROSS)连接
SELECCT <SELECT_LIST>
FROM TABLE A
CROSS JOIN B
等价于笛卡尔积
SELECT <SELECT_LIST>
FROM TABLEA
CROSS JOIN B
WHERE A.KEY=B.KEY