数据库管理系统
关系型数据库 Relational
外键管理,数据存在数据库里
分布式文件存储型数据库 Document
key-value存储系统 key-value
后缀 .DBF
字符类型 三个: 定长 , 不定长 char varchar2 long
数字类型 number
日期类型:date
1.表的操作
- 创建表
- 赋值表
2.约束管理
not null 非空
unique 唯一字段 , 可以有多个unique,只能有一个primay key
primary key 主键 (有约束名称) 表中唯一主键
foreigm key 外键
check
alter table 表名 drop constraint 主键名 删除约束
主键约束和外键约束
not null 表级约束 ,行级约束
2.1外键
子表和父表示相互依存的关系,相互影响
主-从关系
1.先创建父表在创建子表
2.删除外键表先删除子表在删除父表
3.先insert父表,在insert子表
4.先drop子表,在drop父表(父表先存在,子表先灭亡)
子表添加insert 的数据受父表的影响,父表没有的外键子表不能加
有外键的表是子表
添加外键(表外) alter table t_suduent add constraint fk_cid foreign key(cid) references t_class(cid)
3.函数
- to_char
转换为给定格式的字符串
select to_char(sysdate,‘yyyy-mm-dd’) from dual ;
select to_char(12345,‘99.999’) from dual ;
– 数据转换为自定字符串
select to_char(sysdate,‘yyyy-mm-dd hh24:mi:ss’) from dual ; – 系统日期转换
错误:select to_char(2021-10-10,‘yyyy-mm-dd’) from dual ; – 无法数字转换为字符
select to_char(12345,’$99,999’) from dual ; – 数字转换为规定格式
select to_number(‘888’,‘999’) from dual ; --字符转换为数字
select to_date(‘2021-10-10’,‘yyyy-mm-dd’) from dual ; --自定义时间转换
3.2数字处理数据函数
1.ceil:往上取整,于小数位大小无关
2.floor:往下取整,与小数位大小无关
3.mod:求余
4.round :四舍五入
5.trunc(m,n) : 截取
select ceil(123.123) from dual ; --取大于、等于数值number的最小整数 向上取整
select floor(123.523) from dual ; --取小于、等于数值number的最大整数 向下取整
select mod(123,23) from dual ; --求余,不四舍五入
select round(123.123) from dual ; – 进行四舍五入
select trunc(123.123 , 0) from dual ; – 给定数值截取,从小数开始 不四舍五入
3.3升序和降序 sal , desc
select * from emp order by empno ; – 排序,默认升序排序 sal 升序 , desc 降序排序
select * from emp order by empno desc ;
– 首先sal升序排序,如果sal相同,然后再以mepno降序排序,
select * from emp order by sal,empno desc ;
select * from emp where deptno in(20,30) order by sal,empno desc ;
3.4聚合函数
1.AVG
2.count
3.max
4.min
5.sum
– 所有员工的平均工资
select avg(sal) from emp ;
–平均奖金 , 人数总数,有null就不算进去总数。
select avg(comm) from emp ;
– 奖金总和
select sum(sal) from emp ;
– 工资总和
select sum(comm) from emp ;
– 最大数,最小数
select max(sal),min(comm) from emp ;
–计算不为null所有记录 count
select count(sal) from emp;
select count(comm) from emp;
–查询有多少个员工
select count(empno) from emp ; --还要查看有多少个主键
select count(*) from emp ;
select count(1) from emp ;
4.表的查询
伪表 :dual
伪列: rownum rowid
理解:一个完整的查询语句 select , from ,where(left join) , group by , having , order by ;
4.1基本查询:select 字段名 from 表名
select empo,ename,job,mar form emp ; – 按字段查询 按列查询
select * from emp ; – 全部查询
4.2条件查询 where ,,,
select * from emp where sal>2000 ;
select * form emp where sal > 2000 and deptno == 20 ;
4.3逻辑运算
like
– 查询姓名为A开头的员工信息 like
select * from emp where ename like ‘A%’ ; – %代表n个任意字符
–查询姓名为S结尾的员工信息
select * from emo wgere ebane like ‘%S’ ;
–查询姓名包含字符为A的员工信息
select * from emp where ename like ‘%A%’ ;
–查询姓名第二个字符为A的员工信息
select * from emp where ename like ‘_A%’ ; – _为任意一个字符
is null , is not null
– 查询奖金是0 的员工信息
select * form emp where comm = 0 or comm is null ;
– 查询奖金不为0 的员工信息
select * from emp where comm > 0 or comm is not null ;
select * from emp where comm != 0 or comm is not null ;
4.4|| 拼接
连接操作符
4.5集合操作符 union , union all
- union
取得两个结果的并集(拼接),自动去掉重复是行
2.union all
与union 相似, 但不会去掉重复的行
-
intersect 交集
-
mins差集
4.6分组查询 group by , order by
– select 聚合函数 , group by 后出现的表达式
– having 聚合函数 , group by 后出现的表达式
– order by 聚合函数 , group by 后出现的表达式
– 分组查询 ————、
– 查询每个部门的最高工资 group by
select max(sal) from emp ; – 先分组在查询
select deptno 部门编号, max(sal) from emp group by deptno ;
–查询每个部门的平均工资
select deptno 部门编号,avg(sal) from emp group by deptno ;
– 查询每个部门的平均工资大2000的部门编号以及平均工资 having 过滤 对之前的数据进行过滤
– group by – having – order by 顺序不能改变
select deptno,avg(sal) from emp group by deptno having avg(sal) > 2000 order by deptno; – 完整的语句
– 自定义理解
select deptno 部门,max(sal) from emp group by deptno,job order by deptno; – 先分组,后求最大值
– 显示员工最高工资超过3000的部门的id 及其员工最高工资,并按照工资降序排序
select deptno, max(sal) from emp group by deptno having max(sal) > 3000 order by max(sal) ;
链接查询 left join , right join , inner join , cross join
左链接,右链接 , 内连接 ,交叉连接 ,
– select 要查的列名, from 表1 left join 表2 on 连接条件 , 左链接
select * from student left join couse on class.cid = student.cid ;
– 右链接
– 左链接和右链接 区别 ; 左链接包含了左表所有的行null , 右链接包含了右表所有的行
select * from student right join couse on class.cid = student.cid ;
–
–内链接 inner join
select ename,job,loc from emp inner join dept on emp.deptno = dept.deptno ;
–交叉链接 (笛卡尔积)class join
select * from student cross join course
select * from student,course
子查询(嵌套查询)
两种嵌套查询方式:
1.可以使用where and 条件选择总表
2.使用链接链接两个表
自己理解:left join 之类的连接不能和where 一起出现
– 查看员工的编号 ,姓名 , 工资, 部门 , 以及工资登记
select empno,ename,sal,dname,grade from emp left join dept on emp.deptno = dept.deptno left join salgrade on sal between losal and hisal ;
–查看员工编号,姓名以及领导的姓名
select * from emp e left join emp ee on e.mgr = ee.empno ; --取别名
– 子查询(嵌套查询),在查询里面在查询
select * from emp where sal = (select max(sal) from emp) ;
–列出与scott 从事相同工作的所有员工及部门名称
select job from emp where ename = ‘SCOTT’ ;
select e.* from emp e where job = (select job emp where ename = ‘SCOTT’);
–显示各个部门的部门编号,部门名称,部门地址员工和
分页显示 rownum , rowid
select * from (select rownum rn from (select empno,ename,job from emp ) e where rownum< 10)) where rn > 5 ; – 显示的数据是 第5 到 第10 的数据
–原理改写成公式如下
select * from (select rownum rn from (select empno,ename,job from emp ) e where rownum< pagesize*pagno)) where rn > (pageno-1)*pagesize; – 显示的数据是 第5 到 第10 的数据
–pagesize每页显示多少条数据 , pageno 第几页数据