- Sql基础
- 过滤和排序
- Where字句过滤多条件过滤
- And,or
- 比较符
- > 大于
- >= 大于等于
- < 小于
- <= 小于等于
- <>:不等于
- !=:不等于
- IS NULL:是否为空值
- IS NOT NULL:不为空值
- NOT:条件为FALSE时返回TRUE
- BETWEEN x AND y:大于等于X,小于等于Y
- IN (集合):在这个集合中,或者讲在这个列表中
- NOT IN(集合):不在这个集合中,或者讲不在这个列表中
- LIKE:使用LIKE操作符来执行有效搜索字符串数值的通配符搜索
- %:通配任意字符
- _:能配单个字符
- 日期和字符串处理
- Order by 排序
-------自己具体实现
- SELECT查询
- Select结构化查询语言
- DDL:数据定义语言
- DCL:数据控制语言
- DQL:数据查询语言
- DML:数据操纵语言
- sql的 特点
- 语句不区分大小写
- Sql输入可以是1行或者多行,已分号结尾
- 关键字无法整行缩写或者分离
- 子句通常放在分开的行上
- 缩进可提高可读性
- 每个sql用分号结尾(英文分号)
- SQL*PLUS特征
- 字符日期左对齐
- 数字右对齐
- 列名默认大写
- Sql plus自己的命令不需要用分号结尾
- Sql查询时,数字和日期可用算术运算符
+ - * / ( )
- 空值
- 用NULL表示
- 与算术运算符运算时为null
- Null不与任何值相等
- 为空:is null
- 不为空:is not null
- Asc时null在最后,desc时null在最前
- 相关函数
- Nvl(表达式1,表达式2),测试表达式的值,如果表达式1为空,则返回表达式2的值;不为空,返回表达式1的值。
- nvl2(表达式1,表达式2,表达式3)测试表达式的值,表达式1不为空,返回表达式2的值,如果为空,则返回表达式3的值。
- nullif相等为空:nullif(表达式1,表达式2)比较表达式1和表达式2的值,如果两个相等则返回为空,否则返回表达式1的值。
- coalesce找非空:coalesce(表达式1,表达式2,表达式3…表达式n)返回第一个不为空的值,如果所有的都为空,则返回NULL。
- 常用函数
- 函数分类
- 单行函数:基于单行的处理,一行产生一个结果
- 多行函数:基于多行的处理,对多行进行汇总,多行产生结果
- 函数形式:
Function_name [(arg1,arg2,…)]
- 常用的单行函数
- 字符函数
- lower(x) 转小写
- upper(x) 转大写
- initcap(x) 首字母转大写
- concat(x,y)字符链接,与||功能类似
- substr(x,start [,length])取子串
- length(x)取字符串长度
- lpad | rpad(x,width [,pad_string])字符定长,不够的话左 | 右填充
- trim(‘x’ from ‘xxx’)删除首尾字符串
- trim(leading ‘x’ from ‘xxx’)只删首部
- trim(trailinhg ‘x’ from ‘xxx’)只删尾部
- ltrim(x[,trim_string])从x右边删除字符串,等价于使用trailing
- rtrim(x[,trim_string])从x左边删除字符串,等价于使用leading
- instr 返回字符在字符串中的位置instr(x,seach_string,substring,position,occurence)
- replace(x,seach_string,replace_string,)字符替换
- 数值函数
- round(x,[,y])四舍五入
- trunc(x,[,y])截断
- mod(n,m)求余
- ceil(x)返回特定的最小数(大于等于x的最小整数)
- floor(x)返回特定的最大值(小于等于x的最大整数)
- 日期函数:
- sysdate 返回系统当前日期
- 字符函数
实际上ORACLE内部存储日期的格式是:世纪,年,月,日,小,分钟,秒。
不管如何输入都这样
9i开始,默认的日期格式是:DD-MON-RR,之前是DD-MON-YY
RR 和YY 都是世纪后的两位,但有区别
ORACLE的有效日期范围是:公元前年月日-年月日
RR日期格式:
- 如果当前年份最后两位是:-,并且指定年份的最后两位也为-,
则返回本世纪
例:当前年:, 01--,表示2008 年
2、如果当前年份最后两位是:-,指定年份最后两位为50-
则返回上世纪。
例:当前年:,01--,表示1998
3、如果当前年最后两位为:-,指定年份最后两位为0-,
则返回下世纪。
例:当前年:,--表示的是年
4、如果当前年最后两位是:-,指定年份最后两位为:-
则返回本世纪。
例:当前年:,--表示的是年
-
-
- months_between(x,y) 两个日期之间相差的月数
-
例:查询最近个月入职的员工
-
-
- add_months(x,y) 返回x上加上y个月后的结果
- last_day(x) 返回指定日期所在月最后一天的日期
- next_day(x,day) 返回指定日期的下一day的时间值,day是一个文本串,比如SATURDAY
- extract 提取日期
-
select extract(day from sysdate) from dual
select extract(month from sysdate) from dual;
select extract(year from sysdate) from dual;
-
- 转换函数:
- TO_DATE(char[, 'format_model']) TO_DATE函数将一个字符串转换成日期格式
- 转换函数:
函数有个fx 修饰语。这个修饰语为TO_DATE函数的字符函
数中的独立变量和日期格式指定精确匹配.
-
-
- TO_CHAR(date, 'format_model') 转换为CHAR类型,
-
必须与单引号一起嵌入,区分大小写,
用逗号把日期数值分开,有一个fm 移除填补空白或者阻止零开头
-
-
- TO_CHAR(number, 'format_model')
- TO_NUMBER(char[, 'format_model']) TO_NUMBER 函数将一个字符串转换成一个数字格式:
- select to_date('1999-09-23','yyyy-mm-dd') from dual;
- 数据类型的转换分为隐式数据类型转换和显式数据类型转换在表达式中, Oracle服务器能自动地转换下列各项,即隐式转换:
- VARCHAR2 or CHAR =====〉NUMBER
- VARCHAR2 or CHAR =====〉DATE
- 对表达式赋值, Oracle服务器能自动地转换下列各项,即隐式转换:
- NUMBER =======〉VARCHAR2 or CHAR
- DATE =======〉VARCHAR2 or CHAR
-
日期格式元素:
YYYY 数字年份
YEAR 英文年份
MM 数字月
MONTH 英文月
MON 英文缩写
DD 数字日
DY 英文缩写
DAY 英文
-
- 通用函数
- decode 条件判断
- 通用函数
格式:decode (col|expression,search1,result1 [,search2,result2,...] [,default])判断col|exporession的值,当search1匹配时,则返回,result1,与search2匹配时,返回result2 ... 如果都不匹配,返回default。
select EMPNO,ENAME,JOB,SAL,
decode(job,'CLERK',SAL*1.15,'SALESMAN',SAL*1.1,SAL*1.12) NEW_SAL
FROM SCOTT.EMP;
-
-
- if then else 条件判断
-
case 表达式
CASE expr WHEN comparison_expr1 THEN return_expr1
[WHEN comparison_expr2 THEN return_expr2
WHEN comparison_exprn THEN return_exprn
ELSE else_expr]
END
- 分组与分组函数
- 分组:
分组函数可以对行集进行操作,并且为每组给出一个结果。
使用group by column1,column2,..按columm1,column2进行分组,即column1,column2组合相同的值为一个组
- 常用分组函数
- AVG([DISTINCT|ALL]n) -- 求平均值,忽略空值
- COUNT({*|[DISTINCT|ALL]expr}) -- 统计个数,其中expr用来判定非空值(使用*计算所有选定行,包括重复行和带有空值的行)
- MAX([DISTINCT|ALL]expr) -- 求最大值,忽略空值
- MIN([DISTINCT|ALL]expr) -- 求最小值,忽略空值
- SUM([DISTINCT|ALL]n) -- 求和,忽略空值
- 分组函数语法
- SELECT [column,] group_function(column), ...
FROM table
[WHERE condition]
[GROUP BY column]
[ORDER BY column];
- 分组函数使用准则:
- DISTINCT 使函数只考虑非重复值,ALL则考虑包括重复值在内的所有值。默认为ALL,
- 带有expr参数的函数的数据类型可以为CHAR,VARCHAR2,NUMBER,DATE,
- 所有分组函数都忽略空值。可以使用NVL,NVL2,或COALESCE函数代替空值
- 使用GROUP BY 时,Oralce服务器隐式地按照升序对结果集进行排序。
- 可以使用ORDER BY 更改排序结果
- 可以使用NVL 函数强制分组函数包含空值,如:
select avg(nvl(comm,0)) from emp;
- GROUP BY 子句的语法:
- 使用GROUP BY 子句可以将表中的行分成更小的组,然后使用分组函数返回每一组的汇总信息
SELECT column, group_function(column)
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[ORDER BY column];
-
- GROUP BY --group_by_expression 即为对哪些列进行分组
- GROUP BY 使用准则:
- SELECT 中出现的列,
- 如果未出现在分组函数中,则GROUP BY子句必须包含这些列,
- WHERE 子句可以某些行在分组之前排除在外,
- 不能在GROUP BY 中使用列别名,
- 默认情况下GROUP BY列表中的列按升序排列,
- GROUP BY 的列可以不出现在分组中
- SELECT 中出现的列,
- 分组过滤:
- 使用having子句
- having使用的情况
- 行已经被分组
- 使用了组函数
- 满足having子句中条件的分组将被显示
- having使用的情况
- 使用having子句
- 多表查询
- 子查询
- 集合运算
集合运算符可以将2个或者多个查询返回的行组合起来,即集合属于纵链接运算
Union all
Union
Intersect
Minus
- 层次化查询
由根节点,父节点,子节点,叶节点组成
- 视图
- ROLLUP与CUBE运算符实现数据汇总
Rollup:为每个分组返回小计记录以及为所有的分组返回总计记录
Cube:返回列中所有组合的小计记录以及为所有分组返回总计记录
- 创建表
- 序列sequence,同义词synonym
- 约束constraint
- 数据处理(DML,RETURNIMNG,MERGE INTO)
- 常用的DML语句及事物处理
- Insert
- Undate
- Delete
- Merge
- Transaction
- 数据库事物(TRANSACTION)
- 数据库事物
数据库事物是指作为单个逻辑单元执行的一系列操作,也可以认为事物就是一组不可分割的sql语句
- 数据库事物的ACID属性
- 原子性
数据要么是修改之前的要么是修改之后的,没有中间结果
-
- 一致性
数据库数据状态不会改变
-
- 隔离性
并发时对其他线程不可见
-
- 持久性
事物完成后永久性改变,即使数据损毁后重新回复也是修改后的状态
- 事物组成
1/N个DML组成,1个DDL组成,1个DCL组成
开始:第一个DML语句的执行作为开始
结束:
Commit (提交)
Rollback (回滚)
Ddl语句或者dcl语句 (自动提交)
用户会话正常结束 (自动提交)
系统异常终止 (自动回滚)
系统崩溃 (自动回滚)
- 事物提交或回滚
- 使用commit提交,robinson记录被插到表
- 使用rollback回滚,更新将失效回归到开始之前的状态
- 保存点
- 设置保存点
SAVEPOINT NAME
-
- 恢复至保存点
ROLLBACK TO NAME
- 事物的开始与结束及不同时刻的状态
- 并发事物
多个用户与数据库同时与数据库交互,且每个用户都可以同时访问自己的事物,这就是并发事物。
对于同一个对象上运行的多个事物,仅当执行commit时才对彼此的查询产生影响
- 利用autocommit进行事物控制
- SET AUTOCOMMIT ON
设置自动提交,每执行一条语句,就提交。