数据库练习


大家好,我是小笙,我们学习完基础Mysql,我们接下来需要进行一些练习,巩固一下基础!

雇员系统表

# 部门表
CREATE TABLE dept( 
deptno MEDIUMINT   UNSIGNED  NOT NULL  DEFAULT 0, 
dname VARCHAR(20)  NOT NULL  DEFAULT "", -- 部门名
loc VARCHAR(13) NOT NULL DEFAULT ""
);
 
INSERT INTO dept VALUES(10, 'ACCOUNTING', 'NEW YORK'), (20, 'RESEARCH', 'DALLAS'), (30, 'SALES', 'CHICAGO'), (40, 'OPERATIONS', 'BOSTON');

# 创建表EMP雇员
CREATE TABLE emp
(empno  MEDIUMINT UNSIGNED  NOT NULL  DEFAULT 0,  -- 编号
ename VARCHAR(20) NOT NULL DEFAULT "",  -- 名字
job VARCHAR(9) NOT NULL DEFAULT "", -- 工作
mgr MEDIUMINT UNSIGNED , -- 上级编号
hiredate DATE NOT NULL, -- 入职时间
sal DECIMAL(7,2)  NOT NULL, -- 薪水
comm DECIMAL(7,2) , -- 红利
deptno MEDIUMINT UNSIGNED NOT NULL DEFAULT 0  -- 部门编号
);
 
INSERT INTO emp VALUES(7369, 'SMITH', 'CLERK', 7902, '1990-12-17', 800.00,NULL , 20), 
(7499, 'ALLEN', 'SALESMAN', 7698, '1991-2-20', 1600.00, 300.00, 30),  
(7521, 'WARD', 'SALESMAN', 7698, '1991-2-22', 1250.00, 500.00, 30),  
(7566, 'JONES', 'MANAGER', 7839, '1991-4-2', 2975.00,NULL,20),  
(7654, 'MARTIN', 'SALESMAN', 7698, '1991-9-28',1250.00,1400.00,30),  
(7698, 'BLAKE','MANAGER', 7839,'1991-5-1', 2850.00,NULL,30),  
(7782, 'CLARK','MANAGER', 7839, '1991-6-9',2450.00,NULL,10),  
(7788, 'SCOTT','ANALYST',7566, '1997-4-19',3000.00,NULL,20),  
(7839, 'KING','PRESIDENT',NULL,'1991-11-17',5000.00,NULL,10),  
(7844, 'TURNER', 'SALESMAN',7698, '1991-9-8', 1500.00, NULL,30),  
(7900, 'JAMES','CLERK',7698, '1991-12-3',950.00,NULL,30),  
(7902, 'FORD', 'ANALYST',7566,'1991-12-3',3000.00, NULL,20),  
(7934,'MILLER','CLERK',7782,'1992-1-23', 1300.00, NULL,10);

# 工资级别表
CREATE TABLE salgrade
(
grade MEDIUMINT UNSIGNED NOT NULL DEFAULT 0, -- 工资级别
losal DECIMAL(17,2)  NOT NULL, -- 该级别的最低工资
hisal DECIMAL(17,2)  NOT NULL -- 该级别的最高工资
);

INSERT INTO salgrade VALUES (1,700,1200);
INSERT INTO salgrade VALUES (2,1201,1400);
INSERT INTO salgrade VALUES (3,1401,2000);
INSERT INTO salgrade VALUES (4,2001,3000);
INSERT INTO salgrade VALUES (5,3001,9999);

雇员表的结构

image-20220404165757748

image-20220404163210012

image-20220404163252514

相关练习

1.显示所有部门名称

SELECT dname FROM dept;

image-20220404163417097

2.显示所有雇员名及其全年收入13月(工资+补助),并指定列别名"年收入”

SELECT ename,(sal+IF(comm IS NULL,0,comm))*13 AS '年收入' FROM emp;
SELECT ename,(sal+IFNULL(comm,0))*13 AS '年收入' FROM emp;

image-20220404170739695

3.显示工资超过2850的雇员姓名和工资

SELECT ename,sal FROM emp
			WHERE sal > 2850;

image-20220404164529923

4.显示工资不在1500到2850之间的所有雇员名及工资

SELECT ename,sal FROM emp
			WHERE sal < 1500 OR sal > 2850;

image-20220404164656769

5.显示编号为7566的雇员姓名及所在部门编号

SELECT ename,deptno FROM emp
			WHERE empno = 7566;

image-20220404164827529

6.显示部门10和30中工资超过1500的雇员名及工资

SELECT ename,sal FROM emp		
			WHERE sal > 1500 AND (deptno = 10 OR deptno = 30);

image-20220404165945835

7.显示无管理者的雇员名及岗位

SELECT ename,job FROM emp
			WHERE mgr is NULL;

image-20220404165136290

8.显示在1991年2月1日到1991年5月1日之间雇用的雇员名,岗位及雇佣日期,并以雇佣日期进行排序

SELECT ename,job,hiredate FROM emp
			WHERE hiredate BETWEEN '1991-02-01' AND '1991-05-01'
						ORDER BY hiredate ASC;

image-20220404171059969

9.显示获得补助的所有雇员名,工资及补助,并以工资降序排序

SELECT ename,sal,comm FROM emp
			WHERE comm IS NOT NULL 
						ORDER BY sal DESC;

image-20220404170002432

10.选择部门30中的所有员工

SELECT *FROM emp 
			WHERE deptno = 30;

image-20220404171925170

11.列出所有办事员(CLERK)的姓名,编号和部门编号

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

image-20220404172126333

12.找出红利高于薪资的员工

SELECT *FROM emp
			WHERE IFNULL(comm,0) > sal;

13.找出红利高于薪资60%的员工

SELECT *FROM emp
			WHERE IFNULL(comm,0) > sal*0.6;

image-20220404195414138

14.找出部门10中所有经理(MANAGER)和部门20中所有办事员(CLERK)的详细资料

SELECT *from emp
			WHERE (deptno = 10 AND job = 'MANAGER') OR (deptno = 20 AND job = 'CLERK');

image-20220404191822982

15.找出部门10中所有经理(MANAGER),部门20中所有办事员(CLERK,还有既不是经理又不是办事员,但其薪金大于或等于2000的所有员工的详细资料.

SELECT *from emp
			WHERE (deptno = 10 AND job = 'MANAGER') OR (deptno = 20 AND job = 'CLERK')
								OR job NOT IN('MANAGER','CLERK') AND sal >= 2000;

image-20220404195435490

16.找出收取红利的员工的不同工作

SELECT DISTINCT job FROM emp
			WHERE comm IS NOT NULL;

image-20220404195459238

17.找出不收取红利或收取的红利低于100的员工

SELECT *FROM emp
			WHERE comm IS NULL OR IFNULL(comm,0) < 100;

image-20220404195533728

18.找出各月倒数第3天受雇的所有员工(last_day(日期),可以返回该日期月份的最后一天)

SELECT *FROM emp 
			WHERE LAST_DAY(hiredate) - 2 = hiredate;

image-20220404195005799

19.找出早于12年前受雇的员工

SELECT *FROM emp			
			WHERE DATE_ADD(hiredate,INTERVAL 12 YEAR) < NOW();

image-20220404195143874

20.以首字母小写的方式显示所有员工的姓名

SELECT CONCAT(LCASE(LEFT(ename,1)),SUBSTRING(ename,2,LENGTH(ename)-1)) FROM emp;

image-20220404195224151

21.显示正好为5个字符的员工的姓名.

SELECT *FROM emp
			WHERE LENGTH(ename) = 5;

22.显示不带有"R"的员工的姓名

SELECT *FROM emp
		WHERE ename NOT LIKE '%R%';

image-20220404202806099

23.显示所有员工姓名的前三个字符

SELECT LEFT(ename,3)FROM emp;

image-20220404202834175

24.显示所有员工的姓名,用a替换所有"A"

SELECT REPLACE(ename,'A','a') FROM emp;

image-20220404202857979

25.显示满10年服务年限的员工的姓名和受雇日期

SELECT ename,hiredate FROM emp			
			WHERE DATE_ADD(hiredate,INTERVAL 10 YEAR) <= NOW();

image-20220404202929742

26.显示员工的详细资料,按姓名排序

SELECT *FROM emp	
			ORDER BY ename ASC;

image-20220404202954974

27.显示员工的姓名和受雇日期,根据其服务年限,将最老的员工排在最前面

SELECT ename,hiredate FROM emp
			ORDER BY hiredate ASC;

image-20220404203020518

28.显示所有员工的姓名、工作和薪金按工作降序排序,若工作相同则按薪金排序

SELECT ename,job,sal FROM emp
			ORDER BY job DESC,sal ASC;

image-20220404203047435

29.显示所有员工的姓名、加入公司的年份和月份按受雇日期所在月排序,若月份相同则将最早年份的员工排在最前面

SELECT ename,YEAR(hiredate) AS '年',MONTH(hiredate) AS '月' FROM emp
			ORDER BY MONTH(hiredate) ASC,hiredate ASC;

image-20220404203243089

30.显示在一个月为30天的情况所有员工的日薪金,忽略余数

SELECT ename,FLOOR(sal/30) AS '日薪金' FROM emp;

image-20220404203345165

31.找出在(任何年份的)2月受聘的所有员工

SELECT *FROM emp  
			WHERE MONTH(hiredate) = 2;

image-20220404203412289

32.以年月日的方式显示所有员工的服务年限(大概)

SELECT ename,FLOOR(DATEDIFF(NOW(),hiredate)/365) AS '年',
				FLOOR(DATEDIFF(NOW(),hiredate)%365/30) AS '月', 
				FLOOR(DATEDIFF(NOW(),hiredate)%365%30) AS '日'FROM emp;

image-20220404203819957

33.列出至少有一个员工的所有部门

SELECT COUNT(*) AS '员工数' FROM emp
		 GROUP BY deptno
			HAVING 员工数 > 1;

image-20220404230805876

34.列出薪金比“SMITH”多的所有员工

SELECT *FROM emp
			WHERE sal > (SELECT sal FROM emp WHERE ename = 'SMITH');

image-20220404230831918

35.列出受雇日期晚于其直接上级的所有员工

# 自连接
SELECT *FROM emp worker,emp boss
			WHERE worker.mgr = boss.empno AND worker.hiredate > boss.hiredate;

image-20220404230928395

36.列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门

# 外连接
SELECT dname,emp.* FROM dept
			LEFT JOIN emp ON dept.deptno = emp.deptno

image-20220409131006814

37.列出所有“CLERK”(办事员)的姓名及其部门名称

SELECT ename,dname FROM emp,dept 
			WHERE emp.deptno = dept.deptno AND job = "CLERK"

image-20220409132309640

38.列出各个部门最低薪金大于1500的各种工作

SELECT *FROM emp
			GROUP BY job
			HAVING MIN(sal) > 1500

image-20220409132952820

39.列出在部门“SALES”(销售部)工作的员工的姓名

SELECT ename FROM emp,dept 
			WHERE emp.deptno = dept.deptno AND dname = "SALES"

image-20220409133719910

40.列出薪金高于公司平均薪金的所有员工

SELECT *FROM emp	
			WHERE sal > (SELECT AVG(sal) AS avg_sal FROM emp)

image-20220409133906029

41.列出与“SCOTT”从事相同工作的所有员工

SELECT *FROM emp
			WHERE job = (SELECT job FROM emp WHERE ename = "SCOTT")

image-20220409140255234

42.列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金

SELECT ename,sal FROM emp
			WHERE sal > (SELECT MAX(sal) FROM emp WHERE deptno = 30)

image-20220409140505395

43.列出在每个部门工作的员工数量、平均工资

SELECT deptno,COUNT(*) AS "员工数量",AVG(sal+IFNULL(comm,0)) AS "平均工资" FROM emp
			GROUP BY deptno

image-20220409140953802

44.列出所有部门的详细信息和部门人数

SELECT dept.*,sum FROM dept,(SELECT deptno,COUNT(*) AS sum FROM emp GROUP BY deptno) temp 
			WHERE temp.deptno = dept.deptno

image-20220409141815819

45.列出各种工作的最低工资

SELECT job,MIN(sal) AS min_sal FROM emp
      GROUP BY job 

46.列出MANAGER(经理)的最低薪金

SELECT job,MIN(sal) AS  min_sal FROM emp
			WHERE job = "MANAGER"

image-20220409141929287

47.列出所有员工的年工资,按年薪从低到高排序

SELECT ename,(sal+IFNULL(comm,0))*12 AS sum_sal FROM emp
			ORDER BY sum_sal

image-20220409142001985

综合题目

48.设学校环境如下:一个系有若干个专业,每个专业一年只招一个班,每个班有若干个学生。
现要建立关于系、学生、班级的数据库,关系模式为:
班CLASS (班号classid,专业名subject,系名deptname,入学年份enrolltime,人数num)
学生STUDENT (学号studentid,姓名name,年龄age,班号classid)
系DEPARTMENT (系号departmentid,系名deptname)
试用SQL语言完成以下功能:

(1)建表,在定义中要求声明:

  • 每个表的主外键
  • deptname是唯一约束
  • 学生姓名不能为空

(2)插入如下数据

DEPARTMENT (001,数学;002,计算机:003,化学;004,中文:005,经济)

CREATE TABLE DEPARTMENT(
	departmentid INT PRIMARY KEY, -- 系号
    deptname VARCHAR(32) UNIQUE -- 系名
)
START TRANSACTION
INSERT INTO DEPARTMENT VALUES (001,"数学"),
						    (002,"计算机"),
						    (003,"化学"),
						    (004,"中文"),
						    (005,"经济");

CLASS(
101,软件,计算机,1995,20;
102,微电子,计算机,1996,30:
111,无机化学,化学,1995,29;
112,高分子化学,化学,1996,25;
121,统计数学,数学,1995,20;
131,现代语言,中文,1996,30;
141,国际贸易,经济,1997,30;
142,国际金融,经济,1996,14;)

CREATE TABLE CLASS(
		classid INT PRIMARY KEY, -- 班号
		`subject` VARCHAR(32), -- 专业名
		deptname VARCHAR(32), -- 系名
		enrolltime YEAR, -- 入学年份
		num INT, -- 人数
		FOREIGN KEY(deptname) REFERENCES `DEPARTMENT`(deptname)
)
INSERT INTO CLASS VALUES(101,"软件","计算机","1995",20),
                        (102,"微电子","计算机","1996",30),
                        (111,"无机化学","化学","1995",29),
                        (112,"高分子化学","化学","1996",25),
                        (121,"统计数学","数学","1995",20),
                        (131,"现代语言","中文","1996",30),
                        (141,"国际贸易","经济","1997",30),
                        (142,"国际贸易","经济","1996",14);

STUDENT(
8101,张三,18,101:
8102,钱四,16,121;
8103,王玲,17,131;
8105,李飞,19,102;
8109,赵四,18,141:
8110,李可,20,142;
8201,张飞,18,111;
8302,周瑜,16,112;
8203,王亮,17,111;
8305,董庆,19,102;
8409,赵龙,18,101;
8510,李丽,20,142)

CREATE TABLE STUDENT (
		studentid INT PRIMARY KEY, -- 学号
		`name` VARCHAR(32) NOT NULL, -- 姓名
    	age  INT, -- 年龄
		classid INT, -- 班
		FOREIGN KEY(classid) REFERENCES `CLASS`(classid)
)
INSERT INTO STUDENT VALUES(8101,"张三",18,101),
                          (8102,"钱四",16,121),
                          (8103,"王玲",17,131),
                          (8105,"李飞",19,102),
                          (8109,"赵四",18,141),
                          (8110,"李可",20,142),
                          (8201,"张飞",18,111),
                          (8302,"周瑜",16,112),
                          (8203,"王亮",17,111),
                          (8305,"董庆",19,102),
                          (8409,"赵龙",18,101),
                          (8510,"李丽",20,142);

(3)完成以下查询功能

  • 找出所有姓李的学生

    SELECT *FROM STUDENT 
    			WHERE `name` LIKE "李%"
    

    image-20220409161924957

  • 列出所有开设超过1个专业的系的名字

    SELECT COUNT(*) AS sum,deptname FROM CLASS 
    			GROUP BY deptname
    			HAVING sum > 1
    

    image-20220409165029543

  • 列出人数大于等于30的系的编号和名字

    SELECT departmentid,DEPARTMENT.deptname FROM DEPARTMENT,
    			(SELECT SUM(num) AS sum,deptname FROM CLASS 
    			GROUP BY deptname HAVING sum >= 30)temp
    			WHERE temp.deptname = DEPARTMENT.deptname
    

    image-20220409165727319

(4)学校又新增加了一个物理系,编号为006

INSERT INTO DEPARTMENT VALUES(006,"物理系");

image-20220409163322294

(5)学生张三退学,请更新相关的表

START TRANSACTION -- 通过事务进行同步操作,防止过程出现异常导致数据不统一
UPDATE CLASS SET num = num - 1 
			WHERE CLASS.classid = (SELECT classid FROM STUDENT 
			WHERE `name` = "张三")
DELETE FROM STUDENT 
			WHERE `name` = "张三"
COMMIT;
  • 3
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Al_tair

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值