数据库(Database)是按照数据结构来组织、存储和管理数据的仓库
Oracle,MySQL,DB2,SQLserver等
数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称DBMS
大部分DBMS提供数据定义语言DDL(Data Definition Language)和数据操作语言DML,供用户定义数据库的模式结构与权限约束,实现对数据的追加、删除等操作。
分类
根据存储模型可将数据库划分为关系型数据库和非关系型数据库。关系型数据库,是建立在关系模型基 础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。简单来说,关系模型指的就是二维表格模型,而一个关系型数据库就是由二维表及其之间的联系所组成的一个数据组织。
SQL(Structured Query Language)结构化查询语言
可简单划分为三部分:
分类 | 命令 |
---|---|
DDL 数据定义语言 | create:创建;drop:删除;alter:修改;rename: 重命名; truncate:截断 |
DML 数据管理语言 | insert:插入;delete:删除;update:更新;select:查询 |
DCL 数据库控制语言 | grant:授权;revoke:回收权利;commit:提交事务;rollback:回滚事务 |
表是逻辑表(概念表),不是物理表
块(8k) —>区(连续块)–>段(连续区) -->表(多个段) ,数据段不全是表,表一定是数据段。还有其他段: 如索引段
表由表名、字段(名称+类型+约束)、记录 组成。
-- 表名tb_student
create table tb_student(
-- 字段
id number(4) ,
name varchar(20),
course varchar(20),
score number(5,2)
);
三范式
在设计数据库时,存在行业的标准,这个标准也称为条件,即范式 Normal Form。一般遵循三个条件即 可,也就是”三范式”(3NF)。
简而言之,最终的目的避免数据重复冗余,1NF–>列不可再分最小原子(避免重复);2NF–>主键依赖(确定唯一);3NF–>消除传递依赖(建立主外键关联拆分表);
SELECT [DISTINCT] {
*,column alias,..}
FROM table alias
WHERE 条件表达式
GROUP BY 分组
HAVING 分组条件
ORDER BY 排序字段列表 [asc|desc]
执行顺序
from --> where --> group --> having --> select --> order by
查询特定字段
-- 检索单个列
select ename from emp; -- 查询雇员姓名
-- 检索多个列
select deptno,dname,loc from dept; -- 查询部门表的deptno,dname, loc 字段的数据。
*
代表通配符,能够查询表中所有字段
-- 检索所有字段
select * from emp; -- 查询emp表所有字段
使用distinct去重,确保查询结果的唯一性
select distinct deptno from emp; -- 去重
注意:如果有多条重复的数据,使用distinct可实现去重,如果只有单字段重复,则无法实现多字段去重,只能实现单字段。
distinct只是实现查询去重,对原数据表不做改变
如果要实现对表数据进行去重
-- 通过对rowid取反,删除多余重复的数据
delete from 表名
where rowid not in
-- 将重复数据通过分组合并在一起,取最小的rowid
(select min(rowid) from 表名 group by 分组条件);
使用别名便于操作识别 、隐藏底层信息。存在字段别名和表别名
select ename as "雇员 姓名" from emp;
select ename "雇员姓名" from emp;
select ename 雇员姓名 from emp;
select ename as 雇员姓名 from emp;
select ename as " Ename" from emp;
""
:原样输出,可以存在 空格与区分大小写使用单引号''
来区分字符串,而非双引号"",字符串拼接使用 ||
select 'my' from emp;sql
select ename||'a'||'-->' info from emp;
不存在的列,构建虚拟的列,每个数据库里面都存在虚表dual
-- 1*2,cmj就是伪列
select empno, 1*2 as count,'cmj' as name,deptno from emp;
null 遇到数字参与运算的结果为 null,遇到字符串为空串
select 1+null from dual; -- 结果为null
select '1'||null from dual; -- 结果为1
查询非空数据
-- 通过is not null 来筛选非空数据
select * from emp where comm is not null;
去空
通过nvl(去空值,代替空的值)替换空值达到去空效果
-- 如果comm的值为空,则使用0代替
select nvl(comm,0) from emp;
= 、 >、 <、 >=、 <=、 !=、 <>、 between and
-- 查询EMP表显示工资超过2850的雇员姓名和工资。
select ename,sal from emp where sal > 2850;
-- 查询EMP表显示工资不在1500~2850之间的所有雇员及工资。
select * from emp where sal between 1500 and 2850
and、 or、 not
-- 查询 岗位 为 CLERK 且部门编号为 20的员工名称 部门编号,工资
select * from emp where job='CLERK' and deptno=20
-- 查询 岗位 为 CLERK 或部门编号为 20的员工名称 部门编号,工资
select * from emp where job='CLERK' or deptno=20
-- 查询 岗位 不是 CLERK 员工名称 部门编号,工资
select * from emp where not job = 'CLERK'
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;
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;
通配符:
%
:零个及以上(任意个数的)的字符_
:一个字符-- 查询员工姓名中包含字符A的员工信息
select * from emp where ename like '%A%';
-- 查询员工姓名中包含第二个A的员工名称信息
select * from emp where ename like '_A%';
-- 查询员工姓名中包含字符%的员工名称 岗位 工资 部门编号
select ename,job,sal,deptno from emp where ename like '%a%%' escape('a');
in相当于使用or的多个等值,定值集合 ,如果存在 子查询,确保 类型相同、字段数为1,如果记录多,效 率不高,用于 一些 少量定值判断上
--10或30部门的雇员信息
select * from emp where deptno in(10,30);
exists条件为true,存在记录则返回结果,后续不再继续 比较查询,与查询的字段无关,与记录有关
-- exists :条件为true,存在记录,则返回结果,后续不再继续 ,与字段无关,与记录有关
-- exists 难点: 外层结果集 内层结果集 关系列(没有关系列 true)
select *
from emp
where exists
(select deptno,dname from dept where dname in ('SALES', 'AC