1、当前数据库的分类?什么是关系型数据库?什么是非关系型数据库?
**数据库的分类:**早期比较流行的数据库模型有三种,分别为:层次式数据库、网络式数据库和关系型数据库。
而在当今的互联网中,最常用的数据库模型主要是两种,即关系型数据库和非关系型数据库。
1. 什么是关系型数据库————二维表格
1) Mysql和Oracle数据库(关系型数据库),互联网运维最常用的是MySQL
2) 通过SQL结构化查询语句存储数据
3) 保持数据一致性方面很强,ACID理论
2.什么是非关系型数据库
1) NOSQL不是否定关系数据库,而是作为关系数据库的一个重要补充
2) NOSQL为了高性能、高并发而生,忽略影响高性能,高并发的功能
3) NOSQL典型产品memcached (纯内存),redis(持久化缓存),mongodb(文档的数据库)
2、select语句查询:根据业务需求写查询语句?
SELECT 语句用于从表中选取数据。
结果被存储在一个结果表中(称为结果集)。
3、Orale数据库中单引号和双引号的区别?
在Oracle数据库中,单引号’ '和双引号" "两者都是可以表示字符串的,但是在使用时会有所区别。
在双引号" "中,一般在如下场合使用
1.表示其内部的字符串严格区分大小写 (比如用作字段别名时区分大小写)
2.用于特殊字符或关键字 (比如包含空格,#或&时)
3.不受标识符规则限制
4.会被当成一个列来处理
5。当出现在to_char的格式字符串中时,双引号有特殊的作用,就是将非法的格式符包装起。
而在单引号’ '中,一般在如下场合使用
1.表示字符串常量 (比如用于条件限定时where=‘aa’,单引号用于条件限定时对大小写敏感)
2.字符串中的双引号仅仅当作一个字符串"处理,可以在单引号’ ‘中使用双引号"
3.如果字符串常量中包含了单引号’ ',那么需要使用两个单引号 ‘’ 表示一个单引号常量
4、查询语句中对于null的处理?运算表达式中null值的处理? mysql和oracle不太一样
查询语句中对于null的处理
SqlServer: isnull(字段,0)
oracle: nvl(字段,0)
access: iif(isnull(字段),0,字段)
mysql: ifnull(字段,0);
运算表达式中null值的处理
oracle中
1、使用nvl(expr1,expr2) 处理NULL值
解释该函数:nvl函数可以将expr1为空时,则返回expr2;不为空时,则返回expr1。
需要注意的是:参数expr1和expr2可以是任意数据类型,但二者的数据类型必须要匹配。
SELECT ename,sal,comm,sal+nvl(comm,0) AS ‘月收入’ FROM emp;
2、使用nvl2(expr1)处理NULL值
解释该函数:nvl2是Oracle9i新增加的函数,该函数也用于NULL。格式为NVL2(expr1,expr2,expr3)。如果expr不是null,则返回expr2;如果expr1为null,则返回expr3。
其中,expr1可以是任意数据类型,而expr2和expr3可以是除LONG之外的任何数据类型。同样需要注意的是,expr2和expr3的数据类型必须要和expr1的数据类型匹配。
SELECT ename,nvl2(comm,sal+comm,sal) FROM emp;
3、使用decode函数处理NULL
decode的语法结构如下:
decode (expression, search_1, result_1)
decode (expression, search_1, result_1, search_2, result_2)
decode (expression, search_1, result_1, search_2, result_2, …, search_n, result_n)
decode (expression, search_1, result_1, default)
decode (expression, search_1, result_1, search_2, result_2, default)
decode (expression, search_1, result_1, search_2, result_2, …, search_n, result_n, default)
其中呢,我们可以利用decode(字段或字段的运算,值1,值2,值3)该结构进行对null进行处理;当字段或字段的运算的值等于值1时,该函数返回值2,否则返回值3;当然值1,值2,值3也可以是表达式。
e.g:
SELECT ename,decode(comm,null,sal,comm+sal) FROM emp;
4、使用case语法
e.g:
select * from ywgl_user
order by (case username
when null then
‘李四’
else
username
end);
表示当ywglname为空时返回‘李四’,如果不为空则返回username。
MYSQL处理null
我们已经知道 MySQL 使用 SQL SELECT 命令及 WHERE 子句来读取数据表中的数据,但是当提供的查询条件字段为 NULL 时,该命令可能就无法正常工作。
为了处理这种情况,MySQL提供了三大运算符:
IS NULL: 当列的值是 NULL,此运算符返回 true。
IS NOT NULL: 当列的值不为 NULL, 运算符返回 true。
<=>: 比较操作符(不同于=运算符),当比较的的两个值为 NULL 时返回 true。
关于 NULL 的条件比较运算是比较特殊的。你不能使用 = NULL 或 != NULL 在列中查找 NULL 值 。
在 MySQL 中,NULL 值与任何其它值的比较(即使是 NULL)永远返回 false,即 NULL = NULL 返回false 。
MySQL 中处理 NULL 使用 IS NULL 和 IS NOT NULL 运算符。
5、distinct关键字的用法
distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用 它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。
distinct关键字用于剔除查询结果集中重复的内容;
记录重复的条件是:
查询结果中显示的所有的字段都一样才算是重复的记录
count计算不重复的记录
SELECT COUNT( DISTINCT player_id ) FROM task;
返回记录不同的id
SELECT DISTINCT player_id FROM task;
同时作用于两列
SELECT DISTINCT player_id, task_id FROM task;
6、查询结果集如何排序? asc/desc 多字段排序
ASC,升序
DESC,降序
ORDER BY,多列排序
7、mysql和oracle查询结果中字段拼接的方式? mysql使用concat函数进行拼接;Oracle 使用 || 进行拼接
Oracle
一、拼接字符串
1、使用“||”来拼接字符串:
select ‘拼接’||‘字符串’ as Str from student;
2、使用concat(param1,param2)函数实现:
select concat(‘拼接’,‘字符串’) as Str from student;
注:oracle的concat()方法只支持两个参数,如果拼接多个参数,可以嵌套concat():
select concat(concat(‘拼接’,‘字符串’),‘ab’) as Str from student;
MySQL
1、字符串的拼接
1.1 CONCAT(s1,s2,…)函数
返回连接参数产生的字符串,一个或多个待拼接的内容,任意一个为NULL则返回值为NULL。
SELECT CONCAT(‘现在的时间:’,NOW()); – 输出结果:现在的时间:2019-01-17 11:27:58
1.2 CONCAT_WS(x,s1,s2,…)函数
返回多个字符串拼接之后的字符串,每个字符串之间有一个x。
SELECT CONCAT_WS(’;’,‘pan_junbiao的博客’,‘KevinPan’,‘pan_junbiao’); – 输出结果:pan_junbiao的博客;KevinPan;pan_junbiao
8、数据库常用的函数:字符串函数、数值函数、日期函数;分别列举Mysql和Oracle的三者之间的转换函数?
to_char 将日期、数值转换为指定格式的字符串;
to_number 将字符串转换为数值类型;
to_date 将指定格式的字符串转换为日期类型;
9、Oracle的通用函数:nvl(重点掌握)、nvl2、case-when、decode函数;
nvl(expr,value) 如果expr表达式为null,则使用value值;(把null值专为指定的value值)
NVL2(expr1,expr2,expr3)
Oracle在NVL()的功能上扩展,提供了NVL2函数。
功能:oracle中常用函数,如果参数表达式expr1值为NULL,则NVL2()函数返回参数表达式expr3的值;如果参数表达式expr1值不为NULL,则NVL2()函数返回参数表达式expr2的值。
即:NVL2(表达式,不为空设值,为空设值)。
Case具有两种格式。简单Case函数和Case搜索函数。
简单Case函数格式:
CASE 列名
WHEN 条件值1 THEN 选项1
WHEN 条件值2 THEN 选项2
……
ELSE 默认值
END
Case搜索函数:
CASE
WHEN 条件1 THEN 选项1
WHEN 条件2 THEN 选项2
……
ELSE 默认值
END
decode函数:
语法:是case函数的switch-case方式的简写形式;
decode(字段或者表达式,匹配值1,返回值1,匹配值2,返回值2,匹配值n,返回值n,else返回值)
10、什么是外连接?有几种?【提示:左外连接、右外连接、全外连接】 笛卡尔连接也是外连接(不常用)
外连接连接的表之间是分主从关系的;分为主表和从表;
连接规则:
在等值连接条件下,从表去匹配主表,如果从表中没有可以匹配主表的记录,则使用 空的null 行进行匹配;
外连接分为:
左外连接:
左外连接连接条件的左侧的表示作为主表进行匹配,右侧作为从表,如果没有匹配记录则提供一个空行进行匹配;
右外连接:
右外连接是连接条件的右侧作为主表,左侧作为从表;
全外连接:
全外连接是将右外连接和左外连接的结果进行合并,并剔除重复的记录;
11、什么是等值连接?常用的等值连接有哪几种? 【where等值连接、join-on等值连接、自然等值连接、using等值连接】
等值连接是关系运算-连接运算的一种常用的连接方式。是条件连接(或称θ连接)在连接运算符为“=”号时,即θ=0时的一个特例。
(1) where等值连接
在where条件中使用 两个表中的连接字段进行等值条件过滤;
多表中的连接条件一般根据业务确定或者是有外键约束确定;
一般外键约束作为等值连接条件;
where等值连接的条件和其他的查询条件要使用 and 连接,不能使用or连接,为什么?
如果是三个以上的表进行连接则继续使用 and 连接关联条件即可;例如: a.fkid = b.fkid and b.fkid = c.fkid
(2) join on 等值连接
使用 join on 进行等值连接
(3) natural join 自然连接
使用自然连接,会将两个表中同名的字段进行等值连接;
自然连接要求两个表中的作为连接字段的名字要一样、数据类型要一致(或者可以进行等值匹配)
如果两个表中的有多个字段名字、数据类型相同,则默认使用多个字段进行等值连接,
并且在where条件中不能在连接字段上使用表名前缀;
查询显示的列表中*通配符和连接条件字段不能使用表前缀,其他字段可以;
(4) 使用using子句的等值连接
因为自然连接会默认使用所有的同名的字段作为连接条件,不够灵活;
可以使用using子句指明连接字段列表,使用逗号分隔,并且using指明的字段名不能带有表前缀;
查询显示的列表中*通配符和连接条件字段不能使用表前缀,其他字段可以;
(5) 自连接
一个表自己同自己的等值连接叫做自连接;
一般自连接发生在同一个表中的不同字段之间等值关联连接;
12、什么是不等值连接?举例说明
不等值连接
不等值连接是指连接条件不是等值运算,一般使用between and 作为连接运算条件;
select e.empno,e.ename,e.sal,s.grade
from emp e,salgrade s
where e.sal between s.losal and s.hisal;
13、什么是分组查询?分组函数【提示:count、sum、avg、max、min,注意:分组查询函数会自动过滤null值,可以使用nvl函数进行预处理】
分组查询就是使用分组字段将数据分成若干组,然后每一组再单独进行处理输出一个结果作为查询结果集中的一部分;
组函数:
组函数是多行函数,是处理多条数据记录,获取一个函数计算结果;
常用的组函数:
sum :求和
avg :平均
max :最大值
min :最小值
count :统计个数
注意:
1.分组函数处理时,会自动过滤null值;也就是,分组函数不处理null值;
2. 如果需要分组函数处理null则需要对字段使用 nvl函数进行预处理之后,在进行分组函数计算;
3.count() 表示统计个数,一般不适用 count(字段) 如果count函数中的字段为null则不计算入统计;
4.如果count使用 * 统计,则所有的记录都会进入统计;( 表示所有字段)
5.分组函数在显示字段中不能和其他非分组使用的字段进行一块显示;
14、如何进行分组查询?group by如何使用?什么是having语句,如何使用?
语法:
select 显示字段列表 from 被查询列表 where 查询过滤条件 group by 分组字段列表 having 分组过滤条件 order by 排序字段列表
解析:
group by 后面的字段是分组字段,做为分组标准
having 后面的过滤条件是对 group by 分组之后的各组数据的过滤处理;
having中的过滤条件中只能包含分组函数或者是分组字段列表中的字段;
显示字段类表在含有分组函数或者分组查询时,要求所显示的字段必须是分组函数结果、在分组字段列表中出现的字段
不能是其他的字段; 也就是显示字段来自于分组函数或者group by之后的分组字段列表;
补充:
含有分组查询的语句的解析过程:
(1) 先执行where条件过滤,获取要查询的集合;
(2) 使用group by对where过滤之后的集合按照分组字段列表进行分组,获取若干组数据;
(3) 使用 having 对group by 分组之后的若干组数据进行过滤处理;
(4) 如果现实字段列表中有分组函数,对 having过滤之后的若干组数据分进行组函数处理;
(5) 对(4)结果集合进行order by 排序显示;
原则:
如果有多个过滤条件,这些过滤条件优先在where中进行处理,可以提高查询效率;
能写在where中的过滤条件就不要写在having中;
15、分组查询需要注意的语法点:分组查询中select部分显示的字段,要么是分组函数要么是出现group by之后的字段;其他的字段不可以;
select A,B,C,count(D),sum(E)from table group by A,B,C。
除分组函数count(D),sum(E)外,字段A,B,C必须在group by中出现。
16、什么是子查询?exists关键字如何使用?
在查询语句中有使用了查询语句,就是子查询
EXISTS判定:
EXISTS后面跟随一个判定子查询,根据子查询的查询结果只做判定处理(子查询作为if判定条件)
判定标准:如果子查询结果不为空(查到了结果)则返回true;
然后主查询根据EXISTS子查询判定的结果,来决定当前这条数据记录是不是要包含在结果集中;
如果EXISTS子查询存在结果则返回true,与之对应的这条记录也放入查询结果中;
17、什么是多行子查询和单行子查询?【提示:单行子查询使用exists关键字;多行子查询使用:in、any、all、>、=、<】
子查询:
–将一个查询的结果作为另外一个查询的条件来使用
(特点:
–子查询在主查询前执行一次
–主查询使用子查询的结果)
多行子查询
–子查询的结果返回是 多行数据
–all:和子查询返回的所有值比较
–any:和子查询返回的任意一个值比较
–in :等于列表中的任何一个
单行单列子查询
可以使用的操作符:= > < >= <= <>
要求子查询返回的结果集必须是单行单列的结果集;
多行单列子查询
可以使用的操作符:in any all not
常用的组合:
in的使用:
in (子查询)
any all 可以和单行操作符进行搭配:
= any :等价于 in
> any :大于其中任何一个即可,等价于大于子查询结果集中的最小值;
< any :小于其中任何一个值即可;等价于小于子查询结果集中的最大值;
= all :如果子查询中有多个结果值,无意义
> all :大于其中所有的值即可,等价于大于子查询结果集中的最大值;
< all :小于其中所有的值即可,等价于小于子查询结果集中的最小值;
注意:
在where条件中使用的子查询的结果集都是单列的;
注意单行查询的结果集是空值的情况;(主查询没有结果)
可以使用nvl函数对子查询结果为null的情况进行处理。
18、rowid和rownum伪列对象的异同点?
rowid和rownum伪列对象 dual也是伪对象
在Oracle中有一些伪对象,Oracle提供的虚拟对象;(有很多)
rowid伪对象是Oracle为表中的每一条数据记录提供了一个用于唯一标识该记录的一个虚拟字段(18位16进制字符串)
rowid主要Oracle用于对于表中的数据修改删除操作时的标识作用(类似于主键的作用);
rownum 是Oracle为查询结果集提供的一个从1开始的标注结果集记录序号的伪对象;
注意,rownum只能从1开始,而且是根据查询结果集变化为变化的;
在查询条件中 rownum只能与 < <= = 操作符进行计算,不能与 > >= 进行计算;(为什么?)
使用rownnum以及子查询进行分页查询;
分页查询,就是给定页码和每页的记录数据,进行分页显示的一种查询方法;
19、常用的集合操作有哪些?
集合操作
UNION UNION ALL并集运算:
Union:两个查询结果集进行合并,剔除重复记录;
Union all :返回两个子查询结果集的合并之后的结果集,不剔除重复;
INTERSECT交集运算:
返回两个查询结果集中的重复的部分,剔除重复;(共同含有的部分,剔除重复)
MINUS 减集运算(补集运算)
A minus B 返回A中剔除A和B重复的部分之后剩余结果集;
注意:
集合操作要求进行操作的两个子查询的查询结果中的字段的个数和字段的数据类型、字段顺序要一一对应;
集合操作可以使用order by 进行排序,但是需要在两个子查询显示的列表中不能使用* ,需要将字段显式写出,
orderby中的字段可以使用任意一个子查询中的字段名;
20、Oracle和Mysql分页查询如何实现? 【Oracle:集合操作;rowid伪对象+子查询;Mysql:limit关键字】
分页查询
(1) rownum伪列+子查询方式
(2) rownum伪列+minus集合操作方式
21、delete与truncate的异同点?
作用都是用来删除数据的,truncate和 delete(不带条件,全表删除数据)只删除数据不删除表的结构,不同点如下。
1、truncate删除数据,但是不备份,删除后无法回滚;delete会备份,可以回滚
2、truncate删除非常快,删除之后,自增id从0开始统计;而delete删除慢,自增id继续累加
22.DML操作是受事务管理的;
DML : 数据操作语言,对表格中的数据进行操作,insert、update、delete。
事务管理是对于一系列数据库操作进行管理,一个事务包含一个或多个SQL语句,是逻辑管理的工作单元。
23.什么是事务?事务的特点?cadi
事务:是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合(工作逻辑单元);
事务的四大特性:
1 、原子性
事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做
2 、一致性
事 务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。
3 、隔离性
一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
4 、持续性
也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。
24、事务的隔离级别?常用的有4个隔离级别,每个隔离级别可能产生的问题? 顺序读是安全的。
数据库事务的隔离级别有4个,由低到高依次为Read uncommitted(未授权读取、读未提交)、Read committed(授权读取、读提交)、Repeatable read(可重复读取)、Serializable(序列化),这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。
25、常用的约束有哪些?非空约束(null)、唯一性约束、主键约束、外键约束、自定义check约束;
26.了解权限、角色、如何创建Oracle用户?如何赋予权限和剥夺权限?权限的传递性?
一、创建用户
语法[创建用户]: create user 用户名 identified by 口令[即密码];
例子: create user test identified by test;
1.对表增删改查授权
对用户授权,允许其具有对数据表user的更新和删除的操作权限:
GRANT UPDATE,DELETE ON user
TO member WITH GRANT OPTION –WITH GRANT OPTION表示该用户可以向其他用户授予他所拥有的权限;
2.对存储过程授权
对用户menber对存储过程user_income的授权
GRANT EXECUTE ON user_income TO member存储过程
2.禁止对表的授权
—–禁止member用户对数据表user的更新权限:
DENY UPDATE ON user
TO member CASCADE;
3.收回用户对表的权限
—–收回用户member对user表的删除权限:
REVOKE DELETE ON user
FROM member
27.什么视图?如何创建视图?视图和物理表之间有什么差异性?
1.1. 视图
1.1.1. 什么是视图
视图(VIEW)也被称作虚表,即虚拟的表,是一组数据的逻辑表示,其本质是对应于一条SELECT语句,结果集被赋予一个名字,即视图名字。
视图本身并不包含任何数据,它只包含映射到基表的一个查询语句,当基表数据发生变化,视图数据也随之变化。
创建视图的语法:
01.CREATE [OR REPLACE] VIEW view_name[(alias[, alias…])]
02.AS subquery ;
区别:1、视图是已经编译好的sql语句。而表不是
2、视图没有实际的物理记录。而表有。
3、表是内容,视图是窗口
4、表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时对它进行修改,但视图只能有创建的语句来修改
5、表是内模式,视图是外模式
6、视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构。
7、表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表。
8、视图的建立和删除只影响视图本身,不影响对应的基本表。
联系:视图(view)是在基本表之上建立的表,它的结构(即所定义的列)和内容(即所有数据行)都来自基本表,它依据基本表存在而存在。一个视图可以对应一个基本表,也可以对应多个基本表。视图是基本表的抽象和在逻辑意义上建立的新关系。
28、什么序列?
序列(SEQUENCE)是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字)。不占用磁盘空间,占用内存。
其主要用途是生成表的主键值,可以在插入语句中引用,也可以通过查询检查当前值,或使序列增至下一个值。
29、什么是索引?索引的作用?索引在什么情况下可以使用?什么情况下不建议使用?
索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,相 当于图书上的目录,可以加快查询速度,但会使修改、插入、删除操作变慢,同时还会 占用较大的磁盘空间 。
可以通过explain语句对SQL语句进行分析,来决定哪些字段需要创建索引,一般情 况下,可得出以下结论:
必须创建索引的情况:
1.where子句、group子句中出现的字段,要创建索引
2.order by子句的字段,要创建索引
3.统计聚合函数中的字段,要创建索引。比如count(字段) 、max(字段)
不需要创建索引的情况:
1.如果需要取到表中所有记录,则没必要创建索引
2.对非唯一有大量重复值的字段,没必要创建索引,如性别
3.经常进行修改、删除等操作的字段,没必要创建索引
4.记录比较少的表,没必要创建索引
30、什么是存储过程?什么是函数?有什么异同点? 参数的类型有哪些?【提示:out、in、inout三种类型】【视能力掌握】
存储过程是pl编程中一段可以独立执行的程序代码,可以传递参数;
函数是pl编程中的可以独立执行的一段程序代码,可以传递参数;
存储过程和函数区别:
存储过程没有返回值;
函数可以有返回值;
传递的参数有三种类型:
in类型:默认的;
只能从外往里传值;
out类型:
只能从里往外传值;
in out类型:
可以从里往外传值也可以从外往里传值;
31、什么是触发器?什么是游标?如何使用?【视能力掌握】
触发器就是按照条件在一定的时机下自动执行的某种动作处理;
触发器就是定时按条件触发的动作行为;
游标:是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力。可以把游标当作一个指针,它可以指定结果中的任何位置,然后允许用户对指定位置的数据进行处理。
如何使用?
1、定义游标
CURSOR emp_cursor IS
SELECT first_name,salary
FROM employees WHERE department_id=60;
– 定义变量
emp_record emp_cursor%rowtype;
— 主体
BEGIN
– 2、打开游标
OPEN emp_cursor;
– 3、提取游标
LOOP
– fetch 游标名 into 变量列表 表示将游标中的一行数据 对应赋值给 变量列表中的变量
— 注意 into 后面的变量列表需要和游标中的子查询中的显示的字段列表一一对应
FETCH emp_cursor INTO emp_record;
EXIT WHEN emp_cursor%NOTFOUND;
– 输出
DBMS_OUTPUT.PUT_LINE(emp_record.first_name||‘的薪水是’||emp_record.salary);
END LOOP;
– 4、关闭游标
CLOSE emp_cursor;
END;
32、Oracle和Mysql数据库如何使用主键字段值自增?【Oracle:序列+触发器(还有其他方式);Mysql:自增属性】
MySql
在mysql中,如果把表的主键设为auto_increment类型,数据库就会自动为主键赋值。
Oracle
--------------使用序列和触发器实现主键字段自增(要求必须掌握)--------------------
— 使用序列和触发器实现主键字段自增(要求必须掌握)
— 创建表
create table dept100 as select * from dept where 1=2;
– 查询表
select d.dept_id,
d.dept_name,
d.manager_id,
d.location_id from dept100 d;
— 创建自增主键字段的序列
create sequence seq_dept100_deptId
–start with 1 — 起始值 默认为 1
–increment by 1 — 自增步长 默认步长为1
–nomaxvalue — 没有最大值 默认为nomaxvalue
–nocycle — 不循环 默认为 nocycle
–nocache — 不使用缓存 默认为 nocache
— 创建自增主键字段的触发器
create or replace trigger trigger_dept100_deptId
before insert on dept100
for each row
begin
– 使用new伪对象,在插入之前将序列提供的值 赋值给表 dept100的主键字段
select seq_dept100_deptId.nextval into :new.dept_id from dual;
end;
— 测试数据
insert into dept100(dept_name,manager_id,location_id) values(‘IT’,100,10);
commit;
insert into dept100(dept_name,manager_id,location_id) values(‘SALE’,101,11);
commit;
– 删除一条记录
delete from dept100 where dept_id = 2;
commit;
– 再次插入
insert into dept100(dept_name,manager_id,location_id) values(‘SALE’,101,11);
commit;
--------------创建用户并赋予权限-------------------------
– 创建用户
create user yuw2019 identified by oracle;
– 赋予用户对应的权限(角色)
grant connect,resource to yuw2019;
----- ★★★★★★★★★★ ---------------
33、备份与还原?
Oracle数据库备份
逻辑备份:
使用imp/exp命令进行备份;
需要在dos命令窗口下执行;
使用plsql客户端工具进行备份;
注意:
使用哪种方式进行导出备份的,需要使用与之对应的方式进行导入恢复;
34、你在项目中有没有做过数据库可以做哪些优化?【Oracle和Mysql分别说明】【一定要提前准备整理】★★★
1.SQL语句尽量用大写的
因为oracle总是先解析SQL语句,把小写的字母转换成大写的再执行。
2.使用表的别名
当在SQL语句中连接多个表时, 尽量使用表的别名并把别名前缀于每个列上。这样一来,就可以减少解析的时间并减少那些由列歧义引起的语法错误。
3.选择最有效率的表名顺序(只在基于规则的优化器中有效)
ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表也称为驱动表,driving table)将被最先处理,在FROM子句中包含多个表的情况下,必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表。
4.Where子句后面的条件过滤有讲究
ORACLE对where子句后面的条件过滤是自下向上,从右向左扫描的,所以和From子句一样一样的,把过滤条件排个序,按过滤数据的大小,自然就是可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾最下面,最右边,依次类推。
5.在select的时候少用*
多敲敲键盘,写上字段名吧,因为ORACLE的查询器会把*转换为表的全部列名,这个会浪费时间的,所以在大表中少用。
6.使用rowid
7.减少对数据库表的查询
ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等,所以少一次访问就能提高更高的效率。
8.使用DECODE函数来减少处理时间
使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表.
使用方法:https://www.cnblogs.com/ghzjm/p/9517127.html
9.整合简单,无关联的数据库访问
如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系)
10.删除重复记录
最高效的删除重复记录方法 。。。。
摘抄地址,内容太多了
35、什么是范式?经常用的有哪些范式?
范式的含义:
符合某种级别的关系模式的集合。表示一个关系内部的各属性之间联系的合理化程度。可以理解为:数据表的表结构所符合的某种设计标准的级别。
第一范式:是对关系模式的基本要求。不满足第一范式的关系,不能称为关系型数据库。符合第一范式的关系,每个属性都不可以再分割。
但是如果仅仅满足第一范式:仍然存在数据冗余过大、插入异常、删除异常、修改异常等的问题。
第二范式:建立在第一范式的基础上,首先满足第一范式。
消除了非主属性对码的部分函数依赖。
概念解析:
函数依赖,在一张表中,属性x(可能为一个属性也可能为一个属性组)确定的情况下,Y的取值必定可以确定。我们就说Y依赖于X。跟y=f(x)的关系很相似。
衍生三个函数依赖 的概念:
完全函数依赖,部分函数依赖,传递函数依赖。
属性Y依赖于属性X。X可能为一个属性或者一个属性组。
摘抄地址
36、数据库死锁?加锁粒度?
数据库中常见的死锁原因与解决方案有:
- 事务之间对资源访问顺序的交替
- 并发修改同一记录
- 索引不当导致的死锁
摘抄地址