一、编程题1
(1)创建一个企业员工管理的数据库,数据库名称为“userdb”。要求判断建库库时是否已存在。数据库字符集要求设置为支持中文字符的字符集“gbk”,字符集校验规则设置为gbi_chinese_ci。
create database if not exists userdb
character set gbk
collate gbk_chinses_ci;
(2)建立数据表
create table Departments(
DepartmentID int primary key aut0_increment comment '部门编号',
DepartmentName varchar(50) unique not null comment '系部名称',
Note text comment '部门介绍'
);
create table Employees(
EmployeeID int primary key auto_increment comment '雇员编号',
DepartID int comment '部门编号',
Name varchar(20) not null comment '姓名',
Age int comment not null '年龄',
Sex char default '男' not null comment '性别',
Edate date comment '入职日期'
);
create table Salary(
EmployeeID int primary key comment '雇员编号',
Income float comment '收入',
Outcome float comment '各项扣款'
);
(3)为雇员表创建外键fk_dm参照完整性约束,被参照的父表是部门表。定义参照约束操作策略为:删除操作置空值,更新操作级联。
alter table Employees add constraint fk_dm foreign key (DepartID)
references Departments(DepartmentID)
on delete set null
on update cascade;
(4)为雇员薪水表增加一列实际薪资RealIncome,类型为整型,可以为空。(增加字段)
alter table Employees add RealIncome int comment '实际薪资';
(5)向部门表Departments 中插入记录。
insert into Departments values
(1,'销售部',null),
(2,'采购部',null),
(3,'生产部',null);
(6)查询各部门员工的总收入,列出部门名和总收入。(连接)
select d.DepartmentName,sum(s.Income-s.Outcome) as totalsum
from Departments d
join Employees e on e.DpeartID=d.DepartmentID
join salary s on s.EmployeeID=e.EmployeeID
group by d.DepartmentName;
内连接(INNER JOIN 或 JOIN)是基于两个表中的共有记录进行匹配,只返回两个表中都有匹配记录的行。具体来说,内连接会将符合条件的两个表中的记录逐一匹配,只输出那些连接条件相符的行。
外连接(JOIN)则会将表之间的差异输出,不管记录是否匹配。在外连接中,被连接的表不仅会返回符合条件的记录,还会返回没有符合条件的数据,用 NULL 值填充。外连接分为左外连接、右外连接和全外连接三种。
左外连接(LEFT JOIN ):以左边的表为基础,返回两个表中都有匹配记录的行,以及左边表中剩余的所有记录。
右外连接(RIGHT JOIN ):与左外连接类似,以右边的表为基础,返回两个表中都有匹配记录的行,以及右边表中剩余的所有记录。
全外连接(FULL JOIN ):返回两个表中都有匹配记录的行,以及两边表中所有剩余的记录。
内连接所返回的结果集只包含两个表中都有匹配记录的行,而外连接则会将两个表中所有的记录都纳入考虑范围。
二、编程题
(1)为了对超市中的各类商品进行有效管理,创建一个名为spgl的数据库。
create database spgl;
(2)为各类商品在spgl数据库中创建goods表,为客户创建custom表,为购买记录创建order表。
create table goods(
商品编号 varchar(8) primary key,
商品名称 varchar(20) not null,
商品单价 int,
商品数量 int
);
create table custom(
客户编号 varchar(8) primary key,
客户姓名 varchar(30) not null,
通讯地址 varchar(50),
联系电话 varchar(15),
客户等级 int
);
create table order(
商品编号 varchar(8) primary key,
客户编号 varchar(8) not null,
购买时间 timestamp not null,
购买数量 int not null
);
DATE:日期类型,格式为 YYYY-MM-DD。
TIME:时间类型,格式为 HH:MM:SS。
DATETIME:日期时间类型,格式为 YYYY-MM-DD HH:MM:SS。
YEAR:年份类型,格式为 YYYY。
TIMESTAMP:时间戳类型,格式为 YYYY-MM-DD HH:MM:SS。
(3)为购买记录表order的“商品编号”列创建外键,使得购买记录表order作为子表,参照父表商品表goods的“商品编号”列,并都在更新、删除数据时设置restrict(拒绝)操作策略。
alter table order add constraint fk_order foreign key(商品编号) reference goods(商品编号)
on update restrict
on delete restrict;
(4)修改商品表goods 中,将数量低于3本的商品,数量在原有基础上增加5本。
update goods set 商品数量=商品数量+5 where 商品数量<3;
(5)查询每个客户购买商品的客户编号和购买数量,结果按照购买数量升序排列。
select 客户编号,sum(购买数量) as total from
group by 客户编号
order by total asc;
(6)查询购买了商品名称带有“洗发水”的所有客户编号。
select 客户编号 from custom
join goods on goods.商品编号=order.商品编号
join order on oder.客户编号=custom.客户编号
where 商品名称 like '%洗发水%';
三、知识点
1.数据定义语言中的创建,修改,删除这三个英语单词,分别为:create、 alter、 drop
2.数据操作语言中的插入,修改,删除这三个英语单词,分别是:insert、update、delete
3.数据冗余可能会引起的问题有数据更新异常,还有一个空的话可以写读取异常。
4.mysql编程过程中可以作为注释的符号为
5.主键冲突的解决两种方式为插入数据
和更新数据理解解决主键冲突。
6.!=和◇都代表不等于,=和<=→>都代表等于。
7.NULL表示值不确定,该表述正确吗?
NULL 表示值未知或不确定,而不是值不确定。这是因为 NULL 表示缺少某个值,或者该值尚未被确定或指定。与其他数据库中所使用的 “空值” 或 “无效值” 不同,MySQL 中的 NULL 没有实际的值或内容,它只表示缺少某个值。
8.使用ORDER BY按照指定字段进行排序时,如果字段的值中包含NULL,NULL会被当做最小值进行排序。
9.第一范式、第二范式、第三范式、BC范式的区别。
第一范式(1NF):确保每个数据库表中的每个字段都是不可分割的基本数据项,即所有字段的属性都是原子性的。如果一个字段包含多个值或者一个记录包含多个实例,则不符合第一范式。
第二范式(2NF):确保数据库表中的每个非主键字段都完全依赖于表中的主键而不是部分依赖,即表中不存在冗余数据。如果一个表中存在多个主键,可以将其拆分为多个表并使用外键关联。
第三范式(3NF):确保数据库表中的每个非主键字段都不传递依赖于其他非主键字段。也就是说,每个字段只应该与主键直接相关,而不是间接相关。如果一个字段依赖于另一个非主键字段,则需要将其拆分成新的表格。
BC 范式(BCNF):确保每个非主键字段都具有完整依赖性,并消除非主键字段之间的多值依赖性。如果一个属性只依赖于非主键字段的一部分,则需要将其拆分成新的表格。
10.数据库设计的基本流程:
1.需求分析:该阶段是确定数据库系统所需的所有功能和操作,并采集相关数据作为进一步设计的基础。
2.概念设计:该阶段是制定数据库的初步设计,包括设计实体、属性和关系,并绘制出ER图。
3.逻辑设计:该阶段是将概念设计转换为一个高度抽象而无依赖于特定数据库管理系统的逻辑模型,例如转换为关系模型或ER模型。
4.物理设计:该阶段是将逻辑设计转换为实际的物理数据库模式,包括表、字段、索引、关系,以及实现数据库的安全性、完整性和性能的方法。
5.实施:该阶段是实现物理设计所确定的数据库,并将其部署到目标系统中,并将其与实际应用程序或用户连接起来,接受数据的输入和输出。
6.维护:该阶段是管理和维护数据库系统,包括备份和恢复、数据修改、性能调整、安全性、完整性和其他相关问题。
11.在数据库概念设计阶段,最常使用的数据模型是ER模型,即实体联系模型。
分析需求、绘制 E-R 图、定义数据模型、设计表结构、优化表结构、编写 SQL 脚本、进行测试
12.SQL语言又称结构化查询语言。
数据定义语言(Data Definition Language,DDL):用于创建、修改和删除数据库中的对象,如表格、视图和索引等。
数据操作语言(Data Manipulation Language,DML):用于插入、更新、删除和检索数据,如 SELECT、INSERT、UPDATE 和 DELETE 等语句。
数据控制语言(Data Control Language,DCL):用于授权和撤销数据库用户的访问权限,如 GRANT 和 REVOKE 等语句。
事务控制语言(Transaction Control Language,TCL):用于控制数据库事务,如 COMMIT、ROLLBACK 和 SAVEPOINT 等语句。
13.从GROUP BY分组的结果集中再次用条件表达式进行筛选的子句是having.
HAVING子句在WHERE子句执行之后,GROUP BY子句执行之前。
14.使用SHOW CREATE VIEW命令可以查看视图创建语句。
具体语法:
SHOW CREATE VIEW view_name;
#view_name是要查看创建语句的视图名
15.在MySQL中,备份数据库的命令是mysqldump。
backup
一般指备份整个数据库或者部分数据,包括表结构和表中的数据等。备份文件通常是可恢复的SQL文件,可以用于备份和恢复数据。
copy
在MySQL中一般指将某张表的数据复制到另一张表中。这种操作通常用于数据迁移、备份等场景。
16.触发器是由特定的表事件触发而自动执行的MySQL语句,以下语不能使触发器激活触发的语句是SELECT语句:SELECT语句只是用于查询数据,不会触发任何特定的表事件。
触发器可以在以下事件发生时自动执行:
INSERT:在向表中插入新行之前或之后执行SQL语句。
UPDATE:在更新表中的行之前或之后执行SQL语句。
DELETE:在删除表中的行之前或之后执行SQL语句。
REPLACE:在替换表中的重复行之前或之后执行SQL语句。
17.事务的相关知识点。
事务通常被定义为一系列指令,这些指令作为一个单元被执行,要么全部执行,要么全部不执行。在MySQL中,通过使用START TRANSACTION、COMMIT和ROLLBACK等语句,可以实现事务的管理,保证数据的完整性和一致性。
以下是对事务的几种描述,其中不正确的为:
事务是一组原子性、一致性、隔离性和持久性的操作,即ACID特性,可以保证数据的安全。
事务可以将一组操作作为一个单位处理,要么全部成功,要么全部失败。
事务可以保证数据的一致性,即在事务结束时,数据应该满足一定的约束条件,如唯一性约束、外键约束等。
事务不会影响其他正在进行的事务,即事务之间具有隔离性。
不正确的描述为第四种,事务的隔离性是指数据库系统可以针对并发操作,将多个事务彼此隔离,保证它们之间不会相互影响。因此,正确的描述应该是“事务可以保证数据的一致性,即在事务结束时,数据应该满足一定的约束条件,如唯一性约束、外键约束等,并且事务之间具有隔离性,可以保证并发操作的正确性。”
18.DB、DBMS、DBS之间的关系。
DB(Database,数据库)是指有组织地、可持久地存储在计算机内的数据集合,可以用来描述实体和它们之间的关系。
DBMS(Database Management System,数据库管理系统)是指一组管理DB的软件程序,包括数据定义、数据查询、数据修改和数据管理等功能。
DBS(Database System,数据库系统)是一个更为广泛的概念,除了DB和DBMS外,还包括与DBMS相关的操作系统、软件开发工具和网络通信等技术。
因此,它们之间的关系应该是DB是DBMS管理的数据集合,而DBMS是DBS中的一个组成部分。
19.在数据库设计中,用E-R图来描述信息结构但不涉及信息在计算机中的表示,它是数据库设计的逻辑设计阶段。
20.多表的查询方式有
交叉连接(CROSS JOIN):也称为笛卡尔积,是指将一张表的每一行都与另一张表的每一行进行组合,返回的结果为一个新的临时表。
内连接(INNER JOIN):也称为等值连接,是指将两张表中符合特定条件的行进行匹配,返回匹配成功的行组成的新表。
左连接(LEFT JOIN / LEFT OUTER JOIN):是指将左边的表的所有行与右边的表中符合条件的行进行匹配,即使右边的表中没有匹配的行,也会返回左边表中的行。
右连接(RIGHT JOIN / RIGHT OUTER JOIN):是指将右边的表的所有行与左边的表中符合条件的行进行匹配,即使左边的表中没有匹配的行,也会返回右边表中的行。
全连接(FULL JOIN / FULL OUTER JOIN):是指将左右两张表中所有符合条件的行进行匹配,不论某一方是否存在匹配的行,均返回结果。
子查询(Subquery):也称为内部查询,是指在一个查询语句中嵌套另一个查询语句,将内部查询的结果作为外部查询的条件进行查询。
UNION:是指将两张或多张表的查询结果进行合并,并且会进行去重,返回合并后的结果集合。
EXISTS:是一种特殊的子查询方式,用于判断一个子查询是否返回任何结果。
21.外键约束、默认值约束不能保证数据库表中记录的唯一性。
22.使用SELECT查看表达式“NOT 2+!3”的执行结果是 False
解释:首先进行 NOT 操作,NOT 2 的结果为 0,然后对其进行加法运算,再对 !3 进行逻辑非运算,由于 !3 的运算结果为 False,取反后结果为 True,因此最终的执行结果为 1(0 + 1 = 1)。
23.在INSERT语句中添加ON DUPLICATE KEY UPDATE可在主键冲突时,利用更新的方式完成数据的插入。
24.笛卡尔积查询在不设置连接条件时与交叉连接等价。
25.数据库完整性包括实体完整性和数据类型完整性、参照完整性、用户定义完整性、约束完整性。
26.事务的执行要么成功,要么就返回到事务开始前的状态。
原因:它是逻辑上的相关操作,要么全部执行成功,要么全部回滚到事务开始前的状态。当在一个事务中执行多条sql语句时,只要其中有任何一条语句执行失败,事务就会回滚到事务开始之前的状态,若成功则会提交,写入到数据库中。
27.当一个表中存在主键或唯一索引时,使用REPLAC语句插入数据时,会先把冲突的旧数据删除,然后插入新数据。
原因: replace可以插入一条新记录或更新已有记录,且保证表中的主键和唯一索引列不重复,若插入的数据与表中已有的记录重复,则使用replace语句会先删除旧记录然后再插入新记录。
28.使用TRUNCATE命令清空表数据比使用DELETE命令执行速度要慢。
原因: truncate命令是一次性删除表中的所有记录,并重置自增长ID,不会逐条扫描每一行记录,所以更快。Delete会逐条扫描每一行记录,判断是否符合where条件,