一、数据库事务
事务:是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。
ACID性质(事务四大特性):
- 原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
- 一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。
- 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
- 持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中。 [1]
数据库事务由以下的部分触发:
一个或多个DML 语句
一个 DDL(Data Definition Language – 数据定义语言) 语句
一个 DCL(Data Control Language – 数据控制语言) 语句
关键字:
commit --提交
rollback --回滚
二、事务分析
-
提交前或回滚前
- 改变前的数据状态是可以恢复的
- 执行 DML 操作的用户可以通过 SELECT 语句查询之前的修正
- 其他用户不能看到当前用户所做的改变,直到当前用户结束事务。
- DML语句所涉及到的行被锁定, 其他用户不能操作。
-
提交后的数据状态
- 数据的改变已经被保存到数据库中。
- 改变前的数据已经丢失。
- 所有用户可以看到结果。
- 锁被释放,其他用户可
- 以操作涉及到的数据。
- 所有保存点被释放。
三、基础查询
基础查询
SELECT *|{[DISTINCT] column|expression [alias],...}
FROM table;
选择全部列
select * from table
查询虚拟表
select sysdate from dual;
注意:
- SQL 语言大小写不敏感。
- SQL 可以写在一行或者多行。
- 关键字不能被缩写也不能分行。
- 各子句一般要分行写。
- 使用缩进提高语句的可读性。
四、算术运算符
数字和日期使用的算术运算符。
操作符优先级
- 乘除的优先级高于加减。
- 同一优先级运算符从左向右执行。
- 括号内的运算先执行。
五、别名
列别名
- 使用as
- 直接在字段的后面加空格 或者双引号 将别名括起来都可以。
表别名
- 直接在表的后面加空格 或者双引号 将别名括起来都可以。
- 不能使用as关键字
六、连接符
- 把列与列,列与字符连接在一起。
- 用 ‘||’表示。
- 可以用来‘合成’列。
hw_sqlF:
--一个学生对应一个学生档案材料。 一对一:2中方法:1.任意一张表设置外键 2.id一致的方式设置外键
--一个学生只属于一个班,但是一个班级有多名学生。 一对多:在多的一方设置外键
--一个学生可以选择多门课,一门课也有多名学生。 多对多:要新建一张中间表
--1.写多了sql 之后不知道怎么运行
--2.不知道怎么保存文件 // crtl + s /另存为:
--3.外键约束
--4.没有切换账号使用---system 用户的数据不能修改也不能删除,做作业--新建一个用户
create table student_hw(
id varchar2(32) primary key,
name varchar2(10),
did varchar2(32)--添加一个外键和档案表对应
)
--档案和学生是一对一
create table dangan_hw(
id varchar2(32) primary key,
age NUMBER(3,0), --3位数字,0个小数点
address varchar2(200)
)
--did 是否必须创建外键约束呢?不是的,添加之后添加数据就会收到外键约束?影响。
--添加外键约束:alter table 从表表名(外键在哪个表) add constraint 外键约束名称 foreign key(列名--外键字段名称) references 主表名称(主键列名)
alter table student_hw add CONSTRAINT ck_student_did FOREIGN key(did) references dangan_hw(id);
--是否一定要设置外键呢,可以设置,也可以不设置。
--外键约束的特点:需要主表有数据,才能新增。如果子表引用了主表的id,那么要先删除子表的数据才能删除主表的内容
--外键约束 student的did:可以为空(如果不想为空就添加多一个非空约束)、也可以重复(如果不想重复就添加一个唯一约束)
--用student的id 和档案的 id关联
--alter table student add CONSTRAINT ck_student_did FOREIGN key(id) references dangan(id);
--2. 创建一个班级表
-- 班级和学生是一对多的关系,外键就设置在多的一方
create table clazz(
id varchar2(32) primary key,
name varchar2(20)
);
--为学生添加一个外键
alter table student add (cid varchar2(32));--不建立外键约束就自己来维护这个外键就可以了。
--3. 多对多。一个学生可以选择多门课程,一门课也可以有多名学生。 多对多:需要创建一张中间表
create table course_hw(
id varchar2(32) primary key,
name varchar2(32)
);
create table student_course_hw(
id varchar2(32) primary key,
sid varchar2(32),
coid varchar(32)
);
alter table student_course_hw add constraint st_mid foreign key(sid) REFERENCES student_hw(id);
alter table student_course_hw add constraint c_mid FOREIGN key(coid) REFERENCES course_hw(id);
class_sqlF:
-------------------第二
create table test1(
id varchar2(32) primary key,
aaa varchar2(32),
bbb varchar2(32)
);
--delete 语句只是删除表数据
delete from test1;
--drop 语句删除整个表
drop table test1;
--oracle 10g之后有个 闪回的功能,还原到删除之前的状态
FLASHBACK table test1 to before drop;--危险的操作。
--删除表的列
alter table test1 drop(bbb);
--截断表数据--效果是和delete一样,可是功能不一样。delete支持事务。truncate性能高一点
truncate table aaa;
--查看表结构
desc test1; --写一个根据数据表自动生成代码
--一次性插入多条数据呢?可以的,写法有带你麻烦
--可以使用dual 虚拟表 添加 dual是空表
--1:执行函数 2.执行计算 3.充当一张数据表来用
select * from dual;
select '123' as zifu from dual;
select user from dual;--查看到当前用户名
select '10','黄忠' as from dual;
select * from (
select '10','黄忠' from dual
union
select '11','黄忠' from dual
union
select '12','黄忠' from dual
union
select '13','黄忠' from dual
);
insert into hero_day3(
select * from (
select '10','黄忠' from dual
union
select '11','黄忠' from dual
union
select '12','黄忠' from dual
union
select '13','黄忠' from dual
)
);
--------------------3.事务
--事务是数据库管理执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。
--记住事务4性质:原子性、一致性、隔离性、持久性
--在person 中添加一个字段,演示我们的银行转账。
alter table person add (yue number(16,2));
--演示转账 ---orcale 事务时默认开启的。
update person set yue=yue-100 where id=1;
--如果在添加数这里报错了,那么就需要进行数据回滚。使用rollback关键字
--rollback;
update person set yue=yue+100 where id=2;
--如果2个语句都可以执行成功,则提交数据到数据库。 commit
--执行 dml(insert 、update、delete)、dcl(grant 授权)、dll(create、 table/..)
--都会有事务
rollback;
commit;
select * from person;--在另一个用户查询到的和在这里查询到的person不一样。因为,事务正在进行中,在没有提交之前,别人的事务无法读取到这个事务。查到的还是之前提交之前的数据。
------------------------4.select语句----------------------
--基础的select语句
--select *|{[DISTINCT] column|expression [alias],...} from 表名
--*代表返回数据表的所有字段
select * from person;
--单独查询某个字段
--写查询语句的时候,什么都不用像,先写一个 select * from,然后要查询哪张表,再写上表名
select id,name,yue from person;
--表名后面的P就是别名,就是在返回字段内容中可以使用p的这个别名,在where条件后面,也能使用p的这个别名。
select p.name,p.id,p.* from person p;--p的别名代表的是person数据表。随便取,前后一致就行
--sql大小写不敏感,别名也是。
--sql语句可以分行写
select
t1.NaMe,
t1.id,
t1.*
from
person t1;
--查询虚拟表 查看系统当前时间
select sysdate from dual;
-----------------运算符
select * from person;
--数字和日期使用的算术运算符。使用别名,把结果的列名修改回来
--1.使用as使用别名
select id,name,age,yue+100*2 as yue from person where id = 1;
--别名的第二种方式。直接用空格隔开,或者用双引号括起来
select id,name,age,yue+100*2 yue from person where id = 1;
select id,name,age,yue+100*2 "余额" from person where id = 1;
--表别名,直接使用空格隔开或者双引号,不能使用as。
select id,name,age,yue+100*2 yue from person p where id = 1;
-----------------连接符
--把name和age字段合在一起
select name||age name_age from person;
select '我叫'||name||'今年'||age string from person;