面试遇到的一些问题

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来控制,这样就容易多了

 

 

 

 

 

 

 


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