首先,放一个SQL教程链接: SQL教程|菜鸟教程
其次,pgsql和oracle、mysql在有些方面还是存在区别,但大体上是差不多的。
最后,笔记来咯😀~
1.varchar长度是字节还是字符?
见链接:MySQL的varchar定义长度到底是字节还是字符,varchar字符长度的计算
2.关于select后的内容
select 后写具体字段,不要写*,有性能差距
3.group by和distinct都可以去重,如何选择?
不到万不得已不用distinct,因为对性能影响很大,尽量使用逻辑筛选。group by比distinct更灵活,可以多用它。
贴个链接:MySQL去重中 distinct 和 group by 的区别
4.order by后跟多个字段的情况
也贴个链接:mysql order by 多个字段及其多字段排序原则,和 order by 后跟数字
关于order by,pgsql和mysql是一样的。
5.oracle中有rownum,而pgsql无
贴一个从oracle迁移到pgsql的解决办法:PostgreSQL rownum实现方法(兼容oracle)
6.limit和offset用法
链接:PostgreSQL LIMIT和OFFSET
7.聚合函数结果作为筛选条件时,不能用where,而是用having,为什么?
(1)什么是聚合函数?count(),sum(),avg(),min(),max()都是聚合函数。
(2)聚合函数是基于结果集运算的,当在where子句使用聚合函数时此时根据group by 分割结果集的子句还没有执行,此时只有from 后的结果集。所以无法在where子句中使用聚合函数。
8.in关键字的使用
例:如果要查询学号为01、02、03、04的学生信息
直接写法:
select * from student s
where s.s_id = ‘01’ or s.s_id = ‘02’ or s.s_id = ‘03’ or s.s_id = ‘04’
使用in后的简便写法:
select * from student s
where s.s_id in (‘01’,’02’,’03’,’04’);
9.pgsql中的between and包不包含边界?
包含边界
--这两个是等效的
x between a and b
x >= a and x <= b
10.inner join的两种写法
--写法1
select s.*,s2.c_id,s2.s_score
from student s,score s2
where s.s_id = s2.s_id;
--写法2
select s.*,s2.c_id,s2.s_score
from student s
inner join score s2
on s2.s_id = s.s_id;
两种写法得到的结果是一样的,但写法1是比较古老的一种写法,看起来不够清晰,现在更建议采用写法2,这样无论inner join多少个表看起来都不会太乱。
11.oracle特有写法:where后面的字段写上(+)
(+)写在where后面,不能与 or/in 连用
--在等号右边字段的后面写上(+),是左外连接,s是主表,s2是附属表
select s.*,s2.*
from student s,score s2
where s.s_id = s2.s_id (+)
--在等号左边字段的后面写上(+),是右外连接,s2是主表,s是附属表
select s.*,s2.*
from student s,score s2
where s.s_id (+) = s2.s_id
关于使用(+)的一些注意事项:
(+)操作符只能出现在 WHERE 子句中,并且不能与 OUTER JOIN 语法同时使用。
当使用(+)操作符执行外连接时,如果在WHERE子句中包含有多个条件,则必须在所有条件中都包含(+)操作符。
(+)操作符只适用于列,而不能用在表达式上。
(+)操作符不能与 OR 和 IN 操作符一起使用。
(+)操作符只能用于实现左外连接和右外连接,而不能用于实现完全外连接。
12.mysql不支持full outer join
13.使用union和union all时需注意
使用union和union all必须保证各个select 集合的结果有相同个数的列,并且每个列的类型是一样的。 但列名则不一定需要相同,oracle会将第一个结果的列名作为结果集的列名。
14.mysql数据库不支持SELECT INTO语句,但支持INSERT INTO SELECT语句
15.sql约束
16.索引
17.null值,is null和is not null(在查询成绩的时候考虑一下null的意义)
18.常用函数