into dept(deptno,dname) values(50,'测试一部')
into dept(deptno,dname) values(51,'测试二部')
SELECT 1 FROM DUAL
insert all into dept(deptno,dname)
into dept(deptno,dname) values(60,'测试一部')
into dept(deptno,dname) values(61,'测试二部')
SELECT 62,'测试三' FROM DUAL
begin
insert into dept(deptno,dname) values(70,'测试一部')
insert into dept(deptno,dname) values(71,'测试二部')
end
oracle的序列 sequences(mysql自增长)
sequences的使用分两步
1、新建一个序列(工具建)
2、如何使用
3、函数对比
https://blog.csdn.net/qq_39137554/article/details/76034335
3.1)数学函数
oracle: ceil(-1.001) mysql: ceiling(-1.001)
3.2)字符串函数
1)ascii(str)一样:返回一个字符对应的ascii码值
2)chr||char (不同)
ORACLE:chr(97) MYSQL:char(97)返回这个整数所代表的 ASCII 码值
oracle示例:
3)INSTR||locate(mysql新增 mysql可以用instr locate)
INSTR(s1,s2,[,n1],[n2]) 返回s1中,子串s2从n1开始,第n2次出现的位置。n1,n2默认值为1
oracle例子:
-- 查询s字符串在sdsq中第一次出现的位置,从头开始查找,索引从1开始计算 返回1
select INSTR('sdsq','s') value from dual
-- 查询s字符串在sdsq中第一次出现的位置,从索引从2开始查找 返回3
select INSTR('sdsq','s',2) value from dual
-- 查询s字符串在sdsq中第一次出现的位置,从索引从2开始查找,如果没有查找到,返回0
select INSTR('sdsq','s',2,2) value from dual
mysql:
instr||locate
4)length||char_length(不同)
SELECT length('AAAASDF') VALUE FROM DUAL
CONCAT:连接
LPAD:在左边加点内容(左追加)
RPAD:在右边加点内容(右追加)
把sal变成10位,不足10位的,右侧 补*
select RPAD(sal,10,'*') as v from emp
REPLACE 替换一样
LOWER 转小写一样
UPPER 转大写 一样
initcap首字母大写
SELECT REPLACE('18604001139', '0400', '****') value from dual
select LOWER(ename) username from emp 转小写
select UPPER(ename) username from emp
select initcap(ename) username from emp
3.2.4.1TRIM:去掉首尾的指定字符,不能去除中间的
oracle:trim(子串 from 父串)
select TRIM('S' FROM 'SSMISSTH') value from dual//MISSTH
select TRIM(' ' FROM ' ab c ') value from dual//ab c
3.2.4.2SUBSTR(oracle)||substring(mysql)
SUBSTR(原字符串,开始处位置,截取长度)
select SUBSTR('String',2,5) value from dual //tring
ORACLE:
练习1:
1.写一个查询,用首字母大写,其它字母小写显示雇员的 ename,显
示名字的长度,并给每列一个适当的标签,条件是满足所有雇员名字
的开始字母是J、A 或 M 的雇员,并对查询结果按雇员的ename升序
排序。(提示:使用initcap、length、substr)
练习2 都用函数解决
• 1.查询员工姓名中中包含大写或小写字母A的员工姓名。
select ename
from emp
where instr(ename,'A')>0 OR instr(ename,'a')>0
• 2.查询部门编号为10或20,入职日期在81年5月1日之后,并且姓名中
包含大写字母A的员工姓名,员工姓名长度(提示,要求使用INSTR函
数,不能使用like进行判断)
select ename,length(ename) len
from emp
where deptno in(10,20)
and hiredate>'1-5月-1981'
and instr(ename,'A')>0
• 3.查询每个职工的编号,姓名,工资
– 要求将查询到的数据按照一定的格式合并成一个字符串.
– 前10位:编号,不足部分用 填充,左对齐(右填充)
– 中间10位:姓名,不足部分用 填充,左对齐
– 后10位:工资,不足部分用*填充,右对齐
select rpad(empno,10,' ')||rpad(ename,10,' ')||lpad(sal,10,'*') as value
from emp
select concat(concat(rpad(empno,10,' ') , rpad(ename,10,' ')),lpad(sal,10,'*')) as value
from emp
https://www.cnblogs.com/aipan/p/7941917.html
3.4.1 to_char vs date_format/ time_format
select to_char(hiredate,'YYYY-MM-DD HH24:MI:SS') VALUE FROM emp
select to_char(-125.8, '999D99S') from dual
3.4.2 to_date vs STR_TO_DATE(str,format)
select to_date('2021-04-23 15:12:20','YYYY-MM-DD HH24:MI:SS') VALUE FROM DUAL
3.4.3 to_number vs CAST("123" AS SIGNED INTEGER)
select to_number('12,454.8-', '99G999D9S') value from dual
select to_number('-12,454.8', 'S99G999D9') value from dual
1.显示服务器系统当前时间,格式为2007-10-1217:11:11(提示:使用to_char函数)
select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS')
from dual
3.查询员工姓名,工资,格式化的工资(¥999,999.99)(提示:使用to_char函数)
select to_char(sal,'L999G999D99')
from emp
4.把字符串2015-3月-18 13:13:13 转换成日期格式
select to_date('2015-3月-18 13:13:13','YYYY-MON-DD HH24:MI:SS')
from dual
select cast(11 as unsigned int) / 整型 /
select cast(11 as decimal(10,2)) / 浮点型 /
3.5.1 nvl/COALESCE vs ifnull
**NVL函数等价于mysql的ifnull
– 语法:NVL (expr1,expr2)
– 如果expr1不是null,返回expr1,否则返回expr2
select comm,nvl(comm,0) from emp
select comm,coalesce(comm,sal,0) from emp
3.5.2 nvl2 vs if
NVL2函数
– 语法:NVL2(expr1,expr2,expr3)
– 如果expr1不是null,返回expr2,否则返回expr3
select nvl2(comm,'无奖金','有奖金') from emp
3.5.3 NULLIF vs 无(可以考虑用if 建议了解,不用掌握)
NULLIF函数
– 语法: NULLIF(expr1,expr2)
– 比较两个表达式,如果相等,返回null,否则,返回第一个表达式
3.5.4 DECODE(解密的意思)/case vs if/case 多分支情况
DECODE(字段| 表达式, 条件1,结果1[,条件2,结果2…,][,缺省值] )
SELECT ename, deptno,
decode(deptno,
10,' 销售部',
20,' 技术部',
30 , ' 管理部',
' 无') deptname
FROM emp
CASE expr
WHEN comparison_expr1 THEN return_expr1
[WHEN comparison_expr2 THEN return_expr2
WHEN comparison_exprn THEN return_exprn
ELSE else_expr]
END
SELECT ename, deptno,
(CASE deptno
WHEN 10 THEN ' 销售部'
WHEN 20 THEN ' 技术部'
WHEN 30 THEN ' 管理部'
ELSE ' 无' END) deptname FROM emp
EXTRACT ([YEAR] [MONTH][DAY] FROM [日期表达式])
SELECT ename, sal, MONTHS_BETWEEN(SYSDATE,hiredate) months
FROM emp
ORDER BY months
SELECT ename, sal, hiredate, ADD_MONTHS(hiredate,3) new_date
FROM emp
WHERE hiredate>'01-1月-82'
SELECT NEXT_DAY(sysdate,'星期二') NEXT_DAY
FROM DUAL
SELECT Last_DAY('1-2月-2019') last_DAY
FROM DUAL
select EXTRACT (YEAR FROM HIREDATE) AS 年 from emp
select EXTRACT (YEAR FROM HIREDATE) AS 年 from emp
select EXTRACT (MONTH FROM HIREDATE) AS 年 from emp
select EXTRACT (DAY FROM HIREDATE) AS 年 from emp
4、外连接的加号定法。oralce支持,mysql不支持
查询所有雇员姓名,部门编号,部门名称, 包括没有员工
的部门也要显示出来
select e.ename,d.deptno,d.dname
from emp e,dept d
where e.deptno(+)=d.deptno
4、分页的处理
比较日期相等
https://www.cnblogs.com/bailing80/p/11440927.html
SUBSTRING(str FROMpos)返回字符串str的位置pos起的一个子串
mysql>selectSUBSTRING('Quadratically',5)
->'ratically'
mysql>select SUBSTRING('foobarbar' FROM4)
->'barbar'
INSTR(str,substr)
返回子串substr在字符串str中的第一个出现的位置。这与有2个参数形式的LOCATE()相同,除了参数被颠倒。
mysql>select INSTR('foobarbar', 'bar')
->4
mysql>select INSTR('xbar', 'foobar')
->0
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)