一、数据类型
1.字符:char,varchar2,long
char: 固变 1~2000字节
varchar2:可变长度 1~4000字节
long: 可变长度 2GB长度(一般不用)
2.数值
number:即是整数又是小数,默认整型
number[(p[,s])] ==p精度,s小数位
number(5,2) == 共5位,其中小数位2位
--只要整型:number(5)
3.日期时间====>要转类型,像sql中用''是不行了。
Date:存储日期、时间类型。
日期转换函数:to_date('2016-02-02','yyyy-mm-dd')
例:insert into tb_name(mydate)
values(to_date('2016-02-02','yyyy-mm-dd hh:mi:ss'));
4.储存二进制数据,比如图片、视频、声音文件等
4.1 Raw或Raw Long
4.2 LOB (常用,就是所谓的大数据,最大4GB)
Clob:
Blob:
Bfile:
记住,一般我们不把图片、视频等存在数据库中,只是把它们存放在硬盘地址保存到硬盘。
存在数据库里,要转换,资源消耗多。
二、数据定义语言DDL
create table -- 创建表
alter table -- 修改表
truncate table -- 删除表(删除数据,保留结构)
drop table -- 删除表(删除结构和数据)
create表:
--创建表:
create table tb_name
( sid number, sname varchar2(20), sex varchar2(4) )
--复制表:
select into 新表名 from 旧表 where 1=2
create table tb_name
as select * from emp;
--只复制表结构,不要数据
create table tb_name
as select * from emp where 1=2;
--去除重复的数据
select distinct 列名 from emp;
三、数据操纵语言DML
insert -- 与sql server一致
delete -- 与sql server一致
update -- 与sql server一致
select -- 与sql有些不一样
insert增:
--插入其它表中的记录(注意要先创建新表,然后再复制数据)
insert into newtable
select * from emp;
--将部门编号为20的员工插入到新表中
insert into newtable
select * from emp where deptno=20;
--使用union插入多条数据,要借用伪表
insert into newtable
select 1,'张三','男' from dual union
select 2,'李四','女' from dual union
select 3,'王五','男' from dual union
select 4,'赵六','女' from dual;
delete删:
--删除性别为男的
delete from tbs_0310 where ssex='男'
update改:
--给所有的人提薪10%
update emp set sal=sal+sal*10%;
update emp set sal=sal*1.1;
select查:
select * from 表名
四、事务控制语言TCL
commit -- 提交
rollback -- 回滚
savepoint -- 回滚的点
五、数据控制语言DCL
grant -- 授权
revoke -- 撤销授权
六、伪表dual与伪列rowid,rownum
1. 伪表:
select 'a' from dual;
2. 伪列:
select * from tb_name
--如果结果集中出现三列,其实它有五列,还有两个列:rowid、rownum
--rowid:唯一标识符,这是系统给的,不是我们自己定义的
--rownum:有点类似sql中的row_number()方法
怎么查看?
select t.*,rowid from tb_name t;
select t.*.rownum from tb_name t;
注意:在Oracle项目中,一般都使用rownum做分页。
这两个可以同时用吗?可以
select t.*,rowid,rownum from tb_name t
--求前两条记录(Oracle不支持top)
select a.*,rownum from emp a
where rownum<3
--求第3、4条记录(注意:rownum只能作用于小于号)
--解决办法:rownum是a表的伪列,把这伪列变成实列
select * from
( select a.*,rownum rid from emp a ) t where rid>2 and rid<5
案例1:求薪水前5的人
--思路:薪水排序,再用上面的rownum?
select * from emp where rownum<6 order by sal desc; (错)
先排序再取,上面代码是先取再排序
select * from emp order by sal desc where rownum<6; (错)
正确的:
select t.*,rownum from
( select * from emp order by sal desc; ) t where rownum<6
案例2:求每个人的收入(薪水+奖金)
select ename,sal,comm,sal+comm from emp; (错)
结果是sal列中和comm列中有值的都能算出收入,如果有个列是null值,则算不出收入。
怎么办?
用nvl()函数,作用与isnull(comm,0)一样
select ename,sal,comm,sal+nvl(comm,0) from emp;
注意:select t.*,rownum from emp t order by sal+nvl(comm,0) 的话是先对数据进行分号,再排,所以rownum会显示乱掉。
nvl(exp1,exp2,exp3) --当exp1为null,返回exp2,否则返回exp3
select ename,sal,comm,sal+nvl(comm,0,comm+100) from emp;
案例3:查询没有奖金的人
select * from emp where comm=null;
(错,null不能用=号,就好比猪和人比,能比吗?种类都不一样)
正确:select * from emp where comm is null;
四、SQL操作符
1.算术运算符 + - * /
---------------------------------------------------------------------
2.比较运算符 = != < > <= >= between..and in like is null
---------------------------------------------------------------------
3.逻辑运算符 not and or
---------------------------------------------------------------------
4.集合运算符 union行合并,union all
---------------------------------------------------------------------
5.连接操作符 ||用来连接字符串
SQL server语句:
select sid,sname,sex+'生' from tb_name
--看这案例,在SQL Server中这句话没问题
在oracle中会报错:ORA-10722:无效数字
在Sql Server中“+”既有算术作用,也有字符串拼接作用;
但在Oracle中,“+”就只有算术作用。
Oracle语句:
select sid,sname,sex||'生' from tb_name
SQL操作符的优先级:算术 > 连接 > 比较 > not > and > or
5