在学习数据库编程总结了笔记,并分享出来。有问题请及时联系博主:Alliswell_WP,转载请注明出处。

09-数据库编程day02(oracle sql)

目录:
一、学习目标
二、复习
三、Oracle SQL语句
1、多表查询的理论基础
2、等值连接、不等值连接
3、外连接
4、自连接
5、子查询
6、plsqldevloper介绍
7、集合运算
8、新增数据
9、修改和删除数据
10、delete与truncate
11、事务相关的概念
12、事务控制
13、练习及答案

 

一、学习目标

1.多表查询编写
2.子查询编写
3.集合运算
4.数据的增删改操作
5.top-N问题解决
6.事务的相关概念

 

二、复习

1、安装的注意事项:目录不能有中文和空格

2、oracle的体系结构:实例+数据文件, 实例-- 用户(方案) --- 表

》oracle登录不了,排查问题:

--Windows查看两个服务:

OracleServiceORCL  c:\app\administrator\product\11.2.0\dbhome_1\bin\ORACLE.EXE
ORCL OracleOraDb11g_home1TNSListener  C:\app\Administrator\product\11.2.0\dbhome_1\BIN \TNSLSNR

--Linux查看:

登录管理员:

oracle用户:sqlplus / as sysdba
                  SQL>startup (启动实例)
              shell:lsnrctl start (启动监听)
连接命令:sqlplus scott/11@//ip/orcl

3、登录说明

数据库编程——Oracle SQL

上图为配置了tns配置文件的登录方式,orcl00为网络实例别名
数据库编程——Oracle SQL

上图为比较直接登录网络服务器的方式@后指定了对应的主机192.168.137.100 的对应实例 orcl
数据库编程——Oracle SQL

上图为在服务器本机的连接方式,此时可以不走侦听,所以后面不用加@

4、查询

(1)select 查询可以全部列,部分列,表达式,别名

(2)distinct的作用:去除重复行

(3)where 条件过滤:比较运算符(!= <> ),逻辑运算符(and or ),在集合中

(4)(not in 的集合中不能有null),模糊查询(like % _ escape)

(5)between and的特点:闭区间,从小到大

(6)order by 排序可以按列名,别名,表达式,序号(序号为排序结果的第几列)

(7)asc 和 desc 的作用和说明:升序和降序,asc默认,作用域,它之前的 一个字段

(8)group by 分组的要求:在select中出现的非组函数的列,必须在group中 出现

(9)having 的作用:和group一起使用,对分组的数据进行过滤 . where后不 能使用组函数.如果都能用的情况用where.

5、 null的总结

○ 表达式与null运算结果为null

○ 不能用= 或者!=

○ not in的集合中不能有null

○ null无穷大,排序默认在最后nvl(a,b) 如果a为null,返回b,否则返回a

○ 组函数自动过滤空

6、回顾练习

(1)求10号部门的最低薪水和最高薪水
SQL>select min(sal),max(sal) from emp where deptno=10;

(2)求1980年12月17日入职的员工信息
SQL>select * from emp where hiredate=to_date('1980-12-17','yyyy-mm-dd');
SQL>select * from emp where to_char(hiredate,'yyyy-mm-dd')='1980-12-17';

(3)求当前日期所在的月份的最后一天和第一天,显示格式为:yyyymmdd
SQL>select to_char(last_day(sysdate),'yyyymmdd'),to_char(sysdate,'yyyymm')||'01' from dual;

(4)查询名字中有字母A,并且是 MANAGER 的员工
SQL>select * from emp where ename like '%A%' and job='MANAGER';

(5)将员工信息按照部门倒序,薪水升序排列
SQL>select * from emp order by deptno desc,sal asc;

(6)求薪资在1200以上的员工数
SQL>select count(*) from emp where sal > 1200;

三、Oracle SQL语句

1、多表查询的理论基础

》笛卡尔集:

数据库编程——Oracle SQL

笛卡尔集行数=  表1的行数 * 表2的行数
             列数 = 表1的列数 + 表2的列数

2张表的连接条件需要一个
N张表的连接条件需要N-1

 

2、等值连接、不等值连接

》需求:查询员工信息:员工号 姓名 月薪(emp)和部门名称(dept)

多表查询的写法:
○ 表名.列名
○ 给表起个别名,别名.列名

--等值连接  
select empno, ename, sal, dname  from emp e, dept d where e.deptno = d.deptno;
select e.empno, ename, sal, dname,e.deptno   from emp e, dept d where e.deptno = d.deptno

--不等值连接

--查询员工信息:员工号 姓名 月薪 和 薪水级别(salgrade表)
select e.empno,e.ename,e.sal,s.grade  from emp e,salgrade s where e.sal >= s.losal   and e.sal <= s.hisal;

--between and的写法 select e.empno,e.ename,e.sal,s.grade  from emp e,salgrade s where e.sal between s.losal and s.hisal

 

3、外连接

》需求:按部门统计员工人数,显示如下信息:部门号 部门名称 人数
select d.deptno,d.dname,count(*)  from emp e,dept d where e.deptno=d.deptno group by d.deptno,d.dname

数据库编程——Oracle SQL

上述结果缺少40 部门的信息,由于没有40号部门,怎么解决?

》使用外连接:当等值连接条件不成立的时候,想保留等号一边的 数据
外连接写法:

--右外连接  ——想保留等号右边的数据,在等号左边添加 (+)
select d.deptno,d.dname,count(e.empno)  from emp e,dept d where e.deptno(+)=d.deptno group by d.deptno,d.dname order by 1
--左外连接
select d.deptno,d.dname,count(e.empno)  from emp e,dept d where d.deptno=e.deptno(+) group by d.deptno,d.dname order by 1

 

4、自连接

》需求:查询员工信息:xxx的老板是yyy

需要使用自连接

○ 数据都在同一个表
○ 数据不在同一行

》口诀:当成2张表,员工表和老板表,员工表的老板是老板表的 员工
select e.ename||'''s boss is '||b.ename  from emp e,emp b where e.mgr = b.empno

上述写法缺少大老板,使用外连接,保留等号左边数据
select e.ename||'''s boss is '||nvl(b.ename,'himself')  from emp e,emp b where e.mgr = b.empno(+)

》自连接有何弊端?

○笛卡尔集会平方的增长
○尽量避免使用

 

5、子查询

》需求:查询比scott工资高的员工信息?

可以分步做
○ 得到scott的工资  select sal from emp where ename ='SCOTT';
○ 查询大于这个工资的员工  select * from emp where sal > 3000;

要求一次搞定:使用子查询技术
子查询写法:
select * from emp where sal > (select sal from emp where ename ='SCOTT');

子查询的本质:sql嵌套sql,解决一次查询不能返回的问题

*****子查询10点注意事项*****

1)合理的书写风格(如上例,当写一个较复杂的子查询的时候,要合理的添加换行、缩进)


2)小括号( )


3)主查询和子查询可以是不同表,只要子查询返回的结果主查询可以使用即可

--查询部门名称是“SALES”的员工信息
分步做:1.先得到部门编号 2.通过部门编号得到员工信息
select deptno from dept where dname ='SALES';
select * from emp where deptno=30;

===>变成子查询 select * from emp where deptno=(select deptno from dept where dname ='SALES');


4)可以在主查询的where、select、having、from后都可以放置子查询
select …   
from …
where …
group by … err报错(即err报错处不能写
having …
order by … err报错

--select后 查询10号部门员工号,员工姓名,部门编号,部门名称

——多表查询写法
select e.empno,e.ename,e.deptno,d.dname  
from emp e,dept d
where e.deptno=d.deptno   
and e.deptno=10

——子查询写法
select e.empno,e.ename,e.deptno,(select dname from dept where deptno=10) dname  
from emp e
where e.deptno=10

--from后 查询员工的姓名、薪水和年薪:说明:该问题不用子查询也可以完成。但如果是一道填空 题:select * from ___________________
select * from (select ename,sal,sal*16 from emp);

——注意:from后放置的是集合,你可以理解一个新的表

--where后 查询与ward相同job并且薪水比他高的员工信息

第一步:得到ward的job和sal
第二步:根据job和sal确定人
select job,sal from emp where ename='WARD';
select * from emp where sal> 1250 and job ='SALESMAN';

===>变成子查询
select * from emp where sal> (select sal from emp where ename='WARD') and job =(select job from emp where ename='WARD');

--having后  查询高于30号部门最低薪水的部门及其最低薪水

先得到30部门的最低薪水
select min(sal) from emp where deptno=30;
最低薪水大于950的部门及其最低薪水
select deptno,min(sal) from emp group by deptno having min(sal) > 950;

===>子查询写法 select deptno,min(sal) from emp group by deptno having min(sal) > (select min(sal) from emp where deptno=30);


5)不可以在主查询的group by后面放置子查询(SQL语句的语法规范)


6)强调:在from后面放置的子查询(***) from后面放置是一个集合(表、查询结果)

 

7)单行子查询只能使用单行操作符(>,<,=);多行子查询只能使用多行操作符

》举例说明:

--多行操作符有IN  ANY(任意一个)  ALL (所有)

--查询部门名称为SALES和ACCOUNTING的员工信息

得到对应的部门编号
select * from dept where dname='SALES' or dname='ACCOUNTING';
得到10和30部门的员工
select * from emp where deptno in (10,30);

===>变成子查询
select * from emp where deptno in (select deptno from dept where dname='SALES' or dname='ACCOUNTING');

数据库编程——Oracle SQL

--查询薪水比30号部门任意一个(某一个 ANY )员工高的员工信息 (有歧义

比最低的高就可以
select min(sal) from emp where deptno=30;
select * from emp where sal > 950;
===>变成子查询:select * from emp where sal > (select min(sal) from emp where deptno=30);

使用多行操作符
select * from emp where sal > ANY (select sal from emp where deptno=30);

--查询比30号部门所有人工资高的员工信息
select * from emp where sal > ALL (select sal from emp where deptno=30);
select * from emp where sal > (select max(sal) from emp where deptno=30);

8)子查询中的null值

--查询不是老板的员工信息

□ 查询谁是老板
select * from emp where empno in( select distinct mgr from emp) ;

□ 查询不是老板
select * from emp where empno not in( select distinct mgr from emp) ;

数据库编程——Oracle SQL

没有结果?not in 的集合中不能有null

select * from emp where empno not in( select distinct mgr from emp where mgr is not null);

9)一般先执行子查询(内查询),再执行主查询(外查询);但是相关子查询除外

 

10)一般不在子查询中使用order by, 但在Top-N分析问题中,必须使用order by

 

6、plsqldevloper介绍

PLSQL Developer是Oracle数据库开发工具,很牛也很好用,PLSQL Developer功能很强大,可以做为集成调试器,有SQL窗口,命令窗口,对象浏览器和性能优化等功能。

1)首先确保有oracle数据库或者有oracle服务器,然后才能使用PLSQL Developer连接数据库;
2)启动PLSQL Developer,登陆oracle用户账号后连接(这里不详细介绍如何配置tnsname.ora)了;
3)登陆成功后即可进入对象浏览器窗口界面;
4)在对象浏览器选择“my object”,这里边就是SCOTT(当前登陆的用户的所有object);
5)找到table文件夹,里边就是当前账户的所有表格
6)New——》选中Command Window,即可打开命令窗口;然后执行各种指令(和SQL语句相同,需要加分号);
7)New——》选中SQL Window,即可打开sql窗口了;在sql窗口内输入sql语句(一条不用加分号;可以输入多条,最后一条不用加分号“;”),全选,点击执行即可查看到结果,功能很强大
可以拷贝到excel:点击查询后的数据,右键选择“Copy to Excel”->“Copy as xls..”
可以把excel导入到表中:
先输入SQL命令:create table dept_bak as select * from dept where 1=2;(然后选中执行)
再输入SQL命令查看:select * from dept_bak for update(然后选中执行)
点击查询数据任务栏上的“????”解锁,然后在excel中Ctrl+c复制数据,到查询的数据处先点击表格一下,再点击标签一下,然后Ctrl+v,再点击查询数据任务栏上“✔”,再点击查询数据任务栏上的“????”锁上,然后点击菜单栏上的“Commit 提交”按钮(看着像下载的按钮)。
然后,选中select * from dept_bak(选中执行)

8)优化:点击菜单栏“Tools”的“Preferences”,然后在左侧选择“Key Configuration”,在右侧设置快捷键(为经常使用的Command Window和SQL Window设置快捷键)。
9)优化:点击菜单栏“????”,选中“Confiure”,然后优化:点击“Tools”的“Preferences”,然后在左侧选择“Logon History”,在右侧“Fixed Users”中填入经常登录的用户信息。

数据库编程——Oracle SQL

点击菜单栏“????”,即可快速切换不同的用户。(将用户信息保存到txt中,如果重装软件的话,直接粘贴复制到此处,方便登录。)

scott/11@orcl
scott/11@orcl100
scott/11@//192.168.137.100/orcl
scott/11@//192.168.137.111/orcl
hr/hr@orcl100
Fixed Users

相关文章: