草庐IT

SAP-ABAP-SELECT语法SQL语法详解

Qunending 2023-04-26 原文
  1. select语句的基础语法格式

SELECT <FIELD>  FROM <TABLE>  WHERE <CONDITION>  INTO  <LT_TAB>

<FIELD>代表想要搜索的表字段,用TABLE~FIELD表示,当FIELD唯一确认在一个表时可省略TABLE指定

<TABLE>代表从哪个取数据

<CONDITION> 代表取出的数据要满足哪些条件

<LT_TAB> 代表存储在本程序的哪个位置

   代码示例

   上图代码的意思是从SPFLI表取出CARRID字段和CONNID字段,限制条件是DEPTIME大于120000,取出来的数据存到LT_TAB字段。

若想取出所有数据可以把改成

若想新增其他限制条件可以往后面并列条件其他

  1. SELECT 的连表

连表的目的是一次取出多个表的数据,根据某些字段关联其他表

INNER JOIN :全连接,连接的两个表连接字段必须能一一对应上,此条数据才能连表成功,连表失败的数据不会展示在结果表中

LEFT JOIN :左连接,连接的两个表连接字段必须能一一对应上,此条数据才能连表成功,以连接表为主表,连表失败后主表数据可以取出来,但是被连表数据无法取出来

RIGHT JOIN :右链接,连接的两个表连接字段必须能一一对应上,此条数据才能连表成功,以连接表为主表,连表失败后主表数据无法取出来,但是被连表数据可以取出来

以下列数据为例展示表连接,采购订单Z300138357有14个行项目,只有12行进行了收货,其中20行和30行没有收货,具体数据如下图所示

若是全连接,未收货的数据便不会取出来,可以看到下图结果表中没有20行和30行

若是左连接,未收货的数据会取出来,可以看到下图结果表中有20行和30行,但是表中取EKBE的字段不会展示出来

若是左连接,未收货的数据会取出来,可以看到下图结果表中有20行和30行,但是表中取EKPO的字段不会展示出来

 

  1. 聚合函数MAX,MIN,AVG

求某个数据最大值,最小值,平均值可以在字段清单使用聚合函数+括号+要求和的字段+字段别名+GROUP BY 分组,具体代码及结果如下图所示

  1. 聚合函数COUNT

求出满足条件是数据条目数,COUNT后面不加字段名称用*表示条目数, COUNTAS LINES + GROUP BY 分组具体代码及结果如下图所示

  1. 聚合函数SUM

SUM后面加需要求和的字段,不能是文本字段,GROUP BY 分组具体代码及结果如下图所示

  1. 数字类型字段在SELECT中的运算符

SELECT 中支持的运算符有加法,减法,和乘法,没有除法,运算的对象可以是所取的表中是数据(只能是数字类型),也可以是固定数字,不能是变量,多重计算要常用括号。示例代码 如下

  1. CHAR类型字段拼接拆分操作

拼接拆分字段仅能针对char类型字段,拼接字段使用&&做拼接,可以拼接常量,表中字段,但不可拼接sql外部变量。拆分字段使用SUBSTRING函数,该函数有三个参数,第一个参数是被拆分的字段,第二个参数是从第几位开始,包括该位,第三个参数是拆分多少位。示例代码及运行结果如下

  1.       其他的数字运算符号

DIV(arg1, arg2)         取整,两个数字必须是整数才能用

MOD(arg1, arg2)     取余,两个数字必须是整数才能用

CEIL(arg)   不小于arg值的最小整数,进1。

FLOOR(arg)  不大于arg值的最小整数,舍1。

DIVISION(arg1, arg2, dec)  arg1除 arg2的结果保留dec位小数,

ROUND(arg, pos)  四舍五入。 如果pos大于0,则将值四舍五入到小数点分隔符右侧的pos位置。 如果不是这样,则将小数点分隔符左侧的位置abs(pos)+1四舍五入。 如果位置数不够,则结果为0。 

9.FOR ALL ENTRIES IN 根据内表参数查询后台表数据

这个语法可以根据内表参数每一行精确的匹配后台表数据,但是使用它需要注意几点

  1. 在使用前必须判断非空,否则select语句相当于没有where条件限制,将取出表中所有数据。
  2. 搜索出的数据必须必须包含该表的全部主键,该方法自带去重功能,完全相同数据将会被删除。
  3. 用来做条件的内表不应该太大,内表每存在一行数据代表select语句多加一个where条件,条件太多影响效率越高

下图为该语法的示例及代码运行结果

10.内表当作后台表直接连表查询

与FOR ALL ENTRIES IN 相同,该语法也是可以将内表的每行数据当作where条件查询后台表数据,但与之不同的是没有非空和主键的限制。具体使用的要点是连接该内表时需要在前面加一个@符号,内表被当作后台表使用时需要用别名指代。具体代码及运行结果如下图。

同样内表也可以作为被连接字段用在被join的表中,代码示例如下,二者的差距在于主表是哪个,展示的数据有多少行

11.子查询语句作为条件查询

当select语句中的限制条件不明确,需要单独用一个sql查出数据时,可将该查询数据作为子查询语句代码示例如下

查询的物料必须扩展了工厂6A01,所有可以将该条件作为子查询

同样子查询可以使用所以的聚合函数如下图示例代码使用了sum函数

上图代码意思是查询采购订单,但是收货数量小于采购订单总数,即查询未收货完成的采购订单

12.字段类型转换CAST语句

    CAST语句一般与其他函数同时使用,当其他函数类型不满足时可以先使用CAST转换为需要的类型,如数字的拆分,行号的加减等,示例代码如下

13.CASE WHEN 分情况取值赋值

     该语句可以在sql中不同情况赋值不同数据,具体使用示例如下。

     CASE WHEN  表达式1  THEN 赋值1

                   WHEN 表达式2 THEN 赋值2

                   ELSE  赋值3   END   AS 字段别名

      示例代码及运行结果如下图

14. DISTINCT删除重复行

         加这个语句自动删除表中完全相同的行示例代码如下

15.SQL跨client取表数据,在SQL里面用USING CLIENT 其他client即可,但是要注意,两个client是同一个服务器才能取到


SELECT * FROM BKPF USING CLIENT '300' INTO TABLE @DATA(LT_TSTC) UP TO 10 ROWS.
  

附:部分sql代码示例

有关SAP-ABAP-SELECT语法SQL语法详解的更多相关文章

  1. ruby - 树顶语法无限循环 - 2

    我脑子里浮现出一些关于一种新编程语言的想法,所以我想我会尝试实现它。一位friend建议我尝试使用Treetop(Rubygem)来创建一个解析器。Treetop的文档很少,我以前从未做过这种事情。我的解析器表现得好像有一个无限循环,但没有堆栈跟踪;事实证明很难追踪到。有人可以指出入门级解析/AST指南的方向吗?我真的需要一些列出规则、常见用法等的东西来使用像Treetop这样的工具。我的语法分析器在GitHub上,以防有人希望帮助我改进它。class{initialize=lambda(name){receiver.name=name}greet=lambda{IO.puts("He

  2. ruby-on-rails - 使用 Sublime Text 3 突出显示 HTML 背景语法中的 ERB? - 2

    所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择

  3. ruby-on-rails - rspec should have_select ('cars' , :options => ['volvo' , 'saab' ] 不工作 - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request

  4. ruby - 覆盖相似的方法,更短的语法 - 2

    在Ruby类中,我重写了三个方法,并且在每个方法中,我基本上做同样的事情:classExampleClassdefconfirmation_required?is_allowed&&superenddefpostpone_email_change?is_allowed&&superenddefreconfirmation_required?is_allowed&&superendend有更简洁的语法吗?如何缩短代码? 最佳答案 如何使用别名?classExampleClassdefconfirmation_required?is_a

  5. ruby 语法糖 : dealing with nils - 2

    可能已经问过了,但我找不到它。这里有2个常见的情况(对我来说,在编程Rails时......)用ruby​​编写是令人沮丧的:"astring".match(/abc(.+)abc/)[1]在这种情况下,我得到一个错误,因为字符串不匹配,因此在nil上调用[]运算符。我想找到的是比以下内容更好的替代方法:temp="astring".match(/abc(.+)abc/);temp.nil??nil:temp[1]简而言之,如果不匹配,则简单地返回nil而不会出错第二种情况是这样的:var=something.very.long.and.tedious.to.writevar=some

  6. ruby - Ruby 语法糖有 "rules"吗? - 2

    我正在学习Ruby的基础知识(刚刚开始),我遇到了Hash.[]method.它被引入a=["foo",1,"bar",2]=>["foo",1,"bar",2]Hash[*a]=>{"foo"=>1,"bar"=>2}稍加思索,我发现Hash[*a]等同于Hash.[](*a)或Hash.[]*一个。我的问题是为什么会这样。是什么让您将*a放在方括号内,是否有某种规则可以在何时何地使用“it”?编辑:我的措辞似乎造成了一些困惑。我不是在问数组扩展。我明白了。我的问题基本上是:如果[]是方法名称,为什么可以将参数放在括号内?这看起来几乎——但不完全是——就像说如果你有一个方法Foo.d

  7. Hive SQL 五大经典面试题 - 2

    目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类

  8. ruby - 如何让Ruby捕获线程中的语法错误 - 2

    我正在尝试使用ruby​​编写一个双线程客户端,一个线程从套接字读取数据并将其打印出来,另一个线程读取本地数据并将其发送到远程服务器。我发现的问题是Ruby似乎无法捕获线程内的错误,这是一个示例:#!/usr/bin/rubyThread.new{loop{$stdout.puts"hi"abc.putsefsleep1}}loop{sleep1}显然,如果我在线程外键入abc.putsef,代码将永远不会运行,因为Ruby将报告“undefinedvariableabc”。但是,如果它在一个线程内,则没有错误报告。我的问题是,如何让Ruby捕获这样的错误?或者至少,报告线程中的错误?

  9. ruby-on-rails - 事件记录 : Select max of limit - 2

    我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).

  10. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

随机推荐