网站首页 > 技术文章 正文
概述
一般我们在写sql如果查询的select 字段中关联其他表一般是放在where后关联其他表,那有没有其他改进的方式呢?下面基于Oracle数据库做下测试。
降低业务逻辑复杂度的查询sql
大部分情况下,做几张表关联的时候的sql查询语句写法如下:
select A表.字段1,A表.字段2,B表.字段返回,C表.字段返回 from A表 ,B表,C表 [where A表,B表,C表关联及各自的条件语句]
但是这个方法有一个缺点,那就是在动态的生成这个查询语句的业务逻辑程序还是很复杂。
这里介绍一个降低业务逻辑复杂度的查询sql。其语法结构如下:
select A表.字段1,A表.字段2,B表.字段,C表.字段 from A表 [where A表的条件语句]
业务逻辑程序通过这种方式生成的sql语句时只需修改select的字段,而不需像通用方法那样需要同时动态修改select字段,from的表,以及where 语句。这样整一个业务逻辑就能将生成sql语句的关注点由3+个减少为1个。
实例说明
1、基础数据准备
建立三个表,一个反应学生基本情况的信息表——student表,两个存放学生相关信息的代码表——sexCode表(性别代码表),gradeCode(年纪代码表),建表语句如下:
-- Create table STUDENT create table STUDENT ( ID number, name nvarchar2(10), sex char(1), grade char(1), age number(2) ) ; -- Create table SEXCODE create table SEXCODE ( DM char(1), MC nvarchar2(5) ) ; -- Create table GRADECODE create table GRADECODE ( DM CHAR(1), MC NVARCHAR2(5) ) ;
执行以下insert语句,分别在每个表中填入信息。
--insert into student insert into student(id,name,sex,grade,age) values(1,'张三','1','2',8); insert into student(id,name,sex,grade,age) values(2,'李四','0','1',11); insert into student(id,name,sex,grade,age) values(3,'王五','1','2',9); insert into student(id,name,sex,grade,age) values(4,'刘二','0','4',8); insert into student(id,name,sex,grade,age) values(5,'韩六','0','3',6); --insert into sexcode insert into sexcode(dm,mc) values('1','男'); insert into sexcode(dm,mc) values('0','女'); --insert into gradecode insert into gradecode(dm,mc) values('1','一年级'); insert into gradecode(dm,mc) values('2','二年级'); insert into gradecode(dm,mc) values('3','三年级'); commit;
2、通用查询方式
select s.id,s.name,sc.mc sex,gc.mc grade,s.age from student s,sexcode sc,gradecode gc where sc.dm=s.sex(+) and s.grade=gc.dm(+);
3、优化后sql查询方式:
select s.id,s.name,s.age, (select mc from sexcode where dm=s.sex) sex, (select mc from gradecode where dm=s.grade) grade from student s;
说明:1.对于二者的性能,这里只是做了个简单测试,1000条数据查询耗时二者相当,而且第二个方法甚至略优于普通方法。
后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注一下~
猜你喜欢
- 2024-10-19 详解oracle分页存储过程---附实例分享
- 2024-10-19 详解Oracle 数据库enq:TX-index contention等待事件及解决方案
- 2024-10-19 「Oracle」为大家带来connect by的用法,Oracle的递归
- 2024-10-19 基于dba_lobs查找Oracle中lobsegment、lobindex与表之间关系
- 2024-10-19 Oracle项目管理系统之沟通协作 oracle 合作伙伴
- 2024-10-19 oracle sql优化 oracle sql优化的几种方法
- 2024-10-19 关于Oracle中重复数据只取一条记录
- 2024-10-19 ORACLE PL/SQL中异常处理全面分析
- 2024-10-19 大公司oracle笔试题及答案(2) oracle公司待遇如何
- 2024-10-19 Mysql中的关联查询(内连接,外连接,自连接)
你 发表评论:
欢迎- 05-10如何优化数据库和前端之间的交互?
- 05-10前端代码优化小秘籍(前端优化24条建议)
- 05-10VS Code当中的15个神仙插件,值得收藏
- 05-10如何自己开发一个Google浏览器插件?
- 05-10前端流行框架Vue3教程:14. 组件传递Props效验
- 05-10吃了一年的SU,最好用的插件都在这了
- 05-10前端必看!这款神器让网站界面告别千篇一律
- 05-10程序员请收好:10个非常有用的 Visual Studio Code 插件
- 最近发表
- 标签列表
-
- 前端设计模式 (75)
- 前端性能优化 (51)
- 前端模板 (66)
- 前端跨域 (52)
- 前端md5加密 (49)
- 前端路由 (55)
- 前端数组 (65)
- 前端定时器 (47)
- 前端懒加载 (45)
- 前端接口 (46)
- Oracle RAC (73)
- oracle恢复 (76)
- oracle 删除表 (48)
- oracle 用户名 (74)
- oracle 工具 (55)
- oracle 内存 (50)
- oracle 导出表 (57)
- oracle查询数据库 (45)
- oracle约束 (46)
- oracle 中文 (51)
- oracle链接 (47)
- oracle的函数 (57)
- mac oracle (47)
- 前端调试 (52)
- 前端登录页面 (48)
本文暂时没有评论,来添加一个吧(●'◡'●)