当我们在第一讲中把数据库和表单都建立起来后,那么现在怎么把学生等数据填到对应的表中又成为了一个问题。更加会想到,怎么把存在于数据库中的数据按照自己的意愿调出来也会是一个问题。
所以,本节我们会一起来学习怎么把数据存储到数据库中,以及一些基本的查询技术。
1. 插入数据
1.1 我们需要在Student添加如下数据项:
1 INSERT INTO Student(SID,SNAME,SAGE,SSEX,SFirC,SSecC,SThiC,SFouC,SFivC) 2 VALUES ('10001','学生一',19,'男',67,66,78,70,80); 3 INSERT INTO Student(SID,SNAME,SAGE,SSEX,SFirC,SSecC,SThiC,SFouC,SFivC) 4 VALUES ('10002','学生二',19,'男',70,80,75,85,80); 5 INSERT INTO Student(SID,SNAME,SAGE,SSEX,SFirC,SSecC,SThiC,SFouC,SFivC) 6 VALUES ('10003','学生三',18,'女',80,81,85,90,87); 7 INSERT INTO Student(SID,SNAME,SAGE,SSEX,SFirC,SSecC,SThiC,SFouC,SFivC) 8 VALUES ('10004','学生四',20,'女',85,90,91,95,97); 9 INSERT INTO Student(SID,SNAME,SAGE,SSEX,SFirC,SSecC,SThiC,SFouC,SFivC) 10 VALUES ('10005','学生五',18,'男',66,68,69,62,60);
这里说明几点:
a、我这里是插入所有的列数据,如果你只想插入部分的列数据,那么"Student(SID,SNAME,SAGE,SSEX,SFirC,SSecC,SThiC,SFouC,SFivC)"中括号里面的列名只填入你想插入的列就ok了。当然,在"VALUES ('10001','学生一',19,'男',67,66,78,70,80)”中括号里面的只也只需要填对应的列数据。
b、特别要注意,其一一对应的关系,如果不对应而类型不一致,MSSQL2000系统还能够检测出错误。如果是类型相同,那么系统将不能检测出错误。在之后的查错过程,这样的错误将是很难再检测出来的。
2. 基本查询技术的学习
1 SELECT [ALL | DISTINCT] <目标列表达式> [, <目标列表达式> ]... 2 FROM <表名或者视图名> 3 [WHERE <条件表达式> ] 4 [GROUP BY <列名1> [HAVING <条件表达式> ]] 5 [ORDER BY <列名2> [ASC | DESC]]; 6 7 8 -- []里面的内容为可选项 列名2> 条件表达式> 列名1> 条件表达式> 表名或者视图名> 目标列表达式> 目标列表达式>
2.1 单表查询
2.1.1 选择表中的若干列
a、如果你想返回Student表的所有数据。
1 USE School 2 SELECT * -- 用*号代表所有列 3 FROM Student
b、如果你知道Student表的所有列。
1 USE School 2 SELECT SID,SNAME,SAGE,SSEX,SFirC,SSecC,SThiC,SFouC,SFivC 3 FROM Student
c、如果你想查询SID,SNAME列的数据。
1 USE School 2 SELECT SID,SNAME 3 FROM Student
d、查询经过计算的值,如出生年份。
1 USE School 2 SELECT SID ,SNAME ,2012-SAGE 3 FROM Student
2.1.2 选择表中的若干元组(元组理解为行,属性理解为列)
a、如果想去掉结果表中的重复行,必须指定DISTINCT关键词。
1 USE School 2 SELECT DISTINCT SID 3 FROM Student
b、查询满足条件的元组
这里就需要通过WHERE子句实现。常用的查询条件
查询条件 | 谓词 |
比较 | =,>,<.>=,<=,!=,<>,!>,!<,NOT+比较谓词 |
确定范围 | BETWEEN AND,NOT BETWEEN AND |
确定集合 | IN,NOT IN |
字符匹配 | LIKE,NOT LIKE |
空值 | IS NULL,IS NOT NULL |
多重条件 | AND,OR,NOT |
b.1 查询所有学生中性别为男的名单。
1 USE School 2 SELECT SNAME 3 FROM Student 4 WHERE SSEX = '男'
b.2 查询所有年龄小于20岁的学生姓名和年龄。
1 USE School 2 SELECT SNAME,SAGE 3 FROM Student 4 WHERE SAGE<20
字符匹配的问题这里就不做讨论了。
2.1.3 ORDER BY子句
我们可以用ORDER BY子句对查询结合按照一个或多个属性列的升序或降序排列,缺省值为升序。
a.1 查询所有学生的ID号和第一门课程的成绩,查询结果按第一门课程的成绩升序排列。
1 USE School 2 SELECT SID,SFirC 3 FROM Student 4 ORDER BY SFirC DESC
a.2 查询所有学生的ID号和第一门课程的成绩,查询结果按第一门课程的成绩降序排列。
1 USE School 2 SELECT SID,SFirC 3 FROM Student 4 ORDER BY SFirC ASC
2.1.4 聚集函数
SQL技术中提供了许多的聚集函数,主要有:
COUNT([DISTINCT | ALL] *) 统计元组的个数
COUNT([DISTINCT | ALL] <列名>) 统计一列中值的个数
SUM([DISTINCT | ALL] <列名>) 求和
AVG([DISTINCT | ALL] <列名>) 求平均值
MAX([DISTINCT | ALL] <列名>) 求最大值
MIN([DISTINCT | ALL] <列名>) 求最小值
a、查询学生的总个数。
1 USE School 2 SELECT COUNT(*) 3 FROM Student
b、查询第一个课程成绩最高的分数。
1 USE School 2 SELECT MAX(SFirC) 3 FROM Student
c、查询所有学生的平均成绩
1 USE School 2 SELECT AVG(SFirC) 3 FROM Student
等等之类的,都可以测试下... ...
2.1.5 GROUP BY 子句
该子句将查询结合按某一列或多列的值分组,值相等的为一组。
a、统计男、女生个数。
1 USE School 2 SELECT SSEX,COUNT(SID) 3 FROM Student 4 GROUP BY SSEX
b、查询第一门课程平均成绩大于70的性别。
1 USE School 2 SELECT SSEX 3 FROM Student 4 GROUP BY SSEX 5 HAVING AVG(SFirC) > 70 -- HAVING 子句必须利用到聚合函数 6
WHERE 与 HAVING 的区别:[重要]
1、WHERE 是作用于基本表或者视图,从中选择满足条件的元组。
2、HAVING是作用域组(GROUP BY聚合的组),从中选择满足条件的组。
这里只是说了一些基本的技术,需要配合大量的练习才能熟悉这些子句、关键字的使用。