单表查询:
1.or和and混合使用
需求:查询业主名称包含'刘'或门牌号包含'5'的,并且地址编号为3的记录SELECT*FROMT_OWNERSWHERE("NAME"LIKE'%刘%'orHOUSENUMBERLIKE'%5%')ANDADDRESSID=3
and的权限优先于 or所以需要在or的两边添加()
2.范围查询
除了传统的where usenum >=100 and usenum <=200,还可以用between and查询
SELECT*fromT_ACCOUNTWHEREUSENUMBETWEEN100and200--只适合>=或<=
3.去空查询
SELECT*FROMT_PRICETABLEWHEREMAXNUMISNULL;SELECT*FROMT_PRICETABLEWHEREMAXNUMISNOTnull;
4.去掉重复记录SELECTADDRESSIDFROMT_OWNERSGROUPBYADDRESSID;SELECTDISTINCTADDRESSIDFROMT_OWNERS;--执行效率高
5.基于伪列的查询
rowid :表中每一行在数据文件中都有一个物理地址,rowid返回就是该行的物理地址
SELECTROWID,t.*FROMT_AREAt;
rownum :通过rownum伪列可以限制查询结果集中返回的行数,可用于分页SELECTROWNUM,t.*FROMT_OWNERSt;
6.聚合函数
sum(),avg(),max(),min(),count()括号内传递条件,如:
SELECT"COUNT"(*)FROMT_OWNERStWHEREOWNERTYPEID=1;
分组聚合group by如果后面加having条件,即在分组后过滤数据SELECTAREAID,"SUM"(MONEY)FROMT_ACCOUNTGROUPBYAREAIDHAVING"SUM"(MONEY)>169000
多表查询:
连接规定 能用内连接 就不用外链接 能用左外 就 不用右外
1.内连接
需求:查询显示业主编号,业主名称,业主类型名称
SELECT
t1."ID",
T1."NAME",
T2."NAME"FROM
T_OWNERSt1,
T_OWNERTYPEt2WHERE
T1.OWNERTYPEID=T2."ID"
需求:查询显示业主编号,业主名称,地址,业主类型名称
SELECT
T1."ID",
T1."NAME",
t2."NAME",
T3."NAME"FROM
T_OWNERSt1,
T_OWNERTYPEt2,
T_ADDRESSt3WHERE
T1.OWNERTYPEID=T2."ID"ANDt1.ADDRESSID=T3."ID";
注意:多表的内连接,可以先写fromxxx ,xxx ,xxx以及wherexx=yy,aa=bb,xx=zz,最后再写select * 需要显示的内容
2.左外连接
需求:查询业主的账务记录,显示业主的编号,名称,年,月,金额,没有账务信息也要列出
SELECT--这是SQL1999标准的语法
A1."ID",
A1."NAME",
B1."YEAR",
B1."MONTH",
B1.MONEYFROM
T_OWNERSa1LEFTJOINT_ACCOUNTb1ONA1."ID"=b1.OWNERUUID
SELECT--这是ORACLE提供的语法
A1."ID",
A1."NAME",
B1."YEAR",
B1."MONTH",
B1.MONEYFROM
T_OWNERSa1,
T_ACCOUNTb1WHERE
A1."ID"=B1.OWNERUUID(+);
注意:left join左边的是主表,右边的是辅表,on后面是条件;ORACLE提供的,谁是辅表就在谁身上
加 (+) .
3.子查询
单行子查询:
需求:查询01月用水量大于台账记录平均值的数据.分析:先查平均值,再传入
SELECT
*FROM
T_ACCOUNTWHERE
"YEAR"=''AND"MONTH"='01'ANDUSENUM>(SELECT--查平均值
"AVG"(USENUM)FROM
T_ACCOUNTWHERE
"YEAR"=''
AND"MONTH"='01')
多行子查询:
需求:查询地址编号为1,3,4的业主记录.分析:如果用or来编写太繁琐,所以用inSELECT*FROMT_OWNERSWHEREADDRESSIDIN(1,3,4);
需求:查询地址含有"花园"的业主信息.分析:先模糊查询,再传入
SELECT
*FROM
T_OWNERSWHERE
ADDRESSIDIN(SELECT
"ID"--外查询需要addressID,所以内查询要查idFROM
T_ADDRESSWHERE
"NAME"LIKE'%花园%'
);
注意:not in不包含 is not null代表不为空;子查询查询的结果作为条件传入另一个SQL语句
分页查询:
简单分页查询:
需求:分页查询台账表,每页10条记录.分析:rownum不能使用>符号,只能
使用子查询:
SELECT
*FROM
(
SELECT
ROWNUMr,
A1.*
FROM
T_ACCOUNTa1WHERE
ROWNUM<=20--如果要嵌套排序查,代码该如何写?
)WHERE
r>10;
基于排序的分页:
SELECT
*FROM
(SELECT
A.*,ROWNUMRNFROM
(SELECT
*
FROM
T_ACCOUNTWHERE
YEAR=''
ORDERBY
USENUMDESC
)A--A表代表排序,也是三层中的数据层,第一步
)B--B表代表基于伪列查询,也是三层中的伪列层,第二步WHERE--最后就是分页查询了,也是三层中的分页层,第三步
B.RNBETWEEN(3-1)*5+1--ORACLE中索引是从1开始的AND3*5;--条件要知道怎么计算
未完待续...
如果觉得《oracle查询注意点 oracle查询相关注意点》对你有帮助,请点赞、收藏,并留下你的观点哦!