数据修改
数据插入
1.插入元组:
insert into 表名[(属性列,...)]
values(),(),(),...;
2.插入子查询结果:
insert into 表名[属性列名]
子查询
注:
子查询的结果只需数据类型与插入表对应即可,无需列名对应
数据修改
update 表名
set 属性列=取值
[where ...];
数据删除
delete from 表名
[where ...];
数据查询
注:
当表指定了别名时,其他地方都要用别名
当属性列执行了别名,其他地方还用原名
单表查询
select f(属性列名)[as 属性列别名],.... from 表名
[where f(属性列名) ]
[order by [属性列名 (asc|desc)],[属性列名 (asc|desc)]...]
[group by 属性列名]
[having f(属性列)]
select语句中f(属性列名):
1.distinct 语句作用范围为select子句所有属性列
2.聚集函数:(仅出现在select语句以及having子句)
2.1count(*):统计元组个数
2.2count([distinct]属性列名):统计属性列下非空元组个数(distinct表示重复值不计入结果)
2.3sum([distinct]属性列名)
2.4average([distinct]属性列名)
2.5max(属性列名):最大分量值
2.6min(属性列名):最小分量值
where语句的<行选择条件>:
1.属性列 ? {属性列|常量}
2.属性列 [NOT] between 常量1 and 常量2
3.属性列 [NOT] like 字符串常量表达式(正则)
正则表达式:
_匹配任意一个字符
%匹配任意长度字符
[]查询一定范围数据。[]用于指定一定范围内的任何单个字符,包括两端数据----------------------------------???
[^]用来查询不属于制定范围的任何单个字符---------------------------????
当匹配串中含有_%时,要使用escape'<换码字符>'制定取消通配符意义的换码字符
4.属性列 is[NOT] NULL
5.{属性列|常量} {[NOT]in|?{any|all}} {常量1[,常量2...]|(select 子句)}
6.[NOT] exists (select 子句)
7.<行选择条件> {and|or} <行选择条件>
group by:
分组查询,若使用group by则select语句中的属性列必须来自group by的属性列(聚集函数属性列除外)
having:
对分组进行统计,having语句必须在含有group by的子句查询语句中使用,不能单独使用。
having与where的区别是:where子句作用在分组之前选择符合条件的记录,而having子句作用在分组之后选择符合条件的分组结果
执行顺序:
where语句选出元组
group by分组
select语句(distinct|聚集函数)
having子句
连接查询(多表查询)
注:
进行连接运算的表,必须存在着某种关系的公共列,连接运算实际是比较各表的公共列值,如果满足条件的连接产生组合输出行。
连接操作的执行:
1嵌套循环法
2.排序合并法
3.索引连接法
连接方式:
1.内连接??????等值连接 自然连接
实现一:from 表1 [inner] join 表2 on <连接条件>
实现二:[表一.]属性列 <比较运算符> [表二.]属性列
自连接(一种特殊的内连接)
2.外连接
左外连接、右外连接、全外连接
用TOP限制结果集
select [distinct] [top谓词] 属性列 from 表名
......
top谓词格式:
top n[percent][with ties]
n————前n
n[percent]————前%n
[with ties]————含并列
使用时注意:
系统默认排列是按主键,使用top时考虑是否要用order by语句
嵌套查询
1.where子句嵌套查询
在查询的条件子句含有select查询子句
外层查询为父查询,内层为子查询
子查询可以返回单列或多列记录
子查询到对象可以使多个表,可以有条件子句和分组子句
子查询允许嵌套子查询
嵌套查询可分为不相关子查询和相关子查询
注:
与=<>...比较晕算法相连的子查询,必须是返回非空的单值集合
子查询只能比较运算符的右边,不能再比较运算符的左边
如果子查询返回是空集火多值集合时,子查询只能用in,not in,any(有一个),all(所有),exists,not exists等比较运算符相连
exists运算符是先执行外层查询,然后执行内层查询
exists运算符和in,any,all所带的子查询方式基本相似,区别是:
不用指定匹配的列值,而用*作为选择列表
exists,all,any只能用于嵌套查询,而in,not in可以用于集合
2.from子句中的嵌套查询
查询结果作为一个表,然后用as指定表名