面試遇到的一些問題

Java基礎

java 的容器線程安全

1.HashSet 非線程安全【1

2.treeSet 非線程安全 【2

3.LinkedHashSet 非線程安全 【3

4.ArrayList 非線程安全 【4

5.LinkedList 非線程安全 【5

6.HashMap 非線程安全 【6

7.TreeMap 非線程安全 【7

8.LinkedHashMap 非線程安全 【8

9.HashTable 線程安全 【9

10.Vector 線程安全 【10

訪問權限

Java中的訪問權限控制符有四個.
作用域_____當前類__同一package___子孫類____其他package
public______________________________________
protected___________________________________×
friendly__________________________×___________×
private________________×__________×___________×
沒有時默認爲friendly(包訪問權限)

雜項

XML文檔區分大小寫,HTML不區分大小寫

XML文檔中屬性值必須寫在引號中

內部類可以是private protect

javac一次可同時編譯數個java源文件

javac.exe能指定編譯結果要置於哪個目錄(directory

在編譯程序時,所能指定的環境變量不包括class path

構造器Constructor是否可被override?假設可以,根據構造方法的特點,那麼子父類是同一個類,所以不可以。 

集合裏面都是不能放基本類型的,轉化成相應的包裝類即可

靜態方法不能被覆蓋成非靜態。

 

java移位運算符

不外乎就這三種:<<(左移)、>>(帶符號右移)和>>>(無符號右移)。

  1、 左移運算符

  左移運算符<<使指定值的所有位都左移規定的次數。

  1)它的通用格式如下所示:

  value << num

  num 指定要移位值value 移動的位數。

  左移的規則只記住一點:丟棄最高位,0補最低位

  如果移動的位數超過了該類型的最大位數,那麼編譯器會對移動的位數取模。如對int型移動33位,實際上只移動了33%32=1位。

  2)運算規則

  按二進制形式把所有的數字向左移動對應的位數,高位移出(捨棄),低位的空位補零。

  當左移的運算數是int 類型時,每移動1位它的第31位就要被移出並且丟棄;

  當左移的運算數是long 類型時,每移動1位它的第63位就要被移出並且丟棄。

  當左移的運算數是byte 和short類型時,將自動把這些類型擴大爲 int 型。

  3)數學意義

  在數字沒有溢出的前提下,對於正數和負數,左移一位都相當於乘以2的1次方,左移n位就相當於乘以2的n次方

  4)計算過程:

  例如:3 <<2(3爲int型)

  1)把3轉換爲二進制數字0000 0000 0000 0000 0000 0000 0000 0011,

  2)把該數字高位(左側)的兩個零移出,其他的數字都朝左平移2位,

  3)在低位(右側)的兩個空位補零。則得到的最終結果是0000 0000 0000 0000 0000 0000 0000 1100,

  轉換爲十進制是12。

  移動的位數超過了該類型的最大位數,

  如果移進高階位(31或63位),那麼該值將變爲負值。下面的程序說明了這一點:

  Java代碼

  // Left shifting as a quick way to multiply by 2.

  public class MultByTwo {

  public static void main(String args[]) {

  int i;

  int num = 0xFFFFFFE;

  for(i=0; i<4; i++) {

  num = num << 1;

  System.out.println(num);

  }

  }

  }

  該程序的輸出如下所示:

  536870908

  1073741816

  2147483632

  -32

  注:n位二進制,最高位爲符號位,因此表示的數值範圍-2^(n-1) ——2^(n-1) -1,所以模爲2^(n-1)。

  2、 右移運算符

  右移運算符<<使指定值的所有位都右移規定的次數。

  1)它的通用格式如下所示:

  value >> num

  num 指定要移位值value 移動的位數。

  右移的規則只記住一點:符號位不變,左邊補上符號位

  2)運算規則:

  按二進制形式把所有的數字向右移動對應的位數,低位移出(捨棄),高位的空位補符號位,即正數補零,負數補1

  當右移的運算數是byte 和short類型時,將自動把這些類型擴大爲 int 型。

  例如,如果要移走的值爲負數,每一次右移都在左邊補1,如果要移走的值爲正數,每一次右移都在左邊補0,這叫做符號位擴展(保留符號位)(sign extension ),在進行右移

  操作時用來保持負數的符號。

  3)數學意義

  右移一位相當於除2,右移n位相當於除以2的n次方。

  4)計算過程

  11 >>2(11爲int型)

  1)11的二進制形式爲:0000 0000 0000 0000 0000 0000 0000 1011

  2)把低位的最後兩個數字移出,因爲該數字是正數,所以在高位補零。

  3)最終結果是0000 0000 0000 0000 0000 0000 0000 0010。

  轉換爲十進制是2。

  35 >> 2(35爲int型)

  35轉換爲二進制:0000 0000 0000 0000 0000 0000 0010 0011

  把低位的最後兩個數字移出:0000 0000 0000 0000 0000 0000 0000 1000

  轉換爲十進制: 8

  5)在右移時不保留符號的出來

  右移後的值與0x0f進行按位與運算,這樣可以捨棄任何的符號位擴展,以便得到的值可以作爲定義數組的下標,從而得到對應數組元素代表的十六進制字符。

  例如

  Java代碼

  public class HexByte {

  public static public void main(String args[]) {

  char hex[] = {

  '0', '1', '2', '3', '4', '5', '6', '7',

  '8', '9', 'a', 'b', 'c', 'd', 'e', 'f''

  };

  byte b = (byte) 0xf1;

  System.out.println("b = 0x" + hex[(b >> 4) & 0x0f] + hex[b & 0x0f]);

  }

  }

  (b >> 4) & 0x0f的運算過程:

  b的二進制形式爲:1111 0001

  4位數字被移出:1111 1111

  按位與運算:0000 1111

  轉爲10進制形式爲:15

  b & 0x0f的運算過程:

  b的二進制形式爲:1111 0001

  0x0f的二進制形式爲:0000 1111

  按位與運算:0000 0001

  轉爲10進制形式爲:1

  所以,該程序的輸出如下:

  b = 0xf1

  3、無符號右移

  無符號右移運算符>>>

  它的通用格式如下所示:

  value >>> num

  num 指定要移位值value 移動的位數。

  無符號右移的規則只記住一點:忽略了符號位擴展,0補最高位

  無符號右移運算符>>> 只是對32位和64位的值有意義

爲什麼在java中不能多繼承,而接口卻可以多繼承

類定義屬性和方法 描述某一類事物的抽象 
而接口定義的是行爲 並不限於任何具體意向 

按照邏輯上來說 單繼承更明確 一個子類就應該是其父類代表的事物中的某個更具體的類別 不應該即是這種東西又是那種東西 
而從實用角度上來說 單繼承易讀 易維護 語義清晰 邏輯清楚 

而接口則不同 接口只定義一些公共行爲 比如有兩個接口 一個定義了跑這個動作 另一個定義了走這個動作 人這個類就可以同時實現這兩個接口所定義的行爲 

類對接口的implements稱作實現 不能叫做繼承 

當然 接口可以多繼承接口 因爲接口只定義行爲 並不包含類別的含義 不指代具體的某類事物 而且 從語義上來說 接口對接口的繼承稱之爲擴展更爲合適

SQL

SQL語句中修改表結構的命令是什麼 Alter Table 

 

sql join默認是內連接

前端

input框有幾種辦法控制不讓輸入:readyonly="readyonly"disable="true"

 

框架

 

Tips

1當用final修飾類的時候,此類不可被繼承,即final類沒有子類

  final屬性 子類可以調用

public class A {

public final int a=1;

public static int b=11;

}

class B extends A{

public final int a=2;

public static int b=12;

void a(){

System.out.println(b);

}

public static void main(String[] args) {

new B().a();

}

}

    Out   12

問答題

1什麼是序列化?Java如何實現序列化?

Java 串行化技術可以使你將一個對象的狀態寫入一個Byte 裏,並且可以從其它地方把該Byte 流裏的數據讀出來,重新構造一個相同的對象。這種機制允許你將對象通過網絡進行傳播,並可以隨時把對象持久化到數據庫、文件等系統裏Java的串行化機制是RMIEJB等技術的技術基礎。用途:利用對象的串行化實現保存應用程序的當前工作狀態,下次再啓動的時候將自動地恢復到上次執行的狀態。

序列化就是一種用來處理對象流的機制,所謂對象流也就是將對象的內容進行流化。可以對流化後的對象進行讀寫操作,也可將流化後的對象傳輸於網絡之間。序列化是爲了解決在對對象流進行讀寫操作時所引發的問題。

序列化的實現:將需要被序列化的類實現Serializable接口,然後使用一個輸出流(如:FileOutputStream)來構造一個ObjectOutputStream(對象流)對象,接着,使用ObjectOutputStream對象的writeObject(Object obj)方法就可以將參數爲obj的對象寫出(即保存其狀態),要恢復的話則用輸入流。

2、串行化的特點:

    1)如果某個類能夠被串行化,其子類也可以被串行化。如果該類有父類,則分兩種情況來考慮,如果該父類已經實現了可串行化接口。則其父類的相應字段及屬性的處理和該類相同;如果該類的父類沒有實現可串行化接口,則該類的父類所有的字段屬性將不會串行化。

  2)聲明爲statictransient類型的成員數據不能被串行化。因爲static代表類的狀態, transient代表對象的臨時數據;

  3)相關的類和接口:在java.io包中提供的涉及對象的串行化的類與接口有ObjectOutput接口、ObjectOutputStream類、ObjectInput接口、ObjectInputStream類。

    1ObjectOutput接口:它繼承DataOutput接口並且支持對象的串行化,其內的writeObject()方法實現存儲一個對象。ObjectInput接口:它繼承DataInput接口並且支持對象的串行化,其內的readObject()方法實現讀取一個對象。

    2ObjectOutputStream類:它繼承OutputStream並且實現ObjectOutput接口。利用該類來實現將對象存儲(調用ObjectOutput接口中的writeObject()方法)。ObjectInputStream類:它繼承InputStream類並且實現ObjectInput接口。利用該類來實現讀取一個對象(調用ObjectInput接口中的readObject()方法)。

  對於父類的處理,如果父類沒有實現串行化接口,則其必須有默認的構造函數(即沒有參數的構造函數)。否則編譯的時候就會報錯。在反串行化的時候,默認構造函數被調用。但是若把父類標記爲可以串行化,則在反串行化的時候,其默認構造函數不會被調用。這是爲什麼呢?這是因爲Java 對串行化的對象進行反串行化的時候,直接從流裏獲取其對象數據來生成一個對象實例,而不是通過其構造函數來完成。

import java.io.*;

public class Cat implements Serializable {

        private String name;

        public Cat () {

                this.name = "new cat";

        }

        public String getName() {

                return this.name;

        }

        public void setName(String name) {

                this.name = name;

        }

        public static void main(String[] args) {          

                Cat cat = new Cat();

                try {

                        FileOutputStream fos = new FileOutputStream("catDemo.out");

                        ObjectOutputStream oos = new ObjectOutputStream(fos);

                        System.out.println(" 1> " + cat.getName());

                        cat.setName("My Cat");                        

                        oos.writeObject(cat);

                        oos.close();                        

                } catch (Exception ex) {  ex.printStackTrace();   }

                try { 

                        FileInputStream fis = new FileInputStream("catDemo.out");

                        ObjectInputStream ois = new ObjectInputStream(fis);

                        cat = (Cat) ois.readObject();

                        System.out.println(" 2> " + cat.getName());

                        ois.close();

                } catch (Exception ex) {

                        ex.printStackTrace();

                }

        }

}//writeObjectreadObject本身就是線程安全的,傳輸過程中是不允許被併發訪問的。所以對象能一個一個接連不斷的傳過來

 

2 java是否存在需要手動釋放的資源,舉例說明

內存資源什麼都不需要手動釋放,原因就是JAVA虛擬機直接控制了內存的回收,所以不需要主動回收(也不可能主動回收)

數據庫鏈接一類的,包括文件操作,這種鏈接也是手動建立的,也必須手動釋放
因爲JAVA虛擬機不會幫忙回收這些東西的,因爲不知道什麼時候需要什麼時候不需要了

3邏輯家誤入某部落囚於牢獄酋意欲放行邏輯家說:

a=說真 b=說假    X=生門Y=死門

問a:b告訴我哪門呢a答:Y

問b:a告訴我哪門呢b答:Y選擇X門嘍

4  JAVA的基本數據類型有哪幾種? String是不是基本數據類型,他們有何區別。 

byte,short,int,char,long,float,double,boolean這些是java的基本數據類型。

String不是基本數據類型,它是java.lang包下的一個類。算複合數據類型。

行爲:
           基本類型只是一個值,沒有任何行爲
           對象類型有自己的行爲
內存分配:
           基本類型在棧內分配
           對象在堆內分配
           對象引用保存在棧內
引用與值:
              基本類型是值類型,僅表示一個值,保存在棧內
              引用類型分兩部分,對象引用保存在棧內,對象保存在堆內,
              訪問變量,是使用的引用找對象
糾正一樓的回答,double,與long類型不是原子的,
double long 分別使用兩個指令操作的,兩指令之間可能併發操作

5怎樣將數值類型轉化爲數字類型(intergerdouble) 怎樣將數字類型轉化爲字符串類?怎樣取得小數點的前兩位,並且進行四捨五入?

1.自動轉化

2.integer. to string (2);

3.double n=2.1356;

n=Math.round(n*100)/100.0;

 

 

6簡述abstract classinterface的區別

前者是抽象類,後者是接口。
抽象類和接口都可以被繼承,不同的是,接口內的方法不能實現,需要繼承的類來具體實現其方法,而抽象類中的方法可以被具體實現,並且繼承的類可以重寫其方法。一個類可以繼承一個抽象類,但是可以繼承多個接口。通常,接口被運用於實現比較常用的功能,便於日後維護或者添加刪除方法,而抽象類更傾向於充當公共類的角色。不適於在日後重新對裏面的代碼進行修改。

 

7.StringStringBuffer的區別

String是字符串常量,而stringbuffer是變量,

String對象是不可變對象,每次操作Sting 都會重新建立新的對象來保存新的值. StringBuffer對象實例化後,只對這一個對象操作。

字符串連接操作中StringBuffer的效率要明顯比String高:

                 

8.簡述邏輯操作(&,|,^)與條件操作(&&,||)的區別

a.條件操作只能操作布爾型的,而邏輯操作不僅可以操作布爾型,而且可以操作

數值型 

b.邏輯操作不會產生短路.

如果某一jsp頁面的表單,有幾個複選框,name”habit”則該jsp提交之後,通過什麼語句去獲取複選框的值?

 String str=request.getParameter("habit");

str="A,B,C";

String [] habit=str.split(",");

10 JSPform上傳文件的時候用到form標籤的enctype屬性,但是這樣在另一個jsp裏調用request.getParameter,拿不到表單的值,爲什麼,用什麼方法可以拿到?

 默認Enctype=application/x-www-form-urlencoded 會將表單域的值處理成URL方式提交。              Enctype=multipart/form-data是是用2進制遞交數據的

request.getInputStream() ; 拿到輸入流讀出來

 11 怎麼防止重複提交

  1 當用戶提交後 把頁面的按鈕設置爲disable ,等到服務器響應再復原。

  2 提交後清空文本框,然後對文本框進行驗證不能爲空

  3session中設置一個提交序列號,提交後進行比較,如果不一致則爲重複提交

12 java 出現亂碼的原因有那些?對javaEE應用必須在那幾個環節處理字符集問題?如何輸出一個某種編碼的字符串?如iso-8859-1編碼的字符以gbk的編碼輸出?

1操作系統編碼與項目編碼不一致,數據庫編碼與項目編碼不一致,jsp編碼與瀏覽器編碼格式不一致。

數據庫編碼,項目編碼,web容器編碼,jsp編碼

先通過getBytes(“iso-8859-1”) 解碼 ,再通過gbk 編碼形成新的字符串

13 Sleep()wait() 有什麼區別?

sleep是Thread類的靜態方法。sleep的作用是讓線程休眠制定的時間,在時間到達時恢復,也就是說sleep將在接到時間到達事件事恢復線程執行,

wait是Object的方法,也就是說可以對任意一個對象調用wait方法,調用wait方法將會將調用者的線程掛起,直到其他線程調用同一個對象的notify方法纔會重新激活調用

14 查找頁面所有類是editinput typetext的元素遍歷他們,並返回他們的Value數組。

  function dotext(){

var a=new Array();

       $("input[class='edit'][type='text']").each(function(i){

        a[i]=$(this).val();

     });

       return a;

  }

  

  $().ready(function(){

    alert(dotext());

  });

15 webservice名詞解釋?通過哪些框架能實現webService?

Ws是解決兩個應用系統之間的遠程調用的工具,傳輸xml格式的數據   Axis2CXF

16理解一下數據庫事務

事務就是一連串不可分割的數據庫操作,要麼全部執行,要麼都不執行,

它具有 原子性,隔離性,一致性,持久性

17 存儲過程與存儲函數的區別

1. 返回值的區別,函數有1個返回值,而存儲過程是通過參數返回的,可以有多個或者沒有

2. 調用的區別,函數可以在查詢語句中直接調用,而存儲過程必須單獨調用.函數一般情況下是用來計算並返回一個計算結果而存儲過程一般是用來完成特定的數據操作(比如修改、插入數據庫表或執行某些DDL語句等等)

18 創建存儲過程的語法

CREATE OR REPLACE PROCEDURE name

Declare 

 --聲明變量

Begin 

 --操作

End

 

19 如何創建索引以及索引的優缺點

 

create index index_name on table_name(column_name) ;
只要你查詢使用到建了索引的字段,一般都會用到索引。 

優點,創建索引可以大大提高系統的性能。

 第一,通過創建唯一性索引,可以保證Oracle數據庫表中每一行數據的唯一性。

 第二,可以大大加快數據的檢索速度,這也是創建索引的最主要的原因。

 缺點  第一,創建索引和維護索引要耗費時間,這種時間隨着數據量的增加而增加。

  第二,索引需要佔物理空間,除了數據表佔數據空間之外,每一個索引還要佔一定的物理空間,如果要建立聚簇索引,那麼需要的空間就會更大。

  第三,當對錶中的數據進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了數據的維護速度。

 

 

 

 

 

 

編程題

         1.javascript校驗數字型

        var re=/^\d{1,8}$|\.\d{1,2}$/;

var str=document.form1.all(i).value;

var r=str.match(re);

if (r==null)

{

sign=-4;

break;

}

else{

document.form1.all(i).value=parseFloat(str);

}

 2.java正則表達式驗證郵件地址

       Pattern p1 = Pattern.compile("//w+@(//w+//.)+[a-z]{2,3}");

        Matcher m = p1.matcher(args[0]);

        boolean isExist = m.matches();

3.利用遞歸方法求5!

public class Test {

  public static void main(String args[]) {

   int x = 5;

   int rs = Fac(x);

   System.out.println("" + x + "! = " + rs);

  }

  public static long Fac(int x) { /*階乘算法*/

   if (x > 1)

    return (x * Fac(x - 1)); /*遞歸*/

   else

    return 1;

 }

 

 

 

分別用遞歸和迭代的方法實現二叉樹的前序遍歷

前序遍歷--根左右

中序遍歷--左根右

後序遍歷--左右根

 

2給定一個存放整數的數組,重新排列數組,使得左邊爲奇數,右邊爲偶數,請儘可能使用少的存儲空間,並且只能對該數組遍歷一次(即時間效率和空間效率最高)

 

SQL

1

多對多

 

1   select count(*)  from Teacher t where t.tname like ’李%’

2  select a.S#

   from SC a ,SC b

   where a.S#=b.S#

   and a.C#='001'

   and b.C#='002'

   and a.score>b.score

3

     SELECT S# as 學生ID 

     ,(SELECT name FROM WHERE S.S#=t.S# ) AS 姓名

        ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='004') AS 數據庫

        ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='001') AS 企業管理

        ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='006') AS 英語

        ,COUNT(*) AS 有效課程數, AVG(t.score) AS 平均成績

    FROM  SC as t 

    GROUP BY S# 

    ORDER BY avg(t.score)  

 

    update SC set score=(select avg(SC_2.score

    from SC SC_2 

where SC_2.C#=SC.C# )

    Where C# in( select c.C# from Course c ,teacher t where c.t#=t.t# and  t.tname=葉萍  )

 

一些一些

1關於學生-課程-成績 --待整理

http://blog.csdn.net/ambow_cq/article/details/7352916

 Sname,Sage,Ssex) --學生表

--Course(C#,Cname,T#) --課程表

--SC(S#,C#,score) --成績表

--Teacher(T#,Tname) --教師表

 

create table Student(S# varchar(20),Sname varchar(10),Sage int,Ssex varchar(2)) 

--前面加一列序號:

if

exists(select table_name from information_schema.tables

  where table_name='Temp_Table')

drop table Temp_Table

go

select 排名=identity(int,1,1),* INTO   Temp_Table    from Student 

go

select * from Temp_Table

go 

 

drop database [ ]  --刪除空的沒有名字的數據庫

--問題:

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

  select a.S# from (select s#,score from SC where C#='001') a,(select s#,score 

  from SC where C#='002') b 

  where a.score>b.score and a.s#=b.s#; 

 

--2、查詢平均成績大於分的同學的學號和平均成績;

    select S#,avg(score) 

    from sc 

    group by S# having avg(score) >60; 

 

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

  select Student.S#,Student.Sname,count(SC.C#),sum(score) 

  from Student left Outer join SC on Student.S#=SC.S# 

  group by Student.S#,Sname 

 

--4、查詢姓的老師的個數;

  select count(distinct(Tname)) 

  from Teacher 

  where Tname like '%'; 

 

--5、查詢沒學過葉平老師課的同學的學號、姓名;

    select Student.S#,Student.Sname 

    from Student  

    where S# not in (select distinct( SC.S#) from SC,Course,Teacher where  SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='葉平'); 

 

--6、查詢學過“”並且也學過編號“”課程的同學的學號、姓名;

  select Student.S#,Student.Sname from Student,SC where Student.S#=SC.S# and SC.C#='001'and exists( Select * from SC as SC_2 where SC_2.S#=SC.S# and SC_2.C#='002'); 

 

--7、查詢學過葉平老師所教的所有課的同學的學號、姓名;

  select S#,Sname 

  from Student 

  where S# in (select S# from SC ,Course ,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='葉平' group by S# having count(SC.C#)=(select count(C#) from Course,Teacher  where Teacher.T#=Course.T# and Tname='葉平')); 

 

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

  Select S#,Sname from (select Student.S#,Student.Sname,score ,(select score from SC SC_2 where SC_2.S#=Student.S# and SC_2.C#='002') score2 

  from Student,SC where Student.S#=SC.S# and C#='001') S_2 where score2 <score; 

 

--9、查詢所有課程成績小於分的同學的學號、姓名;

  select S#,Sname 

  from Student 

  where S# not in (select Student.S# from Student,SC where S.S#=SC.S# and score>60); 

 

--10、查詢沒有學全所有課的同學的學號、姓名;

    select Student.S#,Student.Sname 

    from Student,SC 

    where Student.S#=SC.S# group by  Student.S#,Student.Sname having count(C#) <(select count(C#) from Course); 

 

--11、查詢至少有一門課與學號爲“”的同學所學相同的同學的學號和姓名;

    select S#,Sname from Student,SC where Student.S#=SC.S# and C# in select C# from SC where S#='1001'; 

 

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

    select distinct SC.S#,Sname 

    from Student,SC 

    where Student.S#=SC.S# and C# in (select C# from SC where S#='001'); 

 

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

    update SC set score=(select avg(SC_2.score) 

    from SC SC_2 

    where SC_2.C#=SC.C# ) from Course,Teacher where Course.C#=SC.C# and Course.T#=Teacher.T# and Teacher.Tname='葉平'); 

 

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

    select S# from SC where C# in (select C# from SC where S#='1002') 

    group by S# having count(*)=(select count(*) from SC where S#='1002'); 

 

--15、刪除學習葉平老師課的SC表記錄;

    Delect SC 

    from course ,Teacher  

    where Course.C#=SC.C# and Course.T#= Teacher.T# and Tname='葉平'; 

 

--16、向SC表中插入一些記錄,這些記錄要求符合以下條件:沒有上過編號“”課程的同學學號、、

    號課的平均成績;

    Insert SC select S#,'002',(Select avg(score) 

    from SC where C#='002') from Student where S# not in (Select S# from SC where C#='002'); 

 

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

    SELECT S# as 學生ID 

        ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='004') AS 數據庫

        ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='001') AS 企業管理

        ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='006') AS 英語

        ,COUNT(*) AS 有效課程數, AVG(t.score) AS 平均成績

    FROM SC AS t 

    GROUP BY S# 

    ORDER BY avg(t.score)  

 

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

    SELECT L.C# As 課程ID,L.score AS 最高分,R.score AS 最低分

    FROM SC L ,SC AS R 

    WHERE L.C# = R.C# and 

        L.score = (SELECT MAX(IL.score) 

                      FROM SC AS IL,Student AS IM 

                      WHERE L.C# = IL.C# and IM.S#=IL.S# 

                      GROUP BY IL.C#) 

        AND 

        R.Score = (SELECT MIN(IR.score) 

                      FROM SC AS IR 

                      WHERE R.C# = IR.C# 

                  GROUP BY IR.C# 

                    ); 

 

--19、按各科平均成績從低到高和及格率的百分數從高到低順序

    SELECT t.C# AS 課程號,max(course.Cname)AS 課程名,isnull(AVG(score),0) AS 平均成績

        ,100 * SUM(CASE WHEN  isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) AS 及格百分數

    FROM SC T,Course 

    where t.C#=course.C# 

    GROUP BY t.C# 

    ORDER BY 100 * SUM(CASE WHEN  isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) DESC 

 

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

    SELECT SUM(CASE WHEN C# ='001' THEN score ELSE 0 END)/SUM(CASE C# WHEN '001' THEN 1 ELSE 0 END) AS 企業管理平均分

        ,100 * SUM(CASE WHEN C# = '001' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '001' THEN 1 ELSE 0 END) AS 企業管理及格百分數

        ,SUM(CASE WHEN C# = '002' THEN score ELSE 0 END)/SUM(CASE C# WHEN '002' THEN 1 ELSE 0 END) AS 馬克思平均分

        ,100 * SUM(CASE WHEN C# = '002' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '002' THEN 1 ELSE 0 END) AS 馬克思及格百分數

        ,SUM(CASE WHEN C# = '003' THEN score ELSE 0 END)/SUM(CASE C# WHEN '003' THEN 1 ELSE 0 END) AS UML平均分

        ,100 * SUM(CASE WHEN C# = '003' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '003' THEN 1 ELSE 0 END) AS UML及格百分數

        ,SUM(CASE WHEN C# = '004' THEN score ELSE 0 END)/SUM(CASE C# WHEN '004' THEN 1 ELSE 0 END) AS 數據庫平均分

        ,100 * SUM(CASE WHEN C# = '004' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '004' THEN 1 ELSE 0 END) AS 數據庫及格百分數

  FROM SC 

 

--21、查詢不同老師所教不同課程平均分從高到低顯示

  SELECT max(Z.T#) AS 教師ID,MAX(Z.Tname) AS 教師姓名,C.C# AS 課程ID,MAX(C.Cname) AS 課程名稱,AVG(Score) AS 平均成績

    FROM SC AS T,Course AS C ,Teacher AS Z 

    where T.C#=C.C# and C.T#=Z.T# 

  GROUP BY C.C# 

  ORDER BY AVG(Score) DESC 

 

--22、查詢如下課程成績第名到第名的學生成績單:企業管理(),馬克思(),UML (),數據庫()

    [學生ID],[學生姓名],企業管理,馬克思,UML,數據庫,平均成績

    SELECT  DISTINCT top 3 

      SC.S# As 學生學號

        Student.Sname AS 學生姓名

      T1.score AS 企業管理

      T2.score AS 馬克思

      T3.score AS UML, 

      T4.score AS 數據庫

      ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) as 總分

      FROM Student,SC  LEFT JOIN SC AS T1 

                      ON SC.S# = T1.S# AND T1.C# = '001' 

            LEFT JOIN SC AS T2 

                      ON SC.S# = T2.S# AND T2.C# = '002' 

            LEFT JOIN SC AS T3 

                      ON SC.S# = T3.S# AND T3.C# = '003' 

            LEFT JOIN SC AS T4 

                      ON SC.S# = T4.S# AND T4.C# = '004' 

      WHERE student.S#=SC.S# and 

      ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) 

      NOT IN 

      (SELECT 

            DISTINCT 

            TOP 15 WITH TIES 

            ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) 

      FROM sc 

            LEFT JOIN sc AS T1 

                      ON sc.S# = T1.S# AND T1.C# = 'k1' 

            LEFT JOIN sc AS T2 

                      ON sc.S# = T2.S# AND T2.C# = 'k2' 

            LEFT JOIN sc AS T3 

                      ON sc.S# = T3.S# AND T3.C# = 'k3' 

            LEFT JOIN sc AS T4 

                      ON sc.S# = T4.S# AND T4.C# = 'k4' 

      ORDER BY ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) DESC); 

 

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

    SELECT SC.C# as 課程ID, Cname as 課程名稱

        ,SUM(CASE WHEN score BETWEEN 85 AND 100 THEN 1 ELSE 0 END) AS [100 - 85] 

        ,SUM(CASE WHEN score BETWEEN 70 AND 85 THEN 1 ELSE 0 END) AS [85 - 70] 

        ,SUM(CASE WHEN score BETWEEN 60 AND 70 THEN 1 ELSE 0 END) AS [70 - 60] 

        ,SUM(CASE WHEN score < 60 THEN 1 ELSE 0 END) AS [60 -] 

    FROM SC,Course 

    where SC.C#=Course.C# 

    GROUP BY SC.C#,Cname; 

 

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

      SELECT 1+(SELECT COUNT( distinct 平均成績

              FROM (SELECT S#,AVG(score) AS 平均成績

                      FROM SC 

                  GROUP BY S# 

                  ) AS T1 

            WHERE 平均成績> T2.平均成績) as 名次

      S# as 學生學號,平均成績

    FROM (SELECT S#,AVG(score) 平均成績

            FROM SC 

        GROUP BY S# 

        ) AS T2 

    ORDER BY 平均成績desc; 

 

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

      SELECT t1.S# as 學生ID,t1.C# as 課程ID,Score as 分數

      FROM SC t1 

      WHERE score IN (SELECT TOP 3 score 

              FROM SC 

              WHERE t1.C#= C# 

            ORDER BY score DESC 

              ) 

      ORDER BY t1.C#; 

 

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

  select c#,count(S#) from sc group by C#; 

 

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

  select SC.S#,Student.Sname,count(C#) AS 選課數

  from SC ,Student 

  where SC.S#=Student.S# group by SC.S# ,Student.Sname having count(C#)=1; 

 

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

    Select count(Ssex) as 男生人數from Student group by Ssex having Ssex=''; 

    Select count(Ssex) as 女生人數from Student group by Ssex having Ssex=''; 

 

--29、查詢姓的學生名單

  SELECT Sname FROM Student WHERE Sname like '%'; 

 

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

  select Sname,count(*) from Student group by Sname having  count(*)>1;; 

 

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

    select Sname,  CONVERT(char (11),DATEPART(year,Sage)) as age 

    from student 

    where  CONVERT(char(11),DATEPART(year,Sage))='1981'; 

 

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

    Select C#,Avg(score) from SC group by C# order by Avg(score),C# DESC ; 

 

--33、查詢平均成績大於的所有學生的學號、姓名和平均成績

    select Sname,SC.S# ,avg(score) 

    from Student,SC 

    where Student.S#=SC.S# group by SC.S#,Sname having    avg(score)>85; 

 

--34、查詢課程名稱爲數據庫,且分數低於的學生姓名和分數

    Select Sname,isnull(score,0) 

    from Student,SC,Course 

    where SC.S#=Student.S# and SC.C#=Course.C# and  Course.Cname='數據庫'and score <60; 

 

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

    SELECT SC.S#,SC.C#,Sname,Cname 

    FROM SC,Student,Course 

    where SC.S#=Student.S# and SC.C#=Course.C# ; 

 

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

    SELECT  distinct student.S#,student.Sname,SC.C#,SC.score 

    FROM student,Sc 

    WHERE SC.score>=70 AND SC.S#=student.S#; 

 

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

    select c# from sc where scor e <60 order by C# ; 

 

--38、查詢課程編號爲且課程成績在分以上的學生的學號和姓名;

    select SC.S#,Student.Sname from SC,Student where SC.S#=Student.S# and Score>80 and C#='003'; 

 

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

    select count(*) from sc; 

 

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

    select Student.Sname,score 

    from Student,SC,Course C,Teacher 

    where Student.S#=SC.S# and SC.C#=C.C# and C.T#=Teacher.T# and Teacher.Tname='葉平' and SC.score=(select max(score)from SC where C#=C.C# ); 

 

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

    select count(*) from sc group by C#; 

 

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

  select distinct  A.S#,B.score from SC A  ,SC B where A.Score=B.Score and A.C# <>B.C# ; 

 

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

    SELECT t1.S# as 學生ID,t1.C# as 課程ID,Score as 分數

      FROM SC t1 

      WHERE score IN (SELECT TOP 2 score 

              FROM SC 

              WHERE t1.C#= C# 

            ORDER BY score DESC 

              ) 

      ORDER BY t1.C#; 

 

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

    select  C# as 課程號,count(*) as 人數

    from  sc  

    group  by  C# 

    order  by  count(*) desc,c#  

 

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

    select  S#  

    from  sc  

    group  by  s# 

    having  count(*)  >  =  2 

 

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

    select  C#,Cname  

    from  Course  

    where  C#  in  (select  c#  from  sc group  by  c#)  

 

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

    select Sname from Student where S# not in (select S# from Course,Teacher,SC where Course.T#=Teacher.T# and SC.C#=course.C# and Tname='葉平'); 

 

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

    select S#,avg(isnull(score,0)) from SC where S# in (select S# from SC where score <60 group by S# having count(*)>2)group by S#; 

 

--49、檢索“”課程分數小於,按分數降序排列的同學學號

    select S# from SC where C#='004'and score <60 order by score desc; 

 

--50、刪除“”同學的“”課程的成績

delete from Sc where S#='001'and C#='001'; 

 

--學生表(學號、姓名、性別、年齡、所在系

--課程表(課程號、課程名、先修課號、學分

--學生選課表(學號、課程號、成績

 

--1:查詢全體學生的學號和姓名 

 

--2:查詢全體學生的姓名、學號和所在系 

 

--3:  查詢全體學生的詳細記錄 

 

--4: 查詢全體學生的姓名及其出生年份 

 

--5:查詢全體學生姓名、出生年份和所在系,要求用小寫字母表示所有系名 

 

--6:查詢選修了課程的學生學號 

 

--7:查詢計算機系(IS)所有學生的名單 

 

--8:查詢所有年齡在20以下學生的姓名和年齡 

 

--9:  查詢考試成績有不及格的學生的學號 

 

--10: 查詢年齡在20-23 (包括2023)之間的學生的姓名、系別和年齡 

 

--11: 查詢信息系(IS)、數學系(MA)和計算機科學系(CS)學生的姓名和性別 

 

--12: 查詢學號爲95001的學生的詳細情況 

 

--13: 查詢所有姓林的學生的姓名、學號和性別 

 

--14: 查詢姓歐陽且全名爲三個漢字的學生的姓名 

 

--15:查詢名字中第二個字爲字的學生姓名和學號 

 

--16:查詢所有不姓的學生的姓名 

 

--17:查詢課程名爲“DB_DESIGN”的課程號的學分 

 

--18:查詢缺少成績的學生的學號和相應的課程號(成績字段值爲Null) 

 

--19: 查詢所有有成績的學生的學號和課程號 

 

--20: 查詢所有計算機系年齡在20以下的學生姓名 

 

--21: 查詢選修了3號課程的學生的學號和成績,查詢結果按分數降序排列 

 

--22: 查詢全體學生情況,查詢結果按所在系的系號升序排列,同一系中的學生按年齡降序排列 

 

--23: 查詢學生總人數 

 

--24: 查詢選修了課程的學生人數 

 

--25: 計算1號課程的學生的平均成績 

 

--26: 計算1號課程的學生的最高成績分數 

 

--27:求各個課程號及相應的選課人數 

 

--28:  查詢選修了三門以上課程的學生學號 

 

--29:查詢每個學生及其選修課情況 

 

--30:查詢每一門課的間接先行課 

 

--31:選修2號課程且成績在90以上的學生的學號和姓名 

 

--32:查詢每個學生的學號、姓名、選修的課程名及成績 

 

--33:查詢與林燕芳在同一個系學習的學生姓名 

 

--34: 查詢其他系中比信息系某一學生小的學生姓名和年齡 

 

--35:查詢所有選修了1號課程的學生的學生姓名 

 

--36:查詢選修了全部課程的學生姓名 

 

--37:至少選修了學生95002選修全部課程的學生號碼 

 

select Sno,Sname from Student 

 

select Sno,Sname,Sdept from Student 

 

select * from Student /*也可以逐一列出列名並用逗號分隔*/ 

 

--其中getdate是獲取當前系統時間。這是一個獲取到的結果 :2008-12-11 16:02:17.967 

 

--datepart從獲取到的系統時間中分離出需要的部分,這裏是分離出年份,更多信息請查看SQL Server聯機幫助 

 

--下面的 出生年 指定了別名來替代原來結果頁出現的文字 

 

select Sname , (datepart( year,getdate())- Sage) '出生年' from Student 

 

--該實例利用了小寫轉換函數lower() 提示:通過查詢分析器的 公用對象 的 字符串函數中你可以找到這個函數 

 

select Sname '姓名' , (datepart( year,getdate())- Sage) '出生年',lower(Sdept) '所在系' from Student 

 

select Sno  from sc --這裏將返回全部結果,有重複的值 

 

   select distinct Sno from sc--加入關鍵字distinct就可以去除重複結果,只留1個 

 

--sql 中默認對字符串大小寫不敏感的,所以下面的sdept=’IS’你也可以寫成sdept=’is’。如果你要啓用大小寫敏感,可以用下面的方法 

 

if   敏感   

       select   *   from   table   where   field1="AAA"   COLLATE   Chinese_PRC_CS_AS   

  else   

        select   *   from   table   where   field1="AAA"   COLLATE   Chinese_PRC_CI_AS 

  COLLATE   的中文排序規則參數可用下列方式查到 

  SELECT   *   FROM   ::fn_helpcollations()   where   name   like   'Chinese%' 

 

select Sname from student where sdept='IS' 

 

select Sname,Sage from student where Sage<20 

 

select Sno from sc where grade<60 

 

--如果要查詢不在這個區間的記錄,那隻要改成 not between就可以了 

 

select Sname,Sdept,Sage from student where Sage between 20 and 23 

 

--如果要查詢不屬於信息系、數學系和計算機科學系的,可以在in前面加上NOT 

 

--也可以這樣子寫:select Sname,Ssex from student where Sdept='is' or sdept='ma' or sdept='cs' 

 

select Sname,Ssex from student where Sdept in('IS','MA','CS') 

 

--或者是select * from student where sno = '95001' 

 

select * from student where sno like '95001'--like用於字符串匹配 

 

--百分號匹配多個字符,包括0個 

 

select Sname,Sno,Sage  from student where sname like '%' 

 

-- 一個下劃線匹配單個字符 

 

select sname from student where sname like '歐陽_' 

 

select sname,sno from student where sname like '_%' 

 

select sname from student where sname not like '%' 

 

select Ccredit from course where cname like 'DB\_DESIGN' escape'\' 

 

--注意:這裏不用使用 = null 

 

select sno,cno  from sc where grade is null 

 

select sno,cno from sc where grade is not null 

 

select sname from student where sdept='CS' and sage<20 

 

select sno,grade from sc where cno=3 order by grade desc 

 

select * from student order by sdept,sage desc 

 

select count(*) from student 

 

select count(distinct sno) from sc 

 

select avg(grade) from sc where cno='1' 

 

select max(grade) from sc where cno='1' 

 

group by 按照它後面的列值進行分組,相同的值被分在一組 

 

select cno,count(sno) from sc group by cno 

 

--having後面的條件是根據group by 分組後的結果再進行篩選,最後只給出滿足條件的分組 

 

--where篩選的對象是整個表,而having則是分組 

 

select sno from sc group by sno having count(sno)>=3 

 

select a.sname,b.cno from student a ,sc b where a.sno=b.sno 

 

或者 

 

select a.sname,b.cno from student a left outer join sc b 

 

on a.sno=b.sno where b.cno is not null 

 

--自身連接 

 

select a.Cno,b.Cpno from course a,course b where a.Cpno=b.Cno 

 

--31: 

 

select student.sno,student.sname 

 

from student,sc 

 

where student.sno=sc.sno and 

 

sc.cno='2' and 

 

sc.grade>=90 

 

--32: 

 

select student.sno,student.sname,course.cname,sc.grade 

 

from (student left join sc on student.sno=sc.sno) 

 

left join course on sc.cno=course.cno 

 

--或者: 

 

--忽略cnamegrade都爲null的行 

 

Select student.sno,sname,cname,grade 

 

From student,sc,course 

 

Where student.sno=sc.sno and sc.cno=course.cno 

 

--33: 

 

select sname from student 

 

where sdept=(select sdept from student where sname='林燕芳') 

 

--34: 

 

select sname,sage 

 

from student 

 

where sage<any( 

 

select sage from student 

 

where sdept='is' 

 

) and sdept<>'IS' 

 

--35:利用 exists的查詢 

 

--exists根據是否存在行返回true/false 

 

--如果要查詢沒有選修1號課程的學生姓名,只要使用NOT Exists即可 

 

select * 

 

from student 

 

where exists( 

 

select 1 from sc 

 

where student.sno=sc.sno and cno='1' 

 

 

--或者你可以使用連接查詢 

 

select * from student left join sc on student.sno=sc.sno 

 

where sc.cno='1' 

 

--36: 

 

declare @temp1 int 

 

declare @temp2 int 

 

select @temp1=count(*) from course 

 

select @temp2=sno from sc group by sno 

 

having count(sno)=@temp1 

 

select sname from student where sno in (@temp2) 

 

--或者 

 

--就是轉換成查詢沒有一門課程沒有選修的學生姓名 

 

--如果把兩個not都去掉就是查詢所有有選修課程的學生 

 

Select sname from student where not exists( 

 

Select 1 from course where not exists( 

 

Select 1 from sc where student.sno=sc.sno and course.cno=sc.cno 

 

 

 

--37: 

 

--同樣要進行轉換:查詢這樣的學生,沒有95002選修的課程而學生X沒有選修的 

 

Select distinct sno 

 

From sc scx 

 

Where not exists 

 

 

       Select 1 from sc scy 

 

       Where scy.sno='95002' and not exists 

 

       ( 

 

              Select 1 from sc scz 

 

              Where scz.sno=scx.sno and scz.cno=scy.cno 

 

       ) 

 

 

and sno!='95002' 

 

--插入語句: 

 

--對每一個系求平均年齡,並把結果存入數據庫 

 

--需要創建一個表用來存儲結果 

 

Create table Deptage 

 

 

       Sdept char(15), 

 

       Avgage smallint 

 

); 

 

--插入子查詢結果 

 

insert into 

 

  Deptage(Sdept,Avgage) 

 

select sdept,avg(sage) 

 

from student 

 

group by sdept 

 

--查看結果 

 

select * from deptage 

 

--修改語句; 

 

--1:將學生95001的年齡改爲22歲 

 

Update student 

 

Set sage=22 

 

Where sno='95001'--注意如果不帶where,則修改全部記錄 

 

--2:將所有的學生年齡加1(修改多個元組的值

 

Update student 

 

Set sage=sage+1; 

 

--3:將計算機系全體同學的成績置零(帶子查詢的修改語句) 

 

Update sc 

 

Set grade=0 

 

Where 'cs'=( 

 

Select sdept from student 

 

Where student.sno=sc.sno) 

 

--刪除語句: 

 

--1:刪除學號爲95009的學生記錄(刪除後將無法回覆

 

Delete from student 

 

Where sno='95009'--沒有加where的話將刪除該表全部記錄 

 

--2:刪除計算機科學系所有學生的選課記錄 

 

Delete from sc 

 

Where 'cs'=( 

 

Select sdept 

 

From student 

 

Where student.sno=sc.sno 

 

 

--1:查詢至少選秀1號課程和3號課程號的學生號碼。 

 

--答案 

 

select  a.學號  from sc a,sc b where a.學號=b.學號 and a.課程號='1' and b.課程號='3' 

 

--2:查詢至少選修了一門直接先行課爲5號課程的學生姓名。 

 

--答案: 

 

select 姓名 from student where 學號 in( SELECT [學號] FROM [test].[dbo].[SC] where 課程號 in(SELECT 課程號 from Course where 先行課='5')) 

 

--例子3:查詢選修了全部課程的學生號碼和姓名。 

 

declare @t1 int 

 

declare @t2 int 

 

select @t2=count(*) from Course 

 

select @t1=學號   from SC  group by 學號 having count(學號)=@t2 

 

--print '@t1='+cast(@t1 as varchar) 

 

Select 學號,姓名 from student where  學號=@t1 

 

--例子4:查詢信息系年齡最大的三個學生的學號及其年齡,結果按年齡降序排列。 

 

select top 3  學號,年齡  from Student where 所在系='IS' order by 年齡 desc 

 

--例子5:查詢選修了2號課程的學生名字 

 

select 姓名 from student where 學號 in( select 學號 from sc where 課程號=2) 

 

--例子6:查詢成績爲90分以上的學生名字和課程名字 

 

select st.姓名,c.課程名 from student st left join sc s on st.學號=s.學號 left join Course c on s.課程號=c.課程號 

 

where  st.學號 in (select st.學號 from sc where s.成績>=90) 

 

sql 取中間幾條記錄(select top 表達式)  

 

--查詢從第M條至N條的記錄,寫到存儲過程中就是輸入參數 

 

declare @m int-- 

 

declare @n int-- 

 

declare @x int 

 

declare @y int 

 

--設置測試值 

 

set @m=3 

 

set @n=10 

 

set @x=(@n-@m+1) 

 

set @y=(@m-1) 

 

/* 

語法 

Select top (n-(m-1)) * from [表名] where [parimary key] not in(select top (m-1) 

[主鍵] from [表名] order by [排序字段及排序方法]) order by [排序字段及排序方法 

]; 

*/ 

--測試用例,因爲T-sql top 後不支持表達式,故採取下面的方法 

 

exec('select top  '+@x+'*  from  kf.T_Community where [C_ID] not in (select top '+@y+' [C_ID] from kf.T_Community order by [C_ID]) order by [C_ID]')

--PS:如果在Orcale中,可以直接通過rownumber來控制,這樣就容易多了

 

 

 

 

 

 

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章