Oracle数据库与MySQL数据库总结
数据库(DataBase)就是数据(Data)的集合,数据就是描述事物的符号,用户可以通过这个集合进行增、删、改、查等操作,且可共享,并与应用程序独立的数据集合
常见名词:
数据库管理系统(DBMS)
数据库应用程序(DBAS)
数据库管理员(DBA)
完整的数据库包括:1.数据库 2.数据库管理系统
表之间的关系:
一对多:处理数据冗余,把外键添加到多方,再引用关联到一方的主键
一对一:特殊的一对多,外键可以在任意一方,只需把外键加上唯一约束
多对多:可以看成两个一对多
Mysql与Oracle主要区别
实例区别:
MySQL是轻量级数据库,开源免费,Oracle是收费的而且价格非常高
MySQL一个实例可以操作多个库,而Oracle一个实例只能对应一个库
MySQL安装安后300M而Oracle有3G左右
操作区别:
主键:MySQL一般使用自动增长类型,而Oracle则需要使用序列对象
单引号的处理:MySQL里可以用双引号包起字符串,Oracle里只可以用单引号包起字符串
分页的SQL语句:MySQL用limit,而Oracle需要使用内建视图和rownum伪列
事务处理:
MySQL默认是自动提交,可以通过 start transaction语句来开始执行事务
Commit提交 rollback 回滚 来手工确认对事务的处理
而Oracle默认不自动提交,需要用户TCL语言进行事务提交
MySQL不支持检查约束
Oracle的数据类型
MySQL中没有varchar2类型
SQL语言约束的作用
Oracle中的约束类型
MySQL中没有检查约束类型
SQL语言的分类
Oracle与MySQL中的增、删、改、查、基本语句都是相同的
1.DQL(数据查询语言)select语句
a.基本查询
b.带条件的查询(精确查找,模糊查找,范围查找...)
c.连接查询(等值连接,非等值连接,外连接:左外连接,右外连接,全外连接,自然连接,交叉
连接,内连接,自然连接...)
d.排序:order by
e.分组:group by
f.函数(单行函数/多行函数/(又称为组函数..))
g.子查询
2.DML(数据操作语言)
新增:insert语言
修改:update语句
删除:delete语句
3.DDL语句(数据定义语言)
创建:create语句
修改:alter语句
删除:drop语句
4.TCL(数据事务控制语言)
提交事务:commint语句
回滚事务:rollback语句
5.DCL(数据控制语言)
授权:grant语句
撤销:revoke语句
Oracle数据库默认端口号:1521,MySQL默认端口为:3306
select选择语句:列选择;(投影操作)
基本查询语句:
seclect +列名1,列名2... from +表名;
改表名:select +旧表名 as +新表名,(可操作多个表) from +来自哪个表中;
escape:转义字符,跟在like后面 'XX\_' escape '\';告诉查询语句,当前的'\'为转移字
符,后面跟的为具体的字符,转移符号可以是任意的
not:取反
逻辑条件:and or not
排序:order by 列名 [asc/desc]
查哪些数据,来自哪个表
行选择:(选择操作)
连接:(多表操作)
包含空值的算术表达式结算结果为空
什么是函数:
函数是数据库中提供的能够处理查询结果的方法
函数的作用:
1.执行数据结算
2.修改单个数据项
3.格式化显示日期和数字(本地语言环境)
4.转换列数据类型
5.函数有输入参数,并且总有一个返回值
单行函数:仅对单行做出运算,并且每行返回一个结果
单行函数包括
字符函数:接收字符输入,可以返回字符或数字之
数字函数:接收数字输入,返回数字值
日期函数:输入日期,转换为字符串
转换函数:从一个数据类型到另一个数据类型转换一个值
通用函数:
多行函数(聚合函数):可以操纵成组的行,每个行组给出一个结果,也被称为组函数
转换函数:(数据类型的转换:包含隐式转换和强制转换)
隐式转换(不推荐)
select '1'+1 from dual
select '1'||1 from dual
强制转换:使用转换函数对类型进行强制转换
to_char(num,format):num代表等待转换的数字,format:代表需要转换的格式
-9:代表一位数字(占位符号)
-0:代表一位数字,如果该位没有则强制显示0,小数点后面的也会强制显示
-$:代表美元符号
-L:代表本地货币符号
-.:代表小数点
-,:代表千分位符号
to_char(date,format):将日期转换为字符串
to_date(char,'fomat_model'):可以将字符串转换为日期类型
to_number:将字符转换为数字
函数嵌套:
单行函数能够被嵌套任意层次,嵌套函数的计算是从最里层到最外层
NVL(exp1,exp2)函数:转换一个空值到一个实际的值
exp1,exp2:可用的数据类型可以是日期、字符和数字,两个参数的数据类型必须匹配
exp1:是包含控制的源值或者表达式
exp2:是用于转换控制的目的值
NVL2(exp1,exp2,exp3)函数:NVL函数检查第一个表达式,如果第一个表达式不为空,那么NVL2函数返回第二个表达式;如果第一个表达式为空,那么第三个表达式返回
exp1:是可能包含空的源值或表达式
exp2:当exp1非空时的返回值
exp3:当exp1为空时的返回值
多表连接查询:主要解决目标数据分布在不同的表中(如果目标数据不在同一张表,可以通过多表连接查询来解决)
笛卡尔乘积(总记录数=A表的总记录*B表的总记录数),会出现大量的冗余数据........可以使用添加where子语句限制查询结果 从而避免笛卡尔乘积
多表查询的语法: select 表名1,列名1,表名2,列名2 ...from 表名1,表名2...where子语句
实现思路:先确定需要查询的列分布在哪些表中,再确定表之间的关联关系(主外键关联关系)
多表查询包括等值查询和非等值查询
一个用户查询请求涉及到多个表的时候,连接两个表的条件为=时,就是等值连接查询;其他的运算符连接的就是非等值查询。
自连接:表自身连接自身(代表父子关系/递归关系)
外连接:外连接是指查询出符合连接条件的数据同时还包含孤儿数据
孤儿数据:孤儿数据是指被连接的列的值为空的数据
左外(left [out] join):包含左表的孤儿数据(两种表分别是A表和B表相关联,使用左外连接查询以"左表为主",左边的表记录全部展现,右边的只展示与左边相关联的数据)
右外(right [out] join):包含右表的孤儿数据(两种表分别是A表和B表相关联,使用右外连接查询以"右表为主",右边的表记录将全部展现,左边只展示与右边相关联的数据)
全外(full [out] join):包含两个表中的孤儿数据(关联的两张表中的所有数据均会出现)
内连接取交集,外连接分左和右,左连接左边的全取,右连接右边的全取
内连接 inner join (join)
交叉连接 cross join 笛卡尔积 效率低
外连接 outer join (left join ,right join ,full join)
没有约束条件(没有where。。)时候,inner join 和 cross join 结果集一样
组函数/统计函数/多行函数/聚合函数
max(列名):求最大值
min(列名):求最小值
sum(列名):求和
avg(列名):求平均值
count(*):计算总数
count(expr):返回在列中有expr指定的非控制的总数
count(distinct expr):去重,在expr指定的列
count(列名):会忽略空值,count(*):不忽略空值
单行函数对查询到每个结果集做处理,而组函数只对分组数据做处理单行函数对每个结果集返回一个结果,而组函数对每个分组返回一个结果
avg和sum函数参数类型只能是数字
count/max/min参数类型可以是日期,字符和数字
组函数会默认忽略控制,可以在组函数中使用nvl来处理空值
group:查询分组的作用,显示每列不同组的数据
group by 列名1,列名2...
HAVING子语句:在分组函数中添加筛选条件
where子语句不允许在分组函数作为条件直接使用
子查询是一个select语句,他是嵌套在另一个select语句中的子句(把一个查询语句的结果当作条件查询)
1.子查询语句必须用括号括起来(区分优先级)且在主查询之前执行一次
2.若需要放在比较中,子查询放在比较条件的右边
3.子查询的结果被用于主查询
单行子查询:子查询语句只返回一行的查询(使用单行比较符)
多行子查询:子查询语句返回多行的查询(使用多行比较符)
新增语句:insert into 表名[列名1,列名2...] values(值1,值2..)
修改语句:
1.update 表名 set 列名1=值1,列名2=值2...where子句
2.update 表明 set 列名 = (子查询语句) where子句
删除语句:delete [from] 表名 where子句---->删除哪列或者表全删除
事务:(不可分割的逻辑执行单元,要么全部成功,要么全部失败)指作为单个逻辑工作单元执行的一系列操作,要么完全的执行,要么完全的不执行,事务主要是对DML语言进行控制
事务特性:
1.原子性 2.一致性 3.隔离性 4.持久性
事务提交:commit 事务的回滚: rollback
创建表:create table
视图是基于一个表或另一个视图的逻辑表,一个视图并不包含它自己的数据,像一个窗口,数据保存在"基"表
视图的优点
1.限制数据的访问,选择显示"基表"中的列
2.视图通过简单的查询返回复杂的结果
3.视图针对特别的用户和应用程序提供数据独立性
简单视图:数据来自一个表,不包含函数或数据分组,能通过视图执行DML操作
复杂视图:数据来自多个表,包含函数或数据分组,不允许通过视图进行DML操作
视图本身是一张逻辑表(虚拟表),可以进行DML操作
创建视图 create view 视图名 as select语句
只读视图: 添加 with read only
也可以通过可视化操作创建视图
删除视图:drop view 视图名
内建视图
内建视图由位于From子句中命名了别名的子查询创建(将一个查询语句的结果看作一张虚拟的表/视图,可以和其他表进行连接查询或执行子查询)
TOP—N 查询:查询排名
Rownum:伪列(行号):每个表都有默认的连续伪列值
Oracle分页查询的实现思路:在内建视图中通过rownum伪列的值来判断指定获取数据的数量
分页单位:每页展示数据的条数 当前页:展示的第几页
Oracle分页语句规律(反人类的Oracle):
select t1.* from (select t.*,rownum rn from 表名 t where rowunum <= 分页单位*当前页) t1 where t1.rn >= (当前页-1)*分页单位 and t1.rn <= 分页单位*当前页序列
MySQL中的分页语句规律实现思路: 使用limit关键字实现分页
MySQL中没有序列
Oracle数据库中序列是用户创建的数据库对象,序列会产生唯一的整数。序列的一个典型用途是创建一个主键的值,它对于每一行必须是唯一的
创建语法:使用 create sequence 序列名,默认缓存为20
特点1:默认没有值特点 2:序列名.nextval每执行自增1特点 3:序列名.currval查看当前序列的值
作用:作为主键使用
可以创建自定义序列且设置序列开始位置以及自增值
create sequence aa --创建序列 start with 5 --起始位置 increment by 2 --设置自增
删除序列:drop sequence 序列名
索引:类似于目录,作用:提升查询效率,但是对增/删/改效率有影响
索引分类:唯一索引/非唯一索引
唯一索引:当前在指定的裂伤添加了主键约束或唯一约束时,该列自动添加了唯一索引
非唯一索引:单行索引,复合索引(组合索引),函数索引
命名语法:create index 索引名 on 表名(列名)
特点:显示的创建,隐式的执行 注意:oracle会自动给表的主键创建索引
删除索引:drop index 索引名
三大范式
第一范式:保证列的原子性(字段不能再分)
第二范式:限制多对多(不存在局部依赖)
第三范式:限制一对多(不含传递依赖)
优点:结构合理,冗余较小,尽量避免插入删除修改异常 缺点:性能降低,多表查询比单表查询速度慢
数据库的设计应该根据当前情况和需求做出灵活的处理
特定表的设计可以违反第三范式,增加冗余提高性能
SQL语言执行顺序:select ---> from --->where ---> group by ---> having ---> order by