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.列不可分
第二范式的要求:当一张表里面有多个字段作为主键的时候,非主键的这些字段,不能依赖于部分主键
(只能依赖整个组合的主键,不能依赖部分)
叫做:不能存在部分依赖
第三范式的要求:不能存在传递依赖(除了主键之外的任何其他字段必须直接依赖于主键)