SQL含义+单行函数
Posted 凯迪威
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL含义+单行函数相关的知识,希望对你有一定的参考价值。
1.SQL含义
SQL(Structured Query Language)结构化查询语言。
查询是一种从一个或多个表或视图中检索数据的操作,不会改变表中的数据。
查询数据是数据库的核心操作,是使用频率最高的操作。
2.select的表结构
select语句的基本用法格式 select【distinct】* |列名1【as c1】,列名2[as c2]...,列名n,组函数(...) from 表名1 别名1,表名2 别名2... [where 条件] [group by 列名1,列名2....,列名n ] [having 条件] [order by 排序列名1 ASC|DESC(降序),排序列名2 ASC(升序)|DESC ]
3.SQL执行计划顺序,及其distinct(去重)、||、nvl空置置换函数
SQL执行计划 (8)SELECT (9)DISTINCT (11)<Top Num> <select list> (1)FROM [left_table] (3)<join_type> JOIN <right_table> (2) ON <join_condition> (4)WHERE <where_condition> (5)GROUP BY <group_by_list> (6)WITH <CUBE | RollUP> (7)HAVING <having_condition> (10)ORDER BY <order_by_list> 表的别名,列的别名 distinct 关键字: 去重,必须放在开头字段前,会作用于后面所有的字段 本身是 二重循环查询,当数据量较大时,不适用 || 表示拼接(拼接符为||‘这里可以添加内容‘||) nvl(列,值) 表示空值置换函数 !!注意:null值和所有数据计算,结果都为null
4.dual是oracle中的虚拟表
dual :是Oracle自带的一张虚拟表,没有任何意义,为了保证sql语句的完整性。 --查询当前数据库系统时间(sysdate) select sysdate from dual; -- 获取 ‘hello’ select ‘hello‘ from dual;
5.SQL的单行函数
单行函数 第一种:数字函数 round() 和 trunc() round(列 | 值 | 表达式,小数的有效位数) 四舍五入 select round(3.141592,3)from dual; 结果:3.142 那么(3.141592,3)里面3为取小数点第三位,四舍五入后的结果 trunc(列 | 值 | 表达式,小数的有效位数) 直接截取 select trunc(3.141592,3) from dual; 结果:3.141 那么(3.141592,3)里面3同上,不四舍五入 补充:select round(3.14159,0) from dual; (3.14159,0)里面的0代表取整,即结果为3 select round(33.14159,-1) from dual; (33.14159,-1) 里面的-1代表取十位数30 换成-2取百位数,这里取0 trunc同上!!!! --查询订单表s_ord中总金额total(取整) select trunc(total,0) from s_ord where trunc(total,0)=200;(不四舍五入) select round(total,0) from s_ord;(四舍五入) 第二种 求余数 mod() mod(列|值,列|值) 求余数 --求5/2的余数 abs(列|值) 求绝对值 --求-2的绝对值 --查询订单表s_ord中总金额total(取整) select trunc(total,0) from s_ord where trunc(total,0)=200;(不四舍五入) select round(total,0) from s_ord;(四舍五入) 第三种 求绝对值 abs() abs(列|值) 求绝对值 --求-2的绝对值 第四种 字符函数 length() length(列 | 值 | 表达式):求长度 --获取员工表中员工名字及其名字长度 select first_name,length(first_name) from s_emp; ; --查询出员工姓名长度为6的员工信息 select * from s_emp where length(first_name)=6; 第五种 大小写字母转换 upper(),lower(),initcap() upper(列|值|表达式);全部转大写字母 lower(列|值|表达式);全部转小写字母 initcap(列|值|表达式);每个单词首字母大写 %(百分号),_(下划线)为通配符 select upper(‘abc‘)from dual;==>ABC select lower(‘ABC‘)from dual;==>abc select initcap(‘hello world‘)from daul;==>Hello World 第六中 填充补全 lpad(),rpad() lpad(列|值,宽度,填充字符);从左边补不足宽度个填充字符 rpad(列|值,宽度,填充字符);从右边补不足宽度个填充字符 select lpad(‘abc‘,10,‘de‘)from dual; ---------------- dedededabc select rpad(‘abc‘,10,‘de‘)from dual; ------------------ abcdededed 注意:包含自己在内10个 第七种 左右截取 ltrim(),rtrim() ltrim(列|值,截取字符);从左边截取字符 rtrim(列|值,截取字符);从右边截取字符 select rtrim(‘abcdedede‘,‘de‘) from dual; ------------ abc select rtrim(‘abcddedede‘,‘de‘) from dual; -------------- abc ==》表示从右边开始截取de|d|e,直到不同于截取字符的字符为止 第八种 置换指定字符即替换 replace() replace(列|值,被置换的字符,置换的字符);置换指定字符 select replace(‘helloworld‘,‘owo‘,‘***‘)from dual;==》hell***rld select replace(111222333,22222,666)from dual;==>111666333 第八种 转换指定字符 translate(参数一,参数二,参数三);转换指定字符 参数一:要处理的内容,列|值 参数二:要检索的内容 先执行 参数三:检索后,与检索内容一一对应替换的内容(如果无替换值,则全部去掉) select translate(‘zhongg48‘,‘z23090o45664g‘,‘p23tddy67‘) from dual; ===》 phyn68 参数1和参数2对比,数字都有,参数3没有去掉;参数1中的字母,参数2中有的按参数2的位置和参数三一一对应 第九种 查询指定字符串的下标 instr() instr()查找指定字符窜中所在的位置下标 select instr(‘go,go,come on!‘,‘go‘)from dual;==>1 select instr(‘go,go,come on!‘,‘go‘,2)from dual;==>4 select instr(‘go,go,come on!‘,‘go‘,-1)from dual;==>4 select instr(‘go,go,come on!‘,‘go‘,-1,2)from dual; ==>1 -1代表从右边数,从第一位开始数,2为第二次出现的位置下标 select instr(‘go,go,come on!‘,‘go‘,-2,5)from dual;==>0 -2也是从右边开始,从第二位开始数,5 为第五次出现的位置下标 总结:负数从右边开始,正数从左边开始 注意:数据库字符串下标从1开始计数。 第十种 获取从指定下标开始的字符串 substr() substr(列|值,指定位置下标,保留几位) select substr(‘hello world!‘,3)from dual;表示: 从指定下标处开始即从下标3开始,一个位数为:llo world; 两位数为(3,3):llo即第二个数为取3个数也是其长度(length)用公式表示为下面 select length(substr(‘hello world!‘,3,4))from daul;表示:4 第十一种 decode()及case when then ; decode() a.类似一个三目运算符 比较第一和第二个参数,如果相等取第三个参数,如果不相等取第四个参数。 select decode(‘A‘,‘A‘,‘B‘,‘C‘)from dual;==》B select decode(1,1,2,3)from dual;==》2 select decode(1,2,2,3)from dual;==》3 b.if else if else decode(A,b,c,d,e,f,g,h) 如果A=b,输出c; 如果A=d,输出e; 如果A=f,输出g; 如果b,d,f都不满足A,输出h. --输出显示每个订单编号及支付方式,支付方式要么是现金,要么是信用卡,否则就是未知数。 select id,decode(payment_type,‘CASH‘,‘现金‘,‘CREDIT‘,‘信用卡‘,‘未知数‘ )fro s_ord; --输出区域表(s_region)中,每个地区对应的中文 select id,decode(name,‘North America‘,‘北美‘,‘South America‘,‘南美‘,‘Africa / Middle East‘,‘非洲/中东‘,‘Asia‘,‘亚洲‘,‘Europe‘,‘欧洲‘) from s_region; case when 可以把它看成switch功能; select name "部门名", case region_id when 1 then ‘北美‘ when 2 then ‘南美‘ when 3 then ‘中东‘ when 4 then ‘亚洲‘ when 5 then ‘欧洲‘ else ‘未知区域‘ end "区域名" from s_dept; --请把员工工资分为3等,超过2000员的为高等在1500到2000之间的为中等,低于1500的为低等 select first_name,salary, case when salary>2000 then ‘高等‘ when salary between 1500 and 2000 then ‘中等‘ when salary<1500 then ‘低等‘ else‘‘ end " 薪资" from s_emp; 注意:case后面是否出现列名,取决于when后面条件是否出现比较列 如果when后面已经出现列名,那case后面务必不能写列名, 如果when后面是值,那么必须在case后面指定列名,否则无法确定所给的值的真正含义。 第十二中 日期函数 oracle默认的日期格式为 dd-MON-yy select sysdate from daul; dd 表示2位数的日 mon/month 表示月份,如:6月 mm 表示2位数的月,如:06 yyyy 表示4位数的年份 HH24 表示24小时 HH 表示12小时 mi 表示分钟 ss 表示秒 fm 表示去掉前面的0,如:fm 06,值为6 = fmmm day 表示星期几 日期函数: sysdate 当前日期 months_between(date1,date2) 2个日期之间的月数 --查询2014年11月1日和2016年12月9日之间的间隔月数 select trunc(abs(months_between(to_date(‘2014-11-1‘,‘yyyy-mm-dd‘),to_date(‘2016-12-9‘,‘yyyy-mm-dd‘))),2) from dual; add_months(date1,n),在date1的基础上加n个月 --半年后的日期是什么? select add_months(system,6) from dual; --半年前的日期是什么? select add_months(sysdate,-6) from dual; next_day(date1,‘星期几‘),在date1的基础上,下星期几是什么时候 --即将到来的星期五是几号? select next_day(sysdate,‘星期五‘) from dual; last_day(date1),date1日期所在月的最后一天是什么时候 --查询当月底是几号 select last_day(sysdate) from emp; --查询所有员工的工作月数 select trunc(months_between(sysdate,start_date),0) from s_emp; --查询所有员工的工作天数 select round(sysdate-start_date) from s_emp; --显示41 号部门员工 姓名, 进入公司的天数,年数,月份数,星期数【分别加上中文别名】 select e.first_name 姓名, sysdate - e.hiredate 天数, months_between(sysdate,e.hiredate) 月数, (months_between(sysdate,e.hiredate))/12年分数 from s_emp e where e.deptno = 41 ; 第十三种 转换函数 to_number,to_date,to_char to_number:字符转换成数字 select to_number(‘9837492.563‘,‘999999999.999‘) from dual to_date:字符转换成日期 select to_date(‘2009-10-3 15:10:23‘,‘yyyy-mm-dd hh24:mi:ss‘) from dual to_char:日期/数字 转换成 字符 --获得当前年份,月份,日期 select to_char (sysdate,‘yyyy-mm-dd hh24:mi:ss‘) from dual select to_char(9837492,‘$999,999,999.99‘) from dual select to_char(9837492.563,‘999999999.99‘) from dual to_date() 把字符串改为日期 to_number() 把字符装换成数字 to_char 把数字或日期转换为字符串 1.to_char(number,fmt);格式化数字 2.to_char(date,fmt);格式化日期 9 代表任意数据 L 代表本地的货币符号 $ 代表美元 0 代表0 . 代表. , 代表, --格式化输出员工工资($1,500.00) select to_char(1500,‘$999,999,999.99‘) from dual; --找出每个员工的名字和它的薪水(如:$2,500.00) select ename,to_char(sal,‘$999,999.99‘) from emp; --将‘2011-09-12 ‘ 转换成 date 类型 select to_date(‘2011-09-12‘,‘yyyy-mm-dd‘) from dual ; ==>2011/09/12 -- 获得字符串 ‘2011-09-12 ‘ 的月份 select to_number(to_char( to_date(‘2010-09-18‘,‘yyyy-mm-dd‘) , ‘mm‘)) from dual; ==>9 --获得 8732034.56 用如下形式表示: 8,732,034.56 select to_char( 8732034.56,‘9,999,999.99‘) from dual; --获得 8732034.56 用如下形式表示: $8,732,034.56 select to_char( 8732034.56,‘$9,999,999.99‘) from dual;
以上是关于SQL含义+单行函数的主要内容,如果未能解决你的问题,请参考以下文章