大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这是数据库的两表关联,在“利用SQL Server ”数据库建立数据库,建立两表的结构,输入数据,然后利用数据库连接查询即可。方法如下:打开数据库,在“查询分析器”窗口输入sql语句,Select * From Grade,Sourse Where Grade.SourseID=Sourse. SourseID,在点击“执行”
我们提供的服务有:成都做网站、成都网站设计、微信公众号开发、网站优化、网站认证、六盘水ssl等。为1000多家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的六盘水网站制作公司
即可生成
SQL Server数据库查询速度慢的原因有很多,常见的有以下几种:
1、没有索引或者没有用到索引(这是查询慢最常见的问题,是数据库设计的缺陷)
2、I/O吞吐量小,形成了瓶颈效应。
3、没有创建计算列导致查询不优化。
4、内存不足
5、网络速度慢
6、查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)
7、锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷)
8、sp_lock,sp_who,活动的用户查看,原因是读写竞争资源。
9、返回了不必要的行和列
10、查询语句不好,没有优化
●可以通过以下方法来优化查询 :
1、把数据、日志、索引放到不同的I/O设备上,增加读取速度,以前可以将Tempdb应放在RAID0上,SQL2000不在支持。数据量(尺寸)越大,提高I/O越重要。
2、纵向、横向分割表,减少表的尺寸(sp_spaceuse)
3、升级硬件
4、根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量。注意填充因子要适当(最好是使用默认值0)。索引应该尽量小,使用字节数小的列建索引好(参照索引的创建),不要对有限的几个值的字段建单一索引如性别字段。
以下以2013年11月为例
1、使用横向连接,以5天为例,简单但不易扩展
with data as ( select * from yourtable where date='2013-11-01' and date'2013-12-01')
select distinct name
from data t1 join data t2 on t1.name=t2.name and t1.date=t2.date+1
join data t3 on t2.name=t3.name and t2.date=t3.date+1
join data t4 on t3.name=t4.name and t3.date=t4.date+1
join data t5 on t4.name=t5.name and t4.date=t5.date+1
2、使用纵向分组统计
with t1(id,rq) as (
select distinct 人员, date from 表 where date='2013-11-01' and date'2013-12-01' ),
--t1求出指定月的人员编号及不同的打卡日期
t2 as (select s2.* from t1 s1 join t1 s2 on s1.id=s2.id and s1.rq=s2.rq-1),
--t2求出所有上一日也打过卡的日期
t3 as (select * from t1 except select * from t2),
--t3求出所有上一日未打过卡的日期
t as (
select id,rq,1 days from t3
union all
select t1.id,t1.rq,t.days+1 from t1 join t on t1.id=t.id and t1.rq=t.rq+1
)
--t4递归调用,每连续一日days+1,就是求每一打卡时间是连续的第几天
select id
from t
group by id
having max(days)=5
order by id
以上就不删了,以下可以改短点吧
with t as (
select 人员 id, date rq, 1 days from 表 t1
where not exists(select * from 表 t2 where t2.date=t1.date-1)
union all
select t1.id,t1.rq,t.days+1 from 表 t1 join t on t1.id=t.id and t1.rq=t.rq+1
)
select id
from t
group by id
having max(days)=5
order by id
能用一条查询实现的就算再复杂也尽量用一条语句查询,一般要 比两句分开的语句查询效率要高。而且尤其在一定数据量的情况下就很明显的显示差距了。
另外有些语句可能你写完看起来很复杂嵌套嵌套嵌套,但是实际上SQL有他自己一条运行的方法,这个在程序也是一样的。我们写的语句,不过是我们写的让电脑可以理解编译执行的语句。机器最终执行的话,无非还是01010什么的。
另外在用到连接查询的时候尽量吧小的表放在右边,因为查询 优化设计器是从右往左分析表的。而且在多个相似查询的时候,使用绑定变量要效率很多。
另外查询效率还设计到索引 等等。
还有存储过程也可以提高效率
select groupfield1, groupfield2, max(case when type=1 then value end) col1,
max(case when type=2 then value end) col2
from table
group by groupfield1, groupdfield2
例子如下:
create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
Insert tb
Select '张三','语文',60 union all
Select '张三','数学',70 union all
Select '张三','英语',80 union all
Select '张三','物理',90 union all
Select '李四','语文',65 union all
Select '李四','数学',75 union all
Select '李四','英语',85 union all
Select '李四','物理',95
go
declare @sql varchar(8000)
set @sql = ''
select @sql = @sql+[课程]+'=sum(case when [课程]='''+[课程]+''' then [分数] else 0 end),' from (SELECT DISTINCT [课程] FROM TB) A
--print @sql
set @sql = left(@sql,len(@sql) - 1)
set @sql = 'select [姓名]=max([姓名]), '+@sql+' from tb group by [姓名] '
print @sql
exec (@sql)
--drop table t
select [姓名]=max([姓名]),
数学=sum(case when [课程]='数学' then [分数] else 0 end),
物理=sum(case when [课程]='物理' then [分数] else 0 end),
英语=sum(case when [课程]='英语' then [分数] else 0 end),
语文=sum(case when [课程]='语文' then [分数] else 0 end)
from tb group by [姓名]
结果:
李四 75 95 85 65
张三 70 90 80 60