第一篇:ORACLE数据库学习总结
数据库学习总结-Marlon
目录一、二、三、四、五、六、七、八、ORACLE_简介.............................................................................................................................................................1 ORACLE_简单查询.....................................................................................................................................................3 ORACLE标量函数和算数运算..................................................................................................................................5 ORACLE_多表查询.....................................................................................................................................................9 ORACLE_列函数和分组...........................................................................................................................................10 ORACLE_子查询.......................................................................................................................................................12 ORACLE_表的更新操作...........................................................................................................................................13 ORACLE_表与视图的管理.......................................................................................................................................15
一、ORACLE_简介
Oralce数据库发展 Oracle 8
Oracle 8i:i表示internet,标识着Oracle公司正式进军互联网。Oracle9i Oracle10g:g表示grid,即网络技术。Oracle11g
Oracle体系结构一 物理结构: 文件系统 控制文件 数据文件 日志文件
参数文件(不是数据库的组成成分)
Oracel体系结构三 逻辑结构: block 快 extent 盘区 segment 段
tablespace 表空间 datafile 数据文件 SQL * Plus下的常用命令
连接到SQL*PLUS sqlplus user/password[as sysdaba|sysoper] sqlplus/nolog
启动数据库
startup mount 启动实例,打开控制文件,但不打开数据文件 startup nomount 只启动实例
关闭数据库
shutdown immediate
迫使每个用户执行为当前的SQL语句,立即断开连接 shutdown transactional
迫使用户执行完当前事务时,断开连接 shutdown abort 强制关闭数据库
常用SQL命令
show user:查看当前连接的用户
connect scott/tiger: 采用scott的用户名/tiger的密码连接数据库 desc table_name:查看tableName表结构 quit|exit:退出
disconnect:断开连接
clear screen:清屏,相当于Windows下的cls命令 select * from tab:列出当前用户下的所有表 @pata 执行pata制定的脚本文件
Oracle常用基本数据类型 varchar2/varchar:变成字符串 char:定长字符串 Integer:整型
number(m,n):数字型 smallint:短整型 float:浮点数
decimal:十进制数字(小数)date:日期型
二、ORACLE_简单查询
SQL结构化查询语言(Structured Query Language)
SQL分类
1.数据定义语言(Data Definition Language,DDL):create、alter、drop。
create table 表名;alter table add 新列名 数据类型;drop table 表名;2.数据操纵语言(Data Manipulation Language,DML):insert、update、delete、select。Insert into 表名(字段1,字段2…)values(值1,值2…);update student set sage=22 where sno='200215';(将学生200215的年龄改为22岁)select distinct job from emp;去除重复行
3.数据控制语言(Data Control Language,DCL):commit work、rollback work。 查询雇员的所有信息 select * from emp; *表示所有列
查询语句的格式
select *|列名 from 表名
查询雇员的编号,姓名,工资
select * from empno,ename,sal from emp;
查询所有职位 select job from emp;select distinct job from emp;distinct: 有区别的(去除重复行)
查询工资大于1500的雇员信息,列出编号,用户名,工资 select empno,ename,sal from emp where sal>1500;
带有where条件查询语句的基本格式 select *|列名 from 表名 where 条件;
比较运算符 大于:> 小于:< 等于:= 大于等于:>= 小于等于:<= 不等于:!=或者<>
限定查询 is null 和 is not null 的使用 查询每月可以得到奖金的雇员
select empno,ename,comm from emp where comm is not null;
select empno,ename,comm from emp where comm is not null and comm>0; 查询谁没有奖金
select empno,ename from emp where comm is null;
限定查询 and 的使用
查询工资大于1500,并且可以领取奖金的雇员
SQL> select empno,ename,sal,comm from emp where comm is not null and sal>1500;
限定查询 or 的使用
查询工资大于1500和可以领取奖金的雇员
select empno,ename,sal,comm from emp where sal>1500 or comm is not null; 查询没有奖金的雇员
select empno,ename,comm from emp where comm=0 or comm is null;
限定查询 使用not对条件整体取反
查询工资不大于1500并且不能领取奖金的雇员
select empno,ename,sal,comm from emp where sal<=1500 and(comm is null or comm=0);select empno,ename,sal,comm from emp where not(sal>1500 or comm is not null);
限定查询 between...and...的使用
查询基本工资大于等于1500并且小于等于3000的雇员
select empno,ename,sal from emp where sal>=1500 and sal<=3000;select empno,ename,sal from emp where sal between 1500 and 3000; 查询1981年雇佣的所有员工
select empno,ename,hiredate from emp where hiredate between'1-1月 1981' and '31-12月 1981';注:日期格式 日-月 年,要匹配上
限定查询 字符串的比较
查询姓名是'SMITH'员工的所有信息 select * from emp where ename='SMITH';select * from emp where ename='smith';注:列值区分大小写
限定查询 in的使用
查询出编号7369,7499,7521的雇员的具体信息
select * from emp where empno=7369 or empno=7499 or empno=7521;select * from emp where empno in(7369,7499,7521);
限定查询 not in的使用
查询出雇员编号不是369,7499,7521的雇员的具体信息 select * from emp where empno not in(7369,7499,7521);
限定查询 like的使用
查询雇员的名字第二个字符是M的雇员信息 select * from emp where ename like'_M%';注:_匹配一个字符,%匹配0个多个字母(前缀或后缀的代表) 查询1982年入职的所有雇员的信息
select * from emp where hiredate like'%82'; 查询工资中包含5的雇员信息
select * from emp sal where like'%5%';
对结果排序-Oracle By 查询员工工资大于1500员工的信息,按工资排序 select * from emp where sal>1500 order by sal; 查询工资大于1500员工的信息,按工资降序,按雇佣日期升序排序 select * from emp where sal>1500 order by sal desc,hiredate asc;注:ASC升序,DESC降序,默认ASC。
ascending [ə'sendiŋ]上升的,降序排列(descend [di'send] 的缩写);
三、ORACLE标量函数和算数运算
字符函数的使用
转换为大写字母
select upper('smith')from dual;注:dual是公共表。upper ['?p?] 上面的,上部的
转换为小写字母
select lower('SMITH')from dual;注:lower 放下
每个单词的字母变成大写,其余字母小写 select initcap('hello world')from dual
串连接(concat):可以使用“||”进行串连接 select concat('HELLO','WORLD')from dual;select 'HELLO'||'WORLD' from dual;
求子串(SUBSTR)select substr(ename,1,3)from emp;注:含义为截取ename字段从第一个字符开始,总共三个字符
求长度(LENGTH)select length(ename)from emp;
串替换(REPLACE)select replace('HELLO WORLD','WOR','WEL')from dual;结果:
REPLACE('HE-----------HELLO WELLD 注:第一个逗号是原字符,第二个逗号是原字符的一部分,第三部分是替换原字符那个部分。
要求显示所有雇员的姓名和姓名的后三个字符
select ename,substr(ename,length(ename)-2)from emp;select ename,substr(ename,-3)from emp;
四舍五入(Round)select round(789.536)from dual;ROUND(789.536)--------------
790
四舍五入(Round):指定保留小数位数 select round(789.536,2)from dual;----------------
789.54
四舍五入(Round):对整数四舍五入 select round(789.536,-2)from dual;ROUND(789.536,-2)-----------------
800
截断小数位(TRUNC)select trunc(789.536)from dual;TRUNC(789.536)--------------
789
截断小数位(TRUNC):指定保留小数位 select trunc(789.536,2)from dual;TRUNC(789.536,2)----------------
789.53
截断小数位(TRUNC):对整数截断 select trunc(789.536,-2)from dual;TRUNC(789.536,-2)-----------------
700 除空格(TRIM)
SQL> SELECT TRIM(55)FROM DUAL;TRIM(55)--------55 取余数(MOD)select mod(10,3)from dual;
日期函数 运算规律:
日期+数字=日期 日期-数字=日期
日期-日期=数字(天数)
查询当前日期
select sysdate from dual;SYSDATE-------------10-3月-12
显示10部门员工进入公司的星期数
select empno,ename,round((sysdate-hiredate)/7)from emp where deptno=10;
在指定日期上加入指定的月数之后的日期(ADD_MONTHS)select add_months(sysdate,4)from dual;ADD_MONTHS(SYS--------------10-7月-12
求出给定日期范围的月数(months_between)select empno,ename,months_between(sysdate,hiredate)from emp;
下一个给定的星期是那个日期(next_day)select next_day(sysdate,'星期一')from dual;注:表示在当前时间的前提下,下个礼拜一的具体日期
求出给定日期所在月份的最后一天日期(last_day)select last_day(sysdate)from dual;
转换成字符串(to_char)查询雇员号,姓名,以及入职的年份
select empno,ename,to_char(hiredate,'yyyy')from emp;注:yyyy匹配年份,mm匹配月份,dd匹配日
使用to_char设置日期的显示格式
select empno,ename,to_char(hiredate,'yyyy-mm-dd')from emp;
使用fm去掉前导0 select empno,ename,to_char(hiredate,'fmyyyy-mm-dd')from emp;EMPNO ENAME
TO_CHAR(HI--------------------------
7369 SMITH
1980-12-17
7499 ALLEN
1981-2-20 注:正常的值是1981-02-20,02前面的0去掉,变成了1981-2-20. 通过to_char设置数值的格式
select empno,ename,to_char(sal,'99,999')from emp;说明:9代表1位数字
EMPNO ENAME
TO_CHAR---------------------------
7369 SMITH
800
7499 ALLEN
1,600
7521 WARD
1,250 注:把sal的值分成两个部分,后三位为一个部分,前两位为一个部分,用逗号隔开。
显示余额
select empno,ename,to_char(sal,'$99,999')from emp;说明:$代表美元
转换成数字(to_number)select to_number('123')+to_number('123')from dual;TO_NUMBER('123')+TO_NUMBER('123')--
246
转换成日期(to_date)select to_date('2009-07-31','yyyy-mm-dd')from dual;TO_DATE('2009---------------31-7月-09
算数运算
查询每个员工的年收入
select empno,ename,(sal+comm)*12 from emp;年收入=工资+奖金
查询每个员工的年收入
select empno,ename,(sal+comm)*12 income from emp;
查询每个员工的年收入
select empno,ename,(sal+NVL(comm,0))*12 income from emp;注:NVL(comm,0),当comm的值为null时,用0替换
ORACLE_多表查询
格式:
select 列名1 别名1,......from 表名1,表名2,......where 条件 order by 列名
查询员工的编号,姓名,部门编号,部门名称
select empno,ename,emp.deptno,dname from emp,dept where emp.deptno=dept.deptno;
关联查询-为表命别名
查询员工的编号,姓名,部门编号,部门名称
select empno,ename,e.deptno,dname from emp e,dept d where d.deptno=e.deptno;注:这里的e是emp的别名,d是dept的别名
关联查询-自连接
查询出每个雇员的姓名、工作、雇员的直接上级领导的姓名
select e.empno,e.ename,e.job,m.ename mname from emp e,emp m where e.mgr=m.empno;注:mname是m.ename的别名
关联查询-多表关联
四、 查询出每个雇员的姓名,工作,雇员的直接上级领导,以及部门名称 select e.ename,e.job,m.ename,d.dname from emp e,dept d,emp m where e.mgr=m.empno and e.deptno=d.deptno;注:当查询的字段间的关系涉及到n个表时,则n个表之间关联。
左、右外连接
查询员工编号,姓名,所在部门号,部门名称,将没有员工的部门也显示出来 select e.ename,d.deptno,d.dname from emp e,dept d where e.deptno(+)=d.deptno;注:(+)在左边,表示右连接,会列出所有右表中出现但是没有在左表中出现的行。
查询雇员的编号,姓名及其领导的编号,将没有领导的员工也列出来 select e.empno,e.ename,m.empno,m.ename from emp e,emp m where e.mgr=m.empno(+);注:(+)在右边表示左连接,会列出左表中出现但没有在右表中出现的行。
交叉连接(cross join):用来长生笛卡尔积 select * from emp cross join dept;
自然连接(nutural join):自动进行关联字段的匹配 select * from emp natural join dept;
using子句:直接指定操作关联列
select * from emp join dept using(deptno)
on子句:用户自己编写连接条件
select * from emp join dept on emp.deptno=dept.deptno;
left join:左外连接
right join:右外连接
五、ORACLE_列函数和分组
常用的列函数
sum(expression)求和 max(expression)求最大值 min(expression)求最小值 avg(expression)求平均数 count(expression)统计记录数
count(distinct colname)统计去除重复行记录数 nvl(comm,0)当comm为null时,用0替换
列函数的使用
查询员工的记录数,员工工资的总和,平均工资,最高工资,最低工资
select count(*)count_emp,sum(sal)sum_sal, max(sal)max_sal,min(sal)min_sal, avg(sal)avg_sal from emp;
列函数的使用-对null的处理
查询所有员工的年收入
select sum(sal+comm)from emp;SUM(SAL+COMM)-------------
7800 注:当comm为null时,sal+comm是没有结果值的
select sum(sal)+sum(comm)from emp;SUM(SAL)+SUM(COMM)------------------
31225
select sum(sal+nvl(comm,0))from emp;SUM(SAL+NVL(COMM,0))--------------------
31225
分组查询
语法格式
select 列名...,列函数 from 表名...where 条件...group by 列名...order by 列名... 查询每个部门的人数
select deptno,count(*)from emp group by deptno;规则:如果在select字句中,有不在列函数中的列,则该列一定要出现在group by之后。
分组查询having字句的使用
显示出平均工资大于2000的部门编号和平均工资 select deptno,avg(sal)from emp group by deptno having avg(sal)>2000;
SQL语句的书写顺序
select 列名,列函数 from 表名 where 条件 group by列名 having 条件 order by 列名
SQL语句的执行顺序
from where group by having select order by
查询20,30部门的平均工资,并将平均工资大于2000的输出,输出结果按平均工资排序 select deptno,avg(sal)from emp where deptno in(20,30)group by deptno having avg(sal)>2000 order by avg(sal);
六、ORACLE_子查询
在where子句中使用子查询
查询工资比7654雇员工资高的全部雇员信息
select * from emp where sal>(select sal from emp where empno=7654);子查询-in的使用
查询和smith或jones在同一部门,同一职位工作的员工
select ename from emp where(deptno,job)in(select deptno,job from emp where ename in('SMITH','JONES'));
子查询-any的使用
=any:与in操作符的效果一致
查询和smith或jones在同一部门,同一职位工作的员工
select ename from emp where(deptno,job)=any(select deptno,job from emp where ename in('SMITH','JONES'));
>any:只要大于子查询中的任何一个值即可 select * from emp where sal>any(select min(sal)from emp group by deptno);
select empno from emp where sal 子查询all的使用 >all:比最大的值大 select * from emp where sal>all (select min(sal)from emp group by deptno);注:select min(sal)from emp group by deptno结果为 MIN(SAL)---------- 950 800 1300 是每个部门当中的最少工资。 七、ORACLE_表的更新操作 创建表副本 create table myemp as select * from emp; 插入 到表中 insert的语法 insert into 表名(字段名1,字段名2,......)values(值1,值2......) 为myemp中增加一条记录 insert into myemp(empno,ename,job,mgr,hiredate,sal,comm,deptno)values(7899,'张三','清洁工','7369','14-2月-2005',9000,300,40);注:给定的值要和指定的字段数一致。 1.如果全部字段都插入值的话,那字段名可以省略。即: insert into 表名 values(值1,值2,.......);2.如果只是部分字段插入值的话,字段名又想省略的话,那么,其余没有数据插入的字段用null填补。 to_date:字符型转换成日期型 批量插入记录 格式: insert into 表名 select 字段列表 from 表名 where 条件 注:insert表和select表列数等都一致 例如: create table test as select * from emp;insert into test select * from emp; 修改记录 update表名set要修改的字段=新值,要修改的字段=新值,...where条件 将雇员号为7896的雇员的奖金修改为100 update myemp set comm=100 where empno=7896;注:执行修改操作时,一定要使用where来指定修改的条件,否则会改变表中的所有记录。 删除记录 delete from 表名 where 条件 删除雇员编号为7896的雇员信息 delete from myemp where empno=7896;注:执行delete操作时,一定要使用where来指定修改的条件,否则会删除表中所有的记录。 Oralce的事务处理 commit:提交事务 rollback:回滚操作 注:操作一旦执行了commit操作,就再也不能回滚操作了。 八、ORACLE_表与视图的管理 oracle中的常见数据类型 varchar、varchar2:表示一个字符串,有长度限制,为255 number: number(n):表示一个整数,数字的长度是n,可以使用int number(n,m):表示一个小数,数字的长度为n,整数长度m-n,可以使用float date:表示日期类型,日期要按照标准格式日期存放。clob:大对象,表示大文本数据类型,可存放4G。 blob:大对象,表示二进制数据,最大可以存放4G,如电影,图片、歌曲 创建表 语法: create table 表名(字段名称1 字段类型[default 默认值], 字段名称1 字段类型[default 默认值],............字段名称1 字段类型[default 默认值],); 复制表 create table 表名 as(子查询);注:当子查询不成立时,如果1=2,则只复制表的结果,不复制表的数据。 删除表 语法: drop table 表名; 修改表结构 增加一列 alter table 表名 add(列名称 列数据类型 default 默认值) 删除列 alter table 表名 drop column 列名称; 修改列的数据类型 alter table 表名称 modify(列的名称 列的类型 default 默认值);注:1.如果是更改数据的长度,则要求更改时,长度不能小于当前表中数据所具有的最大长度。 2.如果是更改数据类型,则要求更改时,该列的所有记录值都为空。 修改表结构 为表重命名 rename 旧表名 to 新表名;注:这是oracle特有的操作 将myemp表改名为iemp SQL> rename myemp to iemp;表已重命名。 截断表 truncate table 表名;意义:清空表中的所有数据,并且立即释放资源,该操作是不可回滚。 约束-约束的分类 主键约束:表示一个唯一的标识,本身不能为空 唯一约束:列值不允许重复 检查约束:检查一个列的内容是否合法 非空约束:不能为空值,如用户不能为空(no null)外键约束:在两张表中进行约束的操作 主键约束(primary key)主键约束一般在id上使用,而且本身已经默认了不能为空,主键约束可以在建表的时候指定 create table person(pid varchar2(18)primary key, name varchar(30), age number(3), sex varchar2(2)default'男'); 使用constraint指定 constraint [kən'streint] 约束;强制 create table person(pid varchar2(18), name varchar(30), age number(3), sex varchar2(2)default'男' constraint person_pid_pk primary key(pid);); 非空约束(not null)create table person(pid varchar2(18)primary key, name varchar(30)not null, age number(3), sex varchar2(2)default'男'); 唯一约束(unique)create table person(pid varchar2(18)primary key, name varchar(30)unique not null, age number(3), sex varchar2(2)default'男'); 视图 概念:一个视图实质是封装了一条复杂的SQL语句 创建视图 语法: create view 视图名称 as 子查询 创建部门20员工的雇员信息 create view empv20 as select * from emp where deptno=20;注:当创建视图以后,可以像操作表一样操作视图。注:视图的操作会影响到表的操作。 with check option 不能更新创建视图的条件 with read only 创建只读视图 删除视图 语法: drop view 视图名称 注:当删除视图所在的表时,则视图也不能被使用 序列 创建序列语法:sequence ['si:kwəns] create sequence 序列名称;create sequence myseq;序列的操作: nextval:取得序列的下一个内容 currval:取得当前序列的内容 创建表验证序列的操作 create table testseq(next number,curr number);insert into testseq values(myseq.currval,myseq.nextval); 创建序列指定每次增长的增量 create sequence myseq increment by 2;注:每次增长2 创建序列指定开始的序列,默认的序列从1开始。create sequence myseq increment by 2 start with 10;注:序列从10开始,每次增长2 创建一个序列1,3,5,7,9.create sequence myseq maxvalue 9 increment by 2 start with 1 cache 2 cycle;注:序列从1开始,每次增长2,最大值为9,循环两次。 Oracle数据库学习总结 1.set linesize xx;设置行间距,常用数值有100,200,300 2.set pagesize xx;设置每页显示行数 3.ed x;表示新建一个x.sql文件,通过文件编辑SQL语句,然后用@x命令可以调用刚才的命令 4.CONN username/password;命令可以建立用户的连接,需要注意的是sys用户是超级管理员,连接是时需要在末尾加上AS SYSDBA 以系统管理员的身份进行连接 5.如果表是归某个用户特有的,在查询的时候需要加上用户名 即以 用户名.表名 的格式查询 6.SHOW USER;命令可以显示当前连接的用户名 7.SELECT * FROM tab;可以显示当前用户下的所有数据表 8.“ / ”表示重复执行上一次的SQL命令操作 9.SELECT xx别名,xx 别名 FROM xx;搜索指定列名,并指定别名,方便显示 10.关键字DISTINCT 可以消除重复值 如 SELECT DISTINCT xx FROM xx; 11.Oracle中提供的字符串连接操作,使用“||”表示,相当于Java的“+”普通字符用“ ' ” 括起来 如: SELECT'员工姓名是'||ename||'员工卡号是'||empnoFROM emp; 12.查询语句 BETWEEN xx AND xx 是包括边界的13.查询日期的时候要加上''把日期引起来 例如:SELECT * FROM emp WHERE hiredate BETWEEN '1-1月-81' AND '08-9月-81'; 14.模糊查询中“%”可以匹配任意长度的内容,“_”可以匹配一个长度的内容,如果没输入模糊查询关键字,那么默认查询全部数据,like关键字可以用在任何地方,可以匹配数字、字符、日期等。 15.SQL中不等于可以用“<>”或者“!=”表示 16.ORDER BY语句中 ASC表示升序,DESC表示降序,在没指定的时候默认按照升序排序 17.Oracle中的单行函数有如下,默认的所有的函数都要到表中执行,加上关键字DUAL只会产生一个临时表 UPPER('xxx')将小写转换为大写 LOWER('xxx')将大写转换为小写 INITCAP('xxx')将首字母大写 CONCAT('','')字符串连接 SUBSTR('xxx',x,x)字符串截取,从0或1开始截取效果是一样的,因为Oracle比较智能,要是输入的参数为负数,则表示倒着截取 LENGTH('xxx')字符串长度 REPLACE('xxx','x','x')字符串替换 ROUND(xxx,xx)四舍五入 xxx需要四舍五入的数值,xx保留的小数位,可以加负数 TRUNC(xxx)截断操作,默认小数点后的全部截断,也可以指定小数点保留位数如TRUNC(789.536,2)得到的结果是789.53,也可以加负数如TRUNC(789.536,-2)结果是700 18.SELECT sysdate FROM DUAL;可以求出当前的日期 19.Oracle 中提供了以下日期函数支持: MONTHS_BETWEEN()求出给定日期范围的月数 ADD_MONTHS(xxx,xxx)在指定日期加上指定的月数 NEXT_DATE(xxx,'')求出下一个给定日期数 TO_CHAR()可以将年、月、日进行分割 例如 TO_CHAR(hirdate,'yyyy')year,TO_CHAR(hirdate,'mm')months,TO_CHAR(hirdate,'dd')day 还可以对时间进行格式化输出 如TO_CHAR(hirdate,'yyyy-mm-dd') TO_CHAR(hirdate,'fmyyyy-mm-dd')可以去掉前导0 TO_CHAR()还可以对数字进行格式化 如 SELECT ename,TO_CHAR(SAL,'99,999')FROM emp; 注意:一定要用9来表示 $表示美元符号,L表示Local的缩写,以本地语言进行金额显示 TO_NUMBER()将字符串变为数字 TO_DATE()将字符串变为Date类型 例如 SELECT TO_DATE('2009-12-8','yyyy-mm-dd')FROM dual; TO_NVL()可以将NULL的内容变为指定的内容 DECODE()相当于Java的if else else语句 例如SELECT DECODE(1,1,'内容是1',2,'内容是2',3,'内容是3')FROM dual;将输入 内容是1 20.左右连接 SELECT e.empno,e.ename,d.deptno,d.dname,d.loc FROM emp e,dept d WHERE e.deptno(+)=d.deptno;此例中是右连接,以deptno表为准。 21.SQL1999语法 CROSS JOIN 交叉连接 会产生笛卡尔积 NATURAL JOIN 自然连接 自动进行关联字段匹配 可以消除笛卡尔积 USING 子句:直接关联操作列 如 SELECT * FROM emp e JOIN dept USING(deptno)WHERE deptno=30; ON 子句 用户自己编写连接条件 LETF JOIN/RIGHT JOIN 左右连接 SELECT e.empno,e.ename,d.deptno,d.dname,d.loc FROM emp e right OUTER JOIN dept d ON(e.deptno=d.deptno); 22.分组查询GROUP BY 放在where之后 常见的组函数有 COUNT(); MAX(); MIN(); AVG(); SUM(); 用法如下:SELECT deptno,count(empno)FROM emp GROUP BY deptno; 语法:SELECT deptno,empno,count(empno)FROM emp GROUP BY deptno;是错误的,原因是使用分组函数的时候,不能出现分组函数和分组条件以外的字段。 语法:SELECT deptno,count(empno)FROM emp;是错误的,原因是不使用分组的时候,则只能单独使用分组函数 分组函数只能在分组中使用,不允许子啊where语句中个使用,要使用个分组条件可以加上HAVING 例如:SELECT deptno,avg(sal)FROM emp GROUP BY deptno having avg(sal)>2000;注意:分组函数可以嵌套使用,但是在组函数嵌套使用的时候不能再出现分组条件的查询语句 如下语法是错误的:SELECT deptno,max(avg(sal))FROM emp GROUP BY deptno;不能出现deptno 如下语法是正确的:SELECT max(avg(sal))FROM emp GROUP BY deptno; 23.子查询中 >ANY 比里面的最小值大 =ANY 与IN用法相同 >ALL 比里面的最大值大 24.表复制 CREATE TABLE myemp AS SELECT * FROM emp;既复制表结构,又复制表内容 CREATE TABLE myemp AS SELECT * FROM emp where 1=2;后面的条件不可能成立,只复制表结构 25.Oracle 中常用的数据类型 VARCHAR、VARCHAR2 代表一个字符串,有长度限制,为255 NUMBER 分为两种 1)NUMBER(n)代表一个整数,数字的长度是n,可以使用INT 2)NUMBER(m,n)代表一个小数,小数长度为n,整数长度为m-n,可以使用FLOAT DATE 代表日期的类型,日期要按照标准的日期格式进行存放 CLOB 大对象,表示大文本数据,一般可以存放4G的文本 BLOB 大对象,表示二进制数据最大可以存放4G,例如存放歌曲、电影、图片 26.表的创建 CREATE TABLE person(pid VARCHAR2(18),name VARCHAR2(200),birthdate DATE,age NUMBER(4),sex VARCHAR2(2)DEFAULT '男'); 27.插入数据 INSERT INTO person(pid,name,birthdate,age)VALUES('222','里斯 ',TO_DATE('1989-02-09','yyyy-mm-dd'),45); 28.更改表中数据 增加表结构:ALTER TABLE person ADD(address VARCHAR2(50)DEFAULT '暂无地址'); 修改已存在的列:ALTER TABLE person MODIFY(name VARCHAR2(40)DEFAULT '无名氏'); 29.表的重命名(只能在Oracle中使用) RENAME XXX TO XXX; 30.约束(主要分为5类) 1)主键约束 主键表示是一个唯一的标识。本身不能为空 2)唯一约束 在一个表中只允许建立一个主键约束,而其他列如果不希望重复值的话,则可以使用唯一约束 3)检查约束 检出一个列的内容是否合法 4)非空约束 5)外键约束 在两张表中进行约束的操作 删除时应该先删除子表,再删除父表 创建主键: 语法1 CREATE TABLE person(pid VARCHAR2(18)PRIMARY KEY,name VARCHAR2(200),birthdate DATE,age NUMBER(4),sex VARCHAR2(2)DEFAULT '男'); 语法2: CREATE TABLE person(pid VARCHAR2(18),name VARCHAR2(200),birthdate DATE,age NUMBER(4),sex VARCHAR2(2)DEFAULT '男',CONSTRAINT p_id PRIMARY KEY(pid)); 创建非空约束 CREATE TABLE person(pid VARCHAR2(18),name VARCHAR2(200)NOT NULL,birthdate DATE,age NUMBER(4),sex VARCHAR2(2)DEFAULT '男'); 创建唯一约束 语法一 CREATE TABLE person(pid VARCHAR2(18),name VARCHAR2(200)UNIQUE NOT NULL,birthdate DATE,age NUMBER(4),sex VARCHAR2(2)DEFAULT '男'); 语法二 CREATE TABLE person(pid VARCHAR2(18),name VARCHAR2(200)NOT NULL,birthdate DATE,age NUMBER(4),sex VARCHAR2(2)DEFAULT '男',CONSTRAINT p_name UNIQUE(name),); 创建检查约束 语法一 CREATE TABLE person(pid VARCHAR2(18),name VARCHAR2(200)NOT NULL,birthdate DATE,age NUMBER(4)NOT NULL CHECK(age BETWEEN 0 AND 150),sex VARCHAR2(2)DEFAULT '男' CHECK(sex IN('男','女','中')),); 语法二 CREATE TABLE person(pid VARCHAR2(18),name VARCHAR2(200)NOT NULL,birthdate DATE,age NUMBER(4)NOT NULL ,sex VARCHAR2(2)DEFAULT '男' ,CONSTRAINT p_age CHECK(age BETWEEN 0 AND 150),CONSTRAINT p_sex CHECK(sex IN('男','女','中'))); 创建外键约束 --person表 CREATE TABLE person(pid VARCHAR2(18)PRIMARY KEY,name VARCHAR2(200)NOT NULL,birthdate DATE,age NUMBER(4)NOT NULL ,sex VARCHAR2(2)DEFAULT '男'); --book表 CREATE TABLE book(bid NUMBER PRIMARY KEY,bname VARCHAR2(30),bprice NUMBER(5,2),pid VARCHAR2(18),CONSTRAINT b_pid_fk FOREIGN KEY(pid)REFERENCES person(pid)); 对于删除,应该先删除book表再删除person表 也可以使用级联删除,强制删除某张表 DROP TABLE person CASCADE CONSTRAINT; 设置外键约束级联删除 --person表 CREATE TABLE person(pid VARCHAR2(18)PRIMARY KEY,name VARCHAR2(200)NOT NULL,birthdate DATE,age NUMBER(4)NOT NULL ,sex VARCHAR2(2)DEFAULT '男'); --book表 CREATE TABLE book(bid NUMBER PRIMARY KEY,bname VARCHAR2(30),bprice NUMBER(5,2),pid VARCHAR2(18),CONSTRAINT b_pid_fk FOREIGN KEY(pid)REFERENCES person(pid)ON DELETE CASCADE); 31.修改约束 如果一张表已经建立完成之后,则可以为其添加约束 ALTER TABLE 表名称 ADD CONSTRAINT 约束名称 约束类型(约束字段); 关于约束名称的命名最好要统一: PRIMARY KEY :主键字段_PK UNIQUE:字段_UK CHECK:字段_CK FOREIGH KEY:父字段_子字段_FK 例如: DROP TABLE person; CREATE TABLE person(pid VARCHAR2(18),name VARCHAR2(200)NOT NULL,birthdate DATE,age NUMBER(4)NOT NULL ,sex VARCHAR2(2)DEFAULT '男'); ALTER TABLE person ADD CONSTRAINT pid_PK PRIMARY KEY(pid); ALTER TABLE person ADD CONSTRAINT name_UK UNIQUE(name); ALTER TABLE person ADD CONSTRAINT age_CK CHECK(age BETWEEN 1 AND 150);CREATE TABLE book(bid NUMBER ,bname VARCHAR2(30),bprice NUMBER(5,2),pid VARCHAR2(18)); ALTER TABLE book ADD CONSTRAINT book_PK PRIMARY KEY(bid); ALTER TABLE book ADD CONSTRAINT pid_FK FOREIGN KEY(pid)REFERENCES person(pid);删除约束 ALTER TABLE person DROP CONSTRAINT name_UK; ALTER TABLE person DROP CONSTRAINT age_CK; 创建表及命名规则? 表名和列名: 必须以字母开头 必须在1–30个字符之间 必须只能包含A–Z, a–z, 0–9, _, $, 和# 必须不能和用户定义的其他对象重名 必须不能是Oracle 的保留字 Oracle默认存储是都存为大写 增删改查语法? 增加: 例如:使用INSERT语句往customers表中插入数据,指定相关列和值 INSERT INTO customers(customer_id, first_name, last_name, dob, phone)VALUES(6, 'Fred', 'Brown', '01-1月-1970', '800-555-1215'); 如果为表所有列都指定值,那么可以忽略列清单 INSERT INTO customersVALUES(6, 'Fred', 'Brown', '01-1月-1970', '800-555-1215'); 可以使用NULL为某些列指定空值 INSERT INTO customersVALUES(8, 'Sophie', 'White', NULL, NULL); 查询:select * fromcustomers;或者select字段 fromcustomerswhere条件 删除:deletefromcustomerswhere条件 更改:update customersset name = 'xiaoming',age = ‘16’(更改多个字段时候用逗号隔开)where 条件 对查询结果进行排序? 语句:select * fromcustomersorderby字段 desc; (asc(升序),desc(降序)如果不写,默认升序) NULL值了解么? NULL值表示未知的值。它是一个特殊的值,但并不是空字符串,NULL值表示该列是未知的。当某些查询语句在输出结果列上看不到值的时候,可能就是NULL值 NVL()和NVL2(): NULL值被查询出来的时候没有显示信息,如何告知用户这是空字符串还是NULL,这可以通过NVL()函数来进行处理 NVL(x,value)是有value显示本身,null显示为替换的value NVL2(x,value1,value2)是如果x不为NULL值,返回value1,否则返回value2 例程: select name,nvl2(email,'已知','未知')from student;【代码含义:代表如果email字段中有值,则显示已知,null则显示未知,如果想显示本来的查询结果select name,nvl(email,'未知')from student;】 update student set name = replace(name,'小','大');【代码含义:代表将STUDENT表中NAME 字段中如果含有小字,那么就将小字替换为大字(操作的不是显示结果,而是将表中数据进行更改)】 Oracle中的简单函数? 字符串函数 concat:将x和y拼接起来,并返回新字符串 例程: select concat(first_name,'-'||last_name)姓名 from customers; Instr字符查找,从1开始。 select instr('asdbcrdbewqrbmde','b')from dual;select instr('asdbcrdbewqrbmde','b',5,2)from dual;【代表从第5个字符开始,第二个b所在的位置】 Ltrim : LTRIM(x,[trim_string])从x字符串左侧去除所有的trim_string字符串,如果没有指定trim_string字符串,则默认为去除左侧空白字符 Rtrim RTRIM(x,[trim_string])从x字符串右侧去除所有的trim_string字符串,如果没有指定trim_string字符串,则默认为去除右侧空白字符 Trim TRIM(trim_string FROM x)从x字符串两侧去除trim_string字符串 Replace REPLACE(x, search_string, replace_string)从字符串x中搜索search_string字符串,并使用replace_string字符串替换。用select执行并不会修改数据库中原始值,但是用update执行可以修改。 Substr SUBSTR(x, start,[length])返回字符串中的指定的字符,这些字符从字符串的第start个位置开始,长度为length个字符;如果start是负数,则从x字符串的末尾开始算起;如果length省略,则将返回一直到字符串末尾的所有字符 例程: select substr('abcd月fg',4,2)from dual;(结果:d月)select substr('abcdefg',-2)from dual;(结果:fq) 日期函数 Sysdate 例程: Selectsysdatefromdual; Select to_char(sysdate, 'yyyy-mm-dd-hh-mm-ss')from dual; Add_months(d1,n1) last_day(): 转换函数 To_char TO_CHAR(x,[ format])将x转化为字符串。format为转换的格式,可以为数字格式或日期格式 select to_char(sysdate,'yyyy-mm-dd')from dual;【一般在查询时候使用,使返回的值成为指定格式】 to_date TO_DATE(x,[format])将x字符串转换为日期 insert into student values(seq_stu.nextval,'小明',to_date('1992-2-18','yyyy-mm-dd'),default,'北京',null);【一般在添加使用】 返回所查询的值中最后一个日期数据。 聚合函数 Avg:平均数 Sum:求和 Max:最大值 Min:最小值 Count:返回统计的行数 Round:四舍五入 例程: select round(avg(bid),1)from bug;分组了解么? 有时需要对表中的行进行分组,然后统计每组的信息,可以使用GROUP BY进行分组,然后再对每组进行统计。 (1)可以使用GROUP BY对多个列进行分组 例: SELECT product_id, avg(customer_id)FROM purchases GROUP BY product_id; (2)可以对分组后的行使用聚集函数,聚集函数会统计每组中的值,对于每组分别统计后返回一个值 例: SELECT product_type_id,BY COUNT(ROWID)FROM BY productsGROUP product_type_id;注意: product_type_idORDER a)如果查询中使用了聚集函数,被查询的列未使用聚集函数处理,那么这些列必须出现在GROUP BY子句后,否则,会提示ORA-00937错误 b)不能使用聚集函数作为WHERE子句的筛选条件,否则,会提示ORA-00934错误 c)可以使用HAVING子句过滤分组后的行 SELECT...FROM...WHERE GROUP BY...HAVING...ORDER BY...;(GROUP BY使用时可以不使用HAVING,但是使用HAVING时必须有GROUP BY才有意义) (3)同时使用WHERE, GROUP BY和HAVING a)首先,执行WHERE筛选掉不符合条件的行 b)然后,将符合条件的行使用GROUP BY进行分组 c)最后,使用HAVING对分组统计的结果进行再次筛选 例: SELECT product_type_id, AVG(price)FROM products WHERE price < 15 GROUP BY product_type_id HAVING AVG(price)> 13 ORDER BY product_type_id; 表的约束条件? 目的: 确保表中数据的完整性。 常用的约束类型: 主键约束(PRIMARY KEY):要求主键列数据唯一,并且不允许为空 非空约束(NOT NULL):指定的列的值不允许为空 唯一键约束(UNIQUE):要求该列唯一,允许为空,但只能出现一个空 值 检查约束(CHECK):指定表中一列或多列可以接受的数据值格式 默认约束(DEFAULT):指定某列的默认值 外键约束(FOREIGN KEY):用于建立和加强两个表数据之间连接的一 列或多列。通过将表中的主键列添加到另一个表中。可以创建两个表之间的连接。这个主键的列就称为第二个表的外键。外键约束就可以确保添加到外键表中的任何行都在主表中都存在相应的行 多表查询? 不同的数据存储在不同的表中,通常要查询多张表才能找到需要的数据 例程: SELECT products.name, product_types.name FROM products, product_types WHERE products.product_type_id = product_types.product_type_id AND products.product_id = 3; products表和product_types表相关字段会用在SELECT语句及WHERE子句上,可以给表起别名,提高代码可读性、降低书写难度 例程: SELECT p.name, pt.name FROM products p, product_types pt WHERE p.product_type_id = pt.product_type_id AND p.product_id = 3 注意: 如果查询两张表,并且没有定义连接条件,那么查询的结果集是两表相乘的结果,这样的情况称之为笛卡尔乘积。总结:多表查询WHERE时,连接次数=查询时连接表的数量-1 常见的三种连接类型: 内连接: 内连接返回的行只有满足连接条件才会返回。如果连接条件的列中有NULL值,那么该行则不会返回 外连接: 外连接返回的行满足连接条件,也包括在连接条件的列包含空值的行 自连接: 连接的表为同一张表 子查询? 子查询是嵌入到另一个SELECT语句中的一个SELECT语句。通过使用子查询,可以使用简单的语句组成强大的语句。当需要从表中选择行,而选择条件却取决于该表自身中的数据时,子查询非常有用。 单行子查询:(1)可以将另外一个查询作为WHERE子句的子查询 例:查询尾名是‘Brown’的首名和尾名 SELECT first_name, last_name FROM customers WHERE customer_id = (SELECT customer_id FROM customers WHERE last_name = 'Brown');(2)在单行子查询还可以使用其他比较运算符,如<>、<、>、<=和>= 例:查询价格大于平均价格的商品编号、名称及价格 WHERE子句中使用>,以及子查询中使用AVG()聚集函数 SELECT product_id, name, price FROM products WHERE price >(SELECT AVG(price)FROM products);(3)在HAVING子句中使用子查询 HAVING是在分组统计后用于过滤行,同样在HAVING子句后面可以跟子查询。单行子查询将返回结果用于HAVING子句过滤分组统计的行 例如:查询平均价格小于最大平均值的商品编号及平均值 SELECT product_type_id, AVG(price)FROM products GROUP BY product_type_id HAVING AVG(price)<(SELECT MAX(AVG(price))FROM products GROUP BY product_type_id)ORDER BY product_type_id; 分页查询? 可以通过ROWNUM来实现。 序列? 序列是一个数据库对象,用于生成一系列的整数。 索引? 索引是与表关联的可选结构。可以创建索引以加快对表执行SQL语句的速度。就像书的索引可以帮助我们更快速的查找信息一样,Oracle中的索引也提供了一种更快地访问表数据的途径。 视图? 视图是基于一张表或多张表或另外一个视图的逻辑表。视图不同于表,视图本身不包含任何数据。表是实际独立存在的实体,是用于存储数据的基本结构。而视图只是一种定义,对应一个查询语句。视图的数据都来自于某些表,这些表被称为基表。数据库中只在数据字典中存储对视图的定义。 1.constraint约束: alter table [table_name] add constraint [pk_name] primary key(pkname);//添加主键 alter table [table_name] drop constraint [pk_name];//删除主键 alter table [table_name] add constraint [fk_name] foreign key(fkname)references [tablename](fkname);//添加外 键 alter table [table_name] drop constraint [fk_name];//删除外键 2.union 关键字: A username, B username rod bruce rose marina select username from A union select username from B 2、几个高级查询运算词 A: UNION 运算符 UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来 自 TABLE2。 B: EXCEPT 运算符 EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时(EXCEPT ALL),不消除重复行。 C: INTERSECT 运算符 INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时(INTERSECT ALL),不消除重复行。 注:使用运算词的几个查询结果行必须是一致的。 3.复合主键一般不设外键 4.组函数也称为聚合函数。 例如:我们把学生可以分为男生和女生两个组,如果想求每组的人数,平均身高,平均年龄等,就需要用到分组函数了。 在SQL中常用的组函数有以下几个: COUNT():求出全部的记录数 MAX():求出一组中的最大值 MIN():求出一组中的最小值 AVG():求出一组中的平均值 SUM():求和 范例:COUNT()函数 SELECT COUNT(empno)FROM emp; 我们常用COUNT(*),最好能够用字段代替* 范例:MAX()、MIN()函数,求最大最小值,一般是针对于数值的字段的,求出所有员工的的最高工资,和最底工资和平均工 资。 SELECT MAX(sal)最高工资,MIN(sal)最底工资,AVG(sal)平均工资 FROM emp; 范例:求出部门10的所有员工工资的总合 SELECT SUM(sal)工资综合 FROM emp WHERE deptno=10; 如果如下查询输出部门编号和其部门所有员工的工资总和,会产生错误。 SELECT deptno ,SUM(sal)工资综合 FROM emp WHERE deptno=10; 错误: “不是单组分组函数” 发生以上的错误信息,是因为这样的查询需要进行分组统计。 分组统计有其固定的语法格式: SELECT {DISTINCT} *| 查询列 列别名1,查询列2 列别名2,…… FROM 表名称1 表别名1,表名称2 表别名2,…… {WHERE 条件(s)} {ORDER BY 排序的字段1,排序的字段2 ASC|DESC} {GROUP BY 分组字段} 所以老师写的是错的! 5.//从t_student表中删除名字重复的记录的信息 delete from t_student where sid not in(select sid from(select min(sid)sid,sname from t_student group by sname)); // delete from tablename where id not in(select max(id)from tablename group by col1,col2,...) 6.sequence 在oracle中sequence就是序号,每次取的时候它会自动增加。sequence与表没有关系。 (1) CREATE SEQUENCE seqTest INCREMENT BY 1--每次加几个 START WITH 1--从1开始计数 NOMAXvalue--不设置最大值 NOCYCLE--一直累加,不循环 CACHE 10;--设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为----NOCACHE(2) 定义好sequence后,你就可以用currVal,nextVal取得值。 CurrVal:返回 sequence的当前值 NextVal:增加sequence的值,然后返回 增加后sequence值 eg: SELECT Sequence名称.CurrVal FROM DUAL; select seqtest.currval from dual(3) 在Sql语句中可以使用sequence的地方: -不包含子查询、snapshot、VIEW的 SELECT 语句 -INSERT语句的子查询中 -INSERT语句的values中 -UPDATE 的 SET中 如在插入语句中 insert into 表名(id,name)values(seqtest.Nextval,'sequence 插入测试'); 7.范式: 所谓第一范式(1NF)是指在关系模型中,对域添加的一个规范要求,所有的域都应该是原子性的,即数据库表的每一 列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。即实体中的某个属性有多个值时,必须拆分 为不同的属性。在符合第一范式(1NF)表中的每个域值只能是实体的一个属性或一个属性的一部分。简而言之,第一范式 就是无重复的域。 第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。 第二范式(2NF)要求数据库表中的每个实例或记录必须可以被唯一地区分。选取一个能区分每个实体的属性或属性组,作 为实体的唯一标识。第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一 部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一 对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二范式就是在第一范式的基础上属性完全依赖于主键。例如在员工表中的身份证号码即可实现每个一员工的区分,该身份证号码即为候选键,任何 一个候选键都可以被选作主键。在找不到候选键时,可额外增加属性以实现区分,如果在员工关系中,没有对其身份证号 进行存储,而姓名可能会在数据库运行的某个时间重复,无法区分出实体时,设计辟如ID等不重复的编号以实现区分,被 添加的编号或ID选作主键。 第三范式(3NF)是第二范式(2NF)的一个子集,即满足第三范式(3NF)必须满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个关系中不包含已在其它关系已包含的非主关键字信息。例如,存在一个部门信息表,其中每个部门 有部门编号(dept_id)、部门名称、部门简介等信息。那么在员工信息表中列出部门编号后就不能再将部门名称、部门简 介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有 大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性,也就是在满足2NF的基础上,任何非主属性不得传 递依赖于主属性。 1、在开发环境中连接到数据库,进行基本的select查询操作; 2、熟悉plsql的使用; 3、熟悉sqlplus相关命令(登录、查询、导入导出等) 登录sqlplus: 第一:使用dos窗口登录sqlplus Sqlplus 用户名/密码@数据库实例名 Sqlplus system/密码@数据库实例名 as sysdba 第二:使用oracle自带的一个sqlplus登录,提供界面,显得更简单一些。显示当前用户名:show user;创建一个用户:create user 用户名 identified by 密码; 给用户赋予登录的权限:grant connect to 用户名;(此时才可以使用这个用户来登录这个数据库。)给其赋予dba的权限。 修改用户的密码:alter user 用户名 identified by 新密码; 查询: Select * from t_user;Select id from t_user;Select name from t_user;Select birthday from t_user;Select id,name from t_user;导入导出: 导出表:(注意,导出表的exp命令不是在sqlplus下使用的,是在dos窗口下使用的命令。) exp userid=test/sa@test tables=(qx)file=d:e1223.dmp exp userid=test/sa@test tables=(t_user,qx)file=f:test.dmp 导出方案: Exp userid=test/sa@test owner=test file=f:test2.dmp 导出数据库: Exp userid=test/sa@test full=y inctype=complete file=f:all.dmp 导入表: 下面以一个例子来说明: 看下面的图,我的用户名test,密码sa,数据库实例名test,所有的表都在这里 现在我执行导出表JD的操作:exp userid=test/sa@test tables=(jd)file=f:jd.dmp 在我的f盘下就出现了这么一个.dmp文件 现在我删除test数据库中的jd文件 现在表JD已经从数据库中删除了 下面我执行表jd的导入操作(就是把表JD导入到我们的test数据库实例中去): imp userid=test/sa@test tables=(jd)file =f:jd.dmp 然后重新刷新我们的数据库中的表,看到jd表被导入进来了。Ok。 导入方案: 4、数据较复杂的查询(关联查询、多表查询、子表查询等) 新建的两张表(包括已经插入的数据):dept和emp如下: 江西新华电脑学院 多表查询: 外连接查询:例子,查询员工表,显示员工姓名,部门名称,部门位置,即使该员工还没有部门。此时使用内连接查询时不可以的,所有使用左连接查询(查询左边表中所有的数据,无论其在右表中是否相对应的数据) select a.empname,b.deptname,b.deptloc from emp a left outer join dept b on a.deptno=b.deptno 右连接查询:(查询右边表中的所有的数据,无论其在左边表中是否有相对应的数据)查询所有的部门,显示部门名称,部门人员信息(姓名,工作)无论该部门是否有人员。现在我们新建一个部门(无名氏),该部门没有任何的人员。查询语句如下 select a.deptname,b.empname,b.job from emp b right outer join dept a on a.deptno=b.deptno 全连接(左右连接)查询两个表中所有的记录 select a.deptname,b.empname,b.job from emp b full outer join dept a on a.deptno=b.deptno 上面的左右连接也可以使用+来代替,如下的查询 select a.empname,b.deptname from emp a,dept b where b.deptno=a.deptno(+)和 select a.empname,b.deptname from emp a,dept b where b.deptno(+)=a.deptno分别表示查询所有部门和所有人,无论该部门是否有人,或者某个人时候是某个部门的。当然,使用+不能表示full的情况。 Union的使用(查询结果的联合): Union将多个结果集联合在一起,去除重复的记录。 Union all将多个结果集联合在一起,不去除重复的记录。例子:我数据库中的数据如下图,emp表和dept表 江西新华电脑学院 select empno,empname from emp where deptno=1 union select deptno,deptname from dept 查询结果如下: 关于union和union all,后者不会去除重复的记录,看下面两段plsql代码和运行的结果便知。select * from emp where deptno=1 union all select * from emp where job='开发' 运行结果: 江西新华电脑学院 select * from emp where deptno=1 union select * from emp where job='开发' 运行结果: Oracle中实现类似t-sql中select top n..的方法是oracle的内置函数rownum(返回行的序列号): 例子:假设我的表emp如下所示 查询每个部门中的销售总和: select deptno,sum(sal)from emp group by deptno 查询每个部门中的销售总和的前两位: select * from (select deptno,sum(sal)from emp group by deptno order by sum(sal)desc)where rownum<=2 江西新华电脑学院 5、熟悉数据库其他操作(创建表,插入、更新、删除记录等) 创建表:create table 表名(字段名 数据类型,字段名 数据类型,……);插入操作:insert into 表名 values(值1,值2….);修改操作:update 表名 set 列名=新值 …where子句 删除记录:delete from 表名 wher子句 注意:插入,修改操作后需要提交,commit,这样数据库才会更新; 江西新华电脑学院第二篇:Oracle数据库学习总结
第三篇:Oracle数据库总结范文
第四篇:Oracle数据库 知识点总结
第五篇:学习oracle数据库的总结(图文整理)(定稿)