任何人都可以告诉我,在查找表的行数时,MySQL中哪个是更好的appraoch:是否更好做
SELECT COUNT(*) FROM TABLE_NAME
Run Code Online (Sandbox Code Playgroud)
或者查找表TABLE
中的行数INFORMATION_SCHEMA
?
这是计算页面分页计数的常用操作吗?
我应该补充说,表最多只有几千行.
谢谢
马丁奥谢.
所有,
我有一个MYSQL表,其中包含一个名为timestamp的列.它是DATETIME
数据类型,其值类似于"10/1/2009 3:25:08 PM',"10/1/2009 3:30:05 PM',"10/4/2009 3:40:01 PM',等等..
我想编写一个SQL查询来选择两个日期之间的时间戳字段中的所有值.这样的事情:
select timestamp from tablename where timestamp >= userStartDate and timestamp <= userEndDate
Run Code Online (Sandbox Code Playgroud)
userInput日期没有时间部分.你能为此建议正确的MySQL查询语法吗?谢谢
我有一个具有唯一非聚集索引的表,并且此索引中列出了4个列.我想更新表中的大量行.如果我这样做,它们将不再是不同的,因此更新因索引而失败.
我想要禁用索引,然后删除最旧的重复行.到目前为止,这是我的查询:
SELECT t.itemid, t.fieldid, t.version, updated
FROM dbo.VersionedFields w
inner JOIN
(
SELECT itemid, fieldid, version, COUNT(*) AS QTY
FROM dbo.VersionedFields
GROUP BY itemid, fieldid, version
HAVING COUNT(*) > 1
) t
on w.itemid = t.itemid and w.fieldid = t.fieldid and w.version = t.version
Run Code Online (Sandbox Code Playgroud)
内部联接内部的选择返回我们想要删除的正确数量的记录,但是对它们进行分组,实际上是实际数量的两倍.
加入后它会显示所有记录,但我想要删除的是最早的记录吗?
如何才能做到这一点?
我正在研究PostgreSQL 8.1 SQL脚本,它需要从表中删除大量行.
假设我需要删除的表是Employees(~260K行).它的主键名为id.
我需要从此表中删除的行存储在一个名为EmployeesToDelete(~10K记录)的单独临时表中,其中包含一个名为employee_id的Employees.id的外键引用.
有没有一种有效的方法来做到这一点?
起初,我想到了以下几点:
DELETE
FROM Employees
WHERE id IN
(
SELECT employee_id
FROM EmployeesToDelete
)
Run Code Online (Sandbox Code Playgroud)
但我听说使用"IN"子句和子查询可能效率低下,尤其是对于较大的表.
我查看了PostgreSQL 8.1文档,并提到了DELETE FROM ... USING但它没有示例,所以我不知道如何使用它.
我想知道以下是否有效并且效率更高?
DELETE
FROM Employees
USING Employees e
INNER JOIN
EmployeesToDelete ed
ON e.id = ed.employee_id
Run Code Online (Sandbox Code Playgroud)
非常感谢您的意见.
编辑:我运行了EXPLAIN ANALYZE,奇怪的是第一个DELETE跑得很快(几秒钟内),而第二个DELETE花了这么长时间(超过20分钟)我最终取消了它.
向临时表添加索引有助于提高性能.
这是对任何感兴趣的人的第一个DELETE的查询计划:
Hash Join (cost=184.64..7854.69 rows=256482 width=6) (actual time=54.089..660.788 rows=27295 loops=1)
Hash Cond: ("outer".id = "inner".employee_id)
-> Seq Scan on Employees (cost=0.00..3822.82 rows=256482 width=10) (actual time=15.218..351.978 rows=256482 loops=1)
-> Hash (cost=184.14..184.14 rows=200 width=4) (actual time=38.807..38.807 rows=10731 loops=1) …
Run Code Online (Sandbox Code Playgroud) 我必须编写一个查询,其中我需要ID
为特定记录分配一个(唯一密钥),该记录未被使用/未被生成/在数据库中不存在.
简而言之,我需要id
为特定记录生成一个并在打印屏幕上显示它.
E. g.:
ID Name 1 abc 2 def 5 ghi
所以,问题是它应该ID=3
作为尚未生成的下一个立即返回,并且在这一代之后id
,我将把这些数据存储回数据库表.
它不是一个硬件:我正在做一个项目,我有一个要求,我需要编写这个查询,所以我需要一些帮助来实现这一目标.
所以请指导我如何进行此查询,或如何实现此目的.
谢谢.
我无法添加评论,这就是为什么我在这里写我的评论..我使用MySQL作为数据库..
我的步骤是这样的: -
1)从数据库表中检索未使用的id.
2)因为他们不是.用户(基于网站的项目),所以我不想发生并发,所以如果一个用户生成一个ID,那么它应该锁定数据库,直到同一个用户收到id并存储该id的记录.之后,其他用户可以检索不存在的ID.(主要要求)..
我怎么能在MySQL中实现所有这些东西,而且我认为Quassnoi的答案是值得的,但它不适用于MySQL ..所以plz解释有关查询的一点,因为它对我来说是新的..并且这个查询工作在MySQL ..
我在我的数据库中有以下日期(dd/MM/yyyy)匹配事件:
eventId startDate endDate 1 02/05/2009 10/05/2009 2 08/05/2009 12/05/2009 3 10/05/2009 12/05/2009 4 21/05/2009 21/05/2009 5 25/05/2009 NULL 6 01/06/2009 03/06/2009
事件具有开始和结束日期(时间无关紧要),NULL endDate表示事件仍在进行中.
我想确定的是两个任意日期之间的日期范围,其中a)没有事件,b)事件是重叠的.
因此,对于输入日期范围01/04/2009 - 30/06/2009,我希望得到以下结果:
no event: 01/04/2009 - 01/05/2009 overlap : 08/05/2009 - 10/05/2009 overlap : 10/05/2009 - 12/05/2009 no event: 13/05/2009 - 20/05/2009 no event: 22/05/2009 - 24/05/2009 overlap : 01/06/2009 - 03/06/2009
注意,作为一个结果,两个相邻的重叠范围是可接受的.
任何人都可以帮我用SQL算法来生成这个结果集吗?
编辑:目标平台数据库是SQL Server 2005.日期记录为10/05/2009 00:00:00,这意味着该事件在10/5/2009 00:00:00和10/5之间的某个时间结束2009 23:59:59 开始日期也是如此.因此,输入日期范围也可以读作01/04/2009 00:00:00 - 30/06/2009 23:59:59.
我有一个基本的SQL查询,从以下开始:
SELECT top 20 application_id, [name], location_id FROM apps
Run Code Online (Sandbox Code Playgroud)
现在,我想完成它,以便它这样做(用伪代码编写)
if @lid > 0 then
WHERE location_id IN (@lid)
else
WHERE location_id is all values in location_id column
Run Code Online (Sandbox Code Playgroud)
根据要求,这是一个例子
application_id name location_id
----------------------------------------------------------
1 Joe Blogs 33
2 Sam Smith 234
3 Jeremy Carr 33
Run Code Online (Sandbox Code Playgroud)
@locid是用户给出的结果,例如'33,234'
如果@lid为空,那么我希望它输出具有name和application_id的location_id的所有行.否则,我希望它输出与@lid中提供的数字相关的所有行(代表location_id.
所以,如果@lid是0:
application_id name location_id
----------------------------------------------------------
1 Joe Blogs 33
2 Sam Smith 234
3 Jeremy Carr 33
Run Code Online (Sandbox Code Playgroud)
否则,如果@lid包含'33'
application_id name location_id
----------------------------------------------------------
1 Joe Blogs 33
3 Jeremy Carr 33
Run Code Online (Sandbox Code Playgroud) 如果视图用于向用户显示选定的列,则可以使用相同的列
SELECT col1, col2
FROM xyz
Run Code Online (Sandbox Code Playgroud)
,使用视图有什么意义?
如何在Sql server中实现标量MAX(如Math.Max).(在本质上我想实现类似Max(表达式,0)的东西,使负值替换为0.)
我已经在其他线程中看到了解决方案
什么是最好的?为什么Sql Server没有这样内置的东西?我看不到任何并发症?
我这样做是为了确保只运行一次这个进程的实例(伪代码php/mysql innodb):
START TRANSACTION
$rpid = SELECT `value` FROM locks WHERE name = "lock_name" FOR UPDATE
$pid = posix_getpid();
if($rpid > 0){
$isRunning = posix_kill($rpid, 0);
if(!$isRunning){ // isRunning
INSERT INTO locks values('lock_name', $pid) ON DUPLICATE KEY UPDATE `value` = VALUES(`value`)
}else{
ROLLBACK
echo "Allready running...\n";
exit();
}
}else{ // if rpid == 0 -
INSERT INTO locks values('lock_name', $pid) ON DUPLICATE KEY UPDATE `value` = VALUES(`value`)
}
COMMIT
...............
//free the pid
INSERT INTO locks values('lock_name', 0) ON DUPLICATE …
Run Code Online (Sandbox Code Playgroud) sql ×9
mysql ×4
sql-server ×4
t-sql ×2
algorithm ×1
count ×1
database ×1
datetime ×1
deadlock ×1
innodb ×1
postgresql ×1
row ×1
transactions ×1
view ×1