一 、 SQL 语言
SQL ( Structure Query Language 结构化查询语言)标准的关系数据库语言, 用于建立、储存、修改、检索和管理数据库中的信息。
二 、 SQL 语言的组成
数据定义语言 (DDL): 用来创建、删除或者修改数据模式对象的结构。一般包括: CREATE,DROP,ALTER
数据操作语言( DML ): 用来操作数据。包括: UPDATE,INSERT,DELETE
数据查询语言:查询数据: SELECT
三、进入 SQL*PLUS ( ORACLE 自带的 PL/SQL 使用器)
进入 ORACLE 目录中 BIN/PLUS33W(5.0) 或者 BIN/PLUS80W(6.0)
编辑、运行, 在命令苻后输入 SQL 命令, 如果上一个 sql 输入有问题,键入 ‘ ed ’ 进行编辑
四、表
1. 创建表(创建表用 CREATE TABLE 语句):
CREATE TABLE <TABLE_NAME>(
Column_name1 Datetype1 [Constraint_Type]
,Column_name2 Datatype2 [Constraint_Type]
, …
,[CONSTRAINT Constraint_Name1 Constraint_Type (column_name) USING INDEX]
)
/
Constraint_Type 有以下几种类型
PRIMARY KEY(column_name)- 主键约束
FOREIGN KEY(column_name) REFERENCES Table_Name(Colunm)- 外键约束
UNIQUE KEY (column_name)- 唯一键约束
DateType 一般是 ORACLE 可以支持的数据类型比较常用的有:
A. NUMBER
B.VARCHAR(n)
C.VARCHAR2(n)
D.LONG
E.DATE
F.CHAR(n)
G.INTGER
例子: 创建一个工人信息表, GRID,XM,XB,CSRQ 和一个工人工资表,包括 GRID,SZBM( 所在部门 ) , GZ,RQ 其中工人信息表是主表,工人工资表是从表
CREATE TABLE GR_XX(
GRID VARCHAR2(10)
,GRXM VARCHAR2(50) NOT NULL
,XB VARCHAR2(2) NOT NULL
,CSRQ DATE
,CONSTRAINT GR_XX$_GRID PRIMARY KEY (GRID) USING INDEX
)
/
CREATE TABLE GR_GZ(
GRID VARCHAR2(10)
,SZBM VARCHAR2(10)
,GZ NUMBER(10,2)
,RQ DATE
,CONSTRAINT GR_GZ$_GRID FOREIGN KEY (GRID) REFERENCES GR_XX(GRID)
,CONSTRAINT GR_GZ$_GRID_RQ UNIQUE (GRID,RQ)
)
/
2. 对表插入数据
插入一条记录
INSERT INTO Table_Name [(column_name1,Column_name2,...)] VALUES(value1,value2,...);
例子:向工人信息表中插入数据
Insert into gr_xx (grid,grxm,xb,csrq) values (‘001’,’xjf’,’ 男 ’,SYSDATE);
Insert into gr_gz values(‘001’,’008’,560.92);
插入多条记录
INSERT INTO Table_Name1 [(column_name1,Column_Name2,...)]
3. 修改表
UPDATE Table_Name SET column1=val1,column2=val2,… WHERE …
例子: update gr_gz set gz=80000 where grid='sw'or grid='dn';
4. 删除数据
DELETE FROM TABLE_NAME WHERE ...
5. 提交数据
COMMIT-- 提交
ROLLBACK-- 回滚
例子:主表和从表需要同时更新数据时,需要更新两条 sql 语句,为避免数据库中的垃圾数据,当一条记录失败,即回滚。
6. 删除表
DROP TABLE TABLE_NAME;
DELETE TABLE TABLE_NAME; 删记录
7. 修改表结构
增加列
ALTER TABLE TABLE_NAME ADD COLUMN_NAME DATATYPE ;
alter table gr_gz add sl varchar(4)
删除列
ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME ;
alter table gr_gz drop column sl;
删除列时,该列不能有数据。
修改列
ALTER TABLE TABLE_NAME MODIFY COLUMN_NAME DATATYPE;
alter table gr_gz modify sl varcher2(10)
注意:修改列时,可以将已有类型转为新得类型,也可以扩大或者缩小原来得数据类型。当将已有类型转为新得类型时,表中 此字段不能有数,扩大可以不受影响,缩小时,表中得数据大小不能超过修改后得大小。
虚表
SELECT SYSDATE FROM DUAL;
select 5*7 from dual;
五、视图(由一个或者多个表建的视图)
1. 创建视图
CREATE OR REPLACE VIEW VIEW_NAME AS
SELECT COLUMN1,COLUMN2,… FROM TABLE_NAME1 A, TABLE_NAME2 …
2. 删除视图
DROP VIEW VIEW_NAME
例子:创建一个视图,可以查出工人的姓名和工人的工资
create or replace view v_gz as
select a.grid.a.xm,b.gz
from gr_xx a,gr_gz b
where a.grid=b.grid
六、数据查询
一般使用 select 语句进行查询
基本结构:
SELECT COLUMN1,COLUMN2, …
FROM TABLE_NAME
[WHERE CONDTION ]
[GROUP BY COLUMN]
[HAVING CONDITION]
[ORDER BY COLUMN]
1. 查询所有得列
SELECT * FROM TABLE_NAME [WHERE CONDTION]
例子:查询工人信息表中 grid = ‘ 0001 ’ 的所有列的信息
select * from gr_xx where grid='0001'
2. 查询指定的列
SELECT COLUMN1,COLUMN2,.. FROM TABLE_NAME [WHERE CONDITION]
例子: select grid,grxm from gr_xx where grid = ‘0001’ ;
3. 用被选择的列的别名来指定显示选择结果时的列名
SELECT COLUMN1 BYNAME1,COLUMN2 BYNAME2 FROM TABLE_NAME [WHERE]
select grid,grxm,grgz from gr_xx where grid='0001';
4. 在 select 语句中使用表达式
SELECT EXPRESSION FROM TABLE_NAME [WHERE ]
select cgdz,300+100 from cg_xx ;
5.distinct 查关键字,消除冗余行 , 统计
SELECT DISTINCT(COLUMN) BYNAME FROM TABLE_NAME [WHERE CONDITION]
例子:如果有两个记录的姓氏字段皆包含 Smith ,则下列 SQL 语句只返回包含 Smith 的记录
select distinct Smith from employees;
如果省略 DISTINCT ,则查询将返回两个包含 Smith 的记录
6. where 子句
where 子句中常用的比较运算符 :<, >, <> , = ,!=,<= , >=
常用的关系运算符 :in(val1,val2,…),between val1 and val2,like ‘%tin%’ 百分号表示零个或任意多个字符 _ 表示任意一个字符
select * from gr_xx where grid in (‘0001’,’0002’);
select * from gr_xx where csrq between ’01-jan-1960’ and sysdate
select * from gr_xx where grxm like ‘%y%’ ;
组合查询条件 :and ,or ,not
select * from gr_xx where csrq > 'june-01-1980' and xb=' 男 ';
select * from gr_xx where csrq > 'june-01-1980' or xb=' 男 ';
select * from gr_xx where grid not in('0001','0002');
7.order by 排序子句
按照定义字段的顺序显示查询结果
Select * from gr_gz order by gz;
Asc 正序排列(由低到高) Desc 倒序排列
select * from gr_gz order by gz desc;
8.Group by having 分组函数
分组函数包括: max,min,avg,sum,conunt
having 与 where 的区别就在于 where 是执行前判断条件,而 having 则是在执行查询后判断条件 ;group by 后只能用 having 而不能用 where
select grid,count(gz) from gr_gz
group by grid 把 grid 相同的分成一组
having grid = ‘yang’; 取出的结果中包含 grid='yang'
select xm , count(*) from gr_xx group by xm having count(*)>1 ; 取出有相同姓名的人
9. 查询的并 ( union ) 、交 (intersect) 、差 (minus) 操作
union 去掉重复记录, union all 全部保留 ( 按照缺省规定,使用 UNION 运算时不返回重复的记录;然而,可以包含 ALL 谓词来确保返回所有的记录 )
select grid from gr_xx where xb=’ 男 ’ intersect select grid from gr_gz where gz > 400 ;
10. 连接查询
利用两个表的相关列之间的比较关系,控制个表中的行的组合。从多个表中查询数据
A. 等值连接 ‘ = ’
select a.grid,a.xm,b.gz from gr_xx a gr_gz b where a.grid=b.grid;
B. 非等值连接
select a.grid,a.xm,b.gz from gr_xx a gr_gz b where a.grid='0001'and b.gz>'2000';
C. 自连接查询:与本表进行连接查询
select a.grid from gr_xx a,gr_xx b where a.grid=b.xm;
CREATE TABLE GR_jl(
GRID
,MGR
)
/
select a.grid,b.grid from gr_jl a, gr_jl b where a.mgr = b.grid ;
D.外连接:使用后,可以返回两个表中相匹配的行,(+)跟在从表的列后。没有匹配的数据为NULL
select a.id, b.id, from dept a, emp b;
a.id b.id
1 2
2 2
3 4
where a.id(+) = b.id
1 2
2 2
4
where a.id = b.id(+)
1 2
2 2
3
11. ORACLE 中的伪列
ROWNUM ,ROWID 每个表中都有的列
Select * from gr_xx where rownum < 10 ;
12.嵌套查询:在select语句中,还存在另一个select语句,叫嵌套查询
Select * from gr_xx
Where grid in ( select grid from gr_gz where gz >300 );
exists 的应用
Select count(1) from dual where exists (select 1 from Gr_xx where grid = ‘yang’);
13.||连接符
select 'time is '||sysdate from dual;
七、序列发生器
1.创建
create sequence a start with 10000 ;
2.使用
currval
nextval
select a.currval from dual;