一、数据的存储
1.java 程序中的对象:数组、集合保存。当运行的程序结束的时候,里面的数据就消亡。
2.文件存储系统:
存在的缺陷:
2.1)没有明确的数据类型划分。
2.2)没有用户身份验证机制 不安全。
2.3)不利于维护。
二、数据库概述
1.概念: 数据库是将数据以某种特定的结构组织、管理存储的系统。
2.数据库分类:
2.1)关系型数据库
--关系型数据库:是将数据,以一张二维表的形式进行存储,表与表之间存在这交叉引用关系。
--基本的名词:
1)table(表):是数据库中保存数据的基本单元。也称之为实体集 entitySet.
2)Row(行):代表具体某一条数据 也称之为entity(实体).
3)Column(列):代表当前列 存储数据的特点。
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.3)PL-SQL访问—第三方提供的。
基本操作:新建—》sql窗口—》书写命令—》执行命令F8或者
5.SQL(Structured 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;
注意:在oracle中null值最大。
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.1)rowid:
rowid是oracle系统对每一条数据的物理地址计算后得到的一个18位字符
当已知一条数据的rowid情况下,可以作为查询条件,查询效率高。
select * from employees where rowid = 'AAAC9EAAEAAAABXABK';
2.2)rownum[重点]:
概念: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;
未完待续.......