in和exists

2019年3月16日 星期六
18:55
1.Oracle中的in尽量少使用,因为其性能较低,可以使用exists代替。
in将不会走索引,而exists是一个一个的去查询,因此会走索引。
exists的使用方法:
表A
ID NAME
1 A1
2 A2
3 A3

表B
ID AID NAME
1 1 B1
2 2 B2
3 2 B3
SELECT ID,NAME FROM A WHERE EXIST (SELECT FROM B WHERE A.ID=B.AID)
执行结果为
1 A1
2 A2
NOT EXISTS 就是反过来
SELECT ID,NAME FROM A WHERE NOT EXIST (SELECT
FROM B WHERE A.ID=B.AID)
执行结果为
3 A3

union和union all

2019年3月16日 星期六
19:22
union将会把重复的数据去掉(所有的列的内容相同),并集去重
Unionall 将不会去除重复的数据,并集不去重
注:在使用union和unionall的时候必须两边的字段排列先后顺序是一样的,列的数量一样,否则将会报错,或者合并后的内容错误。
基础 - 图1

删除表/复制表

2019年3月16日 星期六
19:40

在做数据迁移的时候会经常复制表,或者只复制表结构,在ORACLE下可以使用:create table as select…,但是在SQLServer下这种语法是错误的。

—Oracle下语法:
create table BranchAccount as select * from TATA.dbo.BranchAccount

Delete from table where xxxxx
(1)在Oracle中的from是可以省略的,但是在mysql中是不能省略的。
(2)mysql中删除的表不能有别名

事务

2019年3月16日 星期六
20:06
在执行update时,如果没有提交之前事务是挂起状态,这时这条数据被锁住,另一个操作此条数据就会处于等待状态,可以防止高并发带来的问题。



select * from tableName for update 携带事务的查询,此时其他的操作涉及到事务时就会被锁定。

创建表和各约束

2019年3月17日 星期日
9:38

第一种,系统分配主键名称

create table person(
ID number primary key,
NAME varchar2(30),
PASSWORD varchar2(40)
);

第二种,自行定义主键

create table person(
ID number,
NAME varchar2(30),
PASSWORD varchar2(30),
constraint PK_ID primary key(ID)
);

1.主键约束

constraint person_pk_pid primary key(pid)

2.非空约束

create table person(
pid number(10) not null,
name varchar2(10) not null,
gender number(1) ,
birthday date,
);

3.唯一约束

constraint person_pk_pid unique(pid)

4.检查约束

create table person(
pid number(10) ,
name varchar2(10),
gender number(1),
birthday date,
constraint person_gender_ck check(gender in (1,2))
);

5.外键约束

create table orders(
order_id number(10) ,
total_price number(10,2),
order_time date,
constraint orders_order_id_pk primary key(order_id)
);
`<br />create table order_detail(<br /> detail_id number(10) ,<br /> order_id number(10),<br /> item_name varchar2(10),<br /> quantity number(10),<br /> constraint order_detail_detail_id_pk primary key(detail_id),<br /> constraint order_detail_order_id_fk foreign key(order_id) references orders(order_id)<br />);<br />外键关联一定注意:<br />外键一定是主表的主键<br />删表时一定先删字表再删主表,如果直接删主表会出现由于约束存在无法删除的问题<br />![](https://cdn.nlark.com/yuque/0/2020/jpeg/1921958/1604540930322-c537a124-a071-44dd-b5ab-ce706b6880a9.jpeg#height=52&width=282)<br /> <br />但是可以强制删除drop table orders cascade constraint;(不建议)<br />删除主表的数据可以删除子表的关联数据,再删主表,也可以使用级联删除级联删除在外键约束上要加上on delete cascade 如<br />constraint order_detail_order_id_fk foreign key(order_id)<br /> references orders(order_id) on delete cascade<br />这样删除主表数据的时候会把字表的关联数据一同删除<br /> `



rownum和rowid

2019年3月17日 星期日
11:50
1.select rownum, t. from person

2.select rownum, t.
from person where rownum < 4;
此时可以查出来数据,但是如果select rownum, t. from person where rownum > 4 就会查出来是空集,这是因为rownum不支持大于号。

3.可以使用嵌套子查询的方式,这也是Oracle的分页方式

SELECT

FROM (SELECT ROWNUM RM, A. FROM (SELECT FROM EMP) A WHERE ROWNUM < 11) B
WHERE B.RM > 5
建议使用,因为我们的业务主要关心标注的红色部分,在红色部分可以添加很多的条件,而且红色部分为业务条件,其余的条件为分页的条件,起到松耦合的作用。
`<br /> `

1
2
3
4
SELECT
FROM (SELECT ROWNUM RM, T.
FROM APPAUTH T) A
WHERE A.RM > 10
AND A.RM < 14


注意:其中where后面必须使用rownum的别名,如果继续使用rownumber,则会报错。

创建视图

2019年3月17日 星期日
12:20
1.create view myperson_view as select * from person where name = ‘jeke’

视图中不能出现列名相同的列









外连接

2019年4月18日 星期四
22:01
1.两张表做连接查询时,其中一张表要查询全量的数据(不会因为另一张表的数据的关联而被筛选掉),在两张表关联的时候 非全量表 的关联字段后面加上(+)就可以做外连接查询:
例如:select from dept d,emp e
where d.deptno = e.deptno(+); 标注黄色部分为全量表
相当于左外连接。
(1)左外连接:做外连接查询的时候全量表在左端就是左连接
(2)右外连接:与上面的相反
select
from emp e,dept d
where e.deptno(+) = d.deptno. 这是右外连接
(3)左右连接:
select * from dept d left join emp e
on de.deptno = e.deptno. 其中的dept为全量表