数据类型
int :整数型
number(m,n) : m :总长度,n小数点后面的位数
number(m) :整数位 ,没有小数
number :默认是最大值 。
字符串类型
char (m) :m :长度 ,字节 一个汉字两个字节 。
2000
varchar2(m)
4000
日期类型
date :日 月 年 。
添加
insert into 表名 (列名,列名) values (值,值) ;
删除
delete from 表名 where 条件 ;
修改
update 表名 set 列名 = 值 where 条件 ;
查询
select * from 表名 ;
SQL :数据结构查询语言
1.DDL:数据定义语言
以create alter drop 开头的
修改表
alter table 表名 add 列名 数据类型 ;
alter table 表名 drop column 列名 ;
2.DML :数据操作语言
以 insert delete update 开头的语句 。
3.DCL:数据控制语言
grant revoke
4.DQL :数据查询语言 select
5.事务性控制命令
commit rollback
编写规则:
1.表名 列名 关键字 不区分大小写
2.where后面条件的值需要区分大小写 。
运算符
算数运算符
比较运算符
逻辑运算符
any :一些
> any 大于最小的。
< any 小于最大的。
> all :大于最大的。
< all :小于最小的。
between and 在什么 之间 。 数字,日期 。
in 在列表里面 。in('a','b','c') ;
like :模糊查询
% :任意长度的任意字符串
_ :一个长度的任意字符串。
not 取反
distinct 过滤重复数据
distinct * 表示的是所有列都重复才进行过滤 。
as :别名 给列起别名 可以省略
单行函数
upper :小写转大写
lower :大写转小写。
ltrim :去掉字符串左右两边空格
rtrim
trim
concat :连接两个字符串
abs :取绝对值 。
floor :向下取整
ceil :向上取整
sysdate :数据库系统当前时间
to_char :日期和字符串之间进行互相转换 。转换的时候需要指定格式 。
to_date
聚合函数
count :统计有效数据的数量
count(*) :统计这个表的行数
count(列名) :统计这一列的有效数据,不包含空值 。
max :求最大值
min :求最小值
avg :求平均值,但是只能用在数字列。
sum :求和 只能用在数字列上
group by 分组 。把内容相同的分为一组 。
当查询中出现了group by 分组的时候,select 显示额列,要么是group by 分组列,要么是聚合函数列。
对分组之后的数据进行二次过滤,需要使用having
where 后面不能跟聚合函数 。
select deptno ,count(*) from emp group by deptno
多表查询
1.from后面跟上多个表名 ,用逗号隔开 。
2.需要多个表之间有相同意义的字段。
select * from emp , dept where emp.depnto = dept.d_id ;
在emp表中有的,在dept表中也存在的才查询出来 。
两个表中都存在的才查询出来,称之为内连接 。
外连接 :需要以一张表基表 ,基表的数据会全部显示 ,并且显示与另外一张表匹配的内容 ,若存在不匹配的内容,用空格填充 。
1.左外连接
left join on
2.右外连接
right join on
左外连接写的sql ,也可以使用右外连接来改写 。
表名换一下,将left 换成right 就可以了
在oracle中针对外连接有一种特有的写法 。使用(+)
(+ )在哪个表后面表示哪个表是匹配表 。
3.全外连接
其实就是现实两表匹配的内容,还有两表不匹配的内容 。
full join
表约束 :其实就是对表的一种限制性的行为,当不满足表的约束,那么对表的dml操作 (insert delete update) ,将不能成功 。
6类
default 默认约束
not null非空约束
unique 唯一约束 :不能重复,可以为空
primary key 主键约束 :不能重复,不能为空
check 检查约束 ,现在某一列在某个区间范围内 。
foreign key :外键约束 ,需要有两张表,因为外键需要依赖住表的主键存在 ,当给某一列设置了外键之后,就相当于限制了这一列的取值范围 ,只能从主表的主键列中取值 。
一个表上可以存在多个外键列 。
外键的作用是什么呢 ?
保证了数据的完整性 。
使用代码来添加约束
alter table 表名 add constraint 约束名 约束类型 (列名) ;
外键约束
references 主表(主键)
oracle中的伪列
rownum rowid
rownum :其实就是行号 , 如果要使用 rownum需要从1 开始 。
使用rownum的作用,主要用来分页 。
select * from
(select rownum rn , emp.* from emp ) t
where t.rn > pageSize * (n-1) and t.rn <= pageSize * n
pageSize :表示的是每页显示的行数
n :表示的是页数 。
rowid :物理意义上的,绝对不会重复的。
主要用来删除重复数据 。
1.使用distinct 关键字来删除 。
操作步骤 。 s7
1.先查询出不重复的数据 ,放到临时表中 。
select distinct(*) from s7
create table s8
as
select distinct * from s7
2.删除原表的数据 。
delete from s7 ;
commit ;
truncate table s7 ;
3.将临时表的数据插入到原表中 。
insert into s7 select * from s8 ;
4.删除临时表 。作为无痕操作
drop table s8 ;
rowid
1.首先按照重复的列来进行分组 。
select sid,max(rowid) from s7 group by sid ;
select * from s7 where rowid not in ('fdfsafs','fdsafds','fdasdfsa')
delete from s7 where rowid not in ('fdfsafs','fdsafds','fdasdfsa') ;
子查询的概念,
子查询:其实就是嵌套查询,在一个select里面在加上一个select
为什么会出现子查询呢 ?
因为在很多情况下where后面条件值不是一个具体的值或者表达式,而是另外一个查询的查询结果 。在这种情况下我们就需要使用子查询了。
--删除重复数据 。
delete from s7 where rowid not in (select max(rowid) from s7 group by sid) ;
第三章 ,
序列(sequence)
序列:可以生成一串自动且连续增长的数字 ,目的是为了实现主键自动且唯一的增长 。
创建序列的语法
create sequence 序列名 ;
start with 起始值
maxvalue 最大值
minvalue 最小值
increment by 步长
cycle ;
两种用法
1.查看序列的下一个值
select seq.nextval from dual;
2.查看序列的当前值
select seq.currval from dual;
索引(index)
索引:相当于目录,能够快速定位要访问数据所在的数据块,从而减少查询时间,提高查询效率。
语法
create index 索引名 on 表名 (列名) ;
主键和唯一约束的列上是不需要创建索引,因为会自动创建。
缺点:
1.增加增删,改的时间 。
2.会占用物理空间(物理内存)
3.创建和维护索引需要时间。
哪些列上适合创建索引
1.在经常需要搜索的列上适合创建索引
2.在经常需要排序的列上
3.在经常需要分组的列上
4.在经常需要充当where条件的列上适合创建索引。
同义词 synonym :其实就是别名的意思 。
1.公共同义词
语法
create public synonym 同义词名 for 数据库对象名 ;
为什么要创建公共同义词呢 ?
目的=就是为了让他人进行访问,可以不用授权。
一般情况下在创建完表之后,就创建一个和表同名的公共同义词。
公共同义词名 可以和 数据库对象名重复 。
私有同义词不可以重复。
2.私有同义词
语法
create synonym 同义词名 for 数据库对象名 ;
视图(view)
创建视图的语法
create [or replace ] view 视图名
as
select 语句
[with read only] :只读视图 。
[with check option] :可以修改数据,但是修改之后的数据需要满足where条件 ;
视图的作用
1.简化sql语句 。
2.保护数据的安全性 。
3.执行某些必须使用视图的查询 。
--按照部门编号来进行升序排列
select * from emp order by deptno ;
--按照部门编号来进行升序排列,若部门编号相同,在每个部门内部按照薪资来降序排列
select * from emp order by deptno , e_salary desc ;
--按照多列排序的排序规则,首先按照第一列进行排序,若第一列相同,在按照第二列进行排序
select * from emp order by e_salary desc;
空值默认是最大值。
对空值进行排序 ,使用 nulls first 和 nulls last 来排序 。
子查询的效率要高于表连接 。