Oracle基本入门

不羁岁月 提交于 2019-11-27 12:40:47

一、数据的存储

  1.java 程序中的对象:数组、集合保存。当运行的程序结束的时候,里面的数据就消亡。

  2.文件存储系统:

存在的缺陷:

     2.1)没有明确的数据类型划分。

     2.2)没有用户身份验证机制 不安全。

     2.3)不利于维护。

二、数据库概述

  1.概念: 数据库是将数据以某种特定的结构组织、管理存储的系统。

  2.数据库分类:

         2.1)关系型数据库

             --关系型数据库:是将数据,以一张二维表的形式进行存储,表与表之间存在这交叉引用关系。

             --基本的名词:

               1table():是数据库中保存数据的基本单元。也称之为实体集 entitySet.

               2Row():代表具体某一条数据 也称之为entity(实体).

               3Column():代表当前列 存储数据的特点。

               4)主键(primary key):唯一标识表中的一条数据,不能为null

               5)  外键:(foreign key:代表的是本表记录与其他表之间的关系,可以为null.

 

             --管理形式:基于用户的形式管理,在访问数据库中的数据之前,需要验证身份。

               

 

     --常见的关系型数据库:

           Oracle  | 甲骨文

           DB2   |  IBM

           SqlServer | Microsoft 微软

           MySql | 甲骨文开源,从SUN公司手中收购。

        

 2.2)非关系型数据库(NOSQL-not only sql

    Redis // 基于key-value形式存储数据。

    MongoDB// 基于文档的存储形式。

    HBase Hive

 

三、Oracle数据库

    1.可以去官网下载

    2.安装

      2.1)注意事项:建议安装在磁盘根目录,目录不允许有中文或者空格。

      2.2)关于卸载:再次运行安装软件,千万不要手动删除;

    3.启动核心服务

       在开始-》运行输入servcies.msc,进入系统服务目录。

        OracleServiceXE:Oracle数据库服务的核心服务。

        OracleXETNSListener:Oracle对外提供访问的服务,比如可以通过浏览器访问、程序访问。

 

     1)命令解锁hr用户:alter user hr account unlock;

     2)修改账户密码:alter user hr identified by 新密码;

    

4.访问方式

     4.1)基于sqlplus命令窗口访问:是oracle系统默认提供;

     4.2)通过浏览器访问。

     4.3PL-SQL访问—第三方提供的。

 

  基本操作:新建sql窗口—》书写命令—》执行命令F8或者

 

5.SQLStructured Query Language 结构化查询语言):sql是所有关系型数据库的标准查询语言,是操作数据库的基本方式。

 

6.基础的查询

   1.简单的查询
            语法:SELECT 字段名1,字段名2 FROM 表名。

     说明:SELECT指定要查询的字段名,多个字段使用“,”隔开。

           FROM后面指定的是从哪张表查询数据。

     书写sql语句简单思路:

       1)确定从哪张表查询。

       2)确定查询的字段。

2.案例

      

2.1)查询多个字段

SELECT FIRST_NAME,LAST_NAME,EMAIL FROM  EMPLOYEES;

  2.2)查询所有字段信息

SELECT*FROM  EMPLOYEES;

       SELECT 所有字段 FROM EMPLOYEES;

       注意:*的方式虽然写着简单,但是执行的效率相比直接写出字段名要低,开发的时候不建议使用*sql命令书写的时候可以不区分大小写,但是最终执行的时候是大写,建议开发使用大写。

 

3.算数运算:+ - * /      // 不支持 %运算

 

  --查询所有员工的姓、名、年薪,部门编号

SELECT LAST_NAME,FIRST_NAME,(SALARY/30)*12,DEPARTMENT_ID

FROM EMPLOYEES;

 --查询所有员工入职日期的前一天

select hire_date-1 from employees;

 

注意:字符串不支持算术运算,日期支持,运算单位是(天)

 

4.字段起别名:select 字段名 as 别名 from 表名;

-- 查询姓、名、年薪

select last_name AS "xing",first_name AS "ming",salary*12  AS yearSalary from employees;

 注意:对于字段的别名,如果是英文,加双引号严格区分大小写,不加则不区分。

起别名过程中,可以省略AS”关键字,但是不规范。

 

5.字符串拼接 字符串1||字符串2

 --查询所有员工姓名、年薪

select last_name||'_'||first_name as 姓名,salary*12 as 年薪 from employees;

 

 

 

6.排序查询【重点】

 6.1 语法:select 字段 …from 表名 order by 字段 ..[asc|desc]

 6.2 说明:asc :升序排序【默认】

          desc:降序排序

 --查询所有员工信息,按照工资降序排序

select last_name||。,'_'||first_name as 姓名,salary as 工资

from employees order by salary;

--查询所有员工信息,按照工资降序排序

     selectlast_name||'_'||first_name as 姓名,

 salary as 工资,department_id as 编号

from employees order by department_id desc;

注意:在oraclenull值最大。

 

7.条件查询【重点】

 7.1)语法:select 字段… from 表名 where 条件 order by …

      1)等值查询: = /!=(<>)

    -- 查询工资是24000的员工信息

select* from employees where salary = 24000

   --查询工资不是24000的员工信息

select* from employees where salary = 24000

一、伪列

1.概念:伪列是通过select * 直接查询不到的,必须通过手动指定才能看见。

2.常见的伪列

   2.1rowid:

       rowidoracle系统对每一条数据的物理地址计算后得到的一个18位字符

   当已知一条数据的rowid情况下,可以作为查询条件,查询效率高。

select  *  from  employees where rowid = 'AAAC9EAAEAAAABXABK';

 

   2.2rownum[重点]:

         概念:oracle数据库系统,会对出现在查询结果中的数据进行一个排序,这一列就是rownum永远从1开始,每次递增1

 

-- 查询员工编号、姓名、薪资、rownum

select employee_id as 编号, last_name||'_'||first_name as 姓名,salary as 薪资,rownum from employees ;

--查询前五名员工信息

select employee_id as 编号,last_name||'_'||first_name as 姓名,salary as 薪资,rownum from employees where rownum <=5;

1)注意:当rownum 与 * 一起出现的时候,表要起别名。

select emp.*,rownum from employees  emp where rownum <=5;

//oracle数据库系统会认为 * 指的就是所有字段,到后面去解析from关键字,此时*后面不是 from关键字,所以会报错。

 解决方式:给目标查询的表起别名,在 *前面用 别名.* 的方式。//注意:表起别名不能使用as关键字。

    2)rownum与order by 一起使用的时候

     --案例:

    --查询工资最高的前五个人的信息:

select emp.*,rownum from employees emp  where rownum <=5 order by salary desc//语法没问题!执行结果错误!【子查询

   3)rownum在where子句中的使用,只能做 < <= >=1(0) =1运算,不能做>1运算

      --查询第6-10员工信息

  select emp.*,rownum from employees emp  where rownum>=6 and rownum <=10//错误,语法没问题,结果不对!【子查询

做个小练习--1.查询员工表所有数据
select * from employees;
--2.打印公司里所有的manager_id
select manager_id from employees ;

--3.查询80号部门的所有员工
select First_name,Last_name from employees where department_id= 80;
select * from employees where department_id = 80

--4.查询50号部门每人增长1000元工资之后的人员姓名及工资.
select first_name,last_name,salary+1000 from employees where department_id = 50


--5.查询80号部门工资大于7000的员工的全名与工资.
select first_name||''||last_name ,salary from employees where department_id = 80 and salary>7000;
select first_name||last_name ,salary from employees where department_id = 80 and salary>7000;

--6.查询80号部门工资大于8000并且佣金高于0.3的员工姓名,工资以及提成
select first_name||last_name,salary,commission_pct*salary from employees where department_id = 80 and salary>8000 and commission_pct>0.3;
select * from employees;

--7.查询职位(job_id)为'AD_PRES'的员工的工资
select salary from employees where job_id = 'AD_PRES';

--8.查询佣金(commission_pct)为0或为NULL的员工信息
select * from employees where commission_pct = 0 or commission_pct is null;

--9.查询入职日期在1997-5-1到1997-12-31之间的所有员工信息
select * from employees where  to_char(hire_date,'yyyy-mm-dd') between '1997-05-01' and '1997-12-31';

select * from employees where  to_char(hire_date,'yyyymmdd') between 19970501 and 19971231;

select * from employees where hire_date between to_date('1997-5-1','yyyy-mm-dd') and to_date('1997-12-31','yyyy-mm-dd');
--10.显示姓名中没有'L'字的员工的详细信息或含有'SM'字的员工信息

select * from employees where first_name||last_name like '%SM%' or  first_name||last_name  not like '%L%';

--11.查询电话号码以5开头的所有员工信息.

select * from employees where phone_number like '5%';


--12.查询80号部门中last_name以n结尾的所有员工信息
select * from employees where last_name like '%n';

--13.查询所有last_name 由四个以上字母组成的员工信息

单行函数练习
--1.1997年入职的员工(考察知识点:单行函数)
select first_name||'-'||last_name,hire_date from employees where to_char(hire_date,'yyyy')  = '1997';


2.查询2002年下半年入职的员工(考察知识点:单行函数)
select first_name||'-'|| last_name,hire_date from employees where to_char(hire_date,'yyyy')='1997' and to_char(hire_date,'mm')>=6;
select * from employees where to_char(hire_date,'yyyy')=1997
select * from employees where to_char (hire_date,'yyyy')='1997'
select * from employees where to_char(hire_date,'yyyy') like 2002
select * from employees where to_char(hire_date,'yyyy') in 2002

3.打印自己出生了多少天

select sysdate-to_date('1997-12-17','yyyy-mm-dd') from dual;
--4.打印入职时间超过10年的员工信息
select count(*) from employees where sysdate-hire_date>=6750;
select count(1) from employees where to_char(sysdate,'yyyy')-to_char(hire_date,'yyyy')>=10
select count(*) from employees  where months_between(sysdate,hire_date)/12>10;

组函数练习
--1.求1997年各个月入职的的员工个数(考察知识点:组函数)
select count(1)  from employees  where  to_char(hire_date,'yyyy') = '1997' group by to_char(hire_date,'mm');


select count(1),rownum  from employees  where  to_char(hire_date,'yyyy') = '1997' group by to_char(hire_date,'mm');
                                                

--2.查询各部门的总工资
select department_id ,sum(salary) from employees  group by department_id;

--3.查询50号部门,60号部门,70号部门的平均工资
select avg(salary)
 from employees 
 where department_id in(50,60,70)
 group by  department_id 
order by department_id;

select department_id ,salary from employees where department_id  =50 or department_id = 70

--4.查询各部门的最高工资,最低工资.

select department_id, max(salary),min(salary) from employees group by department_id;

--5.查询各部门中各个岗位的平均工资.

select job_id,avg(salary) from employees group by  department_id,job_id;

--6.查询平均工资高于8000元的部门的最高工资.

select department_id ,max(salary) from employees  group by department_id having avg(salary)>8000 ;

--查询工资最高的前5名
select salary,rownum from employees where rownum<=5 order by salary desc

--查询5-10 员工的工资
select * from (select emp.*, rownum rm from employees emp order by rm  ) where rm<=10 and rm>=6;

未完待续.......

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!