oracle,Oracle_day01

Oracle基础
Oracle服务器:由两大部分组成,Oracle数据库和Oracle实例。
Oracle数据库:位于硬盘上实际存放的数据文件,这些文件组织
在一起,成为一个逻辑整体,即为Oracle数据库。
因此,在Oracle看来,数据库是只硬盘上文件的集合,
必须要与内存中的实例合作,才能对外提供数据管理服务。
Oracle实例: 位于物理内存中的数据结构。它由一共享的内存池和
多个后台进程组成,共享的内存池可以被所有的进程访问,
用户如果要存储数据库(也就是硬盘上的文件)里的数据,
必须通过实例才能实现,不能直接读取硬盘上的文件。
=====================
操作Oracle的工具:
1.在命令行程序:sqlplus
2.iSql*Plus(Web)等图形化工具
=====================
SQL语句说明
1.SQL 语言大小写不敏感。
2.SQL 可以写在一行或者多行(使用时最后要以分号结尾,表示一条SQL语句)
3.关键字不能被缩写也不能分行
4.格式:
各子句一般要分行写。
使用缩进提高语句的可读性。
=====================
登录、注销:
使用的用户:
用户名:scott
密码 :tiger
登录:
sqlplus scott/tiger
退出:
exit
登录管理员:
执行 sqlplus / as sysdba
查看当前用户有哪些表:
select * from tab;
注意:用户名不区分大小写,但是密码区分
=====================
显示当前用户
SQL> show user
USER 为 "SYS"
切换用户
SQL> connect scott/tiger
已连接。
命令可以使用缩写
conn[ect] user
执行上一条sql语句
/
设置行宽
set linesize 150 默认为80
设置页面大小(一页显示的数据)
set pagesize 100 默认为14
显示参数的值
show 参数名
如:
show linesize
永久保存配置
修改 glogin.sql 文件
文件在:oracleHome\product\10.2.0\db_2\sqlplus\admin\glogin.sql
注释:
单行注释:--
多行注释: /* */
查看表结构
SQL> desc dept
===========================
用户锁定、解锁、修改密码
解锁用户:
alter user 用户名 account unlock;
锁定用户:
alter user 用户名 account lock;
修改密码:
alter user 用户名 identified by 新密码;
修改管理员密码:
alter user sys identified by 新密码;
===========================
Oracle启动和关闭
必须是sys用户,命令为:
启动:
startup open
关闭:
shutdown immediate
===========================
SQL语句与SqlPlus命令
SQL语句
一种语言
ANSI 标准
关键字不能缩写
使用语句控制数据库中的表的定义信息和表中的数据
SqlPlus命令
一种环境
Oracle的特性之一
关键字可以缩写
命令不能改变数据库中的数据的值
===========================
SCOTT用户的表:
dept表:
deptno 编号
dname
loc 位置
emp表:
empno 员工编号
ename
job
mgr 上级主管的员工编号
hiredate 入职时间
sal 薪水
comm 奖金
deptno 所属的部门编号 --> 引用dept.deptno
===========================
清屏:
Windows中:host cls
Linux中 :host clear
设置某列的宽度:
column job format a15 或 col job for a15
column SAL format 9999 或 col sal for 9999
格式:
col[umn] 列名 for[mat] 格式
对于字符串:
a20,20是一个数据,表示20个字符的宽度。
对于数字
9表示一位,有几个,就是多宽。
===========================
空值(null)与对空值的处理
1. 空值是无效的,未指定的,未知的或不可预知的值
2.空值不是空格或者0。
3.包含空值的数学表达式的值都为空值
修改上一条SQL语句
ed[it]
注意:后面不要写分号
滤空函数
nvl(表达式, 当表达式为空时使用的值)
select empno, ename, sal, sal * 12 as 年薪, nvl(comm, 0), (sal * 12 + nvl(comm,0) ) 总收入
from emp;
===========================
字符串
是匹分大小写的,在使用时要加引号。
在指定别名时,引号可以加,也可以不加。
当含有空格、特殊字符时,一定要加引号。
不加引号时,显示都为大写,加上引号后,就是按所写的显示了。
在使用字符串时,要使用单引号。
在写别名时,要使用双引号。
去掉重复的行
在 SELECT 子句中使用关键字 ‘DISTINCT’ 删除重复行
-- 作用于一列
SQL> select distinct job from emp;
-- 作用于多个列,所有列的值加一起重复才算重复的记录
SQL> select distinct job, deptno from emp;
如果只查询一个表达式,没有用到任何表的数据,这时也必须得写from...
可以写成 from dual
dual是一个虚表,本身就存在的,可以直接使用。
如:
select 3+2
select 'Hello' || 'World' from dual;
字符串连接符
SQL> select ename || '的薪水是' || sal from emp;
ENAME||'的薪水是'||SAL
----------------------------------------------------------
SMITH的薪水是800
ALLEN的薪水是1600
WARD的薪水是1250
也可以使用函数 concat():
SQL> select concat('Hello', 'World') from dual;
只能两个参数
============================
LIKE
在使用like时,可以使用 % 与 _,分别表示任意数量的任意字符或任意一个字符。
要想表达%或_本身,需要使用转义符,例:
SQL> select * from emp where ename like 'KI\%%' escape '\';
回避特殊符号的:使用转义符。例如:将[%]转为[\%]、[_]转为[\_],然后再加上[ESCAPE ‘\’] 即可
BETWEEN
包含两个边界。
一定是小值写到前面,大值写到后面,否则没有结果。
IN
where .. in (.., .., .., ...) 如果含有null,没有影响。
例:查询所有是经理的员工
SQL> select * from emp where empno in (select mgr from emp);
where .. not in (.., .., ...) 如果含有null,则不返回任何结果。
例:查询所有不是经理的员工
SQL> select * from emp where empno not in (select mgr from emp where mgr is not null);
============================
对空值(null)的处理
使用 IS (NOT) NULL 判断空值。
select *
from emp
where comm is null;
============================
MySQL中日期类型:date, time, datetime
Oracle中只有Date.
默认的日期格式是 DD-MON-RR。
SimpleDateFormat
yyyy-MM-dd
对日期的处理
1,查询指定日期后入职的员工信息
SQL> select * from emp where hiredate>'31-12月-81';
2,修改日期的格式
SQL> select * from v$nls_parameters;
SQL> alter session set nls_date_format='yyyy-mm-dd'; // 只对当前session有效
3,使用日期函数的方式:
SQL> select * from emp where hiredate>to_date('1981-12-31', 'yyyy-MM-dd');

SQL> select * from emp where to_char(hiredate, 'yyyy-MM-dd') > '1981-12-31';
语法:TO_CHAR(date, 'format_model')
语法:TO_DATE(str, 'format_model'
格式字符串不区分大小写:
获取当前时间:
SQL> select to_char(sysdate,'YYYY-MM-DD') from dual;
TO_CHAR(SY
----------
2012-03-07
SQL> select to_char(sysdate,'yyyy-mm-dd') from dual;
TO_CHAR(SY
----------
2012-03-07
包括时分秒
SQL> select to_char(sysdate,'yyyy-mm-dd hh:mi:ss') from dual;
TO_CHAR(SYSDATE,'YY
-------------------
2012-03-07 02:33:41
==============================
排序:
order by 列名, ...
可以作用在:数字、日期、字符串。
可以使用列名,表达式,别名,序号(表示select中的第几个列)
升序ASC(默认)、降列DESC
按一个列排列,按多个列排序
当order by所在的列中有null,会:
升序时,null的在下面。
降序时,null的在上面。
我们希望,不管升序还是降序,null值的始终在下面
方式一:SQL> select * from emp order by comm desc nulls last;
方式二:
select empno, ename, job, hiredate, sal, nvl(comm, 0)
from emp
order by 6 desc
==============================
1,组函数
select
max(sal) 最高工资,
min(sal) 最低工资,
avg(sal) 平均工资,
sum(sal) 所有员工的工资和,
count(sal) 领工资的员工数量
from emp;
2,组函数对null的处理
例,查询所有员工的平均奖金(有人的奖金为null)
select sum(comm)/count(*) 平均奖金 from emp
组函数会自动过滤掉null值。
在使用avg()时要注意处理null值:
select avg( nvl(comm, 0) ) from emp;
函数可以嵌套使用
3,分组
Group by,写在FROM后,如果有WHERE,就在WHERE后面。
查询的列一定要是:
在group by中出现的列(在Select中不一定全写上)
或是使用组函数
按一个列分组
按多个列分组
参与分组的多个列有一个不相同就是不同的组。
4,分组结果过滤
Having,是分完组后再进行过滤,只显示符合条件的结果。
在Group by与Having中都不可以使用别名。
与Where的区别
Having是分完组后再进行过滤。
Where是先过滤,再进行分组操作。
如果可以,尽量写Where条件,不写Having。
格式:
Select
...
From
...
Where
...
Group by
...
Having
...
Order by
...
不能在 WHERE 子句中使用组函数(注意)。
可以在 HAVING 子句中使用组函数。
使用 HAVING 子句过滤分组:
1. 行已经被分组。
2. 使用了组函数。
3. 满足HAVING 子句中条件的分组将被显示。
==============================
子查询:
当一步不能求解时,可以使用子查询。
分为:
单行子查询
多行子查询
可以在主查询的select, from, where, having 都可以放子查询
不可以在主查询的group by 放子查询
单行操作符对应单行子查询,多行操作符对应多行子查询
在select中放子查询时,要求只能是单行子查询。
IN:
ANY:
小于某集合中的任意一个值,就是小于最大值。
大于某集合中的任意一个值,就是大于最小值。
ALL:
小于某集合中的所有值,就是小于最小值。
大于某集合中的所有值,就是大于最大值。
练习题一:
题目:找到薪水大于本部门平均薪水的员工。
答案:
select *
from emp e1
where sal > ( select avg(sal) from emp e2 where e2.deptno=e1.deptno )
练习题二:
题目:找到员工表中工资最高的前三名的员工信息
答案:
select rownum, empno, ename, sal
from (select empno, ename, sal from emp order by sal desc)
where rownum<=3
注意:rownum是一个伪列,表示记录在结果集中的行号。
1,rownum一旦生成,就不会变化(会先按没有排序时的默认顺序生成rownum,然后再执行排序)。
2,对于rownum,只能使用<与<=,不能使用>与>=与=。
select
rownum, empno, ename, sal
from (
select rownum r1, empno, ename, sal
from emp
where rownum<=10
)
where rownum<=5
select rownum, empno, ename, sal
from
... r1 ...
where
rownum<=10 and r1>5
Tags:  oracle下载 oracle

延伸阅读

最新评论

发表评论