title: Oracle 助记
Nothing is impossible!
基础操作
$ sqlplus name/pssword; # 登录数据库
$ create user username identified by password; # 创建用户
$ grant resource,connect to username; # 授权
$ show user; # 显示当前用户
$ alter session set nls_language=english; # 设置用户语言为English
$
SQLPLUS客户端工具中的命令
$ describe # 获取表的结构信息(列名、非空约束、数据类型)
$ number(p,s) # 查看数值类型; p:有效位数,s:小数点后的取值位数
$ char(s) # 定长字符串
$ varchar(s) # 变长字符串,所有关系数据库通用
$ varchar2(s) # 变长字符串,oracle公司定义
$ date # 日期;包含年月日小时分秒等信息
$ save D:\oracle\my.sql # 将缓冲区内容写入文件
$ start D:\oracle\my.sql # 执行sql脚本,并将内容写入缓冲区
$ @ # 功能同start
$ exit # 退出sqlplus工具
查询行
## 基本查询
$ select last_name,salary from s_emp;
/* # 命令可以在一行也可以在多行
* # 使用缩进增加可读性
* # 不允许使用缩写或分割单词
* # 命令不区分大小写
* # 命令会写入SQL缓冲区 l: list,查看缓冲区; /: 执行缓冲区
*/
$ select * from s_dept; # *表示所有的列,可读性差、效率低
$ select last_name,salary*12 from s_emp; # 数值和日期类型可以进行算术运算
/* # 优先级:
* # 乘除大于加减
* # 相同优先级从左向右计算
* # 通过小括号改变优先级顺序
* 下面是例子:
*/
$ select last_name,salary*12+500 from s_emp;
$ select last_name,(salary+500)*12 from s_emp;
/* # 可以给列表头取别名
* # as关键字可以省略
* # 别名中有空格、特殊字符、大小写敏感,需要用双引号
* 下面是例子:
*/
$ select last_name,(salary+500)*12 as total from s_emp;
$ select last_name,(salary+500)*12 total from s_emp;
$ select last_name,(salary+500)*12 "total salary" from s_emp;
$ select last_name,(salary+500)*12 "total" from s_emp;
/* # 可以通过||将多个列或字符串常量连接在一起
* # Oracle字符串常量用单引号
* # 连接后的内容可以取别名
* 下面是例子:
*/
$ select last_name,first_name,salary from s_emp;
$ select last_name||first_name as name,salary from s_emp;
$ select last_name||'-'||first_name name,salary from s_emp;
/* # Oracle中空值用null表示,但打印的报表中什么都不显示
* # 空值无法进行比较(null==0,null==’’,null==null)
* # 算术表达式中有空值参与运算,整体表达式的结果为空
* # nvl函数可以将空值用指定值来替代
* # nvl两个参数的数据类型必须匹配
* 下面是例子:
*/
$ select last_name,salary,title,commission_pct from s_emp;
# 计算员工一年可以领到的总工资(销售人员的提成工资以基本工资为基数)
$ select last_name,title,salary*(1+commission_pct/100)*12 total from s_emp;
$ select last_name,title,salary*(1+nvl(commission_pct,0)/100)*12 total from s_emp;
/* # 去除重复的行
* # 查询语句中没有函数的情况下,
* # select语句中distinct关键字要紧跟在select关键字的后面,
* # 表示select后所有列的组合不重复
* 下面是例子
*/
$ select name from s_dept;
$ select distinct name from s_dept;
$ select distinct dept_id,title from s_emp;
排序和限制查询行
Order by
/* order by排序
* # asc,升序排列,默认取值
* # desc,降序排列
* # order by是select命令的最后一个子句
* 下面是例子
*/
$ select last_name,salary,dept_id from s_emp order by salary;
$ select last_name,salary,dept_id from s_emp order by salary asc;
$ select last_name,salary,dept_id from s_emp order by salary desc
/* order by中null值处理
* # 升序中,放最后
* # 降序中,放最前
* 下面是例子
*/
$ select last_name,title,commission_pct from s_emp order by commission_pct;
/* order by后可跟内容
* # 列名
* # 列的别名
* # 数字:select列表项的位置
* 下面是例子
*/
$ select last_name name,salary from s_emp order by name;
$ select last_name,salary*12 from s_emp order by 2;
/* order by后跟多列
* # 先按第一个列排序,内容相同的,再按照第二个列排...
* # asc、desc只修饰一个列
* 下面是例子
*/
$ select last_name,dept_id,salary from s_emp order by dept_id,salary desc;
$ select last_name,dept_id,salary from s_emp order by dept_id asc,salary desc;
# 注意上面两个语句等价
Where
/* where比较中的字符串常量严格区别大小写
* 下面是例子
*/
$ select last_name,salary,dept_id from s_emp where dept_id=42;
$ SELECT LAST_NAME,SALARY,DEPT_ID FROM S_EMP WHERE DEPT_ID=42;
$ select last_name,salary,dept_id from s_emp where last_name='smith';
/* between...and...:闭区间;先跟小值,再跟大值
* 下面是例子
*/
$ select last_name,salary from s_emp where salary between 940 and 1100;
$ select last_name,salary from s_emp where salary between 1100 and 940;
/* in:从给定的列表范围内匹配值
* 下面是例子
*/
$ select last_name,salary,dept_id from s_emp where dept_id in(41,43,45);
/* like:模糊查询
* # 通配符:%代表0或多个字符 _ 代表单一字符
* 下面是例子
*/
$ select last_name,salary from s_emp where last_name like 'M%';
# escape自定义转义字符,可以让统配符失去特殊意义,变成普通字符查出名字以_a开始的
$ select last_name,salary from s_emp where last_name like '\_a%' escape '\';
/* is null:空值判断
* # 空值不能用等号进行比较
* 下面是例子
*/
$ select last_name,salary,title,commission_pct from s_emp where commission_pct=null;
$ select last_name,salary,title,commission_pct from s_emp where commission_pct is null;
/* 多条件查询
* # and:多个条件必须同时满足
* # or:多个条件选一个
* # and的优先级比or高
* 下面是例子
*/
$ select last_name,salary,dept_id from s_emp where salary>=1000 and dept_id=44 or dept_id=42;
# 等价于
$ select last_name,salary,dept_id from s_emp where (salary>=1000 and dept_id=44) or dept_id=42;
单行函数
$ lower # 字符串转换成小写
$ upper # 字符串转换成大写
$ initcap # 字符串单词首字母大写,其它字符小写
$ concat # 字符串拼接,类似||
$ substr # 取子串,参数(原始字符串,开始位置1开始,取的字符数)
$ length # 字符串长度
$ round(1,2) # 对数值进行四舍五入
$ trunc(1,2) # 对数值进行截断,不会进位
$ mod # 取余数
//下面是例子
# 查询名字后两个字符
$ select substr(last_name,length(last_name)-1,2) subname from s_emp;
$ select last_name,salary,dept_id from s_emp where lower(last_name)='smith';
# 如果第二个参数为负数,表示将小数点虚拟左移相应位数,然后将虚拟小数点后一位进行四舍五入,最后将虚拟小数点后全部清零
$ select round(55.923,-2) from dual;
日期处理
$ select last_name,start_date from s_emp; # 查看当前系统时间
$ select sysdate from dual; desc dual # dual里面只有一个dummy列,称为“哑表”,经常用来做函数测试使用, sysdate,实际上是一个没有参数的函数
$ select systimestamp from dual; # systimestamp:时间戳,时间信息更全面
$ select rownum,last_name,salary from s_emp; # rownum:行号
$ select last_name,salary from s_emp where rownum=1; # 查询表中第一行数据
$ select last_name,salary from s_emp where rownum<=10; # 查询表中前十行数据
$ select last_name,salary from s_emp where rownum=2;//Error
$ select last_name,salary from s_emp where rownum between 11 and 20;//Error
# <、<=无限制
# =、>=只对1有意义
# >无意义
$ select rownum,rowid,last_name,salary from s_emp; # rowid:行地址
# 到今天为止员工入职的天数
$ select last_name,start_date,sysdate-start_date days from s_emp;
$ select sysdate+10 from dual;
$ select sysdate+1/24 from dual;
$ months_between # 两个日期之间相差多少个月
$ add_months(‘15-MAY-95’,6) # 15-MAY-95往后推6个月的日期作为返回值
$ next_day(‘15-MAY-95’,’FRIDAY’) # 15-MAY-95后面离得最近的星期五的日期作为返回值
$ last_day(‘15-MAY-95’) # 15-MAY-95这个月的最后一天的日期作为返回值
$ round # 对日期进行进位或舍位
# 第二个参数为month,表示对天向月进行进位或舍位,逢16进1
# 第二个参数为year,表示对月向年进行进位或舍位,逢7进1
$ select round(to_date('16-MAY-95','DD-MON-YY'),'month') from dual;
$ select round(to_date('16-JUL-95','DD-MON-YY'),'year') from dual;
$ trunc # 对日期进行舍位
$ to_char(date/number,’fmt’) # 将数值类型、日期类型转换为字符串类型,第二个参数格式,要用单引号引起来,格式区分大小写
# 日期格式双引号中的内容会原样输出
$ select to_char(sysdate,'fmYYYYMMDD HH24:MI:SS AM "YYYYMMDD"') from dual;
$ select to_char(sysdate,'YEAR-Month-ddsp ddspth:DAY:dy D=DDD') from dual;
$ to_number # 将字符串类型转换为数值类型
select to_number('100') from dual;
$ to_date # 将字符串类型转换为日期类型
$ select round(to_date('16-MAY-95','DD-MON-YY'),'month') from dual;
# 单行函数可以嵌套使用,从内向外进行计算
Others
$ Data retrieval # 数据获取 eg: SELECT
$ Data manipulation language (DML) # 数据操作语言,对表中数据内容进行修改 eg: INSERT, UPDATE, DELETE
$ Data definition language (DDL) # 数据定义语言,对数据库对象结构进行修改 eg: CREATE, ALTER, DROP, RENAME, TRUNCATE
$ Transaction control # 事务控制,对事务进行操作 eg: COMMIT, ROLLBACK, SAVEPOINT(设置事务回滚点)
$ Data control language (DCL) # 数据控制语言,分配与收回权限 eg: GRANT, REVOKE