SQL必知必会(二)函数、子查询

SQL必知必会(二)函数、子查询,第1张

#文本处理函数

UPPER()     --大写

LOWER()    --小写

SOUNDEX()   --读音类似

LENGTH()    --字符串长度

#日期时间处理函数

SELECT order_code

FROM order_table

WHERE DATEPART(yy,order_date)=2012

#to_char()函数提取日期成分,MySQL可用year()函数提取年份

SELECT order_num

FROM order_table

WHERE to_number(to_char(order_date,'YYYY'))=2012    --to_char提取日期成分to_number转化为数值

SELECT order_num

FROM order_table

WHERE order_date BETWEEN to_date('01-01-2012') AND to_date('12-31--2012')    --字符串转日期

#数值处理函数

ABS()    --绝对值

COS()    --余弦

EXP()    --指数值

PI()   --圆周率

SIN()    --正弦

SQRT()    --平方根

TAN()    --正切

#平均数AVG()

SELECT AVG(a) AS avg_a

FROM tableA

WHERE a='DLL01'

#计数

SELECT COUNT(*)  AS num_cust              --对所有行计数,不管是否NULL值

FROM tableA

SELECT COUNT(a) AS num_a          --指定了列名,会忽略NULL值

FROM tableA

#最值

MAX()和MIN(),忽略NULL值

#总值SUM(),忽略NULL值

SELECT SUM(price*quantity) AS total_price

FROM tableA

WHERE order_code=20008

#以上聚集函数只包含不同值

SELECT AVG(DISTINCT order_price) AS avg_price

FROM tableA

WHERE id='DLL01'

两个子句:GROUP BY 和 HAVING

#GROUP BY创建分组HAVING过滤分组

SELECT vend_id, COUNT(*) AS num_prods

FROM tableA

WHERE price>=4

GROUP BY vend_id

HAVING COUNT(*)>=2   

ORDER BY price    --GROUP BY在WHERE之后在ORDER   BY之前

SELECT

FROM

WHERE

GROUP BY

HAVING

ORDER BY

#子查询顺序为从内而外

SELECT order_num 

FROM tableA

WHERE id='DLL01';

(输出20007和20008)

SELECT id

FROM tableB

WHERE order_num IN(20007,20008);

#合并为子查询。只能查询单个列

SELECT id

FROM tableB

WHERE order_num IN (SELECT order_num FROM tableA WHERE id='DLL01')

SELECT  cust_name,

                cust_state

                (SELECT COUNT(*) 

                 FROM Orders

                WHERE Orders.cust_id=Customers.cust_id) AS orders

FROM Customers

ORDER BY cust_name

#Orders.cust_id=Customers.cust_id完全限定列名,在两张表中名字相同列拿出来比较,防止歧义

mysql里时间型别为timestamp 怎么将它撷取只显示年月日 select date_format(date ,'%Y-%m-%d' ) from talbe_a

SQLserver怎样储存格式为年月日的时间型别

您好:

正常我们通过DateTime格式储存。

通过

SELECT CONVERT(NVARCHAR(15),时间栏位,23)

来获取需要的格式。

或者直接储存成Date型别。

sql时间型别显示有中文的年月日吗,比如说显示08年1月1日

自己写个转换函式就行,关于日期格式,w3school的介绍你看看,给你连结

:w3school../sql/func_convert.asp

另外给你获取年月日的方式

--getdate() 获取当前日期--获取年select datepart(yyyy,getdate())--获取月select datepart(mm,getdate())--获取日select datepart(dd,getdate())--将getdate()替换成你的日期就可以获取到了--另外:datename这个函式也可以获取年月日

关于hibernate储存时间型别只有年月日没有

这种一般不好处理,通常处理办法就是让资料库你处理时间,在存入时直接让资料库生成时间就没有问题了,或者在存入资料时去资料库查询下当前的资料库时间.

Asp撷取时间年月日

year(now) month(now) day(now)

excel 只显示时间 不显示年月日

那你输入的是时间格式吗?

ctrl + ;是 记录当前时间的 你可以试一试

设定单元格格式会显示你要的结果

SQL2005怎么撷取datetime型别栏位的年月日,并以撷取后的(年月日)栏位排序

SELECT

CONVERT(varchar(100), time, 111) AS time ,

COUNT(CONVERT(varchar(100), time, 111) ) AS count

FROM 表名

GROUP BY CONVERT(varchar(100), time, 111)

ORDER BY CONVERT(varchar(100), time, 111)

MYSQL怎么把日期格式只显示年月日?

select date(column) from table

select date("2010-08-17 19:08:28")显示是"2010-08-17"

select substring(column,1,11) from table

select substring("2010-08-17 19:08:28",1,11)显示是"2010-08-17 19"

ORACLE语句撷取时间型别的时分

SELECT substr(to_char(sysDATE, 'YYYY/MM/DD HH24:MI:SS'), 12, 5) FROM dual

oracle 通过 如何撷取 年月日(date)、年月日时分秒(timestamp)中的年月,,形如:‘2010

是给使用者使用表空间的许可权吧。

改表名使用: alter table table_name1 rename to table_name2

查时间并格式化输出时间格式:

select to_char(sysdate, 'yyyy/mm/dd') from dual

以每24小时作为一份时间(而非自然日),根据用户的配置有两种工作模式:带状模式中,用户仅定义开始日期时,从开始日期(含)开始,每份时间1个分片地无限增加下去;环状模式中,用户定义了开始日期和结束日期时,以结束日期(含)和开始日期(含)之间的时间份数作为分片总数(分片数量固定),以类似取模的方式路由到这些分片里。

1. DBLE 启动时,读取用户在 rule.xml 配置的 sBeginDate 来确定起始时间

2. 读取用户在 rule.xml 配置的 sPartionDay 来确定每个 MySQL 分片承载多少天内的数据

3. 读取用户在 rule.xml 配置的 dateFormat 来确定分片索引的日期格式

4. 在 DBLE 的运行过程中,用户访问使用这个算法的表时,WHERE 子句中的分片索引值(字符串),会被提取出来尝试转换成 Java 内部的时间类型

5. 然后求分片索引值与起始时间的差,除以 MySQL 分片承载的天数,确定所属分片

1. DBLE 启动时,读取用户在 rule.xml 配置的起始时间 sBeginDate、终止时间 sEndDate 和每个 MySQL 分片承载多少天数据 sPartionDay

2. 根据用户设置,建立起以 sBeginDate 开始,每 sPartionDay 天一个分片,直到 sEndDate 为止的一个环,把分片串联串联起来

3. 读取用户在 rule.xml 配置的 defaultNode

4. 在 DBLE 的运行过程中,用户访问使用这个算法的表时,WHERE 子句中的分片索引值(字符串),会被提取出来尝试转换成 Java 内部的日期类型

5. 然后求分片索引值与起始日期的差:如果分片索引值不早于 sBeginDate(哪怕晚于 sEndDate),就以 MySQL 分片承载的天数为模数,对分片索引值求模得到所属分片;如果分片索引值早于 sBeginDate,就会被放到 defaultNode 分片上

与MyCat的类似分片算法对比

中间件

DBLE

MyCat

分片算法种类date 分区算法按日期(天)分片

两种中间件的取模范围分片算法使用上无差别

开发注意点

【分片索引】1. 必须是字符串,而且 java.text.SimpleDateFormat 能基于用户指定的 dateFormat 来转换成 java.util.Date

【分片索引】2. 提供带状模式和环状模式两种模式

【分片索引】3. 带状模式以 sBeginDate(含)起,以 86400000 毫秒(24 小时整)为一份,每 sPartionDay 份为一个分片,理论上分片数量可以无限增长,但是出现 sBeginDate 之前的数据而且没有设定 defaultNode 的话,会路由失败(如果有 defaultNode,则路由至 defaultNode)

【分片索引】4. 环状模式以 86400000 毫秒(24 小时整)为一份,每 sPartionDay 份为一个分片,以 sBeginDate(含)到 sEndDate(含)的时间长度除以单个分片长度得到恒定的分片数量,但是出现 sBeginDate 之前的数据而且没有设定 defaultNode 的话,会路由失败(如果有 defaultNode,则路由至 defaultNode)

【分片索引】5. 无论哪种模式,分片索引字段的格式化字符串 dateFormat 由用户指定

【分片索引】6. 无论哪种模式,划分不是以日历时间为准,无法对应自然月和自然年,且会受闰秒问题影响

运维注意点

【扩容】1. 带状模式中,随着 sBeginDate 之后的数据出现,分片数量的增加无需再平衡

【扩容】2. 带状模式没有自动增添分片的能力,需要运维手工提前增加分片;如果路由策略计算出的分片并不存在时,会导致失败

【扩容】3. 环状模式中,如果新旧 [sBeginDate,sEndDate] 之间有重叠,需要进行部分数据迁移;如果新旧 [sBeginDate,sEndDate] 之间没有重叠,需要数据再平衡

配置注意点

【配置项】1. 在 rule.xml 中,可配置项为 <propertyname="sBeginDate">、 <propertyname="sPartionDay">、 <propertyname="dateFormat">、 <propertyname="sEndDate">和 <propertyname="defaultNode">

【配置项】2.在 rule.xml 中配置 <propertyname="dateFormat">,符合 java.text.SimpleDateFormat 规范的字符串,用于告知 DBLE 如何解析sBeginDate和sEndDate

【配置项】3.在 rule.xml 中配置 <propertyname="sBeginDate">,必须是符合 dateFormat 的日期字符串

【配置项】4.在 rule.xml 中配置 <propertyname="sEndDate">,必须是符合 dateFormat 的日期字符串;配置了该项使用的是环状模式,若没有配置该项则使用的是带状模式

【配置项】5.在 rule.xml 中配置 <propertyname="sPartionDay">,非负整数,该分片策略以 86400000 毫秒(24 小时整)作为一份,而 sPartionDay 告诉 DBLE 把每多少份放在同一个分片

【配置项】6.在 rule.xml 中配置 <propertyname="defaultNode">标签,非必须配置项,不配置该项的话,用户的分片索引值没落在 mapFile 定义


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/8635257.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-19
下一篇 2023-04-19

发表评论

登录后才能评论

评论列表(0条)

保存