Oracle复习(二)SQL查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle复习(二)SQL查询相关的知识,希望对你有一定的参考价值。


Oracle复习(二)SQL查询

SQL高级查询技术(一) :

SQL基础:
  • SQL是一种介于关系代数与关系演算之间的结构化查询语言。SQL是一个通用的、功能极强的数据库语言。
  • SQL集数据查询(data query)、数据操作 (data manipulation)、数据定义(data definition)、数据控制(data control)于一体。
  • SQL语言包括:
1. SQL DDL:定义关系模式、删除关系、建立索引 以及修改关系模式; 
2. SQL DML:查询、插入、删除和修改;
3. 嵌入式DML:嵌入在Pascal、C等宿主语言;
4. 视图定义:创建视图;
5. 权限管理:对关系和视图的访问进行授权;
6. 完整性:定义数据必须满足的完整性约束条件;
7. 事务控制:定义事务的开始、提交、和结束等。
  • SQL数据定义语言
基本的数据库对象: 表(table)、视图(view)、索引(index) 
表的创建:
CREATE TABLE table_name (
col_name datatype [column level constraint]
[,col_name datatype [column level constraint] ,...]
[,table level constraint]
);
建表的同时可以定义与该表相关的完整性约束(会被存入数据库系统中,当用户操作表时,DBMS会自动检查该 操作是否违背完整性约束条件

建立约束的考虑:如果完整性约束条件涉及到该表的多个属性列,则必须定义在表级上;否则既可以定义在列级上也可以定义在表级上。

表名、列名是不区分大小写的。

对一个用户而言,表名必须唯一;一个表中,列名必须唯 一。

表名、列名必须以字母开头,长度不超过30个字符。

eg:创建一个学生表 建立一个“学生”表Student,它由学号Sno、姓名 Sname、性别Ssex、年龄Sage、所在系Sdept五个属性 组成。其中学号不能为空,值是唯一的,并且姓名取 值也唯一。
CREATE TABLE Student(
Sno CHAR(9) NOT NULL UNIQUE,
Sname CHAR(20) UNIQUE,
Ssex CHAR(2),
Sage NUMERIC(2,0),
Sdept CHAR(20)
);
  • 常用的完整性约束:
主码约束: PRIMARY  KEY 
唯一性约束:UNIQUE
非空值约束:NOT NULL
参照完整性约束:FOREIGN KEY
  • 删除表
将表 放入回收站 并不是真正意义上的删除
drop table

查看表的数目,可以看到数目并未改变
select * from tab;

从回收站中恢复表(只能恢复最近的一个表)
FLASH BACK TABLE 表名 TO BEFORE DROP;

查看回收站里面的表
select object_name, original_name ,operation,type from recyclebin

删除表不经过回收站
drop table 表名 purge;

从回收站中删除某个表
purge table 表名;

清空回收站
purge recyclebin;
  • 修改表
增加新的列
alter table 表名 add (列名,数据类型[default 默认值], 列名.....);
desc 查看表

修改列的数据类型
alter table 表名 modify(ename varchar(8));

修改列名
alter table 表名 rename column 现列名 to 新名;

删除列 (不可同时删除多个列)
alter table 表名 drop column 列名;

表的重命名
rename 旧名 to 新名;

更改列状态(改为不使用状态)
alter table 表名 set unused column 列名;

删除无用的列
alter table 表名 drop unused columns;

为表添加注释
comment on table 表名 is 注释内容
  • 插入:
插入单值:
INSERT INTO 表名(列名1,列名2,...)VALUES(值1,值2....)

子查询
INSERT INTO (SELECT 列名 FROM 表名) VALUES (......)

临时表
INSERT INTO 表名(列名1, 列名2.....) select ..... from dual

子查询进行批量插入
eg: 向myemp表中插入一条数据,员工号为1122,员工姓名为‘tom22’ 其他信息与员工7369的信息相同
INSERT INTO myemp SELECT 1122, tom22, JOB,MGR FROM emp WHERE empno = 7369;
如果要进行大量数据的装载操作可以利用
insert /*+append*/ into myemp(列名1,列名2) select
eg:
INSERT /*+append*/ INTO myemp (empno, ename) SELECT 2233,tom33 FROM dual;

向多个表插入数据
无条件多表插入
INSERT ALL INTO 表1 VALUE (值1, 值2)
INTO 表2 VALUES(列1,列2)
子查询;

有条件 向 多个表中插入
INSERT ALL/FIRST
WHEN 条件1 THEN INTO 表1 VALUES(列1,列2)
WHEN 条件2 THEN INTO 表2 VALUES(列1,列2)
ELSE INTO 表(列1,列2)
子查询;
ALL全部都插
FIRST只插入第一个条件(避免重复)
  • 修改数据:
全部修改
update 表名 set 列 = 值,列 = 值

局部修改
update 表名 set 列 = 值,列 = 值 where......

子查询:
update 表名(列名1,列名2) = (子查询 from dual) where 。。。

将部门30的员工工资修改为部门20员工的平均工资
update myemp set sal = sal + (select avg(sal) from emp where deptno = 20) where deptno = 30
  • 删除数据:
全部删除
delete from 表名
from 可以省略 但是不规范
只删除所有数据 表的结构依然在

局部删除
delete from emp where .....

子查询
删除和Smith相同岗位的人的信息
delete from emp where job = (select job from emp where ename = Smith)
  • 查询
格式:
select 列名 from 表名

算数运算符 + - * / :
select date+1 日期也可以进行相应的加减 前一天 后一天

别名:
select 列名 (as) 列别名 from
但是如果想要使用as作为列名,就需要将as打上双引号 as, 但是列名不可以是双引号

空值:null
空值不是0
空值不可以参与运算
nvl(可能产生空值的列名,指定值)

连接符:
列与列的连接
select ename || job as info from emp

字符串连接:
oracle 使用单引号进行字符串连接
select id: || ,name is || ename

去重:distinct

排序:order by
order by 列名 desc降序
order by 列名 asc 升序

条件: where
日期需要加单引号 默认是 日月年
用where的时候 注意大小写 列名不区分大小写,但是数据区分大小写
逻辑运算符:
AND, OR, NOT

(not) in是否在集合中
between and 两边都是闭区间
like:
% 任意数量的字符
_表示一个字符
  • 连接:
左右连接
列名 (+) = 右连接
= 列名 (+) = 左连接
select 列名
from 表1 right outer join 表名2 on 条件;

select 列名
from 表1 left outer join 表名2 on 条件;

交叉连接:
将返回被连接的两个表的笛卡尔积
select 列
from 表名1 cross join 表名2;

自然连接:
select 列
from 表名1 natural join 表名2;

using子句:
select 列名
from 表名1 join 表名2 using (列名)

on子句:
using 子句
select 列名
from 表名1 join 表名2 on 条件
  • 组函数:
count 

可以用于数字,日期等的大小比较
max
min

sum
avg

group by
having
  • rollup 小计
select 
from
group by
roll up
  • 集合运算
并集
union 去重
union all 不去重

交集
intersec

差集
minus


以上是关于Oracle复习(二)SQL查询的主要内容,如果未能解决你的问题,请参考以下文章

oracle的SQL语句中,查询每个学生的的学号、姓名、平均成绩,结果按平均成绩降序排列。

sql server 2008数据库中如何像oracle那样查询表的数目

Oracle复习SQL高级查询

oracle sql查询缺考的学生

oracle sql查询中用in列表中最大表达式数大于1000的处理

oracle sql查询中用in列表中最大表达式数大于1000的处理