格式:
select 属性1,有关属性2的表达式 列别名
示例1:
select 学号 num,100-总成绩 绩点
from B170604
示例2:
select 'china' 国际,学号,100-总成绩 差值
from B170604
输出如下:增加一列属性。
-----------------------------
国际 学号 差值
china B17060401 9
china B17060402 8
china B17060403 12
-----------------------------
(4)基本函数
信息小写输出,并且需要别名
格式:
select 姓名,lower(学号) 学号别名
from B170604
二、选择表中的若干元组
1、消除取值重复的行
格式:
select distinct 班级
from B170604
补充:只能查看单行。若没有其关键字,
相当于是select all distinct 班级
2、查看满足条件的元组
--------------- 用where关键字
查询条件:
a、比较:=,>,<,>=,<=,!=,<>,!>,!<,;not+上述比较运算符。
b、确定范围:between and,not between and
c、确定集合:in,not in
d、字符匹配:like,not like
%(百分号):表示任意长度的字符串。
a%b:表示以a开始,中间任意字符,b结尾。
a%:表示以a开始任意字符。
%a:以a结尾任意字符。
_(下划线):表示任意单个字符。
用法: _a a_ a_b。
补充:如果like,not like不含通配符可以用逻辑代替。
字符匹配适用于int型。
e、空值:is null,is not null
f、多重条件(逻辑运算):not,and,or
A:比较大小
select 学号,姓名,总成绩 from B170604
where 总成绩!<90 / where 班级='B170609'
B:确定范围
between A and B (包含AB):
select 学号,姓名,总成绩 from B170604
where 总成绩 between 60 and 91
not between A and B (不包含AB):
select 学号,姓名,总成绩 from B170604
where 总成绩 not between 60 and 91
C:确定集合
select 学号,姓名,班级,性别,总成绩 from B170604
where 性别 in('女') /where 班级 not in('B170604')
D:字符匹配
谓词like可以用来进行进行字符串的匹配。like,not like不含通配符
格式1:like,not like不含通配符
select * from B170604
where 班级 not like 'B170604' ==where 班级!='B170604'
格式2:like,not like含通配符
select * from B170604
where 总成绩 not like 9_
特殊情况:
若所查询字符串本身包含%,_需要用转义字符。并且用escape声明,
问题1:查询姓名为'孩_子',的信息。(有孩_子,孩b子)
where 姓名 like '孩\_子' escape'\'
匹配符失效:输出孩_子的信息
where 姓名 like '孩_子'
匹配符生效:输出孩_子和孩b子的信息
问题2:查询以DB_开头且倒数第三个字符为i的课程的信息。
where 课程名 like 'DB\_%_ _i' escape'\'
E:涉及空值的查询
提示:代码出错但是可以查询。
注意:此处IS 不能用等号代替
select *
from B170604
where 出生日期 is null //where 出生日期 is not null
F:多重条件查询
补充:in谓词实际是多个or的缩写。
select *
from B170604
where 性别='女' and 年龄=20 //where 性别='男' or 年龄=20
三、order by子句
用户可以用order by子句对查询结果按照一个或多个属性列的
升序(ASC)或降序(DESC)进行排序,默认升序。
问题1:查询四班男生信息 按照总成绩逆序排列
select *
from B170604
where 性别='男'
order by 总成绩 DESC
补充:
升序:含空值的元组在前。
降序:含空值的元组在后。
四、聚集函数
1、当聚集函数遇到空值时,除count(*)之外,都跳过空值只处理非空值。
2、某个元组的一个或部分列空值不影响count的统计结果。
3、where子句中是不能用聚集函数作为条件表达式的。
4、聚集函数只能用于select、group by中的having子句。
select count(*) 元组个数 //统计行个数
from B170604
select count(姓名) //统计一列中值得个数(不包含NULL)
from B170604
select avg(总成绩) 平均分 //必须为int
from B170604
select sum(总成绩) 总分 //必须为int
from B170604
select min(班级) 最低分
from B170604
select max(总成绩) 最高分
from B170604
where 班级='B170604'
select max([distinct|all] <列名>)
from table
//distinct 去掉重复
五、group by子句
1、group by子句是将查询结果按某一列或多列的值分组,值相等的为一组。
2、目的:是为了细化聚集函数的作用对象。如果未对查询结果分组,聚集函数将作用于整个查询结果。
3、分组后的聚集函数将作用于每个分组,即每组都有一个函数值。
问题1:查询每个班级的个数。班级\t班级个数
select 班级,count(班级) 班级个数
from B170604
group by 班级 //对班级进行分组
问题2:查询班级内男女人数(对男女进行分组)
select 性别,count(性别) 人数
from B170604
group by 性别
人数 性别
----------------------------
- 7 男 -
- 7 女 -
----------------------------
select 性别,count(性别) 人数
from B170604
group by 性别
having 性别='男' //having count(*)>3
注意:这里先用group by 分组,用聚集函数计数,用having进行筛选。
提示:
where和having区别是作用对象不同。
where作用于基本表或视图。查询满足条件的元组
having作用于组,选择满足条件的组。
问题:
查询每个班的平均成绩。
select 班级,AVG (总成绩)
from B170604
group by 班级 //对班级进行分组
having AVG (总成绩)>=0 //输出平均成绩大于0的班级