注:非* 必须区分 使用表名 或别名.区分
查询所有的员工信息和部门信息
select * from emp cross join dept;
(2)内连接分为两种:等值连接和非等值连接。
等值连接又分为:自然连接、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.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;(左外连接)
(判定字段,值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;
(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);
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时,删除或者改变视图中的数据时原有表机构中的数据也会更改。
索引: 提高查询速度的一种手段 -->目录
1、唯一性较好字段适合建立索引
2、大数据量才有效果
3、主键|唯一: 唯一索引
语法:create index 索引名 on表名 (字段列表...)
为emp表的sal字段添加索引
create index index_emp_sal on emp(sal);
删除索引
drop index index_emp_sal;
要想设计一张表皮前提是满足三范式要求
三范式:
1)列不可再分,字段的原子性
2)定义主键(唯一+非空),确定唯一
3)拆分表,通过主外键约束定义两张表的关系 ,消除传递依赖,避免数据的过渡冗余
1. 确定表名
2. 确定字段名 类型 +约束(主键 外键 非空 默 检查认 唯一)
主键: 唯一标识一条记录(唯一并且非空)
唯一: 唯一
非空:不能为空
默认: 当没给值时使用给定一个默认值 外键:参考其他表(自己)的某个(某些)字段
检查:自定义的规则
添加约束
主键约束 : 唯一+非空 primary key
唯一约束 : unique
非空约束 : not null
默认约束 : default(默认值)
外键约束 : references
检查约束 : check(检查条件)
语法格式:create table 表名( 字段名 类型(长度) 约束, ...其他字段.... ..约束........ );