Oracle--核心总结

         一:数据库分类:

                            1)关系型数据库:

                                     Mysql(用的最多);

                                     Oracel(最安全);

                                     SqlServer;

                                     DB2(金融、银行);

                             2)非关系型数据库:

                                     Hbase;

                                     Redis;

                                    MongoDB;

       二:Oralce介绍:

                               数据库版本:
                                        Oracle 8及8i: i表示的internet,向网络发展,过渡版本,只有一张vcd。8i是过渡性产品。
                                        Oracle9i:是乊前使用最广泛版本,8i的升级版。1CD
                                        Oracle10g:700M过渡性产品,其中g表示的是网格计算。以平面网格,以中心查找。
                                        Oracle11g:完整性产品,最新版本2G。
                                        Oracle12c:the world's first database designed for the cloud 

       三: Oracle安装教程:

                    1.安装过程:      

                                   第一步:将压缩包进行解压,大家会看到两个压缩包,将两个报全部都进行解压:

                                              

                                  第二步:将win64_11gR2_database_2of2包中的components的内容替换到win64_11gR2_database_1of2中的相同目录下;

                                  第三步:完成上述步骤后,软件的安装目录如下:双击setup.exe程序进行安装

                                               

                                  第四步:Oracle安装之后会检测环境,会提示不满足,点击是即可

                                              

                                第五步:  填写邮件信息,此处不填写,将对勾取消

                                             

                                 第六步:此处弹出警告信息,忽略即可

                                             

                                第七步:安装完成之后会自动创建数据库

                                            

                              第八步:选择安装桌面类

                                             

                             第九步:选择oracle的安装目录,一定要指定目录,否则修改配置文件麻烦

                                            

                               第十步:  密码简单会提出警告信息,忽略即可

                                             

                                第十一步:提示oracle相关的配置信息,默认即可

                                             

                              第十二步:Oracle的安装过程,此过程会持续一段时间,耐心等待即可

                                             

                             第十三步:安装进度条,耐心等待

                                              

                               第十四步:验证安装成功-->Windows+R-->services.mcs出现七个服务表示安装成功;

                                             

                                          问题一: Oracle 11g服务详细介绍及哪些服务是必须开启的?
                                          安装oracle 11g R2中的方法成功安装Oracle 11g后,共有7个服务,这七个服务的含义分别为:
                                          1. Oracle ORCL VSS Writer Service(非必须启动):Oracle卷映射拷贝写入服务,VSS(Volume Shadow Copy                                                           Service)能够让存储基础设备(比如磁盘,阵列等)创建高保真的时间点映像,即映射拷贝(shadow copy)。它可
                                              以在多卷戒者单个卷上创建映射拷贝,同时开会影响到系统的系统能。
                                          2. OracleDBConsoleorcl(非必须启动):Oracle数据库控制台服务,orcl是Oracle的实例标识,默认的实例为orcl。在                                                  运行Enterprise Manager(企业管理器OEM)的时候,需要启动这个服务。
                                          3. OracleJobSchedulerORCL(非必须启动):Oracle作业调度(定时器)服务,ORCL是Oracle实例标识。
                                          4. OracleMTSRecoveryService(非必须启动)   :服务端控制。该服务允许数据库充当一个微软事务服务器MTS、                                                       COM/COM+对象和分布式环境下的事务的资源管理器。

                                          5. OracleOraDb11g_home1ClrAgent(非必须启动):Oracle数据库.NET扩展服务的一部分。
                                          6. OracleOraDb11g_home1TNSListener(必须启动):监听器服务,服务只有在数据库需要远程访问的时候才需要。
                                          7. OracleServiceORCL(必须启动):数据库服务(数据库实例),是Oracle核心服务该服务,是数据库吭劢的基础, 只有该                                                 服务启动,Oracle数据库才能正常启动。
                                          问题二: 那么在开发的时候到底需要启动哪些服务呢?
                                           对新手来说,要是只用Oracle自带的sql*plus的话,只要启动OracleServiceORCL即可,要是使用PL/SQL Developer等第                                      三方工具的话,OracleOraDb11g_home1TNSListener服务也要开启。OracleDBConsoleorcl是进入基亍web的EM必须开启                                          的,其余服务很少用。
                                    注:ORCL是数据库实例名,默认的数据库是ORCL,你可以创建其他的,即OracleService+数据库名   

                    2.使用问题:

                                        新安装的Oracle是处于锁定状态,需要人为进行解锁;

                                         Windows+R->sqlplus /nolog-->conn scott/tiger@orcl

                                          

                                          解决方案:使用sys用户解锁;

                                          conn sys/指定口令@orcl as sysdba;

                                          alter user scott account unlock;

                                           quit

                                           

          四:Oracle的使用

                          1.创建数据库:

                                                   1)打开Database Configuration Assistant进行数据库的创建

                                                                                                               

                                                   2)直接点击下一步开始创建

                                                        

                                                  3)选择第一个选项,创建新的数据库,同时可以进行数据库的删除和配置等操作

                                                        

                                                  4)选择创建什么用途的数据库实例,默认选择第一个

                                                        

                                                    5)填写数据库的名称和SID

                                                       

                                                      6)要求配置管理器,默认选项即可,不需要做任何修改

                                                       

                                                      7)此处填写实例数据库的密码,建议设置统一密码,方便记忆

                                                       

                                                        然后一路下一步即可;

                            2.常用命令

                                                      a) sqlplus
                                                              1. sqlplus /nolog
                                                              2. conn scott/tiger@orcl
                                                              3. show user
                                                              4. set linesize 150
                                                              5. set pagesize 20
                                                              6. passw
                                                              7. conn sys/abc123456@orcl as sysdba
                                                              8. select * from emp where ename=‘&ename’
                                                    b) alter user scott account unlock
                                                              a) 统一密码:tiger                                          

                                              Pl/sql连接常见问题:

                                                        D:\oracle\product\11.2.0\dbhome_1\NETWORK\ADMIN

                                                         

                                                       查看监听服务即可,保证监听服务能够启动

                         3.sql语句

                                                     1)概念:结构化查询语言 (Structured Query Language),具有定义、查询、更新和控制等多种功能,是关系数据                                                                          库的标准语言。

                                                     2)实验数据:

--给表添加注释
comment on table emp is '雇员表';
--给列添加注释
comment on column emp.ename is '雇员姓名';

/*sql语句学习

SELECT [DISTINCT] {*,column alias,..}
FROM table alias
Where 条件表达式

*/

--查询雇员表中部门编号是10的员工
select empno,ename,job from emp where deptno = 10;
--dinstinct 去除重复数据
select distinct deptno from emp;
--去重也可以针对多个字段,多个字段值只要有一个不匹配就算是不同的记录
select distinct deptno,sal from emp;


--在查询的过程中可以给列添加别名,同时也可以给表添加别名
select e.empno 雇员编号,e.ename 雇员名称,e.job 雇员工作 from emp e where e.deptno = 10;
--给列起别名可以加as,也可以不加,看你心情
select e.empno as 雇员编号,e.ename  as 雇员名称,e.job as 雇员工作 from emp e where e.deptno = 10;
--给列起别名,如果别名中包含空格,那么需要将别名整体用“”包含起来
select e.empno as "雇员 编号",e.ename  as "雇员 名称",e.job as "雇员 工作" from emp e where e.deptno = 10;
--查询表中的所有字段,可以使用*,但是在项目中千万不要随便使用*,容易被打死
select * from emp;


/*
=,!=,<>,<,>,<=,>=,any,some,all
is null,is not null
between x and y
in(list),not in(list)
exists(sub-query)
like  _ ,%,escape ‘\‘   _\% escape ‘\’

*/
-- =
select * from emp where deptno = 20;
--!=
select * from emp where deptno !=20;
--<> 不等于
select * from emp where deptno <> 20;
--<,
select sal from emp where sal <1500;
-->,
select sal from emp where sal >1500;
--<=,
select sal from emp where sal <=1500;
-->=,
select sal from emp where sal >=1500;
--any,取其中任意一个
select sal from emp where sal > any(1000,1500,3000);
--some,some跟any是同一个效果,只要大于其中某一个值都会成立
select sal from emp where sal > some(1000,1500,3000);
--all,大于所有的值才会成立
select sal from emp where sal > all(1000,1500,3000);
--is null,在sql的语法中,null表示一个特殊的含义,null != null,不能使用=,!=判断,需要使用is ,is not
select * from emp where comm is null;
--,is not null
select * from emp where comm is not null;
select * from emp where null is null;
--between x and y,包含x和y的值
select * from emp where sal between 1500 and 3000;
select * from emp where sal >=1500 and sal <=3000;
--需要进行某些值的等值判断的时候可以使用in和not in
--in(list),
select * from emp where deptno in(10,20);
--可是用and 和or这样的关键字,and相当于是与操作,or相当于是或操作
--and和or可能出现在同一个sql语句中,此时需要注意and和or的优先级
--and 的优先级要高于or,所以一定要将or的相关操作用()括起来,提高优先级
select * from emp where deptno = 10 or deptno = 20;
--not in(list)
select * from emp where deptno not in(10,20);
select * from emp where deptno != 10 and deptno !=20;
/*exists(sub-query),当exists中的子查询语句能查到对应结果的时候,
意味着条件满足
相当于双层for循环
--现在要查询部门编号为10和20的员工,要求使用exists实现
*/
select * from emp where deptno = 10 or deptno = 20;
--通过外层循环来规范内层循环
select *
  from emp e
 where exists (select deptno
          from dept d
         where (d.deptno = 10 or d.deptno = 20)
           and e.deptno = d.deptno)
/*
模糊查询:
like  _ ,%,escape ‘\‘   _\% escape ‘\’

在like的语句中,需要使用占位符或者通配符
_,某个字符或者数字仅出现一次
%,任意字符出现任意次数
escape,使用转义字符,可以自己规定转义字符
当涉及到大文本检索时:不建议使用模糊查询(效率比较低),可以使用一些框架:luence,solr,elastic search
使用like时要慎重,因为like的效率比较低
使用like可以时参考使用索引,但是要求不能以%开头;

*/
--查询名字以S开头的用户
select * from emp where ename like('S%')
--查询名字以S开头且倒数第二个字符为T的用户
select * from emp where ename like('S%T_');
select * from emp where ename like('S%T%');
--查询名字中带%的用户
select * from emp where ename like('%\%%') escape('\');

/*
 练习:1、查询部门编号为10的员工信息
2、查询年薪大于3000的人员的姓名部门编号
3、查询津贴为null的人员姓名与工资
4、查询工资大于1500 且 and 含有佣金的人员姓名
5、查询工资大于1500 或 or含有佣金的人员姓名
6、查询姓名里面含有 S 员工信息 工资、名称
7、求姓名以J开头第二个字符O的员工姓名与工资
8、求包含%的雇员姓名
9、使用in查询部门名称为 CLERK 和 SALESMAN 的雇员姓名、工资、部门编号
10、使用exists查询部门名称为CLERK和SALESMAN的雇员姓名、工资、部门编号。
*/
--1、查询部门编号为10的员工信息
select * from emp where deptno=10;
--2、查询年薪大于3万的人员的姓名与部门编号
select ename, sal, deptno from emp where sal>3000;
--3、查询佣金为null的人员姓名与工资
select ename,sal from emp where comm is null;
--4、查询工资大于1500 且 and 含有佣金的人员姓名
select ename from emp where sal>1500 and comm is not null;
--5、查询工资大于1500 或 or含有佣金的人员姓名
select ename from emp where sal>1500 or comm is not null;
--6、查询姓名里面含有 S 员工信息 工资、名称
select ename,sal from emp where ename like('S%') or ename like('%S') or ename like('%S%');
--7、求姓名以J开头第二个字符O的员工姓名与工资
select ename, sal from emp where ename like('JO%');
--8、求包含%的雇员姓名
select ename from emp where ename like('%/%%') escape('/');
--9、使用in查询部门名称为 CLERK 和 SALESMAN 的雇员姓名、工资、部门编号
select ename, sal, deptno,job from emp where job in('CLERK','SALESMAN');
--10、使用exists查询部门名称为CLERK和SALESMAN的雇员姓名、工资、部门编号。
select ename, sal, deptno from emp e where exists(select job from dept d where (dname='CLERK' or dname='SALESMAN') and e.job=d.dname);



/*order by进行排序
   默认情况下:完成的是升序的排序操作;
   asc: 是默认的排序方式,表示升序;
   desc: 表示降序;
   排序是按照自然顺序进行排序的,如果是数值,那么按照从大到小,如果是字符串,那么按照字典序排序;
   在进行排序的时候可以指定多个字段进行排序,而且多个字段可以使用不同的排序方式;
   注意:每次在执行order by的时候相当于是做了全排序,效率会比较低耗费内存资源,因此选择在业务不太繁忙的时候进行;     
*/
--升序
select * from emp order by sal asc;
select * from emp order by sal;
select * from emp order by ename;
--降序
select * from emp order by sal desc; 

--综合多字段排序
select * from emp where sal is not null order by sal desc, ename asc;

--使用计算字段
--字符串连接符
select 'my name is' ||ename from emp;
select concat('my name is',ename) from emp;
--计算每个员工的年薪
select ename, (e.sal+e.comm)*12 from emp e;
--null是比较特殊的存在,null做任何运算都还是null,因此要将空进行转换
--引入函数nvl,nvl(arg1,arg2),如果arg1是空,那么返回arg2,如果不为空,则返回原来值
select ename,(e.sal+nvl(e.comm,0))*12 from emp e;
--dual是orcale数据库中的一张虚拟表,没有实际的数据,可以用来做测试
select 100+null from dual;
--A
select * from emp where deptno=30;
--B
select * from emp where sal>1000;
--并集,将两个集合中所有数据都进行显示,但是不包含重复的数据
select * from emp where deptno=30 union select * from emp where sal>1000;
--全集,将两个集合中所有的数据进行显示,且不会完成去重操作
select * from emp where deptno=30 union all select * from emp where sal>1000;
--交集,  表示两个集合中交叉的集合
select * from emp where deptno=30 intersect select * from emp where sal>1000;
--差集,表示在A集合中而不包含B集合中的数据,与A和B的集合顺序有关系
select * from emp where deptno=30 minus select * from emp where sal>1000;

/*
1、使用基本查询诧句.
 (1)查询DEPT表显示所有部门名称.
 (2)查询EMP表显示所有雇员名及其全年收入(月收入=工资+补劣),处理NULL行,幵指定列别名为"年收入"
 (3)查询显示丌存在雇员的所有部门号。
2、限制查询数据
 (1)查询EMP表显示工资超过2850的雇员姓名和工资。
 (2)查询EMP表显示工资在1500~2850乊间的所有雇员及工资。
 (3)查询EMP表显示代码为7566的雇员姓名及所在部门代码。
 (4)查询EMP表显示部门10和30中工资超过1500的雇员名及工资。
 (5)查询EMP表显示第2个字符为"A"的所有雇员名其工资。
 (6)查询EMP表显示补劣非空的所有雇员名及其补劣。
3、排序数据
 (1)查询EMP表显示所有雇员名、工资、雇佣日期,幵以雇员名的升序进行排序。
 (2)查询EMP表显示在1981年2月1日到1981年5月1日乊间雇佣的雇员名、岗位及雇佣日期,幵以雇佣日期进行排序。
 (3)查询EMP表显示获得补劣的所有雇员名、工资及补劣,幵以工资升序和补劣降序排序。
*/

                  4.sql函数:

                                       函授一般是在数据上执行的,它给数据的转换和处理提供了方便。只是将取出的数据进行处理,它不会改变数据库中的值。

                                       

                                      sql函数可以分为组函数和单行函数。

                                      - 组函数又被称为聚合函数,用于对多行数据进行操作,并返回一个单一的结果,组函数仅可用于选择列表或者查询的having                                           字句;

                                      - 单行函数对于单个数值进行操作,并返回一个值。

Sql函数可以分为组函数和 单行函数。

                                       

                                        单行函数的分类:

                                                   

                                                 

/*
  函数:一般在数据上执行,它改变数据的转换和处理提供了方便。只是将取出的数据进行处理,不会改变数据库中的值。
  组函数:又称为聚合函数:输入多个值,最终只返回一个值。
  单行函数:输入一个值,输出一个值;
*/
--查询所有员工的薪水综合
select sum(sal) from emp;
--查看表中有多少条记录
select count(*) from emp;


--字符函数
--concat:表示字符串的连接 等同与||
select concat('my name is',ename) from emp;
--initcap: 将字符串首字母大写
select initcap(ename)from emp;
--upper: 将字符串全部转换为大写
select upper(ename) from emp; 
--Lower: 将字符串全部转换为小写
select lower(ename) from emp;
--lpad: 左填充字符串  rpad:右填充字符串
select lpad(ename,10,'*') from emp;
--trim:去除空格
select trim(ename) from emp;
select ltrim(ename) from emp;
select rtrim(ename) from emp;

--instr:查找指定字符串的位置
select instr('ABCDEFG','A') from emp; 

--length:查看字符串的长度
select length(ename) from emp;
--substr:截取字符串
select substr(ename,0,2) from emp;
--replace: 替换操作
select replace('abcdefg','ab','hehe') from emp;


--数值函数
--round: 给小数进行四舍五入操作,可以指定小数部分的整数
select round(123.123,2) from dual;
select round(123.128,2) from dual;

--trunc: 截取函数,按照位数去进行截取,但是不会进行四舍五入的操作
select trunc(123.128,2) from dual;

--mod: 取模操作
select mod(10,4) from dual;
select mod(-10,4) from dual;

--ceil:向上取整
select ceil(12.12) from dual;
--floor:向下取整
select floor(13.99) from dual;
--abs:取绝对值
select abs(-100) from dual;
--sign: 获取正负值 如果是正值:1;如果是负值:-1;
select sign(-100) from dual;
--x的y次幂
select power(2,3) from dual;



--时间函数
--sysdate:获取当前系统时间
select sysdate from dual;
select current_date from dual;

--add_months:添加指定的月份
select add_months(hiredate,2), hiredate from emp;
--last_day: 返回输入月份的最后一天
select last_day(sysdate) from dual;
--months_between:两个日期相间隔的月份
select months_between(sysdate,hiredate) from emp;
--round:返回四舍五入的第一天
select sysdate 当时日期,
       round(sysdate) 最近0点日期,
       round(sysdate, 'day') 最近星期日,
       round(sysdate, 'month') 最近月初,
       round(sysdate, 'q') 最近季初日期,
       round(sysdate, 'year') 最近年初日期
  from dual;
--next_day:返回下周的星期几
select next_day(sysdate,'星期一') from dual;
--extract:提取日期中的时间
select 
extract(hour from timestamp '2001-2-16 2:38:40 ' ) 小时,
extract(minute from timestamp '2001-2-16 2:38:40 ' ) 分钟,
extract(second from timestamp '2001-2-16 2:38:40 ' ) 秒,
extract(DAY from timestamp '2001-2-16 2:38:40 ' ) 日,
extract(MONTH from timestamp '2001-2-16 2:38:40 ' ) 月,
extract(YEAR from timestamp '2001-2-16 2:38:40 ' ) 年
 from dual;
 
--localtimestamp:返回日期的时间戳
select localtimestamp from dual; 
select current_timestamp from dual;

--给指定的时间单位增加数值
select
trunc(sysdate)+(interval '1' second), --加1秒(1/24/60/60)
trunc(sysdate)+(interval '1' minute), --加1分钟(1/24/60)
trunc(sysdate)+(interval '1' hour), --加1小时(1/24)
trunc(sysdate)+(INTERVAL '1' DAY),  --加1天(1)
trunc(sysdate)+(INTERVAL '1' MONTH), --加1月
trunc(sysdate)+(INTERVAL '1' YEAR), --加1年
trunc(sysdate)+(interval '01:02:03' hour to second), --加指定小时到秒
trunc(sysdate)+(interval '01:02' minute to second), --加指定分钟到秒
trunc(sysdate)+(interval '01:02' hour to minute), --加指定小时到分钟
trunc(sysdate)+(interval '2 01:02' day to minute) --加指定天数到分钟
from dual;

/*转换函数
      在oracle中存在数值的隐式转换和显式转换
      隐式转换:是指字符串可以转为数值或者日期
      显式转换:当有数值或者日期转成字符串时,必须要规定特殊的格式

*/
select '999'+10 from dual;

--to_char:日期转字符串 格式:YYYY-MM-dd HH24:MI:SS
select to_char(sysdate,'YYYY-MM-dd HH24:MI:SS') from dual;
--to_char: 数值转字符串 格式:9、000.000、$000.000、L000.000、999,999,999
select to_char(123.456789,'9999') from dual;
select to_char(123.456789,'000.00000') from dual;
select to_char(123.456789,'$000.0000') from dual;
select to_char(123.456789,'L000.0000') from dual;
select to_char(123456789,'999,999,999') from dual;

--to_date: 字符串转时间格式 
select to_date('2021-7-14 18:40:00','YYYY-MM-DD HH24:MI:SS') from dual;

--to_number: 字符串转数值
select to_number('123,456,789','999,999,999') from dual;

--显示没有上级的公司首脑
select ename,nvl(to_char(mgr),'boss') from emp where mgr is null;
--显示员工雇佣期满六个月后下一个星期五的日期
select hiredate,next_day(add_months(hiredate,6),'星期五') from emp;


--条件函数
--decode,case when

--decode:给不同部门的人员涨薪,10部门涨10%,20部门涨20%,30部门涨30%
select ename,
       sal,
       deptno,
       decode(deptno, 10, sal * 1.1, 20, sal * 1.2, 30, sal * 1.3)
  from emp;

--case when
select ename,
       sal,
       deptno,
       case deptno
         when 10 then
          sal * 1.1
         when 20 then
          sal * 1.2
         when 30 then
          sal * 1.3
       end
  from emp;

create table test(
   id number(10) primary key,
   type number(10) ,
   t_id number(10),
   value varchar2(5)
);
insert into test values(100,1,1,'张三');
insert into test values(200,2,1,'男');
insert into test values(300,3,1,'50');

insert into test values(101,1,2,'刘二');
insert into test values(201,2,2,'男');
insert into test values(301,3,2,'30');

insert into test values(102,1,3,'刘三');
insert into test values(202,2,3,'女');
insert into test values(302,3,3,'10');

select * from test;
/*需求:将表的显示转换为

姓名      性别     年龄
--------- -------- ----
张三       男        50
*/
--行转列操作
select decode(type, 1, value) 姓名,
       decode(type, 2, value) 性别,
       decode(type, 3, value) 年龄
  from test;
--解决不同行问题
select max(decode(type, 1, value)) 姓名,
       max(decode(type, 2, value)) 性别,
       max(decode(type, 3, value)) 年龄
  from test group by t_id;

/*
  组函数:一般情况下,组函数都要和group by组合使用;
  注意:组函数一般用于选择列表或者having条件判断;
  常用组函数:
       avg():平均值  适用于数值类型的数据;
       min(): 最小值  适用于任何类型;
       max(): 最大值;适用于任何类型的数据;
       count(): 记录数 处理时回跳过空值和非空值;
               count:一般用来获取表中的记录数,获取条数的时候可以使用*或者某一个具体的列甚至可以使用纯数字来代替,但是运行效率上来看
                     建议使用数字或者某一个具体的列来代替,而不要使用*;
       sum(): 求和
*/
select avg(sal) from emp;
select min(sal) from emp;
select max(sal) from emp;
select count(sal) from emp;
select sum(sal) from emp;
--group by:按照某些相同的值去进行分组操作,group by出现的位置:where字句之后,order by字句之前; 
--group by:进行分组操作时,可以指定一个列或者多个列,但是当使用了group by之后,选择列表只能包含组函数的值或者group by的普通字段;
--求每个部门的平均薪水 
select avg(sal) from emp group by deptno;

--求平均薪水大于1500的部门
select avg(sal),deptno from emp group by deptno having avg(sal) >2000;

select count(*) from emp;

select count(ename) from emp;

select count(1) from emp;
 
/*
  面试题:where关键字和having关键字之间的区别:
  1.where过滤行,having过滤列;
  2.Having支持所有where操作符
*/

/*
 select子句顺序:
       select: 要返回的列或者表达式;
       from: 从中检索的表;
       where: 行级过滤;
       group by: 分组;
       Having: 组级过滤;
       order by: 输出排序;
       sql语句的执行过程:
       from>hwere>group by>having>select>select
       1.读取from子句中的基本、视图的数据;
       2.选取满足where子句中给出的表达式的元组;
       3.按照group子句中指定列的值分组,同时提取满足Having子句中组条件表达式的那些组;
       4.按select子句中给出的列名或列表达式求值输出;
       5.Order by子句对输出的目标进行排序;     
*/
select avg(sal),deptno from emp where sal is not null group by deptno having avg(sal) >2000 order by avg(sal);
--求部门下雇员工资大于2000的人数
select deptno,count(1) from emp where sal>2000 group by deptno; 
--求部门薪水最高的人
select deptno,max(sal) from emp group by deptno;

--求部门里面工龄最大和工龄最小的人,知道名字
select deptno,min(hiredate) as 工龄最小,max(hiredate) as 工龄最大 from emp group by deptno;

select ename, deptno
  from emp
 where hiredate in (select min(hiredate) from emp group by deptno)
    or hiredate in (select max(hiredate) from emp group by deptno);

/*
  关联查询:
      语法:select t1.c1, t2.c2 from t1,t2 where t1.c3= t2.c4;
      注意:当多表中有重名列时,必须在列的名字前加上表名作为前缀;
*/
--查询雇员的名称和部门的名称

/*
  1992语法连接:
*/
select ename 雇员名称,dname 部门名称 from emp,dept where emp.deptno=dept.deptno;

--查询雇员名称以及自己薪水的等级  --非等值连接
select e.ename, e.sal, sg.grade from emp e, salgrade sg where e.sal between sg.losal and sg.hisal;

--等值连接:两个表中包含相同的列名;
--非等值连接:两个表中没有相同的列名,但是某一个列在另一张表的列的范围;
--外连接:
--查询雇员表中所有数据都将进行显示,此时利用等值连接的话只会把关联到的数据显示,没有关联的数据不会显示。
--分类:左外连接(把左表的数据全部显示)和右外连接(把右表数据全部显示)
select * from emp e, dept d where e.deptno=d.deptno;  --等值连接
select * from emp e, dept d where e.deptno=d.deptno(+);   --左外连接
select * from emp e, dept d where e.deptno(+)=d.deptno;   --右外连接


--自连接:将一张表当成不同的表来看待,自己关联自己
--将雇员和他经理的名称查出来
select e.ename, m.ename from emp e, emp m where e.mgr= e.empno;

--笛卡尔积: 当关联多张表,但是不指定连接条件时,会进行笛卡尔积,关联后的总关联记录条数为M*N,一般不建议使用;
select * from emp e, dept d;

--92表连接语法有什么问题?
--在92语法中,多张表的连接条件会放到where子句中,同时where需要对表进行条件过滤,
--相当于把过滤条件和连接条件放到了一起,过于混乱,因此出现了99语法。

/*
   1999语法连接:
   cross join: 等同于92语法中的笛卡尔积;
   natural join: 等同于92语法中的等值连接,但是注意,不需要写连接条件,但是当不具备相同列名是,会进行笛卡尔积查询;
   on: 等同于92语法中的等值连接,必须要加连接条件;
   
*/

--cross join 等同于92语法中的笛卡尔积
select * from emp cross join dept;
--natural join 相当于是等值连接,但是注意,不需要写连接条件;
select * from emp e natural join dept d;
--当两张表中不具备相同列名时,会进行笛卡尔积操作;
select * from emp e natural join salgrade sg; 
--on 可以添加任意的连接条件
--相当于92语法中的等值连接
select * from emp e join dept d on e.deptno=d.deptno;
--相当于92语法中的非等值连接
select * from emp e join salgrade sg on e.sal between sg.losal and sg.hisal; 

--left outer join 左外连接:会把左表中的全部数据正常显示。右表没有对应的数据直接显示为空
select * from emp  e left outer join dept d on e.deptno=d.deptno;
select * from emp e ,dept d where e.deptno=d.deptno(+);   --左外连接

--right outer join 右外连接:会把右表中的全部数据正常显示,左表中没有对应的记录的话会显示为空
select * from emp e right outer join dept d on e.deptno=d.deptno; 
select * from emp e ,dept d where e.deptno(+)=d.deptno;   --右外连接

--full  outer join 全连接:相等于左外连接和右外连接的合集
select * from emp e full outer join dept d on e.deptno=d.deptno; 

--inner join: 两张表的连接查询,只会查询出有匹配记录的数据
select * from emp e inner join dept d on e.deptno=d.deptno;

--using: 除了使用on表示连接条件之外,也可以使用using作为连接条件,此时连接条件的列不再属于任何一张表。
select * from emp e join dept d using(dep1tno);

--总结:两种语法的sql语句中没有任何限制,在公司中可以随意使用,但是建议使用99语法,不要使用92语法;

--检索雇员名称、所在单位、薪水等级
select e.ename, d.loc, sg.grade
  from emp e
  join dept d
    on e.deptno = d.deptno
  join salgrade sg
    on e.sal between sg.losal and sg.hisal;

/*
子查询:
       嵌套其他sql语句中的完整的sql语句,可以称之为子查询;
分类:
    单行子查询:
    多行子查询:            
*/


--有哪些人的薪水在整个雇员的平均水平之上
--1.先求平均薪水
select avg(e.sal) from emp e;
--2.把所有人的薪水与平均薪水比较;
select * from emp e where e.sal>(select avg(e.sal) from emp e);


--查询雇员中有哪些人是经理人
--1.查询所有经理人编号
select distinct e.mgr from emp e;
--2.在雇员中过滤这些编号即可
select * from emp e where e.empno in(select distinct e.mgr from emp e);

--查询每个部门的平均薪水
--1.先求出部门的平均薪水
select e.deptno,avg(e.sal) from emp e group by deptno;
--1.跟薪水等级表做关联,求出平均薪水的等级
select t.deptno,
       sg.grade from salgrade sg join (select e.deptno, avg(e.sal) vsal
                                        from emp e
                                       group by deptno) t on t.vsal between sg.losal and sg.hisal;
                                       
--作业:
--1.求平均薪水最高的部门的部门编号;
--先求出部门的平均薪水
select e.deptno,avg(e.sal) from emp e group by deptno;
--再求出平均薪水最高的部门
select max(p.sal) from (select avg(e.sal) sal from emp e group by e.deptno) p;                                       
--最后求部门编号
 select t.deptno from (select e.deptno, avg(e.sal) vsal from emp e group by deptno) t
  where t.vsal =
        (select max(p.sal)
           from (select avg(e.sal) sal from emp e group by e.deptno) p);

--2.查询每个部门的平均薪水等级
--先求出部门的平均薪水
select e.deptno,avg(e.sal) from emp e group by deptno;
--跟薪水等级表做关联,求出平均薪水的等级
select t.deptno,
       sg.grade from salgrade sg join (select e.deptno, avg(e.sal) vsal
                                        from emp e
                                       group by deptno) t on t.vsal between sg.losal and sg.hisal;

                                       
--3.查询部门平均的薪水等级
--先求部门每个人的薪水等级
select e.deptno, sg.grade from emp e join salgrade sg on e.sal between sg.losal and sg.hisal;                                     
--按照部门求平均等级
select t.deptno,avg(t.grade) from (select e.deptno, sg.grade from emp e join salgrade sg on e.sal between sg.losal and sg.hisal) t group by t.deptno;


--4.求薪水最大的前5名雇员;
--



--5.求薪水最高的第6到第10名雇员;


                      

                                          

组函数又被称作聚合函数,用亍对多行数据进行操作,幵返回一个单一的结
果,组函数仅可用亍选择列表戒查询的 having 子句
单行函数对单个数值进行操作,幵返回一个值。
Sql 函数可以分为组函数和单行函数。
组函数又被称作聚合函数,用亍对多行数据进行操作,幵返回一个单一的结
果,组函数仅可用亍选择列表戒查询的 having 子句
单行函数对单个数值进行操作,幵返回一个值。
Sql 函数可以分为组函数和单行函数。
组函数又被称作聚合函数,用亍对多行数据进行操作,幵返回一个单一的结
果,组函数仅可用亍选择列表戒查询的 having 子句
单行函数对单个数值进行操作,幵返回一个值。

函数一般是在数据上执行的,它给数据的转换和处理提供了方便。
只是将取出的数据进行处理,丌会改变数据库中的值。
函数一般是在数据上执行的,它给数据的转换和处理提供了方便。
只是将取出的数据进行处理,丌会改变数据库中的值。
函数一般是在数据上执行的,它给数据的转换和处理提供了方便。
只是将取出的数据进行处理,丌会改变数据库中的值。

                                              

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值