多表连接查询
内连接
内连接查询必须两个表中有一个共同数据,可以是外键或者其他的什么东西,内连接的查询是非常需要where条件判断的。
内连接的两种写法
select * from t_zhao_banji t, t_hq b where t.hqbh = b.hanqbh;
select * from t_zhao_banji t inner join t_hq b on t.hqbh = b.hanqbh;
这种还是属于等值连接。
select * from t_zhao_banji t inner join t_hq b on t.hqbh < b.hanqbh;
这样的查询就是数不等值连接
外连接
分为左连接和右连接,想在一些表中有一些数据并不能完全匹配,内连接在这种情况下会造成数据丢失,所以就衍生出了外连接,保证了表内数据的完整性。
select * from t_zhao_banji t left inner join t_hq b on t.hqbh < b.hanqbh;
select * from t_zhao_banji t right inner join t_hq b on t.hqbh < b.hanqbh;
外连接还有一种特殊的用法,就是使用(+)
使用方法是必须使用where字句,放在非主表的后面,不能出现inner join字段。
全连接
select * from t_zhao_banji t FULL inner join t_hq b on t.hqbh < b.hanqbh;
自连接
select * from t_zhao_banji a, t_ zhao_banji b where a.hqbh = b.hqbh;
内置函数
dual是oracle里面的一个虚拟的表,不能删除。
取绝对值abs(-100)
select abs(-100) from dual;
函数名 返回结果 参数
select mod(8,3) from dual;
取余数
select ceil(12.5) from dual
大于等于12.5的最小整数。
select floor(12.5) from dual;
小于12.5的最大整数
select round(12.456, 2)from dual;
取小数点后面2位小数,结果为12.46
select trunc(12.345,1) from dual;
截取小数点后面一位,通常用来取一个整数。
select length(xingm) from t_zhao_banji;
输出一个字段的长度
select xingm, substr(xingm,1,2) from t_zhao_banji;
截取一个字段的长度,这个表示从第一个开始截取,截取两位,如果将1改为-1,则是从后面的第一个开始截取,正负号表示的是从左边开始还是从右边开始
select concat('呵呵',concat('hdjdsf','hsdfjs')) from dual;
select '呵呵'||'哈哈'||'嘿嘿' from dual;
连接字符串的两种写法,函数可以进行嵌套。
select instr('abcdefg', 'd') from dual;
查找一个字符在一个字符串的中的位置,如果一个字符串中有多个符合条件的字符,则只会找到第一个。
也可以指定一个范围去查找,多用于比较长的字符串,
select instr('a*sfkaj*sgkjsfsfe', '*', 3) from dual; 代表从第三位开始,会忽略前面两个字符。
转换大小写
select upper('qwer'), lower('QWER') from dual;
将首字母转换成大写
select initcap(this is a test) from dual;
替换字符串中的某一个字符。
select replace('abcdefg', 'ab', '123') from dual;
填充字符到一个字符串内,不写明内容的话就是填充空格
select lpad('aa', 8) from dual; 添加到左边
select rpad('aa', 8) from dual;添加到右边
select rpad('aa', 8, 'qw') from dual;在字符的右边添加字符,输出结果是aaqwqwqw
日期型函数
取出系统时间
select sysdate from dual;
设定另一个时间,
select add_months(sysdate, 5) from dual;这个代表的是以系统时间为标准往后加上5个月,如果是负数,则是往前推5个月
select last_day(sysdate) from dual;
以系统时间为标准的当月的最后一天,函数后面是可以写+和-的,
比如
select last_day(sysdate) + 1 from dual;代表的是当前系统时间的当月的最后一天的明天。
转换函数
cast(数据 as 数据类型)
select cast('123' as number) from dual;
字符串转换成数字
select cast(123 as varchar2(5)) from dual;
数字转换成字符串
字符串和数字有一个比较显著的区别,就是在表的单元格当中,数字一般都是右对齐出现的,字符串都是左对齐出现的。
将系统的时间转换成字符串
select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual;
在这个语句中yyyy-mm-dd是年月日的表达形式,hh24:mi:ss是时间的表达形式,24代表的24小时计时法,不加24则是12小时
将数字格式化
select to_char(123.456, '9999.9') from dual;
oracle中用9表示数字的格式,小数点前面的9的位数如果大于数字小数点前面的位数,则输出空格,小于则输出乱码。
将数字转换成日期
select to_date('2015-10-29 16:36:45', 'yyyy-mm-dd hh24:mi:ss') from dual;
转换成日期的时候需要加上格式符'yyyy-mm-dd hh24:mi:ss'
将字符转换成数字
这里需要注意的是,如果后面的9的位数小于要转换成数字的位数则会报错,所以9的位数必须大于等于要转换成的数字的位数。
select to_number('123.456', '999.999') from dual;
null函数
select nvl(nianl, 20) from t_zhao_banji;
将表格中为空的值替换成20。
nvl,常用在表中运算是运算结果为空,比如:
select nvl(nianl, 0) + nvl(gongzi, 0) from t_zhao_banji;
select nvl2(nianl, 20, 50) from t_zhao_banji;
这个语句的含义是将不为空的值替换成20,为空的替换成50
select nianl from t_zhao_banji where lnnvl(nianl < 30);
lnnvl关键字的含义是符合括号内条件的会被去除,输出剩下的数据。