關聯查詢、子查詢

多表查詢、關聯查詢

笛卡爾積:將兩張表完整的、無差別的乘積連接

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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章