(1)语句格式
select后面接指定查询的列。
all,distinct,all显示全部查询结果,distinct对结果进行去重。
from 字句指查询的对象,比如表,试图,临时制造的关系。
where是查询的条件对结果进行限定。
group by对查询结果进行分组,分组依据为列名,取值相同的分到一组。
having 只跟在group后面,筛选出符合条件的组。
order by 对查询结果按照指定列升序或者将序。
(2)select子句
select * from T;表示选择表T中的所有信息
select tname,sal*0.95 from T;可以直接在后面用算数表达式得出数据
更名as可选,select ,from中都可以使用,如
select tname,sal*0.05 as tax,sal*0.95 as income
from T;
(3)from子句
①from后面有多个表时,是笛卡尔积不是自然连接。
where字句可以认为是连接条件。
--例:列出教授“哲学”课程的老师的教工号及姓名 select T. tno , tname from T , TC , C where T.tno = TC.tno and TC.cno = C.cno and cname = ‘哲学’;
②为了防止select后的内容混淆,from中常用到更名操作,利用这种方法我们可以把两个相同的表连接起来,如找爸爸的爸爸。这里sno在结果虚表中有两个所以要分清楚是哪一个。
select a.sno, sname from s as a, sc as b where a.sno=b.sno and cno=‘c1’
(4)查询语句执行顺序
每一步都会生成一个虚表,先执行from产生的虚表进入where进行条件筛选,然后进行分组,这里开始使用select中的别名(此时select初步完成,where中不能用别名),分完组之后生成的虚表进入having进行组的筛选此时分组使用聚合函数,最后order by进行组内排序(可以用别名),order by是最后进行的。
(5)字符串操作
匹配规则:
“%” 匹配零个或多个字符(匹配任意数量字符)
“_” 匹配任意单个字符
Escape 定义转义字符,以去掉特殊字符的特定含义,使其被作为普通字符看待 如escape “\”,定义 \ 作为转义字符,则可用\%去匹配%,用\_去匹配_
示例:
select *
from T
where tname like ‘张%’
--找到张姓老师的所有信息
(6)order by子句
示例:
按系名升序列出老师姓名,所在系名,同一系中老师按姓名降序排列
select dname,tname
from T,D
where T.dno = D.dno
order by dname asc,tname desc
注意:①可以有多个排序规则,按照先后顺序,空值按最大处理。
(7)集合操作
集合并:union
集合交:intersect
集合差: except(minus)
提示 : 集合操作自动去除重复元组,如果要保留重复元组的话,必须用all关键词指明
示例:注意集合操作时两个子句操作产生的集合最好加括号,防止出错,结构也更加清晰。
--两个结果集合进行运算
查询选修了001或002号而没有选003号课程的学生号
(select sno
from SC
where cno= ‘001’ or cno = ‘002 ‘)
except
(select sno
from SC
where cno = ‘003’)
(8)聚集函数与分组
平均值:avg 最小值:min 最大值:max 总和:sum 记数:count
聚集函数返回的是一个关系,这个关系只有一个元组。
查询学生总人数
SELECT count(*) FROM S;
注意:
①:count(*)和count(属性名)的区别,count(*)统计的是元组的个数,连空都会统计,count(属性名)不会统计空。
②:count(distinct 属性名)这种用法在count(*)中不允许,因为没有两条完全相同的记录。
③:除了count(*)其他聚集函数均忽略空。
依据group by列名相等进行分组,having是对组的选择。
注意:当出现group by后,select列名子句中只能出现分组属性或聚集函数。聚集函数只能用于SELECT子句和GROUP BY中的HAVING子句。也就是说分好组之后只能选分组属性和聚集函数,只有分组属性和聚集函数是一一对应的。
解释:如下,如果select中出现 group by后面未出现的比如cno,那么一个sno可对应对个cno,结果出错不能一一对应,所以select 子句中不能出现未用来分组的属性列。
求某一类人的什么属性通常用分组。
--及格同学的平均成绩
select sno,avg(score)
from SC
group by sno
having min(socre) >= 60
HAVING和WHERE同样是选择运算,HAVING的对象是分组,WHERE的对象是元组。
(8)空值(NULL)
不能是等于null(在判断中,在update赋值中可以等于null)。
null参与算术运算,算术表达式结果是null,参与比较运算算术表达式结果是FALSE。
count(*)不会忽略空值,count(属性列)会忽略,其他的聚集函数均会忽略。
(9)连接表达式(join on)
格式示例:
join为连接方式,有内外连接两种,两种连接完的表均有两个连接列。on后面为连接条件,用法类似于where。
①内连接(inner join)
舍弃不匹配的元组,即不满足R.C=S.C的元组直接舍弃,注意连接完有两个C列。
②外连接(outer join)
外连接不但会返回匹配的行,还会返回不匹配的行。左外连接就是把左边的都保存了,右边缺失的补null。
---左外连接(左外连接左边重要,右边不满足连接条件的用null补)
---右外连接(左边不满足条件的用null补)
---全外连接
---非主体表
连接条件属性列加(*)或者(+),说明该表为非主体表,右边是非主体表则这个连接是左外连接,同理,左边是非主体表的话这个连接就是右外连接。