大多数的理科知识一样,需要初学者具有一下方面的思想准备:
一是不管出于什么样的动机,都需要对新知识点产生学习兴趣,并坚持学习!
说实话,就算到现在,我也依旧无法提起对这方面知识学习的兴趣,
枯燥无味的函数命令,以及各种关键字让人看了就头疼,曾一度我都想过要放弃。
但是到后来,因为要找工作的缘故,必须要学下来。
为此,我一直在尝试如果通过最简单理解记忆的方式来学习这门课程。
二是要善于思考,归纳总结知识点。不要死记硬背。要多实践,如果没有现成的平台让你操作的话。
那么可以从网上找到相关的资源来学习。比如简书,博客园以及IT之家都可以。
三是要善于把复杂的东西简单化,要把内容冗长的内容进行片段化,通过一小段一小段地各个击破。
四是在学习新知识时要静下心,要心无旁骛地把一件事情给做好。还有一点就是,一定要学好英文!!!
好了,我们谈谈数据库吧,可以把它理解成存放货品(数据)的仓库,如果要完成某个项目(事件),就得从中调运物料(数据).没办法,因为这是歪果仁弄出的东东,所以我们要有一定的英语基础。其次就是,英文字符要比汉字占据着更小的内存。就当前的使用频率来说,比较常用的数据库是oracle和mysql,蛮多的用人单位就是这么要求求职者具备的技能。
完整oracle数据库使用技能包含如下:
1.要会安装数据库客户端的软件(一般是公司内部提供的安装包)
2.要会配置本地服务,需要找到tnsnames.ora文件(用于远程连接数据库),用记事本或者文本文档打开,需要配置的内容包括:
数据库服务器的IP(或主机名)
全局数据库名称(也即sid)
监听端口(默认是1521)
登陆数据库还需要用户名和密码
3.要懂得基本的增删改查表的命令,要懂得复杂的分组查询命令,左右连接和子查询。
以上介绍了个大概情况,后面我将数据库的知识知识要点进行详细讲解。
一.表的创建
无论是学习数据库还是其他的编程语言也好,都得知道它的语法结构,然后根据题目要求往上面套对应的字段即可。而创建表的格式是:
create table 表名(
列名1 数据类型【约束条件】,
列名2 数据类型【约束条件】,
列名3 数据类型【约束条件】,
....
列名N 数据类型【约束条件】,
);
1.表名和列名都是自定义的,由字母、数字、下划线(_)组成,不要以数字开头 ;
2.数据类型经常用到三种类型:
number(数字型):可以是整数,也可以是小数,比如:number(5,2) 一个数为5位数的有效数,2位小数 -999.99~999.99 numbe(5) -99999~99999.
日期型:date.经常用到的函数是to_date或者sysdate(系统时间).
字符串:char(固定长度字符),varchar2(可变长字符)。通常后者用的比较多,经常用到的函数是to_char.
3.约束条件有以下几个:
主键(primary key):相当于身份证号码,包含非空约束和唯一约束,一个表中只有一个主键。
唯一约束(unique):值不能重复,但是可以为null。
非空约束(not null):值不能为空.
检查约束(check):判断输入值是否满足某个条件,通常判定男女性别所用。
默认值(default):默认输入值的属性,若没有给列指定默认值,那么该列的默认值是空(即null)
外键(references):也属于表对象,用于和其他表的某个列或者字段产生关联。
举个栗子:
商品售货系统设计案例:
现有一个商品的数据、记录客户及其购物情况,由下三张表组成
商品goods(商品号goodsid,商品名goodsname,单价untiprice,商品类别category,供应商provider)
客户customer(客户号customerid,姓名name,住址address,电邮email,性别sex,身份证cardid)
购买purchase(客户号customerid,商品号goodsid,购买数量nums)
1、建表,每个表的主外键,客户的姓名不能为空值;单价必须大于0,购买数量必须在1到30之间;电邮不能重复;客户的性别必须是男或女,默认是男;
--- 商品表
create table goods(
goodsid number primary key,
goodsname varchar2(50),
untiprice number check(untiprice > 0),
category varchar2(50),
provider varchar2(50)
);
-- 客户表
create table customer(
customerid number primary key,
name varchar2(50) not null,
address varchar2(250),
email varchar2(50) unique,
sex char(2) default '男' check(sex='男' or sex='女'),
cardid varchar2(18)
); --购买表
create table purchase(
customerid number references customer(customerid),
goodsid number references goods(goodsid),
nums number check(nums>=1 and nums <=30)
);
二.表内指定列的修改
1.查看表:
在 command window(命令窗口)下输入:desc 表名;
2.修改表:
(1)增加列 :
语法格式:alter table 表名
add(字段名1 数据类型 [not null | null],字段名2 数据类型 [not null | null]);
(如果要新增多个列,则要用逗号将各列定义分开。)
例:向student表中增加一个性别和住址字段
alter table student
add(score number,addr varchar2(50));
(2)修改列:
语法格式:alter table 表名
modify(列名 数据类型 [default 默认值] [not null | null]);
(如果要修改多个列,则要用逗号将各列定义分开)
例:修改student表的name字段类型为varchar2(50),且默认值为"永杰"。
alter table t_student
modify name varchar2(20) default '永杰' not null;
(3)删除列:
语法格式:alter table 表名
drop column 列名;
例:删除student的score列;
alter table student
drop column score;
(4)删除表:
语法格式:drop table 表名;
例:删除studen表;
drop table student;
三.表的查询
在表的增删改查操作中,表的查询是重中之重,需要重点记忆。
在oracle中,一般会自带三张表:
emp 员工信息表,包含字段:
empno 雇员编号(工号), ename 员工姓名,
job 工种(CLERK秘书,SALESMAN销售,MANAGER经理,ANALYST分析员,PRESIDENT总经理),
mgr 员工上级的编号, hiredate 入职日期, sal 薪水, comm 奖金, deptno 部门号;
dept 部门表,包含的字段:
dname 部门名称(ACCOUNTING财务部,RESEARCH研发部,SALES销售部,OPERATIONS运营部),
loc工作地址;
salgrade工资等级表,包含字段:
GRADE等级(LOSAL最低工资, HISAL最高工资);
(若无特殊说明,后面的查询案例,如无特殊说明,均以系统中存在的emp和dept两个表为例)
单表简单查询:1-8;
1.查询emp表所有列:select * from emp;
2.查询emp表指定列:select empno,ename,job,sal from emp;
3.简单的条件查询:
例:查找出工资超过2000的所有人员信息。
select * from emp where sal>2000;
例:查询1980年入职人员的信息。
select * from emp where to_char(hiredate,'yyyy')='1980';
例: 查询1980年12月到1982年12月入职人员的信息。
select * from emp where to_char(hiredate,'yyyymm') between '198012' and '198212';
4.筛选重复查询内容时就要用到关键字distinct.
例:查找出20号部门中有那些不同的工种。
select distinct job from emp
where deptno = 20
5.多条件过滤之逻辑运算符:not,and,or以及!
格式:
select 列1,列2...列N或*
from 表名
where 过滤条件1 and 过滤条件2 or 过滤条件3.....
例:查找出不是30号部门中的所有经理的所有信息。
select * from emp
where deptno !=30 and job='MANAGER';
6.多值比较运算符:(not)between 值1 and 值2, in, not in.
例:查找出工资在2000到3000之间的职工姓名、工种和工资.
select ename,job,sal from emp
where sal between 2000 and 3000;
例:查询出工资分别是1500,2500,3000的分析员或推销员的姓名、工种、工资和所在部门号.
select ename,job,sal,deptno from emp
where job=ANY in ('ANALYST','SALESMAN') and sal in(1500,2500,3000);
7.模糊查询:like
%表示匹配任意长度的字符串
%test%:表示匹配中间字符串为test的任意长度的字符串.
例:查询出名字以"SCO"开头的,长度为5位的全部职工的姓名、工种、工资和部门号
select ename,job,sal,deptno from emp
where ename like 'SCO__';
8.排序查询:
格式:
ORDER BY 字段名 ASC/DESC;
(ASC升序,DESC降序)
例:计算每个销售人员的年度总报酬,并按总报酬由高到低顺序显示.
select ename,job,comm,sal,12*(sal+comm) from emp
where job='SALESMAN'
order by 12*(sal+comm) DESC;
9.单表复杂查询:
分组/聚合/统计函数:
count(字段名):计算指定字段为非空的行数
count(*):计算表中的全部行数,包括重复行和空行
avg(字段名):计算指定字段的平均值
min(字段名):计算指定字段的最小值
max(字段名):计算指定字段的最大值
sum(字段名):计算指定字段的总和
例:计算emp表中公司职工的最低工资、最高工资、平均工资和总工资的和
select min(sal),max(sal),avg(sal),sum(sal) from emp;
例:计算emp表中公司职工的总人数及工种数
select count(*),count(distinct job) from emp;
10.带条件的分组查询:
/*查询的总语句
select 列1,列2,列3...列N 或 *
from 表名/(表达式) -- 数据池
[where 过滤条件]
[group by 分组内容]
[having 组内条件]
[order by 排序方式]
*/
#分组函数只能出现在选择列表、having、order by 子句中
#如果在select语句同时含有group by、having、order by,那么他们的顺序是group by、having、order by
#group by 有一个原则,就是 select 后面的所有字段,必须出现在 group by 后面,否则,有语法错误(重要)
#有having 一定有group by.
例:查询出至少有两名秘书的所有部门的部门号,并按人数降序排序。
select deptno,count(*) from emp
where job='CLERK'
group by deptno
having count(*) >= 2
order by count(*);
11.多表查询:
语法格式:
select 表别名1.列名1,表别名1.列名2.... 或 表别名1.*,表别名2.*
from 表名1 表别名1,表名2 表别名2,...表名n,表别名n
where 表名1或表别名1.列名=表名2或表别名2.列名 and 表名(n-1)或表别名(n-1).列名=表名n或表别名n.列名
例:查询部门号是20,30,40的职工的员工编号,姓名,工资,部门所在位置。
select e.empno,e.ename,e.sal,d.loc
from emp e,dept d
where e.deptno = d.deptno and e.deptno in(20,30,40);
多表查询解题思路:
@分析题目涉及哪几张表;
@如果查询的数据来自于多张表,找到这些表的相同字段,在where后面,把这些字段用等于号连接起来;
@如果需要对单条记录进行过滤,就把过滤条件追加到where子句后面,用and连接起来;
@需要对多组数据进行统计,使用group by进行分组;
@分组后的过滤,只能使用having;
@需要排序,就用orader by。
12.外连接查询(左右连接) :
语法格式:
select 列名
from 表名1 表别名1,表名2 表别名2
where 表别名1.列名=表别名2.列名(+) 或 表别名1.列名(+)=表别名2.列名;
select ... from table1 t1,table2 t2 where t1.id = t2.id(+); --左连接
select ... from table1 t1,table2 t2 where t1.id(+) = t2.id; --右连接
PS :左连接,等号左边的表为主表,等号右边的表为从表.
右连接,等号右边的表为主表,等号左边的表为从表.
左右连接的另一种写法:
select * from A2 right JOIN B2 ON A2.id=B2.bid
select * from A2 left JOIN B2 ON A2.id=B2.bid
例:显示出所有部门的编号、名称和其职工的姓名与工种。
select d.deptno,d.dname,e.ename,e.job from dept d, emp e where d.deptno = e.deptno(+)
或者也可写成以下格式:
select d.deptno,d.dname,e.ename,e.job from emp e right join dept d on e.deptno = d.deptno;
select d.deptno,d.dname,e.ename,e.job from dept d left join emp e on d.deptno = e.deptno;
13.子查询:
语法格式:
SELECT <列名表>
FROM 表名
WHERE 列表或表达式 比较运算符(SELECT 列名
FROM 表名
WHERE 条件);
( 注意:子查询必须要用圆括号括起来)
(1)单行值子查询的解题思路:
例:查找出与“yongjie”在同一个部门工作的所有职工姓名及工资
分析思路:
首先查找要查找部门的所有职工姓名及工资:
select e.ename,e.sal
from emp e
where deptno = (与“yongjie”在同一个部门)
接着查找SMITH所在的部门:
select deptno from emp where ename = 'yongjie'
-将两种综合就是最终答案:
select e.ename, e.sal
from emp e
where deptno = (select deptno from emp where ename = 'yongjie');
(2)多行值子查询解题思路:
多行子查询,是指子查询会返回多个值,此时,需要用到多值比较运算符:[NOT]IN
例:查找出部门20中的工种相同的职工的姓名与工种。
select e.ename, e.job
from emp e
where e.deptno = 20
and job in (select job from emp
where deptno = 20
group by job
having count(*) >= 2);
四.表的增删改
1.增加数据:
语法格式:insert into 表名(列1,列2...列N)values(值1,值2...值N);
commit | rollback;
( commit 提交,rollback回滚)
如果向表中插入时间格式的数据时,则需要用到to_date()函数把字符串转换为时间格式
语法:to_date(char,'format')
例:向emp表中插入数据:(123,'CLERK','1997-07-01')后提交数据。
insert into emp values(123,'CLERK',to_date('1997-07-01','YYYY-MM-DD'));
commit;
3.修改数据:
语法格式: update 表名
set 列1 = 值1,列2 = 值2...列N = 值N
[where过滤条件];
例:将职工yongjie提升为经理,工资变更为8000,奖金增加20%的比例。
update emp
set job='MANAGER',sal=8000,comm=1.2*comm
where ename='yongjie';
4.删除数据:
语法格式:delete [from] 表名
[where过滤条件]
例:删除emp表中工资低于500元的所有员工的信息.
delete from emp
where sal < 500;
5.删除表的两种方式:
truncate table 表名;
delete table 表名;
delete:会发起事务,可以有where过滤条件(即删除指定的数据),属于dml语句,删除效率比truncate低
truncate:不会发起事务,不能有where过滤条件(即只能删除表中所有的数据),属于ddl语句,删除效率比delete高,但有危险性.