尚学堂马士兵Oracle学习笔记之四:开始学习DML语句

DML语句--数据操作语言

常用的有三条 + select语句合称为--数据库的4大语句

* select

insert -- 把一条数据插入的数据表里面

update -- 修改现有的已经放在我们数据库里面的数据

delete -- 删除数据

这四句话应该牢牢记住

 

简单介绍Oracle的逻辑结构

大家还记得我们装Oracle的时候安装了一个新的数据库database,database的名字全局数据库名叫:

-->sxt.com然后为这个数据库创建了一系列的管理数据的进程叫做-->sid 它的名字叫做-->SXT。

在这个大数据库里面,逻辑把他们划分成一个一个的“表空间”,我们现在的表其实是放在不同的表空间里面,我们现在用的表emp, salgrade,dept,放在表空间,Users里,这是Oracle自己帮你建好的一个表空间,这个表空间放置scott里面所有的表,当你登陆上来之后,实际上是访问你这个表

空间里面所有的表,如果现在两个人同时登录同一台服务器,就是两个人同时访问当前表空间里的表

这时候会产生数据不一致的现象(你正在改呢,我给删了,产生数据不一致问题),解决办法:在服务

器上创建一个新的用户,叫xxx,然后在users表空间里,为xxx分配表空间,再把xxx要访问的表导入

xxx这个表空间里面,这就是说明Oracle为什么是支持多用户的,每个用户之间的访问不会产生影响

综述:一个是DATABASE DATABASE分配不同的表空间,现在用的表空间是Users,然后Scott所有的相关

资源全部都放在表空间里面了,现在我在表空间里面开辟同样的资源,把这些资源全部Copy过来,然后

另外一个人登录进来访问的是他自己的资源,不再访问其他的资源

 

第一步:用超级管理员登录,只有超级管理员才能创建用户

connsys/bjsxtassysdba;

第二步:删除用户

dropuserXXXcascade; 当你的数据库里面没有xxx这个名就不需要删除它

1-- backup scott

 exp

把资源导入c:\temp

cd \

cd temp

del*.*;

y

exp

scott/tiger

u

yes

yes

yes

成功导出之后C:\temp下面会多一个文件EXPDAT.DMP ,这个文件里包含我们导入其他人相关的资源

scott 里面所有的东西全部就包含进来了。

 

2-- create user

create user xxx identified by xxx defaulttablespaceusers quota 10M onusers;

分配权限:

grant create session, create table, createview to xxx;


3-- import the data

 imp

c:\temp>imp

xxx/xxx

scott

连接新数据库

conn xxx/xxx

 

开始学习DML语句

1. desc dept;

insert into dept values (50, 'game', 'bj');

 

对数据进行备份的简单办法:

1.首先写rollback 刚才插入了一段数据,后悔了,不想插了。

2.备份整张表

create table emp2 as select * from emp;

create table dept2 as select * from dept;

create table salgrade2 as select * fromsalgrade;

create table emp3 as select * from emp;

第一种形式:不写字段的名字,直接按照字段的顺序挨着排的往里插

insert into dept2 values (50, 'game','bj');

第二种形式:指定某些字段往里插,其他不插的字段默认都是空值

insert into dept2 (deptno, dname) values(60, 'game2');

第三种形式:可以用一个子查询,把子查询拿出来的数据,挨着排的都插入到表里,

 前提是:子查询拿出来的东西和这张表的结构必须完全一样

 select * 是选出4个值,这4个值会挨着排的插入的dept2里面

select into dept2 select * from dept; 


25_rownum.avi 


敲数据库代码:要按照思路,从里敲到外,不是背过

求:薪水最高的前5名雇员

 

select empno, ename from emp;

当你没有进行排序的时候,它默认的顺序是先导进去的先选出来,后导进去的后显示出来

在Oracle里面有一个尾字段叫-->rownum 它是按照1,2,3...进行排列的,它不显示

select empno, ename from emp where rownum<= 5;//取前5行

 

一共有14行,求10行以后的后4行怎么求?

select empno, ename from emp where rownum> 10; //这样的写法不成立。

正确的写法:

select empno, ename from

(

select rownum r, ename from emp

)

where r > 10;

*记住:rownum只能和< or <= 一块用,不能>,也不能=

选第10行这个人的名字?

 1--> selectrownum r, ename from emp;

 2--> selectename from

( select rownum r, ename from emp )where r = 10;

 

求薪水最高的前5个人,首先要对薪水最高的人进行倒序排列

select ename, sal from emp order by saldesc;

错误写法:

select ename, sal from emp where rownum<= 5 order bysal desc;//先取出数,后排序

正确写法:

select ename, sal from

(

select ename, sal from emp order by saldesc

)

where rownum <= 5;//首先按倒序排好,然后取前5个

 

求:取薪水最高的第6个人---第10个人(重点掌握)--》不论是哪种数据库,这个应用非常广泛

 

select ename, sal from

(

select ename, sal, rownum r from

(

select ename, sal from emp order bysal desc

)

)

where r >= 6 and r <= 10;

 

以上写法是在Oracle里面效率最高的写法

 

第三天上午:

 

26_homework_dml_and_transaction.avi

 

面试题:

有3个表S, C, SC

S(SNO, SNAME) 代表 (学号, 姓名)

C(CNO, CNAME, CTEACHER) 代表 (课号, 课名,教师)

SC(SNO, CNO, SCGRADE) 代表 (学号, 课号,成绩)

问题:

1,找出没有选过"黎明"老师的所有学生姓名。

select sname from s join sc on (s.sno =sc.sno) join c(c.cno = sc.cno) where c.cteacher <> 'liming';

2,列出2门以上(含2门)不及格学生姓名及平均成绩

select sname where sno in

( select sno from sc where scgrade < 60group by snohaving count(*) >= 2 );

 

3, 即学过1号课程也学过2号课程所有学生的姓名。

select sname from s where sno in

( select sno from sc where cno = 1 and cnoin

 (select distinctsno from sc where cno = 2)

);

请用标准SQL语言写出答案,方言也行(请说明用什么方言)

 

update 更新表中的数据

把emp2这张表里,编号为10的,所有人的薪水提1倍

update emp2 set sal = sal * 2, ename =ename||'-' wheredeptno = 10;

 

delete 删除表中的数据

 

四条语句讲完了:背过语法格式

 

DDL-- 数据定义语言,建表,建视图,建其他一些东西。

1.创建表-- create table

create table t (a varchar2(10));

2.删除表 drop table

drop table xx;

 

跳过此阶段,先讲事务控制语句

事务transaction--> 就是一系列的操作要么同时完成,要么不完成。有点像同步synchronized

注意:与程序员交流的时候要说Transaction不要说“事务”

两个线程同时访问资源为什么会产生冲突的现象?

是因为你应该把他们的操作当成一个Transaction,每个线程自己单独一系列的动作都当成一个Transaction

要不同时完成,要么不完成。

 

从一个帐户把钱转到另一个帐户,需要2条Update语句,两条语句必须同时完成

 

Oracle认为我在其中的一系列的操作就是一个事务Transaction

所以,对于Oracle来说,一个Transaction起始于一条DML语句

那么它什么时候结束呢?

第一,敲rollback的时候,它回到最原始的状态算是结束,除此之外它还有几个会结束,书P23

 

27_create_table_1.avi

第三章 数据库常用对象

为什么有变长字符串Varchar2还要有定长字符串Char呢?

因为存在效率问题,用Char效率高,但浪费空间,这就是拿空间换时间Hashtable也是拿空间换时间

 

创建一张表,并往里插入一条数据

create table stu

(

id number(6),

name varchar2(20),

sex number(1),

age number(3),

sdate date,

grade number(2) default 1,

class number(4),

email varchar(50) -->最后没有“,”

)

 

28_constraint_1.avi

1.非空约束:

 

create table stu

(

id number(6),

name varchar2(20) not null,--> 加上约束条件非空

sex number(1),

age number(3),

sdate date,

grade number(2) default 1,

class number(4),

email varchar(50) -->最后没有“,”

)

 

约束条件本身也是一个对象,本身约束条件你个可以为它起一个名字

用constraint stu_name_nn not null -->为约束条件not null起名字为:stu_name_nn

如果不给约束条件起名字,系统会默认的给约束条件起一个名字

 

2.唯一约束-->在这个字段里面所有的记录不能取重复的值,每个值必须是唯一的

唯一约束后面 + unique ,当然也可以用constraint + 名字

字段级的约束:把约束条件+在字段名的后面

 

表级的约束:+在所有字段名的最后面

constraint stu_name_email_uni unique(email,name) 表示的是:这两个字段的组合不能重复

 

29_constraint_2.avi

 

主键:PRIMARY KEY 叫做:可以唯一标识整条记录的这样的一个东西

从语法上来说主键的约束可以理解为:非空 ,唯一 两个的组合

主键约束在逻辑意义上代表着单独的,每一条记录,看到主键就知道你是一条单独的不同的记录

是唯一的代表的记录

我们可以用两个字段的组合作为主键

 

外键(最麻烦的约束):建立于一张表的两个字段,或者两张表的两个字段

constraint stu_class_fk foreign key (class)referencesclass (id)

 

外键关系:是建立在两个字段上,某一个字段会参考另外一个字段里面的值,如果另外一个字段里面

没有这个值,你不能够把这个字段里面的值,设置成为其他的值。

 

被参考的字段必须是主键

被其他人参考的字段不能作为删除条件

主键约束和外键约束非常重要,老牢牢掌握其概念

 

30_questions.avi

面试题

 

31_alter_table_drop_table.avi

 

check约束:本身用的非常少,大多数对于数据的检验在java中已经校验过了

 

修改表结构:已经有一张表了,但是往了某一条字段,使用alter修改现有表的结构

添加addr字段---add()

alter table stu add(addr varchar2(100));

删除某一个字段---drop()

alter table stu drop(addr);

修改某个字段---modify()

alter table stu modify(addr varchar2(50));

*修改后的新的精度必须能够容纳原来有的数据

 

删除或者增加约束条件

去掉约束条件---drop constraint xxx

alter table stu drop constraintstu_class_fk;

修改约束条件:一般很少去修改约束条件,修改的方法是把原来的删掉,然后再添加个新的。

添加:

alter table stu add constraint stu_class_fkforeign key(class) references class (id);

怎么去修改非空约束:自己看P31

 

怎么去删除一张表:drop table xxx; 

 

键(设计任何表都要有主键)

2.列不可分

 

第二范式的要求:当一张表里面有多个字段作为主键的时候,非主键的这些字段,不能依赖于部分主键

(只能依赖整个组合的主键,不能依赖部分)

叫做:不能存在部分依赖

 

第三范式的要求:不能存在传递依赖(除了主键之外的任何其他字段必须直接依赖于主键)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值