1. 程式人生 > >sql語句練習的一些筆記

sql語句練習的一些筆記

單表查詢練習

  1. 找出部門編號為10中所有經理,和(and)部門編號為20中所有銷售員的詳細資料。
SELECT *
FROM emp
WHERE (deptno=10 AND job='經理') OR (deptno=20 AND job='銷售員')
  1. 找出部門編號為10中所有經理,部門編號為20中所有銷售員,還有即不是(not in)經理又不是銷售員但其工資大或等於20000的所有員工詳細資料。
SELECT *
FROM emp
WHERE (deptno=10 AND job='經理') OR (deptno=20 AND job='銷售員') OR (job NOT IN ('經理', '銷售員') AND
sal >= 20000)
  1. 無獎金(is null)或獎金低於1000的員工。
WHERE comm IS NULL OR comm < 1000

查詢所有員工詳細資訊,用編號升序(order by)排序

SELECT * 
FROM emp
ORDER BY empn

查詢所有員工詳細資訊,用工資降序排序,如果(,)工資相同使用入職日期升序排序

SELECT *
FROM emp
ORDER BY sal DESC, hiredate ASC

檢視僱員的月薪與佣金之和(comm列有很多記錄的值為NULL,因為任何東西與NULL相加結果還是NULL,所以結算結果可能會出現NULL。下面使用了把NULL轉換成數值0的函式IFNULL

SELECT *,sal+IFNULL(comm,0) FROM emp;

在上面查詢中出現列名為sal+IFNULL(comm,0),這很不美觀,現在我們給這一列給出一個別名,為total

SELECT *, sal+IFNULL(comm,0) AS total FROM emp;
給列起別名時,是可以省略AS關鍵字的:
SELECT *,sal+IFNULL(comm,0) total FROM emp;

查詢性別非男的學生記錄

SELECT * 
FROM stu
WHERE gender!='male';
或者
SELECT * 
FROM stu
WHERE gender<>
'male'; 或者 SELECT * FROM stu WHERE NOT gender='male';
  • 聚合函式練習(聚合函式是用來做縱向運算的函式)
    統計月薪與佣金之和大於2500元的人數
SELECT COUNT(*) AS cnt FROM emp WHERE sal+IFNULL(comm,0) > 2500;

查詢有佣金的人數,以及有領導的人數

SELECT COUNT(comm), COUNT(mgr) FROM emp;

查詢所有僱員月薪+佣金和

SELECT SUM(sal+IFNULL(comm,0)) FROM emp;
  • 分組查詢,關鍵字眼,每個
    查詢每個部門的部門編號和每個部門的工資和
SELECT deptno, SUM(sal)
FROM emp
GROUP BY deptno;

查詢每個部門的部門編號以及每個部門的人數

SELECT deptno,COUNT(*)
FROM emp
GROUP BY deptno;

查詢每個部門的部門編號以及每個部門工資大於1500的人數

SELECT deptno,COUNT(*)
FROM emp
WHERE sal>1500
GROUP BY deptno;
  • HAVING子句
    WHERE是對分組前記錄的條件,如果某行記錄沒有滿足WHERE子句的條件,那麼這行記錄不會參加分組;而HAVING是對分組後資料的約束。
    查詢工資總和大於9000的部門編號以及工資和
SELECT deptno, SUM(sal)
FROM emp
GROUP BY deptno
HAVING SUM(sal) > 9000;

多表查詢練習

  1. 查出至少有一個員工的部門。顯示部門編號、部門名稱、部門位置、部門人數(group by)。
    列: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

  1. 列出所有(left outer join)員工的姓名及其直接上級的姓名(自身多表連線)。
    列:員工姓名、上級姓名
    表:emp e, emp m
    條件:員工的mgr = 上級的empno
SELECT e.ename, IFNULL(m.ename, 'BOSS') 領導
FROM emp e LEFT OUTER JOIN emp m
ON e.mgr=m.empno
  1. 列出受僱日期早於直接上級的所有員工的編號、姓名、部門名稱。
    列:e.empno, e.ename, d.dname
    表:emp e, emp m, dept d
    條件:e.hiredate<m.hiredate
    思路:
    先不查部門名稱,只查部門編號!
    列:e.empno, e.ename, e.deptno
    表:emp e, emp m
    條件:e.mgr=m.empno, e.hiredate<m.hireadate
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
  1. 列出部門名稱和這些部門的員工資訊,同時列出那些沒有員工的部門。
SELECT *
FROM emp e RIGHT OUTER JOIN dept d
ON e.deptno=d.deptno
  1. 列出最低薪金大於15000的各種工作及從事此工作的員工人數。
列:job, count(*)
表:emp e
條件:min(sal) > 15000
分組:job
*/
SELECT job, COUNT(*)
FROM emp e
GROUP BY job
HAVING MIN(sal) > 15000
  1. 列出在銷售部工作的員工的姓名,假定不知道銷售部的部門編號。
列:e.ename
表:emp
條件:e.deptno=(select deptno from dept where dname='銷售部')
*/

SELECT *
FROM emp e
WHERE e.deptno=(SELECT deptno FROM dept WHERE dname='銷售部')
  1. 列出薪金高於公司平均薪金的所有員工資訊,所在部門名稱,上級領導,工資等級。
列:* 
表: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.列出與龐統從事相同工作的所有員工及部門名稱。

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;