oracle day-4

day-4
1.多表查询
from s1,s2,s3…
where 连接条件

连接条件可以是:等值连接,不等连接,外连接,自连接,集合操作:union,union all,minus,intersect

rownum 位列 从1开始
rowid 代表物理位置

2.组函数
avg(),sum(),max(),min(),count()

进行查询
默认分组
select avg(salary)
from s_emp;
进行分组:group by 字段1,字段2…
group by dept_id,id (部门号和员工id都相同的分为一组)
组函数过滤:having
select… 5
from … 1
where … 2
group by… 3
having … 4
order by… 6

3.子查询
select …
from …
where 字段名 比较符 (
select …
from …
where …
group by …
having …
order by …

);

group by…
having …
order by…

练习:
1.查看工资大于chang员工工资的所有员工的id
select id,last_name,salary
from s_emp
where salary>(
select salary
from s_emp
where last_name=“Chang”
);

查询所在区域号为2的员工的信息?
select id,last_name,dept_id
from s_emp
where dept_id in (
select id
from s_dept
where region_id=2
);

注意:连接子查询的操作符
子查询返回单值或者多值

2.查看职位名称和名字为Chang的员工一样的所有员工id和名字
select id,last_name,title
from s_emp
where title=(
select title
from s_emp
where last_name =‘Chang’
);
3.查看员工工资小于平均工资的所有员工的id

select last_name,salary
from s_emp
where salary <(
select avg(salary)
from s_emp
);

4.查看部门id和名字为Chang的部门号相同或者区域ID为2的部门信息

select dept_id,region_id
from s_emp
where id=(
select dept_id
from s_emp
where last_name=‘Chang’
)
or region_id=2;

5.查询号部门平均工资大于32号部门平均工资的部门id
select dept_id
from s_emp
group by dept_id
having avg(salary)>(
select avg(salary)
from s_emp
where dept_id=32
);

6.查询工资大于Smith所在部门平均工资的员工的信息
select dept_id,last_name,salary
from s_emp
where salary>(
select avg(salary)
from s_emp
where dept_id=(
select dept_id
from s_emp
where last_name=‘Smith’
)
);

7.查询工资小于员工所在部门的平均工资的员工的信息
select last_name,salary
from s_emp e,(select dept_id ,avg(salary) sal
from s_emp
group by dept_id) a
where e.dept_id = a.dept_id
and e.salary<a.sal;

8.使用子查询查询s_emp表中,第3~7条数据
select last_name,salary
from s_emp
where rownum<=7
minus
select last_name,salary
from s_emp
where rownum<=2


使用子查询:
select t.id,t.last_name,t.salary
from (select rownum rn,id,last_name,salary
from s_emp
where rownum<=7
) t
where t.rn>=3;

数据库设计的步骤:
需求分析:把客户的表述分析成具体成的实体,
以及分析实体与实体之间的关系.由项目经理去和客户沟通 任何东西都可以抽象成实体.
分析出实体中的属性.
学生,分数,订单
关系:一对一 丈夫和妻子
一对多 老师和学生
多对多 学生和技能
设计模块:具体设计,有哪些实体,属性关系
画E-R图 实体-关系模型图 更方便的展现数据库的设计
建立文档:文档用来表述表
设计表实例图:
建表语句

看懂ER图:
实体:圆角的矩形,实体名大写
属性:小写字母代表属性
#:代表唯一,字段的值不能重复
用#表示有可能是主键
*:代表非空
o:代表没有限制
关系:实体与实体之间有连线 增加一个外键
一对一:外键放在任何地方
一对多:外键放在多的一方
多对多:建立一张桥表,把外键放在桥表中,把多对多转为两个 一对多的关系

实线:mustbe关系,外键的值不能为空
虚线:maybe 关系,外键的值可以为空

外键:用来维护表与表之间的关系
外键的值必须在依赖的表中依赖的字段中存在,外键的值可以为空

主键:用来唯一区分表中的数据
主键的值必须非空唯一
联合主键:用两个或者两个以上的字段联合起来作为主键

范式:
目前关系数据库有六种范式:
第一范式(1NF):所有的属性都是单值不可再分
第二范式(2NF):在第一范式的基础上,表中的非主键列都必须依赖于主键列
第三范式(3NF):在第二范式的基础上,表中的非主键列都必须直接依赖于主键列,而不能间接的依赖
巴斯-科德范式(BCNF)
第四范式(4NF)
第五范式(5NF,又称完美范式)

属性是不可再分
非主键烈必须依赖主键列,不是依赖非主键列

1.插入数据
insert into 表名(字段名…)
values (值)

往学生表中插入数据
注意:表后没有写字段名,代表要给表中每个字段赋值 values(要和建表对应字段)
insert into s_student
values();

insert into s_student(id,name)
values(1,‘tom’);

约束有什么用?
一些规则

2.更新已经存在的数据 update
update 表名
set 字段 = 值,字段2=值2
where 条件
a)不加where,修改表中的所有数据
修改学生表中的所有学生的年龄为25
update s_student
set age=25;
b)加where,修改表中的某些数据
修改id为3的学生的年龄为20
update s_student
set age =20
where id = 30;

修改 id>2 的学生的名字为 briup ,age为30
update s_student
set name = ‘briup’,age =30
where id >2;

注意:修改时注意约束

3:删除数据 delect
delect from 表名
where 条件
a)不加where ,删除表中的所有数据

b)加where ,删除表中的某些数据
delect from s_student
where id>3;

先删除子表的数据
再删除父表的数据

先插入父表的数据
再插入子表的数据

create table 表名(
字段 数据类型 列级约束
字段 数据类型 列级约束

表级约束
);
\\
快速建表:加子查询
create table t1
as
select id,last_name,salary
from s_emp;

as 关键字

例如:建立一张表和s_dept 一模一样,只拿来s_dept的表结构,没有数据
create table test1
as
select * from s_dept
where 1=2;

上一篇:设计模式——20备忘录模式memento


下一篇:SQL - 7