一、数据库的介绍和基本了解

1.概念 :

简而言之:是一个存储管理数据的软件( 做数据”持久化”的软件 )

什么是数据库?

数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作。

什么是数据库管理系统?

数据库管理系统(DataBase Management System,DBMS):指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统访问数据库中表内的数据。

数据库分类:

数据库类型 英文缩写/全拼 常见数据库代表
关系数据库 RDBMS oracle  db2  mysql  sqlsv

面向对象数据库

   
NOSQL数据库 HBase  Redis  MongoDB  
Java相关:MYSQL和Oracle    

关系数据库存放数据的结构:

1) 二维表( table ) : 存放数据的基本单元

2) 行 (row, 记录recode) : 一组相关的业务数据

3) 列 (column, 字段 ) : 业务数据里一个具体的属性信息

--- 主键( primary key , 简称pk) : 可以唯一标识表里的一条记录 , 非空唯一

--- 外键( foreign key, 简称 fk ) : 体现两个表记录之间的关系 , 可以重复可以为

null,但是值必须来自于另外一个表的主键

4. 安装软件-plsqldev.exe

1) 安装目录最好不要有中文

2) 输入的密码 --- 管理员密码 ( System  sys )

3) 安装成功后 , 解锁”hr用户”( 测试用户 )

5. Oracle工作原理

6. 常见命令解析

1) SQL (结构化的查询语言) : 数据库领域的 “普通话”

① 不区分大小写  ② 必须以分号结尾

2) PL/SQL : oracle公司的 “方言”

3) Sqlplus命令:  sqlplus工具所支持的命令( 不能操作数据 ) , 只在sqlplus里使用, 不

区分大小写,通常被”缩写” , 例如: conn

7.基本数据类型

分类

类型名称

说明

整数类型

tinyInt

很小的整数

smallint

小的整数

mediumint

中等大小的整数

int(integer)

普通大小的整数

小数类型

float

单精度浮点数

double

双精度浮点数

decimal(m,d)

压缩严格的定点数

日期类型

year

YYYY  1901~2155

time

HH:MM:SS  -838:59:59~838:59:59

date

YYYY-MM-DD 1000-01-01~9999-12-3

datetime

YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00~ 9999-12-31 23:59:59

timestamp

YYYY-MM-DD HH:MM:SS  1970~01~01 00:00:01 UTC~2038-01-19 03:14:07UTC

文本、二进制类型

CHAR(M)

M为0~255之间的整数

VARCHAR(M)

M为0~65535之间的整数

TINYBLOB

允许长度0~255字节

BLOB

允许长度0~65535字节

MEDIUMBLOB

允许长度0~167772150字节

LONGBLOB

允许长度0~4294967295字节

TINYTEXT

允许长度0~255字节

TEXT

允许长度0~65535字节

MEDIUMTEXT

允许长度0~167772150字节

LONGTEXT

允许长度0~4294967295字节

VARBINARY(M)

允许长度0~M个字节的变长字节字符串

BINARY(M)

允许长度0~M个字节的定长字节字符串

二、oracle数据库的查询操作

(在Oracle数据库中有默认的测试用户:username:hr     password:在你安装软件时自己设置 请记下来)

(1)基本查找

查看employees表

-- hr用户里有一个employees表select employee_id,first_name,last_name,salary from employees;

-- 查看表里所有的字段信息

-- 查看表里所有的字段信息  *select * from employees;    -- 开发不建议使用,语义不明确

-- 可以对查询结果做数学运算

--查询员工的编号,姓名,年薪,部门编号(此处salary*12便是数学运算)

注意 : 数字类型可以应用所有运算符号 ;日期类型可以( + - ) ,计算单位为天 ;字符串类型不能使用运算符号( + )

select employee_id,first_name,salary*12,department_id;

-- 字符串连接符:||

-- 请显示公司员工的编号,姓名,完整邮箱(后缀@zparkhr.com.cn)

 -- 请显示公司员工的编号,姓名,完整邮箱(后缀@zparkhr.com.cn)
select employee_id,email||'@zparkhr.com.cn'  from employees;
-- 请打印员工的完整姓名
select last_name||' '||first_name from employees;

注意: 在sql命令里如果使用 字符串字面值 或者 日期字面值 , 则必须使用’ ’表示

-- 查询结果里的字段可以定义别名

-- select 字段名 as 别名,字段名,.... 其中as可以省略

-- 如果别名里含有特殊字符or需要区分别名的大小写,可以用"双引号"标识

select last_name||' '||first_name as name from employees;
select employee_id id,last_name,salary*12 “anual salary” from employees;

 -- 去除查询结果里的重复数据 distinct(如果结果里有多个字段,多个字段联合去重)

    -- 请打印公司里所有经理的编号

  -- 请打印公司里所有经理的编号select distinct manager_id from employees;select distinct job_id,department_id from employees;

三、Oracle数据库的排序命令

-- 请查询员工的详细信息,并对结果按工资排序

-- 请查询员工的详细信息,并对结果按工资排序select * from employees order by salary desc;

-- 请查询员工编号,姓名,工资,部门编号,并按照部门编号升序显示

-- 请查询员工编号,姓名,工资,部门编号,并按照部门编号升序显示select employee_id id, first_name name,salary , department_id from employees order by department_id;

-- 在指定排序条件时,可以通过数字(查询结果里字段的下标)指定

-- 在指定排序条件时,可以通过数字(查询结果里字段的下标)指定   select employee_id id, first_name name,salary , department_id from employees order by 4 ;

-- 在指定排序条件时,可以通过列的别名排序

-- 在指定排序条件时,可以通过列的别名排序select employee_id id, first_name name,salary , department_id from employees order by name;

-- 如果条件里有多个字段,则先按第一个字段排序,然后再按第二个字段排序

   -- 如果条件里有多个字段,则先按第一个字段排序,然后再按第二个字段排序select * from employees order by department_id,salary ;-- 先按部门编号升序,再按工资降序select * from employees order by department_id,salary desc;-- 都降序select * from employees order by department_id desc,salary desc;

-- 在oracle里,null被视作为"最大值"

select * from employees order by commission_pct;

四、Oracle数据库条件判断命令--->where

 比较运算符   =  !=   >   >=  <  <=

-- 字符串字面值比较时区分大小写

-- 请查询工资大于10000的员工信息

   -- 请查询工资大于10000的员工信息select * from employees where salary>10000;-- 请查询last_name叫King的员工信息select * from employees where last_name = 'King';

②逻辑运算符  and  or

-- 请查询50部门,工资大于5000的员工信息

     -- 请查询50部门,工资大于5000的员工信息select * from employees where department_id=50 and salary>5000;

③特殊谓词

1)in    not in   --- 多个值(同一字段)的或运算

-- 请打印50,70,90部门的员工信息

-- 请打印50,70,90部门的员工信息select * from employeeswhere department_id=50 or department_id=70 or department_id=90;select * from employeeswhere department_id in(50,70,90);

2)between...and  ,  not between...and  --- 查询区间值(包括边界值)

-- 请查询工资介于5000到10000之间的员工

-- 请查询工资介于5000到10000之间的员工select * from employees where salary<=10000 and salary>=5000;select * from employees where salary between 5000 and 10000;

3) 空值处理  is null  ,  is not null

-- 查询所有提成为null的记录

select * from employees where commission_pct=null;  --error

- 一个表达式里如果有null,则结果一定为null

select * from employees where commission_pct is null;

五、Oracle数据库模糊查询命令

-- 请查询姓名(last_name)是以'S'开头的员工信息

-- 请查询姓名(last_name)是以'S'开头的员工信息select * from employees where last_name like 'S%';

-- 请查询姓名(last_name)是由四个字符组成的员工信息

-- 请查询姓名(last_name)是由四个字符组成的员工信息select * from employees where last_name like '____';

-- 请查询姓名(last_name)是以'S_'开头的员工信息

-- 请查询姓名(last_name)是以'S_'开头的员工信息select * from employees where last_name like 'S\_%' escape '\';select * from employees where last_name like 'S(_%' escape '(';

六、Oracle数据库提供的功能函数

1.单行函数

1)作用于指定表里的每一行数据,执行一次,得到一个结果

-- abs(num) 计算绝对值

 -- abs(num) 计算绝对值select abs(salary) from employees;  --107次select abs(-2) from employees;      --107次

-- oracle提供了一个dual表(哑表),用来维护select语句的完整性

-- dual单行单列,不允许用户操作(增删改)

-- dual单行单列,不允许用户操作(增删改)select abs(-2) from dual;   -- 1次

-- sysdate 当前数据库系统时间(日期值)

 select sysdate from dual;  --标准日期格式 dd-mon-rr

2) to_char( 日期值 , ‘格式字符串’)

作用: 将给定的日期值,按照格式字符串的形式变成 字符串

-- 请显示详细的当前系统时间(年月日星期小时分钟秒)

-- 请显示详细的当前系统时间(年月日星期小时分钟秒)select to_char(sysdate,'yyyy-mm-dd,day,hh24:mi:ss') from dual;

重要作用: 提取日期的各个组成部分

-- 请打印97年入职的员工信息(两种方式)

-- 请打印97年入职的员工信息(两种方式)select * from employees where hire_date like '%97';--模糊查询select * from employees where to_char(hire_date,'yyyy')=1997;--单行函数查询

-- 请打印50部门的员工信息,并按照入职月份升序排列

-- 请打印50部门的员工信息,并按照入职月份升序排列select * from employees where department_id=50order by to_char(hire_date,'mm');

3)   to_date( 字符串日期显示 , ‘格式字符串’)

作用: 将给定的字符串时间显示,按照格式字符串的要求转换成日期值

-- 请打印你出生那天是星期几

select to_char(to_date('1996-06-14','yyyy-mm-dd'),'day') from dual;

2.组函数

1)分组语句 -- group by

-- 请打印各部门的最高工资,并升序排列

-- 思路:  1. 数据的来源 --- from employees

--        2. 有没有筛选条件 --- 无

--        3. 分组条件 --- group by department_id

--        4. 统计数据 --- select department_id,max(salary)

--        5. 排序 --- order by max(salary) 或者 order by 2

-- 合并:

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

-- 请打印97年各个月份入职的员工人数

-- 思路: 1. from emplyoees;

--       2. where hire_date like '%97'

--       3. group by to_char(hire_date,'mm')

--       4. select to_char(hire_date,'mm'),count(*)

--       5. order by to_char(hire_date,'mm')

-- 合并:

select to_char(hire_date,'mm'),count(*) from employeeswhere hire_date like '%97'group by to_char(hire_date,'mm') order by 1;

硬性的语法规定:

2)Having子句

1. 作用: 对分组后的数据进行条件筛选( 按组筛选 )

2.语法:

3.案例:

-- 请打印各部门编号,人数( 只显示人数大于2的信息 )

-- 请打印各部门编号,人数( 只显示人数大于2的信息 )select department_id,count(*) from employeesgroup by department_id   having count(*) > 2;

4. Where 和 having的区别

1) where在分组前执行,对数据按”行”筛选,不能出现组函数

2) having发生在分组之后,对组进行筛选 , 不能出现对行信息的筛选

注意:如果一个功能where和having都可以完成,则优选where

-- 请打印30和50部门的编号,人数 ,最高工资

-- 请打印30和50部门的编号,人数 ,最高工资select department_id , max(salary),count(*) from employeeswhere department_id=30 or department_id=50 group by department_id;select department_id , max(salary),count(*) from employeesgroup by department_idhaving department_id=30 or department_id=50;

3)Select语句的总结

1. 语法:  select...from...where...group by...having...order by...

2. 执行顺序

1) from 子句  --- 数据的来源

2) where子句  --- 对数据进行筛选(逐行筛选)

3) group by子句 --- 对满足要求(where条件成立)的数据进行分组

4) having子句 --- 对分组后的数据按条件筛选

5) select子句 --- 生成结果数据

6) order by子句 --- 对结果数据排序

4)Case...when

1. Sql命令中的分支结构,类似于java中的switch...case

2. 语法:

3.案例:

1.-- 请打印员工的编号,姓名,工资,工资级别

-- 提示:工资级别( A: <6000   B: <10000  C: < 15000   D: >=15000 )

-- 请打印员工的编号,姓名,工资,工资级别-- 提示:工资级别( A: <6000   B: <10000  C: < 15000   D: >=15000 )select employee_id,last_name,salary,( case when salary<6000 then 'A' when salary<10000 then 'B' when salary<15000 then 'C'else 'D' end ) "工资级别"from employees;

2.----统计50部门'ST_MAN'和'ST_CLERK'两种职位的人数

  department_id

    ST_MAN

    ST_CLERK

      50

5

20

select department_id,sum(case when job_id='ST_MAN' then 1 else 0 end ) ST_MAN,sum( case when job_id='ST_CLERK' then 1 else 0 end ) ST_CLERK
from employees where department_id=50 group by department_id;

3. 有Score表如下: (列转行)

     NAME

     COURSE

      SCORE

     张三

语文

80

     张三

数学

90

     张三

英语

85

     李四

语文

70

     李四

数学

80

     李四

英语

89

将写出sql语句,将表里数据按照下面的方式显示

  NAME

    语文

     数学

     英语

  张三

80

90

85

  李四

70

80

89

提示:case..when,组函数、练习表参看score.sql文件  start xxx.sql

select name , sum(case when couse='语文' then score end ) "语文"
from  student  group by name;
-- sum位置可以使用除了count之外的其他4个组函数

七、Oracle数据库中的伪列 ( rowid  rownum )

1. 概念: 数据库表里不存在的列 , 无法通过select * 查询到列

      select  *,rownum,rowid  from employees;  -- error

改进:

    select employees.* , rownum,rowid  from employees; select e.* , rownum , rowid from employees ;

2. Rowid

1) 当前记录在数据库里的唯一标识 , 是通过记录所在空间的物理地址计算得到

Pk : 在表里唯一标识一条记录

  1. 通常在查询过程中, db sv通过rowid定位记录
  2. 使用场景: 记录里的业务数据完全一样,无法区分时,通过rowid区分
Delete xxxx  from employees where  rowid > ( select ....min(rowid)  );

3. Rownum

1) db sv 会为每一条出现在结果里的记录编号, 从1开始(连续的)

2) 案例:

-- 请查询员工表里的前5条记

select * from employees where rownum<=5 ;

-- 请查询员工表里的第6到第10行记录

  select * from employees where rownum between 6 and 10;  --error

-- rownum必须从1开始用,只能对rownum使用 <  <=  >=1  =1

八、Oracle数据库中的子查询

1)子查询提供一个值( 查询结果是单行单列 )

-- 请打印公司里工资高于平均工资的员工信息

-- 请打印公司里工资高于平均工资的员工信息-- 1. select avg(salary) from employees;  -- result-- 2. select * from employees where salary > result ;select * from employeeswhere salary>( select avg(salary) from employees );

2)子查询结果是多行一列(多个值)  --- [ 了解 ]

-- 请打印与Steven(first_name)在同一部门工作的员工信息

-- 请打印与Steven(first_name)在同一部门工作的员工信息1. select department_id from employees where first_name='Steven';     (90,50)2. select * from employees where department_id in (result);select * from employees where department_id in (select department_id from employees where first_name='Steven');

3)子查询结果是多行多列(虚拟表)

-- 可以针对”虚拟表”继续定义查询命令(二次查询)

-- 请打印公司里工资最高的五位员工信息

-- 请打印公司里工资最高的五位员工信息-- 分析:  排序 order by salary desc   筛选条件: where rownum<=5select * from employees where rownum<=5 order by salary desc;
-- 错误原因: 查询了表里的前五行数据,对结果按工资降序排列

-- 思路: 1.对表里所有数据按照工资降序排列

-- select * from employees order by salary desc; --- result(tab1)

--2.从tab1里提取前五行数据

--  select * from tab1 where rownum <= 5;

select *
from (select * from employees order by salary desc)where rownum<=5;

4)数据分页(分段显示结果数据)【重点】

-- 请打印公司里工资最高的 第6 到 第10 员工信息

-- 打印last_name是以'D'开头的第3到第5名员工信息

 1. select * from employees where last_name like 'D%'; --- t12. select t1.*,rownum rn from t1 where rownum<=5;    --- t23. select * from t2 where rn between 3 and 5;

5)关联子查询

提示: 表的别名可以用来区分查询语句

-- 请打印各部门工资最高的员工信息

select * from employees e1 where salary = ( select max(salary) from employees e2where e2.department_id = e1.department_id );

[未完待续,请看Oracle数据库操作(2)~]

Oralce数据库的详解解析(包括操作步骤)【1】相关推荐

  1. SVN trunk(主线) branch(分支) tag(标记) 用法详解和详细操作步骤

    一:使用场景: 假如你的项目(这里指的是手机客户端项目)的某个版本(例如1.0版本)已经完成开发.测试并已经上线了,接下来接到新的需求,新需求的开发需要修改多个文件中的代码,当需求已经开始开发一段时间 ...

  2. 【转】SVN trunk(主线) branch(分支) tag(标记) 用法详解和详细操作步骤

    转自:https://monday.blog.csdn.net/article/details/51122637 一:使用场景: 假如你的项目(这里指的是手机客户端项目)的某个版本(例如1.0版本)已 ...

  3. SAE上传web应用(包括使用数据库)教程详解及问题解惑

    2019独角兽企业重金招聘Python工程师标准>>> 转自:http://blog.csdn.net/baiyuliang2013/article/details/24725995 ...

  4. 详解ADO.NET操作数据库合力创享

    详解ADO.NET操作数据库 第一步:http://dl.dbank.com/c0h28bwpss 第二步:http://dl.dbank.com/c0xkrkgp9i 第三步:http://dl.d ...

  5. 前沿分享|阿里云数据库高级技术专家 宋利兵:阿里云企业级自治数据库RDS详解

    简介:本篇内容为2021云栖大会-企业级云原生数据库最佳实践论坛中,阿里云数据库高级技术专家 宋利兵关于"阿里云企业级自治数据库RDS详解"的分享. 本文将从2方面为大家介绍企业级 ...

  6. HSQLDB数据库使用详解(入门)及快速使用

    hsql数据库使用详解(入门)及快速使用 一.简介: hsql数据库是一款纯Java编写的免费数据库,许可是BSD-style的协议,如果你是使用Java编程的话,不凡考虑一下使用它,相对其 他数据库 ...

  7. 基于sqlite的android数据库编程,Android编程之SQLite数据库操作方法详解

    Android编程之SQLite数据库操作方法详解 发布时间:2020-09-07 12:33:04 来源:脚本之家 阅读:85 作者:低调小一 本文实例讲述了Android SQLite数据库操作方 ...

  8. 数据库 explain详解

    数据库 explain详解 文章目录 数据库 explain详解 1.什么是explain 2.explain有什么用 3.explain个字段详解 3.1 id详解 3.2 select_type ...

  9. 网络安全学习--008--SQL注入之Access数据库注入详解

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Access注入漏洞详解 一:注入漏洞分析 站库分类: 1.网站分类: 静态网页: 不依赖数据库 灵活性差,制作.更新.维护麻烦 交互 ...

最新文章

  1. Android自定义View基本步骤
  2. 【单片机】以输出方波为例的 定时器使用
  3. C/C++ sizeof函数解析——解决sizeof求结构体大小的问题
  4. 【我的Android进阶之旅】Android 源代码中的Java代码中//$NON-NLS-1$ 注释是什么意思?...
  5. Java通过反射了解集合泛型的本质(Class反射都是在运行时执行的)
  6. 中国工程院院士徐宗本:大数据的挑战和问题
  7. KubeEdge 初测
  8. 【ElasticSearch】Es 源码之 DiskThresholdMonitor 源码解读
  9. Using a Comparison Function for the Key Type
  10. OpenShift 4 - 运行Spark和Zeppelin大数据应用
  11. linux 硬盘空间还有,但是无法创建文件
  12. python中的cv2模块能否保存图像的地理坐标信息_Python中plt.plot图像保存有白边,CV2.polyline,fillpoly的参数问题,图像保存颜色发生异常...
  13. JDK9的安装与配置
  14. RHEL6入门系列之三十一,管理计划任务
  15. 背景差分检测物体,背景白点去除
  16. 你晓得什么叫风华绝代
  17. 雪花算法生成主键id
  18. android自定义渐变色,Android如何设置渐变色背景 | 夕辞
  19. 计算机设备系统包括哪些,计算机硬件系统包括哪些
  20. 感动!刘若英和陈升的那些往事

热门文章

  1. 2022年最新MCN网红KOL报价(共200份)
  2. PreDate()上一日函数
  3. 概述长程攻击,Part-2:应对方法
  4. Windows cmd命令 GeTu0529
  5. ANTLR4 NoClassDefFoundError
  6. 【紫光同创国产FPGA教程】【第十八章】AD实验之AD7606波形显示
  7. invoke,十分钟搞定强大的Python任务自动化工具
  8. 星巴克传奇:为客人煮好每一杯咖啡
  9. web常用通用组件+Axure后台管理系统框架模板+大屏数据可视化元件库+智慧社区管理系统大屏+图表组件+表单组合+智慧数据看板+通用大屏图表原件库+电脑端常用组件
  10. PC实现路由器的基本功能