一、數據庫(employee)中有數據表
部門表(dept)
字段名 字段類型 寬度 說明 備註
deptno char 10 主鍵 部門編號
dname varchar 10 非NULL 部門名稱
loc varchar 20 非NULL 所在城市
僱員表(emp)
字段名 字段類型 寬度 說明 備註
empno char 10 主鍵 員工編號
ename varchar 20 非NULL 員工姓名
job varchar 10 工作
mrg char 10 直屬領導
hiredate date 僱傭日期
sal decimal(7,2) 非NULL 工資
comm decimal(7,2) 獎金
deptno char 10 所屬部門
工資等級表(grade)
字段名 字段類型 寬度 說明 備註
grade char 10 主鍵 工資等級
losal float 非NULL 最低工資
hisal float 非NULL 最高工資
首先對應創建表:
create database employee;
use employee;
(部門表)
create table dept(
deptno char(10) primary key comment "部門編號",
dname varchar(10) not null comment "部門名稱",
loc varchar(20) not null comment "所在城市");
(僱員表)
create table emp(
empno char(10) primary key comment "員工編號",
ename varchar(20) not null comment "員工姓名",
job varchar(10) comment "工作",
mrg char(10) comment "直屬領導",
hiredate date comment "僱傭日期",
sal decimal(7,2) not null comment "工資",
comm decimal(7,2) comment "獎金",
deptno char(10) comment "所屬部門");
(工資等級表)
create table grade(
grade char(10) primary key comment "工資等級",
losal float not null comment "最低工資",
hisal float not null comment "最高工資");
1. 列出所有員工的姓名及其直接上級的姓名。
select ename,(select ename from emp where e.mrg=e.empno) from emp e;
解析:
列:是員工姓名以及上級姓名
表格:emp
條件:員工的直屬領導編號=員工編號
因爲是所有員工以及上級姓名,所以外部並沒有其他條件僅僅就這一張表
所以在選擇屬性中間進行查找對應表中員工的直屬領導姓名
2. 查出至少有一個員工的部門。顯示部門編號、部門名稱、部門位置、部門人數。
select d.,z.cnt
from dept d,( select deptno,count() as cnt from emp group by deptno) z
where d.deptno=z.deptno and z.cnt>=1;
列:部門編號、部門名稱、部門位置、部門人數
表:dept,emp
條件:z.cnt>=1
思路:
因爲列中的前三個屬性在第一張表中,部門人數需要從第二張表emp中統計出來,所以需要兩張表。
第一張表需要需要所有屬性,另一張表需要部門編號以及人數我們進行生成出來,再整體進行條件篩選。
這是from後面的兩張表,再進行篩選count>=1 以及部門編號相同的即可
3. 列出所有文員的姓名及其部門名稱,部門的人數。
select e.ename,d.name,e.cnt
from dept d,(select ename,deptno,count(*)as cnt from emp) e
where e.ename = “文員” and e.deptno=d.deptno
列:文員的姓名及其部門名稱,部門的人數
表:dept,emp
條件:emp.ename = “文員”
4. 列出薪金比laoZhang高的所有員工
select ename from emp where sal>(select sal from emp where ename like “laoZhang”);
5. 列出受僱日期早於直接上級的所有員工的編號、姓名、部門名稱。
select e.empno,e.ename,d.dname
from emp e,dept d
where hiredate<(select hiredate from emp where empno in (e.mrg))
and e.deptno=d.deptno;
列:員工的編號、姓名、部門名稱
表:emp,dept
條件:受僱日期早於直接上級(這裏可以直接用日期比較)
思路:
首先進行比對emp中日期前後,在進行對應員工所屬部門與dept中的篩選
6. 列出部門名稱和這些部門的員工信息,同時列出那些沒有員工的部門。
select dname,emp.*
from dept left join emp
on dept.deptno=emp.deptno;
列:部門名稱,員工信息
表:emp,dept 進行左外連接
條件:列出沒有員工與有員工的
7. 列出最低薪金大於15000的各種工作及從事此工作的員工人數。
select job,count(*)
from emp e
group by job
having min(sal)>15000;
進行分組,然後設置最低薪金大於15000
8. 列出在銷售部工作的員工的姓名,假定不知道銷售部的部門編號。
select ename
from emp;
where deptno=(select deptno from dept where dname=“銷售部”);
思路:
不知道銷售部的部門編號,那麼從部門名稱中尋找部門編號,然後進行比對查找
9. 列出薪金高於公司平均薪金的所有員工信息,所在部門名稱,上級領導,工資等級。
select e.*,d.dname,m.ename,g.grade
from emp e,from emp m,dept d,grade g
where e.sal>(select avg(sal) from emp) and e.mrg=m.empno and e.deptno=d.deptno and e.sal between g.losal and g.hisal;
列:員工所有信息,所在部門名稱,上級領導姓名,工資等級
表:emp,dept,grade
條件:薪水高於公司平均 僱員表與部門表有相同編號 找到對應的上級名稱 最後根據對應工資找到對應的等級(4個)
10.列出與xiaoLiu從事相同工作的所有員工及部門名稱。
select e.*,d.dname
from emp e,dept d
where e.job=(select job from emp where ename=“xiaoLiu”) and e.deptno=d.deptno;
列:所有員工,部門名稱
表:emp,dept
條件:找到與xiaoliu相同工作的員工 對應員工表中部門編號找到部門表中的部門名稱(2)
11.列出薪金高於在部門30工作的所有員工的薪金的員工姓名和薪金、部門名稱。
select e.ename,e.sal,d.dname
from emp e,dept d
where e.deptno=d.deptno and e.sal>all(select sal from emp where deptno=30);
列:員工姓名和薪金、部門名稱
表:emp,dept
條件:兩張表對應的部門名稱,sal>all(對應薪資)
12.列出在每個部門工作的員工數量、平均工資。
select deptno,count(*),avg(sal)
from emp
group by deptno
歡迎加羣891507813一起學習交流