非常简单,只有三种 —— 插入、更新、删除
插入数据
官方文档:https://dev.mysql.com/doc/refman/5.7/en/insert.html
插入元组
SQL语句格式:
INSERT
INTO <表名> [ ( <列名1>, <列名2>, … ) ]
VALUES ( <常量1>, <常量2>, … );
例1、将一个新学生元组(学号:‘200215128’,姓名:‘陈冬’,性别:‘男’,所在系:‘IS’,年龄:‘18岁’)插入到学生表里。
INSERT
INTO Student(Sno,Sname,Ssex,Sdept,Sage)
VALUES('200215128','陈冬','男','IS',18);
也可以省略Student后面的“(…)”的部分,但是VALUES后面的值就要严格的按照CREATE TABLE时的次序了。所以上例还可以写成。
INSERT
INTO Student
VALUES('200215128','陈冬','男',18,'IS');
Student表结构如下:
还可以插入元组的一部分,前提是插入元组的未赋值的属性可以为空,见例2。
例2、插入一条选课记录(’200215128’,’1’)。
INSERT
INTO SC(Sno,Cno)
VALUES('200215128','1');
插入子查询的结果
SQL语句格式:
INSERT
INTO <表名> [ ( <列名1>, <列名2>, … ) ]
子查询;
例3、对每一个系,求学生的平均年龄,并把结果存入数据库。
首先,建立一个新表存放系名(Sdept)和平均年龄(Avg_age),保证数据结构与Student表中对应属性相同。
CREATE TABLE Dept_Avg_Age (
Sdept CHAR(20) PRIMARY KEY,
Avg_age SMALLINT
);
然后,对Student表中元组按系名分组,求平均年龄,并存入表Dept_Avg_Age。
INSERT
INTO Dept_Avg_Age(Sdept,Avg_age)
SELECT Sdept,AVG(Sage)
FROM Student
GROUP BY Sdept;
更新数据
官方文档:https://dev.mysql.com/doc/refman/5.7/en/update.html
SQL语句格式:
UPDATE <表名>
SET <列名> = <表达式> [ ,<列名> = <表达式> ,<列名> = <表达式> ,…]
[ WHERE <条件> ];
更新某一个元组的值
例4、将学生200215121的年龄改为22岁。
UPDATE Student
SET Sage = 22
WHERE Sno = '200215121';
更新多个元组的值
例5、将所有学生年龄增加1岁。
UPDATE Student
SET Sage = Sage + 1;
带子查询的的更新语句
例6、将计算机科学系所有学生的成绩置0。
/* 以类似相关子查询的思路理解这条语句 */
UPDATE SC
SET Grade = 0
WHERE 'CS' = (
SELECT Sdept
FROM Student
WHERE Student.Sno = SC.Sno);
删除数据
官方文档:https://dev.mysql.com/doc/refman/5.7/en/delete.html
SQL语句格式:
DELETE
FROM <表名>
[ WHERE <条件> ] ;
删除某一个元组的值
例7、删除学号为200215128的学生记录。
DELETE
FROM Student
WHERE Sno = '200215128';
删除的时候出现图示错误,意思是在表SC中存在某元组,其Foreign Key参考了Student中预删除的这个元组,故必须先将SC中的子记录删除。
DELETE
FROM SC
WHERE Sno = '200215128';
删除多个元组的值
例8、删除所有学院的学生平均年龄记录。
DELETE
FROM Dept_Avg_Age;
带子查询的删除语句
例9、删除计算机科学系所有学生记录。
DELETE
FROM SC
WHERE 'CS' = (
SELECT Sdept
FROM Student
WHERE Student.Sno = SC.Sno );
总之,数据更新不难,难的是实际工作中的“一不小心”。