mysql基础之多表练习题

随笔练习(mysql多表查询)

一、 部门表

创建表

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');

<img src = "dept.png">

二、 员工表

创建表

CREATE TABLE EMP(
    EMPNO INT  PRIMARY KEY, -- 员工编号
    ENAME VARCHAR(10), -- 员工姓名
    JOB VARCHAR(9), -- 员工工作
    MGR INT, -- 员工直属领导编号
    HIREDATE DATE, -- 入职时间
    SAL DOUBLE, -- 工资
    COMM DOUBLE, -- 奖金
    DEPTNO INT,  -- 所在部门
    FOREIGN KEY (DEPTNO) REFERENCES DEPT(DEPTNO) -- 关联dept表  
);  

插入数据

-- ALTER TABLE EMP ADD FOREIGN KEY (DEPTNO) REFERENCES DEPT(DEPTNO);
INSERT INTO EMP VALUES(7369,'SMITH','职员',7566,"1980-12-17",800,NULL,20);
INSERT INTO EMP VALUES(7499,'ALLEN','销售员',7698,'1981-02-20',1600,300,30);
INSERT INTO EMP VALUES(7521,'WARD','销售员',7698,'1981-02-22',1250,500,30);
INSERT INTO EMP VALUES(7566,'JONES','经理',7839,'1981-04-02',2975,NULL,20);
INSERT INTO EMP VALUES(7654,'MARTIN','销售员',7698,'1981-09-28',1250,1400,30);
INSERT INTO EMP VALUES(7698,'BLAKE','经理',7839,'1981-05-01',2850,NULL,30);
INSERT INTO EMP VALUES(7782,'CLARK','经理',7839,'1981-06-09',2450,NULL,10);
INSERT INTO EMP VALUES(7788,'SCOTT','职员',7566,'1987-07-03',3000,2000,20);
INSERT INTO EMP VALUES(7839,'KING','董事长',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO EMP VALUES(7844,'TURNERS','销售员',7698,'1981-09-08',1500,50,30);
INSERT INTO EMP VALUES(7876,'ADAMS','职员',7566,'1987-07-13',1100,NULL,20);
INSERT INTO EMP VALUES(7900,'JAMES','职员',7698,'1981-12-03',1250,NULL,30);
INSERT INTO EMP VALUES(7902,'FORD','销售员',7566,'1981-12-03',3000,NULL,20);
INSERT INTO EMP VALUES(7934,'MILLER','职员',7782,'1981-01-23',1300,NULL,10);

<img src = "emp.png">

三、 工资等级表

创建表

CREATE TABLE SALGRADE( 
    GRADE INT,-- 等级
    LOSAL DOUBLE, -- 最低工资
    HISAL DOUBLE -- 最高工资
); 

插入数据

INSERT INTO SALGRADE VALUES (1,500,1000);
INSERT INTO SALGRADE VALUES (2,1001,1500);
INSERT INTO SALGRADE VALUES (3,1501,2000);
INSERT INTO SALGRADE VALUES (4,2001,3000);
INSERT INTO SALGRADE VALUES (5,3001,9999);

<img src = "salgrade.png">

完成下面的功能

1.查找部门30中员工的详细信息。
2.找出从事职员工作的员工的编号、姓名、部门号
3.检索出奖金多于基本工资的员工信息
4.检索出奖金多于基本工资60%的员工
5.找出姓名中包含A的员工信息。
6.找出姓名以A、B、S开始的员工信息
7.找到名字长度为7个字符的员工信息
8.名字中不包含R字符的员工信息。
9.返回员工的详细信息并按姓名升序
10.返回员工的信息并按姓名降序,工资升序排列。
11.计算员工的日薪(按30天)。
12.找出获得奖金的员工的工作。
13.找出奖金少于100或者没有获得奖
14.找出10部门的经理、20部门的职员的员工信息
15.找出10部门的经理、20部门的职员 或者既不是经理也不是职员但是工资高于2000元的员工信息。

1.分析:需要查找部门30中的员工数据,我们需要用到员工表emp,部门表dept,查找条件就是通过员工表中的deptno = 30 来寻找,并且还需要输出员工部门信息.这里我们使用内连接,筛选条件就是emp.deptno = dept.deptno 。

SELECT * FROM emp, dept WHERE emp.deptno = 30 AND emp.deptno = dept.deptno; 

<img src = "1.png">

2.分析:找出从事职员工作的员工的编号、姓名、部门号,我们发现职员工作和员工编号都是在emp表中的,所以我们只需要使用emp表就足够了,并且我们需要使用emp表中的职员工作作为条件来寻找empno

SELECT empno,ename,deptno FROM emp WHERE job = '职员';

<img src = "2.png">

3.分析:奖金和基本工资都在员工表中,还需要关联一下员工的部门信息。所以,我们需要使用emp表和
dept表,限定emp.sal < emp.comm寻找满足条件的员工,然后使用内连接筛选笛卡尔积。

SELECT * FROM emp t1,dept t2 WHERE t1.sal< IFNULL(t1.comm,0) AND t1.deptno = t2.deptno;

<img src = "3.png">

4.分析:奖金多余百分之60基本工资的员工,和上面类似的做法

SELECT * FROM emp t1,dept t2 WHERE (0.6*t1.sal)<IFNULL(t1.comm,0) AND t1.deptno=t2.deptno;

<img src = "4.png">

5.分析:找出姓名中包含A的员工信息,我们需要用到emp表中的ename属性来进行判断,然后使用内连接来得到员工部门信息。注意:对字符串进行判断,需要使用like

SELECT * FROM emp t1,dept t2 WHERE t1.ename like '%A%' AND t1.deptno = t2.deptno;

<img src = "5.png">

6.分析:需要找姓名以A.B.S开始的员工,和上面类似,我们可以使用LIKE ‘A%’ OR t1.ename LIKE ‘B%’ OR t1.ename LIKE ‘S%’来作为条件,最后对找到的数据进行筛选t1.deptno = t2.deptno。

SELECT * FROM emp t1,dept t2 WHERE t1.ename LIKE 'A%' OR t1.ename LIKE 'B%'  OR t1.ename LIKE 'S%' HAVING t1.deptno = t2.deptno;

<img src = "6.png">

7.分析:找到名字为7个的员工信息,那么我们需要使用ename like ‘_‘占位符来进行判断,最后再对员工信息进行筛选

SELECT * FROM emp t1,dept t2 WHERE t1.ename LIKE '_______' AND t1.deptno = t2.deptno;

<img src  = "7.png">

8.分析:名字中不包含R字符的员工信息。也和上面类似,加一个反义字符即可

SELECT * FROM emp t1,dept t2 WHERE t1.ename NOT LIKE '%R%' AND t1.deptno = t2.deptno;

<img src = "8.png">

9.分析:返回员工的详细信息并按姓名升序。先找到员工的所有详细信息,然后使用GROUP BY 进行排序操作,ASC升序,DESC降序

SELECT * FROM emp t1,dept t2 WHERE t1.deptno = t2.deptno GROUP BY t1.ename ASC;

<img src = "9.png">

10.分析:返回员工的信息并按姓名降序,工资升序排列。和上面类似。

SELECT * FROM emp t1,dept t2 WHERE t1.deptno = t2.deptno GROUP BY t1.ename ASC , t1.sal DESC;

<img src = "10.png">

11.分析:计算员工的日薪(按30天)。获取到员工的工资和奖金即可计算,需要输出员工姓名和日薪即可

SELECT ename,((sal+IFNULL(comm,0))/30) as 日薪 FROM emp;

<IMG SRC = "11.PNG">

12.分析:找出获得奖金的员工的工作。判断条件emp.comm is not null.输出员工JOB和姓名即可

SELECT ename,job FROM emp WHERE emp.comm IS NOT NULL;

<img src = "12.png">

13.分析:找出奖金少于100或者没有获得奖。使用子查询,得到奖金数,然后将奖金数作为条件进行判断(select * from emp where IFNULL(comm,0)< 100)t1 ,得到虚拟表 ,然后通过t1.deptno 作为条件找到员工的部门信息

SELECT * FROM (SELECT * FROM emp WHERE IFNULL(comm,0) < 100) t1,dept WHERE t1.deptno = dept.deptno;

<img src = "13.png">

14.分析:找出10部门的经理、20部门的职员的员工信息.这样,我们通过条件进行判断,
最后使用HAVING 进行筛选,去除笛卡尔积中不满足的条件

SELECT * FROM emp t1,dept t2 WHERE t1.deptno = 10 AND t1.job = "经理"  OR t1.deptno = 20 AND t1.job = "职员" HAVING  t1.deptno = t2.deptno;

<img src = "14.png">

15.分析:找出10部门的经理、20部门的职员 或者既不是经理也不是职员但是工资高于2000元的员工信息。这里需要使用双重条件查询,找到10部门的经理和20部门的职员的信息,然后将它返回一个整体的条件,然后这个新条件中的empno 不能等于 emp.empno 并且 emp.sal+IFNULL(emp.comm,0) >2000

SELECT * FROM emp t1,dept t2 WHERE  (t1.job NOT IN ("经理","职员")  AND (t1.sal+ IFNULL(t1.comm,0))>2000) OR (t1.deptno = 10 AND t1.job = "经理"  OR t1.deptno = 20 AND t1.job = "职员" )HAVING  t1.deptno = t2.deptno ;

<IMG SRC = "15.PNG">

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值