Oracle 助记

2022-12-10,


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

Oracle 助记的相关教程结束。

《Oracle 助记.doc》

下载本文的Word格式文档,以方便收藏与打印。