– oracle 与myseqal 有些地方不同
除了组函数以外的函数
高级查询 集合的查询 分页的查询
–Decode函数用来实现IF-ELSE的逻辑功能
SELECT DISTINCT job from emp;
DECODE
SELECT
ENAME,job,sal,
DECODE(job, – if要判断的字段
‘ANALYST’,sal * 1.2, --条件
‘MANAGER’,sal * 3,
‘PRESIDENT’,sal * 1.5,
‘SALESMAN’,sal * 1.2
, sal) year_comm – 没有匹配到的就是sal ,13薪。
from
EMP_SZL;
CASE-ELSE
SELECT
ENAME, JOB,SAL,
CASE job
WHEN ‘ANALYST’ THEN sal * 1.2
WHEN ‘MANAGER’ THEN sal * 3
WHEN ‘PRESIDENT’ THEN sal * 1.5
WHEN ‘SALESMAN’ THEN sal * 2
ELSE
sal
END yercomm
FROM EMP_SZL;
‐‐按照部门编码分组显示,每组内按职员编码排序,并赋予组内编码
SELECT deptno, ename, empno,
ROW_NUMBER()
OVER (PARTITION BY deptno ORDER BY empno) AS emp_id
FROM emp_szl;
--集合操作 并集、交集、差集
SELECT * FROM emp_szl WHERE DEPTNO = 10
UNION – all
SELECT * FROM EMP_szl WHERE mgr = 7839;
–UNION all + distinct = union
—————————————————————————————————————————————————————————————————————————————————————————————————————————————
–视图
–视图:就是一张临时表,不存在的,只是查询结果
– 反复查询的数据 ,可以创建视图提高查询效率
CREATE VIEW_Szl emp_11
as
SELECT * from emp_szl WHERE DEPTNO = 10;
–
SELECT * from emp_11;
--数据字典 user_tables user_views user_objects
SELECT * from user_objects where object_type = 'VIEW';
SELECT * from user_objects where object_type = 'TABLE';
--------------————————————————————————————————————————————————————————————————————————————————————
--约束
--约束:非空: not null
--主键约束: Primary key - 非空 + 唯一
-- 代理主键:业务中不存在 唯一+非空特点的字段,id,开发过程中存在90%以上的代理主键
-- 自然主键: 业务中已经存在非空+唯一 特点的字段,QQ
-- 开发环境中,所有的表必须有主键
--唯一性约束: unique - 字段内容不能重复
--外键约束: foreign key
--检查约束:check
CREATE TABLE user_szl (
id NUMBER(6) primary key,--建表的时候直接规定约束
name VARCHAR2(20) not null unique,
score number(4,2),
classname VARCHAR2(20)
);
SELECT * from user_szl;
--有表之后加上唯一性约束
ALTER TABLE user_szl
add constraint user_szl unique(id);
-- id - number类型 - 主键 - 代理主键
-- 自动增长 ,序列 sequence
--varchar2 类型 - 主键 -代理主键
--代码生成的UUID.randomUUID();32位随机
CREATE sequence user_szl_seq;–默认从1开始,每次加1
–start with 10 MAXVALUE 1000
INSERT into user_szl VALUES(
user_szl_seq.nextval,‘lucy’,90,‘java1906’);
INSERT into user_szl VALUES(
user_szl_seq.nextVal,‘tom’,89,‘java1906’);
INSERT into user_szl VALUES(
user_szl_seq.nextVal,‘jack’,80,‘java1906’);
INSERT into user_szl VALUES(
user_szl_seq.nextVal,‘rose’,78,‘java1906’);
INSERT into user_szl VALUES(
user_szl_seq.nextVal,‘jerry’,87,‘java1906’);
SELECT * FROM user_szl;
–currVAl获得序列的当前值(了解) ,必须在使用了一次nextVAl后才可以调用
SELECT user_szl_seq.currVal from dual;
–check:检查约束
–有点问题
alter table user_szl
add(gender char(2)check(gendar in (‘f’,‘m’)));
alter table user_szl
add(age NUMBER(3))check(age>15));
—————————————————————————————————————————————————————————————————————————————————————————————————————————
–外键
–emp 表中引用了dept表的字段 ,emp表中的deptno就叫外键
–外键约束只能额外添加
SELECT * FROM order_szl;
CREATE TABLE order_szl(
id number(3) primary key,
name VARCHAR2(20),
userid NUMBER(6)
);
–外键
alter table order_szl
add constraint user_order_fk_szl --外键的名字
foreign key (userid)
references user_szl(id);
INSERT INTO order_szl
VALUES (user_szl_seq.nextVal,‘prada’,8);
– 在父表中被子表引用的数据,被引用的id不能改,也不能删
– 想要删除夫表数据,必须确保该数据没有被子表引用
update user_szl set id = 2 where id = 8;
–结论:外键关系由业务代码维护的
———————————————–—————————————————————————————————————————----——————————————————----————
–索引
–重点:在于理论 - 面试题
–创建单列索引
SELECT * from emp_szl;
create index emp_no on emp_szl(empno);
–使用索引,当where子句中出现添加索引的字段,就会自动调用索引。
SELECT * FROM EMP WHERE empno =7862;
–删除索引
———————————————————————————————————————————————————————————————————————————————————————————————
–事务 TCL Commit rollback savepoint
/**
概念:业务层面上操作的最小单位,不可分割的。
案例:转账业务 - update -100 +100
特点:原子性、一致性(要么都成功,要么都失败)、隔离性、持久性(提交完了或者回滚完了 就结束了)
事务并发问题: 脏读(另一个事务读取到了一个事务没有提交的内容)、
换读(a,b两个管理员,a删除一个数据,b新增了一个数据,b新增的就是a删除的数据(存在于插入删除SQL语句))
不可重复读(一个人去查到了20 另一个人改了30 第一个人再去看变成了30 (INSERT 和 UPDATE 中会出现))
事务的隔离级别:
读未提交 - 最低,解决不了任何问题
读已提交的 - 解决脏读问题
可重复读 - 解决脏读、不可重复读问题
串行化 -一个一个来,效率低 最高隔离级别 (可以解决所有问题)
**/
-----------------------------------------——————————————————————————————————————————————————————————————————————
面试题:
/*
1.视图作用是什么?好处有哪些 ?
2.索引的必要性有哪些?怎么合理添加索引?索引的优势?
3.索引的原理(索引的必要性)
4.事务会出现哪些并发性问题?怎么解决? - 事务的隔离级别
事务并发锁:行级、表级
*/