Note/数据库导论/试题/模拟试卷1.md

11 KiB
Raw Blame History

一、填空题

  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.1emp(员工表)表结构

字段名 类型(长度) 是否允许为空值 描述
员工编号 char(6) × 主键
姓名 char(10) ×
性别 tinyint(1) ×
出生日期 date(系统默认) ×
电话号码 char(12)
部门编号 char(3) × 外键

表1.2dept部门表表结构

字段名 类型(长度) 是否允许为空值 描述
部门编号 char(3) × 主键
部门名 char(20) ×
备注 text(16)

表1.3sal (员工薪水表)表结构

字段名 类型(长度) 是否允许为空值 描述
员工编号 char(6) × 主键
收入 float(8) ×
支出 float(8) ×

表2.1emp (员工表)表数据

员工编号 姓名 性别 出生日期 电话号码 部门编号
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.2dept部门表表数据

部门编号 部门名 备注
1 财务部 Null
2 人事部 Null
3 行政部 Null
4 科技部 Null

表2.3sal (员工薪水表)表数据

员工编号 收入 支出 员工编号 收入 支出
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.创建数据库yggl1分

create database yggl;

2.选择数据库yggl1分

use yggl;

3.创建以上三个数据表因为有外键存在注意建表顺序3分

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分

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分

select * from emp;

2查询emp表中的部门编号要求使用distinct消除重复行。2分

select distinct 部门编号 from emp;

3查询emp表中男员工的姓名和出生日期要求将姓名列显示为name出生日期列显示为birthday。2分

select 姓名 as name,出生日期 as birthday from emp where 性别=1;

4在sal表中查询收入高于3000的员工号码。2分

select 员工编号 from sal where 收入>3000;

5查询员工的姓名、收入3000元以下显示为低收入3000~4000元显示为中等收入4000元以上显示为高收入。3分

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分

select sum(支出),avg(收入) from sal;

7查找员工编号倒数第三个数字为1的姓名和电话号码。2分

select 姓名,电话号码 from emp where 员工编号 like '%1__';

8查找员工的部门编号为2或3的员工的号码。2分

select 员工编号,姓名,电话号码 from emp where 部门编号 in(2,3);

9查找姓名中含有特殊符号_的学生的基本情况。2分

select * from emp where 姓名 like '%\_%';
需要转义字符
select * from emp where 姓名 like '%#_%' escape '#';

10将员工的基本信息按年龄从小到大排序。2分

select distinct * from emp order by 出生日期 desc;

11用子查询的方法查找所有收入在4000元以下的员工的基本情况。3分

select * from emp where 员工编号 in(select 员工编号 from sal where 收入<4000);

12按部门列出部门名及在该部门工作的员工的人数。3分

select dept.部门名,count(emp.部门编号) from dept,emp where dept.部门编号=emp.部门编号 group by emp.部门编号;

13查找在科技部的员工的姓名以及收入支出情况。3分

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分

update emp set 姓名="林樊" where 姓名="林_樊";

2向dept表中添加记录5,’销售部’,负责推销产品2分

insert into dept (部门编号,部门名,备注) values(5,'销售部','负责推销产品');

3删除sal表中员工编号 =202004的记录。1分

delete from sal where 员工编号=202004;

7.创建存储过程、调用存储过程

1创建查看emp表中全部信息的存储过程。2分

delimiter //
create procedure proc_emp ()
begin
select * from emp;
end //

2调用该存储过程。1分

call proc_emp;//

8.创建视图

1在emp表上创建视图view_emp该视图只查看emp表中出生日期在1990年之前的员工的记录。2分

create view view_emp as select * from emp where 出生日期<'1990-01-01';

2查看视图view_emp的创建语句。1分

show create view view_emp;

3删除视图view_emp。1分

drop view if exists view_emp;