本篇文章继续沿用 MySQL 指南(一) 中创建的 student
和 address
表。
-
视图
为什么创建视图? 视图本身并不保存数据,但是允许我们像处理真实表一样去处理视图。所以创建视图的一般作用就是对数据进行查询,并且可以在获取到数据的时候对数据进行格式化处理,比如进行部分列之间的运算操作或者对列名进行重命名。
CREATE VIEW studentView AS
SELECT
*
FROM
student;
利用上面的语句我们就创建了一个名为studentView
的视图,我们可以像在真实表中查询数据一样在视图中查询数据。
select studentName from studentInfo; -
UNION 操作
UNION
操作其实就是并操作,是集合运算的一种,不过要进行并操作的两组数据必须具有相同的列,并且列属于同一值域。
selectStatementOne
UNION
selectStatementTwo;
这时候返回的数据是默认消除重复行的,如果想返回所有数据,不消除重复行,可以将UNION
改成UNION ALL
. -
存储过程
存储过程有很多优点,比如可以把多条SQL
语句保存到一个单独的过程中,还可以让参数和SQL
语句结合使用。下面就来创建有参和无参的存储过程。
DELIMITER $$
create procedure studentProcedure()
BEGIN
SELECT * FROM student;
END$$
DELIMITER ;call studentProcedure; DELIMITER $$ create procedure studentProcedure(stuID INTEGER) BEGIN SELECT * FROM student WHERE studentId = stuID; END$$ DELIMITER ; call studentProcedure(1);
DELIMITER
用于声明分隔符,默认的分隔符是 ;
这里我们必须首先将分隔符修改为其它字符,不然编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过程会报错。
-
下面单独创建两张表对数据的插入和更新进行讲解。
CREATE TABLE oldStudents (
studentId INTEGER NOT NULL,
studentName VARCHAR(16) NOT NULL,
studentTel VARCHAR(16) NOT NULL,
PRIMARY KEY (studentId)
) ENGINE=INNODB CHARSET=UTF8;CREATE TABLE newStudents ( studentId INTEGER NOT NULL, studentName VARCHAR(16) NOT NULL, studentTel VARCHAR(16) NOT NULL, PRIMARY KEY (studentId) ) ENGINE=INNODB CHARSET=UTF8;
可见,这两张表除了表名之外是完全相同的,这个时候如果两个表中分别存放着不同的数据,我们想把 newStudents
中的信息完全导入到 oldStudents
,我们可以这么做。
INSERT INTO oldStudents
SELECT * FROM newStudents;
有的时候可能两个表中保存着相同的学生信息,但是新表中的信息是刚录入的,旧表中的信息已经失效了,这个时候我们希望将新的信息更新到旧表中,可以这么做。
UPDATE oldStudents
SET oldStudents.studentId = (SELECT newStudents.studentId FROM newStudents WHERE newStudents.studentId = oldStudents.studentId),
oldStudents.studentName = (SELECT newStudents.studentName FROM newStudents WHERE newStudents.studentId = oldStudents.studentId),
oldStudents.studentTel = (SELECT newStudents.studentTel FROM newStudents WHERE newStudents.studentId = oldStudents.studentId)
WHERE EXISTS(SELECT * FROM newStudents WHERE newStudents.studentId = oldStudents.studentId)
网友评论