数据库
数据库管理系统 DBMS
数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称 DBMS。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。
1.1 分类
关系型数据库
关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
当前主流的关系型数据库有 Oracle、DB2、Microsoft SQL Server、Microsoft
Access、MySQL等。
非关系型数据库
1.2 命令分类操作
分类 | 命令 |
DDL | create:创建;drop:删除;alter:修改;rename: 重命名; truncate:截断 |
DML | insert:插入;delete:删除;update:更新;select:查询 |
DCL | grant:授权;revoke:回收权利;commit:提交事务;rollback:回滚事务 |
查询语句
查询一张表中的所有数据的所有字段 select * from 数据源;
查询语法 : select 查询的数据(*|字段名|字段1,字段 2...|伪列) from 数据源 别名;
一条数据的所有字段值
执行流程: from --> select
2.1 去重 distinct
对结果集中完全相同的多条数据只显示一条
2.2 别名
使用别名便于操作识别 、隐藏底层信息。存在字段别名和表别名
select ename as 雇员姓名 from emp;
select ename as " Ename" from emp;
as: 字段别名可以使用as;表别名不能使用as
" ":原样输出,可以存在 空格与区分大小写
2.3 字符串
使用’’表示字符串(注意区分””) ,拼接使用 ||
select 'my' from emp;
select ename||'a'||'-->' info from emp;
2.4 伪列
不存在的列,构建虚拟的列
select empno, 1*2 as count,'cmj' as name,deptno from emp;
2.5 虚表 dual
用于计算表达式,显示单条记录的值
select 1+1 from dual;
2.6 null
null 遇到数字参与运算的结果为 null,遇到字符串为空串
select 1+null from dual;
select '1'||null from dual;
select 1||'2'||to_char(null) from dual;
select ename,sal*12+comm from emp;
--nvl内置函数,判断是否为null,如果为空,取默认值0,否则取字段实际值 select
ename,sal*12+nvl(comm,0) from emp;
null不能使用条件判断,只能使用is
--存在佣金的员工名称
select * from emp where comm is null;
--不存在佣金的员工名称
select * from emp where comm is not null;
select * from emp where not comm is null;
2.7 where
where 过滤行记录条件 ,条件有:
a)、= 、 >、 <、 >=、 <=、 !=、 <>、 between and
b)、and 、or、 not、 union、 union all、 intersect 、minus
c)、null :is null、 is not null、 --not is null
d)、like :模糊查询 % _ escape('单个字符')
f)、in 、 exists(难点) 及子查询
2.8 集合操作
Union、Union All、Intersect、Minus
Union,并集(去重) 对两个结果集进行并集操作,不包括重复行同时进行默认规则的排序;
Union All,全集(不去重) 对两个结果集进行并集操作,包括重复行,不进行排序 ;
Intersect,交集(找出重复) 对两个结果集进行交集操作,不包括重复行,同时进行默认规则的排序;
Minus,差集(减去重复) 对两个结果集进行差操作,不包括重复行,同时进行默认规则的排序;
--查询工资大于1500 或 含有佣金的人员姓名
--union 去除重复行
select ename from emp where sal>1500
union
select ename from emp where comm is not null;
-- union all 不去除重复行
select ename from emp where sal>1500
union all
select ename from emp where comm is not null;
--查询显示不存在雇员的所有部门号。
select deptno from dept
minus
select distinct deptno from emp
--查询工资大于1500 且 含有佣金的人员姓名
select ename,sal,comm from emp where sal>1500 intersect
select ename,sal,comm from emp where comm is not null;
2.9 模糊查询 like
模糊查询,使用通配符:
1. %:零个及以上(任意个数的)的字符
2. _:一个字符
3. 遇到内容中包含 % _ 使用escape('单个字符')指定转义符
2.10 in 和 exists
in相当于使用or的多个等值,定值集合 ,如果存在子查询,确保类型相同、字段数为1,如果记
录多,效率不高,用于 一些少量定值判断上
exists条件为true,存在记录则返回结果,后续不再继续 比较查询,与查询的字段无关,与记录
有关
--exists :条件为true,存在记录,则返回结果,后续不再继续 ,与字段无关,与记录有关
--exists 难点: 外层结果集 内层结果集 关系列(没有关系列 true)
2.11排序
使用 ORDER BY 排序,排序不是真实改变存储结构的顺序,而是获取的集合的顺序。
顺序 :asc(默认) desc
多字段: 在前面字段相等时,使用后面的字段排序
空排序: 降序为 desc,注意 null 为最后 (null first || last)
3.函数
函数分为系统内置函数 自定义函数(后期学习的 plsql 中定义);了解系统内置函数(方
法),重点掌握 to_date,to_char (字符和日期的转换)根据函数的返回结果,我们将函数分为单
行函数和多行函数
3.1单行函数
3.1.1日期函数
日期函数: 注意区分 db数据库时间 ,java应用服务器的时间。以一方为准 oracle以内部数字格式存储日期年月日小时分钟秒
sysdate/current_date 以date类型返回当前的日期
add_months(d,x) 返回加上x月后的日期d的值
LAST_DAY(d) 返回的所在月份的最后一天
months_between(date1,date2) 返回date1和date2之间月的数目
next_day(sysdate,星期一) 下一个星期一
当前时间
select current_date from dual where 1=1;
select sysdate from dual where 1=1;
修改日期
--两天后的时刻
select sysdate+2 from dual;
修改月份
--当前5个月后的时间
select add_months(sysdate,5) from dual; --雇佣日期 2个月的时间
select ename,hiredate, add_months(hiredate,2) after from emp;
月份之差
--雇佣日期 距离现在的 月份数
select ename, months_between(sysdate , hiredate) from emp;
最后一天
--返回雇佣日期 当月最后一天的时间
select ename, last_day(hiredate) d from emp;
下一个星期的时间
--下一个星期二
select next_day(sysdate, '星期二') from dual;
3.1.2 转换函数
to_date(c,m) -> 字符串以指定格式转换为日期
to_char(d,m) -> 日期以指定格式转换为字符串
select to_date('2017-3-21 18:12:12', 'yyyy-mm-dd hh24:mi:ss') time from dual;
select to_char(sysdate, 'yyyy-mm-dd') from dual;
select to_char(sysdate, 'yyyy/mm/dd') from dual;
select to_char(sysdate, 'yyyy\mm\dd') from dual;
--注意中文的问题
--select to_char(sysdate,'yyyy年mm月dd日') from dual;
select to_char(sysdate, 'yyyy"年"mm"月"dd"日"') from dual;
3.1.3 其他函数
--1)、nvl nvl(string1,string2) 如果string1为null,则结果为string2的值
select ename, nvl(null,0) from emp;
select ename, nvl(to_char(comm),'hello') from emp;
--2)、decode decode(condition,case1,express1,case2 , express2,….casen , expressn,
expressionm)
select ename,decode(deptno, 10,'十',20,'二十') from emp;
--3)、case when then else end
select ename,sal,deptno,
(case deptno
when 10 then sal * 1.1
when 20 then sal * 1.08
when 30 then sal * 1.15
else sal * 1.2
end) raisesal
from emp;