VF中SQl语句中的select语句如何使用……
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VF中SQl语句中的select语句如何使用……相关的知识,希望对你有一定的参考价值。
如题……
SQL语法SQL给出了简单而又丰富的查询语句形式,SQL的查询命令也称作SELECT命令,它的基本形式由SELECT-FROM-WHERE查询块组成,多个查询块可以嵌套执行。格式: SELECT [ALL|DISTINCT][ TOP〈表达式〉 ] [〈别名〉] 〈Select表达式〉 [AS 〈列名〉 ][, [ 〈别名〉] 〈Select表达式〉 [AS 〈列名〉 ]…] FORM[〈数据库名〉 !] 〈表名〉 [[AS]Local_Alias] [[INNER | LEFT [OUTER] | RIGHT [OUTER] | FULL [OUTER] JOIN[〈数据库名〉!] 〈表名〉 [[AS]Local_Alias][ON〈联接条件〉]] [INTO 〈查询结果〉 |TO FILE 〈文件名〉 [ADDITIVE] | TO PRINTER [PROMPT] | TO SCREEN] [PREFERENCE PreferenceName][NOCONSOLE][PLAIN][NOWAIT] [WHERE 〈联接条件1〉 [AND 〈联接条件2〉…][AND | OR 〈筛选条件〉…]] [GROUP BY 〈组表达式〉 ][, 〈组表达式〉 …]] [HAVING ]〈筛选条件〉 ] [UNION [ALL] 〈SELECT命令〉 ] [ORDER BY 〈关键字表达式〉 [ASC |DESC] [, 〈关键字表达式〉 [ASC |DESC]…]]说明:SELECT-SQL命令的格式包括三个基本子句:SELECT子句、FROM子句、WHERE子句,还包括操作子句:ORDER子句、GROUP子句、UNION子句以及其他一些选项。1.SELECT子句SELECT子句用来指定查询结果中的数据。其中:ALL选项:表示选出的记录中包括重复记录,这时缺省值;DISTINCT则表示选出的记录中不包括重复记录。TOP〈表达式〉选项:表示在符合条件的记录中,选取指定数量或百分比(〈表达式〉)记录。[〈别名〉]〈Select表达式〉[AS〈列名〉]选项中的别名是字段所在的表名;〈Select表达式〉,可以是字段名或字段表达式;〈列名〉用于指定输出时使用的列标题,可以不同于字段名。〈Select表达式〉用一个*号来表示时,指定所有的字段。2.FROM子句用于指定查询的表与联接类型。其中:JOIN关键字用于联接其左右两个〈表名〉所指定的表。INNER | LEFT[OUTER] | RIGHT[OUTER] | FULL[OUTER]选项,指定两表联接时的联接类型,联接类型有4种,如表13.2所示。其中的OUTER选项,表示外部联接,即允许满足联接条件的记录,又允许不满足联接条件的记录。若省略OUTER选项,效果不变。表13.2 联接类型——————————————————————————————————联接类型 意义————————————————————————??Inner Join(内部联接) 只有满足联接条件的记录包含在结果中Left Outer Join(左联接) 左表某记录与右表所有记录比较字段值,若有满足联接条件的,则产生一个真实记录;若都有满足,则产生一个含.NULL值的记录直到右表所有记录都比较完Full Jion(完全联接) 先按右联接比较字段值,再按左联接比较字段值。不列入重复记录—————————————————————————————————————ON选项:用于指定联接条件。INTO与TO选项:用于指定查询结果的输出去向,默认查询结果显示在浏览窗口中。INTO选项中的〈查询结果〉有3种,如表13.3所示。表13.3 查询结果———————————————————— 目标 输出形式————————————————————— ARRAY〈数组〉 查询结果输出到数组 CURSOR〈临时表〉 查询结果输出到临时表 TABLE | DBF〈表名〉 查询结果输出到表—————————————————————TO FILE选项:表示输出到指定的文本文件,并取代原文件内容。ADDITIVE选项:表示只添加新数据,不清除原文件的内容。TO PRINTER选项:表示输出到打印机。PROMPT选项:表示打印前先显示打印确认框。TO SCREEN选项:表示输出到屏幕。PLAIN选项:表示输出时省略字段名。NOWAIT选项:表示显示浏览窗口后程序继续往下执行。3.WHERE子句用来指定查询的条件。其中的〈联接条件〉指定一个字段,该字段连接FROM子句中的表。如果查询中包含不止一个表,就应该为第一个表后的每一个表指定连接条件。4.其他子句和选项GROUP BY子句:对记录按〈组表达式〉值分组,常用于分组统计。HAVING子句:当含有GROUP BY子句时,HAVING子句可用作记录查询的限制条件;无GROUP BY 子句时,HAVING子句的作用如同WHERE子句。UNION子句:可以用UNION子句嵌入另一个SELECT-SQL命令,使这两个命令的查询结果合并输,但输出字段的类型和宽度必须一致。UNION子句默认组合结果中排除重复行,使用ALL,则允许包含重复行。ORDER BY子句:指定查询结查中记录按〈关键字表达式〉排序,默认升序。选项ASC表示升序,DESE表示降序。SELECT查询命令的使用非常灵活,用它可以构造各种各样的查询。本章将通过大量的实例来介绍SELECT命令的使用方法。13.2.2 简单查询简单查询只含有基本子句,可有简单的查询条件。【13.1】在zgda表中,检索所有字段。 SELECT * FROM zgda13.2.2 简单查询【13.2】在zggz表中,检索实发工资大于2000元的记录。 SELECT 编号,姓名,实发工资 FROM zggz WHERE 实发工资>200013.2.2 简单查询【13.3】在zgda表中,检索所有职称名称。 SELECT DISTINCT 职称 FROM zgda【13.4】在zgda表中,检索职称是助教的记录。 SELECT 编号,姓名,职称 FROM zgda WHERE 职称="助教"13.2.2 简单查询【13.5】在zggz表中,检索实发工资小于1000大于1800元的记录。命令执行结果如图13.5所示。 SELECT 编号,姓名,实发工资 FROM zggz WHERE 实发工资>1000 AND 实发工资<1800 参考技术A select (内容) from (表名) where (条件) 参考技术B 比如你的数据库里有student表,表里有ID,name这些元素select namefrom studentwhere ID='123';查询ID号为123的人名字 参考技术C 这里面都是简单切常用的基础的sql语句 去这里学习吧参考资料 http://www.1keydata.com/tw/sql/sql.html xx 参考技术D 看看VFP自带的帮助文件.使用glue_sql() 并避免粘贴在动态SELECT 语句中的方法?
【中文标题】使用glue_sql() 并避免粘贴在动态SELECT 语句中的方法?【英文标题】:Way to use glue_sql() and avoid paste in dynamic SELECT statement?使用glue_sql() 并避免粘贴在动态SELECT 语句中的方法?
【发布时间】:2021-10-17 02:05:08
【相关技术】:@tags@
【问题描述】:
我正在学习如何从 R 中查询 SQLite dbs,并使用 glue_sql()
构建这些查询。下面是我的工作流程中子查询的简化示例。有没有一种方法可以在不使用paste0()
的情况下创建s10_wtX
和s20_wtX
,如下面的代码所示?
library(DBI)
library(dplyr)
library(glue)
# example database
set.seed(1)
ps <- data.frame(plot = rep(1:3, each = 4),
spp = rep(1:3*10, 2),
wtX = rnorm(12, 10, 2) %>% round(1))
con <- dbConnect(RSQLite::SQLite(), "")
dbWriteTable(con, "ps", ps)
# species of interest
our_spp <- c(10, 20)
# for the spp of interest, sum wtX on each plot
sq <- glue_sql(paste0(
'SELECT ps.plot,\n',
paste0('SUM(CASE WHEN ps.spp = ', our_spp,
' THEN (ps.wtX) END) AS s', our_spp,
'_wtX',
collapse = ',\n'), '\n',
' FROM ps
WHERE ps.spp IN (our_spp*) -- spp in our sample
GROUP BY ps.plot'),
.con = con)
# the result of the query should look like:
dbGetQuery(con, sq)
plot s10_wtX s20_wtX
1 1 21.9 10.4
2 2 11.0 22.2
3 3 9.4 13.0
在我的实际工作流程中,我有两种以上的兴趣,所以我宁愿不完整地写出每一行(例如,SUM(CASE WHEN ps.spp = 10 THEN (ps.wtX) END) AS s10_wtX
)。
【问题讨论】:
您可以更轻松地在 SQL 中进行简单的聚合并在 R 中进行透视,您是否试图避免这种情况? 使用glue
,您可以使用our_spp
并避免使用paste
(来自我之前的评论)例如,您可以使用dbGetQuery(con, "select ps.plot, ps.spp, sum(ps.wtX) as wtX from ps where ps.spp in (10,20) group by ps.plot, ps.spp") %>% tidyr::pivot_wider(plot, names_from="spp", values_from="wtX")
(如果您可以使用dplyr+tidyr
,与reshape2
或data.table
的结果类似)来获得所需的输出。
我不确定您是否只有sqlite,但其他DBMS 有PIVOT
运算符。例如,在 Oracle 中它将是 SELECT * FROM (SELECT ps.plot, ps.spp, ps.wtX FROM ps WHERE ps IN (10, 20)) PIVOT (SUM(wtX) FOR spp IN (10 as s10_wtx, 20 as s20_wtx)
。但是...在 R 中进行处理可能更有意义。
标记了@akrun 的答案,因为它显示了glue_collapse()
,并且很容易融入我的工作流程;但将重新审视@r2evans 的想法,尽可能避免glue_sql()
++
【参考方案1】:
OP的原始问题是
有没有一种方法可以在不使用 paste0() 的情况下创建 s10_wtX 和 s20_wtX,如下面的代码所示?
如果我们只想用glue
构造,也可以使用glue_collapse
library(glue)
sq1 <- glue_sql('SELECT ps.plot,', glue_collapse(glue('SUM(CASE WHEN ps.spp = our_spp THEN (ps.wtX) END) AS sour_spp_wtX'), sep = ",\n"), '\nFROM ps\n WHERE ps.spp IN (our_spp*) -- spp in our sample\n GROUP BY ps.plot', .con = con)
dbGetQuery(con, sq1)
plot s10_wtX s20_wtX
1 1 21.9 10.4
2 2 11.0 22.2
3 3 9.4 13.0
【讨论】:
很好奇(因为我不经常使用glue
),是glue_collapse
实际上只是paste
-ing 它与collapse=""
?
它在内部使用paste
和collapse
,并在调用as_glue
时返回胶水格式【参考方案2】:
为了正式一点(即使它不是你最终使用的),这里是我的 cmets,详细:
out <- DBI::dbGetQuery(con, "
select ps.plot, ps.spp, sum(ps.wtX) as wtX
from ps
where ps.spp in (10,20)
group by ps.plot, ps.spp")
out
# plot spp wtX
# 1 1 10 21.9
# 2 1 20 10.4
# 3 2 10 11.0
# 4 2 20 22.2
# 5 3 10 9.4
# 6 3 20 13.0
这可以很容易地根据您的需要进行调整。例如,使用tidyr::pivot_wider
,
tidyr::pivot_wider(out, plot, names_from="spp", values_from="wtX")
# # A tibble: 3 x 3
# plot `10` `20`
# <int> <dbl> <dbl>
# 1 1 21.9 10.4
# 2 2 11 22.2
# 3 3 9.4 13
(名称需要清理。)
【讨论】:
以上是关于VF中SQl语句中的select语句如何使用……的主要内容,如果未能解决你的问题,请参考以下文章
关于VF中select left(right) join的准确用法
请问如何使用SQL语句查询同一张表中互为相反数的两条记录!如A1=500,A2=-500,如何写SQL语句