SQL数据更新和查询
一、数据更新
3.5.1 插入数据
1.插入元组
例3.69 将一个新学生元组插入到Student表中
INSERT
INTO Student(Sno,Sname,Ssex,Sdept,Sage)
VALUES('201215128','陈冬','男','IS','18');
在INTO子句中指出了表明Student,并指出了新增加的元组在哪些属性上要赋值,属性的顺序可以与CREATE TABLE中的顺序不一样。VALUES子句对新元组的各属性赋值。INTO子句中没有出现的属性列新元组在这些列上将取空值。但必须注意的是,在表定义时说明了NOT NULL属性列不能取空值,否则会出错。
例3.70 将学生张成民的信息插入到Student表中。
INSERT
INTO Student
VALUES('2012151126','张成民','男','CS','18');
INTO子句中没有指明任何属性列名,新插入的元组必须在每个属性列上均有值。属性列的次序与CREATE TABLE中的次序相同。VALUES子句对新元组的各属性列赋值,一定要注意值与属性列要一 一对应。
例3.71 插入一条选课记录
INSERT
INTO SC(Sno,Cno)
VALUES('201215128','1');
注意SC表中的外键约束
2.插入子查询结果
例3.72 对每一个系,求学生的平均年龄,并把结果存入数据库
CREATE TABLE Dept_age
(Sdept CHAR(15),
Avg_age SMALLINT);
INSERT
INTO Dept_age(Sdept,Avg_age)
SELECT Sdept,AVG(SAge)
FROM Student
GROUP BY Sdept;
3.5.2 修改数据
1.修改某一个元组
例 3.73 将学生20121512的年龄改为22岁
UPDATE Student
SET SAge==22
WHERE Sno='201215126';
2.修改多个元组
例 3.74 将所有学生的年龄增加1岁
UPDATE Student
SET Sage=Sage+1;
3.带子查询的修改语句
UPDATE
SET Grade=0
WHERE Sno IN
(SELECT Sno
FROM Student
WHERE Sdept='CS');
3.5.2 删除数据
1.删除一个元组的值
DELETE
FROM Student
WHERE Sno='201215128';
2.删除多个元组的值
DELETE
FROM SC;
3.带子查询的删除语句
DELETE
FROM SC
WHERE Sno IN
(SELECT Sno
FROM Student
WHERE Sdept='CS');
二、数据查询
单表查询
1.选择表中的若干例
SELECT*
FROM Student
//等价于
SELECT Sno,Sname,Ssex,Sage,Sdept\
FROM Student;
2.选择表中的若元组
SELECT DISTINCT Sno
FROM SC;
其中DISTINCT用来去重
//**查询计算机系全体学生的名单**
SELECT Sname
FROM
WHERE Sdept='CS';
接着上次写
挑几个不太好懂的写加强印象
例 3.27 查询CS、MA、IS系学生的姓名和性别
SELECT Sname,Ssex
FROM Student
WHERE Sdept IN('CS','MA','IS');
等价于后面多条件查询
SELECT Sname,Ssex
FROM Student
WHERE Sdept='CS'OR Sdept='MA' OR Sdept='IS';
在满足条件的元组集合中输出Sname列和Ssex列
字符匹配
例 3.35 查询以“DB_”开头,且倒数第三个字符为i的课程的详细情况
SELECT*
FROM Course
WHERE Cname LIKE 'DB\_%i__'ESCAPE'\';
匹配串’DB_%i__'中第一个_因前有 ’ \ ‘,被转义成普通字符’’。i后面的两个’'仍作通配符
ORDER BY 子句
ORDER BY 子句对查询结果按照一个或多个属性列的升序(ASC)或降序(DESC)排列,默认值为升序。
例 3.40 查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列
SELECT *
FROM Student
ORDER BY Sdept,Sage DESC;
多个属性列的排序原理:
聚集函数
COUNT(*)
COUNT([DISTINCT | ALL] <列名>)
SUM([DISTINCT | ALL] <列名>)
AVG([DISTINCT | ALL] <列名>)
MAX([DISTINCT | ALL] <列名>)
MIN([DISTINCT | ALL] <列名>)
例 3.42 查询选修了课程的学生人数
SELECT COUNT(DISTINCT Sno)
FROM SC;
一个学生要选修多门课程,为避免重复计算学生人数,必须在COUNT函数中使用DISTINCT