内连接:[inner]join,从左表中取出每一条记录,去右表中与所有的记录进行匹配:匹配必须是某个条件左表中与右表中相同最终才会保留结果,否则不保留.
基本语法
左表[inner]join 右表 on 左表.字段=右表.字段;on表示连接条件:条件字段就是代表相同的业务含义.-- 内连接select*from my_student innerjoin my_class on my_student.c_id = my_class.id;select*from my_student innerjoin my_class on c_id = my_class.id;select*from my_student innerjoin my_class on c_id = id;-- 两张表都有id字段
字段别名以及表别名的使用: 在查询数据的时候,不同表有同名字段,这个时候需要加上表名才能区分, 而表名太长, 通常可以使用别名.-- 字段和表别名select s.*,c.name as c_name,c.room from-- 字段别名
my_student as s innerjoin my_class as c -- 表别名on s.c_id = c.id;
内连接可以没有连接条件: 没有on之后的内容,这个时候系统会保留所有结果(笛卡尔积)
内连接还可以使用where代替on关键字(where没有on效率高)-- where代替onselect s.*,c.name as c_name,c.room from-- 字段别名
my_student as s innerjoin my_class as c -- 表别名where s.c_id = c.id;
外连接
外链接:outerjoin,以某张表为主,取出里面的所有记录,然后每条与另外一张表进行连接;不管能不能匹配上条件,最终都会保留;能匹配正常保留;不能匹配,其他表的字段都置空NULL
外连接分为两种:是以某张表为主:有主表
1.leftjoin:左外连接(左连接),以左表为主表
2.rightjoin:右外连接(右连接),以右表为主表.
基本语法:
左表 left/rightjoin 右表 on 左表.字段=右表.字段
左连接:
-- 左连接select s.*,c.name as c_name,c.room from
my_student as s leftjoin my_class as c -- 左表为主表: 最终记录数至少不少于左表已有的记录数on s.c_id = c.id;select s.*,c.name as c_name,c.room from
my_class as c rightjoin my_student as s -- 左表为主表: 最终记录数至少不少于左表已有的记录数on s.c_id = c.id;
右连接:
-- 右连接select s.*,c.name as c_name,c.room from
my_student as s rightjoin my_class as c -- 右表为主表: 最终记录数至少不少于右表已有的记录数on s.c_id = c.id;