sql技巧
㈠ sql如何取年月
1、首先大部分都会使用的就是获取当前日期了,getdate直接用。
㈡ SQL查询取分组最大值
selectt1.分类,t1.商品名称,table.库存,t1.更新时间
from (
select 分类,商品名称,max(更新时间) 更新时间 from table
group by 分类,商品名称
) t1
inner join table on t1.分类=table.分类 and t1.商品名称=table.商品名称 and t1.更新时间
=table.更新时间
(2)sql技巧扩展阅读:
关于SQL最大值查询语句的记录
SELECT
bsnum,
STATE AS FILE_STATE
FROM
FILE_RECORD r
WHERE
STATE =(
SELECT
MAX(STATE)
FROM
FILE_RECORD
WHERE
bsnum = r.bsnum
);
小技巧:有时需要测试sql语法但又觉得创建表麻烦,可以使用创建一个临时表,如下:
select id, count(t.id) from
(
select 1 as id, 2 as age, 'F' as sex from al union
select 2 as id, 2 as age, 'M' as sex from al union
select 3 as id, 3 as age, 'F' as sex from al union
select 4 as id, 4 as age, 'M' as sex from al
)t
㈢ 3.SQL字符串截取技巧
有时我们会临时写一些SQL脚本来统计一些东西,或者是提供视图或者存储过程给第三方使用。但是有些内容是串联起来存在一个字段中的。
比如:sMZ(民族) sLx(联系方式)
01/汉族 tel:123456/qq:87654321/phone:13812345678
SELECT SUBSTRING('01/汉族',4,2) 汉族
SELECT RIGHT('01/汉族',2) 汉族 --也是一样的
取民族很简单 如果要取手机号phone 就比较麻烦了,因为我们不知道QQ是几位的
或者qq电话可能没有填写了,单纯依靠字段长度截取不了的。
这样就需要变通下了:
SELECT SUBSTRING('tel:123456/qq:87654321/phone:13812345678',
charindex('/phone','tel:123456/qq:87654321/phone:13812345678')+1,1000)
使用charindex获取'/phone'字符的其实位置 嵌套SUBSTRING截取
如果在MySQL中还可以这样:
substring_index('tel:123456/qq:87654321/phone:13812345678', '/', -1)
'phone:13812345678' 截取第一个 '/' (倒数)之后的所有字符
substring_index('tel:123456/qq:87654321/phone:13812345678', '/', 1)
'tel:123456' 截取第一个 '/' 之前的所有字符
㈣ 关于写SQL语句的技巧
恩,这个怎么说呢
sql语句总结一下,无非就几种,关联查询,子查询,各种函数的使用
根据要做的需求,先分析一下,需要用到哪些查询
比如要用到关联查询
就先把要用到的表列出来,比如a,b,c三个表
就先写出来
select from a,b,c
前边查询的内容可以先放着不用写
然后找三个表关联关系,当然也要看是自然连接还是左连接什么的,这里就给你举例正常连接吧
select from a,b,c where a.id=b.aid and b.id=c.bid
关联关系写好了,就可以在写查询的内容了
select a.name,b.name,sum(c.value) from a,b,c where a.id=b.aid and b.id=c.bid
然后,你再看,因为有聚合查询,后边要group by
select a.name,b.name,sum(c.value) from a,b,c where a.id=b.aid and b.id=c.bid group by a.name,b.name
其他的,再有什么排序啊,等等啊,就好写了,这里就不往下写了
子查询更简单写,主要就是要判断好,要先写子查询,然后往外来套,比如
select * from b where id in (select id from a)
这个,你就要先写括号里的那个,然后写外边的
至于函数的使用,这个没什么经验,就是可能有时会出现类型转换等等的问题,你就要牢记每个函数的作用,不懂再问吧
㈤ 在SQLServer中使用索引的技巧
在SQL Server中 为了查询性能的优化 有时我们就需要对数据表通过建立索引的方式 目的主要是根据查询要求 迅速缩小查询范围 避免全表扫描
索引有两种类型 分别是聚集索引(clustered index 也称聚类索引 簇集索引)和非聚集索引(nonclustered index 也称非聚类索引 非簇集索引)
聚集索引在一个表中只能有一个 默认情况下在主键建立的时候创建 它是规定数据在表中的物理存储顺序 我们也可以取消主键的聚集索引 所以必须考虑数据库可能用到的查询类型以及使用的最为频繁的查询类型 对其最常用的一个字段或者多个字段建立聚集索引或者组合的聚集索引 它就是SQL Server会在物理上按升序(默认)或者降序重排数据列 这样就可以迅速的找到被查询的数据
非聚集索主要是数据存储在一个地方 索引存储在另一个地方 索引带有指针指向数据的存储位置 索引中的项目按索引键值的顺序存储 而表中的信息按另一种顺序存储 可以在一个表格中使用高达 个非聚集的索引 在查询的过程中先对非聚集索引进行搜索 找到数据值在表中的位置 然后从该位置直接检索数据 这使非聚集索引成为精确匹配查询的最佳方法 因为索引包含描述查询所搜索的数据值在表中的精确位置的条目
所以我们在选择创建聚集索引的时候要注意以下几个方面
) 对表建立主键时 就会为主键自动添加了聚集索引 如自动编号字段 而我们没有必要把聚集索引浪费在主键上 除非你只按主键查询 所以会把聚集索引设置在按条件查询频率最高的那个字段或者组合的字段
) 索引的建立要根据实际应用的需求来进行 并非是在任何字段上建立索引就能提高查询速度 聚集索引建立遵循下面几个原则
包含大量非重复值的列
使用下列运算符返回一个范围值的查询 BEEEN > >= < 和 <=
被连续访问的列
返回大型结果集的查询
经常被使用联接或 GROUP BY 子句的查询访问的列;一般来说 这些是外键列 对ORDER BY 或 GROUP BY 子句中指定的列进行索引 可以使 SQL Server 不必对数据进行排序 因为这些行已经排序 这样可以提高查询性能
OLTP 类型的应用程序 这些程序要求进行非常快速的单行查找(一般通过主键) 应在主键上创建聚集索引
举例来说 银行交易日志中对交易日期建立聚合索引 数据物理上按顺序存于数据页上 重复值也排列在一起 因而在范围查找时 可以先找到这个范围的起末点 且只在这个范围内扫描数据页 避免了大范围扫描 提高了查询速度 而如果我们对员工的基本信息表中性别的字段列上建立聚集索引 就完全没有必要 因为内容里只涉及到 男 与 女 两个不同值
) 在聚集索引中按常用的组合字段建立索引 形成复合索引 一般在为表建立多个主键的时候就会产生 如果一个表中的数据在查询时有多个字段总是同时出现则这些字段就可以作为复合索引 这样能形成索引覆盖 提高where语句的查询效率
)索引对查询有一这的优化 但由于改变一个表的内容 将会引起索引的变化 频繁的对数据操作如insert update delete语句将导致系统花费较大的代价进行索引更新 引起整体性能的下降 一般来讲 在对查询性能的要求高于对数据维护性能要求时 应该尽量使用索引 有时在这种操作数据库比较频繁的某些极端情况下 可先删除索引 再对数据库表更新大量数据 最后再重建索引 新建立的索引总是比较好用
索引在使用了长久的时候 就会产生很多的碎片 查询的性能就会受到影响 这时候有两种方法解决 一是利用DBCC INDEXDEFRAG整理索引碎片 还有就是利用DBCC DBREINDEX重建索引
DBCC INDEXDEFRAG 命令是联机操作 所以索引只有在该命令正在运行时才可用 而且可以在不丢失已完成工作的情况下中断该操作 这种方法的缺点是在重新组织数据方面没有聚集索引的除去/重新创建操作有效
重新创建聚集索引将对数据进行重新组织 其结果是使数据页填满 填满程度可以使用 FILLFACTOR 选项进行配置 这种方法的缺点是索引在除去/重新创建周期内为脱机状态 并且操作属原子级 如果中断索引创建 则不会重新创建该索引
我们来看看索引重建使用的方法
语法 DBCC DBREINDEX ( [ TableName [ index_name [ fillfactor ] ] ] )
参数 TableName
是要重建其指定的索引的表名 数据库 所有者和表名必须符合标识符的规则 有关更多信息 请参见使用标识符 如果提供 database 或 owner 部分 则必须使用单引号 ( )
将整个 database owner table_name 括起来 如果只指定 table_name 则不需要单引号
index_name 是要重建的索引名 索引名必须符合标识符的规则 如果未指定 index_name 或指定为 就要对表的所有索引进行重建
fillfactor 是创建索引时每个索引页上要用于存储数据的空间百分比 fillfactor替换起始填充因子以作为索引或任何其它重建的非聚集索引(因为已重建聚集索引)的新默认值 如果 fillfactor 为 DBCC DBREINDEX 在创建索引时将使用指定的起始fillfactor
我们在查询分析器中输入如下的命令
DBCC DBREINDEX ( MyTable )
lishixin/Article/program/SQLServer/201311/22210
㈥ 如何用sql语句复制一张表
1、原表存在的话这样用:insert into a select * from b
2、原表不存在的话这样用:select * into a from b
㈦ 怎么学习SQL语句
创建数据库
创建之前判断该数据库是否存在 if exists (select * from sysdatabases where name='databaseName') drop database 'databaseName' go Create DATABASE database-name
删除数据库
drop database dbname
备份sql server
--- 创建 备份数据的 device USE master EXEC sp_admpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' --- 开始 备份 BACKUP DATABASE pubs TO testBack
创建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..) 根据已有的表创建新表: A:create table tab_new like tab_old (使用旧表创建新表) B:create table tab_new as select col1,col2… from tab_old definition only
删除新表
drop table tabname
增加一个列
Alter table tabname add column col type 注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
添加主键
Alter table tabname add primary key(col) 说明:删除主键: Alter table tabname drop primary key(col)
创建索引
create [unique] index idxname on tabname(col….) 删除索引:drop index idxname on tabname 注:索引是不可更改的,想更改必须删除重新建。
创建视图
create view viewname as select statement 删除视图:drop view viewname
几个简单的基本的sql语句
选择:select * from table1 where 范围 插入:insert into table1(field1,field2) values(value1,value2) 删除:delete from table1 where 范围 更新:update table1 set field1=value1 where 范围 查找:select * from table1 where field1 like ’%value1%’ (所有包含‘value1’这个模式的字符串)---like的语法很精妙,查资料! 排序:select * from table1 order by field1,field2 [desc] 总数:select count(*) as totalcount from table1 求和:select sum(field1) as sumvalue from table1 平均:select avg(field1) as avgvalue from table1 最大:select max(field1) as maxvalue from table1 最小:select min(field1) as minvalue from table1[separator]
几个高级查询运算词
A: UNION 运算符 UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。 B: EXCEPT 运算符 EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。 C: INTERSECT 运算符 INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 注:使用运算词的几个查询结果行必须是一致的。
使用外连接
A、left outer join: 左外连接(左连接):结果集既包括连接表的匹配行,也包括左连接表的所有行。 SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c B:right outer join: 右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 C:full outer join: 全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。