实验一 创建数据库
一.实验目的
1.学会数据表的创建;
2.加深对表间关系的理解;
3.理解数据库中数据的简单查询方法和应用。
二. 实验内容
- 创建一个数据库,数据库名称命名为自己的学号。
(1)实验过程:
使用SQL语句:CREATE DATABASE `111111111111`
使用可视化工具:新建数据库—输入数据库名字、字符集和排序规则
(2)实验结果:
SQL语句方式:
可视化工具方式:
(3)结果分析:
MySQL创建纯数字数据库的时候要用反引号``(英文输入状态下双击两下ESC下方的键)包裹数字才可以创建成功,不然的话单纯用数字创建数据库会出现“You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '61' at line 1”错误,必须带上反引号,可以正确新建数据库。
2.在已建立的数据库中使用SQL语句和可视化环境分别建立应用中的四个表,包括属性名、数据类型,正确创建表的主键、外键。
(1)实验过程:
输入SQL语句:
-- S表
CREATE TABLE S (
SNO CHAR (2) PRIMARY KEY,
SNAME CHAR (3),
STATUS CHAR (2),
CITY CHAR (2)
);
-- P表
CREATE TABLE P (
PNO CHAR (2) PRIMARY KEY,
PNAME CHAR (3),
COLOR CHAR (1),
WEIGHT SMALLINT
);
-- J表
CREATE TABLE J (
JNO CHAR (7)PRIMARY KEY,
JNAME CHAR (8),
CITY CHAR (2)
);
-- SPJ表
CREATE TABLE SPJ (
SNO CHAR (2),
PNO CHAR (2),
JNO CHAR (7),
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)
);
可视化环境:新建表--输入相应的字段名、数据类型以及完整性限制等保存即可
(2)实验结果:
SQL语句方式:
可视化环境:
(3)结果分析:
SQL语句和可视化环境都可以正确创建这四个表,正确创建表的主键、外键。
当给一个表设置外键的时候只能设置一个,不可以设置多个,如果想设置多个的话就得用表级约束条件将多个字段放到括号内,如果是主键只涉及到一个字段的话可以用表级约束条件和列级约束条件。设置外键约束的时候要注意引用的字段和被引用的字段。
3.往零件表J中增加适当规模的记录(至少1000条,上万条最好,项目名可以用“项目+序号”简单命名,每个项目名唯一);然后基于项目名属性列建唯一索引,并编写查询语句验证所建索引是否有效。(提示:查询语句中的条件要用到项目名属性;在建索引前先执行该语句,建索引后再执行,然后比较两次执行的时间)。
(1)实验过程:
用存储过程插入10万条数据的SQL语句:
---5个城市的循环输入
DROP PROCEDURE IF EXISTS proc_insert_J;
DELIMITER $$
CREATE PROCEDURE proc_insert_J (IN args INT)
BEGIN
DECLARE i INT DEFAULT 0 ; DECLARE
flag INT DEFAULT 0 ; DECLARE
city CHAR (2) ; START TRANSACTION ;
REPEAT
SET i = i + 1 ; CASE flag
WHEN 0 THEN
SET city = '北京' ;
WHEN 1 THEN
SET city = '长春' ;
WHEN 2 THEN
SET city = '天津' ;
WHEN 3 THEN
SET city = '唐山' ;
ELSE
SET city = '南京' ;
END CASE ;
SET flag = (flag + 1) % 5 ; INSERT INTO J ()
VALUES
(
concat('J', i),
CONCAT('项目', i),
city
) ; UNTIL i >= args
END
REPEAT
; COMMIT ;
END$$
DELIMITER ;
CALL proc_insert_J (100000) ;
用下面的语句测试执行过程:
-- 查询J表所有数据
SELECT * FROM J;
-- 查询项目96666
SELECT JNAME FROM J WHERE JNAME='项目96666';
-- 添加索引再进行测试查询时间
ALTER TABLE J ADD UNIQUE INDEX MYJNAME (JNAME);
-- 查询J表所有数据
SELECT * FROM J;
-- 查询项目96666
SELECT JNAME FROM J WHERE JNAME='项目96666';
(2)实验结果:
插入100000条数据:
没有添加索引的:
添加索引的:
(3)结果分析:
存储过程插入10万条数据的时候提示数据过长,后来才发现原来字段的长度小于数据的长度,所以对J表的字段长度进行了扩充,目前J表的长度足够插入10万条数据。循环插入多个城市如何实现,由于不懂语法就用Java中if分支结构思想实现了MySQL存储过程中的分支,后来老师提示用case when语句使得代码更加美观和易操作,我还在考虑有没有类似数据这样的实现方式等。
索引执行速度的分析,可以发现查询JNAME='项目96666'添加索引前后的执行速度有明显的差别,对于查询所有的数据可以发现添加索引和未添加索执行的速度没有很大的差别,查询资料可知,查询所有的数据的时候索引是失效的通过‘’EXPLAIN SELECT * FROM J;‘’语句可以发现查询出来的type字段的值为ALL说明查询走的是全局查询而不是走索引查询,对于‘’EXPLAIN SELECT JNAME FROM J WHERE JNAME='项目96666';‘’语句可以发现type=const说明查询走的是索引,其实还有好多查询索引出现失效的情况比如说模糊查询等。
3.将数据库转储到D盘根目录下,命名为自己的学号。点击右键选择“转储SQL文件”,选择“结构和数据”。
(1)实验过程:
在Navicat环境下选中某个表,右键“转储SQL文件”--->点击“结构和数据”--->选中位置,点击“保存”即可。
(2)实验结果:
(3)结果分析:
注意选择导出结构和数据如果选择了仅导出结构的话是没有数据的,导出之后用记事本打开可以看见对应的SQL语句以及相应的数据。
4.完成数据库的备份和还原。首先为建好的数据库新建备份,然后在将备份拷走,和同学合作在另一台电脑上还原备份,还原后查看原有数据库中的信息是否存在。
(1)实验过程:
备份的过程:
打开“111111111111”数据库--->“右键”选中备份--->点击“新建备份”--->点击备份,可以看见备份下多了一个备份文件并重命名为“实验一数据库备份”,此时可以复制到别的电脑或者别的账户下进行备份还原。
备份还原的过程:
在别的账户上,先创建一个数据库“实验一”没有任何数据,此时拷贝过来进行备份的还原,还原后可以查看到相同的数据。
(2)实验结果:
新建备份:
还原备份:
还原过程:
还原后可以看到这几个表:
打开表可以正常看到数据:
(3)结果分析:
可以正常完成备份和还原
三.实验总结
问题一:用SQL语句创建以数字命名的数据库的时候,会报错误:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '61' at line 1。
这时,需要将数据库名加上反引号``,即`111111111111`,就不会报错了。反引号输入方式:英文输入状态下双击ESC下方的键。
问题二:用可视化环境创建数据表是非常方便的,还可以通过SQL预览选项自动生成SQL语句,在学习过程中,还是建议自己动手进行SQL语句的编程以提高数据库设计能力。
问题三:1000条数据插入的问题。老师提供的SQL语句。
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);
问题四:添加索引的问题。感觉到当查询所有数据的时候,好像索引的作用并不明显。单纯查询某一条数据时,索引能明显缩短时间。