SQL基础总结
oracle在起别名的时候,不能使用保留关键字。
distinct只能用在第一列之前,distinct的使用范围是所有在其后边的列,并且distinct会将null行作为一行处理
包含null值的运算,其结果也是null,以null除以任意整数,结果都为null(不能对null使用比较运算符使用is null或者is not null)
以字符串定义的数字,在使用比较运算符时,需要以字典顺序进行比较,不是以数字大小进行比较
not 可以使用在任意运算之前,例如:not sal>=1000(sal小于1000的值)
可以知道,我的条件是not sal>1300,得到的结果是sal<=1300;
使用and运算符进行的逻辑运算称为逻辑积,使用or运算符进行的逻辑运算称为逻辑和
SQL中的逻辑运算被称为三值逻辑(真、假、不确定)
对于数据类型,只记录了一下integer和numeric两种
在Oracle中integer类型相当于38长度的number类型
numeric类型是一种有整数位和小数位一起构成的数据类型
备注:
在Oracle当中from子句必须要有,但在SQLserver,postgreSQL,MySQL中from子句不一定要有
聚合函数会对null以外的数据进行汇总
count函数可以查出包含null值的所有数据,count(列名)不会计算出包含null的行
创建一个只有一列的表,表中有六行数据,其中两行是null值;
count(*)和count(1)查询出的数据是一样的
可以知道,count(1)和count(*)得到的数据是一样的,而且两种方式都会计算null值;
所有的聚合函数在以列名为参数时,计算之前会排除null(排除不同视为0计算,两者差别很大)
sum/avg只能应对数值类型的列,max/min原则上可应对任何数据类型的列
想要去掉重复值,并计算总行数,可以使用count(distinct 列名)的方式实现
所有的聚合函数都能类似count函数使用distinct关键字
语句中同时出现where和group by,where子句在前,group by 子句在后
group by子句不会排除null值
使用聚合函数时,select子句中只能出现
1.常数
2.聚合函数
3.group by 中出现的列名
having关键字中出现的元素和select子句中一致
where 子句=指定行所对应的条件
having 子句=指定组所对应的条件
在同样的语句中使用where语句可能会提高语句执行速度
order by子句中,可以使用聚合函数,也可以使用列的编号(尽量不要用)
原则上,一次insert语句插入一行数据
insert时,如果没有设定默认值,会插入null
insert。。。SELECT。。。时,可以使用任何语法,但是order by语法不起作用
创建一个只有一列的表
delete和truncate
delete可以删除多行也可以删除一行,truncate只能删除整张表
delete不释放内存,truncate释放内存
在update时,可以同时对多列进行更新:
set 列=表达式,列=表达式。。。。
事务:以第一个可执行的dml语句开始,以commit、rollback等语句结束的一系列dml操作的集合
事务的特性
1.原子性:要么全部执行,要么全部不执行
2.一致性:从一个一致状态到另一个一致状态
3.隔离性:不同事务之间互不干扰
4.持久性:事务结束后,数据状态永久保存
视图优点
1.无需保存数据
2.可以保存多次使用的复杂SELECT语句
视图中的数据会随着原表的变化而变化
create view 视图名(列名、......)
AS
查询语句;
视图中的AS不同于起别名,是一种语法规定
视图就是保存好的SELECT语句
多重视图:可以在视图的基础上创建视图(多重视图会降低SQL的性能)
注意:
1.定义视图时,不能使用order by子句;
2.对视图进行更新时的条件
1.SELECT未使用distinct
2.from只有一个表
3.未使用group by语句
4.未使用having 语句
虽然子查询可以无限嵌套,但嵌套越多,性能会越差,阅读起来越难懂,所以尽量避免多层嵌套
标量子查询:必须而且只能返回1行1列值
能够使用常数或者列名的地方都可以使用标量子查询.
在where语句中使用子查询,原则上此查询的返回值必须是一行一列的
大多数函数对null求值,都返回null
函数:
abs 求绝对值:abs(参数)
mod:求余数:mod(参数1,参数2)(小数计算中没有余数的概念)
round:四舍五入:round(参数1,参数2)对参数1进行四舍五入运算保留参数2位小数
current_date:求当前的日期:类似Oracle中的sysdate
current_timestamp:求当前的时间
extract:日期截取函数:返回值不是日期类型而是数值类型:extract(日期元素[year/month/day] from 日期)
cast:类型转换:cast(转换前的值 AS 想要转换的数据类型)
COALESCE:处理null值:coalesce(参数1,参数2,。。。)
谓词:
in:in无法选取出null数据
exists:通常使用关联子查询作为参数
case表达式
case when 求值表达式then 表达式
。。。
else 表达式 end
集合运算注意事项
1.列数必须相同
2.列的类型必须一致
3.order by关键字只能用一次
注意
except差集在Oracle中相当于minus,在MySQL中无法使用
内联结要点:
1.from子句中有多张表,尽量使用表的别名来增加代码的可读性
2.on子句后面需要写上连接条件
3.写列名时最好写成表名.列名,增加代码可读性
外联结的要点
1.会选取出单张表中的全部信息
2.要决定好那张是主表
窗口函数:将数据以某种条件分组显示,但不同于group by,不会对数据进行汇总
<窗口函数>OVER ([partition by 列名]
order by 列名)
partition by决定分组
order by
rank函数:计数函数:rank() over....
计数时会跳过重复记录例如
1,1,3。。。
dense_rank函数:
计数时即使存在相同的记录也不会跳过,例如:
1,1,2。。。
row_number:
会唯一连续的记录。
由于专用窗口函数无需参数,所以多数括号都是空的
窗口函数只能出现在SELECT 子句中
聚合函数和窗口函数一起使用,例如
sum(sale_price)over (order by ...)
作用类似累加
指定框架:例如
avg(sale_price)over (order by ...
row 2 preceding)
指范围是当前行和之前两行的平均值
。。。row 2 following
指的是当前行和之后两行的平均值