多表查询
1.交叉连接查询
基本不会使用,因为得到的是两个表的乘积
语法:select * from A,B;
2.内连接查询
使用的关键字 inner join ,其中inner可以省略
1)隐式内连接:select * from A,B where 条件;
比如:SELECT * FROM category ,product WHERE category.cid=product.category_id;
使用别名:SELECT * FROM category c,product p WHERE c.cid=p.category_id;
2)显示内连接:select * from A inner join B on 条件;
比如:SELECT * FROM category INNER JOIN product ON cid=category_id;
3.外连接查询
使用关键字 outer join,其中outer可以省略
1)左外连接:left outer join
select * from A left outer join B on 条件;
2)右外连接:right outer join
select * from A right outer join B on 条件;
insert into category values('c004',null);
insert into product values('p012','三星',999,null);
注意:
1)使用左外连接发现左表有,右边没有
SELECT * FROM category LEFT OUTER JOIN product ON cid=category_id;
2)使用有右外连接发现右表有,左表没有
SELECT * FROM category RIGHT OUTER JOIN product ON cid=category_id;
4.子查询
一条select语句结果作为另一条select语句一部分(查询条件、查询结果,表等)。
例如:查询“化妆品”分类上架商品详情
select * from product where category_id = (select cid from category where cname='化妆品');
练习:
(1)工资高于JONES的员工。
SELECT * FROM emp WHERE sal > (SELECT sal FROM emp WHERE ename='JONES')
(2)工资高于30号部门所有人的员工信息
SELECT * FROM emp WHERE sal > ALL (SELECT sal FROM emp WHERE deptno=30)
(3)查询工作和工资与MARTIN(马丁)完全相同的员工信息
SELECT * FROM emp WHERE (job,sal) IN (SELECT job,sal FROM emp WHERE ename='MARTIN')
(4)有2个以上直接下属的员工信息
SELECT * FROM emp WHERE empno IN(
SELECT mgr FROM emp GROUP BY mgr HAVING COUNT(mgr)>=2);
(5)查询员工编号为7788的员工名称、员工工资、部门名称、部门地址
SELECT e.ename, e.sal, d.dname, d.loc
FROM emp e, (SELECT dname,loc,deptno FROM dept) d
WHERE e.deptno=d.deptno AND e.empno=7788;