SQL查询语句总结
数据查询语言:即DML(Data Mannipulation Language)数据操纵语言,用于查询、操纵数据表资料行
本手册所有示例引用表均以TIPTOP GP ERP数据库表为基础演示,
TIPTOP 数据字典下载地址:http://pan.baidu.com/s/1jG1PGF0
1、SELECT 查询所有列资料或特定列资料
OEB04 OEB06-------------- ------------
J00020853 F3D111-15
J00020886 F2A036-25
J00020901 F2A046b10-GLD
J00020901 F2A046b10-GLD
-----------------------------------------------------------------------------------------------------------------------------------------
2、distinct消除查询结果的重复行
OEB04 OEB06
-------------- ------------
J00020853 F3D111-15
J00020886 F2A036-25
J00020901 F2A046b10-GLD
-----------------------------------------------------------------------------------------------------------------------------------------
订单单号 订单产品 产品品名 订单金额
ZE1-11070001 J01960002 USB 2.0成品 288
ZE1-11070002 J00130953 AIC-BF-3300BK-500-J 10000
ZE1-11070007 J01960001 USB2.0 CABLE 62500
注意:如果取了别名,此别名是不能在WHERE 子句中引用的,必须使用原运算式或内嵌表解决
-----------------------------------------------------------------------------------------------------------------------------------------
4、nvl函数或nvl2函数 处理算术表达式运算中栏位空值问题
如果查询的栏位参与+ - / *算术运算,只要参与运算的栏位有一个为空值,则会导致整个运算结果为空值
nvl(expr1,expr2)如果expr1不为空,则返回expr1,否则返回expr2;expr1与expr2可以是任意数据类型,但是expr1与expr2需是相同的数据类型
nvl(expr1,expr2,expr3)如果expr1不为空,则返回expr2,否则返回expr3;expr1可以是任意数据类型,但是expr2与expr3需是相同的数据类型
订单单号 订单产品 品名 订单未交量
----------------- -------------- -------------------------------- -------------
ZC1-11040001 J00020430 A3X126x50-YLW-M
ZC1-11050001 ABCDEFGH 插头 10
订单单号 订单产品 品名 订单未交量
----------------- -------------- -------------------------------- -------------
ZC1-11040001 J00020430 A3X126x50-YLW-M 100
ZC1-11050001 ABCDEFGH 插头 10
-----------------------------------------------------------------------------------------------------------------------------------------
5、使用WHERE条件子句
常用的WHERE条件如下:
等于:= 不等于:<>,!= 大于:>
大于或等于:>= 小于或等于:<= 小于:<
匹配于列表值:IN( )
在两值之间:BETWEEN .. AND ..
测试是否为NULL:IS NULL (注意:"没有空格"、"一个或多个空格" 与 IS NULL 是不同的)
匹配于字符样式:LIKE,执行模糊查询需要使用LIKE,常用LIKE通配符如下:
%:匹配0个或多个字符
_ :匹配单个字符
如果模糊查询本身要查的栏位资料里面包含有'%'或'_'字符时,则需要使用转义字符ESCAPE
注意:如果某值是空则并不能用LIKE "%"匹配的到,写SQL查异常这点经常出错
常用的WHERE条件逻辑操作符如下:
逻辑与:AND,逻辑或:OR,取反:NOT
ZX01 ZX02 ZX03 ZX04--------- ---------- ------ ----------
top_test 測試帳號 2G69 CLASS-A
-----------------------------------------------------------------------------------------------------------------------------------------
6、ORDER BY desc (升序排序:默认),ORDER BY asc (降序排序) 将查询出来的资料排序
排序时也可以指定多列排序、非选择资料栏位排序、别名排序、列位置编号排序
ZX01 姓名 ZX03 ZX04
--------- ----------- -------- ----------
cmtest C-M-测试 2G60 CLASS-B
tiptop tiptop 2G69
top_test 测试账号 2G60 CLASS-A
toptest 测试账号 2G69 CLASS-C
-----------------------------------------------------------------------------------------------------------------------------------------
7、连接查询:基于2个或2个以上的视图或表的查询
说明:必须在FROM子句后接上2个或2个以上的表或视图
查询的资料列如果在FRM子句后面所捷的表或视图有多个,则必须在查询的资料栏位前面加上表或视图名作为首码,否则会引起2意性错误
当使用连接查询时必须在WHERE子句中指定连接的条件,否则会产生笛卡尔积(X*Y)
使用别名可以简化SQL的编写,别名必须跟在表或视图的后面
7.1、简单连接查询:FROM子句接 表或视图,WHERE子句指定连接条件
ZX01 ZX02 ZX03 GEM02
------- ------- ----- ---------
terry 李帅 2G69 海外资讯
zhanna 詹妹 2G89 会计部
7.2、内连接INNER JOIN、左外连接LEFT JOIN、右外连接RIGHT JOIN、完全外连接FULL JOIN、+操作符
内连接INNER JOIN:用于返回满足条件的所有记录,默认情况下在执行查询如果没有指定任何连接操作,则此查询SQL即为内连接
用户ID 用户姓名 部门ID 部门简称
-------- --------- -------- ----------
terry 李帅 2G69 海外资讯
zhanna 詹妹 2G89 会计部
左外连接LEFT JOIN/LEFT OUTER JOIN:不仅返回满足连接条件的结果集而且返回不满足连接条件的但是位于连接操作符左边 表或视图的结果集
--例如 qintan 用户的部门编号不存在gem_file,chris 用户部门信息为空
ZX01 ZX02 ZX03 GEM02
--------- ------ ------ ----------
terry 李某 2G69 海外资讯
zhanna 詹妹 2G89 海外会计
qintan 情 2M30
chris chris
右外连接RIGHT JOIN/RIGHT OUTER JOIN:不仅返回满足连接条件的结果集而且返回不满足连接条件的但是位于连接操作符右边 表或视图的结果集
ZX01 ZX02 ZX03 GEM02
-------- ------ ------ ---------
terry 李某 2G69 海外资讯
zhanna 詹妹 2G89 海外会计
行政部
企划科
完全外连接FULL JOIN/FULL OUTER JOIN:不仅返回满足连接条件的结果集而且返回不满足连接条件的位于连接操作符 左 右边表或视图的结果集
ZX01 ZX02 ZX03 GEM02
--------- ------ ------ ---------
terry 李某 2G69 海外资讯
zhanna 詹妹 2G89 海外会计
qintan 情 2M30
chris christ
行政部
企划科
7.3、+操作符:Oracle 9i之前的语法,现在已经不建议使用了,+出现在列的哪一边则哪一边的数据可以不一定要存在
+操作符 只能够出现在where子句中,且不能同时跟OUTER JOIN语法一起使用
+操作符 只能够实现左外连接(LEFT JOIN)及右外连接(RIGHT JOIN),但是不能够实现完全外连接
+操作符 只能使用在列上,不能够使用在运算式上
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
8、自连接查询:同一张表之间的连接查询,主要用在自参照表上显示同一张表不同栏位列的关系
-----------------------------------------------------------------------------------------------------------------------------------------
9、子查询:也称嵌套查询,是指嵌入在其他SQL语句中的SELECT语句
注意:当在DDL语句中引用子查询时可以带有ORDER BY子句,但是当在WHERE子句、SET子句中引用子查询时则不可以带有ORDER BY子句
应用:通过在WHERE、HAVING、START WITH子句中使用子查询可以提供条件值
通过在UPDATE语句中使用子查询可以修改一列或多列数据
通过在INSERT或CREATE TABLE语句中使用子查询可以将来源表数据插入到目标表中
通过在CREATE VIEW或是CREATE MATERIALIZED VIEW中使用子查询可以定义视图
9.1、单行子查询:只返回一行数据的子查询
ZX01 ZX02 ZX03
-------- ---------- ------
toptest 测试账号 2G69
terry 李某 2G69
9.2、多行子查询:只返回多行数据的子查询
当在WHERE子句中使用多行子查询时,必须使用多行比较符IN、ALL、ANY
IN:匹配子查询结果中的任意一个值即可
ALL:必须要符合子查询结果中的所有值, 不能单独使用,需配合单行比较符(=,>,<.>=,<=,<>,!=)使用
ANY:只要符号子查询结果中的任意值即可,不能单独使用,需配合单行比较符(=,>,<.>=,<=,<>,!=)使用
多行子查询中使用IN操作符
ZX01 ZX02 ZX03-------- --------- ------
toptest 测试账号 2G69
terry 李某 2G69
zhanna 詹妹 2G89
pIG XYZ 2G80
多行子查询中使用ALL操作符
订单 产品 金额----------------- ---------------------------- ---------
ZX1-11100659 12P0016W302111173 34000
ZX1-11100658 12P0010211-00111 14460
ZX1-11120228 35PT021120-001554 16080
ZX1-12010058 12P6000CW30201173 81000
多行子查询中使用ANY操作符
订单 产品 金额
----------------- ---------------------------- ---------
ZZ1-13100639 15P001XXXX02111173 78000
ZZ1-13100698 12P58912211-00111 88000
9.3、多列子查询:多列数据必须同时匹配
区别 单行子查询、多行子查询、多列子查询
单行子查询:返回单列单行数据,针对 单列
多行子查询:返回单列多行数据,针对 单列
多列子查询:返回多列数据的子查询,针对 多列
可以返回 多列单行数据,此时WHERE子句可以使用单行比较符如=.....,查询返回多列成对匹配的结果
可以返回 多列多行数据,此时WHERE子句可以使用多行比较符如IN.....,查询返回多列成对匹配的结果
未转工单订单 订单项次 产品 品名
----------------- ---------- ---------------------- - -----------------------------------
SY1-11080005 1 WZ110309990GCD DVI 18+1 To DVI 18+1 黑色
SY1-11080006 1 WZ110309930GCD HDD 15M To HDD 15M黑色
SY1-11080007 1 W11031010-0G D-SUB 15P M to D-SUB 15P M
9.4、在FROM子句中使用子查询:FROM子句中使用的子查询,该子查询会被当做视图看待,也称内嵌视图
部门编号 员工姓名 薪资 部门薪资
--------- ---------- ---------------- ---------
2SF0 刘SIR 77884.000000 46127
2N10 黄SIR 56621.000000 22816
2B22 陈SIR 86197.000000 86197
9.5、相关子查询EXISTS
相关子查询是指需要应用主查询列表中的子查询语句,需要通过谓词EXISTS来实现
当使用EXSISTS谓词时,如果子查询存在返回结果则条件返回TRUE,否则返回FALSE
ZX01 ZX02 ZX03
-------- ----------- ------
cmtest C-M-TEST 2G69
terry 李某 2G69
-----------------------------------------------------------------------------------------------------------------------------------------
10、合并查询:为了合并多个查询结果可以使用UNION、UNION ALL、INTERSECT、MINUS
语法:SELECT 语句1 [UNION |UNION ALL |INTERSECT | MINUS] SELECT 语句2
说明:这些集合操作符具有相同的优先级,当同时使用多个操作符时会按照从左到右的方式应用这些集合操作符
使用集合操作符时必须确保不同的查询语句查询的列的个数相同且类型也必须匹配
子句不能有ORDER、GROUP,必须放在整个语句的末尾
UNION:获取两个结果的并集,且去掉合并结果中重复的记录
ZX01 ZX02 ZX03-------- ----------- ------
cmtest C-M-测试 2G69
terry 李某 2G69
tiptop 2G69
toptest 测试账号 2G69
UNION ALL:获取两个结果的并集,但不会去掉合并结果中重复的记录
ZX01 ZX02 ZX03
-------- ----------- ------
cmtest C-M-测试 2G69
terry 李某 2G69
terry 李某 2G69
tiptop 2G69
toptest 测试账号 2G69
INTERSECT:取两个结果的交集
ZX01 ZX02 ZX03
-------- ----------- ------
terry 李某 2G69
MINUS:获取两个结果集的差集,返回在第一个结果集中存在但是第二个结果集中不存在的记录
ZX01 ZX02 ZX03-------- ----------- ------
cmtest C-M-测试 2G69
tiptop 2G69
toptest 测试账号 2G69
-----------------------------------------------------------------------------------------------------------------------------------------
11、数据分组查询统计
实际应用中常需要做的就统计数据库中的信息,按照指定列分组群以比较各组群的差异信息
Oracle数据分组通过使用GROUP BY子句指定要分组的列
使用分组函数如COUNT、AVG、SUM、MAX、MIN等显示统计结果
使用HAVING子句限制分组显示结果(注意:having后面必须接分组函数)
如果查询有分组函数计算,则先将WHERE条件符合的资料计算,HAVING子句只是显示分组显示的结果,不参与分组函数的计算
常用分组函数:
MAX:取得列或运算式的最大值,适用于任何数据类型 MIN:取得列或运算式的最小值,适用于任何数据类型
AVG:取得列或运算式的平均值,适用于任何数据类型 SUM:取得列或运算式的总和,只适用于数字类型
COUNT:取得行数
VARIANCE:取得列或运算式的方差,只适用于数字类型 STDDEV:取得列或运算式的偏差,只适用于数字类型
注意:分组函数 只能够 出现在选择列表、ORDER BY、HAVING子句中,不能出现在 WHERE和GROUP BY子句中
除了COUNT(*)之外,其他分组函数都会忽略NULL行
执行SELECT语句时,选择列必须出现在GROUP BY子句中
CQK05 CQK03 CQK031 MIN(CQK30) AVG(CQK30) MAX(CQK30)
------- ------- -------- ------------- -------------- ----------------
2SF1 2012 3 52210 52210 52210
2SF1 2012 4 52210 52210 52210
2S90 2012 3 24333 48421 72509
2S90 2012 4 26806 49657.5 72509
2S80 2012 3 26345 45312 64279
2S80 2012 4 28848 46563.5 64279
ROLLUP生成横向统计信息
CQK09 AVG(CQK30) MIN(CQK30) MAX(CQK30)------- --------------- --------------- ---------------
张三 83859.25 36156 90674
李四 28752.36364 14905 30300
王五 31184.58333 6579 33494
赵六 23942 16405 31479
钱七 45496 23480 47702
王八 29241.25 29218 29249
九九 38760 38760 38760
黄十 36462.75 36432 36473
匡二 16833 16833 16833
刘一 56484.66667 54809 56665
41848.31707 6579 90674
GROUPING SETS 按多行多列分别统计信息
订单号码 原币币别 金额统计----------------- ----------- ---------------
ZZ1-12040413 12573.1584
KK3-12040009 19168.812
ZZ1-12040432 5739.51
. . . . . .
HKD 1833838.062
NTD 145010
USD 5554649.988
-----------------------------------------------------------------------------------------------------------------------------------------
12、如何查询某时刻点提交的数据资料
利用在from子句中指定as of子句,在as of子句中指定时间,也可以指定SCN
前提:数据库必须采用UNDO管理模式,并且初始化了undo_retention限制undo数据保留的时间
-----------------------------------------------------------------------------------------------------------------------------------------
13、CASE及递归查询等复杂应用.....
CASE应用语法:
CASE
WHEN condition1 THEN....
WHEN condition2 THEN....
ELSE ....
END
ZX01 ZX02 zx03 DEPARTMENT
-------- -------- ------- ----------------
acc 會ACC 无部门
zhanna 詹妹 2G89 财务部
amy72 葉妹 2G21 其他部门
tcx 童哥 2E10 其他部门
terry 李某 2G69 资讯部
WITH 表名 as (SQL子查询语句):可以将(SQL子查询语句复用)
START WITH ... CONNECT BY PRIOR ... 实现Oracle层次查询
START WITH:用于指定层次查询的起始根行,当然也可以指定末行开始查询
CONNECT BY:用于指定父子行关系,在其后必须使用PRIOR引用父行
FATHER_IMA LEVEL_IMA
----------------------------- --------------------------
11MP28440ZZZZ001110-004101 | B01288119000-002587 |
11MP28440ZZZZ001110-004101 | D281NP10100000 |
11MP28440ZZZZ001110-004101 | D282FEP0000001 |
B01288119000-002587 | D1120080000000 |
B01288119000-002587 | P50100079000000000-006447 |
P50100079000000000-006447 | C2418001ZZZZ00114-0009 |
P50100079000000000-006447 | C2418010ZZZZ00114-0009 |
C2418010ZZZZ00114-0009 | D281NP10100000 |
C2418010ZZZZ00114-0009 | D282FEP0000010 |
C2418010ZZZZ00114-0009 | E01320072801000 |
C2418001ZZZZ00114-0009 | D281NP10100000 |
C2418001ZZZZ00114-0009 | D282FEP0000001 |
C2418001ZZZZ00114-0009 | E01320072801000 |
E01320072801000 | D1120320000000 |
尾阶原物料材料
---------------------------------------
11MP28440ZZZZ001110-004101
D282FEP0000001
D281NP10100000
D1120080000000
D282FEP0000010
D282FEP0000001
D281NP10100000
D1120320000000