假设您有以下表格和数据:
create table t (
k int,
v int,
index k(k)
) engine=memory;
insert into t (k, v)
values (10, 1),
(10, 2),
(10, 3);
Run Code Online (Sandbox Code Playgroud)
发出select * from t where k = 10noorder by子句时,MySQL默认如何对记录进行排序?
如果没有返回行,我想为应该使用的列使用默认值。这在 PostgreSQL 中可能吗?我该怎么做?或者我还有其他方法可以解决这个问题吗?
例如这样的事情:
SELECT MAX(post_id) AS max_id DEFAULT 0 FROM my_table WHERE org_id = 3
Run Code Online (Sandbox Code Playgroud)
如果org_id = 3表中没有行,我想返回0。
我正在将旧的基于 MS-Access 的系统转换为 PostgreSQL。在 Access 中,由 SELECT 组成的字段可以用作后面字段的等式的一部分,如下所示:
SELECT
samples.id,
samples.wet_weight / samples.dry_weight - 1 AS percent_water,
100 * percent_water AS percent_water_100
FROM samples;
Run Code Online (Sandbox Code Playgroud)
当我在 PostgreSQL 中这样做时,Postgres 抛出一个错误:
错误:“percent_water”列不存在。
通过从子选择中进行选择,我可以通过以下方式解决此问题:
SELECT
s1.id,
s1.percent_water,
100 * s1.percent_water AS percent_water_100
FROM (
SELECT
samples.id,
samples.wet_weight / samples.dry_weight - 1 AS percent_water
FROM samples
) s1;
Run Code Online (Sandbox Code Playgroud)
有没有像第一个代码块那样的快捷方式来绕过复杂的嵌套?我也可以说100 * (samples.wet_weight / samples.dry_weight - 1) AS percent_water_100,但这只是我的代码中进行的更大的数学系统中的一个小例子,其中有数十个更复杂的数学位相互叠加。我宁愿尽可能干净地做而不重复自己。
我想限制从
SHOW TABLE STATUS
Run Code Online (Sandbox Code Playgroud)
MySQL 5.1 中的命令。有没有办法通过SELECT语句获得相同的信息,以便我可以以正常方式操作结果?
在过去的日子里,这被认为是一个很大的禁忌select * from table或select count(*) from table因为性能受到影响。
在 SQL Server 的更高版本中是否仍然如此(我使用的是 2012,但我想这个问题适用于 2008 - 2014)?
编辑:由于人们似乎在这里稍微批评我,我是从基准/学术的角度来看这个的,而不是这是否是“正确”的事情(当然不是)
背景
我想提供重现select查询所需的数据库子集。我的目标是使我的计算工作流程可重复(如可重复研究)。
题
有没有办法可以将这个 select 语句合并到一个脚本中,该脚本将查询的数据转储到一个新数据库中,这样数据库就可以安装在新的 mysql 服务器上,并且该语句可以与新数据库一起使用。除了查询中已使用的记录外,新数据库不应包含其他记录。
更新: 为了澄清起见,我对查询结果的 csv 转储不感兴趣。我需要能够做的是转储数据库子集,以便它可以安装在另一台机器上,然后查询本身可以重现(并且可以针对相同的数据集进行修改)。
例子
例如,我的分析可能会查询需要来自多个(在本例中为 3 个)表中的记录的数据子集:
select table1.id, table1.level, table2.name, table2.level
from table1 join table2 on table1.id = table2.table1_id
join table3 on table3.id = table2.table3_id
where table3.name in ('fee', 'fi', 'fo', 'fum');
Run Code Online (Sandbox Code Playgroud) 我注意到查询子句中的USING构造(而不是ON)可能会在某些情况下引入优化障碍。FROMSELECT
我的意思是这个关键词:
选择 * 从一个 加入 b使用(a_id)
只是在更复杂的情况下。
上下文:this comment to this question。
我用这个了很多,从来没有发现过这么远。我会对展示效果的测试用例或任何指向更多信息的链接非常感兴趣。我的搜索努力是空的。
完美的答案将是一个测试用例,USING (a_id)与替代 join 子句相比,它的性能较差ON a.a_id = b.a_id——如果这真的可以发生的话。
我有两个表,table_a (id, name) 和 table_b (id),假设在 Oracle 12c 上。
为什么这个查询不返回异常?
select * from table_a where name in (select name from table_b);
Run Code Online (Sandbox Code Playgroud)
据我了解,Oracle 认为这是
select * from table_a where name = name;
Run Code Online (Sandbox Code Playgroud)
但我不明白的是为什么?
我是新来的,所以请善待我。我有以下场景:
我有很多表,为了简单起见,它们在我的 MySQL 数据库的视图中表示。我的问题是我需要在这个视图中使用一个值来表示它是一种事件还是另一种事件(一个简单的布尔值),我试图通过以下方式实现:
`gu`.`StoppingUnitEventME` = `ese`.`MonitoringElement` AS `IsStopingEvent`
Run Code Online (Sandbox Code Playgroud)
结果表示为 int,因此由实体框架读取。问题是我真的需要一个布尔返回值,我试图通过以下方式实现:
CAST((`gu`.`StoppingUnitEventME` = `ese`.`MonitoringElement`) as boolean) AS `IsStopingEvent`
Run Code Online (Sandbox Code Playgroud)
这导致了一个错误,这个错误没有在 MySQL Workbench 中显示给我(我只收到烦人的“你有一个错误......”)。
你们能帮我吗?
试图在我的应用程序中解决它,但我真的更喜欢在数据库中解决这个问题,因为它以后会被其他软件使用。
在 MySQL 中,我们可以创建带有或不带有反引号 ( `) 符号的查询。例子:
SELECT * FROM TEST;SELECT * FROM `TEST`;两者都在 mysql-console 中工作正常。
它们之间有什么技术区别吗?
`与简单查询相比,使用 ( )有什么好处吗?
select ×10
mysql ×5
postgresql ×3
join ×2
aggregate ×1
backup ×1
datatypes ×1
index ×1
mysql-5 ×1
mysqldump ×1
optimization ×1
oracle ×1
order-by ×1
performance ×1
sql-server ×1
subquery ×1