Oracle_SQL_day01_数据库基础

emp: 职员表
empno 员工号
ename 员工姓名
job 工作
mgr 上级编号
hiredate 受雇日期
sal 薪金
comm 佣金
deptno 部门编号
dept: 部门表
salgrade: 薪水等级表
以上表格均为Oracle自带表格,字段,数据基本上均相同!Oracle下载连接[http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html],博主的版本为 Oracle Database 11g Release 2下面的Microsoft Windows (x64) ,其中下载部分分为两部分,两部分都要下载完哦!

具体安装过程如下连接[https://jingyan.baidu.com/article/363872eccfb9266e4aa16f5d.html]

Day_01
一数据类型:
字符类型:char(n) / varchar2(n) 推荐 n为制定字符串最大长度,当超过最大长度时会引起报错,以及数据丢失。
Varchar
数字类型:number(p,s)最长p位,小数点后s位
number(7,2) 99999.99
number(5) 99999
number 随便

日期:date
一个date对象+n,结果返回一个距离初始值n天以后的日期值。
2016/7/8+1 -->2016/7/9

二.SQL语句

select * from emp;  选取所有列
select * from emp for update;达到解锁的目的,用于表的修改,Oracle中不得随意修改

1.列的选取(或称为投影)

select ename, sal, comm from emp;
处理空值的函数nvl(column_name,value)
能够把column_name列的null值修改为自己想要的值

连接字符串||,把两列的值进行拼接。
格式 :
Select columnA || columnB form table;得到A列和B列的拼接

2.对行进行选取
where条件的使用,这样可以选取一定的行数。

distinct 关键字
避免有重复行,查询一些特殊需求的时候会出现很多重复行

between, in,like ,is NULL 关键字
between
in
like
is null
not

3通配符 like
_ 通配符,一个字符
% 任何字符
从table查询columnA带有 A的行

Select columnA form  table where column like ‘A%’

第二个为A则为

Select columnA form  table where column like ‘_A%’

含有A则为:

Select columnA form  table where column like ‘%A%’

like短语中特殊字符的处理: escape
一个字符串中无法避免使用者使用了一些特殊的符号,比如@,_,%这样的,但是我们使用在like句子中的时候,会被认为是通配符,因此引入了escape。

select  columnA  from  emp  where ename like 'A\_%' escape '\';--这样,\_表示的值为_

逻辑运算 not,and,or
逻辑运算涉及到逻辑运算问题,or的运算优先级比and低,not的运算优先级在三者间最高
where (A and B) or C; 先算了括号内的部分,正常情况下我们没有写括号就会得到不同的运算逻辑
where A and (B or C);

排序:
--升序 ASC
--倒序,降序 desc

单行函数 ,虚表dual(Oracle特有的)

字符函数
upper / lower / initcap / substr / length / lpad / rpad / replace / trim

函数解析:
upper/lower函数:
返回一个大写字母的char类型,字符型接受datatypes CHAR, VARCHAR2, NCHAR, NVARCHAR2, CLOB, or NCLOB.其结果返回值仍然为char类型.
格式:

select upper(str) from dual.
select lower(str) from dual.

Initcap函数:
initcap返回字符串中的每个单词首字母大写,其他字母小写。单词是由空格或字符,不是字母分隔。
字符可以是任意的数据类型char、nchar或VARCHAR2类型。返回值类型为char一样。
注:
此功能不直接支持CLOB数据。然而,CLOB可作为参数传入通过隐式数据转换。请参阅更多信息的数据类型比较规则”。字符可以是任意的数据类型char、nchar、或VARCHAR2类型。
格式:
select initcap(columnA) from dual.

EX:

SELECT INITCAP('the soap') "Capitals" FROM DUAL; 


Capitals
---------
The Soap

substr()函数:以及其他的subsstrb,substrc,substr2
substr(‘str’,pos,length) 把字符串str,或者某一列的值从pos位置开始,返回length长度的字符串.
“子字符串”函数返回字符串的一部分,从字符位置开始,子字符串长度字符长。SUBSTR用输入字符集定义的字符来计算长度。SUBSTRB使用字节而不是字符。SUBSTRC使用Unicode的完整字符。SUBSTR2使用UCS2 codepoints。SUBSTR4使用UCS4 codepoints。
如果位置为0,则将其视为1。
如果位置是正的,那么Oracle从字符串的开始就可以找到第一个字符。
如果位置为负,则Oracle从字符串的末尾向前计数。’ABCD’,当pos为-2时,即从C开始
如果省略了子字符串长度,那么Oracle会将所有字符返回到字符串的末尾。如果子字符串长度小于1,则返回null。
字符串可以是任何数据类型的CHAR、VARCHAR2、NCHAR、NVARCHAR2、CLOB或NCLOB。返回值是与字符串相同的数据类型。作为SUBSTR的参数传递的浮点数被自动转换为整数。

SELECT SUBSTR('ABCDEFG',3,4) "Substring"
     FROM DUAL;
Substring
---------
CDEF

SELECT SUBSTR('ABCDEFG',-5,4) "Substring"
     FROM DUAL;
Substring
---------
CDEF

length()函数:
LENGTH(string1) 返回以字符为单位的长度.
LENGTHB(string1) 返回以字节为单位的长度.
LENGTHC(string1) 返回以Unicode完全字符为单位的长度.
LENGTH2(string1) 返回以UCS2代码点为单位的长度.
LENGTH4(string1) 返回以UCS4代码点为单位的长度
.char可以是任何数据类型的char、VARCHAR2、NCHAR、NVARCHAR2、CLOB或NCLOB。返回值是数据类型的。如果char有数据类型字符,那么长度就包含了所有的末尾空格。如果char是null,那么这个函数返回null。

lpad()/rpad()函数:
lpad( string, padded_length, [ pad_string ] )
string
准备被填充的字符串;
padded_length
填充之后的字符串长度,也就是该函数返回的字符串长度,如果这个数量比原字符串的长度要短,lpad函数将会把字符串截取成从左到右的n个字符;
pad_string
填充字符串,是个可选参数,这个字符串是要粘贴到string的左边,如果这个参数未写,lpad函数将会在string的左边粘贴空格。

translate
语法:TRANSLATE(char, from, to)
用法:返回将出现在from中的每个字符替换为to中的相应字符以后的字符串。若from比to字符串长,那么在from中比to中多出的字符将会被删除。
三个参数中有一个是空,返回值也将是空值。
举例:SQL> select translate('abcdefga','abc','wo') 返回值 from dual;
返回值
-------
wodefgw
分析:该语句要将'abcdefga'中的'abc'转换为'wo',
由于'abc'中'a'对应'wo'中的'w',
故将'abcdefga'中的'a'全部转换成'w';
而'abc'中'b'对应'wo'中的'o',
故将'abcdefga'中的'b'全部转换成'o';
'abc'中的'c'在'wo'中没有与之对应的字符,
故将'abcdefga'中的'c'全部删除;
简单说来,就是将from中的字符转换为to中与之位置对应的字符,
若to中找不到与之对应的字符,返回值中的该字符将会被删除。
在实际的业务中,可以用来删除一些异常数据,
比如表a中的一个字段t_no表示电话号码,
而电话号码本身应该是一个由数字组成的字符串,
为了删除那些含有非数字的异常数据,
就用到了translate函数:
replace
语法:REPLACE(char, search_string,replacement_string)
用法:将char中的字符串search_string全部转换为字符串replacement_string。
举例:SQL> select REPLACE('fgsgswsgs', 'fk' ,'j') 返回值 from dual;
返回值
---------
fgsgswsgs
SQL> select REPLACE('fgsgswsgs', 'sg' ,'eeerrrttt') 返回值 from dual;
返回值
fgeeerrrtttsweeerrrttts
分析:第一个例子中由于'fgsgswsgs'中没有与'fk'匹配的字符串,
故返回值仍然是'fgsgswsgs';
第二个例子中将'fgsgswsgs'中的字符串'sg'全部转换为'eeerrrttt'。
总结:综上所述,replace与translate都是替代函数,
只不过replace针对的是字符串,而translate针对的是单个字符。
Trim函数:

TRIM([ { { LEADING | TRAILING | BOTH }
         [ trim_character ]
       | trim_character
       }
       FROM 
     ]
     trim_source
    )

参数解释:
leading 开头字符
trailing 结尾字符
both 开头和结尾字符
trim_character 去除的字符
trim_source 修剪源
详细用法见:
http://blog.csdn.net/indexman/article/details/7748766

数字函数 (了解)
round / trunc / mod

round函数:
number 待做截取处理的数值
round(number,x)x代表小数位数,取0代表整数,结果会自动四舍五入,取-1,代表精确到10位,,-2精确到百位。

Trunc函数:
对 number 类型使用。其工作机制与ROUND函数极为类似,只是该函数不对指定小数前或后的部分做相应舍入选择处理,而统统截去。
对日期类型使用。
http://blog.csdn.net/oscar999/article/details/16839417

日期类型
取系统时间: sysdate(Oracle独有的函数)
日期 +/- n = n天以后/前
--to_char是转换函数,将日期转换为字符类型

select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual;
结果:2017-09-21 11:45:21
select to_char(sysdate,'year month dd day d hh12 am') from dual;
结果:twenty seventeen 9月  21 星期四 5 11 上午
select to_char(sysdate, 'yyyy"年"mm"月"dd"日"') from dual;
结果:2017年09月21日

yyyy:用数字表达的四位年(2009年)
mm:用数字表达的二位月(01月)
dd:用数字表达的二位日(01日)
hh24:用数字表达的24进制的小时(20点)
h12:用数字表达的12进制的小时(8点)
mi:用数字表达的分钟(30分)
ss:用数字表达的小时(30秒)
d:用数字表达的一周内的第几天(周日:1)
day:用全拼表达的星期几(sunday)
month:用全拼表达的月(march)

select sysdate from dual;
结果:2017/9/21 11:46:16

默认的日期格式是: DD-Mon-RR
months_between
add_months

select next_day(to_date('2017-9-21','yyyy-mm-dd'), 6) from dual;
结果:2017/9/22  
next_day(sysdate, 6) --下一个周五
next_day(sysdate,'FRI') --下个周五
next_day(sysdate,'星期五')--下个周五

我对next_day的理解为最近的一个周几,本周没过,那么next_day即将取本周的,否则取下周的。
last_day的用法同Next_day。
组函数 (聚合函数)
AVG(DISTINCT|ALL|n) 平均数
SUM(DISTINCT|ALL|n) 求和
COUNT(DISTINCT|ALL|expr|*) 记数
MAX(DISTINCT|ALL|expr) 最大值
MIN(DISTINCT|ALL|expr) 最小值
这写函数多数在分组了以后开始使用。

用ORDER BY子句对查询出来的结果集进行排序

ASC——升序,缺省
DESC——降序
ORDER BY是SELECT语句中最后一个子句

SELECT ename, deptno, hiredate
FROM  emp
ORDER BY ename;

ORDER BY后面可以跟列名、表达式、别名、位置

SELECT ename as name , deptno, hiredate
FROM  emp
ORDER BY name;
SELECT ename, sal * 12
FROM  emp
ORDER BY 2;

Null值在排序中的显示
升序显示在最后
降序显示在最前面
先按deptno升序,再按sal降序排序
ORDER BY后面的列可以不出现在SELECT后面

 SELECT ename, deptno, sal
FROM  emp
ORDER BY deptno ASC, sal DESC;

你可能感兴趣的:(Oracle_SQL_day01_数据库基础)