1. 程式人生 > 實用技巧 >EMP+DEPT+SALGRADE 表的基本操作

EMP+DEPT+SALGRADE 表的基本操作

部門表


-- 部門表

CREATE TABLE DEPT(
    DEPTNO INT PRIMARY KEY,  -- 部門編號
    DNAME VARCHAR(14) ,  -- 部門名稱
    LOC VARCHAR(13) -- 部門地址
    ) ; 

INSERT INTO DEPT VALUES (10,'ACCOUNTING','NEW YORK');
INSERT INTO DEPT VALUES (20,'RESEARCH','DALLAS');
INSERT INTO DEPT VALUES (30,'SALES','CHICAGO');
INSERT INTO DEPT VALUES (40,'OPERATIONS','BOSTON');

員工表

-- 員工表

CREATE TABLE EMP
    (
    EMPNO INT  PRIMARY KEY,  -- 員工編號
    ENAME VARCHAR(10),  -- 員工名稱
    JOB VARCHAR(9), -- 工作
    MGR DOUBLE, -- 直屬領導編號
    HIREDATE DATE,  -- 入職時間
    SAL DOUBLE, -- 工資
    COMM DOUBLE, -- 獎金
    DEPTNO INT, -- 部門號
    FOREIGN KEY(DEPTNO) REFERENCES DEPT(DEPTNO)
);

INSERT INTO EMP VALUES
(7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20);
INSERT INTO EMP VALUES
(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO EMP VALUES
(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO EMP VALUES
(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO EMP VALUES
(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
INSERT INTO EMP VALUES
(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
INSERT INTO EMP VALUES
(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
INSERT INTO EMP VALUES
(7788,'SCOTT','ANALYST',7566,'1987-07-13',3000,NULL,20);
INSERT INTO EMP VALUES
(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO EMP VALUES
(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
INSERT INTO EMP VALUES
(7876,'ADAMS','CLERK',7788,'1987-07-13',1100,NULL,20);
INSERT INTO EMP VALUES
(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);
INSERT INTO EMP VALUES
(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);
INSERT INTO EMP VALUES
(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10); 

工資等級表


-- 工資等級表

CREATE TABLE SALGRADE
      ( GRADE INT,  -- 工資等級
    LOSAL DOUBLE, -- 最低工資
    HISAL DOUBLE ); -- 最高工資
INSERT INTO SALGRADE VALUES (1,700,1200);
INSERT INTO SALGRADE VALUES (2,1201,1400);
INSERT INTO SALGRADE VALUES (3,1401,2000);
INSERT INTO SALGRADE VALUES (4,2001,3000);
INSERT INTO SALGRADE VALUES (5,3001,9999);

小練習

1、查詢工資等於5000 的員工姓名?


mysql> select * from EMP where sal =1500;
+-------+--------+----------+------+------------+------+------+--------+
| EMPNO | ENAME  | JOB      | MGR  | HIREDATE   | SAL  | COMM | DEPTNO |
+-------+--------+----------+------+------------+------+------+--------+
|  7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500 |    0 |     30 |
+-------+--------+----------+------+------------+------+------+--------+
1 row in set (0.00 sec)

2、查詢SMITH的工資


mysql> select sal from EMP where ename="SMITH";
+------+
| sal  |
+------+
|  800 |
+------+
1 row in set (0.00 sec)

3、找出工資高於3000的員工

mysql> select Sal from EMP where sal >=3000;
+------+
| Sal  |
+------+
| 3000 |
| 5000 |
| 3000 |
+------+
3 rows in set (0.00 sec)

4、找2900到3000的工資

mysql> select sal from EMP where sal between 2900 and 3000;
+------+
| sal  |
+------+
| 2975 |
| 3000 |
| 3000 |
+------+
3 rows in set (0.00 sec)

5、檢視不為空和為空的欄位

mysql> select * from EMP where comm is null;
+-------+--------+-----------+------+------------+------+------+--------+
| EMPNO | ENAME  | JOB       | MGR  | HIREDATE   | SAL  | COMM | DEPTNO |
+-------+--------+-----------+------+------------+------+------+--------+
|  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800 | NULL |     20 |
|  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975 | NULL |     20 |
|  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850 | NULL |     30 |
|  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450 | NULL |     10 |
|  7788 | SCOTT  | ANALYST   | 7566 | 1987-07-13 | 3000 | NULL |     20 |
|  7839 | KING   | PRESIDENT | NULL | 1981-11-17 | 5000 | NULL |     10 |
|  7876 | ADAMS  | CLERK     | 7788 | 1987-07-13 | 1100 | NULL |     20 |
|  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950 | NULL |     30 |
|  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000 | NULL |     20 |
|  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300 | NULL |     10 |
+-------+--------+-----------+------+------------+------+------+--------+
10 rows in set (0.00 sec)

mysql> select * from EMP where comm is not null;
+-------+--------+----------+------+------------+------+------+--------+
| EMPNO | ENAME  | JOB      | MGR  | HIREDATE   | SAL  | COMM | DEPTNO |
+-------+--------+----------+------+------------+------+------+--------+
|  7499 | ALLEN  | SALESMAN | 7698 | 1981-02-20 | 1600 |  300 |     30 |
|  7521 | WARD   | SALESMAN | 7698 | 1981-02-22 | 1250 |  500 |     30 |
|  7654 | MARTIN | SALESMAN | 7698 | 1981-09-28 | 1250 | 1400 |     30 |
|  7844 | TURNER | SALESMAN | 7698 | 1981-09-08 | 1500 |    0 |     30 |
+-------+--------+----------+------+------------+------+------+--------+
4 rows in set (0.00 sec)

6、找出薪資大與3000 的並且部門編號是20 或者30部門的員工

mysql> select sal from EMP where sal >1000 and (deptno=20 or deptno=30);
+------+
| sal  |
+------+
| 1600 |
| 1250 |
| 2975 |
| 1250 |
| 2850 |
| 3000 |
| 1500 |
| 1100 |
| 3000 |
+------+
9 rows in set (0.00 sec)

in的使用

範圍 (起始範圍 --> 結束範圍)


mysql> select ename,job from EMP where sal in (800,5000);
+-------+-----------+
| ename | job       |
+-------+-----------+
| SMITH | CLERK     |
| KING  | PRESIDENT |
+-------+-----------+
2 rows in set (0.00 sec)

mysql> select ename,job from EMP where sal not in (800,5000);
+--------+----------+
| ename  | job      |
+--------+----------+
| ALLEN  | SALESMAN |
| WARD   | SALESMAN |
| JONES  | MANAGER  |
| MARTIN | SALESMAN |
| BLAKE  | MANAGER  |
| CLARK  | MANAGER  |
| SCOTT  | ANALYST  |
| TURNER | SALESMAN |
| ADAMS  | CLERK    |
| JAMES  | CLERK    |
| FORD   | ANALYST  |
| MILLER | CLERK    |
+--------+----------+
12 rows in set (0.00 sec)

order by 升序降序的使用

mysql> select sal from EMP order by sal asc;
+------+
| sal  |
+------+
|  800 |
|  950 |
| 1100 |
| 1250 |
| 1250 |
| 1300 |
| 1500 |
| 1600 |
| 2450 |
| 2850 |
| 2975 |
| 3000 |
| 3000 |
| 5000 |
+------+
14 rows in set (0.01 sec)

mysql> select sal from EMP order by sal desc;
+------+
| sal  |
+------+
| 5000 |
| 3000 |
| 3000 |
| 2975 |
| 2850 |
| 2450 |
| 1600 |
| 1500 |
| 1300 |
| 1250 |
| 1250 |
| 1100 |
|  950 |
|  800 |
+------+
14 rows in set (0.00 sec)


分組函式

**count 計數 **
Sum求和
avg平均數
max最大值
mix最小值
count()和count(具體的某個欄位),他們有什麼區別?
count(
):不是統計某個欄位中資料到的個數,而是統計總記錄條數.(和別的欄位無關)
count(comm):表示統計comm欄位中不為null的資料總數量

mysql> select ename,(sal+comm)*12 as years from EMP;
# 所有資料庫都是這樣規定的,只要有null參加運算結果一定是null

group by和having

group by:按照某個欄位或者某些欄位進行分組
having:having是對分組之後的資料進行再次過濾

1、找出每個工作崗位的最高薪資

Select max(sal) from emp group by job;

2、找出工資高於平均各自的員工

第一步:找出平均工資
select avg(sal)from emp;
第二步:找出高於平均工資的員工
select ename,sal from emp where sal >(平均工資)

mysql> select ename,sal from EMP where sal > (select avg(sal) from EMP);
+-------+------+
| ename | sal  |
+-------+------+
| JONES | 2975 |
| BLAKE | 2850 |
| CLARK | 2450 |
| SCOTT | 3000 |
| KING  | 5000 |
| FORD  | 3000 |
+-------+------+
6 rows in set (0.00 sec)

3、查詢每個工作崗位的平均薪資

mysql> select job,avg(sal) from EMP group by job;
+-----------+--------------------+
| job       | avg(sal)           |
+-----------+--------------------+
| ANALYST   |               3000 |
| CLERK     |             1037.5 |
| MANAGER   | 2758.3333333333335 |
| PRESIDENT |               5000 |
| SALESMAN  |               1400 |
+-----------+--------------------+

4、找出每個工作崗位的最高薪資

mysql> select max(sal) from EMP group by job ;
+----------+
| max(sal) |
+----------+
|     3000 |
|     1300 |
|     2975 |
|     5000 |
|     1600 |
+----------+