这篇文章主要内容是数据查询(非常重要),查询语句一般格式:
select [all | distinct] <目标列表达式> [,<目标列表达式>,...]
from <表名或视图名>[,<表名或视图名>,...]
[where <条件表达式>]
[group by <列名1> having <条件表达式>]
[order by <列名2> [asc | desc] ];
一、单表查询
(一)、选择表中的若干列
1、查询指定列:select id,name from student
2、查询全部列:select * from student
3、查询经过计算的值:select子句的<目标列表达式>可以是属性列,也可以是表达式。select id,name,2011-age from student
(二)、选择表中若干元组
1、消除重复的行:某列可能有重复的行可用关键字distinct去掉,默认是all,select distinct id from sc
2、查询满足条件的元组,where后的条件表达式
比较:=,<,>,>=,<=,!=,<>,!>,!<
确定范围:between...and... , not between...and...
确定集合:in,not in
字符串匹配:like,not like
空值:is null,is not null
多重条件(逻辑运算):and,or,not
3、使用注意
1)、语句中包含字符串时用单引号括起来
2)、in用来查找属性值指定集合的元组,not in相反
select * from student where sdept in ('cs','ma','is')
3)、字符匹配
通配符%和_,_代表单个字符,因为一个汉子有两个字符,因此_ _ 代表两个汉子
如果字符串本身就含有通配符%和_,这时就要使用escape<转义字符>,对通配符进行转义。例如查找以“DB_”开头,且倒数第三个字符为i的课程的详细信息:
select * from course where cname like 'DB\_'%i_ _' escape '\'; 注意\为转义字符
4)、是否为空用is null或is not null,is不能用=号代替
5)、多重条件查询
and 的优先级高于or但可以用括号来改变优先级
(三)、order by 子句
1、对于空值,若是升序,含空值的元组将最后显示。若按降序排列,空值的元组将最先显示(可将空值比作是无穷大)
2、查询全体学生,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列
select * from student order by sdept [asc],age desc; 其中[asc]可省略,因为默认是升序排列
(四)、聚集函数
count( [distinct | all] *) 统计元组个数
count( [distinct | all] <列名>) 统计一列中值的个数
sum( [distinct | all] <列名>) 计算一列中值的求和(系列必须是数值型)
avg( [distinct | all] <列名>) 计算一列中值的平均值(系列必须是数值型)
max( [distinct | all] <列名>) 求一列中的最大值
min( [distinct | all] <列名>) 求一列中的最小值
聚集函数遇到空值时,除了count( [distinct | all] *)外,其他的都会跳过空值而只处理非空值;where子句不能用聚集函数作为条件表达式。
(五)、group by子句
1、group by子句江查询的结果按一列或多列的值分组,值相等的为一组
2、对查询结果分组的目的是为了细化聚集函数的作用对象。如果未分组,聚集函数作用于整个查询结果;而分组后,聚集函数将作用于每一个组,即每一组都有一个函数值
3、having短语后跟也是聚集函数,用于指定帅选条件。查询选修了3门以上课程的学生
select id from sc group by Sno having count(*)>3