Oracle 基础

安装

教程参考

https://jingyan.baidu.com/article/e8cdb32bfc273137052badeb.html

解决安装oracle变卡问题

https://jingyan.baidu.com/article/ca00d56c5aaf86e99eebcf24.html

主要用户

sys 数据库的超级管理员
system 数据库的普通管理员
scott 数据库的普通用户 默认密码trigger
sh  大数据用户

相关服务

oracle...TNSListener  数据库监听服务,远程客户端连接或者通过程序连接时需要开启该服务

数据库结构

用户集合
 -用户1
   -表集合
     -表1
     -表2
     -...
   -视图
     -...
   -实体化视图
     -...
   -函数
     -...
   -...
 -用户2
   -...
 -...

可以看出和mysql不同,没有数据库的概念,只有由用户和表组成

命令行使用

sqlplus是oracle专用的数据库交互式管理工具,在命令行中输入sqlplus,然后依次输入账号密码即可进入oracle命令行控制界面,或者直接输入sqlplus 用户名/密码即可登录,如果还要登录的用户需要添加管理员权限,那么在命令最后再加上as sysdba

sqlplus常用命令
查看当前登录用户
show user
切换用户
conn 用户名/密码 [as sysdba]
设置每行长度
set linesize 长度(建议300)

查看用:show linesize;

设置每页行数
set pagesize 行数(建议30)

查看用:show pagesize;

查看表结构
desc 表名
查看当前用户所有表
select table_name from user_tables;
查看所有用户
select username from dba_users;
查看所有数据对象
select * from tab;
使用记事本

可以使用命令:ed 文件名创建一个.sql文件的记事本并打开编写,然后再通过命令@文件名执行该文件里的命令,举例:

ed aaa
# 创建一个aaa.sql文件
# 写入命令...
@aaa
# 执行该文件中的命令
执行系统命令
host 系统命令

此时可以在sqlplus中运行系统自带的命令,如:host dir

单双引号问题

单引号

在oracle中单引号包着的表示字符串,区分大小写

双引号

双引号包着的表示拒绝编译的数据,如表名、字段名等,区分大小写

大小写问题

oracle默认会将所有代码变成大写,所以如下语句:

select * from abc;

那么就是从ABC表中查询数据,若表名就是abc,那么就会报错显示表或视图不存在,因此为了解决oracle这种小写自动转成大写的问题,主要有两种解决方法:

  1. 表名设置为全大写
  2. 给表名加上双引号(不能用单引号,单引号表示为字符串),如上面的命令就改成:select * from "abc",此时双引号包起来的字符是区分大小写的
更多参考

https://blog.csdn.net/u010574553/article/details/76271794

提醒

oracle中的大部分的sql语句、关键字和函数等基本都和mysql一样,但是其中也有些是属于oracle特有的,因此这里只列举一些oracle特有的内容,其他可以参考我的另一篇文章《Mysql SQL语句》:https://www.jianshu.com/p/801b3fe706f7

DDL

创建表
create table 用户名.表名
(
字段名 类型 [not null],
...
)
修改表名
rename 表名 to 新表名
添加字段
alter table 表名 add (字段名 类型)
修改字段
alter table 表名 modify (字段名 新类型)
删除字段
alter table 表名 drop (字段名)
复制表及数据
create table 新表名 as select * from 表名
删除表中数据
truncat table 表名
删除表
drop table 表名

DQL

基本格式:

select [distinct] * | 列名 [as] [列别名], 列名2 [as] [列别名2], ... from 表名 [表别名] [where] [条件] ...

其中:
1.distinct:表示删除重复数据
2.as:后面给显示的列取别名,也可以直接空格替代

常用关键字
minus

差集运算,取出两个查询结果当中仅左边查询存在的结果,例如查询1 minus 查询2,而查询1的结果是1,2,3,查询2的结果是1,2,4,那么由于只有3是仅查询1存在的,所以结果即为3。使用举例:

SELECT "name" from "user"
MINUS
SELECT "server" FROM "server"

要注意的是minus本身就会把重复的结果给过滤了

nowait

当进行更新语句时,若该数据正在封锁当中,当前的语句将会等待并报错,使用该关键字以后,则不会再进行等待

escape

可以将某个字符不转义,解释为普通字符,比如说要查询一个字符中间含有%的数据,那么可能会这样写:

select * from user where name like '%\%%'

这本来是没问题的,但是!!!假如你有幸在日式系统上尝试,就会发现反斜杠根本打不出来!!!输入\,最后出来的都是,所以sql语句自然而然地就变成了:

select * from user where name like '%¥%%'

这个时候escape关键字就派上用场了,只要在代码后面加上escape '¥',结果就能够成功匹配了

rownum

在oracle当中,由于没有limit关键字,所以对于取部分数据时,就需要用到rownum关键字,其实际上是一个隐藏的列,代表数据所在的行号,因此如果想输出前五条数据,那么就可以:

select * from ... where rownum <= 5

要注意的是对rownum只能用</<=比较符,所以假如想实现取m-n行的数据这样就可以用如minus来实现:

select * from ... where rownum<=n
minus
select * from ... where rownum
常用函数
trunc()

默认删除小数点后的数,可设置第二个参数,表示保留几位小数,使用举例:

SELECT trunc("cost",2) from "aaa"
# 保留两位小数
ltrim()/rtrim()

有两个参数,假设为x、y,意思是从左边/右边删除字符串x中的y字符串,例如ltrim("aab", 'a'),那么将变成brtrim("aab", 'a')将依旧是aab

substrb()

substr()一样是截取字符串,但是这个截取的是多字节字符

translate()

同样有三个参数,和replace一样是替换语句,但是replace是整个替换,而translate是单个单个依次替换,例如:replace(name, "abc", "123")的意思是把所有"abc"字符串替换成"123",而translate(name, "abc", "123")意思是依次把'a'替换成'1','b'替换成'2','c'替换成'3'(要注意的是例如translate("name", 'ab', 'bc'),那么a会先被替换成b,但是只有原来就是b的才会被替换成c)

add_months(x, y)

将日期x加上y个月,使用举例:

SELECT ADD_MONTHS(SYSDATE, 1) from "user"
months_between(x, y)

获取日期x减去y的月数

next_day(x, y)

获取日期x那天开始的周几的日期,其中1代表周日,2代表周1,3代表周二,以此类推...,所以y的范围为1-7,假如今天是3-1日周五,那么next_day(今天, 1)则是当周日的日期,即3-3;next_day(今天, 6)是周五,即3-8;next_day(今天, 7)是周六,即3-2

to_char()

将内容转换成字符串

to_number(x, format)

将内容按规定格式转换成数字,若省略则按默认格式转换

to_date(x, format)

将字符串以规定的格式转换成日期,使用举例:

SELECT to_date('2019-03-26 16:32:12', 'yyyy-mm-dd hh24:mi:ss') from "user"
nvl(x, y)

若x为空值,则用y来替代

decode(x, y1, z1, y2, z2, ..., default)

相当于if-else的意思,比如上面的参数就可以理解为查询x,若x=y1,那么返回z1,若x=y2,则返回z2,...如果都不是,则返回default,default若不设置,默认为null。使用举例:

SELECT decode("name", 'aaa', 1, 0) from "user"
# 若name=aaa则返回1,否则返回0
SELECT decode("name", 'aaa', 1, 'bbb', 2, 3) from "user"
# 若name=aaa则返回1,name=bbb则返回2,否则返回3

常用优化

1.一般情况下
  • where中处理量大的条件写在后方
  • 避免使用*
  • 用exists代替in,用in代替or
  • 多用索引
  • 用union all代替union
2.使用索引时
  • 别用not
  • 避免用计算
  • 避免使用null判断
  • 避免改变索引列类型
3.多表查询时
  • 记录越少的表放在越后面
  • 尽量对每个列都设置别名

你可能感兴趣的:(Oracle 基础)