1.复杂查询
1.1 分页查询 rownum
oracle高效率查询,三层过滤:
第一层:select * from emp; (如果针对不同情况的查询要求,在该层处理)
第二层:select t1.,t1.rownum from (select * from emp) t1 where
t1.rownum<=6
最终层:select t2. from (select t1.,rownum rn from (select * from mytest) t1 where
rownum<=5010) t2 where rn>=5000; --可当作分页模板:6表示取到第几条,3:从第几条开始取。
例1:按照入职时间先后顺序,查询第七到第十个人的员工信息?
select t2. from (select t1.*,rownum rn from (select * from emp order by hiredate) t1 where
rownum<=10) t2 where rn>=7;
测试效率:模拟一张10w的表
(1)create table mytest as select empno,ename,sal,comm,deptno from emp; --复制emp表
(2)自我复制 insert into mytest(empno,ename,sal,comm,deptno) select empno,ename,sal,comm,deptno from mytest;
1.2 合并查询 (union,union all,intersect)
(1)union 取两个查询结果的并集,去除重复行
(2)union all 取两个查询结果的并集,保留重复行,且不会排序
(3)intersect 取查询结果集的交集
(4)minus 取查询结果集的 差集
1.3 sql语句的执行顺序
(1)常见的select,from ,where执行顺序
①from ②where ③select
(2) 完整的select ,from ,where, group by,having,order by 的顺序
①from ②where ③group by ④having ⑤select ⑥order by
2.oracle的内连接和外链接
2.1内连接:
两张表同时匹配才会查询显示出
select e.ename,d.deptno,d.dname from emp e inner join dept d on e.deptno=d.deptno;
2.2外连接
(1) 左外连 left join
例1:select s.id,s.name,e.grade from stu s left join exam e on s.id=e.id;
例2:select s.id,s.name,e.grade from stu s ,exam e where s.id=e.id(+);
–以上写法都是表示左外连
–stu 为左表,如果stu表的一条记录没有与 exam 中任意一条记录匹配也要显示出,如:例1,stu表中的Lily没有成绩
但是两张表联查出的结果Lily也会被查询出。
–判断左表:写在left join左边的表
(2) 右外连 right join
–如果右表没有和左表任意一条记录相匹配,也要被选中
例1:select s.id,s.name,e.grade from stu s right join exam e on s.id=e.id;
例2:select s.id,s.name,e.grade from stu s,exam e where s.id(+)=e.id;
(3) 完全外连 full outer join
–两张表不管有没有匹配,记录都显示出来
select s.id,s.name,e.grade from stu s full outer join exam e on s.id=e.id;
练习:列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门
SELECT emp.ename,dept.deptno,dept.dname FROM emp RIGHT JOIN dept ON emp.deptno=dept.deptno;
SELECT emp.ename,dept.deptno,dept.dname FROM dept LEFT JOIN emp ON dept.deptno=emp.deptno;
SELECT emp.ename,dept.deptno,dept.dname FROM emp ,dept WHERE emp.deptno(+)=dept.deptno;
SELECT emp.ename,dept.deptno,dept.dname FROM emp ,dept WHERE dept.deptno=emp.deptno(+);
3.创建数据库实例
(1)向导工具 window–database configuration assistant(sca)
(2)手工录入
4. Java操作oracle数据库
4.1 java连接oracle数据库方式
如果java程序和db不在同一机器上,我们一般使用jdbc,如果java程序和db在同一机器上,则两个都可以使用。
(1) JDBC直连
①conection cn=null;
②praparedStatement ps=null;
③resultSet rs=null;
class.forname("oracle.jdbc.driver.oracleDriver");
cn=driverManager.getConnection("oracle.jdbc.thin:@127.0.0.1:1521:orcl","scott","123");
**sql语句分类:
dml语句:数据库操作语句 [insert,update,delete]
ddl语句:数据定义语句[create table,drop table]
dql语句:数据查询语句[select]
dtl语句:数据控制语言 [commit,rollback]
(2) JDBC-odbc桥连接
5.SQL函数
◆单行函数 例如lenght
◆字符函数
(1)replace(列,要替换的值,替换成什么值) 替换函数
例如:显示所有员工姓名,用‘a’替换所有‘A’
select replace(enmae,‘A’,‘a’) 替换后值 from emp;
(2)INSTR(源字符串, 要查找的字符串, 从第几个字符开始找, 要找到第几个匹配的序号)
返回找到的位置,如果找不到则返回0.
select instr(‘java haha’,‘a’,1,2) from dual;
◆多行函数
例如max(),min(),avg()...
5.1 to_date 日期函数
–将字符串转换为日期格式
to_date(string,‘format’)
to_date(‘1997-11-11’,‘yyyy-mm-dd’)
例:插入一行有日期列的记录
insert into emp(empno,hiredate) values(15,‘1997-11-11’);
此时执行操作会报错
解决办法:使用to_date函数
insert into emp(empno,hiredate) values(15,to_date(‘1997-11-11’,‘yyyy-mm-dd’));
日期格式:
①yy:两位数的年份 2004–04
②yyyy:四位数的年份 2004年
③mm:两位数的月份 8月–08
④dd:两位数的天 30号–30
⑤hh24:8点–20
⑥hh12:8点–08
⑦mi,ss --显示分钟,秒
◆行迁移:使用子查询完成行迁移的需求
(1)使用sql建表
create table #temp as select enpno,ename from emp where ename like “s%”;
◆使用子查询实现数据更新
update temp set (job,mgr,hiredate,sal,comm,deptno) =(select job,mgr,hiredate,sal,comm,deptno from temp where ename=‘FORD’) where empno=‘1111’;
6.分组函数
avg,sum,max,min,count
◆所有包含于select列表中,未包含于组函数中的列必须都包含于group by子句中
◆不能在where子句中使用分组函数,可以在having子句中使用分组函数
◆从sql优化的角度上看,尽量使用where,having 先分组,后过滤。
7.维护数据完整性
- not null 非空
- unique 唯一性 (可以为空,允许多个为空)
- primary key 主键(不能为空,不可重复)
- foreign key 外键
- check 约束/检查
外键:
1.外键指向主键
2.外键可以指向unique列
例子:
//班级表
create table class(id number primary key,name varcher2(32));
//学生表,将外键指定给了class表
create table class(id number primary key,name varcher2(32) not null,classId number references class(id));
注意:
(1)如果要删除class主表,直接删除是删不掉的,因为class唯一主键被外键引用。
此时需要先将从表删除,再删除主表class
(2)外键列和主键列的数据类型要一致,number对应number。
(3)建表顺序,先建主表,再建从表。
(4)外键列的值,必须在主键列中存在。
(5)外键列可以为空(null)
check:
用于强制行数据必须满足的条件
例如:create table test1 (id number primry key,sal number check(sal>=1000and sal<=10000) --指定sal列值必须在1000至10000之间
check其他形式:
check (sex in (‘男’,‘女’))
–维护数据完整性,修改约束使用alter table
alter table goods rename column goodId to goodsId; --修改字段名
alter table goods modify goodsName not null; --修改字段不为空
alter table customer add constraint uni_id unique(cardId);–uni_id 为约束名,可自定义
alter table customer add constraint ass_id check(address in (‘上海’,‘北京’));
删除约束:
alter table 表名 drop constraint 约束名;
转载:https://blog.csdn.net/qq_41338106/article/details/101536297