1 连接的语法结构
MySQL在SELECT语句、多表更新、多表删除语句中支持JOIN操作。
语法结构:
1 table_reference//第一张表
2 {[INNER | CROSS] JOIN | {LEFT | RIGHT} [OUTER] JOIN}//连接选择:内连接,左外、右外连接
3 table_reference//第二张表
4 ON conditional_expr//ON后面是连接条件
数据表参照:
1 table_reference//表的参照
2 tbl_name [[AS] alias | table_subquery [AS] alias]//加别名
3 //数据表可以使用tbl_name AS alias_name或tbl_name alias_name赋予别名
4 //table_subquery可以作为子查询使用在FROM子句中,这样的子查询必须为其赋予别名
连接类型:
- INNER JOIN,内连接
- 在MySQL中,JOIN,CROSS JOIN和INNER JOIN是等价的。
- LEFT [OUTER] JOIN,左外连接
- RIGHT [OUTER] JOIN,右外连接
连接条件:
- 使用ON关键字来设定连接条件,也可以使用WHERE来代替。
- 通常使用ON关键字来设定连接条件。
- 使用WHERE关键字进行结果集记录的过滤。
2 内连接
内连接,即显示左表及右表符合连接条件的记录(A、B表交叉的部分)
(下例中,左表总共23条数据,但最后一条的cate_id并没有在右表中出现,所以运行下例程序得到22条数据)
(查询所有商品的详细信息(通过内连接实现))
3 外连接
3.1 左外连接
左外链接:显示左表的全部记录及右表符合连接条件的记录。
(下例中,左表总共23条数据,但最后一条的cate_id并没有在右表中出现,但是因为是左外查询,所以运行程序后会有23条数据)
(查询所有商品的详细信息(通过左外连接实现))
3.2 右外连接
右外连接:显示右表的全部记录及左表符合连接条件的记录。
(下例中,右表总共10条数据,但最后三条的cate_id并没有在左表中出现,但是因为是右外查询,所以运行程序后会有25条数据,即左表符合右表的22条(也就是内查询的结果)+右表最后三条)
(查询所有商品的详细信息(通过右外连接实现))
3.3 连接说明
1 A LEFT JOIN B join_condition
- 数据表B的结果集依赖数据表A。
- 数据表A的结果集根据左连接条件依赖所有数据表(B表除外)。
- 左外连接条件决定如何检索数据表B(在没有指定WHERE条件的情况下)。
- 如果数据表A的某条记录符合WHERE条件,但是在数据表B不存在符合连接条件的记录,将生成一个所有列为空的额外的B行。
- 如果使用内连接查找的记录在连接数据表中不存在,并且在WHERE子句中尝试以下操作:col-namd IS NULL时,如果col_name被定义为NOT NULL,MySQL将在找到符合连执着条件的记录后停止搜索更多的行。
4 无限极分类表设计
(创建一张表)
(插入数据)
(0是顶级,后面的都是以数字相对应的type_id为父类的子类)
【注】自身连接:同一个数据表对其自身进行连接。
(自身连接,查找所有分类及其父类)
(自身连接,查找所有分类及其子类)
(查找所有分类及其子类的数目)