重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
這是數據庫的兩表關聯,在“利用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