语句的类型
-
DQL:数据查询语言 select
-
DML:数据操作语言
insert增 delete删 update改 select查 对表里的数据
可以回退(可以进行事务操作)
-
DDL:数据定义语言
create创建表/drop删除表 /truncate删除数据 /alter table修改表
不可以回退 -
DCL: 数据控制语言
grant授权, revoke取消授权
比如创建表的权限
DML
-
增加数据
insert into 表名(字段名1,字段名2,…,) values(字段值1,字段值2,…)
字段名和字段值一一对应:数据类型、个数、顺序
**注:如是完整的表字段,可省略字段名(99标准)
-
动态输入插入的值(&)
Java 中 Scanner(system in)
Scanner input = new scanner(system in);
Input.next();
动态输入插入的值
注:如果是字符串,日期格式还是需要加上 ’ ’
-
批量插入数据:
(1)创建新表(批量插入之前不存在)
CREATE TABLE 新表名 AS SELECT * FROM 老表名;
(2)创建新表,将旧表的一部分数据批量导入
CREATE TABLE 新表名 AS SELECT 老表列名,…, FROM 老表名;
(3)可以合理利用该where 1=0 来快速复制表结构
CREATE TABLE 新表名 AS SELECT 老表列名,…, FROM 老表名 WHERE 条件;
(4)在已存在的表(只有表结构没有数据)中插入数据
INSERT INTO 目标表名(表列名,…,) SELECT 表列名,…FROM 老表名;
-
批量事务处理
BEGIN … END; /
-
插入海量数据:
数据泵 \ SQL Loader\ 外部表
-
删除delete,truncate,drop的区别
(1)Delete 删除表数据 可回退 DML insert into update 都可回退
Truncate 删除表数据 不可回退 DDL 保留的是记录
Drop 删除表 不可回退 DDL 记录都删(回收站)
注: 可回退是保证在没有提交(conmmit)之前
显示SQL执行时间: set timing on/off
(2)Drop 和truncate 相对于delete更加危险
(3)Delete 删除数据后还占用资源空间
(4)Delete 产生碎片
-
HWM 高水位线
(1)碎片太多 需要清理
\1. move sql语句
\2. 导入导出
-
更改update
(1)如果不加where条件则更改的是全表
UPDATE 表名 SET 列名1=值1,列名2=值2,列名3=值3… WHERE 条件
(2)加上where 条件子句
-
查看保留字
select * from v$reserved_words
DDL(create/drop/truncate/alter)
-
创建表
(1)create table 表名 (字段名,类型,字段名,类型,…);
(2) sql语句
create table mytab ( id number, name varchar(20), age number );
-
创建表的注意事项:
(1)权限和空间问题
(2)表名的规定:
a.必须以字母开头
b.表名只能包含: 大小写字母、数字、_、$、#
c.长度 1-30个字符
d.不能与数据库中其他对象重名(表,视图,索引,触发器,存储过程…)
e.不能与保留字(关键字)重名
-
修改表****Alter :
(1)add 追加列
ALTER TABLE 表名 ADD 列名 列类型(长度) ;
(2)修改列 modify
修改列的长度
alter table mytab3 modify sex varchar2(20) ;
修改列的类型
alter table mytab3 modify sex number ;
(3)删除列
alter table mytab3 drop column sex ;
(4)重命名列
alter table mytab6 rename column sex to tel ; -
删除表 drop
(1)select *from tab; 表以及回收站中的表
drop table mytab6; -->放在了回收站
(2)查看回收站
show recyclebin;
(3)清空回收站
purge recyclebin ;
(4)还原回收站(闪回)
(5)删除表并清空:
drop table test02 purge ;
多表链接查询
-
交叉连接(笛卡尔积)
多张表相乘,简单的说就是两个集合相乘的积
例: select * from emp , dept ;
-
内连接
(1)等值连接,多张表通过相同字段进行匹配,只显示匹配成功的数据,不显示匹配不成功的数据
a、where
b、inner join on =
(2)不等值连接,不常用 ( != ,< , >) -
外连接
(1)左外连接 左连接 emp dept
以左表为基准(左表数据全部显示),去匹配右表数据,如果匹配成功,则全部 显示;匹配不成功,则显示部分(无数据部分用NULL填充)
方式一:select * from emp e left join dept d on e.id = d.id;
或select * from t_A a left outer join t_B b on a.id = b.id;方式二:用(+)来实现,(+)表示补充,即哪个表有加号,这个表就是匹配表。如果 加号写在右表,左表就是全部显示,所以是左连接。 此方式为oracle独有
select * from t_A a,t_B b where a.id = b.id**(+)**;
(2)右外连接
以右表为基准(右表数据全部显示),去匹配左表数据,如果匹配成功,则全部 显示;匹配不成功,则显示部分(无数据部分用NULL填充)
方式一:select * from t_A a right join t_B b on a.id = b.id;
或select * from t_A a right outer join t_B b on a.id = b.id;
方式二:用(+)来实现,(+)表示补充,即哪个表有加号,这个表就是匹配表。如果 加号写在左表,右表就是全部显示,所以是右连接。 此方式为oracle独有
select * from t_A a,t_B b where a.id**(+)**=b.id;
(3)全外连接
左表和右表都不做限制,所有的记录都显示,两表不足的地方均为NULL。 全外 连接不支持(+)写法
例:select * from t_A a full join t_B b on a.id = b.id;
或select * from t_A a full outer join t_B b on a.id = b.id;
-
全外连接
左表和右表都不做限制,所有的记录都显示,两表不足的地方均为NULL。 全外 连接不支持(+)写法。
例:select * from t_A a full join t_B b on a.id = b.id; 或
select * from t_A a full outer join t_B b on a.id = b.id; -
层次连接 (优化自连接) 树
层次查询
select level ,字段名… from 表名
connect by prior 下层=上层
start with 当前节点的上层节点 = xxxx ;
多表链接
-
交叉连接(笛卡尔积)
两个表中的所有情况的组合
-
内连接
(1) 等值连接
a. where 方式
b. inner join on 方式
(2)不等值连接 != < >
-
外连接
(1)左外连接
a.方式一:传统方式
b.方式二:oracle特有方式
(2)右外连接
a.方式一:传统方式
b.方式二:oracle特有方式
(3)全连接
相当于 先左连接,再右连接,再补充
-
自连接
原理:先笛卡尔积,再判断where条件 减去有用的数据展示
缺点:浪费资源 占内存,慢 性能差
-
层次连接 level 树