day22Mysql回顧(多表查詢 內外連線 合併結果 基本習題練習 年度增長比)
阿新 • • 發佈:2018-11-19
多表查詢 1、分類 合併結果集 連線查詢 子查詢 合併結果集 要求被合併的表中,列的型別和列數相同 UNION,去除重複行 UNION ALL 不去除重複行 SLECT * FROM cd UNION ALL 上面一個表不能加分號 SLECT * FROM cd; 連線查詢 1、分類 內連線 外連線 左外連線 右外連線 全外連線(MySQL不支援) 自然連線(屬於一種簡化方式) 2、內連線 方言:SELECT * FROM 表1 別名1,表2 別名2 WHERE 別名1.xx=別名2.xx 標準:SELECT * FROM 表1 別名1 INNER JOIN 表2 別名2 ON 別名1.xx=別名2.xx 自然:SELECT * FROM 表1 別名1 NATURAL JOIN 表2 別名2 內連線查詢出來的所有記錄都滿足條件 3、外連線 左外:SELECT * FROM 表1 別名1 LEFT OUTER JOIN 表2 別名2 ON 別名1.xx=別名2.xx 左表記錄無論是否滿足條件都會查詢出來,而右表只有滿足條件才能出來,左表中不滿足條件的記錄,右表部分都為NULL 左外自然: SELECT * FROM 表1 別名1 NATURAL LEFT OUTER JOIN 2 別名2 右外:SELECT * FROM 表1 別名1 RIGHT OUTER JOIN 表2 別名2 ON 別名1.xx=別名2.xx 右表記錄無論是否滿足條件都會查詢出來,而左表只有滿足條件才能出來,右表中不滿足條件的記錄,左表部分都為NULL 右外自然: SELECT * FROM 表1 別名1 NATURAL RIGHT OUTER JOIN 2 別名2 全連線:可以使用UNION來完成全連線 子查詢 查詢中有查詢(檢視select關鍵字的個數) 1、出現的位置 where後作為條件存在 form後作為表存在(多行多列) 2、條件 單行單列 SELECT * FROM 表1 別名1 WHERE 列1(=、>、<、>=、<=、!=) (SELECT 列 FROM 表2 別名2 WHERE 條件) 多行單列:SELECT * FROM 表1 別名1 WHERE 列1 [in,all,any] (SELECT 列 FROM 表2 別名2 WHERE 條件) 單行多列:SELECT * FROM 表1 別名1 WHERE (列1,列2) in (SELECT 列1,列2 FROM 表2 別名2 WHERE 條件) 多行多列:SELECT * FROM 表1 別名1, (SELECT ...) 別名2 WHERE 條件
/* 1. 查出至少有一個員工的部門。顯示部門編號、部門名稱、部門位置、部門人數。 列:d.deptno, d.dname, d.loc, 部門人數 表:dept d, emp e 條件:e.deptno=d.deptno */ SELECT d.*, z1.cnt FROM dept d, (SELECT deptno, COUNT(*) cnt FROM emp GROUP BY deptno) z1 WHERE d.deptno = z1.deptno /* 3. 列出所有員工的姓名及其直接上級的姓名。 列:員工姓名、上級姓名 表:emp e, emp m 條件:員工的mgr = 上級的empno */ SELECT * FROM emp e, emp m WHERE e.mgr=m.empno SELECT e.ename, IFNULL(m.ename, 'BOSS') 領導 FROM emp e LEFT OUTER JOIN emp m ON e.mgr=m.empno /* 4. 列出受僱日期早於直接上級的所有員工的編號、姓名、部門名稱。 列:e.empno, e.ename, d.dname 表:emp e, emp m, dept d 條件:e.hiredate<m.hiredate 思路: 1. 先不查部門名稱,只查部門編號! 列:e.empno, e.ename, e.deptno 表:emp e, emp m 條件:e.mgr=m.empno, e.hiredate<m.hireadate */ SELECT e.empno, e.ename, e.deptno FROM emp e, emp m WHERE e.mgr=m.empno AND e.hiredate<m.hiredate SELECT e.empno, e.ename, d.dname FROM emp e, emp m, dept d WHERE e.mgr=m.empno AND e.hiredate<m.hiredate AND e.deptno=d.deptno /* 5. 列出部門名稱和這些部門的員工資訊,同時列出那些沒有員工的部門。 列:* 表:emp e, dept d 條件:e.deptno=d.deptno */ SELECT * FROM emp e RIGHT OUTER JOIN dept d ON e.deptno=d.deptno /* 7. 列出最低薪金大於15000的各種工作及從事此工作的員工人數。 列:job, count(*) 表:emp e 條件:min(sal) > 15000 分組:job */ SELECT job, COUNT(*) FROM emp e GROUP BY job HAVING MIN(sal) > 15000 /* 8. 列出在銷售部工作的員工的姓名,假定不知道銷售部的部門編號。 列:e.ename 表:emp 條件:e.deptno=(select deptno from dept where dname='銷售部') */ SELECT * FROM emp e WHERE e.deptno=(SELECT deptno FROM dept WHERE dname='銷售部') /* 9. 列出薪金高於公司平均薪金的所有員工資訊,所在部門名稱,上級領導,工資等級。 列:* 表:emp e 條件:sal>(查詢出公司的平均工資) */ SELECT e.*, d.dname, m.ename, s.grade FROM emp e, dept d, emp m, salgrade s WHERE e.sal>(SELECT AVG(sal) FROM emp) AND e.deptno=d.deptno AND e.mgr=m.empno AND e.sal BETWEEN s.losal AND s.hisal --------------- SELECT e.*, d.dname, m.ename, s.grade FROM emp e LEFT OUTER JOIN dept d ON e.deptno=d.deptno LEFT OUTER JOIN emp m ON e.mgr=m.empno LEFT OUTER JOIN salgrade s ON e.sal BETWEEN s.losal AND s.hisal WHERE e.sal>(SELECT AVG(sal) FROM emp) SELECT * FROM emp; SELECT * FROM dept; SELECT * FROM salgrade; /* 10.列出與龐統從事相同工作的所有員工及部門名稱。 列:e.*, d.dname 表:emp e, dept d 條件:job=(查詢出龐統的工作) */ SELECT e.*, d.dname FROM emp e, dept d WHERE e.deptno=d.deptno AND job=(SELECT job FROM emp WHERE ename='龐統') /* 11.列出薪金高於在部門30工作的所有員工的薪金 的員工姓名和薪金、部門名稱。 列:e.ename, e.sal, d.dname 表:emp e, dept d 條件;sal>all (30部門薪金) */ SELECT e.ename, e.sal, d.dname FROM emp e, dept d WHERE e.deptno=d.deptno AND sal > ALL (SELECT sal FROM emp WHERE deptno=30) /* 13.查出年份、利潤、年度增長比 */ SELECT y1.*, IFNULL(CONCAT((y1.zz-y2.zz)/y2.zz*100, '%'), '0%') 增長比 FROM tb_year y1 LEFT OUTER JOIN tb_year y2 ON y1.year=y2.year+1;