ORALCE常识及SQL 基本语法

第一章 ORALCE常识 及 SQL 基本语法

1,ORACLE安装完成后的初始口令?
internal/oracle
sys/change_on_install
system/manager
scott/tiger scott是Oracle的核心开发人员之一,tiger是他家的一只猫的名字
sysman/oem_temp

例:conn scott/tiger@jspdev;

   conn system/manager@jspdev as sysdba;

2,IBM的Codd (Edgar Frank Codd)博士提出《大型共享数据库数据的关系模型》

3,ORACLE 9i 中的 i (internet)是因特网的意思

4,ORACLE的数据库的物理结构:数据文件、日志文件、控制文件

5,ORACLE的数据库的逻辑结构:表空间——表——段——区间——块
表空间 类似于SQLSERVER中数据库的概念

6,SYSDATE 返回当前系统日期(说明:当函数没有参数时可以省略括号)

7,在SQL PLUS中 执行缓冲区中的SQL命令的方式:
SQL> run
SQL> r
SQL> /

8,在SQL PLUS中 修改当前会话的日期显示格式
SQL> alter session set nls_date_format = 'YYYY-MM-DD'

9,使用临时变量,提高输入效率
SQL> insert into emp(empno,ename,sal) values(&employeeno,'&employeename',&employeesal);

10,从其他表中复制数据并写入表
SQL> insert into managers(id,name,salary,hiredate)
SQL> select empno,ename,sal,hiredate
SQL> from emp
SQL> where job = 'MANAGER';

11,修改表中的记录
SQL> update table set column = value [,column = value,……] [where condition];

12,删除表中的记录
SQL> delete [from] table [where condition];

13,数据库事务,事务是数据库一组逻辑操作的集合
一个事务可能是:
多个DML语句
单个DDL语句
单个DCL语句

14,事务控制使用 savepoint,rollback,commit 关键字
SQL> savepoint aaa;
SQL> rollback to aaa;
SQL> commit;

15,查询表中的数据
select * from table_name;
select column_list from table_name;

16,Number and Date 可以用于算术运算
因为 Date 类型 其实存储为 Number 类型

17,用运算表达式产生新列
SQL> select ename,sal,sal+3000 from emp;
SQL> select ename,sal,12*sal+100 from emp;

18,算术表达式中NULL值错误的处理
因为任何数与NULL运算无意义,所以为避免错误,需要用其他值替换NULL值
例如:
SQL> select ename "姓名",12*sal+comm "年薪" from emp where ename = 'KING';
姓名 薪水
---------- ----------
KING
因为comm(提成工资)列为NULL值,结果也出现了NULL值,所以需要用0来替换NULL
注意函数nvl的使用 NVL(原值,新值)
SQL> select ename "姓名",12*sal+NVL(comm,0) "年薪" from emp where ename = 'KING';
员工姓名 员工薪水
---------- ----------
KING 60000
——————————————

19,使用友好的列名,有下面三种形式
SQL> select ename as 姓名, sal 月薪, sal*12 "年薪" from emp

20,过滤重复行,使用关键字 distinct
SQL> select distinct * from emp;

21,SQL PLUS访问ORACLE数据库的原理
SQL*Plus —> Buffer —> Server —> Query Result

22,where 子句中 字符型 是区分大小写的,最好都转成大写
因为在ORACLE库中,字符会转换成大写来保存

23,比较运算符:等于"=",不等于有两种"<>"或者"!="

24,复杂的比较运算符:
between …… and ……
in (……value list……)
like (% 代表匹配至多个任意字符,_ 代表单个任意字符)
null (与NULL进行比较时,需要使用 is null 或者 is not null)

25,逻辑运算符,按优先级从高到低排列
Not , And , Or

26,Order by 子句 中 ( asc 表示 升序,desc 表示降序)

27,ORACLE 函数,分为
单行函数:每条记录返回一个结果值
多行函数:多条记录返回一个结果值

28,字符函数——转换函数
LOWER:转为小写
UPPER:转为大写
INITCAP:将每个单词的首字母大写,其他字母小写

29,字符函数——操纵函数(注意:ORACLE以UNICODE存储字符)
CONCAT:连接两个字符串,与并置运算符“||”类似
SUBSTR:substr(string,position,length) 从string中的position开始取length个字符
LENGTH:返回字符串的长度
INSTR: instr(string,value) 返回 value 在 string 的起始位置
LPAD: lpad(string,number,value) 若string不够number位,从左起用vlaue字符串填充(不支持中文)

30,四舍五入函数 round(数值,小数位)
SQL> SELECT ROUND(45.923,2),ROUND(45.923,0),ROUND(45.923,-1) FROM DUAL;

ROUND(45.923,2) ROUND(45.923,0) ROUND(45.923,-1)
--------------- --------------- ----------------
45.92 46 50

31,数值截取函数 trunct
SQL> SELECT TRUNC(45.923,2),TRUNC(45.923,0),TRUNC(45.923,-1) FROM DUAL;

TRUNC(45.923,2) TRUNC(45.923,0) TRUNC(45.923,-1)
--------------- --------------- ----------------
45.92 45 40

32,求模函数 MOD(a,b) 返回a被b整除后的余数

33,Oracle内部默认的日期格式: DD-MON-YY (24-9月 -06)

34,DUAL :哑元系统表,是名义表,只能范围唯一值

35,Date类型的算术运算,以天为单位
例如:部门编号为10的员工分别工作了多少年
SQL> select ename,(sysdate-hiredate)/365 as years from emp where deptno = 10;

ENAME YEARS
---------- ----------
CLARK 25.3108341
KING 24.8697382
MILLER 24.6861766

36,日期函数
MONTHS_BETWEEN 返回两个日期之间相差多少个月
ADD_MONTHS 在日期上加上月份数
NEXT_DAY 下一个日子 select next_day(sysdate,'星期一') from dual;
LAST_DAY 该月的最后一天
ROUND 四舍五入日期 round(sysdate,'year') 或者 round(sysdate,'month')
TRUNC 截取日期 trunc(sysdate,'year') 或者 trunc(sysdate,'month')

37,数据类型转换 —— Oracle 可隐式转换的情况有:
From To
varchar2 or char —— number (当字符串是数字字符时)
varchar2 or char —— date
number —— varchar2
date —— varchar2

38,数据类型转换 —— Oracle 数据类型转换函数
to_char
to_number
to_date

39,日期格式模型字符
YYYY 代表完整的年份
YEAR 年份
MM 两位数的月份
MONTH 月份的完整名称
DY 每星期中天的三个字符缩写
DAY 表示星期日——星期六

另外还有 D,DD,DDD 等。。。

40,NVL(value,substitute)
value:是可能有null的列,substitute是缺省值
这个函数的作用就是当出现null值的时候,后缺省值替换null

41,Coalesce(exp_name1,exp_name2……exp_n)

42,Decode 函数: Decode(exp,testvalue1,resultvalue1,testvalue2,resultvalue2)
例如,根据国家名称显示相应的国家代码:
1>创建国家表
create table countrys
(
vCountryName varchar2(50)
);
2>写入几行,分别为中国、日本、韩国
insert into countrys values ('&name');
3>用DECODE函数,进行匹配和显示
select vCountryName as "国家名称",
DECODE(vCountryName,'中国','086','日本','116') as "国家编号" from countrys;

国家名称 国家编号
-------------------------------------------------- ---
中国 086
日本 116
韩国

结果,在DECODE中存在且成功匹配的值将会被显示,否则显示为NULL

43,SQL PLUS 的一些命令
SQL> SAVE 'D:\EMPSQL.TXT' --把当前缓存的SQL命令保存到文件
SQL> GET 'D:\EMPSQL.TXT' --从文件读取SQL命令到缓存
SQL> RUN --运行SQL命令
SQL> @'D:\EMPSQL.TXT' --从文件读入SQL命令到缓存,并执行
SQL> CONNECT SYSTEM/MANAGER@JSPDEV --连接到某个指定数据库
SQL> CONNECT SYSTEM/MANAGER
--连接到本机ORACLE数据库,是上一个命令简化
SQL> CONN SYSTEM/MANAGER --CONNECT命令的缩写
SQL> SHOW USER -显示当前用户的用户名
SQL> SET SQLPROMPT HELLO> --修改命令提示符
SQL> SET WRAP OFF --不换行
SQL> SET SERVEROUTPUT ON> --打开服务器回显
SQL> LIST --列出当前缓冲区的内容
SQL> L --同上,列出当前缓冲区的内容

44,ORACLE数据库中 锁 的概念
锁是数据库的一种机制,它用来管理对一个共享资源的并行访问
共享资源:不仅指数据库记录,而且也指其他的资源(如表)
当多个用户同时访问数据库中的同一资源时,就会产生对同一资源的访问的冲突
为了防止资源被破坏,数据库采取了解决访问冲突的机制,称之为 锁

45,行级锁
行被排他锁锁定时,其他用户不能修改此行,用COMMIT,ROLLBACK结束事务时,锁将释放,其他用户将得到权限
获取行级锁:当使用DML语句操作行时,自动行级排他锁
SELECT …… FOR UPDATE [WAIT number_second] 可以在一行或多行上行级排他锁
例:
创建表
CREATE TABLE TEST AS SELECT EMPNO,ENAME FROM EMP
查询时,不允许 其他用户修改,以保证查询到的是最新的数据
SELECT * FROM TEST FOR UPDATE
等待30秒
SELECT * FROM TEST FOR UPDATE WAIT 30

46,表级锁
在多个用户同时访问数据时确保数据的完整性,可以设置(共享锁,共享更新锁,排他锁)

47,手工锁表——共享锁
LOCK TABLE IN share mode;
lock table test in share mode;

48,手工锁表——共享更新锁
LOCK TABLE IN share update mode;
lock table test in share update mode;

49,手工锁表——排他锁
LOCK TABLE IN exclusive mode;
lock table test in exclusive mode;
lock table test in exclusive mode nowait;

50,ORACLE 数据库存储数据的方式
规则表、分区表、索引组织表、簇

51,ORACLE 数据类型简表
数据类型 描述
VARCHAR2(size) 可变长字符数据类型(1-4000)
CHAR(size) 固定长度字符类型(1-2000)
NUMBER(p,s) 数值型(p:有效数据位数,s小数位)
DATE 日期数据类型
LONG 可变长的字符型 最大2G
CLOB 单字节的大型字符对象 最大 4G(常用于保存大文本)
BLOB 二进制大型对象 最大 4G (常用于保存媒体文件)
RAW(size) 原始的二进制数据 最大2000
LONG RAW 可变长的原始二进制数据 最大2G
BFILE 存储在外部文件中的二进制数据 最大 4G(数据库中实际上只存了指针)

52,ROWID 与 ROWNUM
ROWID 是十六进制字符串,表示行的唯一地址
ROWNUM是行相对于表中其他行的位置序列(常用于查询顶部N条记录或者分页显示时)

SQL> SELECT ROWID,ROWNUM,EMPNO,ENAME FROM EMP;

ROWID ROWNUM EMPNO ENAME
------------------ ---------- ---------- ----------
AAAH14AABAAAO+HAAA 1 7369 SMITH
AAAH14AABAAAO+HAAB 2 7499 ALLEN
AAAH14AABAAAO+HAAC 3 7521 WARD
AAAH14AABAAAO+HAAD 4 7566 JONES
AAAH14AABAAAO+HAAE 5 7654 MARTIN
AAAH14AABAAAO+HAAF 6 7698 BLAKE
AAAH14AABAAAO+HAAG 7 7782 CLARK
AAAH14AABAAAO+HAAH 8 7788 SCOTT
AAAH14AABAAAO+HAAI 9 7839 KING
AAAH14AABAAAO+HAAJ 10 7844 TURNER
AAAH14AABAAAO+HAAK 11 7876 ADAMS


53,创建表,注意数据类型的默认转换存储
SQL> create table student
2 (
3 stuno int,
4 stuname varchar(10) not null,
5 stuBirth date default to_date('1980-01-01','YYYY-MM-DD')
6 );

SQL> DESC STUDENT;
名称 是否为空? 类型
----------------------------------------- -------- -------------
STUNO NUMBER(38)
STUNAME NOT NULL VARCHAR2(10)
STUBIRTH DATE

我们发现 int 型 被保存为了 NUMBER(38) , varchar(10) 被保存为了 VARCHAR2(10)

54,添加字段
SQL> alter table student add(stuPhone varchar(18));

55,修改字段
SQL> alter table student modify(stuName varchar(12));

56,设置某列为无用状态(一般在删除列之前,先把该列设置为无用)
SQL> alter table student set unused column stuname;
再次查看表结构,发现该列已经找不到了
SQL> desc student;
名称 是否为空? 类型
----------------------------------------- -------- --------------
STUNO NUMBER(38)
STUBIRTH DATE
STUPHONE VARCHAR2(18)

57,删除无用的列(一次可以删除全部无用的列)
SQL> alter table student drop unused columns;

58,添加约束
SQL> alter table student add constraint pk_stuno primary key(stuno);

59,撤消约束
SQL> alter table student drop constraint pk_stuno;

60,表分区
ORALE允许用户对表进一步的规划,即对表进一步拆分,将表分成若干个逻辑分区,每个部分称其为表分区。
分区的优点:
?增强可用性。单个分区出现故障,不影响其他分区
?均衡的I/O。不同的分区可以映射到不同的磁盘
?改善性能
61,表分区——范围分区法(range)
这种分区方法是根据表中列值的范围对表进行分区
分区时,首先依据列中的值可能的范围进行划分
例:某省对参加4,6级考试的成绩进行整理并保存至数据库,我们可以对于分数段进行划分
SQL> create table student
2 (
3 studentId integer not null,
4 studentName varchar2(20),
5 score integer
6 )
7 Partition by range(score)
8 (
9 Partition p1 values less than(60),
10 Partition p2 values less than(75),
11 Partition p3 values less than(85),
12 Partition p4 values less than(maxvalue)
13 );

表已创建。

插入一些值
SQL> insert into student values (&stuno,'&name',&score);

可以分别查看每个分区中的记录
SQL> select * from student partition(p1);
SQL> select * from student partition(p2);
SQL> select * from student partition(p3);
SQL> select * from student partition(p4);

注意:maxvalue 是 >= 85 到 最大值的分区,null 值也将包括在这一分区内
range 的字段 可以是 数值 或 日期 类型

62,表分区——散列分区法(hash)
散列分区法提供了一种通过指定分区编号来均匀地分布数据的方法
它通过HASH函数将数据映身到相应的分区上
它可使得数据均匀的分布到各分区上,各分区大小趋向一致

SQL> Create table department
2 (
3 DeptNo int,
4 DeptName varchar2(14)
5 )
6 Partition By hash(deptno)
7 (
8 Partition p1,
9 Partition p2
10 );

63,表分区——复合分区法
复合分区先对数据进行范围分区,然后在每个子分区又进行散列分区的一种分区方法

64,表分区——列表分区法
列表分区允许用户明确地控制行到分区的映射
不同于范围分区或散列分区,它允许按自然方式对无序和不相关的数据集进行分组和组织
例如:在客户表中记录着客户的国别信息。它们是中国、美国、英国、加拿大
在创建表时,我们可以对表进行列表分区。
注:假设有一个新的国家,在列表值中不存在,该条记录将无法写入
create table customer
(
custNo int,
custName varchar(20),
custState varchar(20)
)
Partition by list(custState)
(
Partition Asia values ('中国','韩国','新加坡'),
Partition Europe values('英国','法国','德国'),
Partition Ameria values ('美国','加拿大','墨西哥')
)

65,添加表分区
SQL> alter table student add partition p5 values less than(20);

66,撤消表分区
SQL> alter table student drop partition p4;

67,截短表分区
SQL> alter table student truncate partition p5;

68,合并表分区
SQL> alter table student merge partitions p3,p4 into partition p6;

69,涉及表分区的数据字典 user_tab_partitions user_ind_partitions

70,同义词——数据库对象的替换名称
同义词的优点:
?简化SQL语句
?隐藏对象的名称或所有者
?为分布式数据库的远程对象提供位置透明性
?提供对对象的公共访问

71,同义词类型:
私有同义词(普通用户创建的),
公有同义词(DBA创建的)

72,创建同义词:
create synonym syn_emp for scott.emp;
create public synonym employee for scott.emp;

73,撤消同义词
drop synonym syn_emp;

74,序列:是能够自动产生连续唯一值的数据库共享对象(序列用于为主键提供值)

75,创建序列
CREATE SEQUENCE sequence
increment by n
start with n
[maxvalue n|nomaxvalue]
[minvalue n|nominvalue]
[cycle|nocycle]
[cache n|nocache] ;

76,创建视图
create or replace view v_name 用于创建视图

create or replace force view v_name 用于创建带错误的视图
——(当表不存在、列不存在、或无权限)

SQL> CREATE OR REPLACE FORCE VIEW V_SS AS SELECT * FROM TT;

警告: 创建的视图带有编译错误。

SQL> SHOW ERROR;
没有错误。

77,联接视图——通过联接多个表来创建视图

78,键保留视图——联接视图中的表,其主键列显示在联接视图中

79,分区视图——数据存储在单独的表分区中
在运行期间,使用 union all 将这些表分区联合起来

SQL> create table temp1 as select * from emp where deptno = 10;

表已创建。

SQL> create table temp2 as select * from emp where deptno = 20;

表已创建。

SQL> create or replace view view_temp
2 as
3 select * from temp1
4 union all
5 select * from temp2;

视图已建立。

SQL> select * from view_temp;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ---------- ---------- ---------- ----------
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7839 KING PRESIDENT 17-11月-81 5000 10
7934 MILLER CLERK 7782 23-1月 -82 1300 10
7369 SMITH CLERK 7902 17-12月-80 800 20
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7788 SCOTT ANALYST 7566 19-4月 -87 3000 20
7876 ADAMS CLERK 7788 23-5月 -87 1100 20
7902 FORD ANALYST 7566 03-12月-81 3000 20

已选择8行。

80,撤消视图 DROP VIEW v_name;

81,Oracle中视图相关的数据字典 user_views

82,重新编译视图 alter view v_name compile;

83,查询视图中的信息与查询表基本一致 select * from v_name;

第二章:索引

1,索引
与表关联的可选结构
加快SQL语句的执行
减少磁盘I/O
CREATE INDEX 语句用于创建索引
在逻辑上和物理上独立于表中的数据
ORCALE自动维护索引

2,唯一索引
确保在定义索引的列中没有重复的值
ORACLE自动为主键列和唯一键列创建唯一索引
CREATE UNIQUE INDEX 语句用于创建唯一索引

//创建唯一索引的语法 CREATE UNIQUE INDEX index_name on table_name(column_name);
//例:
SQL> create unique index idx_stuId on student(studentid);

3:组合索引
在表的多个列上创建的索引
也称为“连接索引”
组合索引中的列可以按任意顺序排列
对于在WHERE子句中包含多个列的查询,可以提高数据访问速度

//创建组合索引的语法 CREATE INDEX index_name on table_name(cloumns_list);
//例:
SQL> create index idx_empNoAndDeptNo on emp(empNo,deptNo);
//在WHERE子句中同时已这两列为条件时,将引用到这个索引
SQL> select * from emp where empNo=7899 and deptNo=10;

4:反向键索引
适合于只做添加不做修改的列
反转索引列中的没一个字节(如:001,002 分别反转为 100,200)
将数据插入操作分布在整个索引上
在创建索引时使用REVERSE关键字

//创建反向键索引的语法 CREATE INDEX index_name on table_name(column_name) REVERSE;
//例:
SQL> create index idx_studentId on student(studentId) REVERSE;

5,位图索引
适合于有大量重复数据的列,(例如员工表的部门编号列,部门编号大量重复)
为低基数列创建
BITMAP INDEX 语句用于创建位图索引
优点:减少响应时间,降低空间占用

//创建位图索引的语法 CREATE BITMAP INDEX index_name on table_name(column_name);
//例:
SQL> create bitmap index idx_deptNo on emp(deptNo);

6,索引组织表
表的数据存储在与其关联的索引中
对于数据的修改只会导致对索引的更新
基于主键进行搜索(所以表中必须要定义主键列)

//创建索引组织表的语法
CREATE TABLE table_name
(
colName colDataType,
……
CONSTRAINT pk_id PRIMARY KEY (table_pkcolumn)
) ORGANIZATION INDEX;
//例:
SQL> create table citys
2 (
3 nCityCode number(10),
4 vCityName varchar2(50),
5 constraint pk_citycode primary key (nCityCode)
6 ) organization index;

7,普通表与索引组织表的对比
普通表 索引组织表
ROWID唯一地标识行 主键唯一的标识行
有隐式的ROWID列 没有隐式的ROWID列
基于ROWID的访问 基于主键的访问
顺序扫描返回所有的行 完全索引扫描返回所有行,并按主键顺序排列
普通表可以存储在簇中 索引组织表不能存储在簇中
支持分发、复制、分区 不支持分发、复制、分区

8,基于函数的索引
基于一个或多个列上的函数或表达式创建的索引
表达式中不能包含聚合函数(SUM、COUNT、AVG、MIN、MAX)
不能在LOB、REF或潜逃表列上创建

//例:创建基于函数的索引
SQL> conn system/manager; //不清楚为什么scott帐户没有权限创建基于函数的索引
SQL> create index idx_cityName on scott.citys(lower(vCityName));
//在今后的SELECT语句WHERE子句中 使用lower(vCityName) 条件时,就自动引用了上面的索引

9,键压缩索引
将索引键拆分为前缀项和后缀项
在一个索引块中,通过后缀项共享前缀项即可达到压缩的目的
节省磁盘空间

//创建键压缩索引的语法 CREATE INDEX index_name table_name(前缀项列,后缀项列) COMPRESS 压缩的列序号;
//例: job(职位)列中有大量重复数据,则压缩job(职位)列,即第1列
SQL> create index idx_emp on emp(job,ename) compress 1;

10,分区索引
索引存储在不同的分区中
分区索引的类型
本地前缀索引
本地无前缀索引
全局索引
全局前缀索引
全局无前缀索引

你可能感兴趣的:(SQL数据库相关,sql,table,oracle,数据库,null,date)