单行函数和多表查询 例题代码可复制
查询和单行函数:
范围查询:
数字/日期
betteen 小 and 大
SELECT * FROM EMP WHERE SAL BETWEEN 6000 AND 10000;
模糊查询:
LIKE :
配合通配符使用:_ :一个字符 %:任意字符
SELECT * FROM EMP WHERE EMPNO LIKE '7%';
如果有null 结果为空
排序:
:null默认是最大值
SELECT EMPNO,ENAME,SAL,COMM FROM EMP ORDER BY 1 ASC;
把null排序放在最后语法:
SELECT EMPNO,ENAME,SAL,COMM FROM EMP ORDER BY COMM DESC NULLS LAST;
多列排序:
函数:
单行字符函数
:一次性操作一行
字符函数 数值函数 日期函数 转换函数 通用函数
字符函数: lower upper initcap
SELECT 'HELlo wOrLd' 一,LOWER('HELlo wOrLd') 二,UPPER('HELlo wOrLd')三,INITCAP('HELlo wOrLd') FROM DUAL;
双行函数:一次操作多行 多行变一行
Substr(str begin len):从1开始数
SELECT SUBSTR('HELLO WORLD',3,3) FROM DUAL;
Length字符数/lengthb字节数
英文/数字
如果中文/符号:
utf-8编码格式下L一个汉字/符号 占三个字节
gbk:一个汉子/符号 占两个字节
SELECT LENGTH('HELLOWORLD') ,LENGTHB('HELLOWORLD') FROM DUAL;
查看当前编码格式:
SELECT * FROM NLS_DATABASE_PARAMETERS;
Instr
SELECT INSTR('helloworld','ll') FROM DUAL;
ipad/rpad:填充
SELECT LPAD('hello',10,'*')左,RPAD('hello',10,'*') FROM DUAL;
Trim:去掉任意空格
SELECT TRIM(' hello world ') FROM DUAL;SELECT TRIM ('X' FROM 'XXXXXXhello worldXXXXXX') FROM DUAL;
替换:replace
SELECT REPLACE('你个垃圾','垃圾','**') FROM DUAL;
数字函数
数值函数:
Round(数字,n位数) 四舍五入,保留n为小数
SELECT ROUND(67.183,2)一,ROUND(67.183,1)二,ROUND(67.183,0)三,ROUND(67.183,-1)四,ROUND(67.183,-2) FROM DUAL;
Trunc(数字,n位数)舍尾,取整
SELECT TRUNC(67.183,2)一,TRUNC(67.183,1)二,TRUNC(67.183,0)三,TRUNC(67.183,-1)四,TRUNC(67.183,-2) FROM DUAL;
Mod求余
SELECT MOD(123,5) FROM DUAL;
日期函数
Sysdate 当前日期
SYSTIMESTAMP 函数:精确到微秒
SELECT SYSTIMESTAMP FROM DUAL;
格式化:日期》字符
to_char(日期,格式)
SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD') FROM DUAL;
日期+-数字(默认是天)
日期-日期
计算员工工龄:入职日期 天 星期 月 年
SELECT ENAME,HIREDATE,(SYSDATE-HIREDATE),(SYSDATE-HIREDATE)/7,(SYSDATE-HIREDATE)/30,(SYSDATE-HIREDATE)/365 FROM EMP;
Months_between(日期1,日期2)
add_months(日期,月数)
SELECT ADD_MONTHS(SYSDATE,12) FROM DUAL;
当前最大是第几天 last_day
SELECT LAST_DAY(SYSDATE) FROM DUAL;
下一个星期n是哪天 next_day
SELECT NEXT_DAY(SYSDATE,'星期六') FROM DUAL;
对年 月四舍五入
SELECT ROUND(SYSDATE,'MONTH'),ROUND(SYSDATE,'YEAR') FROM DUAL;
EXTRACT(time)函数:返回指定 time 时间当中的年、月、日、分等日期部分。
SELECT EXTRACT(YEAR FROM TIMESTAMP '2021-3-16 19:53:44') AS YEAR,EXTRACT(MONTH FROM TIMESTAMP '2021-3-16 19:53:44') AS MONTH,EXTRACT(DAY FROM TIMESTAMP '2021-3-16 19:53:44') AS DAY,EXTRACT(HOUR FROM TIMESTAMP '2021-3-16 19:53:44') AS HOUR,EXTRACT(MINUTE FROM TIMESTAMP '2021-3-16 19:53:44') AS MINUTE,EXTRACT(SECOND FROM TIMESTAMP '2021-3-16 19:53:44') AS SECONDFROM DUAL;
第三章单行函数和多表查询
3.1 SQL函数
SQL函数可以完成如下功能:
执行数据计算。
修改单个数据项。
格式化显示的日期和数字。
进行数据类型转换。
根据行分组操纵输出。
SQL函数分类关系图:
3.2字符.数字函数
Concat函数:
CONCAT(string1,string2)函数用于将两个字符串连接在一起
SELECT CONCAT('Oraol','.com') FROM DUAL;
SELECT CONCAT('A','B') FROM DUAL;
CONCAT函数将只允许您将两个值连接在一起。如果需要连接多个值,那么我们可以嵌套多个CONCAT函数调用。
SELECT CONCAT(CONCAT('A','B'),'C') FROM DUAL;
CONCAT函数向结果字符串添加单引号
Oracle || 运算符
string1 || string2 [ || string_n ]
||运算符将多个字段连接在一起时,连接空格字符。
SELECT 'Dave' || ' ' || 'Anderson' FROM dual;-- Result: 'Dave Anderson'
连接单引号:
SELECT 'LET '' S' || '--LEARN ORACLE' FROM DUAL;
Oracle数值型函数
1.ABS(x) 求数值x的绝对值
2.COS(x)求数值x的余弦
3.ACOS(x)求数值x的反余弦
4.CEIL(x)求大于或等于数值x的最小值
5.FLOOR(x)求小于或等于数值x的最大值
6.Log(x,y)求x为底y的对数
7.Mod(x,y)求x除以y的余数
8.Power(x,y)求x的y次幂
9.Sqrt(x)求x的平方根
3.3转换函数
SQL语言提供了三种函数,实现从一种数据类型数据转换到另一种类型,它们分别是TO_CHAR、TO_NUMBER和TO_DATE。
数字转换为字符格式元素:
9 数字宽度(9的个数决定显示宽度) 2468
0 显示前导0 099999
$ 美元符号 $999999
L 本地货币符号 L9999
. 指定小数点位置 999999.99
, 指定逗号位置 999,999
MI 将负数右边显示负号 -2468
PR 将负数加上括号 9999PR
EEEE 科学计数法 99.99999EEEE
V 乘n个10,n由V后 9 的个数决定 999999V99
Oracle聚合函数
count 取得记录数
sum 求和
Avg 取平均
Max 取最大的数
min 取最小的数
取得所有的员工数
SELECT COUNT(*) FROM EMP;
当一行数据所有字段全部为空的场合,count 方法有效 !
Distinct 可以去除重复的纪录。
comm 字段有 null 值,无法计算,sum 会忽略掉,正确的做法是将 comm 字段转换成 0。
SELECT SUM(SAL+NVL(COMM,0)) FROM EMP;
取得最晚入职得员工
SELECT MAX(TO_CHAR(SYSDATE,'YYYY-MM-DD')) FROM EMP;
Convert函数
可以将字符串从一个字符集转换为另一个字符集
字符集
字符集 描述
US7ASCII 美国 7 位 ASCII 字符集
WE8DEC 西欧 8 位字符集
WE8HP 惠普西欧 Laserjet 8 位字符集
F7DEC DEC 法语 7 位字符集
WE8EBCDIC500 IBM 西欧 EBCDIC 代码第 500 页
WE8PC850 IBM PC 代码第 850 页
WE8ISO8859P1 ISO 8859-1 西欧 8 位字符集
函数使用示列:
SELECT CONVERT('A B C D E F G H I','US7ASCII','WE8ISO8859P1') FROM DUAL;
Dump函数
可以返回一个 varchar2 值,这个值包含了数据类型代码、字节长度和表达式的内部表示形式
Dump()函数的使用示例:
SELECT DUMP('TECH',10) FROM DUAL;
SELECT DUMP('TECH',16) FROM DUAL;
SELECT DUMP('TECH',1016) FROM DUAL
Oracle行转列
SELECT * FROM (数据查询集)PIVOT
( SUM(Score/*行转列后 列的值*/) FOR coursename/*需要行转列的列*/ IN (转换后列的值))
列转行_unpivot
一行当中的列的字段按照行的唯一值转换成多行数据
如何实现列转行:
1.利用 union all 进行拼接,具体代码如下:
2.利用 Oracle 自带的列转行函数 unpivot
分析函数
它可以对数据进行分组,然后分析统计,最后返回这个统计值
Oracle 分析函数不同于分组统计(group by),group by 只能按照分组字段返回一个固定的统计值,但是不能在原来的数据行上带上这个统计值,而 Oracle 分析函数正是 Oracle 专门解决这类统计需求所开发出来的函数。
Oracle 分析函数都会带上一个开窗函数 over()
1、Analysis_function:指定分析函数名,常用的分析函数有 sum、max、first_value、last_value、rank、row_number 等等。
2、over():开窗函数名,partition by 指定进行数据分组的字段,order by 指定进行排序的字段,windos 指定数据窗口(即指定分析函数要操作的行数)
需求:在原始数据上附带上每门课的最高成绩和最低成绩。
代码如下:
select c.stuname,b.coursename,t.score,--获取组中成绩最大值max(t.score) over(partition by t.courseid) as score_max,--获取组中成绩最小值min(t.score) over(partition by t.courseid) as score_min,--分组窗口的第一个值 (指定窗口为组中第一行到末尾行)first_value(t.score) over(partition by t.courseid order by t.score desc ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as score_first,--分组窗口的最后一个值(指定窗口为组中第一行到末尾行)last_value(t.score) over(partition by t.courseid order by t.score desc ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) as score_last,--分组窗口的第一个值 (不指定窗口)first_value(t.score) over(partition by t.courseid order by t.score desc ) as score_first_1,--分组窗口的最后一个值(不指定窗口)last_value(t.score) over(partition by t.courseid order by t.score desc ) as score_last_1from STUDENT.SCORE t, student.course b, student.stuinfo cwhere t.courseid = b.courseidand t.stuid = c.stuid
结果如下:
我们经常会利用 row_number 函数的排名机制(排名的唯一性)来过滤重复数据
内连接,外连接,自连接,层次连接
1.交叉连接
SELECT * FROM EMP , DEPT;
1.交叉连接(笛卡尔积);所有情况的组合,不推荐使用
3.内连接:多张表通过相同字段进行匹配,只显示匹配成功的;
A:
SELECT * FROM EMP E,DEPT D WHERE E.DEPTNO = D.DEPTNO;
B:
SELECT * FROM EMP E
INNER JOIN DEPT D ON
E.DEPTNO = D.DEPTNO;
不等值连接:【一般不用】
SELECT * FROM EMP E,DEPT D WHERE E.DEPTNO != D.DEPTNO;
外连接:
左外连接:以左表为基准【左表数据全部显示】,去匹配右表数据,如果匹配成功 则全部显示;如果不成功,显示部分【无数据部分 用NULL填充】
右外连接:
全外连接:
单行函数和多表查询 例题代码可复制相关推荐
- oracle之单行函数之多表查询
--多表查询 select employees.employee_id,employees.department_id,departments.department_name from departm ...
- oracle之单行函数之多表查询值之课后练习
26. 多表连接查询时, 若两个表有同名的列, 必须使用表的别名对列名进行引用, 否则出错!27. 查询出公司员工的 last_name, department_name, cityselect la ...
- VLOOKUP函数制作多表查询(学生信息表/员工工资表)
VLOOKUP函数制作多表查询(学生信息表/员工工资表) 一.vlookup函数定义 VLOOKUP函数是Excel中的一个纵向查找函数,在工作中都有广泛应用,例如可以用来核对数据,多个表格之间快速导 ...
- MySQL数据库的查询:常用查询语句、MySQL函数、多表查询、视图表
文章目录 一.构造数据 二.常用的查询语句 1.SELECT:字段表达式 2.FROM 子句 3.WHERE 子句:按指定条件过滤 4.GROUP BY:分组查询 5.HAVING 6.ORDER B ...
- 【2020-2021春学期】数据库作业5:单表查询例题练习
文章目录 单表查询 1.选择表中若干列 [例3.19]查询全体学生姓名和出生年份 [例3.20]查询全体学生姓名.出生年份.院系(用小写) 2.选择表中的若干元组 [例3.21]查询选修了课程的学生学 ...
- MySQL基础(3)----其他函数 约束 多表查询 子查询 组合查询
1.其他函数 1.1.字符串函数 --- 操作字符串 常用函数: 函数 功能 CONCAT(s1, s2, ..., sn) 字符串拼接,将s1, s2, ..., sn拼接成一个字符串 LOWER ...
- MySQL单表查询例题
一.单表查询 CREATE TABLE `worker` ( `部门号` int(11) NOT NULL, `职工号` int(11) NOT NULL, `工作时间` date NOT NU ...
- SQL 多表查询例题
准备工作 1. 创建数据表 CREATE TABLE student( sno VARCHAR(10) PRIMARY KEY, sname VARCHAR(20),sage VARCHAR(2),s ...
- 【数据库】第二章 基础函数、聚合函数、条件查询、子查询和多表查询
[数据库]第二章 基础函数.条件查询.聚合函数.多表查询和子查询 文章目录 [数据库]第二章 基础函数.条件查询.聚合函数.多表查询和子查询 一.基础函数 二.聚合函数 1.COUNT 2.MAX/M ...
最新文章
- 再见,Python 2.x
- 冬奥闭幕式黑科技再次引爆全网,AR中国结、折柳寄情……还有212项科技藏在冬奥里...
- 三星S5 电信版(G9009D)Android 5.0系统,root教程【亲测可行】
- sql优化之:数据库索引创建原则,or/in/union与索引优化,聚集索引/非聚集索引/联合索引/索引覆盖,MySQL冗余数据的三种方案,MySQL双主一致性架构优化(来源:架构师之路)
- 使用SAT研究IBASE hierarchy读取性能
- 【dfs】【hash】有趣的英语角(2015特长生 T2/luogu 1019)
- 关于数组的 slice() 和 splice() 方法
- 如何利用PHP会话显示出当前在线的用户
- 显示所有大写字母python_python 输出所有大小写字母, range()以及列表切片
- 3.3 rsync同步之ssh隧道方式
- python-scrapy框架学习笔记
- WebWorker和Server-Sent Events和HTML5 WebSocket
- 用java画工作流流程图,java生成流程图
- AccessibilityService+OpenCV实现微信7.0.0抢红包插件
- 制作一个网站多少钱?2018最新网站制作明细表
- 查询一个表中的两个字段值相同的数据
- Nginx 启动报 bind() to 0.0.0.0:XXXX failed (13: Permission denied)
- 坚持技术长征,阿里云要定义下一代的云
- “WFCF”数据安全及隐私保护声明
- web 移动端电影项目 (Vue)