這是數(shù)據(jù)庫的兩表關(guān)聯(lián),在“利用SQL Server ”數(shù)據(jù)庫建立數(shù)據(jù)庫,建立兩表的結(jié)構(gòu),輸入數(shù)據(jù),然后利用數(shù)據(jù)庫連接查詢即可。方法如下:打開數(shù)據(jù)庫,在“查詢分析器”窗口輸入sql語句,Select * From Grade,Sourse Where Grade.SourseID=Sourse. SourseID,在點(diǎn)擊“執(zhí)行”
我們提供的服務(wù)有:成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、六盤水ssl等。為1000多家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的六盤水網(wǎng)站制作公司
即可生成
SQL Server數(shù)據(jù)庫查詢速度慢的原因有很多,常見的有以下幾種:
1、沒有索引或者沒有用到索引(這是查詢慢最常見的問題,是數(shù)據(jù)庫設(shè)計(jì)的缺陷)
2、I/O吞吐量小,形成了瓶頸效應(yīng)。
3、沒有創(chuàng)建計(jì)算列導(dǎo)致查詢不優(yōu)化。
4、內(nèi)存不足
5、網(wǎng)絡(luò)速度慢
6、查詢出的數(shù)據(jù)量過大(可以采用多次查詢,其他的方法降低數(shù)據(jù)量)
7、鎖或者死鎖(這也是查詢慢最常見的問題,是程序設(shè)計(jì)的缺陷)
8、sp_lock,sp_who,活動(dòng)的用戶查看,原因是讀寫競爭資源。
9、返回了不必要的行和列
10、查詢語句不好,沒有優(yōu)化
●可以通過以下方法來優(yōu)化查詢 :
1、把數(shù)據(jù)、日志、索引放到不同的I/O設(shè)備上,增加讀取速度,以前可以將Tempdb應(yīng)放在RAID0上,SQL2000不在支持。數(shù)據(jù)量(尺寸)越大,提高I/O越重要。
2、縱向、橫向分割表,減少表的尺寸(sp_spaceuse)
3、升級(jí)硬件
4、根據(jù)查詢條件,建立索引,優(yōu)化索引、優(yōu)化訪問方式,限制結(jié)果集的數(shù)據(jù)量。注意填充因子要適當(dāng)(最好是使用默認(rèn)值0)。索引應(yīng)該盡量小,使用字節(jié)數(shù)小的列建索引好(參照索引的創(chuàng)建),不要對(duì)有限的幾個(gè)值的字段建單一索引如性別字段。
以下以2013年11月為例
1、使用橫向連接,以5天為例,簡單但不易擴(kuò)展
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、使用縱向分組統(tǒng)計(jì)
with t1(id,rq) as (
select distinct 人員, date from 表 where date='2013-11-01' and date'2013-12-01' ),
--t1求出指定月的人員編號(hào)及不同的打卡日期
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遞歸調(diào)用,每連續(xù)一日days+1,就是求每一打卡時(shí)間是連續(xù)的第幾天
select id
from t
group by id
having max(days)=5
order by id
以上就不刪了,以下可以改短點(diǎn)吧
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
能用一條查詢實(shí)現(xiàn)的就算再復(fù)雜也盡量用一條語句查詢,一般要 比兩句分開的語句查詢效率要高。而且尤其在一定數(shù)據(jù)量的情況下就很明顯的顯示差距了。
另外有些語句可能你寫完看起來很復(fù)雜嵌套嵌套嵌套,但是實(shí)際上SQL有他自己一條運(yùn)行的方法,這個(gè)在程序也是一樣的。我們寫的語句,不過是我們寫的讓電腦可以理解編譯執(zhí)行的語句。機(jī)器最終執(zhí)行的話,無非還是01010什么的。
另外在用到連接查詢的時(shí)候盡量吧小的表放在右邊,因?yàn)椴樵?優(yōu)化設(shè)計(jì)器是從右往左分析表的。而且在多個(gè)相似查詢的時(shí)候,使用綁定變量要效率很多。
另外查詢效率還設(shè)計(jì)到索引 等等。
還有存儲(chǔ)過程也可以提高效率
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) , 分?jǐn)?shù) int)
Insert tb
Select '張三','語文',60 union all
Select '張三','數(shù)學(xué)',70 union all
Select '張三','英語',80 union all
Select '張三','物理',90 union all
Select '李四','語文',65 union all
Select '李四','數(shù)學(xué)',75 union all
Select '李四','英語',85 union all
Select '李四','物理',95
go
declare @sql varchar(8000)
set @sql = ''
select @sql = @sql+[課程]+'=sum(case when [課程]='''+[課程]+''' then [分?jǐn)?shù)] 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([姓名]),
數(shù)學(xué)=sum(case when [課程]='數(shù)學(xué)' then [分?jǐn)?shù)] else 0 end),
物理=sum(case when [課程]='物理' then [分?jǐn)?shù)] else 0 end),
英語=sum(case when [課程]='英語' then [分?jǐn)?shù)] else 0 end),
語文=sum(case when [課程]='語文' then [分?jǐn)?shù)] else 0 end)
from tb group by [姓名]
結(jié)果:
李四 75 95 85 65
張三 70 90 80 60