数据库简介:
数据库分类
关系型数据库模型:
优点:易于维护,可以实现复杂的查询
缺点:海量数据 读取写入性能差,高并发下数据库的io是瓶颈
是把复杂的数据结构归结为简单的二元关系(即二维表格形式)。在关系型数据库中,对数据的操作几乎全建立在一个或多个关系表格上,通过对这些关联的表格分类、合并、连接或选取等运算来实现数据库的管理。
非关系型数据库模型:
包含键值存储数据库、列存储数据库(行存储数据库就是关系型数据库)、面向文档数据库、图形数据库(Neo4j)等。
常用列存储数据库:Cassandra。
文档数据库:存储的是文档结构的数据,json、xml等,常用的文档数据库:MongoDB
oracle连接工具:
提高了sqlplus连接数据库,帮助文档:sqlplus-help
示例:sqlplus usernmae/password@127.0.0.1:1521/orcl
orcl是远程数据库服务名,不是数据库名
SID:标识数据库的一个实例,一般一个数据库对应一个实例(集群时一个数据库可以有多个实例)
SERVICE_NAME:服务名,对应的是一个数据库。
配置tnsname.ora时,可以用SERVICE_NAME(建议用),也可以用SID
PostgreSql连接工具:
自带连接工具-psql
psql时它的一个命令行交互式客户端工具,类似于Orcale的命令行工具sqlplus。
接入PostgreSQL数据库:psql -h IP地址 -p 端口 -U 数据库名
例:psql -h localhost -p 5432 -U postgres
postgresql自带图形化客户端工具-pgAdmin(通过浏览器访问、对浏览器有要求)Chrome 72+、Firefox 65+、Edge 44+、Safari 12+
第三方连接工具-Navicat for PostgreSQL
常用的SQL/函数
关于表连接:
左连接 left-join:
以左表的记录为基础的,左表的记录将会全部表示出来,而右边只会显示符合搜索条件的记录。右表记录不足的地方均为NULL。
右连接 right-join:
以右表的记录为基础的,右表的记录将会全部表示出来,而左边只会显示符合搜索条件的记录。左表记录不足的地方均为NULL。
全连接 full-join:
左表和右表都不做限制,所有记录都显示,两表不足的地方用null填充。
内连接 inner-join:
两表都限制,两表都有的数据才显示。
等值连接:
group by、having用法:
group by对查询的结果进行分组,相同组合的分组条件在结果集中只显示一行记录。使用group by从句时候,通过添加聚合函数(COUNT()、SUM、MAX()、MIN()等)可以使数据聚合。
having是在分组的结果的基础上过滤,和where不一样,where是在分组之前的过滤
union 和 union all的用法:
union对两个结果集取并集不包含重复结果同时进行默认规则的排序。而union all对两个结果集去并集,包括重复行,不进行排序。
union需要进行重复值扫描,效率低,如果没有要删除重复行,应该使用union all。
with子句的用法:
使用SQL with子句的优点:
增加了SQL的易读性,如果构造了多个子查询,结果会更清晰。更重要的是:“一次分析,多次使用”。当在一个sql语句中需要多次使用到某个子查询的结果的时候,可以提升sql语句的性能。
分析函数:
是以一定的方法在一个与当前行相关的结果子集中进行计算,也成为窗口函数。
例如聚集函数有:avg、count、min、max、sum等等
字符函数有:concat(str1,str2)字符串拼接函数、length(str)返回表达式中的字符数、lower(str)将字符串转换为小写、upper(str)将字符串转换为大写、nvl(x,value)如果x为null则返回value否则返回x值本身、replace(x,search_string,replace_string)从字符串x中搜搜search_string字符串,用replace字符串替换
数值函数有:abs(value)返回绝对值、ceil(value)返回大于等于value的最小整数、floor(value)返回小于等于value的最大整数、round(value,n)对value四舍五入,保存小数点右侧的n位。
oracle、postgresql常用函数差异:
Oracle创建编写sql时,默认大写,没有使用双引号对表面和列明进行限定的时候,表名不论是大小写,最后都默认成大写。
postgresql创建表和字段时对大小写敏感,编写sql默认小写,如果表面、字段名要大写需要使用双引号。
常见语句差异:
-decode
oracle中:decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值)
postgresql:CASE WHEN condition1 THEN result1
WHEN condistion2 THEN result2
...
WHEN condistionN THEN resultN
ELSE default_result
END
-merge into
(-用的很少)
分页:
rownum :
是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列。
它总是从1开始排起,所以选出的结果不可能跳过1,而有其他大于1的值。
rownum仅仅针对新的结果集动态标记,而排序并不会产生新的结果集。
limit:
select * from persons limit A offset B;
A就是需要多少行,B就是查询的起点位置。