1. 程式人生 > 其它 >SQL綜合實戰

SQL綜合實戰

MySQL練習:職工表和部門表

  1. 建立資料庫
create database if not exists `Firm`;
  1. 使用資料庫
use Firm;
  1. 建立職工表
# 職工表
CREATE TABLE if not exists emp(
	empno INT comment '編號',
	ename VARCHAR(50) comment '姓名',
	job VARCHAR(50) comment '職務',
	mgr INT comment'上級',
	hiredate DATE comment '入職日期',
	sal DECIMAL(7,2) comment '薪資',
	comm DECIMAL(7,2) comment '獎金',
	deptno INT comment '部門編號'
);
  1. 插入資料到職工表
# 新增資料
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-04-19',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-05-23',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);
  1. 建立部門表
# 部門表
CREATE TABLE dept(
	deptno INT comment '部門編號',
	dname VARCHAR(14) comment '部門名稱' ,
	loc VARCHAR(13) comment '坐落城市'
);
  1. 插入資料到部門表
# 新增資料
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');

題目:

詳細的解題~~

# 1、查詢出高於10號部門的平均工資的員工資訊
    # 1.查詢10部門的平均工資的員工資訊
select avg(sal) from emp where deptno = 10;
    # 2.查詢出高於10號部門的平均工資的員工資訊
select * from emp
where sal > (select avg(sal) from emp where deptno = 10);

# 2、查詢出比10號部門任何員工薪資高的員工資訊
    # 1.得到10部門最高薪資的員工資訊
select max(sal) from emp where deptno = 10;
    # 2.得出結論 查詢出比10號部門任何員工薪資高的員工資訊
select * from emp
where sal > (select max(sal) from emp where deptno = 10);

# 3、和10號部門同名同工作的員工資訊
    # 1.得到10部門的姓名和工作
select ename ,job from emp where deptno = 10;
    # 2。查詢和10號部門同名同工作的員工資訊
select * from emp where (ename,job) in (
    (SELECT ename,job FROM emp WHERE deptno = 10)
) and deptno != 10;

# 4、獲取員工的名字和部門的名字
    # 1.查詢員工姓名和部門資訊
select deptno as 部門,ename as 員工姓名 from emp;
    # 2.得出結果
select (select dname from dept where emp.deptno = dept.deptno) ,ename as 員工姓名 from emp;

# 5、查詢emp表中經理資訊
    # 1.查詢emp表中經理資訊
select mgr from emp;
    #2.得出結果
SELECT * FROM emp as e
inner join dept d
on e.deptno = d.deptno
where mgr;

# 6、薪資高於10號部門平均工資的所有員工資訊
    # 1.查詢10號部門所有員工的平均工資資訊
select avg(sal) from emp where deptno = 10;
    # 2.查詢薪資高於10號部門平均工資的所有員工資訊
select * from emp where sal > (select avg(sal) from emp where deptno = 10) ;

# 7、有哪些部門的平均工資高於30號部門的平均工資
    #1.查詢30號部門的平均工資
select avg(sal) from emp where deptno = 30;
    #2.查詢高於30號部門的平均工資的部門平均工資
select deptno
from emp
group by deptno
having avg(sal) > (
    select avg(sal) from emp where deptno = 30
);

# 8、查詢工資 > JONES工資
    #1.查詢 JONES 的工資資訊
select sal from emp where ename = 'JONES';
    #2.查詢工資大於 JONES 的工資資訊
select sal
from emp
where sal > (
    select sal from emp where ename = 'JONES'
);

# 9、查詢與SCOTT同一個部門的員工
    #1.查詢 SCOTT 的所處部門資訊
select deptno from emp where ename = 'SCOTT';
    #2.查詢與SCOTT同一個部門的員工資訊
select ename as 員工 ,deptno as 部門
from emp
where deptno = (
    select deptno from emp where ename = 'SCOTT'
);

# 10、工資高於30號部門所有人的員工資訊
    #1.查詢30號部門的工資資訊
select sal from emp where deptno = 30;
    #2.查詢工資大於30號部門的員工資訊
select *
from emp
where sal > all(
    select sal from emp where deptno = 30
);

# 11、查詢工作和工資與MARTIN完全相同的員工資訊
    #1.查詢名叫 MARTIN 的員工的工作與工資
select job,sal from emp where ename = 'MARTIN';
    #2.查詢查詢工作和工資與 MARTIN 完全相同的員工資訊
select * from emp where (job,sal) = (
    select job,sal from emp where ename = 'MARTIN'
);

# 12、查詢員工編號為7788的員工名稱,員工工資,部門名稱,部門地址
    #1.將職工表和部門錶鏈接起來
select * from emp,dept where emp.deptno = dept.deptno;
    #2.查詢編號為7788的所有資訊
select * from emp,dept where emp.deptno = dept.deptno and empno = 7788;
    #3.顯示題目所需的資訊
select e.ename as 員工名稱 ,e.sal as 員工工資 ,e.deptno as 部門名稱 ,d.loc as 部門地址
from emp as e
inner join dept d
on e.deptno = d.deptno
where empno = 7788;

# 13、查詢出高於本部門平均工資的員工資訊
    #1.分組統計每個部門的平均工資
    SELECT deptno,AVG(sal) FROM emp GROUP BY deptno;
    #2.得出相應的結果
select *
from emp as e1
where sal > (
    select avg(sal) from emp as e2 where e1.deptno = e2.deptno GROUP BY e2.deptno
);

# 14、列出達拉斯加工作的人中,比紐約平均工資高的人
    #1.容易理解的方法 —— 列出 達拉斯加 工作的人的資訊
SELECT * FROM emp WHERE deptno = (
    SELECT deptno FROM dept WHERE loc = ‘DALLAS’
);
    #2.查詢紐約的平均工資
select avg(sal)
from emp as e
inner join dept d
on e.deptno = d.deptno
where d.loc = 'NEW YORK';
    #3.得出結果
SELECT *
FROM emp
WHERE deptno = (
    SELECT deptno FROM dept WHERE loc = ‘DALLAS’
) AND sal > (
    SELECT AVG(sal) FROM emp WHERE deptno = (SELECT deptno FROM dept WHERE loc =