您的位置:首页 > 数据库 > MySQL

SQL编程——MySQL数据库基本操作

2016-07-27 14:33 543 查看
实验平台:mysql5.7,

案例:学生-课程-成绩

实际的数据库设计可能和课本中有出入

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;


上面在做数据插入时创建了存储过程,目的是为了实现批量数据插入,并在插入时用到了随机函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据库 mysql 编程 sql