oracle基础笔记
查看所有表:
Select table_name from user_tables;
删除表的记录:
Delete 表名 (where 条件)
删除表结构:
Drop table 表名
向表中插入数据:
Insert into 表名(字段1,…字段n) values();
创建序列:
Create sequence 序列名称;
向表中添加序列机制:
Insert into 表名 values(序列名称.nextval);nextval代表下一个值.
更新列的值:
update 表名 set 字段值=值;
更新表字段属性:
alter table 表名 modify ( 字段 number(3) not null)
==============================================================================
DDL:定义语言,表结构。表结构的对象在操作数据库时都要加上table字段. alter 为DDL语句.
DML:操作语言,删增。不需要加table字段.
DQL:查询语言,select
列别名:as关键字
Null:无穷大,不占空间。任何值跟null比较结构都是不确定,所以不会返回任何结果!!
而 = null 、<> null 的判断结果,仍然是不可知,不确定,所以 不会返回任何结果。
处理空值:nvl函数,nvl(p1,p2)如果p1是空值,则返回p2
消除重复行:distinct,对整条记录的去重。Distinct放在要去重行字段的前面!
ALL,AND,ANY:
Update:表数据更新:update 表名 set 字段值=参数 where 条件
Between..and…闭区间,表示一个范围。
In(val1,val2,val3…valn)等价于or
单引号和双引号:
双引号一般是用来转义的,如果alias里面有空格或其它保留符号,必须使用双引号。
单引号是用来特制的,比如字符串的引用,日期字符串的引用,都必须包括在单引号中,可以参与运算或其它表达式中。
两者不可混用,其中,两个单引号可以作为单引号的转义使用,意思就是一个真正的、没有特殊功能的单引号。例如 select substr('I''am a pig',1,4)。
Like:像,
%:0或者多个字符
_:任意单个字符
Where子句后面不能跟select后面定义的列别名。
判断某值是否为空用isnull,因为null代表未知。
Exists:判断是否存在结果。(与In类似)
等于标示符:=和<>
不等于标示符:!=和^=
In的用法:
In(a,b,c):与其中任意一个比较相等就行!相当于any.
当子查询的返回结果中包含有null值,对于not in(<>all)来说,select语句不会返回任何结果。因为任何跟null比较,结果都不是true。
Not in(a,b,c):与所有的都进行比较,相当于all.
Truncate和delete的区别:
Truncate :恢复创表时候的空间,先释放空间,再清空数据。不能回滚,快,彻底删除。
Delete:不释放空间,清空数据。可以回滚,慢,需要回滚备份。只是清空数据。
只有在对表的结构进行操作的语句会加上table,比如truncate table Test
只对数据进行操作的语句不能加table,比如delete Test.
ASC:升序,null在最后(最大)
Desc:降序
Select语句执行顺序:
1 from 选择表
2 where 条件判断
3 grou by 分组
4 having 分组过滤
5 select 查询结构
6 order by 排序
语法顺序:
Select * from 表名
Where 条件
Group by 分组的行
Having 过滤(组函数或者group by后面的字段)
Order by 排序
where (unix_host,create_date):主查询的where条件中可以用多个列进行过滤,称之为多列子查询。
Number(m,n):m:能填的整数位,n:小数后面的位置
Round():四舍五入函数,
Trunc:截取函数.
日期:sysdate.系统函数,返回当前系统时间。
修改SQL运行环境的日期格式:
Alter session set nls_date_format=’yyyy mm dd hh24:mi:ss’;
Session是SQL语句的运行环境。
缺省日期格式:DD-MON-RR
环境(session)修改的时候,所有SQL语句都将不一样。
To_date()函数:将字符串转换成日期,用指定格式存入:
to_date('2010-10-22','yyyy:mm:dd');
to_char()函数,按指定格式读取,返回类型是Varchar2.其他类型转字符型.
To_number(M,’N’):将字符串N转换为数值类型.
Fm:去掉空格以及前导0.
字符类型定义:
Char():定义长度存,对空格不敏感,定义的时候可以不定义长度,缺省为1,最大2000字节。
Char(10):不管写几个都是占10个空间。
Varchar2():实际长度存入(变长),对空格敏感,必须定义长度,最大4000字节.
Varchar(10):写3个字符只占3个空间.
当前环境改变:
地区区域:Alter session set nls_territory=’China’
语言:Alter session set nls_language=’语言类型’
日期:Alter session set nls_date_format=’yyyy-MM-dd’
两大函数:
Case…when:从上到下,其中一个when满足就马上退出.
Case when 条件 1 then return 1
When 条件 2 then return2
….
When 条件n then return n
Else 其他语句
End;
Decode函数:如果value等于if1,则结果为then1,如果都不等,返回else.
Decode(value,if1,then 1,
If2,then 2,
…
Ifn,then n,
Else);
组函数:
Avg 平均值,sum 求和,:主要number类型
count 总数,max 最大,min 最 小:任何类型
处理null的时候,count返回0,其他的返回null
Group by:分组,让相同值成为一行.
没有Group by的时候,select后面跟组函数,其他的也必须是组函数。
有Group by的情况下,select后面可以跟group by后面跟的表达式。
Having 对组进行过滤(分组):
Where与having的区别:
1 where后面可以跟任意列名,单行函数,不能跟组函数。
2 having后面只能跟group by后面的表达式或组函数。
3 where子句执行在having子句前。
4 都不能使用列别名。
非关联子查询:
Select 数据1…数据n
From 表名
Where(select 数据 from 表名);
1 先执行子查询,子查询的结果作为主查询的条件,再执行主查询。
2 子查询只执行一遍。
3 若子查询返回多个值,系统会自动去重,结果返回给主查询。
4 若子查询的返回结果仅为一个值,可以用单值运算符。
5 若返回的结果为多值,必须用多值运算符(in)。
6 若子查询返回null,整个查询不会返回任何行。
数据类型定义比较:
Varchar2:一定定义宽度,如varchar(20);
Char number:可以定义,也可以不定义宽度,如number(10)或number();
Date:一定不能定义宽度,用环境变量修改格式宽度。
关联子查询:
要在子查询里面访问主查询的信息。
主查询-ßà子查询
1 先执行主查询,返回结果A
2 将A传入子查询,执行计算结果B(执行子查询)
3 将B返回给主查询,若B成立,则打印结果,若B不成立,则重新步骤1,2,3.
4 主查询里面的所有记录都会判断一遍。
多表查询:
3大范式:
第一范式:表里面的数据不能一样。
第二范式:非主属性不能依赖于另一个非主属性。
第三范式:非主属性依赖于主属性(必须)。
交叉连接:笛卡尔积,m*n
内连接:
定义:一种表的连接,条件为on t1.c1=t2.c2,如果c1与c2匹配,那么t1和t2的该记录组合
起来,作为结果集的一条记录。
join…on 限制条件1 and 限制条件2
On后面跟一个,其余用and连接
先and过滤再on匹配
自连接:通过给表起别名处理同一张表的不同列的相同含义的关系比较。
account a1 join account a2
a1.id=a2.recommenderId
同一张表不同列的比较(不同列的取值有相同的含义);
外连接:
一个都不能少(驱动表:基表,每一条记录都要检查一遍)
From t1 left/right/full join t2
Left:左边的表必须做驱动表
Right:右边的表必须做驱动表
Full:左边右边都做驱动表
外连接与内连接的区别:
外连接结果集=内连接结果集+匹配不上的记录和null记录(t2结构)的组合。
Select * from table join table2
On t1.c1=t2.c2 :过滤在外连接之前
And 条件1
Where 条件2 and 条件3 :执行在外连接之后
总结:
交叉连接:解决笛卡尔积问题。
内连接:解决匹配问题
外连接:解决不匹配问题,表的所有记录都出现在结果集。
排名分页问题 Rownum
Rownum :是在获取每行之后才赋予的,只有前面的rownum在结果集里面才能打印出后面的分页。
只能小于不能大于
Rownum<=5 可以
Rownum=5 不可以,因为只能从1开始数。
查询第四到第六条记录:
select rn,id,real_name,create_date
from
(select rownum rn,id,real_name,create_date from account
where rownum <= 6)
where rn >= 4;
把rownum作为列并取列别名,查询的时候,直接对列别名进行where条件选择!
伪列:数据库术语,指的是在物理上这个列并不存在,只是在查询时才构造出来。伪列通常是自由分配的,用户无法执行修改等操作。
约束:
UK: 列级:constraint UK名 unique 表级:constraint UK名 unique(c1,c2…cn);
主键PK:唯一性+非空, 列级:constraint pk名 primary key,
表级:constraint pk名 primary key(cn)
联合主键:constraint pk名 primary key(c1,c2,…cn)
外键FK:列级:constraint fk名 references parent(父表PK或UK);
表级:constraint fk名 foreign key(c2) references parent(父表字段);
联合主键:多条列联在一起保证唯一.
非空:not null
唯一性约束:Uk,不允许重复,但可为空,
PK=UK+not null
外键(FK)约束:一对多,“删字表,插父表”。
解决一对多问题。如一个客户(唯一的帐务帐号ID)可以开通多个远程登录业务(多个业务帐号ID);
表级约束形式定义外键时用foreign key.
References:表示引用父表中的某列。列级约束形式时候可以用。
c2 number references parent(c1)
一张表中只能有一个主键约束,其他约束没有这个限制。
1 先建父表
2要引用的列必须唯一(PK或UK)
3 后建子表
4 删除的时候先删子表,后删父表。
插入数据的时候,先插入父表要引用的列.
insert into parent(c1) values (n);
insert into child values (1,n);子表里面的n值要与父表中的值相同.
原理:通过FK与同一张表(父表)的PK或UK建立引用关系.
也可以与不同父表的PK或UK建立引用关系.
FK的取值 必须匹配父表中已有的值或空值。
级联删除:on delete cascade,删除父表记录前,先删除字表里的相关记录,创建表的时候用。
On delete set null:删除父表前,先将子表外键列的值置空。
父表的PK=子表的FK
约束总结:
1 命名时,若用户未命名约束,系统会自动命名.
2 何时创建约束:a,创建表时定义约束,b,表存在,用alter table追加约束!
3 分表级约束和列级约束。
事务
transaction:是改变数据库数据的最小逻辑单元。
4大特性:
原子性,一致性,隔离性,永久性。
保留点(savepoint):回滚的时候回到标记点。
数据库对象:
视图(view):相当于windows中的快捷方式.
特点:不存储数据,不占空间。相当于一条select语句。
索引(index):只能创建,不能看。
Create index 索引名 on 表名
意义:a,通过rowid快速查找。b,有效降低读取数据块的数量。
需要用到索引的列:PK,FK,UK,即经常需要排序和分组的列。Where子句中的列。
索引的重点:重点在创建,创建在什么列,对表的增删改查没影响,查找的时候会提高select效率。
序列号(sequence):
解决PK和UK的值的唯一性.通过sequence获得唯一值.
定义:按照预定模式自动生成整数的一种机制,保证数字的自动增长.