如何写mysql中实现nvl功能的sql呢?

如何写mysql中实现nvl功能的sql呢?,第1张

MySQL的确实有一个ISNULL ( )函数。然而,它的作品有点不同,微软的ISNULL ( )函数。 MySQL中我们可以使用IFNULL ( )函数,就像这样: SELECT ProductName,UnitPrice*(UnitsInStock+IFNULL(UnitsOnOrder,0))

FROM Products

DECLARE

t_name VARCHAR2(10)

t_course1 NUMBER

t_course2 NUMBER

t_course3 NUMBER

TYPE c_type IS REF CURSOR

cur c_type

BEGIN

OPEN cur FOR

'SELECT t_name,

SUM(CASE t_course WHEN '''||'语文'||''' THEN t_score ELSE 0 END),

SUM(CASE t_course WHEN '''||'数学'||''' THEN t_score ELSE 0 END),

SUM(CASE t_course WHEN '''||'物理'||''' THEN t_score ELSE 0 END)

FROM tb GROUP BY t_name'

LOOP

FETCH cur INTO t_name,t_course1,t_course2,t_course3

EXIT WHEN cur%NOTFOUND

dbms_output.put_line(t_name||'语文'||t_course1||'数学'||t_course2||'物理'||t_course3)

END LOOP

CLOSE cur

MySQL的AVG函数是用来求出各种记录中的字段的平均值。

MySQL中语句如下:

update Table1set avg_price=(select avg(price)               from Table2

where Table2=.ID=Table1.TID)

扩展资料

在使用数据库进行数据筛选时查询时,经常会用到一些聚合函数,如 count(),sum(),max(),min(),avg()

聚合函数会把NULL排除在外,但Count(*)例外,并不会排除NULL;

AVG() 函数

AVG() 函数返回数值列的平均值。

SQL AVG() 语法

SELECT AVG(column_name) FROM table_name

sum为求平均值函数,将要求总和值的列sum(列名)

avg为求平均值函数,将要求平均值的列avg(列名) 

nvl为如果未空则置空值为其他数据的函数,nvl(为空的列,将空值置成的其他值)

round为四舍五入函数,round(列名,保留小数位数)

insert all

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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5905940.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-07
下一篇 2023-03-07

发表评论

登录后才能评论

评论列表(0条)

保存