视频学习Oracle记录
========================================
二、 oracle 数据库操作之表的管理
========================================
create table student(
xh number(4),
name varchar2(10)
);
修改表的字段:
增加字段
sql> alter table student add(age number(2));
修改字段
sql> alter table student modify(name varchar(30));--使用modify的时候,表中不能有数据
删除字段
sql> aler table student drop cloum age;
修改表的名字
sql> rename student to stu;
删除表
sql> drop table student;
添加数据:
添加所有字段:sql> insert into student values(1,'小米',...);
添加部分字段:sql> insert into student(xh,xm,sex) values('aaa01','Jose','女');
修改日期的默认格式
alter session set nls_date_format='yyyy-mm-dd';
查询语句
sql> select * from student where birthday is (not) null;
改
sql> update student set age=20 where name='Lisi';
增
删
sql> delete from student;--删除所有数据
sql> rollback;--回滚 与savepoint a一起用(a为回滚时的点)
sql> drop table student;--删除表结构和数据
sql> truncate table student;--删除表中所有记录,表结构还在,不写日志无法找回删除的记录,速度非常快!
Oracle 表查询:
查看表结构
sql> desc t_table;
查询所有列
sql> select * from t_table;
查询指定的列
sql> select name,age from t_table;
取消重复的行
sql> select distinct * from t_table;
使用算数表达式
sql> select sal*13 from emp;
sql> select sal*13 '年工资' ,ename from emp;-- 别名
查询,且计算包含奖金的年薪
sql> select sal*13 + comm*13 '年薪', ename from emp;--其中comm为奖金,这样计算的话,当奖金为null时,Oracle不会计算得到的奖金,也就是说年薪为null,正确的做法如下:
sql> select sal*13 + nvl(comm,0)*13 '年薪' , ename from emp;--nvld()的意思就是当comm为NULL时为0,不为NULL时,为comm
Like操作符
%:代表任意0到多个字符
_:代表任意单个字符
sql> select ename, sal from emp where ename like 'S%';--S开头的名字符合要求的都列出来
sql> select ename, sal from emp where ename like '__S%';--第三个字符为S的名字符合要求的都列出来
in关键字
sql> select * from emp where empno in (1,2,3,4);--员工编号在1到4之间的都查询出来
排序关键字 order by asc/desc(desc 降序 asc 升序,升序为默认值,可以不写)
sql> select * from emp order by age desc;
混合使用:sql> select * from emp order by age desc, sal asc;--按年龄降序并且公子升序的情况排列
复杂查询:数据分组:max,min,avg,sum,count等的使用
sql> select count(*) from t_table;--查出总记录数
子查询:嵌入在其他查询中的查询便叫做子查询。
sql> select ename,sal from emp where sal=(select max(sal) from emp);--查询公子最高的员工姓名、工资
单行子查询
sql> select * from emp where deptno = (select deptno from emp where ename = 'SMITH');
多行查询用 in、all、any
sql> select * from emp where deptno in (select deptno from emp where ename = 'SMITH');
sql> select * from emp where deptno > all(select deptno from emp where ename = 'SMITH');
多列子查询
分组 group by、having
sql> select avg(sal),max(sal, deptno from emp group by deptno;--如何显示每一个部门的平均工资以及最高工资
sql> select avg(sal),max(sal, deptno,job from emp group by deptno,job;--先按部门分组然后在按工作分
sql> select avg(sal),max(sal, deptno from emp group by deptno having avg(sal)>2000;--平均工资在2000以上的显示
多表查询
sql> select a1.ename,a1.sal,a2.dname from emp a1 ,dept a2 where a1.deptno = a2.deptno;--别名...,笛卡尔积: S(m) x T(n) 最后有m*n种情况,数据库中的记录查询需要避免笛卡尔积
多表查询的特殊形式——自连接
同一张表内的连接查询,可以看做是有两张相同的表
复杂查询语句
例子:显示高于自己部门平均工资的员工信息
a、查出每个部门的平均工资和部门号
sql> select deptno, avg(sal) mysal from emp group by deptno;
b、把a中的查询看做是一张 子表
sql> select a2.ename, a2.sal, a2.depto, a1.mysal from emp a2, (select deptno, avg(sal) mysal from emp group by deptno) a1 where a2.deptno=a1.deptno and a1.mysal < a2.sal;--括号中的为内嵌试图(子表)
Oracle分页(共三种方式: rowID,分析函数,rownum)
——与MySQL不同,MySQL直接使用limit就可以了
1、rownum 分页
sql> (select * from emp)
2、显示rownum[Oracle分配的]
sql> select a1.*,rownum rn from (select * from emp) a1;
3、分页结果
sql> select * (select a1.*,rownum rn from (select * from emp) a1 where rownum <= 10) where rn >= 6;--取出六到十的数据
注意: a.指定查询列只需要修改最里面的子查询(select * from emp)的指定列就可以 b.要对查询结果进行排序的的话,也只需要修改最里面的子查询就可以.
使用查询结果来穿件一张新表
sql> create table mytale(id,name,age) as selectsid,sname,sage from student;
Oracle 创建数据库工具
dbca[数据库创建助手]
注意:
出现顺序: where 、group by、having、order by...