一、数据的存储
1.Java程序中存储数据:
1.1使用变量存储
1.2使用数组和集合存储
1.3使用对象存储
注意: 以上存储数据的方案不能保证数据的持久存储。 都是基于内存存储,属于瞬时数据,伴随着程序运行的终止而消失。
2.使用文本文件存储数据:
存在的缺陷:
-对于数据的类型没有明确的划分。
-安全性的问题。 没有提供完善的数据备份和恢复机制。
-对于查找指定条件的数据,操作很麻烦。
-在多用户并发访问的时候, 容易造成数据的混乱。
二、DBMS(数据库管理系统- DataBase Management System)
1、 数据库管理系统主要是用于组织和管理我们存储的数据的。
2、数据库的分类:
2.1 关系型数据库:
- 关系型数据库,通常是以一张二维表的形式存储数据。表与表之间的数据会存在交叉引用的关系。
- 主流的关系型数据库: Oracle、DB2、Mysql、Sql Server 、Postgresql 等等
2.2 非关系型数据库:
-非关系型数据库(Nosql), 存储数据的结构和形式根据不同的非关系型数据库产品的设计不同,大致可以分为:
① 基于键值对存储 : 比如 redis
② 基于文档存储 : 比如 mongodb
③ 基于列存储 : 比如 Hbase
三、Oracle数据库
1、Oracle数据库的管理形式: 基于多用户的验证访问来管理的。 支持多用户的访问。
2、 Oracle数据库中的基本概念讲解:
2.1 table(表): 表是存储数据的基本单元, 也叫做实体集[ entitySet].
2.2 row(行): 一行数据代表了一条完整的事物的信息。 也叫做实体(entity)。
2.3 column(列): 列是每一条完整事物信息的一个属性。也叫做字段(field)。
2.4 主键: 主键主要是用于唯一的标识表中的一行数据的。 值不能为空。
2.5 外键: 外键的主要作用是与其他表的数据产生相应的关系。
3、 安装Oracle数据库
注意事项: 安装目录不能有中文和空格。 建议放在根目录。
4、 手动操作Oracle的服务
4.1 进入操作系统的服务目录 : 开始–》运行 输入 services.msc
服务一: OracleServiceXE : 是我们oracle数据库的核心服务。
服务二: OracleXETNSListener : 是远程通过网络访问Oracle的监听服务。
4.2 当发现Oracle的客户端连接不上Oracle数据库时, 可以进入系统服务目录, 检查以上两个服务是否正常启动。 如果发现服务没有启动, 启动则可以。 如果返现服务是启动状态,但是还不能访问,可以手动重新启动以上两个服务。
PS: 先重启监听服务,再重启核心服务。
5、专业卸载方式: 使用oracle的安装包操作 或 进入系统的控制面板进行操作。
6.、访问Oracle数据库的方式:
6.1 使用Isqlplus访问: 这种访问方式是Oracle 10g版本提供的基于客户端浏览器的访问方式。 11g版本之后不再提供。
登录系统账户: 解锁我们学习使用的账户 (hr)
6.2 使用sqlPlus访问: 这种方式是Oracle数据系统提供的基于命令行的访问方式。 进入sqlPlus命令行:
-
可以在开始的菜单中点击进入。
-
在开始运行中,输入sqlplus 进入 命令行客户端。
alter user hr account unlock;//解锁hr用户
输入用户名密码,不要超过3次。
6.3 使用第三方的软件 plsqlDeveloper 访问:
书写命令: 点击文件 – 新建 – sql窗口 ==》 然后在新创建的编辑窗口处书写命令
修改字体大小: 点击工具 – 首选项 – 用户界面下的字体 进行设置
7、几个简单的命令:
7.1 查看一个表的结构: desc 表名;
7.2 基于命令行解锁账户: alter user hr account unlock; – 只有管理员账户能执行
7.3 修改账户的密码: alter user hr(账户名) identified by 新的密码; – 只有管理员账户能执行
四、Sql(Structured Query Language) - 结构化查询语言
1、 Sql是关系型数据库的标准查询语言。 在不同的关系型数据库当中, 存在的微小的差异。
五、简单的查询
1.语法: select 字段名,字段名 … from 表名;
- 说明:
from 用于确定从那张表查询数据
select 后指定字段名
-书写简单查询的思路: 先明确从那张表查询数据, 然后明确查询那些字段的信息
2.案例:
2.1 查询部分字段的信息
- 查询员工表的编号、名、姓、工资
select employee_id,first_name,last_name,salary
from employees;
PS: sql语句以分号结束。 书写sql命令不区分大小写, oracle数据库系统在执行时会将sql转换成大写的执行。
2.2 查询全部字段的数据
select employee_id,first_name,last_name,email,phone_number,
hire_date,job_id,salary,commission_pct,manager_id,department_id
from employees; - 手动指定所有字段
或
select * from employees; - 通过的方式查找
PS: * 的方式,数据库在执行的时候,需要将转换成表中所有的字段,再执行, 低效。 开发中建议使用手动指定所有的字段 。
2.3 oracle允许对查询结果中的数据进行算数运算 : + - * /
-查询员工的编号、名字、年薪
select employee_id,last_name,salary*12 from employees;
PS:
-数值类型可以做算数运算。
-日期类型也可以做 + - 的算数运算/以天为单位,不能做 * 和 /的运算。
2.4 oracle中的字符串拼接 : str1||str2 ==> str1str2
-查询员工的编号、姓名(Steven_King的形式展示)
select employee_id,first_name||’_’||last_name
from employees;
PS: 拼接的字符串需要使用单引号包含。
2.5 字段起别名 : 字段名 as 别名
- 查询员工的编号、姓名、年薪 | 要求: 展示 编号 姓名 年薪作为字段名
select employee_id as 编号,first_name||’_’||last_name as 姓名,salary*12 as 年薪
from employees;
PS: 字段的别名可以加双引号, 当加上双引号后别名严格区分大小写。
六、条件查询 - where 【重点】
- 语法: select 字段名,字段名… from 表名 where 条件 ;
- 条件查询案例:
2.1 等值查询: =
- 查询工资为12000的员工信息
select *
from employees where salary=12000;
2.2 不等值查询: != (<>) - 查询工资不为12000的所有员工信息
select *
from employees where salary!=12000;
等效写法
select *
from employees where salary<>12000;
2.3 关系比较查询 : > >= < <= - 查询工资高于12000的员工信息
select *
from employees where salary>12000;
2.4 逻辑运算查询 : and or
- 查询工资高于8000 并且小于12000的员工信息
select *
from employees where salary>8000 and salary<12000;
2.5 区间查询 : between 条件 and 条件
- 查询工资高于8000并且小于12000的员工信息【包含边界值】
select *
from employees where salary between 8000 and 12000;
2.6 枚举查询: in (条件1,条件2,条件3)
- 查询工资是2200,6000,8000,24000的员工信息
select *
from employees where salary in (2200,6000,8000,24000);
PS: in 后面枚举条件的个数最多1000个。
2.7 模糊查询 : like 条件 【重点】
① 模糊查询中几个条件字符 : _[匹配一个字符] %[匹配0到n个字符]
- 查询first_name 是由5个字符组成的员工信息
select *
from employees where first_name like ‘_____’; - 查询first_name 是由5个字符组成 并且 是以大写S开头的员工信息
select *
from employees where first_name like ‘S____’; - 查询first_name 包含字母s的员工信息
select *
from employees where first_name like ‘%s%’; - 查询last_name不包含字母s的员工信息
select *
from employees where last_name not like ‘%s%’;
2.8 对于null 的判断
- 查询没有提成的员工信息
select *
from employees where commission_pct is null; - 查询有提成的员工信息
select *
from employees where commission_pct is not null;
七、排序查询 - order by 【重点】
- 语法: select 字段名, 字段名 … from 表名 where 条件 order by 排序的字段 asc/desc;
- 说明: asc 升序【默认】 desc 降序
- 案例:
2.1 查询员工的信息 按照工资从低到高的顺序展示
select *
from employees order by salary asc;
2.2 查询员工的信息,按照工资从高到低的顺序展示,如果工资相同 按照员工编号的升序展示
select *
from employees order by salary desc,employee_id asc;
PS: 排序条件可以是多个字段,多个字段之间使用逗号分隔, asc/desc关键字作用于前面的字段。
2.3 查询员工信息,按照提成的从高到低顺序展示
select *
from employees order by commission_pct desc; ERROR! .
PS: 在oracle数据库系统中null值最大。
-nvl函数 :
nvl(字段名,值) 结果是 : 如果指定字段的值为null,则为指定值。 如果不为null取字段本身的值。
- 查询所有员工的提成,没有提成多少直接展示为0
select nvl(commisson_pct,0) from employees;
使用nvl函数解决排序中null值最大的问题:
select *
from employees order by nvl(commission_pct,0) desc;
八、查看系统当前时间
- oracle数据库系统为了维护sql语句的完整性,提供了一个哑表(dual), 这张表默认是一行一列的。
select sysdate from dual; - 显示当前系统时间
select systimestamp from dual; - 时间会精确到秒后面6位小数
九、单行函数: 单行函数作用于每一行数据产生一个结果 。 - 日期类型处理函数
1.1 to_char : 将日期类型转换成字符展示
-使用方式: to_char(日期, 格式化字符串)
-常用的格式化字符串:
年 yyyy
月 MM
日 dd
时 hh
分 mi
秒 ss
星期 day
- 案例: 查询今天是星期几
select to_char(sysdate,’day’)
from dual;
1.2 to_date: 将字符串转换成日期类型(格式是oracle系统默认的日期格式: dd-mmm-yy )
-使用方式: to_date(目标日期字符串,格式化字符串)
将2019年10月1日转换成日期格式
select to_date(‘2019-10-1’,’yyyy-mm-dd’) from dual;
-查询2019年的五月一日是星期几
① 将字符串转成oracle系统的日期类型
② 再将其按照指定的格式转换成字符串展示
select to_char(to_date(‘2019-5-1’,’yyyy-mm-dd’),’day’)
from dual;
小练习: 查询1997年入职的员工信息
select *
from employees where to_char(hire_date,’yyyy’)=‘1997’;
十、组函数: 组函数是针对于一组数据产生一个结果。
1.sum() : 求和 , 只能作用于数值类型
2.avg() : 求平均值 ,只能作用于数值类型
3.max(): 求最大值, 支持所有类型。
4.min() : 求最小值,支持所有类型。
- 查询所有员工每个月工资的总和
select sum(salary) from employees; - 查询最高工资、最低工资、平均工资
select max(salary),min(salary),avg(salary) from employees;
5.count() : 统计查询 , 支持所有的类型。
-统计查询员工表一共多少条信息
select count(*) from employees; 等效写法 select count(1) from employees;
- 根据指定字段统计查询 | 注意: 如果指定字段的值为空, 会自动忽略 .
案例: 统计查询所有有提成人员的数量
select count(commission_pct) from employees;
十一、分组语句 - group by 【掌握】
1.语法: select 字段名,字段名… from 表名 where 条件 group by 分组条件 order by 分组条件;
2.说明:
group by 后面跟分组条件字段
3.案例: - 查询各个部门的平均工资 以及 部门的编号
分析:
① 确定分组条件 : department_id
② 对分组后的数据求结果(平均值) : avg(salary)
select department_id,avg(salary)
from employees group by department_id;
-查询1997年各个月份入职的员工人数 以及 月份
① 根据条件初次筛选数据 : where to_char(hire_date,’yyyy’)=’1997’
② 确定分组条件: 月份 group by to_char(hire_date,’mm’)
③ 对分组后的数据进行统计 : count()
select to_char(hire_date,‘mm’),count()
from employees
where to_char(hire_date,‘yyyy’)=‘1997’
group by to_char(hire_date,‘mm’)
order by to_char(hire_date,‘mm’);
- group by语句书写注意事项:
4.1 只有出现在group by语句后的字段,才能单独出现在select语句后 。
4.2 如果要在group by语句中进行结果的排序, 那么排序字段也必须是group by后指定的字段,和结果中的字段。
4.3 如果group by字距中的字段使用了某个单行函数,那么select子句中的字段也必须使用相同的单行函数。
十二、having语句 : 对分组后的数据再次进行筛选 。【了解】
- 语法: select 字段… from 表名 where 条件 group by 分组条件 having 条件 order by …;
- 案例:
–查询1997年各个月份入职的员工人数、月份,要求展示入职人数大于3的月份
select to_char(hire_date,‘mm’),count()
from employees
where to_char(hire_date,‘yyyy’)=‘1997’
group by to_char(hire_date,‘mm’)
having count()>3 – 专门对分组后的数据进行筛选
order by to_char(hire_date,‘mm’); - 当使用where 或 having 都能满足一个需求时,优先选用where .
- 查询60 80 90 号每个部门的平均工资
① 使用where实现: - 先筛选出60 80 90 号部门的信息
- 确定分组条件 : group by department_id
- 查询出60 80 90号部门的平均工资
select department_id,avg(salary)
from employees where department_id in (60,80,90)
group by department_id;
② 使用having实现:
- 确定分组条件: group by department_id
- 对分组后的数据再次筛选: having department_id in (60,80,90)
- 求出各个部门平均工资
select department_id,avg(salary)
from employees
group by department_id
having department_id in(60,80,90);
总结: select语句的执行顺序
select 字段… from 表名 where 条件 group by 分组条件 having 条件 order by …;
1. from 确定从那张表查询
2. where 进行初次筛选
3. group by 对筛选后的数据进行分组
4. having 对分组后的数据再次进行筛选
5. select 生成结果集
6. order by 对结果集进行排序