MySQL数据库练习

这篇博客本来昨天就应该发了,但是不知道为什么发不出去,所以只能今天修改一下后再发了,哎╮(╯▽╰)╭

先做个数据准备

-- 创建部门表
DROP TABLE IF EXISTS dept; 
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');
 
-- 创建员工表
DROP TABLE IF EXISTS emp;
CREATE TABLE emp(
  -- 员工编号
  empno int PRIMARY KEY, 
  -- 员工姓名
  ename VARCHAR(10), 
  -- 工作岗位
  job VARCHAR(9), 
  -- 直属领导
  mgr int, 
  -- 入职时间
  hiredate DATE, 
  -- 工资
  sal double, 
  -- 奖金
  comm double, 
  -- 所属部门
  deptno int
);
 
 
-- 为员工表表添加外键约束
ALTER TABLE emp ADD CONSTRAINT FOREIGN KEY EMP(deptno) REFERENCES dept (deptno);
 
-- 向员工表插入数据
INSERT INTO emp VALUES(7369,'SMITH','CLERK',7902,"1980-12-17",800,NULL,20);
INSERT INTO emp VALUES(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30);
INSERT INTO emp VALUES(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30);
INSERT INTO emp VALUES(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20);
INSERT INTO emp VALUES(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30);
INSERT INTO emp VALUES(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30);
INSERT INTO emp VALUES(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10);
INSERT INTO emp VALUES(7788,'SCOTT','ANALYST',7566,'1987-07-03',3000,NULL,20);
INSERT INTO emp VALUES(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10);
INSERT INTO emp VALUES(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30);
INSERT INTO emp VALUES(7876,'ADAMS','CLERK',7788,'1987-07-13',1100,NULL,20);
INSERT INTO emp VALUES(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30);
INSERT INTO emp VALUES(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20);
INSERT INTO emp VALUES(7934,'MILLER','CLERK',7782,'1981-01-23',1300,NULL,10);
 
 
-- 创建工资等级表
DROP TABLE IF EXISTS salgrade;
CREATE TABLE salgrade(
  -- 等级
  grade int, 
  -- 最低工资
  losal double, 
  -- 最高工资
  hisal double
);
 
-- 向工资等级表插入数据
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);

查询获得奖金的员工的信息

严格意义上来说奖金为0也是不算获得奖金的,这个因人而异吧
select * from emp where comm is not null or comm != 0;
在这里插入图片描述

查询姓名以A、B、S开头的员工的信息

以A开头:like ‘A%’
以A结尾:like ‘%A
满足其中一个条件用or连接,同时满足用and连接’
在这里插入图片描述

查询找到姓名长度为6个字符的员工的信息

我觉得你们可能更加喜欢这种:
select * from emp where length(ename)=6;
在这里插入图片描述

查询姓名中不包含R字符的员工信息。

包含R是like ‘%R%’
在这里插入图片描述

查询员工的信息并按工作降序工资升序排列

排序方式(order by)默认是升序(asc),而降序是desc,两种排序之间用逗号隔开
在这里插入图片描述

计算员工的日薪(按30天计)

round是用于保留小数的哦~
在这里插入图片描述

查询拥有员工的部门的部门名和部门号

distinct用于去除重复数据,只能放在第一个查询字段的前面(注意:需要数据完全相同才能去重,如果无法理解,可以在查询字段加入员工姓名比较一下)
在这里插入图片描述

查询雇佣日期早于其经理雇佣日期的员工及其经理姓名

inner join内连接:说白了就是根据外链接的字段将两个表合成一个。
表名 as 别名 :可以在这次的代码中给表取另外一个名字,as是可以省略的,还有,日期是可以比较的哦(神奇吧~)
在这里插入图片描述

查询工资水平大于平均工资的员工

获取平均值、最大值、最小值、总数等的功能代码不能直接写在where的条件语句中
在这里插入图片描述

查询与部门编号为30的员工工资水平相同的员工信息

sal in ()表示sal与()内的多个sal数据中的一个相等,则获取满足条件的信息。
与=区别在于=号比较范围只有一个,而in有多个(个人理解,有误请纠正)
在这里插入图片描述

查询工资高于部门编号为30的部门所有员工工资水平的员工信息

大于all()表示比较的数值大于括号内的所有获取的数值,即大于其中的最大值。但是!如果满足条件的数据不存在,则会返回空。
在这里插入图片描述

查询部门号、部门名、部门所在位置及其每个部门的员工总数

题意:按工作进行分组(group by),后获取各分组的员工总数(count(ename))
在这里插入图片描述

计算员工的年薪并且以年薪排序

按什么字段排序,方法是order by 条件字段;
在这里插入图片描述

查询工资为第3等级的职员名字、工资、所属部门以及部门所在地

这个题目只要理清思路,将每个部分拆开作为一个单独的部分分别完成就行,本身并没有什么特别的难点。
在这里插入图片描述

查询工资等级大于smith的员工的信息

在这里插入图片描述

解析一下最后一题(我是认真的!!!)

首先我们要先理清楚题目:
查询工资等级大于smith的员工的信息

注意不要被带过去,工资等级大于smith不代表一定要用工资等级进行比较,我们完全可以先获取smith的工资等级通过这个工资等级获取对应等级的最大工资,最后,只要大于这个最大工资,那么获取到的员工的工资等级就大于smith的工资等级了

个人做题步骤:
未明确的条件可以先用括号括起来,然后慢慢补充

第一步:明确最终目标的实现条件(工资大于某个工资等级的最大工资)
select * from emp where sal > ();

第二步:在第一步基础上,将括号内当成独立的一题,而获取目标是第一步缺少的部分(哪个工资等级的最大工资)
select * from emp where sal > (select hisal from salgrade where grade = ());

第三步:在第二步的基础上继续当成独立的一题补充缺少的因素,代码中间缺少的因素先括号括起来,把这一步其他部分先写完(通过什么(工资)来获取这个工资等级)
select * from emp where sal > (select hisal from salgrade where grade = (select grade from salgrade where () between losal and hisal));

第四步:最后将最终缺少的部分通过已知条件获得(获取的是谁的或什么条件的工资)
select * from emp where sal > (select hisal from salgrade where grade = (select grade from salgrade where (select sal from emp where ename = ‘smith’) between losal and hisal));

如此一来,这道题就完成了!以后就算有更加复杂的相关题目,也不过是多几个相同的步骤罢了……当然了,这是一口气解题的思路,如果愿意把代码分开写,思路可能更加便于理解~
但是!我就是不想写这种思路!!!(~ ̄▽ ̄~)

<think>好的,用户想要寻找关于MySQL数据库练习题或学习资源。之前的问题中,用户提到了MySQL练习题和相关引用,我需要根据这些信息来提供合适的资源。 首先,检查用户提供的引用内容。引用1提到了MySQL数据库练习题50道,并给出了下载地址。引用2是关于数据库开发与实战的专栏导学、基础概念、安装配置等,看起来像是一个系列教程。引用3则是一些具体的多表查询练习题,可能来自某个练习题集。 用户的需求很明确,需要练习题和学习资源。我需要整理这些引用中的信息,提供具体的资源链接和相关内容。此外,用户可能希望得到不同难度和类型的练习题,比如基础、进阶、实战项目等,以及配套的学习资料。 要注意引用中的项目地址,比如gitcode.com的链接,可能需要确认是否有效,但根据用户提供的信息,直接引用即可。同时,用户可能对免费资源更感兴趣,所以需要强调这些资源的可访问性。 另外,用户的问题可能不仅仅是寻找练习题,还可能希望了解如何系统学习MySQL,所以结合引用2中的内容,推荐系列教程,帮助用户从基础到进阶逐步学习。 最后,生成相关问题时要围绕MySQL练习题、学习路径、优化方法等,确保问题与用户的需求相关,帮助他们进一步探索。</think>### MySQL数据库学习资源及练习题推荐 #### 一、系统化学习资源 1. **《MySQL数据库开发与实战》专栏** - 包含数据库基础概念、安装配置、存储引擎、数据导入等核心知识 - 配套练习题巩固操作技能[^2] - 学习路径: $$基础概念 \rightarrow 安装配置 \rightarrow 数据操作 \rightarrow 高级查询$$ 2. **GitCode开源文档项目** - 提供50道MySQL练习题(含答案) - 覆盖数据定义、查询优化、事务管理等场景 - 下载地址:https://gitcode.com/Open-source-documentation-tutorial/372b1 [^1] #### 二、专项练习题集 **多表查询实战案例** ```sql -- 查询未选修李平老师课程的学生姓名 SELECT sname FROM student WHERE sid NOT IN ( SELECT DISTINCT student_id FROM score WHERE course_id IN ( SELECT cid FROM course WHERE teacher_id = ( SELECT tid FROM teacher WHERE tname='李平老师' ) ) ) ``` 此案例涉及三层嵌套查询,训练子查询与逻辑关联能力[^3] **练习题类型分布** | 难度 | 题目数量 | 知识点覆盖 | |------|---------|------------| | 基础 | 20 | CRUD操作、简单连接 | | 进阶 | 25 | 事务、索引、视图 | | 高级 | 5 | 性能优化、死锁处理 | #### 三、实战训练建议 1. **实验楼在线环境** - 提供预配置的MySQL实验环境 - 实时执行SQL语句验证学习效果 2. **Kaggle数据集实践** - 使用真实数据集(如电商交易数据)进行复杂查询训练 - 典型任务: $$用户行为分析 = \sum_{i=1}^{n}(登录次数_i \times 购买转化率_i)$$ #### 四、延伸学习工具 1. **MySQL官方文档** - 最新8.0版本特性详解 - 窗口函数示例: ```sql SELECT product_id, RANK() OVER(PARTITION BY category ORDER BY sales DESC) FROM sales_data ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值