Oracle数据库入门 基础知识day04 火推阳光笔记
来源:互联网 发布:淘宝托管真的有用吗 编辑:程序博客网 时间:2024/05/21 07:01
作业:
1. 显示员工的last_name和对应的部门名称, 要求, 把不存在部门编号的员工也给查询到 :
题1的前置条件:
公司的业务需要 , 把id为25的员工 分配到一个新的项目组中, 部门名称待定!
update s_emp set dept_id=null where id=25;
commit;
select last_name,name from s_emp e,s_dept d where e.dept_id=d.id(+);
2. 显示每个部门的名称 和 对应的地区的名字 , 没有地区编号的部门也要显示
1. s_dept表中的 name
2. s_region表中的name
题2的前置条件:
公司业务需要, 增加了新的部门, 但是还没确定办公地点 !
insert into s_dept values(250,'zhiqiang1',null);
insert into s_dept values(251,'zhiqiang2',null);
commit;
select d.id, d.name,r.name from s_dept d,s_region r where d.region_id=r.id(+);
3. 显示每个员工的工资 和 对应的工资级别 , 超出工资级别范围的 也要显示出来
工资表: salgrade
老板觉得自己工资太低了, 都不够每天泡个脚的 , 给自己涨了工资 涨到了66666,
给自己的小秘书涨到了8888
update s_emp set salary=66666 where id=1;
update s_emp set salary=8888 where id=24;
commit;
在进行外连接时, 如果进行了between (区间)进行比较 , 区间的两边都要添加(+)
between losal(+) and hisal(+);
select salary,grade from s_emp,salgrade where salary between losal(+) and hisal(+);
组函数
特点:
对于一组数据处理完毕后, 只返回一个结果 .
要求在查询时, 字段产生的结果要一一对应 !
组函数对于null的处理是忽略
常用的组函数:
count : 统计数据的数量
max : 统计一组数据中的最大值
min : 统计一组数据中的最小值
sum : 统计一组数据的和
avg : 计算一组数据的平均值
1. 求出s_emp表格中存在几个员工?
select count(*) from s_emp;
2. 求出s_emp表中最高的工资
select max(salary) from s_emp;
3. 求出s_emp表格中的最低工资
select min(salary) from s_emp;
4. 求出员工的工资总和
select sum(salary) from s_emp;
5. 排重后再使用组函数求和
select sum(distinct salary) from s_emp;
6. 求出所有员工的工资平均值
select avg(salary) from s_emp;
7. 求出所有员工的提成的平均值
select avg(commission_pct) from s_emp; //得出的结果不对 .
select sum(commission_pct)/count(*) from s_emp;
软件连接失败network adapter
服务未启动
OracleXETNSListener服务未启动的原因:
1. 防火墙 / 杀毒软件 阻止了监听服务器的启动
2. 服务的配置文件产生错误(安装数据库以后, 更改了计算机名称)
解决方案:
重装
group by having分组子句
格式: ...group by 分组标准 having 组中的数据过滤条件
限制: 在带有分组的查询语句中 ,select后跟随的字段, 要么是分组标准字段,要么时经过组函数处理的字段 !
select 语句 完整格式:
select 字段 from 表名 [where 条件] [group by 分组标准 [having 过滤条件]] [order by 排序字段 排序规则];
select 子句执行顺序:
from子句-->where子句-->group by-->having-->select-->order by
where与having条件的区别:
where 对于当前查询的表格中的所有数据进行过滤 .
having: 对于分组以后的数据进行过滤
where过滤在having之前
- 按照部门的编号进行员工的分组, 统计每个部门的人数
select dept_id,count(*) from s_emp group by dept_id;
- 按照部门的编号进行员工的分组, 统计每个部门的人数 ,要求 ,部门人数低于3的不显示此部门
select dept_id,count(*) from s_emp group by dept_id having count(*)>2;
- 按照部门编号分组,显示部门的编号, 平均工资,为了公司的数据看起来漂亮, 只显示平均工资大于1200的部门 .
select dept_id,avg(salary) from s_emp group by dept_id having avg(salary)>1200;
- 按照部门编号分组 ,显示部门的人数, 部门的编号 部门的名字
select count(*),dept_id,min(name) from s_emp e,s_dept d where e.dept_id=d.id group by dept_id;
count(*)--存在12个count
dept_id--存在12个dept_id
max(name) -- 存在12个name
子查询
概念: 把一个select语句的结果 , 当作另一个select语句的一部分 .
每一个select语句 就类似存在于内存中的一个表 . 而子查询就是查询一个已经存在的结果集 !
例如: 之前我们查询员工信息 :
select id,last_name,salary from s_emp;//生成了一个结果集
基于上面的结果, 查询其中id为25的员工
select * from (select id,last_name,salary from s_emp) where id=25;
子查询的语句 , 可以出现的位置:
1. where条件之后
2. having条件之后
3. from子句后, 替换表名.
应用到where条件之后 :
把一个select语句的结果, 当作了另一个select语句的where条件
需求: 查询部门id最大的员工信息
1. 先查询出最大的部门id
select max(dept_id) from s_emp;
2. 根据上面查询的部门id,查询部门的人员信息
select id,salary,last_name from s_emp where dept_id=(select max(dept_id) from s_emp);
需求: 查询公司所有的领导
1. 先查询到公司所有的领导id(s_emp的mananger_id字段),并去重
select distinct manager_id from s_emp where manager_id is not null;
2. 根据上面查询到的领导的id , 通过in去匹配公司所有的领导
select id,last_name,salary from s_emp where id in(select distinct manager_id from s_emp where manager_id is not null);
需求: 查询公司所有的普通员工
1. 先查询到公司所有的领导id(s_emp的mananger_id字段),并去重
select distinct manager_id from s_emp where manager_id is not null;
2. 根据上面查询到的领导的id , 通过not in去匹配公司所有的普通员工
select id,last_name,salary from s_emp where id not in(select distinct manager_id from s_emp where manager_id is not null);
应用到having之后
把一个select语句的结果, 当作了另一个select语句的分组 过滤条件
需求:找出部门的平均薪资比32号部门的平均薪资高的部门 ,显示部门的编号与平均薪资
1. 先查找出32号部门的平均薪资
select avg(salary) from s_emp where dept_id=32;
2. 根据部门进行分组, 计算部门的平均薪资, 分组的过滤条件为, 平均薪资大于上面的查询结果
select dept_id,avg(salary) from s_emp group by dept_id having avg(salary)>(select avg(salary) from s_emp where dept_id=32);
应用到from之后
把一个select查询语句的结果, 当作一个内容中的二维表
需求: 查询所有的员工的id,last_name,salary, 条件为 薪资大于1200
select id,last_name,salary from s_emp where salary>1200;
从上面的结果集中 查询所有的id,条件为id大于15
select id from (select id,last_name,salary from s_emp where salary>1200) where id>15;
DDL(数据定义语句)
创建一个表格
数据类型:
number : 数字
varchar2: 变长字符串
date : 日期类型
创建表格的格式:
create table 表名(
字段名1 数据类型(长度),
字段名2 数据类型(长度),
...
字段名n 数据类型(长度)
);
练习:
创建一个表格,
表名为person
字段为:
- id 长度为5的number类型
- name 长度为10的varchar2类型
- age 长度为3的number类型
create table person(
id number(5),
name varchar2(10),
age number(3)
);
练习2.
创建一个表格,
表名为dsj13_user
字段为:
- id 长度为5的number类型
- username 长度为20的varchar2类型
- password 长度为20的varchar2类型
create table dsj13_user(id number(5),username varchar2(20),password varchar2(20));
---------------------------------------------------------------
创建完毕, 使用desc查看一下表结构
删除一个表格
格式: drop table 表名;
练习:
删除person表
drop table person;
删除dsj13_user表
drop table dsj13_user;
修改表的结构(了解)
很浪费系统的性能 ,
1. 将表中的数据 进行备份
2. 将表中的数据删除, 并将结构修改
3. 将备份的数据 插入
- 删除表中的字段
格式: alter table 表名 drop column 字段名称;
需求: 删除person表格中的name字段
alter table person drop column name;
- 添加表中的字段
格式: alter table 表名 add 字段名 字段类型(长度);
需求: 向person表中 添加一个name字段 ,类型为varchar2长度为10
alter table person add name varchar2(10);
DML 数据操作语言
所有的dml操作. 都需要结束事务 !
事务: 将一系列的sql语句 看作一个业务, 统一处理 , 要么一起成功, 要么一起回滚!
银行金融系统
志强 1020000
陈凯 6
----------------
5块
1. 将志强余额减5
2. 凯凯的余额加5
3. 提交
转账业务
mysql
-----------
提交事务
commit;
回退事务
rollback;
insert语句 - 向数据库插入数据
1. 全字段添加
格式: insert into 表名 values(数据列表);
数据列表 : 表示的是一个数据组, 数据的顺序 按照创建表格时的字段顺序传入 ,不同字段的值使用英文逗号隔开
例如: 表格的字段创建顺序如下:
create table person(
id number(5),
name varchar2(100),
age number(8)
);
我们在对这个表格进行全字段的添加数据时:
insert into person values(id,name,age);
练习:
- 向数据库中的person表格插入如下数据:
1. 编号:10,姓名:张三,年龄:18
insert into person values(10,'张三',18);
2. 编号:11,姓名:李四,年龄:28
insert into person values(11,'李四',28);
3. 编号:12,姓名:王二,年龄:38
insert into person values(12,'王二',38);
4. 编号:13,姓名:麻子,年龄:8
insert into person values(13,'麻子',8);
commit;
2. 选择字段添加
格式: insert into 表名(字段列表) values(数据列表);
-- 字段列表可以任意排列 , 多个字段名之间使用英文逗号隔开 , 数据列表的顺序, 参照字段列表
练习:
- 向数据库中的person表格插入如下数据:
1. 编号:20,姓名:待定,年龄:10
insert into person(age,id) values(10,20);
2. 编号:21,姓名:待定,年龄:20
insert into person(age,id) values(20,21);
3. 编号:22,姓名:待定,年龄:30
insert into person(age,id) values(30,22);
4. 编号:23,姓名:待定,年龄:40
insert into person(age,id) values(40,23);
commit;
1. 显示员工的last_name和对应的部门名称, 要求, 把不存在部门编号的员工也给查询到 :
题1的前置条件:
公司的业务需要 , 把id为25的员工 分配到一个新的项目组中, 部门名称待定!
update s_emp set dept_id=null where id=25;
commit;
select last_name,name from s_emp e,s_dept d where e.dept_id=d.id(+);
2. 显示每个部门的名称 和 对应的地区的名字 , 没有地区编号的部门也要显示
1. s_dept表中的 name
2. s_region表中的name
题2的前置条件:
公司业务需要, 增加了新的部门, 但是还没确定办公地点 !
insert into s_dept values(250,'zhiqiang1',null);
insert into s_dept values(251,'zhiqiang2',null);
commit;
select d.id, d.name,r.name from s_dept d,s_region r where d.region_id=r.id(+);
3. 显示每个员工的工资 和 对应的工资级别 , 超出工资级别范围的 也要显示出来
工资表: salgrade
老板觉得自己工资太低了, 都不够每天泡个脚的 , 给自己涨了工资 涨到了66666,
给自己的小秘书涨到了8888
update s_emp set salary=66666 where id=1;
update s_emp set salary=8888 where id=24;
commit;
在进行外连接时, 如果进行了between (区间)进行比较 , 区间的两边都要添加(+)
between losal(+) and hisal(+);
select salary,grade from s_emp,salgrade where salary between losal(+) and hisal(+);
组函数
特点:
对于一组数据处理完毕后, 只返回一个结果 .
要求在查询时, 字段产生的结果要一一对应 !
组函数对于null的处理是忽略
常用的组函数:
count : 统计数据的数量
max : 统计一组数据中的最大值
min : 统计一组数据中的最小值
sum : 统计一组数据的和
avg : 计算一组数据的平均值
1. 求出s_emp表格中存在几个员工?
select count(*) from s_emp;
2. 求出s_emp表中最高的工资
select max(salary) from s_emp;
3. 求出s_emp表格中的最低工资
select min(salary) from s_emp;
4. 求出员工的工资总和
select sum(salary) from s_emp;
5. 排重后再使用组函数求和
select sum(distinct salary) from s_emp;
6. 求出所有员工的工资平均值
select avg(salary) from s_emp;
7. 求出所有员工的提成的平均值
select avg(commission_pct) from s_emp; //得出的结果不对 .
select sum(commission_pct)/count(*) from s_emp;
软件连接失败network adapter
服务未启动
OracleXETNSListener服务未启动的原因:
1. 防火墙 / 杀毒软件 阻止了监听服务器的启动
2. 服务的配置文件产生错误(安装数据库以后, 更改了计算机名称)
解决方案:
重装
group by having分组子句
格式: ...group by 分组标准 having 组中的数据过滤条件
限制: 在带有分组的查询语句中 ,select后跟随的字段, 要么是分组标准字段,要么时经过组函数处理的字段 !
select 语句 完整格式:
select 字段 from 表名 [where 条件] [group by 分组标准 [having 过滤条件]] [order by 排序字段 排序规则];
select 子句执行顺序:
from子句-->where子句-->group by-->having-->select-->order by
where与having条件的区别:
where 对于当前查询的表格中的所有数据进行过滤 .
having: 对于分组以后的数据进行过滤
where过滤在having之前
- 按照部门的编号进行员工的分组, 统计每个部门的人数
select dept_id,count(*) from s_emp group by dept_id;
- 按照部门的编号进行员工的分组, 统计每个部门的人数 ,要求 ,部门人数低于3的不显示此部门
select dept_id,count(*) from s_emp group by dept_id having count(*)>2;
- 按照部门编号分组,显示部门的编号, 平均工资,为了公司的数据看起来漂亮, 只显示平均工资大于1200的部门 .
select dept_id,avg(salary) from s_emp group by dept_id having avg(salary)>1200;
- 按照部门编号分组 ,显示部门的人数, 部门的编号 部门的名字
select count(*),dept_id,min(name) from s_emp e,s_dept d where e.dept_id=d.id group by dept_id;
count(*)--存在12个count
dept_id--存在12个dept_id
max(name) -- 存在12个name
子查询
概念: 把一个select语句的结果 , 当作另一个select语句的一部分 .
每一个select语句 就类似存在于内存中的一个表 . 而子查询就是查询一个已经存在的结果集 !
例如: 之前我们查询员工信息 :
select id,last_name,salary from s_emp;//生成了一个结果集
基于上面的结果, 查询其中id为25的员工
select * from (select id,last_name,salary from s_emp) where id=25;
子查询的语句 , 可以出现的位置:
1. where条件之后
2. having条件之后
3. from子句后, 替换表名.
应用到where条件之后 :
把一个select语句的结果, 当作了另一个select语句的where条件
需求: 查询部门id最大的员工信息
1. 先查询出最大的部门id
select max(dept_id) from s_emp;
2. 根据上面查询的部门id,查询部门的人员信息
select id,salary,last_name from s_emp where dept_id=(select max(dept_id) from s_emp);
需求: 查询公司所有的领导
1. 先查询到公司所有的领导id(s_emp的mananger_id字段),并去重
select distinct manager_id from s_emp where manager_id is not null;
2. 根据上面查询到的领导的id , 通过in去匹配公司所有的领导
select id,last_name,salary from s_emp where id in(select distinct manager_id from s_emp where manager_id is not null);
需求: 查询公司所有的普通员工
1. 先查询到公司所有的领导id(s_emp的mananger_id字段),并去重
select distinct manager_id from s_emp where manager_id is not null;
2. 根据上面查询到的领导的id , 通过not in去匹配公司所有的普通员工
select id,last_name,salary from s_emp where id not in(select distinct manager_id from s_emp where manager_id is not null);
应用到having之后
把一个select语句的结果, 当作了另一个select语句的分组 过滤条件
需求:找出部门的平均薪资比32号部门的平均薪资高的部门 ,显示部门的编号与平均薪资
1. 先查找出32号部门的平均薪资
select avg(salary) from s_emp where dept_id=32;
2. 根据部门进行分组, 计算部门的平均薪资, 分组的过滤条件为, 平均薪资大于上面的查询结果
select dept_id,avg(salary) from s_emp group by dept_id having avg(salary)>(select avg(salary) from s_emp where dept_id=32);
应用到from之后
把一个select查询语句的结果, 当作一个内容中的二维表
需求: 查询所有的员工的id,last_name,salary, 条件为 薪资大于1200
select id,last_name,salary from s_emp where salary>1200;
从上面的结果集中 查询所有的id,条件为id大于15
select id from (select id,last_name,salary from s_emp where salary>1200) where id>15;
DDL(数据定义语句)
创建一个表格
数据类型:
number : 数字
varchar2: 变长字符串
date : 日期类型
创建表格的格式:
create table 表名(
字段名1 数据类型(长度),
字段名2 数据类型(长度),
...
字段名n 数据类型(长度)
);
练习:
创建一个表格,
表名为person
字段为:
- id 长度为5的number类型
- name 长度为10的varchar2类型
- age 长度为3的number类型
create table person(
id number(5),
name varchar2(10),
age number(3)
);
练习2.
创建一个表格,
表名为dsj13_user
字段为:
- id 长度为5的number类型
- username 长度为20的varchar2类型
- password 长度为20的varchar2类型
create table dsj13_user(id number(5),username varchar2(20),password varchar2(20));
---------------------------------------------------------------
创建完毕, 使用desc查看一下表结构
删除一个表格
格式: drop table 表名;
练习:
删除person表
drop table person;
删除dsj13_user表
drop table dsj13_user;
修改表的结构(了解)
很浪费系统的性能 ,
1. 将表中的数据 进行备份
2. 将表中的数据删除, 并将结构修改
3. 将备份的数据 插入
- 删除表中的字段
格式: alter table 表名 drop column 字段名称;
需求: 删除person表格中的name字段
alter table person drop column name;
- 添加表中的字段
格式: alter table 表名 add 字段名 字段类型(长度);
需求: 向person表中 添加一个name字段 ,类型为varchar2长度为10
alter table person add name varchar2(10);
DML 数据操作语言
所有的dml操作. 都需要结束事务 !
事务: 将一系列的sql语句 看作一个业务, 统一处理 , 要么一起成功, 要么一起回滚!
银行金融系统
志强 1020000
陈凯 6
----------------
5块
1. 将志强余额减5
2. 凯凯的余额加5
3. 提交
转账业务
mysql
-----------
提交事务
commit;
回退事务
rollback;
insert语句 - 向数据库插入数据
1. 全字段添加
格式: insert into 表名 values(数据列表);
数据列表 : 表示的是一个数据组, 数据的顺序 按照创建表格时的字段顺序传入 ,不同字段的值使用英文逗号隔开
例如: 表格的字段创建顺序如下:
create table person(
id number(5),
name varchar2(100),
age number(8)
);
我们在对这个表格进行全字段的添加数据时:
insert into person values(id,name,age);
练习:
- 向数据库中的person表格插入如下数据:
1. 编号:10,姓名:张三,年龄:18
insert into person values(10,'张三',18);
2. 编号:11,姓名:李四,年龄:28
insert into person values(11,'李四',28);
3. 编号:12,姓名:王二,年龄:38
insert into person values(12,'王二',38);
4. 编号:13,姓名:麻子,年龄:8
insert into person values(13,'麻子',8);
commit;
2. 选择字段添加
格式: insert into 表名(字段列表) values(数据列表);
-- 字段列表可以任意排列 , 多个字段名之间使用英文逗号隔开 , 数据列表的顺序, 参照字段列表
练习:
- 向数据库中的person表格插入如下数据:
1. 编号:20,姓名:待定,年龄:10
insert into person(age,id) values(10,20);
2. 编号:21,姓名:待定,年龄:20
insert into person(age,id) values(20,21);
3. 编号:22,姓名:待定,年龄:30
insert into person(age,id) values(30,22);
4. 编号:23,姓名:待定,年龄:40
insert into person(age,id) values(40,23);
commit;
阅读全文
1 0
- Oracle数据库入门 基础知识day04 火推阳光笔记
- Oracle数据库入门 基础知识day05 火推阳光笔记
- Oracle学习笔记--day04
- Oracle数据库入门—基础知识
- oracle数据库基础知识学习笔记
- Oracle数据库 day01 火推
- Oracle学习笔记day04——数据类型
- Oracle基础知识笔记(15) 数据库备份
- Day04笔记
- day04笔记
- day04笔记
- 直播推流基础知识笔记
- 2. oracle学习入门系列之二 数据库基础知识
- Oracle 10g sql 入门基础知识 笔记 第一部分
- Oracle入门基础知识
- 数据库基础知识入门
- day04-HTTP协议入门
- Oracle基础知识笔记(16) 数据库设计范式
- 【数据结构】最短路径——Dijkstra算法
- stata12.13免费破解版网址
- mysql在查询结果列表前添加一列递增的序号列(最简)
- 本地缓存
- 图片圆角
- Oracle数据库入门 基础知识day04 火推阳光笔记
- 关于矩阵乘法
- 快速排序算法bug修正
- 服务请求数据
- 数据库ACID和CAP理论
- 通华项目总结
- 整形可以赋值给字符型常量
- 解决TabLayout绑定viewpager出现的空白页面
- 通过插件changemonitor监听mybatis操作