您的位置:首页 > 数据库 > Oracle

【Oracle】数据库SQL 数据操作和查询

2018-02-07 09:54 661 查看
1.Oracle的简介

Oracle 数据库是 Oracle(中文名称叫甲骨文)公司的核心产品,Oracle 数据库是一个适合于大中型企业的数据库管理系统。在所有的数据库管理系统中(比如:微软的 SQL Server,IBM 的 DB2 等),Oracle 的主要用户涉及面非常广,包括:银行、电信、移动通信、航空、保险、金融、电子商务和跨国公司等。Oracle 产品是免费的,可以在 Oracle 官方网站上下载到安装包,另一方面 Oracle 服务是收费的。Oracle 是基于对象的关系型数据库,Oracle 也是用表的形式对数据存储和管理,并且在 Oracle 的操作中添加了一些面向对象的思想。

2.SQL 数据操作和查询

SQL 是结构化查询语言(Structured Query Language),专门用于数据存取、数据更新及数据库管理等操作。在 Oracle 开发中,客户端把 SQL 语句发送给服务器,服务器对 SQL 语句进行编译、执行,把执行的结果返回给客户端。Oracle SQL 语句由如下命令组成:

数据定义语言(DDL),包括 CREATE(创建)命令、ALTER(修改)命令、DROP(删除)命令等。

数据操纵语言(DML),包括 INSERT(插入)命令、UPDATE(更新)命令、DELETE(删除)命令、SELECT … FOR UPDATE(查询)等。

数据查询语言(DQL),包括基本查询语句、Order By 子句、Group By 子句等。

事务控制语言(TCL),包括 COMMIT(提交)命令、SAVEPOINT(保存点)命令、ROLLBACK(回滚)命令。

数据控制语言(DCL),GRANT(授权)命令、REVOKE(撤销)命令。

数据定义语言,表的增删改操作,数据的简单查询,事务的提交和回滚,权限的授权和撤销等

1)Oracle 数据类型

Oracle 数据库的核心是表,表中的列使用到的常见数据类型如下:





对应 NUMBER 类型的示例:



对于日期类型,可以使用 sysdate 内置函数可以获取当前的系统日期和时间,返回 DATE类型,用 systimestamp 函数可以返回当前日期、时间和时区。



Oracle 的查询中,必须使用“select 列… from 表”的完整语法,当查询单行函数的时候,from 后面使用 DUAL 表,dual 表在系统中只有一行一列,该表在输出单行函数时为了select…from 的语法完整性而使用。

2)创建表和约束

使用 CREATE TABLE 命令来完成,创建约束则使用如下命令:

语法格式:ALTER TABLE 命令

ALTER TABLE 表名 ADD CONSTRAINT 约束名 约束内容。

注意:在 Oracle 中 default 是一个值,Oracle 的 default 设置可以在建表的时候创建。

创建一个学生信息(INFOS)表和约束
CREATE TABLE INFOS
(
STUID VARCHAR2(7) NOT NULL, --学号 学号=‘S’+班号+2位序号
STUNAME VARCHAR2(10) NOT NULL, --姓名
GENDER VARCHAR2(2) NOT NULL, --性别
AGE NUMBER(2) NOT NULL, --年龄
SEAT NUMBER(2) NOT NULL,
f66f
--座号
ENROLLDATE DATE, --入学时间
STUADDRESS VARCHAR2(50) DEFAULT '地址不详', --住址
CLASSNO VARCHAR2(4) NOT NULL --班号 班号=学期序号+班级序号
)
/ ①
ALTER TABLE INFOS ADD CONSTRAINT PK_INFOS PRIMARY KEY(STUID) ②
/
ALTER TABLE INFOS ADD CONSTRAINT CK_INFOS_GENDER
CHECK(GENDER = '男' OR GENDER = '女') ③
/
ALTER TABLE INFOS ADD CONSTRAINT CK_INFOS_SEAT
CHECK(SEAT >=0 AND SEAT <=50) ④
/
ALTER TABLE INFOS ADD CONSTRAINT CK_INFOS_AGE
CHECK(AGE >=0 AND AGE<=100) ⑤
/
ALTER TABLE INFOS ADD CONSTRAINT CK_INFOS_CLASSNO
CHECK((CLASSNO >='1001' AND CLASSNO<='1999') OR
(CLASSNO >='2001' AND CLASSNO<='2999')) ⑥
/
ALTER TABLE INFOS ADD CONSTRAINTS UN_STUNAME UNIQUE(STUNAME) ⑦
/

① 在 Oracle 代码中,“/”执行缓存区中的语句,由于缓冲区中只存储一条刚刚保存过语句,由于每条语句没有用分号结尾,只是保存在缓冲区,因此每条语句后面都有单独一行“/”。
② 创建一个主键约束。
③ 与 ④ ⑤ ⑥ ⑦一起创建各种 check 约束。其中⑦是唯一约束,表示该列值是唯一的,列中的值不能重复。

创建一个成绩表(SCORES)表和约束
CREATE TABLE SCORES
(
ID NUMBER , --ID ①
TERM VARCHAR2(2), --学期 S1或S2
STUID VARCHAR2(7) NOT NULL, --学号
EXAMNO VARCHAR2(7) NOT NULL, --考号 E+班号+序号
WRITTENSCORE NUMBER(4,1) NOT NULL, --笔试成绩
LABSCORE NUMBER(4,1) NOT NULL --机试成绩
)
ALTER TABLE SCORES
ADD CONSTRAINT CK_SCORES_TERM CHECK(TERM = 'S1' OR TERM ='S2')
/
ALTER TABLE SCORES
ADD CONSTRAINT FK_SCORES_INFOS_STUID FOREIGN KEY(STUID) REFERENCES
INFOS(STUID) ②
/

① SQL Server 中可以使用 identify 创建自动增长列,但是 Oracle 中的自动增长需要借助序列(Sequence)完成。
② Oracle 中的外键约束定义。


3)数据操纵语言(DML)

数据操纵语言(DML)用于对数据库的表中数据进行添加、修改、删除和 SELECT…For UPDATE操作。

简单查询

数据查询是用 SELECT 命令从数据库的表中提取信息。SELECT 语句的语法是:

语法结构:简单查询

SELECT *|列名|表达式 FROM 表名 WHERE 条件 ORDER BY 列名

语法解析:

*表示表中的所有列。

列名可以选择若干个表中的列名,各个列表中间用逗号分隔。

表达式可以是列名、函数、常数等组成的表达式。

WHERE 子句是查询的条件。

ORDER BY 要求在查询的结果中排序,默认是升序。



Oracle 中可以把查询的结果根据结果集中的表结构和数据形成一张新表。

语法结构:根据结果集创建表

CREATE TABLE 表名 AS SELECT 语句

SQL> CREATE TABLE INFOS1 AS SELECT * FROM INFOS;

使用上面命令创建的新表中,不存在任何约束,并且把查询的数据一起插入到新表中。如果只复制表结构,只需使查询的条件不成立(比如 where 1=2),就不会查询从出任何数据,从而复制一个表结构。

复制表结构:SQL> CREATE TABLE INFOS2 AS SELECT * FROM INFOS WHERE 1=2;

数据插入

用 INSERT 命令完成对数据的插入。

语法结构:根据结果集创建表

INSERT INTO 表名(列名 1,列名 2……) VALUES (值 1,值 2……)

语法解析:

列名可以省略。当省略列名时,默认是表中的所有列名,列名顺序为表定义中列的先后顺序。

值的数量和顺序要与列名的数量和顺序一致。值的类型与列名的类型一致。

向 INFOS 表和 SCORES 表中插入数据



① 表名后面缺省了列名,默认是表 Infos 中的所有列名,values 中的值要与表中列一一对应,包括顺序和数据类型的对应。

② 在 Oracle 中,日期是国际化的,不同的区域安装的数据库,默认的日期格式不同,因此为了程序便于移植,日期的输入要使用 TO_DATE 函数对日期格式化后输入,采用格式化字符串对日期进行格式化时,格式化字符串中字符不区分大小写,常见的格式化字符如下:

yyyy 表示四位年份

mm 表示两位月份,比如 3 月表示为 03

dd 表示两位日期

hh24 表示小时从 0-23,hh12 也表示小时从 0-11。

mi 表示分钟

ss 表示秒

③ 在遇到存在默认值的列时,可以使用 default 值代替。

④ commit 是把用户操作(添加、删除、修改操作)提交,只有提交操作后,数据才

能真正更新到表中,否则其他用户无法查询到当前用户操作的结果。

在 Oracle 中,一个 INSERT 命令可以把一个结果集一次性插入到一张表中。使用的语句是:INSERT INTO 表 SELECT 子句,如下示例:



在这种语法下,要求结果集中每一列的数据类型必须与表中的每一列的数据类型一致,结果集中的列的数量与表中的列的数量一致。比如表 INFOS1,该表的结构与 INFO 表一样,那么可以把 INFO 表中的所有记录一次性插入到 INFOS1表中。

Oracle 的简单查询可以在查询列中使用常量,如图



可以使用刚才的做法,把该结果集中的数据插入到表 INFOS 中



更新数据

语法结构:UPDATE 操作

UPDATE 表名 SET 列名 1=值,列名 2=值…… WHERE 条件



删除数据

语法结构:DELETE 操作

DELETE FROM 表名 WHERE 条件



TRUNCATE

在数据库操作中, TRUNCATE 命令(是一个 DDL 命令)可以把表中的所有数据一次性全部删除。

语法结构:TRUNCATE

TRUNCATE TABLE 表名

TRUNCATE 和 DELETE 都能把表中的数据全部删除,他们的区别是:

TRUNCATE 是 DDL 命令,删除的数据不能恢复;DELETE 命令是 DML 命令,删除后

的数据可以通过日志文件恢复。

如果一个表中数据记录很多,TRUNCATE 相对 DELETE 速度快。

由于 TRUNCATE 命令比较危险,因此在实际开发中,TRUNCATE 命令慎用。

4)操作符

Oracle 开发中,依然存在算术运算,关系运算,和逻辑运算。

算术运算

Oracle 中的算术运算符,没有 C#中的算术运算符丰富,只有+、-、*、/四个,其中除号(/)的结果是浮点数。求余运算只能借助函数:MOD(x,y):返回 x 除以 y 的余数。

每名员工年终奖是 2000 元,请显示基本工资在 2000 元以上的员工的月工资,年总工资。



关系运算和逻辑运算

Oracle 中 Where 子句经中经常见到关系运算和逻辑运算,常见的关系运算有:



逻辑运算符有三个:AND、OR、NOT

字符串连接操作符(||)

在 Oracle 中,字符串的连接用双竖线(||)表示。比如,在 EMP 表中,查询工资在 2000元以上的姓名以及工作。



Oracle 中字符串可以用单引号,也可以用双引号,在别名中存在空格时,必须用双引号。在表名、列名时用双引号。

5)高级查询

消除重复行

在 Oracle 查询中结果中,可能出现若干行相同的情况,那么可以使用 DISTINCT 消除重复行。具体的用法如示例:



NULL 操作

如果某条记录中有缺少的数据值,就是空值(NULL 值)。空值不等于 0 或者空格,空值是指未赋值、未知或不可用的值。任何数据类型的列都可以包括 NULL 值,除非该列被定义为非空或者主键。



在查询条件中 NULL 值用 IS NULL 作条件,非 NULL 值用 NOT IS NULL 做条件。



IN 操作

在 Where 子句中可以使用 IN 操作符来查询其列值在指定的列表中的行。比如:查询出工作职责是 SALESMAN、PRESIDENT 或者 ANALYST 的员工。条件有两种表示方法:

WHERE job = ‘SALESMAN ’ OR job = ‘PRESIDENT ’ OR job = ‘ANALYST ‘

WHERE job IN (‘SALESMAN’, ‘PRESIDENT’, ‘ANALYST’)



对应 IN 操作的还有 NOT IN,用法一样,结果相反。

BETWEEN…AND…

在 WHERE 子句中,可以使用 BETWEEN 操作符来查询列值包含在指定区间内的行。比如,查询工资从 1000 到 2000 之间的员工。可以使用传统方法:WHERE SAL>=1000 AND SAL<=2000,也可以使用: WHERE SAL BETWEEN 1000 AND 2000,BWTWEEN 操作所指定的范围也包括边界



LIKE 模糊查询

在一些查询时,可能把握不准需要查询的确切值,比如百度搜索时输入关键字即可查询出相关的结果,这种查询称为模糊查询。模糊查询使用 LIKE 关键字通过字符匹配检索出所需要的数据行。字符匹配操作可以使用通配符“%”和“_”:

%:表示零个或者多个任意字符。

_:代表一个任意字符。

语法是:LIKE ‘字符串’[ESCAPE ‘字符’]。匹配的字符串中,ESCAPE 后面的“字符”作为转义字符







集合运算

集合运算就是将两个或者多个结果集组合成为一个结果集。集合运算包括:

INTERSECT(交集),返回两个查询共有的记录。

UNION ALL(并集),返回各个查询的所有记录,包括重复记录。

UNION(并集),返回各个查询的所有记录,不包括重复记录。

MINUS(补集),返回第一个查询检索出的记录减去第二个查询检索出的记录之后剩余的记录。

当使用集合操作的时候,要注意:查询所返回的列数以及列的类型必须匹配,列名可以不同。



可以通过 insert into …select 把一个结果集插入到另一张结构相同的表中,因此可以使用 union 把若干条记录一次性插入到一张表中。



连接查询

内联接(inner join)、外联接(outer join),外联接又分为左外联接(left outer join)和右外联接(right outer join)。Oracle 中对两个表或者若干表之间的外联接用(+)表示。

1)请查询出工资大于 2000 元的,员工姓名,部门,工作,工资。由于部门名称在 dept 中,其他的信息在 emp 表中,需要内联接才能完成。



这里 INNER JOIN 中,关键字 INNER 可以省略。



2)请查询出每个部门下的员工姓名,工资。Emp 表用外键 deptno 引用 Dept 表中的 deptno,在 Dept 表中如果有某些部门没有员工,那么用内联接,没有员工的部门将无法显示,因此必须以 Dept 表为基准的外联接。



(+):Oracle 专用的联接符,在条件中出现在左边指右外联接,出现在右边指左外联接。



3.总结

Oracle SQL 语句中有数据操纵语言(DML)、数据定义语言(DDL)、数据控制语言(DCL)、事务控制语言(TCL)等等。

DML 语句包括增删改查语句,DDL 语句包括数据库对象创建、修改和删除语句,数据控制命令包括 GRANT、REVOKE 等,事务控制命令有 COMMIT、ROLLBACK 等。

数据库中建表常用的类型有:数字类型number(p,s),可变字符串varchar2(length),日期 date。

Oracle 中 default 是一个值,在 Oracle 中不存在 default 约束。

Oracle 的增删改语句都是使用 INSERT、UPDATE、DELETE完成。

Oracle 高级查询中要注意:DISTINCT、NULL、IN、BETWEEN…AND…。

集合操作有:UNION、UNION ALL、INTESECT、MINUS。

联接查询有内联接和外联接。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐