Sql用户操作
登录
sqlplus
是oracle自带的工具,可以使用其命令登录到oracle数据中,并执行用户编写的sql语句。
如果在cmd命令中出提示没有sqlplus命令,那就说明oracle环境变量没有配置好。
使用sqlplus中,使用指定账号,登录到oracle数据库中
sqlplus 用户名/密码
// 普通用户登录
sqlplus jd2010/密码
// 管理员登录
sqlplus system/root
//使用DBA的身份登录,这种情况不需要密码,但是这种情况需要当操作系统的用户有权限才行
sqlplus "/as sysdba"
查看当前登录用户
show user
清屏操作、退出
// Windows系统中
$CLS
$cls
// Ubuntu系统
!clear
// 退出
exit
会话
会话也就是当前得控制台,开启两个sql控制台就是两个不相同得会话
登录成功,当前默认会话得语言是中文,可以通过命令修改当前会话的语言环境,例如将当前会话修改成英文环境
alter session set nls_language=english;
用户
我们可以通过使用管理员账号登录后创建一个用户,并设置密码以及授权
// 创建用户jd2010,设置密码root
create user jd2010 identified by root;
// 将连接数据库权限和资源管理权限授权
grant connect,resource to jd2010;
切换用户
conn 用户名/密码
删除用户
drop user jd2010 cascade;
导入
-
s_region
,区域表:
字段名 | 是否为空 | 数据类型 | 备注 |
---|---|---|---|
id | N | NUMBER | 主键,区域编号 |
name | N | VARCHER2 | 区域名称 |
-
s_dept
,部门表:
字段名 | 是否为空 | 数据类型 | 备注 |
---|---|---|---|
id | N | NUMBER | 主键,区域编号 |
name | N | VARCHER2 | 区域名称 |
region_id | Y | NUMBER | 外键,部门所属的区域的id |
-
s_emp
, 员工表:
字段名 | 是否为空 | 数据类型 | 备注 |
---|---|---|---|
ID | N | NUMBER | 主键,员工编号 |
LAST_NAME | N | VARCHER2 | lastName |
FIRST_NAME | Y | VARCHER2 | firstName |
USERID | Y | VARCHER2 | 内部编号 |
START_DATE | Y | DATE | 入职时间 |
COMMENTS | Y | VARCHER2 | 备注 |
MANAGER_ID | Y | NUMBER | 外键,对应的经理id |
TITLE | Y | VARCHER2 | 职位 |
DEPT_ID | Y | NUMBER | 外键,对应的部门id |
SALARY | Y | NUMBER | 工资 |
COMMISSION_PCT | Y | NUMBER | 提成比例 |
// 导入sql文件命令 @
@文件路径
@table.sql
查看表结构
desc 表名
Sql表操作
sql语句的分类:
-
DQL (Data Query Language),数据查询语言
用于检索数据库中的数据,主要是SELECT语句
-
DML (Data Manipulation Language),数据操纵语言
用于改变数据库中的数据,主要是
INSERT,UPDATE,DELETE
语句 -
DDL(Data Define Langage),数据定义语言
用来建立、修改、删除数据库对象,主要是
CREATE、ALTER、DROP、TRUNCATE
语句 -
TCL (Transaction Control Language),事务控制语言
用于维护数据的一致性,主要是
COMMIT,ROLLBACK,SAVEPOINT
语句 -
DCL(Data Control Language),数据控制功能
用于执行权限授予和权限收回操作,主要是
GRANT,REVOKE
语句
注意:DML语句需要事务的支持(产生事务),DDL语句会自动提交事务
sql、sqlplus、pl/sql的区别:
- sql,结构化的查询语句,操作关系型数据库的语言。
- sqlplus,oracle数据库软件自带工具,可以接收用户输入的sql语句,然后将sql执行结果显示出来。
- pl/sql,程序化的sql语句,在sql语句的基础上加入一定的逻辑操作,如if for等。
Select
注意,oracle中的表名、列名(字段名)、SQL语句等是不区分大小写的(大小写不敏感)
select语法:
select [distinct] *{col_name1,col_name2,..} from 表名;
- []表示该部分可有可无。
- *号表示所有列,不推荐写*。
- col_name1,col_name2代表列名,如果有多个可以逗号分开。
运算
注意,select语句永远不会对原始数据进行修改
例如,查看每个员工的员工id,名字和月薪涨100以后的年薪
select id,last_name,(salary+100)*12 from s_emp
别名
select old_column [as] new_column_name from tb_name;
可以不使用as,通过空格就可以起别名
拼接
语法:
select col_name||'需要拼接的字符'||col_name from tb_name
注意,数据库中的字符串,需要使用单引号括起来
nvl
使用nvl函数可以将null进行替换
语法
select nvl(col_name,change_value) from tb_name;
nvl(需要替换的列,将null改变的值)
distinct
该关键字可以将重复数据去除。
select distinct col_name,col_name from tb_name;
注意,distinct关键词只能放在select关键词后面,如果distinct关键词后面如果出现多列,表示多列联合去重,即多列的值都相同的时候才会认为是重复的记录。
sqlplus
使用 sqlplus
登录之后,可以使用buff(缓存)来存储/执行/修改上一条运行的sql语句 。
- buff中只能存储一条sql语句,但是这条sql语句可能有很多行
- 每次放入新的sql语句,会把之前的覆盖掉
- 每次执行sql语句,都会把这个sql语句放到buff里面
sqlplus
相关的命令:
- l 查看缓存中的sql语句
- a 在[定位]的那一行后面追加新的内容
- i 在[定位]的那一行下面插入新的一行
- c 替换[定位]的那一行中的某些字符串 ,格式为:c/老的字符串/新的字符串
- del 删除[定位]的那一行内容
- n 后面加内容可以重写这一行
- cls清屏,linux中使用!
- / 执行缓存sql命令
注意:使用 l 命令查看buff中的sql后,可以直接输入行数,然后回车,这就是定位到了这一行。
如果要清空buff中的sql:
clear buffer
其他的一些命令:
save test.sql //buff中的sql语句保存在 test.sql 文件中
get test.sql //把 test.sql 中的内容加载到buff中,但是没有运行
start test.sql //把 test.sql 中的内容加载到buff中并且执行
@test.sql //把 test.sql 中的内容加载到buff中并且执行
edit file_name //使用系统默认编辑器去编辑文件
12345
spool命令
:可以记录操作的过程
spool file_name //将接下来的sql 语句以及 sql的运行结果保存到文件中
sql1
result1
sql2
result2
...
spool off //关闭pool功能
排序
语法:
select col_name,...
from tb_name
orderby col_name [asc|desc]
默认排序为升序也就是asc,可以不用加,但是如果想要降序那么说就必须加desc,如果有多个列排序,后面的列排序的前提是前面的列排好序以后有重复(相同)的值。
条件查询
select col_name,...
from tb_name
where col_name 比较操作表达式
注意:
- 限制查询条件,使用where子句
- 条件可以多个,使用逻辑操作符或者小括号进行条件的逻辑整合
- where子句的优先级别最高
- 比较操作表达式由操作符和值组成
-
逻辑比较操作符
= > < >= <= !=
-
不等于操作符,以下三个都表示不等于的意思,经常用的是
!=
!= <> ^=
between and
between and
操作符,表示在俩个值之间
查看员工工资在700 到 1500之间的员工id和名字
select id,last_name,salary
from s_emp
where salary between 700 and 1500;
in
in():表示值在一个指定的列表中
查看员工号1,3,5,7,9员工的工资
select id,last_name,salary
from s_emp
where id in (1,3,5,7,9);
like
模糊查询,在值不精确的时候使用
注意:在数据量比较大的表中尽量少用like
oracle instr函数(oracle 用instr 来代替 like)
-
%
,通配 0 到多个字符 -
_
,通配一个字符,并且是一定要有一个字符 -
\
,转义字符,需要使用 escape 关键字指定,转义字符只能转义后面的一个字符
例如:
--查看员工名字以C字母开头的员工的id,工资
select id,last_name,salary
from s_emp
where last_name like 'C%';
1234
注意:数据库中的字符串,需要使用 单引号 括起来
例如:
查看员工名字长度不小于 5 ,且第四个字母为n字母的员工id和工资
select id, last_name,salary
from s_emp
where last_name like '%\_%' escape '\';
is null
判断值为null的时候使用,null值的判断不能使用等号
例如:
--查看员工提成为为空的员工的id和名字
select id,last_name,commission_pct
from s_emp
where commission_pct is null;
1234
注意:类似的,还有
is not null
and、or
逻辑操作符,当条件有多个的时候可以使用
注意:
and
比or
的优先级要高
例如:
查看员工部门id为 41 且职位名称为Stock Clerk(存库管理员)的员工id和名字
select id,last_name,dept_id,title
from s_emp
where
dept_id = 41
and
title = 'Stock Clerk';
查看员工部门为 41 或者 44 号部门,且工资大于 1000 的员工id和名字
select id,last_name,dept_id,title
from s_emp
where
salary > 1000
and
( dept_id = 41
or
dept_id = 44
);
例如,查看员工部门为 41 且工资大于 1000 ,或者 44 号部门的员工id和名字
select id,last_name,dept_id,title
from s_emp
where
salary > 1000
and
dept_id = 41
or
dept_id = 44;
注意:以上俩个sql语句,执行的结果是不一样的,它们的区别就是第一个sql在条件中多了个小括号