1.笛卡尔积
select * from emp,dept;
2.等值连接
select empno,ename,sal,emp.depno,dname from emp,dept
where emp.depno=dept.depno;
3.非等值连接
select ename,empno,grade, from emp,salgrade where sal between losal and hisal;
4.自连接
select e.empno,e.ename,m.empno,m.ename from emp e,emp m
where e.mgr = m.empno;
select e.empno,e.ename,m.empno,m.ename from emp e,emp m
where m.mgr = e.empno;
5.左外连接(LEFT OUTER JOIN)
select s.sid,s.sname,s1.sid,s1.sname from student s,student s1
where s.sid = s1.sid(+);
select empno,ename,dname from emp left outer join dept on emp.depno = dept.depno;
6.右外连接(RIGHT OUTER JOIN)
select s.sid,s.sname,s1.sid,s1.sname from student s,student s1
where s.sid(+) = s1.sid;
7.满外连接(FULL OUTER JOIN)
SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
FROM ORDERS O FULL OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;
注意:MySQL是不支持全外的连接的,这里给出的写法适合Oracle和DB2。
但是可以通过左外和右外求合集
SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
FROM ORDERS O LEFT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID
UNION
SELECT O.ID,O.ORDER_NUMBER,O.CUSTOMER_ID,C.ID,C.NAME
FROM ORDERS O RIGHT OUTER JOIN CUSTOMERS C ON C.ID=O.CUSTOMER_ID;
两者查询的结果是相同的
8.集合操作
union:并集,所有的内容都查询,重复的只显示一次。
union all:并集,所有的内容都查询,包括重复的。
intersect:交集,只显示重复的。
minus:差集或减集,只显示两张表不同的记录(和顺序有关系)或者说在第一个查询结果中排除第二个查询结果中出现的行。
验证union和union all
select * from emp union select * from emp20;--此语句查询结果中,重复的内容不再显示
select * from emp union all select * from emp20;--查询结果中,重复的内容依然显示
select * from emp intersect select * from emp20;--只显示两张表中都存在的记录
select * from emp minux select * from emp20;--只显示两张表中不同的记录
还没有评论,来说两句吧...