MySQL練習題分享——人力資源管理系統
阿新 • • 發佈:2021-01-31
技術標籤:MySQL資料庫javamysqlsqlplsql
人力資源管理系統——hrs
判斷是否存在hrs的庫,如果存在的話就進行刪除
drop database if exists hrs;
- 刪庫一定要謹慎再謹慎,應該說不論是刪什麼東西之前都要先進行靈魂拷問,能不能刪除
建立hrs的庫
create database hrs default charset utf8mb4;
- MySQL裡面本身是不區分大小寫的,字串的比較區不區分大小寫這些是看你設定的校對規則
- 假如後面新增校對規則collate utf8_bin則後面的查詢就會區分大小寫
- 假如後面新增校對規則collate utf8_general_ci 則後面的查詢就不會區分大小寫
- 在建表的時候還可以重新修改編碼,校對規則
切換到hrs庫
use hrs;
建立表
drop table if exists tb_emp;
drop table if exists tb_dept;
create table tb_dept
(
dno int not null comment '編號',
dname varchar(10) not null comment '名稱',
dloc varchar(20) not null comment '所在地',
primary key (dno)
);
create table tb_emp
(
eno int not null comment '員工編號',
ename varchar(20) not null comment '員工姓名',
job varchar(20) not null comment '員工職位',
mgr int comment '主管編號',
sal int not null comment '員工月薪',
comm int comment '每月補貼',
dno int comment '所在部門編號',
primary key (eno),
foreign key (dno) references tb_dept(dno),
foreign key (mgr) references tb_emp(eno)
);
- 可以通過修改表新增主鍵
- alter table tb_dept add constraint pk_dept_dno primary key(dno);
- 通過修改表新增外來鍵約束
- 自參照
- alter table tb_emp add constraint fk_emp_mgr foreign key (mgr) references tb_emp (eno);
- 新增外來鍵約束
- alter table tb_emp add constraint fk_emp_dno foreign key (dno) references tb_dept (dno);
插入內容
insert into tb_dept values
(10, '會計部', '北京'),
(20, '研發部', '成都'),
(30, '銷售部', '重慶'),
(40, '運維部', '深圳');
insert into tb_emp values
(7800, '張三丰', '總裁', null, 9000, 1200, 20),
(2056, '喬峰', '分析師', 7800, 5000, 1500, 20),
(3088, '李莫愁', '設計師', 2056, 3500, 800, 20),
(3211, '張無忌', '程式設計師', 2056, 3200, null, 20),
(3233, '丘處機', '程式設計師', 2056, 3400, null, 20),
(3251, '張翠山', '程式設計師', 2056, 4000, null, 20),
(5566, '宋遠橋', '會計師', 7800, 4000, 1000, 10),
(5234, '郭靖', '出納', 5566, 2000, null, 10),
(3344, '黃蓉', '銷售主管', 7800, 3000, 800, 30),
(1359, '胡一刀', '銷售員', 3344, 1800, 200, 30),
(4466, '苗人鳳', '銷售員', 3344, 2500, null, 30),
(3244, '歐陽鋒', '程式設計師', 3088, 3200, null, 20),
(3577, '楊過', '會計', 5566, 2200, null, 10),
(3588, '朱九真', '會計', 5566, 2500, null, 10);
查詢月薪最高的員工姓名和月薪
select ename, sal from tb_emp order by sal desc limit 1;
-- 可以用limit,但是該辦法可能會面臨月薪相同的有多個人
-- 所以最好的是用巢狀查詢
select ename, sal from tb_emp where sal=(select max(sal) from tb_emp);
查詢員工的姓名和年薪((月薪+補貼)*13)
-- 查詢時是可以對列做運算的,數值運算,字串運算都可以
select ename, (sal + ifnull(comm, 0))*13 as yearsal from tb_emp;
查詢有員工的部門的編號和人數
select dno, count(eno) from tb_emp group by dno;
select dno, count(eno) from tb_emp group by dno having count(eno) > 5;
查詢所有部門的名稱和人數(左外連線)
select dname, ifnull(member, 0) as total from tb_dept t1 left outer join (select dno, count(eno) as member from tb_emp group by dno) t2 on t1.dno = t2.dno;
查詢月薪最高的員工(Boss除外)的姓名和月薪
select ename, sal from tb_emp where job <> '總裁' order by sal desc limit 1;
查詢薪水超過平均薪水的員工的姓名和月薪
select ename, sal from tb_emp where sal > (select avg(sal) from tb_emp);
查詢薪水超過其所在部門平均薪水的員工的姓名、部門編號和月薪(不會把姓名加進去)
-- 需要寫上完全限定名
select ename, t1.dno, sal from tb_emp t1 inner join (select dno, round(avg(sal), 1) as average from tb_emp group by dno) t2 on t1.dno=t2.dno where sal > average;
查詢部門中薪水最高的人姓名、月薪和所在部門名稱
select ename, sal, dname from tb_emp t1 inner join (select dno, max(sal) as maxsal from tb_emp group by dno) t2 on t1.dno = t2.dno inner join tb_dept t3 on t2.dno=t3.dno where sal=maxsal;
查詢主管的姓名和職位
-- 如果表裡面的資料非常的多,想要去重的話,效能是非常低的
-- 集合運算也是效能是非常低的
-- 控制是不會分組的,
select ename, job from tb_emp where eno in (select distinct mgr from tb_emp where mgr is not null);
-- 一般情況下,在寫SQL語句的時候,金陵避免使用distinct和in、not in運算,因為他們的效能都很差
-- 建議使用存在性判斷(exists/ not exists)來替代去重和集合運算
-- 平時的查詢,我們是可以查常量的
select ename, job from tb_emp t1 where exists (select 'x' from tb_emp t2 where t1.eno=t2.mgr);
查詢月薪排名4~6名的員工排名、姓名和月薪(排序是不重複的)
-- 臨時表必須要進行別名,即需要有一個名字(排序是不重複的)
select num, ename, sal from (select @a:=@a+1 as num, ename, sal from tb_emp t1, (select @a:=0) t2 order by sal desc) t3 limit 3 offset 3;
查詢員工的月薪排名、姓名和月薪(月薪相同的排序是重複的)
select a.ename, a.sal as sal, (select count(distinct b.sal) from tb_emp b where b.sal >= a.sal) as rank from tb_emp a order by a.sal desc;
如果查詢的列很多,但是查的行有很少時,即需要跳過的很多,取得又很少時,先只拿一列,跳過前面的10000,在將拿到的主鍵作為條件,再去查詢拿資料
select * from tb_emp where eno in (select eno from tb_emp limit 1000000 offset 1);