一、数据库相关概念
1、数据库(Database):
是按照数据结构来组织、存储和管理数据的仓库
2、数据库管理系统(Database Management System):
是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称 DBMS。
数据库管理系统就是实现把用户意义下抽象的逻辑数据处理,转换成为计算机中具体的物理数据处理的软件。有了数据库管理系统,用户就可以在抽象意义下处理数据,而不必顾及这些数据在计算机中的布局和物理位置。
它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。用户通过 DBMS访问数据库中的数据,数据 库管理员也通过dbms进行数据库的维护工作。它可使多个应用程序和用户用不同的 方法在同时或不同时刻去建立,修改和询问数据库。
3、关系型数据库
根据存储模型可将数据库划分为关系型数据库和非关系型数据库。
关系型数据库, 是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库 中的数据。简单来说,关系模型指的就是二维表格模型,而一个关系型数据库就是 由二维表及其之间的联系所组成的一个数据组织。
当前主流的关系型数据库有 Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL等。
4、SQL语言:
- 一种介于关系代数与关系演算之间的结构化查询语言,是一个通用的、功能极强的关系型数据库语言。
- 分类:
DDL (数据定义语言)
DML (数据管理语言)(DQL数据查询语言+DML数据管理语言)
DCL (数据库控制语句)
5、表(Table)
- 表是从属于用户的 ,查询表(用户名.表名),当前用户查询自己的表时,用户名. 可以省略,其他用户查询 别的用户表 ,不能省略,同时必须存在权限。 在关系数据模型中一张表就是一个关系。
- 表是逻辑表(概念表),不是物理表 块(8k) --->区(连续块)-->段(连续区) -->表(多个段) ,数据段不全是表,表一定是数据段。还 有其他段:如索引段
- 组成:行和列
列是同类信息组成,是一个属性或者特征,又称为一个字段。
行包括若干列的信息,又叫做一条记录,意义是信息的组合,整体用来描述一个对象。比如一个学生信息表,其中的列有姓名,性别,出生年月,籍贯,等等,这些信息组合在一起都是为了来描述学生这么个对象。
-
结构:类比JAVA
6、三范式:
6.1、范式
简言之就是,数据库设计对数据的存储性能,还有开发人员对数据的操作都有莫大的关系。所以建立科学的,规范的的数据库是需要满足一些规范的来优化数据数据存储方式。在关系型数据库中这些规范就可以称为范式。
6.2、三大范式:
- 第一范式:
当关系模式R的所有属性都不能在分解为更基本的数据单位时,称R是满足第一范式的,简记为1NF。满足第一范式是关系模式规范化的最低要求,否则,将有很多基本操作在这样的关系模式中实现不了。
目的:尽量合并属性一样的列,确保不产生冗余数据
- 第二范式:
如果关系模式R满足第一范式,并且R得所有非主属性都完全依赖于R的每一个候选关键属性,称R满足第二范式,简记为2NF。
目的:这样便实现了一条数据做一件事,不掺杂复杂的关系逻辑。同时对表数据的更新维护也更易操作。
- 第三范式:
设R是一个满足第一范式条件的关系模式,X是R的任意属性集,如果X非传递依赖于R的任意一个候选关键字,称R满足第三范式,简记为3NF.
简而言之,就是数据不能存在传递关系
注:关系实质上是一张二维表,其中每一行是一个元组,每一列是一个属性
二、 select查询命令
1、查询列
- 简单查询select-from
--两个中横线代表sql中的注释
--结尾分号要为英文状态下的分号
--select * from 表名;查询某个表中的所有数据
select * from emp;
--select 字段名1,字段名2...from表名;查询部分字段数据
select sal,comm from emp;
- 使用distinct关键字去重
--去重使用distinct关键字
select distinct sal from emp;
- 伪列:不存在的列,构建虚拟的列
--select表达式from 表名;结果字段的名字为表达式的名字,值为表达式计算的结果-->计算器
select 1+1 from emp;
select distinct 123*456,12*34 from emp;
--对数字和日期进行加减乘除运算
select empno/2 from emp;
- as 关键字
使用AS给查询结果取别名(AS也可以省略):
--别名 select 字段1 as 别名,字段2 as 别名, 字段3 别名.. from 表名 别名;
--别名如果是英文默认大写
select distinct 123*456 as sum,12*34 as 哈哈 from emp;
--''代表字符串 ""原样输出 结果字段名和值原样字符串输出
--如果别名为英文默认大写,别名为中文为原样。如果想要原样使用英文或者中文加空格则需用""引用
select '哈哈' as "sum" from emp;
- 字符串的拼接使用||
select distinct 'a-'||'b-' "EE" from emp;
select '尚学堂'||ename as "学生姓名" from emp;
- 虚拟表:dual
Oracle提供的最小的表,不论进行何种操作(不要删除记录),它都只有一条记录——'X'。是sys用户下的一张内部表,所有用户都可以使用DUAL名称访问,无论什么时候这个表总是存在。例如:执行一个查看当前日期的语句 select sysdate from dual
可以用来查看用户,调用函数,获取序列值,计算器,查看日期等
--虚表: oracle中不是真是存在的表,其中没有任何数据 dual
select sysdate from dual;
- null遇到数字参与运算的结果为 null,遇到字符串为空串
select '2'||null from dual;
select 1+null from dual;
2、查询行:
- where 条件过滤,执行顺序 from---where---select
--select *|字段1,字段2.. from 表名 where 行过滤条件;
--求20部门所有员工信息
select * from emp where deptno = 20;
- 比较运算关系
-- = 、 >、 <、 >=、 <=、 !=、 <>、
--所有员工中薪资>800
select * from emp where sal >800;
不等于的几种表达方式 not != <>
--求除了SMITH以外的所有员工信息
select * from emp where ename != 'SMITH';
select * from emp where ename <> 'SMITH';
select * from emp where not ename = 'SMITH';
- 逻辑运算
--and 、or、 not , between and
select * from emp where sal>=1500 and sal <=2500;
select * from emp where sal between 1500 and 2500--是>= <=
- null判断使用is
--求奖金为null的人
select * from emp where comm is null;
--求有奖金的人
select * from emp where comm is not null;
select * from emp where not comm is null;
--select * from emp where comm not is null; 错误事例
- 集合操作
--Union并集Union All并集(不去重)、Intersect(交集)、Minus(差集)
select * from emp where sal>1500
union
select * from emp where deptno =30;
- 模糊查询
--模糊查询 %任意个任意字符 _任意一个字符
select * from emp where ename like 'A%';
--找出名字带有%的,使用escape指定转义字符
select * from emp where ename like 'A%%' escape(A);
- 事务
在数据库中事务是工作的逻辑单元,一个事务是由一个或多个完成一组的相关行为的SQL语句组成,通过事务机制确保这一组SQL语句所作的操作要么都成功执行,完成整个工作单元操作,要么一个也不执行。
--提交事务
commit;
--回滚事务
rollback;
- in关键字
in相当于使用or的多个等值,定值集合 ,如果存在 子查询,确保 类型相同、字 段数为1,如果记录多,效率不高,用于 一些 少量定值判断上
--in 匹配后面结果集中的任意一个数据,无法做区间判断
--查询部门编号为10,20的员工姓名
select deptno,ename from emp where deptno in(10,20);
select * from salgrade;
--查询 销售部(SALES) 中 工资大于1500的员工信息
--查询的数据:*
--来源:emp
--条件: 销售部(SALES) sal>1500
select * from emp where sal>1500 and
deptno in (select deptno from dept where dname='SALES');
- exists
指定一个子查询,检测行的存在。遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中。
--exists 存在即保留 存在即合法
select * from emp where exists (select * from dept where dname = 'a');
select * from emp where exists (select * from emp);
--查询销售和财务所有员工信息
select *
from emp
where exists (select *
from dept
where dname in ('SALES', 'ACCOUNTING')
AND emp.deptno = dept.deptno);
--查询10编号部门所有员工信息
select *
from emp
where exists (select deptno
from dept
where deptno = 10
and dept.deptno = emp.deptno);
- order排序
--order by desc 降序 asc升序
--select * from 表名 where 行过滤条件 order by 排序字段; --默认升序
--from--where--select--order by
--10编号部门根据薪资排序
select * from emp where deptno=10 order by sal asc;
--根据奖金排序
select * from emp order by comm desc nulls last;
函数:
函数分为系统内置函数 自定义函数(后期学习的 plsql中定义);了解系统内置函数(方法),重点掌握 to_date 、 to_char (字符和日期的转换)
根据函数的返回结果,我们将函数分为单行函数和多行函数
单行函数:一条记录返回一个结果
多行函数 组函数 聚合函数 (重点) :多条记录 返回一个结果 (重点)
ORACLE中规定,组函数嵌套只能嵌两层。其实多层嵌套并没有实际的用途,因此ORACLE没有提供组函数的多层嵌套。但是,单行函数是可以多层嵌套的。
3、单行函数
- 日期函数
--当前日期
select sysdate from dual;
select current_date from dual;
--日期计算,天数加减
select hiredate,hiredate +3 from emp;
--月份加减
select add_months(hiredate,3)from emp;
--月份最后一天
select last_day(sysdate) from dual;
--months between(date1,date2) date1要在date2之后,否则为负数
select months_between(sysdate,hiredate) from emp;
--下个周二
select next_day(sysdate,'星期二') from dual;
--to_date(c,m) 字符串以指定格式转换为日期
select to_date('2018-05-15 23:23:34','yyyy/mm/dd hh24:mi:ss')from dual;
- 其它函数
--decode(字段,字段值1,值2,字段值2,值3..,默认值)根据某个字段进行判断
--打印所用的部门名称,如果10,添加一个伪列,显示对应部门的大写名称
select deptno,decode(deptno,10,'十',20,'二十',30,'三十','其他') from dept;
--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;
4、组函数
- count
--计算员工数 count(*|1|字段)
--count(*|1)评估Count()中的表达式是否为NULL,如果为NULL则不计数,而非NULL则会计数
select * from emp;
select count(comm) from emp;
select count(*) from emp;
select count(1) from emp;
select count('anything') from emp;
select count('comm') from emp;
注意:
评估Count()中的表达式是否为NULL,如果为NULL则不计数,而非NULL则会计数,只要()中指定非null表达式,结果没有任何区别
对于Count(字段)来说,同样适用于上面规则,评估列中每一行的值是否为NULL,如果为NULL则不计数,不为NULL则计数。因此Count(列)会计算列或这列的组合不为空的计数。
摘:count(1)和count(*)的区别
count(1)和count(*)的作用:
都是检索表中所有记录行的数目,不论其是否包含null值。
count(1)比count(*)效率更高
count(字段)与count(1)和count(*)的区别:
count(字段)的作用是检索表中的这个字段的非空行数,不统计这个字段值为null的记录
参考:[https://www.cnblogs.com/zyy1688/p/10436816.html]
- max min 求最大值、最小值
--查询薪资最高的员工姓名和薪资
select max(sal) from emp;
select ename,sal from emp where sal=(select max(sal)from emp);
- avg求平均
--avg
--求20部门平均薪资
select avg(sal) from emp where deptno =20
- sum求和
--求一个公司这个月的薪资开销
select sum(sal) from emp;
- 分组:group by 将符合条件的记录 进一步的分组
过滤组:having , 过滤组信息 ,表达式 同 where 一致
--分组 group by 分组字段
--select *|字段.. from 表名 where 行过滤条件 group by 分组字段 having 组过滤信息 order by 排序字段;
--执行流程:from--where--group by--having--select--order by
--select ename en from emp where en='SMITH';
-- 找出20部门和30部门的最高工资
select max(sal) from emp group by deptno having deptno in(20,30)
-- 求出平均工资高于2000的部门编号和平均工资
select deptno,avg(sal) from emp group by deptno having avg(sal)>2000;
--查询 最低平均工资的部门编号
--先查出最低的部门平均薪资
select min(avg(sal)) from emp group by deptno;
select deptno
from emp
group by deptno
having avg(sal) = (select min(avg(sal)) from emp group by deptno);
注意:
select 出现分组函数,就不能使用 非分组信息,可以使用 group by 字段
group by字段 可以不出现 select 中 ,反之select 除组函数外的,其他字段必 须出现在group by 中
过滤组 having : where :过滤行记录,不能使用组函数, having:过滤组 可以使用组函数
- 说明
组信息 与单条记录不能同时查询
组函数 不能用在 where中,能使用的地方 select having
null 不参与运算
- 注意
组函数仅在选择列表和Having子句中有效
出现组函数,select 只能有组函数或分组字段
参考信息:百度百科