SQL争覇戦
SQL争覇試合決勝試験問題
通信業務では、ユーザの情報と通話の情報を記録するため、ユーザテーブルと通話記録テーブルがそれぞれ存在し、テーブルの構造は下図のようになっている.
テーブル名
UserInfo
さぎょう
通話ユーザの情報を記憶する
プライマリキー
UserID
シーケンス番号
フィールド名
フィールドの説明
を選択します.
長さ
ツールバーの
コメント
1
UserID
プライマリ・キー、自動成長
Int
空でない
2
UserName
ユーザー名
nvarchar
30
空でない
3
TelNo
ユーザ電話番号
nvarchar
30
空でない
4
Address
ユーザアドレス
nvarchar
100
空の許可
図1:ユーザ情報テーブル
テーブル名
TelRecord
さぎょう
通話記録を記憶する
プライマリキー
CommID
シーケンス番号
フィールド名
フィールドの説明
を選択します.
長さ
ツールバーの
コメント
1
CommID
プライマリ・キー、自動成長
Int
空でない
2
TelFrom
電話番号
nvarchar
30
空でない
3
TelDest
呼び出し電話番号
nvarchar
30
空でない
4
STime
通話開始時間
datetime
空でない
5
ETime
通話終了時間
datetime
空でない
図2:通話記録表
通話記録表には毎日大量のデータが発生し、毎月500万行近くの記録がある.
次の操作を実行するか、次の質問に答えてください.
1、データベースに通信業務データベースCommを作成し、以上の要求に従ってデータベース表を作成してください.
2、ユーザーが通話料を調べるとき、何度も通話する時間の計算にかかわるため、システムの反応が遅い.データベースの観点から考えると、この問題を緩和する方法は何がありますか.
3、ユーザー情報表、通話記録表に以下のテストデータを入力(またはSQL文で挿入)、下図のように:
図3:ユーザ情報テーブルのデータ
図4:通話記録表のデータ
4、SQL文を作成し、少なくとも2つの電話のユーザー名、電話番号の個数を照会する.
5、SQL文を作成し、通話時間が1分未満の通話IDを検索する.
6、SQL文を作成して、通話記録表に存在する電話番号を探し出して、ユーザー情報表にない電話番号を探し出して、それからこれらの電話番号をユーザー情報表に挿入して、新しく挿入したデータのユーザー名は“未知”で、住所は“未知”です;
7、記憶過程を編纂し、入力した月、主呼番号によって通話記録、通話総時間を統計する.
8、通話記録表に大きなデータ量がある場合、どのようなクエリーの最適化アドバイスがありますか?
//答え
通信業務では、ユーザの情報と通話の情報を記録するため、ユーザテーブルと通話記録テーブルがそれぞれ存在し、テーブルの構造は下図のようになっている.
テーブル名
UserInfo
さぎょう
通話ユーザの情報を記憶する
プライマリキー
UserID
シーケンス番号
フィールド名
フィールドの説明
を選択します.
長さ
ツールバーの
コメント
1
UserID
プライマリ・キー、自動成長
Int
空でない
2
UserName
ユーザー名
nvarchar
30
空でない
3
TelNo
ユーザ電話番号
nvarchar
30
空でない
4
Address
ユーザアドレス
nvarchar
100
空の許可
図1:ユーザ情報テーブル
テーブル名
TelRecord
さぎょう
通話記録を記憶する
プライマリキー
CommID
シーケンス番号
フィールド名
フィールドの説明
を選択します.
長さ
ツールバーの
コメント
1
CommID
プライマリ・キー、自動成長
Int
空でない
2
TelFrom
電話番号
nvarchar
30
空でない
3
TelDest
呼び出し電話番号
nvarchar
30
空でない
4
STime
通話開始時間
datetime
空でない
5
ETime
通話終了時間
datetime
空でない
図2:通話記録表
通話記録表には毎日大量のデータが発生し、毎月500万行近くの記録がある.
次の操作を実行するか、次の質問に答えてください.
1、データベースに通信業務データベースCommを作成し、以上の要求に従ってデータベース表を作成してください.
2、ユーザーが通話料を調べるとき、何度も通話する時間の計算にかかわるため、システムの反応が遅い.データベースの観点から考えると、この問題を緩和する方法は何がありますか.
3、ユーザー情報表、通話記録表に以下のテストデータを入力(またはSQL文で挿入)、下図のように:
図3:ユーザ情報テーブルのデータ
図4:通話記録表のデータ
4、SQL文を作成し、少なくとも2つの電話のユーザー名、電話番号の個数を照会する.
5、SQL文を作成し、通話時間が1分未満の通話IDを検索する.
6、SQL文を作成して、通話記録表に存在する電話番号を探し出して、ユーザー情報表にない電話番号を探し出して、それからこれらの電話番号をユーザー情報表に挿入して、新しく挿入したデータのユーザー名は“未知”で、住所は“未知”です;
7、記憶過程を編纂し、入力した月、主呼番号によって通話記録、通話総時間を統計する.
8、通話記録表に大きなデータ量がある場合、どのようなクエリーの最適化アドバイスがありますか?
//答え
说明:两张关联表,删除主表中已经在副表中没有的信息 delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 ) 说明:日程安排提前五分钟提醒 select * from 日程安排 where datediff('minute',f开始时间,getdate())>5 说明:删除重复记录 delete from tablename where id not in (select max(id) from tablename group by col1,col2,...) 说明:外连接查询(表名1:a 表名2:b) select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
--1、 Comm, ; if exists (select * from sysdatabases where name = 'Comm') drop database Comm go create database Comm on ( name = 'Comm_data', filename = 'd:\Comm_data.mdf', size = 3mb, maxsize = 10mb, filegrowth = 10% ) log on ( name = 'Comm_log', filename = 'd:\Comm_log.ldf', size = 10mb, maxsize = 1000mb, filegrowth = 50% ) go /*--- UserInfo---*/ use Comm go if exists (select * from sysobjects where name = 'UserInfo') drop database UserInfo go create table UserInfo ( UserID int not null identity(1,1) primary key, UserName varchar(30) not null, UelNo nvarchar(30) not null, Address nvarchar(100) not null ) go /*--- ---*/ if exists (select * from sysobjects where name = 'TelRecord') drop database TelRecord go create table TelRecord ( CommID int identity(1,1) primary key, TelFrom nvarchar(30) not null, TelDest nvarchar(30) not null, STime datetime not null, ETime datetime not null ) go --2、 , , -- , , ? /* , */ create index IX_TelRecord_TelFrom on TelRecord(TelFrom) with fillfactor = 10 go /*3 、 ( SQL ), :*/ select * from UserInfo insert into UserInfo values(' ','98290000',' ') insert into UserInfo values(' ','68290900',' ') insert into UserInfo values(' ','0215466546656',' ') insert into UserInfo values(' ','21546654666',' ') insert into UserInfo values(' ','035730928370',' ') insert into UserInfo values(' ','78290000',' ') insert into TelRecord values('98290000','0216566656654','2007-2-1 9:49:53','2007-2-1 9:50:16') insert into TelRecord values('98290000','0216566656654','2007-2-1 9:49:53','2007-2-1 9:50:16') insert into TelRecord values('98290000','021546654666','2007-2-1 9:50:29','2007-2-1 9:51:41') insert into TelRecord values('98290000','021546654666','2007-2-1 9:50:58','2007-2-1 9:51:12') insert into TelRecord values('68290900','075513329866','2007-2-2 10:04:31','2007-2-2 10:07:13') insert into TelRecord values('78290000','0755255708638','2007-2-1 10:48:31','2007-2-1 10:49:23') insert into TelRecord values('78290000','0755821119109','2007-2-1 10:49:39','2007-2-1 10:52:55') insert into TelRecord values('78290000','035730928370','2007-2-3 11:30:45','2007-2-3 11:31:58') insert into TelRecord values('78290000','0871138889904','2007-2-1 11:33:47','2007-2-1 11:35:00') insert into TelRecord values('68290000','035730928379','2007-2-1 11:52:20','2007-2-1 11:54:56') insert into TelRecord values('68290000','0298521811199','2007-2-1 12:44:45','2007-2-1 12:45:04') insert into TelRecord values('68290000','0298521811199','2007-2-1 12:44:45','2007-2-1 12:45:04') select * from TelRecord delete TelRecord where CommID = 2 or CommID = 11 select dateDiff(ss,'2007-2-1 9:50:22','2007-2-1 9:51:12') --4、 SQL , 2 、 ; select * from UserInfo select UserName, =count(UelNo) from UserInfo group by UserName having count(UserName) >1 --5、 SQL , 1 ID select * from TelRecord select CommID from TelRecord where datediff(ss,STime,ETime)<60 /*--6 SQL , , , “ ”、 “ ”; */ select * from UserInfo select * from TelRecord insert into UserInfo select distinct ' ',TelFrom,' ' from TelRecord where TelFrom not in (select UelNo from UserInfo) insert into UserInfo select distinct ' ',TelDest,' ' from TelRecord where TelDest not in (select UelNo from UserInfo) --7、 , 、 、 ; select * from TelRecord alter procedure zsw @month int , @TelFrom nvarchar(30) as set nocount on print convert(char(2),@month)+' , '+@TelFrom+' :' select * from TelRecord where datename(mm,STime)=@month and TelFrom=@TelFrom declare @time int select @time=sum(datediff(ss,STime,ETime)) from TelRecord where datename(mm,STime)=@month and TelFrom=@TelFrom print convert(char(2),@month)+' , '+@TelFrom+' :'+convert(varchar(15),@time)+' ' go exec zsw 2,98290000