一.实验目的
1.学会数据表的创建;
2.加深对表间关系的理解;
3.理解数据库中数据的简单查询方法和应用。
二. 实验内容
1.题目要求
给定一个实际问题,实际应用问题的模式设计中至少要包括3个基本表。应用问题是供应商给工程供应零件(课本P70)。
(1)创建一个数据库,数据库名称命名为自己的学号。
(2)在已建立的数据库中使用SQL语句和可视化环境分别建立应用中的四个表,包括属性名、数据类型,正确创建表的主键、外键。
(3)向工程表J中增加适当规模的记录(至少1000条,上万条最好,项目名可以用“项目+序号”简单命名,每个项目名唯一);然后基于项目名属性列建唯一索引,并编写查询语句验证所建索引是否有效。(提示:查询语句中的条件要用到项目名属性;在建索引前先执行该语句,建索引后再执行,然后比较两次执行的时间)。
(4)将数据库转储到D盘根目录下,命名为自己的学号。点击右键选择“转储SQL文件”,选择“结构和数据”。
(5)完成数据库的备份和还原。首先为建好的数据库新建备份,然后在将备份拷走,和同学合作在另一台电脑上还原备份,还原后查看原有数据库中的信息是否存在。
2.实验结果
代码:
SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));
CREATE TABLE P
(
PNO char(20) PRIMARY KEY,
PNAME char(20),
COLOR char(20),
WEIGHT int
);
CREATE TABLE J
(
JNO char(20) PRIMARY KEY,
JNAME char(20),
CITY char(20)
);
CREATE TABLE S
(
SNO char(20) PRIMARY KEY,
SNAME char(20) UNIQUE,
SSTATUS char(20),
CITY char(20)
);
CREATE TABLE SPJ
(
SNO char(20),
PNO char(20),
JNO char(20),
QTY int,
PRIMARY KEY(SNO,PNO,JNO),
FOREIGN KEY(SNO)REFERENCES S(SNO),
FOREIGN KEY(PNO)REFERENCES P(PNO),
FOREIGN KEY(JNO)REFERENCES J(JNO)
);
DELIMITER $$
CREATE PROCEDURE proc_insert_J(in args int)
BEGIN
DECLARE i INT DEFAULT 0;
-- 开启事务,不开的话100w条按天算
start transaction;
REPEAT
set i=i+1;
insert into J values(concat('J',i),CONCAT('项目',i),'济南');
UNTIL i >= args END REPEAT;
commit;
END
$$
DELIMITER ;
call proc_insert_J(100000);
CREATE UNIQUE INDEX J_JNAME ON J(JNAME);
SELECT * FROM J WHERE JNAME='项目99999' ;
实验截图
由上图可见建立索引前的查找时间为0.023s。
由上图可见建立索引后查询时间有所缩短,查询时间为0.007s。
转储SQL文件。
备份还原后查看原有数据库中的信息仍然存在。
注意:在建表的过程中会出现[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'information_schema.PROFILING.SEQ' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by的错误,使用SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));语句消除。