本篇文章繼續(xù)沿用 MySQL 指南(一) 中創(chuàng)建的 student
和 address
表屯蹦。
視圖
為什么創(chuàng)建視圖? 視圖本身并不保存數(shù)據(jù)脐区,但是允許我們像處理真實表一樣去處理視圖愈诚。所以創(chuàng)建視圖的一般作用就是對數(shù)據(jù)進行查詢,并且可以在獲取到數(shù)據(jù)的時候?qū)?shù)據(jù)進行格式化處理牛隅,比如進行部分列之間的運算操作或者對列名進行重命名炕柔。
CREATE VIEW studentView AS
SELECT
*
FROM
student;
利用上面的語句我們就創(chuàng)建了一個名為studentView
的視圖,我們可以像在真實表中查詢數(shù)據(jù)一樣在視圖中查詢數(shù)據(jù)媒佣。
select studentName from studentInfo;UNION 操作
UNION
操作其實就是并操作匕累,是集合運算的一種,不過要進行并操作的兩組數(shù)據(jù)必須具有相同的列默伍,并且列屬于同一值域欢嘿。
selectStatementOne
UNION
selectStatementTwo;
這時候返回的數(shù)據(jù)是默認消除重復(fù)行的授霸,如果想返回所有數(shù)據(jù),不消除重復(fù)行际插,可以將UNION
改成UNION ALL
.-
存儲過程
存儲過程有很多優(yōu)點碘耳,比如可以把多條SQL
語句保存到一個單獨的過程中,還可以讓參數(shù)和SQL
語句結(jié)合使用框弛。下面就來創(chuàng)建有參和無參的存儲過程辛辨。
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語句進行處理斗搞,則存儲過程的編譯過程會報錯。
-
下面單獨創(chuàng)建兩張表對數(shù)據(jù)的插入和更新進行講解慷妙。
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;
可見僻焚,這兩張表除了表名之外是完全相同的,這個時候如果兩個表中分別存放著不同的數(shù)據(jù)膝擂,我們想把 newStudents
中的信息完全導(dǎo)入到 oldStudents
虑啤,我們可以這么做。
INSERT INTO oldStudents
SELECT * FROM newStudents;
有的時候可能兩個表中保存著相同的學生信息架馋,但是新表中的信息是剛錄入的狞山,舊表中的信息已經(jīng)失效了,這個時候我們希望將新的信息更新到舊表中叉寂,可以這么做萍启。
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)