# 一、填空题 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; ```