多表查詢、關聯查詢
笛卡爾積:將兩張表完整的、無差別的乘積連接
select * from emp_zld,dept_zld;--無意義
如果第一張表有6個數據,第二張表有8個數據,最後得到48個數據
–通過笛卡爾積獲得有效連接數據,
–等值連接,通過兩張表中的共同字段,來進行匹配篩選
select * from emp_zld,dept_zld
where emp_zld.deptno = dept_zld.deptno;
--獲得員工和他所在的部門名稱
--公共字段必須添加表名前綴,唯一字段可以不加前綴
select e.ename,d.dname from emp_zld e,dept_zld d
where e.deptno = d.deptno;
–內連接、外連接
–內連接等同於等值連接
select E.DEPTNO,ENAME,DNAME
FROM EMP_ZLD E
INNER JOIN DEPT_ZLD D--inner可以省略
ON E.DEPTNO = D.DEPTNO;
–左外連接、右外連接、全外連表
–驅動表:讓哪張表的數值完全顯示,哪張表就做驅動表
–左外連接
SELECT e.EMPNO,e.ENAME,e.DEPTNO,
d.DEPTNO,d.LOC
FROM EMP_ZLD e LEFT OUTER JOIN DEPT_ZLD d
on e.DEPTNO = d.DEPTNO;
–右外連接
SELECT e.EMPNO,e.ENAME,e.DEPTNO,
d.DEPTNO,d.LOC
FROM EMP_ZLD e right OUTER JOIN DEPT_ZLD d
on e.DEPTNO = d.DEPTNO;
–全外連接
SELECT e.EMPNO,e.ENAME,e.DEPTNO,
d.DEPTNO,d.LOC
FROM EMP_ZLD e
full OUTER JOIN DEPT_ZLD d ---full MYSQL不支持
on e.DEPTNO = d.DEPTNO;
子查詢
–子查詢
–根據返回結果的不同,子查詢可分爲單行子查詢、多行子查詢及多列子查詢。
–子查詢在select中
--用子查詢查詢員工所在部門名稱
select ename,e.deptno,(select dname from dept_zld d where d.deptno =e.deptno)
from emp_zld e;
–子查詢在from中
–也稱作行內視圖或者匿名視圖。
--查詢出薪水比本部門平均薪水高的員工信息
select e.ename,e.sal
from emp_zld e join
(select empno,avg(sal) AVG_SAL
from emp_zld
group by empno
) b
on e.empno = b.empno and e.sal>b.avg_sal;
‐‐如果子查詢返回多行,主查詢中要使用多行比較操作符,包括IN、ALL、ANY。其中ALL和ANY不能單獨使用,需要配合單行比較操作符>、>=、<、<=一起使用。
–子查詢在where,having中
--查詢列出最低薪水高於部門30的最低薪水的部門信息
select dname,loc,deptno
from dept_zld
where deptno in(
select deptno
from emp_zld
group by deptno
having(min(sal)>(
select min(sal)
from emp_zld
where deptno = 30
)
)
);
‐在子查詢中需要引用到主查詢的字段數據,使用EXISTS關鍵字。EXISTS後邊的子查詢至少返回一行數據,則整個條件返回TRUE。如果子查詢沒有結果,則返回FALSE。
--例如列出來那些有員工的部門信息:
SELECT deptno, dname FROM dept d
WHERE EXISTS (SELECT * FROM emp e WHERE d.deptno = e.deptno);
–子查詢效率比關聯查詢效率高
–子查詢小結–from/where/having/select
–結果是單記錄 - 一行一列,where 直接比較
–一列,多行記錄 - 集合 any in all
–多行多列,作爲一張臨時表使用
分頁查詢
–分頁查詢
–分頁查詢又叫top10查詢 每頁顯示多少條數據pageSize 當前第幾頁currentPage
– 當前顯示第一條號碼
–(page-1)pageSize+1~pagepageSize
–Oracle 自帶 rownum 表中原始內容排號
select sal,ename,rownum
from emp
order by sal desc;
–查詢前四條記錄
select sal,ename,rownum
from emp;
--where rownum <= 4;
–rownum只能從1開始,只能查n條
–解決方案:將rownum查詢出來後,添加別名,作爲子查詢表
select sal,ename,e.n
from (select sal,ename,rownum n from emp) e
where
e.n between 5 and 8;