天天看點

資料庫SQL操作語句集錦

轉自 http://www.cnblogs.com/jhl7777/articles/2347833.html

SQL操作全集

下列語句部分是Mssql語句,不可以在access中使用。

SQL分類: 

DDL—資料定義語言(CREATE,ALTER,DROP,DECLARE) 

DML—資料操縱語言(SELECT,DELETE,UPDATE,INSERT) 

DCL—資料控制語言(GRANT,REVOKE,COMMIT,ROLLBACK)

首先,簡要介紹基礎語句: 

1、說明:建立資料庫 

CREATE DATABASE database-name 

2、說明:删除資料庫 

drop database dbname 

3、說明:備份sql server 

--- 建立 備份資料的 device 

USE master 

EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat' 

--- 開始 備份 

BACKUP DATABASE pubs TO testBack 

4、說明:建立新表 

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 

5、說明:删除新表drop table tabname 

6、說明:增加一個列 

Alter table tabname add column col type 

注:列增加後将不能删除。DB2中列加上後資料類型也不能改變,唯一能改變的是增加varchar類型的長度。 

7、說明:添加主鍵: Alter table tabname add primary key(col) 

說明:删除主鍵: Alter table tabname drop primary key(col) 

8、說明:建立索引:create [unique] index idxname on tabname(col….) 

删除索引:drop index idxname 

注:索引是不可更改的,想更改必須删除重建立。 

9、說明:建立視圖:create view viewname as select statement 

删除視圖:drop view viewname 

10、說明:幾個簡單的基本的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%’ ---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 

11、說明:幾個進階查詢運算詞 

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),不消除重複行。 

注:使用運算詞的幾個查詢結果行必須是一緻的。 

12、說明:使用外連接配接 

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: 

全外連接配接:不僅包括符号連接配接表的比對行,還包括兩個連接配接表中的所有記錄。

其次,大家來看一些不錯的sql語句 

1、說明:複制表(隻複制結構,源表名:a 新表名:b) (Access可用) 

法一:select * into b from a where 1 <>1 

法二:select top 0 * into b from a

2、說明:拷貝表(拷貝資料,源表名:a 目标表名:b) (Access可用) 

insert into b(a, b, c) select d,e,f from b;

3、說明:跨資料庫之間表的拷貝(具體資料使用絕對路徑) (Access可用) 

insert into b(a, b, c) select d,e,f from b in ‘具體資料庫’ where 條件 

例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..

4、說明:子查詢(表名1:a 表名2:b) 

select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)

5、說明:顯示文章、送出人和最後回複時間 

select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

6、說明:外連接配接查詢(表名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

7、說明:線上視圖查詢(表名1:a ) 

select * from (SELECT a,b,c FROM a) T where t.a > 1;

8、說明:between的用法,between限制查詢資料範圍時包括了邊界值,not between不包括 

select * from table1 where time between time1 and time2 

select a,b,c, from table1 where a not between 數值1 and 數值2

9、說明:in 的使用方法 

select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)

10、說明:兩張關聯表,删除主表中已經在副表中沒有的資訊 

delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )

11、說明:四表聯查問題: 

select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....

12、說明:日程安排提前五分鐘提醒 

SQL: select * from 日程安排 where datediff('minute',f開始時間,getdate())>5

13、說明:一條sql 語句搞定資料庫分頁 

select top 10 b.* from (select top 20 主鍵字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主鍵字段 = a.主鍵字段 order by a.排序字段

14、說明:前10條記錄 

select top 10 * form table1 where 範圍

15、說明:選擇在每一組b值相同的資料中對應的a最大的記錄的所有資訊(類似這樣的用法可以用于論壇每月排行榜,每月熱銷産品分析,按科目成績排名,等等.) 

select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)

16、說明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重複行而派生出一個結果表 

(select a from tableA ) except (select a from tableB) except (select a from tableC)

17、說明:随機取出10條資料 

select top 10 * from tablename order by newid()

18、說明:随機選擇記錄 

select newid()

19、說明:删除重複記錄 

Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)

20、說明:列出資料庫裡所有的表名 

select name from sysobjects where type='U'

21、說明:列出表裡的所有的 

select name from syscolumns where id=object_id('TableName')

22、說明:列示type、vender、pcs字段,以type字段排列,case可以友善地實作多重選擇,類似select 中的case。 

select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type 

顯示結果: 

type vender pcs 

電腦 A 1 

電腦 A 1 

CD光牒 B 2 

CD光牒 A 2 

手機 B 3 

手機 C 3

23、說明:初始化表table1 

TRUNCATE TABLE table1

24、說明:選擇從10到15的記錄 

select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc 

   

随機選擇資料庫記錄的方法(使用Randomize函數,通過SQL語句實作) 

  對存儲在資料庫中的資料來說,随機數特性能給出上面的效果,但它們可能太慢了些。你不能要求ASP“找個随機數”然後列印出來。實際上常見的解決方案是建立如下所示的循環: 

Randomize 

RNumber = Int(Rnd*499) +1 

  

While Not objRec.EOF 

If objRec("ID") = RNumber THEN 

... 這裡是執行腳本 ... 

end if 

objRec.MoveNext 

Wend 

  

  這很容易了解。首先,你取出1到500範圍之内的一個随機數(假設500就是資料庫内記錄的總數)。然後,你周遊每一記錄來測試ID 的值、檢查其是否比對RNumber。滿足條件的話就執行由THEN 關鍵字開始的那一塊代碼。假如你的RNumber 等于495,那麼要循環一遍資料庫花的時間可就長了。雖然500這個數字看起來大了些,但相比更為穩固的企業解決方案這還是個小型資料庫了,後者通常在一個資料庫内就包含了成千上萬條記錄。這時候不就死定了? 

  采用SQL,你就可以很快地找出準确的記錄并且打開一個隻包含該記錄的recordset,如下所示: 

Randomize 

RNumber = Int(Rnd*499) + 1 

  

SQL = "SELECT * FROM Customers WHERE ID = " & RNumber 

  

set objRec = ObjConn.Execute(SQL) 

Response.WriteRNumber & " = " & objRec("ID") & " " & objRec("c_email") 

  

  不必寫出RNumber 和ID,你隻需要檢查比對情況即可。隻要你對以上代碼的工作滿意,你自可按需操作“随機”記錄。Recordset沒有包含其他内容,是以你很快就能找到你需要的記錄這樣就大大降低了處理時間。 

再談随機數 

  現在你下定決心要榨幹Random 函數的最後一滴油,那麼你可能會一次取出多條随機記錄或者想采用一定随機範圍内的記錄。把上面的标準Random 示例擴充一下就可以用SQL應對上面兩種情況了。 

  為了取出幾條随機選擇的記錄并存放在同一recordset内,你可以存儲三個随機數,然後查詢資料庫獲得比對這些數字的記錄: 

SQL = "SELECT * FROM Customers WHERE ID = " & RNumber & " OR ID = " & RNumber2 & " OR ID = " & RNumber3 

  

  假如你想選出10條記錄(也許是每次頁面裝載時的10條連結的清單),你可以用BETWEEN 或者數學等式選出第一條記錄和适當數量的遞增記錄。這一操作可以通過好幾種方式來完成,但是 SELECT 語句隻顯示一種可能(這裡的ID 是自動生成的号碼): 

SQL = "SELECT * FROM Customers WHERE ID BETWEEN " & RNumber & " AND " & RNumber & "+ 9"

  注意:以上代碼的執行目的不是檢查資料庫内是否有9條并發記錄。

  

随機讀取若幹條記錄,測試過 

Access文法:SELECT top 10 * From 表名 ORDER BY Rnd(id) 

Sql server:select top n * from 表名 order by newid() 

mysql     :select * From 表名 Order By rand() Limit n 

Access左連接配接文法(最近開發要用左連接配接,Access幫助什麼都沒有,網上沒有Access的SQL說明,隻有自己測試, 現在記下以備後查) 

文法elect table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where ... 

使用SQL語句 用...代替過長的字元串顯示 

文法: 

SQL資料庫:select case when len(field)>10 then left(field,10)+'...' else field end as news_name,news_id from tablename 

Access資料庫:SELECT iif(len(field)>2,left(field,2)+'...',field) FROM tablename; 

  

Conn.Execute說明 

Execute方法 

  該方法用于執行SQL語句。根據SQL語句執行後是否傳回記錄集,該方法的使用格式分為以下兩種: 

    1.執行SQL查詢語句時,将傳回查詢得到的記錄集。用法為: 

    Set 對象變量名=連接配接對象.Execute("SQL 查詢語言") 

   Execute方法調用後,會自動建立記錄集對象,并将查詢結果存儲在該記錄對象中,通過Set方法,将記錄集賦給指定的對象儲存,以後對象變量就代表了該記錄集對象。

    2.執行SQL的操作性語言時,沒有記錄集的傳回。此時用法為: 

    連接配接對象.Execute "SQL 操作性語句" [, RecordAffected][, Option] 

      ·RecordAffected 為可選項,此出可放置一個變量,SQL語句執行後,所生效的記錄數會自動儲存到該變量中。通過通路該變量,就可知道SQL語句隊多少條記錄進行了操作。 

      ·Option 可選項,該參數的取值通常為adCMDText,它用于告訴ADO,應該将Execute方法之後的第一個字元解釋為指令文本。通過指定該參數,可使執行更高效。

·BeginTrans、RollbackTrans、CommitTrans方法

SQL Server 2005安裝辦法如下:

  一.在SQL伺服器的安裝盤中找到MSDE這個目錄,并且點

擊setup.exe安裝它,過程簡單直接下一步就OK了。

  二. 重新開機系統WINDOWSXP,這下就可以看到SQL服務的圖示

出現了。

三. 再拿出SQL伺服器版的安裝CD光牒,直接安裝用戶端工具

(這個不要多說吧?最簡單的方法就是直接點選CD光牒根目錄下

的autorun.exe)

根據提示安裝,自檢過程中知道系統不是SERVER版,會提示隻

安裝用戶端工具。(哈哈,服務端我已有了)

四. 打開企業管理器,試用SA使用者連一下看看,是不是發現

SA使用者登陸失敗?因為你還沒有與信任SQL SERVER連接配接相關聯

。還好這個隻要

對系統系統資料庫稍加修改就可以啦:

在運作中輸入regedit打開系統資料庫編輯器,找到

[HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\MSSQLSERVER\MSS

QLSERVER],這個項裡面

有一個鍵值LoginMode,預設下,值是1,現在将值改為2,重

啟電腦。

五. 再打開企業管理,再連接配接試試,是不是OK了!

create table student (

 sid varchar(50) primary key ,

 sname varchar(20) ,

 sage int ,

 ssex varchar(5)

)

create table teacher (

tid varchar(50) primary key ,

tname varchar(20)

)

create table course(

cid varchar(50) primary key ,

cname varchar(30),

tid varchar(50) ,

)

alter table course add constraint fk_1 foreign key (tid) references teacher(tid);

create table sc(

 sid varchar(50) not null,

 cid varchar(50) not null,

 score int not null

)

alter table sc add constraint fk_2 foreign key (sid) references student(sid);

alter table sc add constraint fk_3 foreign key (cid) references course(cid);

insert into teacher (tid,tname) values ('001','teacher1')

insert into teacher (tid,tname) values ('002','teacher2')

insert into teacher (tid,tname) values ('003','teacher3')

insert into teacher (tid,tname) values ('004','teacher4')

insert into teacher (tid,tname) values ('005','teacher5')

insert into student values ('001','student1',20,'man')

insert into student values ('002','student2',16,'woman')

insert into student values ('003','student3',30,'man')

insert into student values ('004','student4',9,'woman')

insert into student values ('005','student5',25,'man')

insert into course values ('001','course1','001')

insert into course values ('002','course2','002')

insert into course values ('003','course3','003')

insert into course values ('004','course4','004')

insert into course values ('005','course5','005')

insert into sc values ('001','001','80')

insert into sc values ('001','002','60')

insert into sc values ('001','003','40')

insert into sc values ('001','004','100')

insert into sc values ('001','005','90')

insert into sc values ('002','001','40')

insert into sc values ('002','002','60')

insert into sc values ('002','003','70')

insert into sc values ('002','004','100')

insert into sc values ('002','005','90')

insert into sc values ('003','001','90')

insert into sc values ('003','002','60')

insert into sc values ('003','003','70')

insert into sc values ('003','004','60')

insert into sc values ('003','005','40')

--1、查詢“001”課程比“002”課程成績高的所有學生的學号; 

select a.sid from 

  (select sid ,score from sc where cid='001') a,

  (select sid,score from sc where cid='002') b 

  where a.score>b.score and a.sid=b.sid

--2、查詢平均成績大于60分的同學的學号和平均成績; 

select sid ,avg(score) from sc group by sid having avg(score)>60

--3、查詢所有同學的學号、姓名、選課數、總成績

1)select a.sid ,a.sname ,(select count(*) from sc as b where a.sid=b.sid) '選課數',(select sum(score) from sc as b where        a.sid=b.sid) '總成績' from student as a

2)select a.sid ,a.sname , count(b.cid) '選課數',sum(b.score) '總成績' from student a left outer join sc b on a.sid=b.sid        group by a.sid,a.sname

--4、查詢姓“李”的老師的個數

select count(*) from teacher where tname like '李%'

--5、查詢沒學過“teacher1”老師課的同學的學号、姓名

select sid ,sname from student where sid not in 

(select sid  from teacher t,course c,sc s where s.cid=c.cid and t.tid=c.tid and t.tname='teacher1')

--6、查詢學過“001”并且也學過編号“002”課程的同學的學号、姓名; 

--解法1.

select sid ,sname from student where sid in

(select sid from sc where cid='001') and sid in (select sid from sc where cid='002')

--解法2.

select s.sid ,s.sname from student s,sc where s.sid=sc.sid and cid='001' and exists(

select * from sc sc1 where sc1.sid=sc.sid and sc1.cid='002')

--7、查詢學過“teacher1”老師所教的所有課的同學的學号、姓名; 

select sid,sname from student where sid in(select sc.sid from sc,course c,teacher t where t.tname='teacher1' and t.tid=c.tid 

and c.cid = sc.cid group by sid having count(sid)=(select count(cid) from course c,teacher t 

where t.tname='teacher1' and t.tid=c.tid ))

--8、查詢課程編号“002”的成績比課程編号“001”課程低的所有同學的學号、姓名;

select sid,sname from(select s.sid ,sname ,score score1,

(select score from sc  where sc.sid=s.sid and sc.cid='002')score2 

from student s,sc where s.sid=sc.sid and sc.cid='001') a where a.score1>a.score2

--9、查詢所有課程成績小于60分的同學的學号、姓名; 

select sid ,sname from student where sid not in(select distinct(sid) from sc where score>60)

--10、查詢沒有學全所有課的同學的學号、姓名(包括一門課程都沒學的同學); 

select s.sid ,sname from student s left outer join sc on sc.sid=s.sid group by s.sid ,sname

having count(cid)<(select count(cid) from course)  

--11、查詢至少有一門課與學号為“001”的同學所學相同的同學的學号和姓名

select distinct(s.sid),sname from student s,sc where s.sid=sc.sid and sc.cid in(select cid from sc where sc.sid='001' ) 

--12、查詢至少學過學号為“001”同學所有一門課的其他同學學号和姓名;

--個人認為同11題

--13、把“SC”表中“teacher1”老師教的課的成績都更改為此課程的平均成績;

update sc set score=(select avg(score) from sc s1 where sc.cid=s1.cid) 

from course c,teacher t ,sc where sc.cid=c.cid and c.tid=t.tid and t.tname='teacher1'

--14、查詢和“002”号的同學學習的課程完全相同的其他同學學号和姓名;

select s.sid,sname from sc ,student s where sc.sid=s.sid and sc.cid in

(select cid from sc where sid='002') group by s.sid,sname having count(*)=

(select count(cid) from sc where sid='002')

--15、删除學習“teacher7”老師課的SC表記錄;

delete sc from teacher t,course c where t.tid=c.cid and t.tname='teacher7' and sc.cid=c.cid  

--16、向SC表中插入一些記錄,這些記錄要求符合以下條件:1、沒有上過編号“003”課--程的同學學号 2、成績為'002'号課的平均成績; 

Insert SC select Sid,'002',(Select avg(score) 

from SC where Cid='002') from Student where Sid not in (Select Sid from SC where Cid='002'); 

--17、按平均成績從高到低顯示所有學生的“資料庫”、“企業管理”、“英語”三門的--課程成績,按如下形式顯示: 學生ID,,資料庫,企業管理,英語,有效課程數,有效平均分

select sid '學生ID',(select score from sc s where s.sid=sc.sid and s.cid='001') '資料庫',

(select score from sc s where s.sid=sc.sid and s.cid='002') '企業管理',

(select score from sc s where s.sid=sc.sid and s.cid='003') '英語',

count(cid) '有效課程數',avg(score)  '有效平均分'

from sc group by sid order by '有效平均分'

--18、查詢各科成績最高和最低的分:以如下形式顯示:課程ID,最高分,最低分 

select cid '課程ID',max(score) '最高分',min(score) '最低分' from sc group by cid

--19、查詢各科課号,課名,該科平均成績和及格率的百分數并按及格率從高到低排序

select sc.cid,cname,avg(score) '平均分',100*sum(case when isnull(score,0)>=60 then 1 else 0 end)/count(*) '及格率'

 from sc,course c where sc.cid=c.cid group by sc.cid ,cname order by '及格率' desc;

--20、查詢如下課程平均成績和及格率的百分數(用"1行"顯示): 企業管理(001),馬克思(002),OO&UML (003),資料庫(004) 

select sum(case when cid='001' then score else 0 end)/sum(case when cid='001' then 1 else 0 end) '企業管理平均分',

100*sum(case when cid='001' and isnull(score,0)>=60 then 1 else 0 end)/sum(case when cid='001' then 1 else 0 end) '企業管理及格率',

sum(case when cid='002' then score else 0 end)/sum(case when cid='002' then 1 else 0 end) '馬克思平均分',

100*sum(case when cid='002' and isnull(score,0)>=60 then 1 else 0 end)/sum(case when cid='002' then 1 else 0 end) '馬克思及格率',

sum(case when cid='003' then score else 0 end)/sum(case when cid='003' then 1 else 0 end) 'OO&UML平均分',

100*sum(case when cid='003' and isnull(score,0)>=60 then 1 else 0 end)/sum(case when cid='003' then 1 else 0 end) 'OO&UML及格率',

sum(case when cid='004' then score else 0 end)/sum(case when cid='004' then 1 else 0 end) '資料庫平均分',

100*sum(case when cid='004' and isnull(score,0)>=60 then 1 else 0 end)/sum(case when cid='004' then 1 else 0 end) '資料庫及格率'

from sc 

--21、查詢不同老師所教不同課程平均分從高到低顯示(注:一門課程隻能有一位老師教) 

select c.cid,tid, avg(score) '平均分' from sc,course c where sc.cid=c.cid group by c.cid,tid order by '平均分'

--22、查詢如下課程成績第 3 名到第 5 名的學生成績單:企業管理(001),馬克思(002),UML (003),資料庫(004) 

--  [學生ID],[學生姓名],企業管理,馬克思,UML,資料庫,總分

select distinct top 3 with ties sc.sid ,s.sname,s1.score  '企業管理',s2.score '馬克思',s3.score 'UML',s4.score '資料庫',

isnull(s1.score,0)+isnull(s2.score,0)+isnull(s3.score,0)+isnull(s4.score,0) as '總分' 

from student s,sc left join sc s1 on sc.sid=s1.sid and s1.cid='001'

left join sc s2 on sc.sid=s2.sid and s2.cid='002'

left join sc s3 on sc.sid=s3.sid and s3.cid='003'

left join sc s4 on sc.sid=s4.sid and s4.cid='004'

where s.sid=sc.sid 

and isnull(s1.score,0)+isnull(s2.score,0)+isnull(s3.score,0)+isnull(s4.score,0)  not in (

select distinct top 3 with ties isnull(s1.score,0)+isnull(s2.score,0)+isnull(s3.score,0)+isnull(s4.score,0) '總分' 

from sc left join sc s1 on sc.sid=s1.sid and s1.cid='001'

left join sc s2 on sc.sid=s2.sid and s2.cid='002'

left join sc s3 on sc.sid=s3.sid and s3.cid='003'

left join sc s4 on sc.sid=s4.sid and s4.cid='004' 

order by '總分' desc

) order by '總分' desc

--23、統計列印各科成績,各分數段人數:課程ID,課程名稱,[100-85],[85-70],[70-60],[ <60] 

select sc.cid '課程ID',cname '課程名稱' ,sum(case when isnull(score,0)>=85 then 1 else 0 end) '[100-85]',

sum(case when isnull(score,0)>=70 and isnull(score,0)<85 then 1 else 0 end) '[85-70]',

sum(case when isnull(score,0)>=60 and isnull(score,0)<70 then 1 else 0 end) '[70-60]',

sum(case when isnull(score,0)<60 then 1 else 0 end) '[<60]'

from sc,course c where sc.cid=c.cid group by sc.cid ,cname

--24、查詢學生平均成績及其名次 

select 1+(select count(*) from 

(select sid,avg(score) '平均成績' from sc  group by sid )t1 where t1.平均成績>t2.平均成績) 名次,

sid,平均成績

from 

(select sid,avg(score) '平均成績' from sc group by sid) t2 order by '名次' 

--25、查詢各科成績前三名的記錄:(不考慮成績并列情況) 

select sid,cid,score from sc s where score in(select top 3 score from sc where s.cid=sc.cid order by score desc) 

order by cid

--26、查詢每門課程被選修的學生數

select cid,count(sid) from sc group by cid

--27、查詢出隻選修了一門課程的全部學生的學号和姓名

select s.sid ,sname from sc,student s where sc.sid=s.sid group by s.sid,sname having count(sc.cid)=1

--28、查詢男生、女生人數

select count(sid) '女生人數', (select count(sid) from student where ssex='man' group by ssex) '男生人數' from student where ssex='woman' group by ssex;

--29、查詢姓“張”的學生名單 

select * from student where sname like '張%'

--30、查詢同名同性學生名單,并統計同名人數

select sname,count(*) '同名人數'  from student group by sname having count(sname)>1

--31、1981年出生的學生名單(注:Student表中Sage列的類型是datetime) 

select * from student where CONVERT(char(11),DATEPART(year,Sage))='1981';

--32、查詢每門課程的平均成績,結果按平均成績升序排列,平均成績相同時,按課程号降序排列

select cid, avg(score) from sc group by cid order by avg(score) asc ,cid desc

--33、查詢平均成績大于85的所有學生的學号、姓名和平均成績

select s.sid ,sname ,avg(score) from student s,sc where s.sid=sc.sid group by s.sid,sname having avg(score)>85  

--34、查詢課程名稱為course1,且分數低于60的學生姓名和分數 

select s.sid,sname,cname,score from course c,sc,student s 

where c.cid=sc.cid and sc.sid=s.sid and isnull(score,0)<60 and cname='course1'

--35、查詢所有學生的選課情況; 

select s.sid,sname,cid from sc,student s where sc.sid=s.sid

--36、查詢任何一門課程成績在70分以上的姓名、課程名稱和分數;

select sname,cname,score from student s,course c,sc where s.sid=sc.sid and c.cid=sc.cid and score>70

--37、查詢不及格的課程,并按課程号從大到小排列 

select * from sc where isnull(score,0)<60 order by cid desc

--38、查詢課程編号為003且課程成績在80分以上的學生的學号和姓名; 

select s.sid,sname from sc ,student s where sc.sid=s.sid and cid='003' and isnull(score,0)>80

--39、求選了課程的學生人數 

select count(cid) from course 

--40、查詢選修“teacher1”老師所授課程的學生中,成績最高的學生姓名及其成績 

select sname,score from student s,sc,teacher t,course c

where s.sid=sc.sid and sc.cid=c.cid and c.tid=t.tid and t.tname='teacher1' 

and score=(select max(s1.score) from sc s1 where sc.cid=s1.cid)

--41、查詢各個課程及相應的選修人數 

select cid ,count(sid) from sc group  by cid

--42、查詢不同課程成績相同的學生的學号、課程号、學生成績 

select sc1.sid ,sc1.cid,sc1.score from sc sc1,sc sc2 where sc1.score=sc2.score and sc1.cid<>sc2.cid 

--43、查詢每門功成績最好的前兩名

select * from sc s1 where s1.score in (select top 2 score from sc s2 where s1.cid=s2.cid )

--44、統計每門課程的學生選修人數(超過2人的課程才統計)。要求輸出課程号和選修人數,查詢結果按人數降序排列,若人數相同,按課程号升序排列  

select cid,count(*) '選修人數' from sc group by cid having count(*) >2 order by '選修人數' desc ,cid 

--45、檢索至少選修兩門課程的學生學号

select sid ,count(*) from sc group by sid having count(*)>=2

--46、查詢全部學生都選修的課程的課程号和課程名 

select sc.cid,cname from sc ,course c where sc.cid=c.cid group by sc.cid,cname having count(cname)=

(select count(*) from student )

--47、查詢沒學過“teacher1”老師講授的任一門課程的學生姓名

select sname from sc,student s where 

sc.sid=s.sid and sc.sid  not in( select distinct sid from sc where cid=sc.cid and cid='001')

--48、查詢兩門以上不及格課程的同學的學号及其平均成績 

select sid ,avg(score) from sc where

sid in (select sid from sc where isnull(score,0)<60 group by sid having count(*)>2 ) group by sid

--49、檢索“004”課程分數小于60,按分數降序排列的同學學号 

select sid from sc where cid='004' order by sid desc

--50、删除“002”同學的“001”課程的成績

delete sc where sid='002' and cid='001'

别人怎麼說,怎麼做,沒辦法的事,我自己要明白該怎麼辦。