本文将带您了解关于jstl的sql标记如何工作?的新内容,同时我们还将为您解释sql语句标记的相关知识,另外,我们还将为您提供关于MySQLCASE如何工作?、MySQL的ORDERBYRAND()如
本文将带您了解关于jstl的sql标记如何工作?的新内容,同时我们还将为您解释sql语句标记的相关知识,另外,我们还将为您提供关于MySQL CASE如何工作?、MySQL的ORDER BY RAND()如何工作?、MySQL索引如何工作?、MYSQL自加入如何工作?的实用信息。
本文目录一览:jstl的sql标记如何工作?(sql语句标记)
我正在使用以下代码从我的jsp中查询数据库,但我想了解更多有关幕后情况的信息。
这是我的两个主要问题。
标签是直接访问ResultSet还是将查询结果存储在内存中的数据结构中?
何时关闭连接?
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %><sql:query var="query" dataSource="${ds}" sql="${listQuery}"></sql:query><c:forEach var="row" items="${query.rows}" begin="0"> ${row.data } ${row.more_data }</c:forEach>
注意:我一直反对在jsp中运行查询,但是我的结果集太大,无法存储在我的动作和jsp之间的内存中。使用此标记库看起来是最简单的解决方案。
答案1
小编典典基于org.apache.taglibs.standard.tag.common.sql.QueryTagSupport的来源的观察
taglib遍历ResultSet并将所有数据放入数组,Map和List中。因此,在开始循环之前,所有内容都已加载到内存中。
遇到查询开始标记时将打开连接(doStartTag方法)。遇到查询结束标记时将检索结果(doEndTag方法)。该连接在doFinally方法中关闭。
简而言之,这绝对可怕。
MySQL CASE如何工作?
我知道SQL的CASE
语法如下:
CASE WHEN search_condition THEN statement_list [WHEN search_condition THEN statement_list] ... [ELSE statement_list]END CASE
但是,我不了解它是如何工作的,可能是因为我正在考虑将其视为if
声明。
user_role
例如,如果我在表中有一个字段,其中包含诸如“经理”,“兼职”等名称,那么如何role_order
根据角色生成一个具有不同编号的字段。在此示例中,“如果user_role
=’经理’,则role_order = 5”。
请注意,我正在寻找一个 教男人如何钓鱼的方法, 而不是 给男人一个钓鱼的方法 。
答案1
小编典典CASE
更像是switch语句。您可以使用两种语法。首先,您可以使用所需的任何compare语句:
CASE WHEN user_role = ''Manager'' then 4 WHEN user_name = ''Tom'' then 27 WHEN columnA <> columnB then 99 ELSE -1 --unknownEND
第二种风格是当您只检查一个值时,它更简洁:
CASE user_role WHEN ''Manager'' then 4 WHEN ''Part Time'' then 7 ELSE -1 --unknownEND
MySQL的ORDER BY RAND()如何工作?
我一直在研究和测试如何在MySQL中进行快速随机选择。在此过程中,我遇到了一些意外的结果,现在我不确定我是否知道ORDER BY RAND()的工作原理。
我一直以为,当您在表上执行ORDER BY
RAND()时,MySQL会向表中添加一个新列,该列中填充有随机值,然后按该列对数据进行排序,然后,例如,您采用上面随机获得的值。我已经进行了大量的Google搜索和测试,最后发现Jay在他的博客中提供的查询确实是最快的解决方案:
SELECT * FROM Table T JOIN (SELECT CEIL(MAX(ID)*RAND()) AS ID FROM Table) AS x ON T.ID >= x.ID LIMIT 1;
虽然普通的ORDER BY
RAND()在我的测试表上花费30-40秒,但他的查询仅需0.1秒即可完成工作。他在博客中解释了此功能的作用,因此我将跳过此内容,最后转到奇怪的地方。
我的表是用PRIMARY KEY公用表id
和其他非索引的东西一样username
,age
等这里是我奋力解释的东西
SELECT * FROM table ORDER BY RAND() LIMIT 1; /*30-40 seconds*/SELECT id FROM table ORDER BY RAND() LIMIT 1; /*0.25 seconds*/SELECT id, username FROM table ORDER BY RAND() LIMIT 1; /*90 seconds*/
我一直希望对所有三个查询都看到大致相同的时间,因为我总是在单个列上进行排序。但是由于某种原因,这没有发生。如果您对此有任何想法,请告诉我。我有一个项目需要快速执行ORDER
BY RAND(),我个人更喜欢使用
SELECT id FROM table ORDER BY RAND() LIMIT 1;SELECT * FROM table WHERE id=ID_FROM_PREVIOUS_QUERY LIMIT 1;
是的,它比Jay的方法慢,但是更小,更易于理解。我的查询很大,有几个JOIN和WHERE子句,而Jay的方法仍然有效,但查询却变得又大又复杂,因为我需要在JOINed(在他的查询中称为x)子请求中使用所有的JOIN和WHERE。
谢谢你的时间!
答案1
小编典典尽管没有“通过rand()快速订购”之类的东西,但是有针对您特定任务的解决方法。
要获取任何随机行 ,您可以像德国博主一样:http : //www.roberthartung.de/mysql-order-by-
rand-a-case-study-of-alternatives/(我看不到一个热链接网址。如果有人看到,请随时编辑该链接。)
文本是德语,但是SQL代码在页面下方并且在大白框中,因此不难看出。
基本上,他所做的是做一个程序来获取有效行。这将生成一个介于0到max_id之间的随机数,尝试获取一行,如果不存在该行,请继续进行操作,直到找到一个行为止。他允许通过将它们存储在临时表中来获取x个随机行,因此您可能可以重写该过程,以便仅提取一行就更快了。
这样做的缺点是,如果您删除很多行,并且存在巨大的差距,那么很有可能错过很多次,从而使其无效。
更新:不同的执行时间
SELECT * FROM table ORDER BY RAND()LIMIT 1; / 30-40秒 /
SELECT ID FROM table ORDER BY RAND()LIMIT 1; / 0.25秒 /
SELECT ID,用户名,来自表ORDER BY RAND()LIMIT 1;/ 90秒 /
我一直希望对所有三个查询都看到大致相同的时间,因为我总是在单个列上进行排序。但是由于某种原因,这没有发生。如果您对此有任何想法,请告诉我。
它可能与索引有关。id
被索引并可以快速访问,而添加username
到结果中则意味着它需要从每一行中读取它并将其放入内存表中。使用,*
它还必须将所有内容读取到内存中,但不需要在数据文件中跳转,这意味着不会浪费时间寻找。
仅当存在可变长度的列(varchar / text)时,这才有所不同,这意味着必须先检查长度,然后跳过该长度,而不是仅跳过每行之间的设置长度(或0)。
MySQL索引如何工作?
我对MySQL索引的工作方式非常感兴趣,更具体地说,它们如何在不扫描整个表的情况下返回请求的数据?
我知道这是题外话,但是如果有人可以向我详细解释一下,我将非常非常感谢。
MYSQL自加入如何工作?
我最近问了一个有关“自我加入”的问题,得到了一个很好的答案。
该查询用于查找事件1之后1天的事件2的ID,开始日期和价格。
该代码工作正常。 但是我不知道如何。
有人可以尽可能详尽地解释一下-查询的不同部分是什么以及它们做什么?
SELECT event2.id, event2.startdate, event2.priceFROM mm_eventlist_dates event1JOIN mm_eventlist_dates event2 ON event2.startdate = date_add(event1.enddate, INTERVAL 1 DAY)WHERE event1.id=$id
非常感谢您的帮助,无论出于什么原因,我都很难解决这个问题。
答案1
小编典典我试图理解的方式是在第一块上写出两个列表,分别标记为event1和一个event2。然后在每个列表中列出一些记录(列表将是相同的),现在从以下描述的WHERE开始。
我们正在从两个表中获取数据(确定同一张表使用了两次,但暂时不要理会)
FROM mm_eventlist_dates event1JOIN mm_eventlist_dates event2
从下至上阅读其余内容可能会有所帮助。
WHERE event1.id=$id
因此,我们希望来自event1的记录具有指定的记录ID。大概那是一个记录。现在我们找出事件结束后的第二天。
date_add(event1.enddate, INTERVAL 1 DAY)
现在告诉我们来自event2的记录,它们需要从该日期开始,
ON event2.startdate = date_add(event1.enddate, INTERVAL 1 DAY)
现在,我们确定了两个记录,我们想要什么字段?
SELECT event2.id, event2.startdate, event2.price
哦,就是我们确定起始日期的字段。
我们今天的关于jstl的sql标记如何工作?和sql语句标记的分享已经告一段落,感谢您的关注,如果您想了解更多关于MySQL CASE如何工作?、MySQL的ORDER BY RAND()如何工作?、MySQL索引如何工作?、MYSQL自加入如何工作?的相关信息,请在本站查询。
本文标签: