351 lines
11 KiB
Markdown
351 lines
11 KiB
Markdown
# 一、填空题
|
||
|
||
1. 关系型数据库的标准语言是 **SQL语言** 。
|
||
|
||
2. 概念模型中的3种基本联系分别是 **一对一** 、 **一对多** 和 **多对多** 。
|
||
|
||
3. MySQL数据类型中存储整数数值并且占用字节数最小的是 **tinyint** 。
|
||
|
||
4. 在 MySql 命令中用于切换到 test 数据库的命令是 **use test** 。
|
||
|
||
5. 数据表中字段的主键约束是通过 **primary key** 关键字定义的。
|
||
|
||
6. 在E-R图中,实体使用 **矩形** 图形来表示。
|
||
|
||
7. 多数据插入时,VALUE后的多个值列表之间使用 **,** 分隔。
|
||
|
||
8. “LIMIT 3,5”表示从第 **3** 条记录开始,获取5条记录。
|
||
|
||
9. 在 WHERE 子句中,关系运算符“<>”与关系运算符 **!=** 等价。
|
||
|
||
10. 手动刷新权限表的语句是 **flush privileges** 。
|
||
|
||
|
||
|
||
# 二、解答题
|
||
|
||
### 1.简述关系模型中的表、记录、码、主码的关系。
|
||
|
||
> 关系模型以二维表存放数据,表中的行称为一个记录、列称为一个字段,如果一个或几个字段组合的值可唯一标识其对应记录,则称该字段或字段组合为码。一个表可能有多个码,通常指定一个码为“主码”。
|
||
|
||
### 2.为什么需要系统数据库?用户是否可以删除系统数据库?
|
||
|
||
> 系统数据库是MySQL服务正常运行所依赖的内部库,其中存放有MySQL系统管理的重 要配置信息,若删了它们MySQL服务将无法正常启动和运行,所以用户使用时必须十分小心 避免删除和修改系统数据库。
|
||
|
||
### 3.简述select语句的from、where、group by及order by子句的作用。
|
||
|
||
> From 是从哪个表获取数据
|
||
>
|
||
> Where 数据库操作时添加的条件
|
||
>
|
||
> Group by 将上面过滤出的数据分组
|
||
>
|
||
> Order by 用于根据指定的列对结果集进行排序, 默认按照升序对记录进行排序
|
||
|
||
### 4.索引有哪几类?各类索引的特点是什么?
|
||
|
||
> 普通索引 没有唯一性之类的限制
|
||
>
|
||
> 唯一性索引 索引列的值都只能出现一次
|
||
>
|
||
> 主键索引 只能在主键中创建
|
||
>
|
||
> 全文索引 只能在字符中使用
|
||
>
|
||
> 哈希索引 当根据一个值获取一个特定的行时哈希索引非常快
|
||
|
||
### 5.为什么要在MySQL中设置备份与恢复功能?
|
||
|
||
> 备份和恢复的目的就是将数据库中的数据进行导出,生成副本,然后在系统发生故障后能够恢复全部或部分数据。数据备份就是制作数据库结构、对象和数据的拷贝,以便在数据库遭到破坏时,或因需求改变而需要把数据还原到改变以前时能够恢复数据库。数据恢复就是指将数据库备份加载到系统中。数据备份和恢复可以用于保护数据库的关键数据。在系统发生错误或者因需求改变时,利用备份的数据可以恢复数据库中的数据。
|
||
>
|
||
> 在数据库遭到破坏时能够修复数据库,也可以用于其他目的。
|
||
|
||
# 三、设计题
|
||
|
||
假设有一个企业员工管理的数据库,数据库名为yggl,包含三个数据表:emp(员工表)、dept(部门表)、sal (员工薪水表)。三个数据表的表结构如表1.1、表1.2、表1.3所示,数据如表2.1、表2.2、表2.3所示。
|
||
|
||
用SQL语句完成如下题目。
|
||
|
||
|
||
|
||
表1.1:emp(员工表)表结构
|
||
|
||
| 字段名 | 类型(长度) | 是否允许为空值 | 描述 |
|
||
| -------- | -------------- | -------------- | ---- |
|
||
| 员工编号 | char(6) | × | 主键 |
|
||
| 姓名 | char(10) | × | |
|
||
| 性别 | tinyint(1) | × | |
|
||
| 出生日期 | date(系统默认) | × | |
|
||
| 电话号码 | char(12) | √ | |
|
||
| 部门编号 | char(3) | × | 外键 |
|
||
|
||
表1.2:dept(部门表)表结构
|
||
|
||
| 字段名 | 类型(长度) | 是否允许为空值 | 描述 |
|
||
| -------- | ------------ | -------------- | ---- |
|
||
| 部门编号 | char(3) | × | 主键 |
|
||
| 部门名 | char(20) | × | |
|
||
| 备注 | text(16) | √ | |
|
||
|
||
表1.3:sal (员工薪水表)表结构
|
||
|
||
| 字段名 | 类型(长度) | 是否允许为空值 | 描述 |
|
||
| -------- | ------------ | -------------- | ---- |
|
||
| 员工编号 | char(6) | × | 主键 |
|
||
| 收入 | float(8) | × | |
|
||
| 支出 | float(8) | × | |
|
||
|
||
表2.1:emp (员工表)表数据
|
||
|
||
| 员工编号 | 姓名 | 性别 | 出生日期 | 电话号码 | 部门编号 |
|
||
| -------- | ------ | ---- | ---------- | ----------- | -------- |
|
||
| 201801 | 王林 | 1 | 1988-09-24 | 15578065678 | 1 |
|
||
| 201802 | 张燕 | 0 | 1987-02-26 | 17735468065 | 2 |
|
||
| 202003 | 李丽 | 0 | 1990-05-06 | 15133558809 | 3 |
|
||
| 202004 | 林涛 | 1 | 1991-02-18 | 18255648765 | 4 |
|
||
| 202105 | 王琳琳 | 0 | 1992-05-30 | 15230687685 | 1 |
|
||
| 202106 | 李名誉 | 0 | 1992-06-24 | 17335678745 | 3 |
|
||
| 202107 | 林_樊 | 1 | 1993-06-20 | 13967094563 | 2 |
|
||
| 202108 | 刘明 | 1 | 1993-10-12 | 15587906523 | 4 |
|
||
|
||
表2.2:dept(部门表)表数据
|
||
|
||
| 部门编号 | 部门名 | 备注 |
|
||
| -------- | ------ | ---- |
|
||
| 1 | 财务部 | Null |
|
||
| 2 | 人事部 | Null |
|
||
| 3 | 行政部 | Null |
|
||
| 4 | 科技部 | Null |
|
||
|
||
表2.3:sal (员工薪水表)表数据
|
||
|
||
| 员工编号 | 收入 | 支出 | 员工编号 | 收入 | 支出 |
|
||
| -------- | ---- | ---- | -------- | ---- | ---- |
|
||
| 201801 | 2600 | 600 | 202105 | 2600 | 1000 |
|
||
| 201802 | 3800 | 1000 | 202106 | 3800 | 1000 |
|
||
| 202003 | 2800 | 800 | 202107 | 2800 | 1200 |
|
||
| 202004 | 5000 | 1200 | 202108 | 5000 | 1500 |
|
||
|
||
|
||
|
||
## SQL语句题目如下
|
||
|
||
### 1.创建数据库yggl(1分)
|
||
|
||
```mysql
|
||
create database yggl;
|
||
```
|
||
|
||
### 2.选择数据库yggl(1分)
|
||
|
||
```mysql
|
||
use yggl;
|
||
```
|
||
|
||
### 3.创建以上三个数据表(因为有外键存在,注意建表顺序)(3分)
|
||
|
||
```mysql
|
||
create table dept(
|
||
部门编号 char(3) not null,
|
||
部门名 char(20) not null,
|
||
备注 text(16) null,
|
||
primary key(部门编号)
|
||
);
|
||
|
||
create table emp(
|
||
员工编号 char(6) not null,
|
||
姓名 char(10) not null,
|
||
性别 tinyint(1) not null,
|
||
出生日期 date not null,
|
||
电话号码 char(12) null,
|
||
部门编号 char(3) not null,
|
||
primary key(员工编号),
|
||
foreign key(部门编号) references dept(部门编号)
|
||
);
|
||
|
||
create table sal(
|
||
员工编号 char(6) not null,
|
||
收入 float(8) not null,
|
||
支出 float(8) not null,
|
||
primary key(员工编号)
|
||
);
|
||
```
|
||
|
||
### 4.插入表中所有记录(因为有外键存在,注意添加数据的顺序)(3分)
|
||
|
||
```mysql
|
||
insert into dept (部门编号,部门名,备注)values
|
||
(1,"财务部",Null),
|
||
(2,"人事部",Null),
|
||
(3,"行政部",Null),
|
||
(4,"科技部",Null);
|
||
|
||
insert into emp (员工编号,姓名,性别,出生日期,电话号码,部门编号)values
|
||
(201801,"王林",1,'1988-09-24',15578065678,1),
|
||
(201802,"张燕",0,'1987-02-26',17735468065,2),
|
||
(202003,"李丽",0,'1990-05-06',15133558809,3),
|
||
(202004,"林涛",1,'1991-02-18',18255648765,4),
|
||
(202105,"王琳琳",0,'1992-05-30',15230687685,1),
|
||
(202106,"李名誉",0,'1992-06-24',17335678745,3),
|
||
(202107,"林_樊",1,'1993-06-20',13967094563,2),
|
||
(202108,"刘明",1,'1993-10-12',15587906523,4);
|
||
|
||
insert into sal (员工编号,收入,支出)values
|
||
(201801,2600,600),
|
||
(202105,2600,1000),
|
||
(201802,3800,1000),
|
||
(202106,3800,1000),
|
||
(202003,2800,800),
|
||
(202107,2800,1200),
|
||
(202004,5000,1200),
|
||
(202108,5000,1500);
|
||
```
|
||
|
||
### 5.数据查询
|
||
|
||
(1)查询emp表中所有的记录。(2分)
|
||
|
||
```mysql
|
||
select * from emp;
|
||
```
|
||
(2)查询emp表中的部门编号,要求使用distinct消除重复行。(2分)
|
||
|
||
```mysql
|
||
select distinct 部门编号 from emp;
|
||
```
|
||
|
||
(3)查询emp表中男员工的姓名和出生日期,要求将姓名列显示为name,出生日期列显示为birthday。(2分)
|
||
|
||
```mysql
|
||
select 姓名 as name,出生日期 as birthday from emp where 性别=1;
|
||
```
|
||
|
||
(4)在sal表中查询收入高于3000的员工号码。(2分)
|
||
|
||
```mysql
|
||
select 员工编号 from sal where 收入>3000;
|
||
```
|
||
|
||
(5)查询员工的姓名、收入,3000元以下显示为低收入,3000~4000元显示为中等收入,4000元以上显示为高收入。(3分)
|
||
|
||
```mysql
|
||
select emp.姓名,sal.收入,
|
||
case
|
||
when sal.收入<3000 then "低收入"
|
||
when sal.收入>=3000 and sal.收入<=4000 then "中等收入"
|
||
when sal.收入>4000 then "高收入"
|
||
end as "收入等级"
|
||
from emp,sal where emp.员工编号=sal.员工编号;
|
||
```
|
||
|
||
(6)计算所有员工的总支出以及收入的均值。(2分)
|
||
|
||
```mysql
|
||
select sum(支出),avg(收入) from sal;
|
||
```
|
||
|
||
(7)查找员工编号倒数第三个数字为1的姓名和电话号码。(2分)
|
||
|
||
```mysql
|
||
select 姓名,电话号码 from emp where 员工编号 like '%1__';
|
||
```
|
||
|
||
(8)查找员工的部门编号为2或3的员工的号码。(2分)
|
||
|
||
```mysql
|
||
select 员工编号,姓名,电话号码 from emp where 部门编号 in(2,3);
|
||
```
|
||
|
||
(9)查找姓名中含有特殊符号_的学生的基本情况。(2分)
|
||
|
||
```mysql
|
||
select * from emp where 姓名 like '%\_%';
|
||
需要转义字符
|
||
select * from emp where 姓名 like '%#_%' escape '#';
|
||
```
|
||
|
||
(10)将员工的基本信息按年龄从小到大排序。(2分)
|
||
|
||
```mysql
|
||
select distinct * from emp order by 出生日期 desc;
|
||
```
|
||
|
||
(11)用子查询的方法查找所有收入在4000元以下的员工的基本情况。(3分)
|
||
|
||
```mysql
|
||
select * from emp where 员工编号 in(select 员工编号 from sal where 收入<4000);
|
||
```
|
||
|
||
(12)按部门列出部门名及在该部门工作的员工的人数。(3分)
|
||
|
||
```mysql
|
||
select dept.部门名,count(emp.部门编号) from dept,emp where dept.部门编号=emp.部门编号 group by emp.部门编号;
|
||
```
|
||
|
||
(13)查找在科技部的员工的姓名以及收入支出情况。(3分)
|
||
|
||
```mysql
|
||
select emp.姓名,sal.收入,sal.支出 from emp join sal on emp.员工编号=sal.员工编号 where emp.部门编号=(select 部门编号 from dept where 部门名="科技部");
|
||
|
||
select emp.姓名,sal.收入,sal.支出 from emp,sal where emp.员工编号=sal.员工编号 and emp.部门编号=(select 部门编号 from dept where 部门名="科技部");
|
||
```
|
||
|
||
### 6.更新数据
|
||
|
||
(1)在emp表中将姓名中含有 _ 的学生姓名,去掉 _ 。(2分)
|
||
|
||
```mysql
|
||
update emp set 姓名="林樊" where 姓名="林_樊";
|
||
```
|
||
|
||
(2)向dept表中添加记录(5,’销售部’,’负责推销产品’)。(2分)
|
||
|
||
```mysql
|
||
insert into dept (部门编号,部门名,备注) values(5,'销售部','负责推销产品');
|
||
```
|
||
|
||
(3)删除sal表中员工编号 =’202004’的记录。(1分)
|
||
|
||
```mysql
|
||
delete from sal where 员工编号=202004;
|
||
```
|
||
|
||
### 7.创建存储过程、调用存储过程
|
||
|
||
(1)创建查看emp表中全部信息的存储过程。(2分)
|
||
|
||
```mysql
|
||
delimiter //
|
||
create procedure proc_emp ()
|
||
begin
|
||
select * from emp;
|
||
end //
|
||
```
|
||
|
||
(2)调用该存储过程。(1分)
|
||
|
||
```mysql
|
||
call proc_emp;//
|
||
```
|
||
|
||
### 8.创建视图
|
||
|
||
(1)在emp表上创建视图view_emp,该视图只查看emp表中出生日期在1990年之前的员工的记录。(2分)
|
||
|
||
```mysql
|
||
create view view_emp as select * from emp where 出生日期<'1990-01-01';
|
||
```
|
||
|
||
(2)查看视图view_emp的创建语句。(1分)
|
||
|
||
```mysql
|
||
show create view view_emp;
|
||
```
|
||
|
||
(3)删除视图view_emp。(1分)
|
||
|
||
```mysql
|
||
drop view if exists view_emp;
|
||
```
|
||
|