Oracle常用sql语句(一)
Sql的分类
DDL (Data Definition Language):数据定义语言,用来定义数据库对象:库、表、列等; CREATE、 ALTER、DROP
DML(Data Manipulation Language):数据操作语言,用来定义数据库记录(数据); INSERT、 UPDATE、 DELETE
DCL(Data Control Language):数据控制语言,用来定义访问权限和安全级别;
DQL(Data Query Language):数据查询语言,用来查询记录(数据)。
SELECT
*注意:sql语句以 ; 结尾
这些都是数据库的SQL的基础知识(也是常识),一定要记住。
DDL:操作数据库、表、列等
使用的关键字:CREATE、 ALTER、 DROP
表基本的操作
- **创建新表 **
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
根据已有的表创建新表:
**select * into table_new from table_old (使用旧表创建新表) **
create table tab_new as select col1,col2… from tab_old definition only<仅适用于Oracle>
- 删除表
**drop table tablename **
- 修改表
rename 旧表名 to 新表名 修改表名
alert table tabname rename column oldColumn to newColumn 修改列名
alter table tabname add column col type 添加一列
alter table tabname drop column colname 删除一列
alter table tabname modify( ) 修改表中列的值
主键
添加主键:
**Alter table tabname add primary key(col) **
删除主键:
Alter table tabname drop primary key(col)
索引
创建索引:
**create [unique] index idxname on tabname(col….) **
删除索引:
drop index idxname
注:索引是不可更改的,想更改必须删除重新建。
视图
创建视图:
create view viewname as select statement
删除视图:
drop view viewname
常用数据类型
字符串类型
CHAR类型 CHAR(size [BYTE | CHAR])
CHAR类型,定长字符串,会用空格填充来达到其最大长度。非NULL的CHAR(12)总是包含12字节信息。CHAR字段最多可以存储2,000字节的信息。如果创建表时,不指定CHAR长度,则默认为1。
VARCHAR类型
不要使用VARCHAR数据类型。使用VARCHAR2数据类型。虽然VARCHAR数据类型目前是VARCHAR2的同义词,VARCHAR数据类型将计划被重新定义为一个单独的数据类型用于可变长度的字符串相比,具有不同的比较语义。
** VARCHAR2类型**
变长字符串,与CHAR类型不同,它不会使用空格填充至最大长度。VARCHAR2最多可以存储4,000字节的信息。
NVARCHAR2类型
这是一个包含UNICODE格式数据的变长字符串。 NVARCHAR2最多可以存储4,000字节的信息。
函数:
- 连接符||及CONCAT函数
可以连接两个列名或者常量。
注:如果姓名为中文还好,但是如果是英文的,这样连接会导致读起来比较困难,所以可以在中间加上常量“空格”;CONCAT函数符合ANSI SQL标准,所以适合更多不同的数据库,||是Oracle专有的,使用起来更简洁。
- 格式统一:RPAD和LPAD
RPAD允许在列的右边填充一组字符,填充的字符可以为任何字符。LPAD从左边添加。
使用方式:
RPAD(string,length[,'set'])
LPAD(string,length[,'set'])
这里的string是数据库中的字符串列或常量,length是填充后的长度,set是用来填充的字符串。如果方括号中的内容省略了,会默认使用空格填充。
- 修剪:LTRIM,RTRIM,TRIM
LTRIM和RTRIM从串的左边或右边删除不需要的字符。
使用方式:
RTRIM(string[,'set'])
LTRIM(string[,'set'])
如果没有设置要删除的值,默认删除空格。
- 大小写转换:LOWER、UPPER和INITCAP
LOWER把串或列种的任意字母转换为小写。
UPPER与LOWER相反。
INITCAP将串或列中每个单词的首字母转换成大写。
它们经常一起使用。
使用格式:
LOWER(string)
UPPER(string)
INITCAP(string)
- 子串:SUBSTR
使用SUBSTR函数可以提取出串的一部分。
使用格式:
SUBSTR(string,start[,count])
这个函数告诉Oracle提取string的一个子串,从start位置开始,长度为count个字符。如果不指定count,将从start开始一直到这个串结束。
- 索引位置:INSTR
INSTR可以告诉你要搜索的字符(串)在串种的位置。
使用格式:
INSTR(string,set[,start[,occurrence]])
string为要寻找的列或常量;set为要指定的要寻找的值;start可选,默认为从串的第一个位置开始搜索;occurrence可选,为指定字符串出现的第occurrence次的位置。
- like
查询含下划线的名字
SELECT * FROM emp
where ename LIKE '%/_%' escape '/';
数字类型
NUMBER类型
NUMBER(P,S)是最常见的数字类型,可以存放数据范围为10130~10126(不包含此值),需要1~22字节(BYTE)不等的存储空间。
P 是Precison的英文缩写,即精度缩写,表示有效数字的位数,最多不能超过38个有效数字
S是Scale的英文缩写,可以使用的范围为-84~127。Scale为正数时,表示从小数点到最低有效数字的位数,它为负数时,表示从最大有效数字到小数点的位数
INTEGER类型
INTEGER是NUMBER的子类型,它等同于NUMBER(38,0),用来存储整数。若插入、更新的数值有小数,则会被四舍五入。
浮点数
BINARY_FLOAT
BINARY_FLOAT 是 32 位、 单精度浮点数字数据类型。可以支持至少6位精度,每个 BINARY_FLOAT 的值需要 5 个字节,包括长度字节。
BINARY_DOUBLE
BINARY_DOUBLE 是为 64 位,双精度浮点数字数据类型。每个 BINARY_DOUBLE 的值需要 9 个字节,包括长度字节。
在数字的列中,浮点数有小数精度。在 BINARY_FLOAT 或 BINARY_DOUBLE 的列中,浮点数有二进制的精度。二进制浮点数支持的特殊值无穷大和 NaN (不是数字)。
FLOAT类型
FLOAT类型也是NUMBER的子类型。
Float(n),数 n 指示位的精度,可以存储的值的数目。N 值的范围可以从 1 到 126。若要从二进制转换为十进制的精度,请将 n 乘以 0.30103。要从十进制转换为二进制的精度,请用 3.32193 乘小数精度。126 位二进制精度的最大值是大约相当于 38 位小数精度。
函数:
函数 | 说明 |
---|---|
ROUND(date, fmt) | 四舍五入 |
TRUNC(date, fmt) | 截断 |
MOD(n1, n2) | 求余 |
CEIL(n) | 向上取整 |
FLOOR(n) | 向下取整 |
GREATEST(expr1, ... exprn) | 返回参数中最大的数 |
LEAST(expr1, ... exprn) | 返回参数中最小的数 |
随机数
SELECT TRUNC(dbms_random.value(a,b)) FROM dual
产生 [a,b)之间的数
日期类型
日期类型用于存储日期数据,但是并不是使用一般的格式(2012-08-08)直接存储到数据库的。
DATE类型
DATE是最常用的数据类型,日期数据类型存储日期和时间信息。虽然可以用字符或数字类型表示日期和时间信息,但是日期数据类型具有特殊关联的属性。为每个日期值,Oracle 存储以下信息: 世纪、 年、 月、 日期、 小时、 分钟和秒。一般占用7个字节的存储空间。
TIMESTAMP类型
这是一个7字节或12字节的定宽日期/时间数据类型。它与DATE数据类型不同,因为TIMESTAMP可以包含小数秒,带小数秒的TIMESTAMP在小数点右边最多可以保留9位
TIMESTAMP WITH TIME ZONE类型
这是TIMESTAMP类型的变种,它包含了时区偏移量的值
函数:
函数 | 说明 |
---|---|
MONTHS_BETWEEN(date1, date2) | 两个日期相差的月数 |
ADD_MONTHS(date, int) | 向指定日期中加上若干月数 |
NEXT_DAY(date, ch) | 指定日期的下一个日期(从星期日和1开始计算) |
LAST_DAY(date) | 本月的最后一天 |
ROUND(date, fmt) | 日期四舍五入 fmt的值('YEAR','MONTH') |
TRUNC(date, fmt) | 日期截断 fmt的值('YEAR','MONTH') |
EXTRACT(time_unit FROM date) | 从date中提取time_unit指定格式的日期数据 |
日期格式
格式 | 说明 | 举例 |
---|---|---|
YYYY | 年份的数字格式全称 | 2017 |
YEAR | 年的英文全称 | twenty seventeen |
MM | 月份(数字格式) | 10 |
MONTH | 月得全称 | 10月 |
DY | 星期几 | 星期四 |
DAY | 星期几 | 星期四 |
DD | 一个月的第几天 | 05 |
HH12 | 小时(12) | 1 |
HH24 | 小时(24) | 13 |
MI | 分钟 | 12 |
SS | 秒 | 12 |
- 当前时间
SELECT SYSDATE
FROM
dual;
SELECT
SYSTIMESTAMP
FROM
dual;-- 精确到毫秒
SELECT
TO_CHAR( SYSDATE, 'yyyy-mm-dd hh24:mi:ss' )
FROM
dual;
-- 昨天 今天 明天
SELECT
( SYSDATE - 1 ) 昨天,
SYSDATE 今天,
( SYSDATE + 1 ) 明天
FROM
dual;
修改日期格式
(默认格式为'DD-MON-RR')
SELECT * FROM v$nls_parameters;
ALTER SESSION SET nls_date_format='yyyy-mm-dd';
-- 改回默认
ALTER SESSION SET nls_date_format='DD-MON-RR';
LOB类型
内置的LOB数据类型包括BLOB、CLOB、NCLOB、BFILE(外部存储)的大型化和非结构化数据,如文本、图像、视屏、空间数据存储。BLOB、CLOB、NCLOB类型
CLOB 数据类型
它存储单字节和多字节字符数据。支持固定宽度和可变宽度的字符集。CLOB对象可以存储最多 (4 gigabytes-1) * (database block size) 大小的字符
NCLOB 数据类型
它存储UNICODE类型的数据,支持固定宽度和可变宽度的字符集,NCLOB对象可以存储最多(4 gigabytes-1) * (database block size)大小的文本数据。
BLOB 数据类型
它存储非结构化的二进制数据大对象,它可以被认为是没有字符集语义的比特流,一般是图像、声音、视频等文件。BLOB对象最多存储(4 gigabytes-1) * (database block size)的二进制数据。
BFILE 数据类型
二进制文件,存储在数据库外的系统文件,只读的,数据库会将该文件当二进制文件处理
LONG类型
它存储变长字符串,最多达2G的字符数据(2GB是指2千兆字节, 而不是2千兆字符),与VARCHAR2 或CHAR 类型一样,存储在LONG 类型中的文本要进行字符集转换。ORACLE建议开发中使用CLOB替代LONG类型。支持LONG 列只是为了保证向后兼容性。CLOB类型比LONG类型的限制要少得多。 LONG类型的限制如下:
-
一个表中只有一列可以为LONG型。
-
LONG列不能定义为主键或唯一约束,
-
不能建立索引.
-
LONG数据不能指定正则表达式。
-
函数或存储过程不能接受LONG数据类型的参数。
-
LONG列不能出现在WHERE子句或完整性约束(除了可能会出现NULL和NOT NULL约束)
数据转换
数据转换分为
-
隐式转换 varchar《==》number oracle数据库自动转换
-
显示转换 number《》character《》date
character 《==》 date
-
TO_CHAR(date[,fmt])
-
TO_DATE(ch[, fmt])
例:
SELECT
TO_CHAR( SYSDATE, 'dy' )
FROM
dual;
number《==》character
-
TO_CHAR(NUMBER[,fmt])
-
TO_NUMBER(expr[, fmt])
数字转换格式
格式 | 说明 |
---|---|
9 | 数字 |
0 | 零 |
$ | 美元符号 |
. | 小数点 |
, | 千位符 |
例子:
-- 查询员工的薪水:两位小数,千位符,本地货币
SELECT
TO_CHAR( sal, 'L9,999.99' )
FROM
emp;
-- ¥7,000.00
通用函数
函数 | 说明 |
---|---|
NVL(expr1, expr2) | 把列expr1的null值修改为expr2 |
NVL2(expr1, expr2, expr3) | 把列expr1的null值修改为expr2,不为null修改为expr3 |
NULLIF(expr1, expr2) | 判断expr1和expr2是否相等,相等返回null,反之返回expr2 |
COALESCE(expr1, ... exprn) | 从左到右找到第一个不为null的值 |
条件表达式
通用的
CAST expr WHEN comparison_expr1 THEN return_expr1
[WHEN comparison_expr1 THEN return_expr1
ELSE else_expr]
END
例子
SELECT
ename,
job,
sal 涨前,
CASE
job
WHEN '学生' THEN
sal + 100
WHEN '教师' THEN
sal + 800 ELSE sal + 50
END 张后
FROM
emp;
oracle自己的
DECODE(COLUMN,search, result [[,search, result]*, default]) oracle自己的
例子:
SELECT
ename,
job,
sal 涨前,
DECODE( JOB, '学生', sal + 100, '教师', sal + 800, sal + 50 ) 张后
FROM
emp;