mysql连接查询
内连接
select 别名1.表1字段,别名2.表2字段 from表1 别名1,表2 别名2 where 连接条件 (sql92标准写法,此标准中mysql只支持内连接)
select 别名1.表1字段,别名2.表2字段 from表1 别名1 [inner] join 表2 别名2 on 连接条件 where 其他筛选条件 (sql99标准写法)
连接查询的机制是对连接的表做笛卡尔积然后再根据连接条件筛选数据
内连接可以根据表、连接条件的不同分为等值连接(连接条件一般用两表中的字段做相等判断来筛选)、非等值连接(两个表中的多个字段做非等值判断筛选,例如大于、between and等)、自连接(表自己跟自己做连接查询)。
示例:
等值连接


select a.user_id, a.user_name, b.department_name from user a, department b where a.department_id=b.department_id #sql92
select a.user_id, a.user_name, b.department_name from user a join department b on a.department_id=b.department_id #sql99
结果

非等值连接
select s.score_id,s.score,l.score_level from score s, level l where s.score between l.score_min and l.score_max #sql92
select s.score_id,s.score,l.score_level from score s join level l on s.score between l.score_min and l.score_max #sql99
可以根据分数表score跟对应分数等级表level 查询出分数对应的等级score_level (数据暂不举例)
自连接:

select a.user_id, a.user_name, b.user_name as manager from user a, user b where a.manager_id=b.user_id #sql92
select a.user_id, a.user_name, b.user_name as manager from user a join user b on a.manager_id=b.user_id #sql99
结果

外连接
左外连接:select 别名1.表1字段,别名2.表2字段 from表1 别名1 left [outer] join 表2 别名2 on 连接条件 where 其他筛选条件
右外连接:select 别名1.表1字段,别名2.表2字段 from表1 别名1 right [outer] join 表2 别名2 on 连接条件 where 其他筛选条件
全外连接:select 别名1.表1字段,别名2.表2字段 from表1 别名1 full [outer] join 表2 别名2 on 连接条件 where 其他筛选条件 #mysql不支持
外连接都是sql99标准。外连接的可以理解为是,先对两个表做做笛卡尔积,再根据连接条件筛选,然后:1。若是左连接,将左表中其他被筛选掉的列补全,右表中要显示的列数据显示为空;2.若是右连接,则反过来,将右表中其他被筛选掉的列补全,左表中要显示的列数据显示为空;3.若是全外连接,则是左连接跟右连接求并集。
交叉连接
select 别名1.表1字段,别名2.表2字段 from表1 别名1 cross join 表2 别名2
两个表的一次笛卡尔积

浙公网安备 33010602011771号