SQL编程——MySQL数据库基本操作
2016-07-27 14:33
543 查看
实验平台:mysql5.7,
案例:学生-课程-成绩
实际的数据库设计可能和课本中有出入
E-R如下:
代码如下:
一、表设计
二、增删改和存储过程
上面在做数据插入时创建了存储过程,目的是为了实现批量数据插入,并在插入时用到了随机函数
案例:学生-课程-成绩
实际的数据库设计可能和课本中有出入
E-R如下:
代码如下:
一、表设计
#1. 数据库创建 DROP DATABASE IF EXISTS scoredb; CREATE DATABASE scoredb; #2. 创建表 #1) 创建新表 USE scoredb; CREATE TABLE student ( student_id SMALLINT UNSIGNED NOT NULL, student_name VARCHAR(50) NOT NULL, student_sex TINYINT(1) NOT NULL DEFAULT 0, student_phone VARCHAR(50) DEFAULT NULL, student_addr_id SMALLINT UNSIGNED NOT NULL, PRIMARY KEY (student_id) ) ENGINE=INNODB DEFAULT CHARSET=utf8; #2) 根据已有的表创建新表 USE scoredb; -1. CREATE TABLE student like student_info; -2. CREATE TABLE student AS SELECT student_info.student_id, student_info.student_name, student_info.student_sex, student_info.student_phone, student_info.student_addr_id FROM student_info; #3. 删除表 USE scoredb; DROP TABLE student_info; #4 修改表 USE scoredb; ALTER TABLE student ADD COLUMN depart_id SMALLINT UNSIGNED NOT NULL; ALTER TABLE student ADD PRIMARY KEY(student_id); ALTER TABLE student DROP PRIMARY KEY(student_id); #5 创建其他相关表 USE scoredb; CREATE TABLE address ( addr_id SMALLINT UNSIGNED NOT NULL, addr_info VARCHAR(100) NOT NULL, PRIMARY KEY(addr_id) ) ENGINE=INNODB,CHARSET=utf8; create TABLE department ( depart_id SMALLINT UNSIGNED NOT NULL, depart_name VARCHAR(100) NOT NULL, PRIMARY key(depart_id) ) ENGINE=INNODB,CHARSET=utf8; create TABLE course ( course_id SMALLINT UNSIGNED NOT NULL, course_name VARCHAR(100) NOT NULL, teacher_id SMALLINT UNSIGNED NOT NULL, PRIMARY key(course_id) ) ENGINE=INNODB,CHARSET=utf8; create TABLE teacher ( teacher_id SMALLINT UNSIGNED NOT NULL, teacher_name VARCHAR(50) NOT NULL, PRIMARY key(teacher_id) ) ENGINE=INNODB,CHARSET=utf8; create TABLE score ( score_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, student_id SMALLINT UNSIGNED NOT NULL, course_id SMALLINT UNSIGNED NOT NULL, teacher_id SMALLINT UNSIGNED not NULL, score_value SMALLINT UNSIGNED NOT NULL, PRIMARY key(score_id) ) ENGINE=INNODB,CHARSET=utf8; # score中不需要再加teacher_id字段,如遇想找到score某条记录对应的老师,可以通过couse_id找到,所以删除teacher_id这一列 USE scoredb; ALTER TABLE score DROP COLUMN score.teacher_id; #6 添加外键约束 USE scoredb; ALTER TABLE student add CONSTRAINT fk_stu_add_constraint FOREIGN key(student_addr_id) REFERENCES address(addr_id); ALTER TABLE student add CONSTRAINT fk_stu_depart_constraint FOREIGN key(depart_id) REFERENCES department(depart_id); ALTER TABLE course add CONSTRAINT fk_course_teacher_constraint FOREIGN key(teacher_id) REFERENCES teacher(teacher_id); ALTER TABLE score add CONSTRAINT fk_score_stu_constraint FOREIGN key(student_id) REFERENCES student(student_id); ALTER TABLE score add CONSTRAINT fk_score_course_constraint FOREIGN key(course_id) REFERENCES course(course_id);
二、增删改和存储过程
#7. 插入数据 1) 给address表插入数据 DROP PROCEDURE IF EXISTS inset_data2address; CREATE PROCEDURE inset_data2address(IN max_times INT) BEGIN DECLARE var INT DEFAULT 0; WHILE var < max_times DO set var = var + 1; INSERT INTO address VALUES(var, CONCAT('HangZhou, ',var, '#, China')); END WHILE; END call inset_data2address(100); DROP PROCEDURE IF EXISTS inset_data2address; 2) 给department表插入数据 DROP PROCEDURE IF EXISTS inset_data2depart; CREATE PROCEDURE inset_data2depart(IN max_times INT) BEGIN DECLARE var INT DEFAULT 0; WHILE var < max_times DO set var = var + 1; INSERT INTO department VALUES(var, CONCAT('Department, #',var)); END WHILE; END call inset_data2depart(100); DROP PROCEDURE IF EXISTS inset_data2depart; 3) 给teacher表插入数据 DROP PROCEDURE IF EXISTS inset_data2teacher; CREATE PROCEDURE inset_data2teacher(IN max_times INT) BEGIN DECLARE var INT DEFAULT 0; WHILE var < max_times DO set var = var + 1; INSERT INTO teacher VALUES(var, CONCAT('Teacher #',var)); END WHILE; END call inset_data2teacher(100); DROP PROCEDURE IF EXISTS inset_data2course; 4) 给course表插入数据 DROP PROCEDURE IF EXISTS inset_data2course; CREATE PROCEDURE inset_data2course(IN max_times INT) BEGIN DECLARE var INT DEFAULT 0; WHILE var < max_times DO set var = var + 1; INSERT INTO course VALUES(var, CONCAT('Course #',var), FLOOR(1 + RAND() * 100)); END WHILE; END #FLOOR(1 + RAND() * 100) 返回1到100范围的随机数 call inset_data2course(100); DROP PROCEDURE IF EXISTS inset_data2course; 5) 给student表插入数据 DROP PROCEDURE IF EXISTS inset_data2student; CREATE PROCEDURE inset_data2student(IN max_times INT) BEGIN DECLARE var INT DEFAULT 0; DECLARE chars_str varchar(100) DEFAULT '0123456789'; DECLARE i INT DEFAULT 0; DECLARE return_str varchar(4) DEFAULT ''; WHILE var < max_times DO set var = var + 1; #产生4位随机字符串 WHILE i < 4 DO SET return_str = concat(return_str,substring(chars_str , FLOOR(1 + RAND()*10 ),1)); SET i = i + 1; END WHILE; INSERT INTO student VALUES(var, CONCAT('Student #',var), FLOOR(0 + RAND() * 1), CONCAT('1551235', return_str), FLOOR(1 + RAND() * 100), FLOOR(1 + RAND() * 100)); SET i = 0; set return_str = ''; END WHILE; END #FLOOR(1 + RAND() * 100) 返回1到100范围的随机数 call inset_data2student(100); DROP PROCEDURE IF EXISTS inset_data2student; 6) 给score表插入数据 DROP PROCEDURE IF EXISTS inset_data2score; CREATE PROCEDURE inset_data2score(IN max_times INT) BEGIN DECLARE var INT DEFAULT 0; WHILE var < max_times DO set var = var + 1; INSERT INTO score(student_id, course_id, score_value) VALUES(FLOOR(1 + RAND() * 100), FLOOR(1 + RAND() * 100), FLOOR(1 + RAND() * 150)); END WHILE; END #FLOOR(1 + RAND() * 100) 返回1到100范围的随机数 call inset_data2score(1000); DROP PROCEDURE IF EXISTS inset_data2score; #8 由于插入的student数据较少或其他原因导致student_sex字段值基本都为0,批量调整部分不合理的数据,设其为1 DROP PROCEDURE IF EXISTS update_data2student; CREATE PROCEDURE update_data2student(IN max_times INT) BEGIN DECLARE var INT DEFAULT 0; WHILE var < max_times DO set var = var + 1; UPDATE student SET student_sex = 1 WHERE student_id=FLOOR(1 + RAND() * 100); END WHILE; END #FLOOR(1 + RAND() * 100) 返回1到100范围的随机数 call update_data2student(100); DROP PROCEDURE IF EXISTS update_data2student;
上面在做数据插入时创建了存储过程,目的是为了实现批量数据插入,并在插入时用到了随机函数