Oracle学习-基础-第一天

最简单的建表体验:

 

Create table语句建立表

要指明表的名称

列的名称

列的数据类型

列的宽度

是否有默认值

常见的数据类型

Char(n)定长

Varchar2(n)变长,最大到4000

Number(p,s)

Date

Long

Lob

Raw

 

Exp:

>Create table test1( name char(8),Salary number(5) default 0,Content char(4 char),Hiredate date );

其中name为8个字节,content为4个字。

>insert into test1 (name,Salary,Content,Hiredate) vlues(tony,1000,AE,02-05-2013);

>commit;

>select * from test1;

 

好的,体验完毕,开始总结:

 

Oracle11g完装前:

serivce有个listener,若未启动,刚不能使用pl/sql developer;

Oracle默认的三个用户:sys 网络管理员; system 本地管理员;  scott是普通用户

 

1.建新用户

create user lisi identified by lisi;
但报错,没权限

2.转用户conn system/manager @ 哪个数据库;

3.就可以了,但新建的lisi不能登录的。要用sys授权限
4.权限共二种:系统权限,对象权限
系统权限:对数据库使用,create table等等;
对像权限:用户对其他用户的数据对像的权限;(数据对像如table,view,trigger)
grant connect to xiaoming;便可登录


几个角色说明:
dba:最高的权限,重要
resource:在任何一个表空间建表
再加上一个connect


希望lisi可以去查emp表;
grant select on emp to lisi;[sys,system,emp自主soctt可执行]
对象权限select insert update delete all create index...

select * from SCOTT.EMP;[打开他人的表要加前缀]

若要修改/插入/选择
grant all on emp to lisi;


5.也可撒撒回来
6.授权的传递
grant select an emp to lisi with grant option;
grant select an emp to xiaohong;
7如果是系统权 system给lisi授权,则lisi可以把权限再传递
系统权限grant connect to xiaoming with admin option

回收的要连在一起的

8.create profile lock account limit failed login attemps 3 password lock time 2;
创建一个用户,若失败3次则封闭2天

————————————————————————————————————————————————————————————————————————————————————————————————————


1。数据类型,不像mysql的,folot,int,double那么多;只有一个number
char 最大20000字符,char查询最快,但浪费空间,varcher虽是可变的,但是一个个比对,因而速度慢,但节约了空间
当遇到此类错误提示时:The service did not respond to start or ,等一会便可。
@blob二进制数据,可存放图片/声音


create table student(
xh number(4),
xm varchar2(20),
sex char(2),
birthday date,
sal number(7,2) --共7位,有2位小数:-9999.99到9999.99
);

2.表空间,如同C盘,D盘,E盘

create table class(
classId number(2);
);

desc table;查看表的结构  descant详述:合唱

3.insert 一条数据

insert into sttudent values(1,'小明','男','1999-12-13',2345.8,12);--注意日期写法
报错12-2月-1999
oracle默认的日期格式:MM-MON-YY
但可以修改:
alter session set nls-date-format='yyyy-mm-dd';

 

4.查询为空时,要这样来查

select * from student where birthday is null;--不能=NULL;='';只能使用is null,is not null

5.delete删除完,可以恢复rollback

在删除前可以savepoin aa;
再删除时,delete from studnet;
可以恢复,rollback to aa;

6,看是不是空值函数:

nvl(comm,0),表示,如果comm是空值就是0,如果不为空则使用原值。
某个部门的工资排序,找最大工资
select * from emp order by deptno asc,sal desc;

7.oracle分页

找出6-10条纪录
第一步子查询
select depto,avg(sal)
第二步显示rownum
第三步select A1.*,rownum rn from (select * from emp) A1 where rownum<=10;(注意rownum只能用一次,不能这样吧),砍去了一半,但是速度很快的。用的是二分机制
第四步再一个子查询
select * from (select A1.*,rownum rn from (select * from emp) A1 where rownum<=10;) where rn>=6
所有改动,只能修改最内层的即可,如排序,select * from emp order by id最内层的那个

8.如何自增长呢?要这样玩

create sequence users_seq

start with 30

increment by 1

minvalue 30

nomaxvalue

nocycle

nocache

9.窗口的大小

set linesize 120

____________________________________________________NEXT_______________________________________________________________________________________________________________________________________________

1. 数值函数

 ABS(x), float正余弦函数:ASIN(x),ACOS(x),SIGN(x)返回给定x值的正+、零0、负-

2. 字符串函数

 ASCII(’A’)=65  CHAR(65)=’A’  nchar(n) :nchar(65)=’A’  把整数码化为unicode码

Concat(str1,str2) 字符串串联,

Initcap(‘qingdao’)=’Qingdao’  字符串首字母大写

Ltrim(str) 删除前导空格

Select RPAD(‘青岛’,8,‘OK‘) = ’青岛OKOK‘ 在字符串1后右边添加字符串2,直到总数个数为8(字符)

LOWER(str1)  UPPER(str1) 字符串的大小写转换

Replicate(str1,2)重复str1字符串的次数为两次

Replace(str1,str2,str3) translate(str1,str2,str3)用str3替换str1中的str2的部分

Stuff(str1,m,n,str2)

3. 日期函数应用

Dateadd(year,0,0)=’ ’

Dateadd(year,1,2)=’ ’

Dateadd(month,1,2=’ ’

Dateadd(day,1,1)=’ ’

Dateadd(datepart,number,date)

把两个日期相加,返回指定日期date加上指定的额外日期间隔number 产生新的日期。

 

Cast()函数转换 即是数据转换,类似tochar\tonumber\hextoraw

 

Exp: 查找名字为M开头的雇员的工资

Sql server :select ename+CAST(sal as varchar(4))

         From teacher  where ename like ’M%’

Sql Oracle :select ename,CAST(sal as varchar(4))

         From teacher  where ename like ’M%’

结果:Martin 10000

      Miller  12000

Exp: 求1990年2月出生的人的年龄

Print cast(year(‘1990-2-6‘)as char(4))+’年’+ cast(month(‘1990-2-6‘)  as char(2) ) +‘月出生的人年龄是 ’ + cast(datediff(yy, ‘1990-2-6‘,getdate()) as char(2) )

Oracle 下转换日期格式

 Declare  d  date;

 Begin 

   d:=TO_DATE(‘2013-4-17 12:21:23’,’YYYY-MM-DD  HH24:MI:SS’);

   DBMS_OUTPUT.put_line(TO_CHAR(d,’YYYY”年”MM”月”))

End

2.简单查询

Distinct 区别的,不同的  select distinct score from student

Exp:

1) 查看2012年1月1日以后的订单:where not OrderDate <= #1/1/2007#

2) Select * from student where birthday between ‘1988/1/1’ and ‘2000/1/1’

3) Select * from student where tname like ‘田’ or tname like ‘张’

EXISTS: 使用子查询作为条件,只有子查询返回行的时候条件为真,不反回任何行即为假。

 Select * from t1 where EXISTS(select * from t2 where t1.id=t2.id)

 Select * from t1 where t1.id =ANY( select id from t2)

4) 查询选修了2门以上课程的学生的学号 select Sno from SC group by Sno Having count(*)>2

Having 子句与组有关,而不是与单个的行有关

Exp:查询有女教师的教研教师以及拥有的女教师的数量

Select rno,count(sex) as girls from 

teacher where sex='女' group by rno

查询至少有2名女教师的教研教师以及拥有的女教师的数量

Select rno,count(sex) as girls from 

teacher where sex='女' group by rno

having count(sex)>=2

连接查询

内连接(等值连接、自然连接、不等值连接) 

外连接

交叉连接

__________________________________________________________________________________________________________________________________________________________________________________________________________

 

数据库三大范式

第一范式(1NF):
是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。个人总结:不能有表中表。

如数据表不能这样设计,因为数据表的一个二维表:

姓名

思想道德素质测评(20%)

 专业素质测评(60%) 

基础分

奖励分

惩罚分

最后得分

排名

 必修课成绩 

奖励分

惩罚分

最后得分

排名

得分

排名

张三

78

0

0

78

2

71.7

1

0

0.0

71.7

1

王五

78

0

0

78

2

71.3

24

0.0

0.0

71.3

2

李四

78

0

0

78

2

70.8

25

0.0

2.0

68.8

3


而这样设计是可以的: 

姓名

C语言

java

MySQL

Oracle

张三

78

88

68

78

王五

78

55

87

78

李四

78

86

91

56


第二范式(2NF):
要求数据库表中的每个实例或行必须可以被惟一地区分,数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖(部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况),也即所有非关键字段都完全依赖于任意一组候选关键字。个人总结:非主属性依赖于主属性
如以下成绩表

student_id

course_id

grade

birthday

20101661

1

56

1991,07,14

20101662

3

58

1993,7,25

这样设计不行,因为grade完全依赖于主码student_id、course_id,而birthday只依赖于部分主码student_id。所以要将其拆分成两个表 

student(student_id, birdthday);

grade(student_id, course_id, birthday); 

course_id为联系student表的外键



第三范式(3NF):
要求一个数据库表中不包含已在其它表中已包含的非主关键字信息,在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。个人总结:不能有传递性

如以下表

student_id

course_id

birthday

SD(所在系的名称)

SL(所在宿舍楼)

20101661

1

1991,07,14

软件学院

1栋

20101662

3

1993,7,25

经管学院

2栋

student_id为主码,SL依赖于student_id,但可以从非主码属性SD导出,即知道了SD,也就知道了SL。可以奖这个表拆分成两个表,如下:

grade(student_id, course_id,SD);

department(SD, SL);

SD为联系grade表的主键

数据库的存储方式

顺序存放,平均查询次数为关系的记录个数的1/2;

杂凑存入,平均查询次数由杂凑算法决定;

索引存放,要确定建立何种索引,及建立索引的表和属性;

聚簇存放,记录聚簇是指将不同类型的记录分配到相同的物理区域中,以充分利用顺序性的优点,提高访问速度。

1.事物的分类:

分布式事务:

是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式的不同节点之上。 

本地事务:

在单个 EIS 或数据库的本地并且限制在单个进程内的事务。本地事务不涉及多个数据来源。

2.本地事物处理:

实例:

说明:

定义一个数组,并将数组中的数据插入到具有两字段的数据表中,其中一字段为自增长,另一个字段中数据为char(15)

建立控制台应用程序。

代码如下:

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Data

using System.Data.SqlClient

namespace ConsoleApplication1

{

    class Program

    {

        static void Main(string[] args)

        {

            string [] names=new string []{"1adfa","2sdfadsf","3adsdfaadfadfasdfadsfadf","4adfadf"};

            //其中有一项的数据长度大于15,将插入失败

            string strcon="链接字符串";//自定义链接字符串

            using (SqlConnection con=new SqlConnection(strcon ))//using语句使connection链接不用时自动关闭

            {

                using (SqlCommand cmd=con.CreateCommand())//using语句使command不用时自动关闭

                {

                    con .Open() ;//执行事物之前必须先打开数据库链接

                    SqlTransaction trans= con.BeginTransaction();

                    //创建sqltransaction用于管理事物,由connection对象创建。

                    cmd.Transaction =trans;

                    //与command命令结合在一起。

                    try 

                    {

                        for (int i=0;i <names .Length ;i ++)

                        {

                            string ins="插入语句插入项为(name[i])";

                            cmd .CommandText =ins ;

                            cmd.ExecuteNonQuery ();//执行不包含返回结果的sql语句

                        }

                        trans.Commit() ;//事物的结束

                    }

                    catch (Exception ex)//捕捉错误信息

                    {

                        Console .WriteLine(ex.Message );//显示错误信息

                        trans .Rollback ();//在事物执行的外部设置事物回滚

                    }

                }

            }

        }

    }

}

3.分布式事物处理:

由于本地事物是由connection对象创建的,当一个事物中存在多个connection对象时就不能用本地事物的transaction对象。需要用到分布式事物及transactionscope 

实例:

说明:

需要实现这样一个业务,程序系统运行有一个数据库,记录程序运行现阶段需要的实时数据,但还有一个数据库是需要记录此程序运行过程中基本数据的变更情况,用于账目的核算,通常为了安全起见两个数据库在两个不同的服务器上,但是当基本数据库更改时,日志数据库也要添加相应的日志记录。

实现:

建立控制台应用程序:

引入命名空间system.Transactions

代码如下:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Data;

using System.Data.SqlClient;

using System.Transactions;

namespace ConsoleApplication2

{

    class Program

    {

        static void Main(string[] args)

        {

            string strConn1 = "第一个连接数据库字符串";//定义一个连接字符串。

            string strConn2 = "第二个连接数据库字符串";//定义另一个链接字符串。

            string olddata;//定义一个变量用于保存就的记录值

            string newdata = "需要更新的最新值";//定义一个变量保存新的纪录值。

            try

            {

                using (TransactionScope scope = new TransactionScope())

                //定义一个Transactionscope 分布式事物对象。

                {

                    using (SqlConnection Conn1 = new SqlConnection(strConn1))

                    {

                        using (SqlCommand Cmd1 = Conn1.CreateCommand())

                        {

                            Cmd1.CommandText = "sql语句select...";//用于查出旧记录。

                            Conn1.Open();

                            using (SqlDataReader sdr1 = Cmd1.ExecuteReader())

                            {

                                while (sdr1.Read())

                                {

                                    olddata = sdr1.GetString(0);//保存旧记录.

                                }

                            }

                            Cmd1.CommandText = "sql语句update..." + "'" + newdata + "'";//用于更新记录,把newdata更新到数据库

                            Cmd1.ExecuteNonQuery();

                        }

                    }

                    using (SqlConnection Conn2 = new SqlConnection(strConn2))

                    {

                        using (SqlCommand Cmd2 = Conn2.CreateCommand())

                        {

                            Cmd2.CommandText = "sql语句insert...+ olddata +newdata +";//插入记录到日志数据库。

                            Conn2.Open();

                            Cmd2.ExecuteNonQuery();

                        }

                    }

                    scope.Complete();//事物结束。

                }

            }

            catch (Exception ex)

            {

                Console.WriteLine(ex.Message);//显示错误信息。

            }

        }

    }

}


处理分布式事物除了上述的使用 transactionscope以外还有一种方法是使用CommittableTransaction

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值