这章关键字:
CROSS JOIN 交叉连接
INNER JOIN ON 内连接
LEFT JOIN ON 左连接
RIGHT JOIN ON 右连接
#先建一个表 用以测试下面语法
CREATE TABLE tb_course(id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(18),
pid INT
)
#插入表数据
INSERT INTO tb_course(NAME,pid) VALUES('java',NULL);
INSERT INTO tb_course(NAME,pid) VALUES('javaSE',1);
INSERT INTO tb_course(NAME,pid) VALUES('javaEE',2);
INSERT INTO tb_course(NAME,pid) VALUES('openSource',NULL);
INSERT INTO tb_course(NAME,pid) VALUES('struts',4);
INSERT INTO tb_course(NAME,pid) VALUES('hibernate',4);
INSERT INTO tb_course(NAME,pid) VALUES('spring',4);
INSERT INTO tb_course(NAME,pid) VALUES('webwork',4);
INSERT INTO tb_course(NAME,pid) VALUES('database',NULL);
INSERT INTO tb_course(NAME,pid) VALUES('oracle',9);
INSERT INTO tb_course(NAME,pid) VALUES('db2',9);
INSERT INTO tb_course(NAME,pid) VALUES('mysql',9);
INSERT INTO tb_course(NAME,pid) VALUES('SQLServer',9);
#交叉连接
SELECT COUNT(*) FROM tb_emp; #16
SELECT COUNT(*) FROM tb_dept; #4
SELECT * FROM tb_emp,tb_dept #64=16*4
SELECT * FROM tb_emp CROSS JOIN tb_dept; #标准交叉连接写法
#内连接 连接条件就是主外键关联
SELECT * FROM tb_emp e,tb_dept d WHERE e.DEPTNO = d.DEPTNO
SELECT * FROM tb_dept INNER JOIN tb_emp #标准内连接写法
ON tb_dept.DEPTNO = tb_emp.DEPTNO
#在外连接中,某些不满足条件的列也会显示出来,也就是说,只限制其中一个表的行,而不限制另一个表的行
#左外连接
#tb_dept做主表,左边的表为主表,左边的表记录全部显示,如果没找到记录则补null.
SELECT * FROM tb_dept LEFT JOIN tb_emp
ON tb_dept.DEPTNO = tb_emp.DEPTNO
#oracle语法,左连接加号在右边
SELECT * FROM tb_emp e,tb_dept d WHERE e.DEPTNO = d.DEPTNO(+)
#右外连接 (右表做主表)
SELECT * FROM tb_dept RIGHT JOIN tb_emp
ON tb_dept.DEPTNO = tb_emp.DEPTNO
#自连接
SELECT c.name '类别名',c2.name '父亲别名'
FROM tb_course c LEFT JOIN tb_course c2
ON c.pid=c2.id
SELECT c.name '类别名',c2.name '父亲别名'
FROM tb_course c, tb_course c2
WHERE c.pid=c2.id