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的时候必须两边的字段排列先后顺序是一样的,列的数量一样,否则将会报错,或者合并后的内容错误。
删除表/复制表
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 携带事务的查询,此时其他的操作涉及到事务时就会被锁定。
创建表和各约束
第一种,系统分配主键名称
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 /><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为全量表
