greatjone

BlogJava 联系 聚合 管理
  7 Posts :: 24 Stories :: 3 Comments :: 0 Trackbacks

 数据库  DataBase

关系数据库管理系统 RDBMS 

数据库的功能 存储和管理数据。 

数据库较文本文件

文本文件存储数据的缺点:没有数据类型,只能存储字符串;查询数据不方便;不适合存储大数据量;不安全

数据库的优点:它克服了文本文件的以上缺点之外,还可以供多用户同时访问。 

数据库的工作模式:使用SQL语言进行通信:Structed Query Language(结构化查询) 

连接oracle步骤:

       1. 登陆,利用telnet命令

       2. 键入sqlplus username/password

       3. 执行sql命令对数据进行CURD操作

       4. 退出exit (断开连接,退出客户端程序) 

对数据库的基本操作:

       因为数据库中存储数据的单位是表(table),所以我首先讲的是对表的基本操作。

       1.建表sql

              语法:create table( columnname type constrain);      

       2.删表sql

              语法:drop table tablename; 

       3.对表的增删改查。具体细节,后面将作详细介绍。

       将成批的sql语句放在.sql文件中,可用命令start/@ 路径/文件名 的方式批量执行

其它常用操作:

1.查看当前用户下有哪些表:select table_name from user_tables;

2.获得表的结构:desc 表名   descdescribe的简写

3.查询表中数据 可用   select 列名,列名,... from 表名

 

sqlplus命令与sql命令的区别:

1. 执行的客户端不一样。

2. sqlplus命令可以不以;作为结束,sql命令必须以;结束。

 

sqlplus命令:exitdesc 表名,start (@)文件名

       col   列名 format 格式(控制查询结果显示) 

       col empno format 9999 

       col sal format 9999.99  

       col job format a10

       set pagesize 200

       /  执行最近一次sql命令

       list   显示最近一次sql命令

       c/旧值/新值   修改最近一次sql命令 

       conn 用户名/密码 切换用户     

       help index 显示帮助    

 

CURD操作

      

select查询

常规查询:select 1,列2,.... from 表名 where 条件;

注意其中列名如果是表的全部列,则可用*代替,不过它比直接写列名在执行效率上要慢。

sql语句中如果要用到字符串,则需使用''括起来,并且字符串的比较是区分大小写的。

在条件子句中如果用逻辑运算符,记住它们是有优先级别的:优先级not> and > or,所以可用()来改变优先级

 

模糊查询:like 字符串,e.g:

查询姓名中第二个字母是A的员工:select * from emp where ename like '_A%';

在模糊查询中有两种通配符:% 表示匹配0到多个任意字符;_表示匹配1个任意字符

 

查询语句中可用的函数

一般函数sql:

       1.select 100 + 200 (as) result from dual; //dual为系统表,它只有一行一列result为列的一个别名,as可以省略不写

       2.select abs(-4738) from dual;//abs()函数是求绝对值的

       3.select mod(10, 3) from dual;//mod()函数是求模(余数)

       4.select dbms_random.random() from dual;//dbms_random.random()用来生成随机数

例:随机生成一个1000以内的正整数:

select mod(abs(dbms_random.random()),1000 ) from dual;

字符串函数

       1.连接字符串

              select 'abc' || 'def' from dual;

              select concat('abc','def') from dual;

              select empno || '/' || ename || '/' || job from emp;

       2.大小写转换:lower()upper()    

              select upper('fdjk') from dual;

       3.select instr('abcdefg', 'c') from dual;ans:3

//instr 求子串在字符串中的初始位置(注意它是从1开始的)

       4.select substr('abcdefg', 4) from dual;ans:defg

//substr用来截取字符串,注意它也是从1开始的

       5.select length('abcdefg') from dual;//length()是用来求字符串长度的

日期函数

       1.select sysdate from dual;//sysdate表示的是当前日期,它的类型在oracle里为date类型

       2.to_char(日期, '格式') 将日期转换为字符串

              select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual;    

              select to_char(sysdate, 'q') from dual;//季度

              select to_char(sysdate, 'd') from dual;//一个星期的第几天(注意:以周日为1开始计算)

              select to_char(sysdate, 'day') from dual;//星期几

              select to_char(sysdate, 'am') from dual;//上下午

              select to_char(sysdate, 'mon') from dual;//月份

              日期的默认格式为:dd-mon-yy;

       3.trunc (截断日期) 返回值还是日期

              select trunc(sysdate, 'year') from dual;//今年的11000

              select trunc(sysdate, 'month') from dual;

              select trunc(sysdate, 'day') from dual;

       4.对时间的加减

              select sysdate - 5 from dual;//日期+ -时,它以天为单位的

              select to_char(sysdate + 1/24,'hh24:mi:ss') from dual;//将当前间加1小时

              select add_months(sysdate, -1) from dual;//对月进行减一

其它函数

       1.对某列进是否为null的条件选择,可用is nullis not null e.g:

              select * from emp where comm is not null;

       2.对有可能取值为null的列进行运算时,需用到nvl()函数

              e.g: select (sal+nvl(comm,0))*12 asal from emp;

              //nvl(检查值,替代值) 如果某列的值等于检查值时,用替代值替代,此例是将null值替换成0,在Oraclenull是指无穷大

组函数:

       max() 求某列的最大值;min(),求某列的最小值; avg() 求某列的平均值; sum() 求某列值的和; count() 求某一列取值不为null的个数

       select distinct job from emp;//distinct 去除重复取值

       select count(distinct job) from emp;//去除重复记录后,求个数

 

order by:对查询结果进行排序

select * from emp order by comm desc/asc;

中文排序     

order by nlssort(, '格式');

       拼音       'NLS_SORT=SCHINESE_PINYIN_M'

       笔画    'NLS_SORT=SCHINESE_STROKE_M'

       部首       'NLS_SORT=SCHINESE_RADICAL_M'

e.g: select * from product order by nlssort(productname, 'NLS_SORT=SCHINESE_PINYIN_M' );

 

group by 分组

       语法:group by 1, 2-->根据group by 之后的列,取值归为一组,配合组函数求每组的最大值,最小值...

       e.g: select max(sal) from emp group by deptno;

       注意:如果使用了group by分组,则在select子句中出现的列必须是在group by子句中有的,如果不是,则必须配合组合函数一起使用

       按多列分组:select count(*), deptno, job from emp group by deptno, job;

 

group by...having... 分组之后再进行条件选择

       e.g:select max(sal) ,deptno from emp group by deptno having (max(sal) > 3000);    //求每个部门最高工资大于3000的最高工资和部门编号   

       注意:where子句也能达到条件选择的效果,如果wherehaving都能达到要求,从效率角度出发,应优先选择where;    如果只能在分组之后才可以进行条件选择的话,则使用having      

 

伪列 (rowid, rownum) 不真正存在于表中的列

select empno,ename,rowid from emp;

rowid 特点:

       每张表中的rowid取值没有重复

       每个rowid对应一条记录,可以看做是此记录的唯一标识

       通过rowid 能够最快速地查找到记录

 

rownum 为每条查询结果产生一个编号

       e.g: select empno,ename,rownum from emp;

    查询前5条记录

        select empno,ename,rownum from emp where rownum <=5;

        select empno,ename,rownum from emp where rownum > 5;()

        select empno,ename,rownum from emp where rownum = 5;()

注意:rownum用作比较条件时只能使用<或者<=比较;特例=1, >=1可以

              select empno,ename,rownum from emp where rownum <=5;

 

语法顺序      

select ... from ... where 条件 group by ... having 条件 order by ...

执行顺序

where > group by > having> select >order by

 

子查询

       在很多时候单一的查询不能完成实际的要求,而子查询可以完对单表的复杂查询

       1.将子查询结果作为主查询的条件e.g

       select * from emp where sal = (select max(sal) from emp);//查询具有最高工资的员工信息

       select * from emp where sal > (select avg(sal) from emp);//查询所有工资高于平均工资

       select * from emp where sal in (select max(sal) from emp group by deptno);//查询每个部门工资最高的员工信息

       2.将子查询结果作为一张临时表,作进一步的查询

              e.g: select e.*,rownum from (select * from emp order by sal desc) e where rownum <=5;//查询工资最高的前五名员工

              select * from  (select empno,ename,sal,rownum r from (select * from emp order by sal desc) where rownum <=10) where r > 5;//查询工资最高的6-10名员工

 

连接查询 (实际开发):从两张或更多张表中查询到数据

1. 内连接

e.g: select empno, ename ,d.deptno, dname from dept d inner join emp e on (e.deptno = d.deptno);

2.()外连接

e.g: select empno, ename , d.deptno, dname from dept d left outer join emp e on (e.deptno = d.deptno);

3.()外连接

e.g: select empno, ename , d.deptno, dname from dept d right outer join emp e on (e.deptno = d.deptno);

4.自连接

e.g: select e1.ename, e2.ename from emp e1 left join emp e2 on e1.mgr = e2.empno;   

5. 多表连接:就是利用以上连接将多个表连接起来

 

建表

create table 表名(

       列名1 数据类型 约束,

       列名2 数据类型 约束,

       列名3 数据类型 约束,      

       ....

       列名n 数据类型 约束

);

在建表时可设定列的默认值,语法如下: 数据类型 default 默认值 约束

建表示例:

create table users_jone(

 username varchar2(20) primary key,

 password varchar2(20) not null check ( length(password) >=4  ),

 birthday date,

 married number(1) check (married in(0,1)),

 age       number(3) check (age >0 and age<150),

 salary  number(7,2) check (salary >0.0)

);

 

Oracle中数据类型有如下几种:

       1.字符串类型: varchar2(字符个数); clob       字符型大对象 (需补充对这两种类型的分析)    

       2.日期类型:  date      年月日,时分秒,毫秒; timestamp 可以到纳秒

       3.布尔类型:可将数据类型设定为number(1)或者是char(1),Oracle里是01来表示falsetruth ,之后可设检查约束为:check(列名 in(0,1))

       4. 数字

              整数 integer(整数位数)     e.g:age   integer(3)

              小数 number(最大有效数字长度,小数点后位数) e.g:salary number(7,2)//99999.99

 

Oracle中的约束

              作用:保证数据的有效性和完整性

              种类:not null 非空约束;unique   唯一约束;primary key 主键约束(唯一并且非空,在一张表里只能有一个主键);check(条件) 检查约束  

             

添加(插入)数据

       语法1insert into 表名(列名1,列名2...)     values(1,2 ...);

       语法2insert into 表名 values(1,2 ...);//在插入给出的所有列的数值时使用,注意值的顺序必须与列名顺序一致

       语法3插入部分列的值 语法:insert into 表名(列名1,列名2...) values(1,2 ...);//注意:此时不能省略列名

      

对事务的操作:

       commit;  //在对表进行增删改操作后,需执行commit之后才能让所作操作对其他用户可见。

rollback;//若想取消对表的增删改操作,可以执行此语句。

 

update 更新

语法:update set =, =,... where 条件;

       e.g: update emp set sal=800,comm=500 where empno=7369;

 

delete 删除

语法:delete from where 条件;

       e.g: delete from emp where empno = 1234;

       delete from ;             -- 删除表中所有记录

       truncate table 表名; -- 删除表中所有记录 注意:无法使用rollback 撤销,但运行效率高

      

       注意:如果两张表存在着关联关系,则先删从表记录,再删主表记录。创建这样的有着关联关系的表时,则要先建主表,再建从表。

              e.g:create table users_jone; ()          create table orders_jone; ()

                     drop table orders_jone; ()            drop table users_jone; ()

drop table users_jone cascade constraint;//cascade constraint的作用是先删除相关的外键约束再删除表

 

根据旧表创建新表

做法1先创建与旧表一样的表结构,然后执行:insert into 新表名 select * from 旧表名;commit;

做法2:    语法:create table 新表名 as select * from 旧表; commit;

       注意:此法创建的表结构与旧表几乎一致,只是约束只能复制not null约束。

       e.g:create table emp_jone as select * from emp;

       create table emp_jone as select * from emp where 1=2;//仅仅复制了表结构,没有复制表数据

 

约束:

       1.行级约束

              primary key, referencesunique, check, not null

       2.表级约束

              primary key, referencesunique, check

              表级约束的写法,e.g:

              create table orders_jone(

                     orderId number(6) ,

                     orderDate date not null,

                     state number(1) not null ,

                     totalPrice number(10,2) not null,

                     username varchar2(20) not null,

                     primary key (orderId),

                     check (state in(1,0)),

                     foreign key (username)

                            references users_jone(username)

              );

              create table score(

                     stuName varchar2(20),

                     courseName varchar2(20),

                     score number(3) not null,

                     primary key(stuName, courseName)//联合主键

              );

 

约束命名

命名规则: 表名_列名_约束类型简写(PK 主键,NN 非空,CK 检查,UK 唯一,FK 外键)

       如果没有给约束起名,oracle会自动为约束命名

       e.g:create table orders_jone (

                     orderId number(6)

                      constraint orders_jone_orderId_pk primary key,

                     orderDate date

                      constraint orders_jone_orderDate_nn not null,

                     state number(1) not null

                                   check (state in(1,0)),

                     totalPrice number(10,2) not null,

                     username varchar2(20) not null

                      constraint orders_jone_username_fk

                                   references users_jone(username)

              );

 

外键约束:限制某一列不能是任意的,必须来源于另外一个主键列

       语法: 数据类型 references 表名(引用列)

 

系统表(数据字典):存储的都是与定义(表的,约束的)有关信息

       user_tables 存储当前用户创建的表相关信息

        TABLE_NAME -> 表名

       e.g:select table_name from user_tables;

 

       user_constraints 存储了当前用户的所有约束信息

              OWNER  ->   拥有(创建)

              CONSTRAINT_NAME       ->    约束名

              CONSTRAINT_TYPE          ->  约束类型

              TABLE_NAME                    ->    约束所在表

       user_cons_columns 存储了当前用户的所有约束信息

              COLUMN_NAME                ->  约束所在列

             

select owner,constraint_name,constraint_type from user_constraints where table_name='ORDERS_jone';

select column_name from user_cons_columns where CONSTRAINT_NAME ='SYS_C0032843';

             

 

序列(sequence ): oracle提供的产生唯一值的一种机制

       创建语法:create sequence 序列名 选项; e.g: create sequence orders_jone_seq;

              select orders_jone_seq.nextval from dual;//取得序列的下个一值

 

              选项:start with 初始值 ; increment by 递增值 ; cache 缓存值

              e.g: create sequence orders_jone_seq start with 300001 increment by 2 cache 10;

user_sequences(保存用户的序列信息): 

SEQUENCE_NAME -> 序列名,INCREMENT_BY  -> 递增值,CACHE_SIZE     -> 缓存值

       e.g:select * from user_sequences where sequence_name ='ORDERS_jone_SEQ';

 

应用:可以利用序列生成唯一的ID

 e.g:insert into orders_jone values(orders_jone_seq.nextval,sysdate,0, 1000.00, 'liucy');      

注意点:

1.例如:create sequence orders_jone_seq start with 30000;

select orders_jone_seq.currval,orders_jone_seq.nextval,orders_jone_seq.nextval from dual; //30000,30000,30000

结论:如果一条查询语句中多次出现nextval,则实际取值时只从序列中取了一次值

2.序列第一次使用时不能使用currval   

序列刚创建后,运行select orders_jone_seq.currval from emp;

会报错误: 序列 ORDERS_JONE_SEQ.CURRVAL 尚未在此会话中定义

 

sql语句的分类

       DQL (数据查询语言data query)  select

       DML (数据操控)          insert, update, delete     

       TCL (事务控制语言transaction control)     commit, rollback   

       DDL  (数据定义data defination)        create, drop, alter       truncate

       DCL(数据控制)            grant, revoke

 

alter      

添加列 例:alter table users_jone add address varchar2(20) default '北苑家园' not null;

删除列 例:alter table users_jone drop column address;

重命名 例:alter table users_jone rename column address to addr;

修改列 例:alter table users_jone modify username varchar2(30);

删除约束 例:alter table orders_jone   drop constraint orders_jone_orderId_pk;

修改约束 例:alter table employees modify manager_id integer;

添加约束 例:

alter table orders_jone add constraint orders_jone_orderId_pk primary key(orderId);

      

 

事务 (transaction)

       事务代表一组原子(不可再分)操作,它当中的一到多条增删改语句必须作为一个不可分割的整体若,要么都成功(commit),若其中一条失败,应当撤销所有操作(rollback)

 

事务的边界(开始和结束)

              执行update, insert , delete 时事务开始

              执行commit/rollback (事务结束)

 

              rollback只会撤销本次事务所做的所有操作,不会影响已经结束的事务

              select 不会受事务影响

 

synchronize:作用:用来保护并发操作下的数据完整性。(需补充)

 

事务的4特性:ACID

       A - 原子性

       C - 一致性

              事务开始前和结束后的数据状态应当一致

       I - isolation 隔离性

D - 持久性

              指事务结束后,数据的状态应当永久保存下来

 

oracle 数据库对象

              (table)

              序列 (sequence)

              约束 (constraint)

              视图 (view)

              索引 (index)       

              函数 (function)

              (存储)过程(procedure)

 

对视图,索引,过程等数据库对象方面的使用有待补充。

 

Oracle数据库中用户权限角色等方面的知识有待补充。

 

posted on 2010-06-05 23:29 jone 阅读(753) 评论(0)  编辑  收藏 所属分类: 数据库

只有注册用户登录后才能发表评论。


网站导航: