1.连表查询(99语法)
(1)笛卡尔积也叫交叉连接
注:非* 必须区分 使用表名 或别名.区分
查询所有的员工信息和部门信息
select * from emp cross join dept;
(2)内连接分为两种:等值连接和非等值连接。
(2.1)等值连接
等值连接又分为:自然连接、using连接
(2.1.1)自然连接(自动根据同名字段,主外键关联关系 字段做等值连接)
注意: 在自然连接中同名字段不能指明出处
查询所有员工的部门编号
select deptno from emp e natural join dept d;
(2.1.2)using连接
查询所有员工的部门编号
select deptno from emp e inner join dept d using(deptno);
注意: 在join using中同名字段不能指明出处
(2.2)非等值连接
(2.2.1)on 连接(可以做等值连接,也可以做非等值连接)
语法:数据源1 join 数据源2 on 表连接条件
查询所有员工的部门编号
select e.deptno from emp e join dept d on e.deptno = d.deptno;(做等值连接)
查询员工信息以及员工工资等级信息
select * from emp e inner join salgrade s on e.sal between s.losal and s.hisal;(做非等值连接)
(3)外连接:有的表中的数据不满足连接条件也能显示
外连接分为:左外连接(left join)、右外连接(right join)、全连接(full join)
全连接是两张表都作为主表
查询所有的员工的上级领导
select * from emp e1 left join emp e2 on e1.mgr=e2.empno;(左外连接)
2.其他函数
(1)decode (condition,case1,express1,case2 , express2,….casen , expressn, expressionm)
(判定字段,值1,结果1,值2,结果2...,默认值)
查找所有员工的姓名,并将部门为10、20的改为十、二十
select ename,decode(deptno, 10,'十',20,'二十') from emp;
行转列
select name,
max(decode(course, '语文', score)) 语文,
min(decode(course, '数学', score)) 数学,
min(decode(course, '英语', score)) 英语
from tb_student group by name;
(2)case when then else end
查询部门编号,部门名称、工作地点 并增加一列将部门编号10、20改为十、二十其他的编号改为其他字符
select deptno,dname,loc, (case deptno when 10 then '十' when 20 then '二十' else '其他' end)中文名称 from dept;
3.rowid 与 rownum(作为伪列存在)
(1)rowid : 行记录的地址,行的唯一标识,数据插入到表中的是决定
可以实现去重: 对没有主键|唯一字段的表中多条完全重复的数据,根据rowid实现去重
去重: 如果表中存在主键或者唯一字段,直接 根据主键或者唯一字段去重
(2)rownum :结果集的序号
规律: 从1开始,每次+1
一个select查询语句就有一个结果集,每一个结果集中数据都有自己的序号-->rownum
注意: 当需要使用rownum进行一些判定,需要对一个已经确定的结果集的rownum进行判定
rownum与排序:
一般规律为:
根据非主键字段排序,先确定rownum再排序
根据主键字段排序,先排序,后确定rownum
实现在有排序存在的情况下,保证rownum是规律的,从小到大的
select empno,ename,sal,rownum num from (select empno,ename,sal from emp order by sal);
4.视图与索引
(1)视图:建立在表|结果集|视图上的虚拟表,有以下作用
1. 简化:select 查询语句,提高复用性
2. 重用:封装select语句 命名
3. 隐藏:内部细节
4. 区分:相同数据不同查询
不是所有的用户都有创建视图的权限
1. 前提: create view -->组 connect resource dba
2. 授权: -->sqlplus /nolog
a)、sys登录 conn sys/123456@orcl as sysdba
b)、授权: grant dba to scott;
回收: revoke dba from scott;
c)、重新登录
视图分为:
- 逻辑视图: 不会存储数据,数据来资源原始表结构,起到封装,简化,提高复用性的作用
- 物理视图: 真实存储数据
语法:create or replace view 视图名 as select语句 [with read only];
注:不加语句末尾不加with read only时,删除或者改变视图中的数据时原有表机构中的数据也会更改。
(2)索引
索引: 提高查询速度的一种手段 -->目录
1、唯一性较好字段适合建立索引
2、大数据量才有效果
3、主键|唯一: 唯一索引
- 帮助提高查询效率
- 索引为表中的字段添加索引
- 大量数据的前提下,通过索引对某个字段的数据做查询,效率会大大提高
- 索引也是对象,需要通过是数据库维护
- 索引类似与目录
- 如果大量做根据字段做查询,少量做增删适合使用索引
- 如果大量根据字段做增删,少量查询,每次增删数据需要根据维护索引,会降低效率
- oracle自动为主键添加索引
语法:create index 索引名 on表名 (字段列表...)
为emp表的sal字段添加索引
create index index_emp_sal on emp(sal);
删除索引
drop index index_emp_sal;
5.表的设计
要想设计一张表皮前提是满足三范式要求
三范式:
1)列不可再分,字段的原子性
2)定义主键(唯一+非空),确定唯一
3)拆分表,通过主外键约束定义两张表的关系 ,消除传递依赖,避免数据的过渡冗余
1. 确定表名
2. 确定字段名 类型 +约束(主键 外键 非空 默 检查认 唯一)
主键: 唯一标识一条记录(唯一并且非空)
唯一: 唯一
非空:不能为空
默认: 当没给值时使用给定一个默认值 外键:参考其他表(自己)的某个(某些)字段
检查:自定义的规则
添加约束
主键约束 : 唯一+非空 primary key
唯一约束 : unique
非空约束 : not null
默认约束 : default(默认值)
外键约束 : references
检查约束 : check(检查条件)
语法格式:create table 表名( 字段名 类型(长度) 约束, ...其他字段.... ..约束........ );
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。