1. desc interface.lab_record;
2. 日期必须要放入单引号中,并且必须是指定格式
但是一般用to_char(hire_date) 转化
如下 select * from A where to_char(hire_date,’yyyy-mm-dd’) =’1990-09-08’
3. or语句影响查询性能的问题:
select a.MemberID,a.MemberName,a.MemberPhone
from Member a,Member_Tmep b
where (a.MemberName = b.MemberName or a.MemberPhone = b.MemberPhone) and a.MemberID <> b.MemberID
查询语句中出现了or语句,此时将导致引擎放弃索引而进行全表搜索,此时应该改用union或者unionall 。
使用union 会在输出结果前自动排序并且去重,
使用unionall不会去重,但效率要高于union,具体使用哪个应该具体分析。
select a.MemberID,a.MemberName,a.MemberPhone
from Member a
inner join Member_Tmep b on a.MemberName = b.MemberName and a.MemberID <> b.MemberID
union
select a.MemberID,a.MemberName,a.MemberPhone
from Member a
inner join Member_Tmep b on a.MemberPhone = b.MemberPhone and a.MemberID <> b.MemberID
4. 使用or或者in, not in 都会导致全表搜索,应该用between....and union union all代替,并且在查询语句中建立索引。
5.如下的情况会导致表的搜索不走索引,走全表搜索:
5.1 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,
如:select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from twhere num=0
5.2 应尽量避免在 where 子句中使用
!= ,<>, or, in, not in ,like ‘%a%’,
以上说的那些sql优化对于
select 索引A where索引A =‘’(此种情况全走索引)
中不起作用,如果select加了非索引列,
Select 索引A,索引B where 索引A=‘’
以上sql优化才起作用。1.where中不能有or, in ,not in ,!=,<>,前%,is null ,is not null, =前对索引进行函数操作,where 子句中对字段进行表达式操作,还有*操作
谨慎:select id from t where num=10 or num=20 (改为union all)
select id from t where num in(1,2,3)(改为between.....and ....)
5.3 不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
5.4 在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
5.5 采用exist代替in语句
select num from a where num in(select num from b) 用下面的语句替换:
select num from a whereexists(select 1 from b where num=a.num)
5.6 varchar的执行效率要高于nvarchar的执行效率。
两个不同表中,一个采用varchar,另一个采用nvarchar同样是select* from table
查看执行计划rows,byte,cost和time
采用varchar的在rows,byte都大于nvarchar的情况下,cost和time都小于nvarchar的情况
7.内连接和外连接:
内连接: 合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行
外连接: 两个表在连接过程中除了返回满足连接条件的行以外还返回左(或右)表中不满足条件的行 ,这种连接称为左(或右) 外连接。没有匹配的行时, 结果表中相应的列为空(NULL).
8. .cont(*)表中记录总数,count(某一列) 表中某一列不为空的总数
9. 组函数是忽略空值的,可以用avg(nvl(commission_pct, 0))使其不能忽略空值;
10. Count(distinct id)
11. 在SELECT 列表中所有未包含在组函数中的列都应该包含在 GROUP BY 子句中。 SELECT department_id, COUNT(last_name) FROM employees; 这句不合法!
12. 不能在where字句中使用组函数,可以再having中使用组函数对其尽心过滤
13. ddl不可以回滚,操作直接提交,只有数据增删改才可以回滚。
14. drop table 直接删除表 ddl 不可回滚
truncate table 清空表中数据 ddl操作不可以混滚
delete from 清除数据,可以加条件 dml操作可以回滚
15 ① insert into table() values()
②insert into tables select * from table where ******
16 .数据库事务:
①COMMIT 或 ROLLBACK 语句 rollback to savepoint a
②DDL 语句(自动提交)
③用户会话正常结束
④系统异常终止
17.数据库事务的自动提交在以下情况中执行:
①DDL 语句。(关于表结构,列,alter table )
②DCL 语句。
③不使用 COMMIT 或 ROLLBACK 语句提交或回滚,正常结束会话。
· DML(data manipulation language)数据操纵语言:
就是我们最经常用到的 SELECT、UPDATE、INSERT、DELETE。 主要用来对数据库的数据进行一些操作。
· DDL(data definition language)数据库定义语言:
其实就是我们在创建表的时候用到的一些sql,比如说:CREATE、ALTER、DROP等。DDL主要是用在定义或改变表的结构,数据类型,表之间的链接和约束等初始化工作上
· DCL(Data Control Language)数据库控制语言:
是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句。这个比较少用到
18. oracle 数据的五大约束
① NOT NULL
②UNIQUE
③PRIMARY KEY
④FOREIGN KEY
⑤CHECK
19 oracle 视图
为什么要有视图?①控制数据访问(安全性)②简化查询③避免重复访问相同的数据。
20.序列:可供多个用户用来产生唯一数值的数据库对象
Create sequence name increament by ...start with *** maxvalue***
Insert into employee(id,salary) values(name.nextVal,1000)
Name.nextval 需要在 name.currval 之前调用
21. 什么时候不需要建立索引?
①数据量大于2%~4% ②需要频繁跟新 ③列不经常作为连接条件出现在where字句中
22. union, union all, intersect(交集),minus(差集)
23. 相关子查询 非相关子查询
相关子查询:相关子查询按照一行接一行的顺序执行,主查询的每一行都执行一次子查询
Select * from talbe a Where *******(select * from talbe b where b.id=a.id)
非相关子查询:子查询只执行一次
where salary>(select salary from employees where last_name=’Abel’)
24. exsits 操作符 检查在子查询中是否存在满足条件的行 not exists走索引!!!!
①如果存在满足条件的行,返回true,不再继续查找
②如果不满足存在条件的行,返回false,继续查找
表结构方面的优化:
一、尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。
二、尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。
三、、尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。