1. 创建数据库表
dep表
CREATE TABLE `dept` ( `d_id` int(11) NOT NULL AUTO_INCREMENT, `d_name` varchar(20) DEFAULT NULL, PRIMARY KEY (`d_id`), KEY `d_name` (`d_name`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
emp表
CREATE TABLE `emp` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, `age` int(11) DEFAULT NULL, `dept_id` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `dept_id` (`dept_id`), CONSTRAINT `emp_ibfk_1` FOREIGN KEY (`dept_id`) REFERENCES `dept` (`d_id`) ) ENGINE=InnoDB AUTO_INCREMENT=32849 DEFAULT CHARSET=utf8;
dept表 emp表
1. 自然连接(natural join)
自然连接是一种特殊的等值连接,他要求两个关系表中进行比较的必须是相同的属性列,无须添加连接条件,并且在结果中消除重复的属性列。
select * from emp nature join dept;
2. 内连接分为:隐式内连接、显示内连接,其查询效果相同。
隐式和显示的区别:仅仅是写法不同,效果是一样的;
-- 隐式的内连接
select * from emp,dept where emp.dept_id = dept.d_id;
-- 显示的内连接,一般称为内连接
select * from emp INNER JOIN dept on emp.dept_id = dept.d_id;
3. 外连接
-- .左外连接(left join):返回左表中的所有行,如果左表中行在右表中没有匹配行,则结果中右表中的列返回空值;
select * from emp left JOIN dept on emp.dept_id = dept.d_id;
-- .右外连接(right join):返回右表中的所有行,如果右表中行在左表中没有匹配行,则结果中左表中的列返回空值。
select * from emp right JOIN dept on emp.dept_id = dept.d_id;
全连接:返回左表和右表中的所有行。当某行在另一表中没有匹配行,则另一表中的列返回空值。
mysql不支持全连接。
4.-- 交叉连接(cross join):相当与笛卡尔积,左表和右表组合。
select * from emp cross JOIN dept ;
select * from emp , dept ;