如果我去mysql shell输入SELECT * FROM users我得到 -
+--------+----------------+---------------------------------+----------+-----------+--------------------+--------------------+
| USERID | NAME | EMAILID | PASSWORD | USER_TYPE | CONTACT_ID_FKUSERS | COMPANY_ID_FKUSERS |
+--------+----------------+---------------------------------+----------+-----------+--------------------+--------------------+
| 137 | X | b@cc.com | # | ADMIN | 166 | 110 |
| 138 | Kshitiz | ksharma@aaa.com | asdf | ADMIN | 167 | 111 |
+--------+----------------+---------------------------------+----------+-----------+--------------------+--------------------+
Run Code Online (Sandbox Code Playgroud)
Oracle sqlplus 显示——
USERID NAME EMAILID PASSWORD USER_TYPE CONTACT_ID_FKUSERS COMPANY_ID_FKUSERS
---------- ----- ---------- ---------- ---------- ------------------ ------------------
137 X b@cc.com # ADMIN …Run Code Online (Sandbox Code Playgroud) 我需要将 JSON 对象存储在 SQLite 数据库中,然后对其进行复杂的查询。
我做了一个这样的表:
+--------------------------------------+
|document | property | string | number|
+--------------------------------------+
|foo | "title" | "test" | |
+--------------------------------------+
|foo | "id" | | 42 |
+--------------------------------------+
|bar | "id" | | 43 |
+--------------------------------------+
Run Code Online (Sandbox Code Playgroud)
对于两个对象
foo {"title": "test", "id": 42}
bar {id: 43}
Run Code Online (Sandbox Code Playgroud)
但我不能做“AND”查询,比如:
SELECT DISTINCT id FROM table WHERE title = "test" AND id = 42
Run Code Online (Sandbox Code Playgroud)
如您所见,“WHERE”之后的部分完全是胡说八道,但我不知道如何创建一个可以做我想做的查询。
那么您认为有更好的方法来存储我的数据,还是有一种解决方法来执行“AND”查询?
当然,JSON 可以包含任何属性,因此我无法为每个属性创建一个包含列的表。
我正在使用 WebSQL,它是没有扩展的 SQLite。
我知道我的问题很具体,但你能帮我吗?
这与计算符合特定条件的记录数有关,例如invoice amount > $100。
我倾向于更喜欢
COUNT(CASE WHEN invoice_amount > 100 THEN 1 END)
Run Code Online (Sandbox Code Playgroud)
然而,这同样有效
SUM(CASE WHEN invoice_amount > 100 THEN 1 ELSE 0 END)
Run Code Online (Sandbox Code Playgroud)
我认为 COUNT 更可取有两个原因:
COUNTCOUNT 可能在i += 1某处涉及一个简单的操作,而 SUM 不能指望它的表达式是一个简单的整数值。有没有人有关于特定 RDBMS 差异的具体事实?
我正在使用 SQLite 并且需要存储价格。SQLite 的REAL数据类型表示它使用的价格存储floating-point是不可接受的。除了 TEXT 之外,还有其他数据类型可以用来以数字方式存储价格,以便它们正确排序吗?
我有一个带有两个表的 sqlite 数据库,每个表有 50,000 行,包含(假)人的名字。我构建了一个简单的查询来找出有多少个名字(名字、中间名首字母、姓氏)是两个表共有的:
select count(*) from fakenames_uk inner join fakenames_usa on fakenames_uk.givenname=fakenames_usa.givenname and fakenames_uk.surname=fakenames_usa.surname and fakenames_uk.middleinitial=fakenames_usa.middleinitial;
Run Code Online (Sandbox Code Playgroud)
当除了主键上没有索引(与此查询无关)时,它运行得很快:
[james@marlon Downloads] $ time sqlite3 generic_data_no_indexes.sqlite "select count(*) from fakenames_uk inner join fakenames_usa on fakenames_uk.givenname=fakenames_usa.givenname and fakenames_uk.surname=fakenames_usa.surname and fakenames_uk.middleinitial=fakenames_usa.middleinitial;"
131
real 0m0.115s
user 0m0.111s
sys 0m0.004s
Run Code Online (Sandbox Code Playgroud)
但是如果我为每个表的三列添加索引(总共六个索引):
CREATE INDEX `idx_uk_givenname` ON `fakenames_uk` (`givenname` )
//etc.
Run Code Online (Sandbox Code Playgroud)
然后它运行得很慢:
[james@marlon Downloads] $ time sqlite3 generic_data.sqlite "select count(*) from fakenames_uk inner join fakenames_usa on fakenames_uk.givenname=fakenames_usa.givenname and fakenames_uk.surname=fakenames_usa.surname and fakenames_uk.middleinitial=fakenames_usa.middleinitial;"
131
real 1m43.102s
user 0m52.397s
sys …Run Code Online (Sandbox Code Playgroud) 从 SQLite FAQ 我知道:
多个进程可以同时打开同一个数据库。多个进程可以
SELECT同时进行。但是,任何时候只有一个进程可以对数据库进行更改。
所以,据我所知,我可以:1) 从多个线程 ( SELECT) 读取数据库 2) 从多个线程 ( SELECT)读取数据库并从单线程 ( CREATE, INSERT, DELETE)写入
但是,我读到了Write-Ahead Logging,它提供了更多的并发性,因为reader do not block writers and a writer do not block readings。读和写可以同时进行。
以下是出现 SQLITE_LOCKED 错误的其他原因:
- 试图
CREATE或DROP表或索引而SELECT声明仍悬而未决。- 当 a
SELECT在同一张表上处于活动状态时尝试写入表。- 尝试
SELECT在多线程应用程序中同时在同一张表上执行两个操作,如果 sqlite 未设置为这样做。- fcntl(3,F_SETLK 对 DB 文件的调用失败。例如,这可能是由 NFS 锁定问题引起的。此问题的一种解决方案是将 DB 移走,然后将其复制回来,使其具有新的 Inode 值
所以,我想为自己澄清一下,有必要避免锁吗?我可以从两个不同的线程同时读取和写入吗?谢谢。
是否可以编写包含 SQLite 点命令( vis. .read file.sql; .separator ,; .import file.csv;)的脚本?
我正在构建并反复重建 SQLite 数据库,每次重建数据库时都需要输入大约 24 个点命令语句。如果我可以将这些命令放在脚本中并让 SQLite 读取它们,那就太好了。
有没有办法将点命令(而不是SQL 语句)放入脚本并让 SQLite 运行它们?
我在 Mac OS X 上使用 bash。
在 Sqlite 3 中,我试图弄清楚如何根据最小值选择行。我认为我对相关术语的了解不足,无法有效地搜索谷歌。
该表看起来像:
num text num2
---------- ---------- ----------
0 a 1
0 a 2
1 a 3
1 b 4
Run Code Online (Sandbox Code Playgroud)
我想获取num2is1, 2和的行4。我想根据文本列的每个唯一值的 num 的最小值进行选择。
所以,对于text = 'a',最小值num是0,所以我想要第 1 行和第 2 行。对于text = 'b',最小值num是1,所以我想要行4。
使用 group by 的各种组合,我可以得到行1和2或行1和4。我觉得我缺少一个可以做我想做的事情的 SQL 组件,但我一直无法弄清楚它可能是什么。
执行此类查询的正确方法是什么?
我找到了一种方法来做到这一点。我的声誉不足以回答我自己的问题,所以我在这里进行更新。我不确定它是否总是正确的或效率如何。欢迎提出任何意见。
我使用了一个复合选择语句,其中一个查询为文本的每个唯一值找到 num 的最小值:
sqlite> select …Run Code Online (Sandbox Code Playgroud) sqlite ×10
count ×1
datatypes ×1
index ×1
json ×1
locking ×1
money ×1
mysql ×1
optimization ×1
oracle ×1
performance ×1
postgresql ×1
scripting ×1
sql-server ×1