第八週課後作業 數據庫查詢練習

一、數據庫(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一起學習交流
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章