Sql Server查询语句

来源:互联网 发布:不教翠羽遇萧峰 知乎 编辑:程序博客网 时间:2024/05/17 07:55

一、查询语句格式

    SELECT [ALL|DISTINCT] [表名.]{*|列名|表达式[AS 新列名]}

    [INTO :主变量[,:主变量]…]

    FROM 表名[表别名], 

    [WHERE 条件表达式|子查询]

    [GROUP BY 列名, …

     [HAVING 分组表达式]]

    [{UNION|INTERSECT |EXCEPT}SELECT…FROM…]

    [ORDER BY 列名|列序号[ASC|DESC], …]

二、单表查询

 

    Where 子句——运算符 

    比较:<<=>>==<>not + ~

    确定范围:

       Between A and BNot Between A and B

    确定集合INNOT IN

    字符匹配LIKENOT LIKE

    空值IS NULLIS NOT NULL

    多重条件:ANDORNOT

    1----

    SELECT Sname NAME, 'Year of Birth:' BIRTH,

           2003-sage BIRTHDAY,  LOWER(Sdept) DEPARTMENT

    FROM    Student;  

    2--- 选择表中的行

    消除重复行: DISTINCT    (缺省为ALL)

    SELECT    DISTINCT Sno FROM      student 

    3---  BETWEEN  AND

    求年龄在~ (, 22)之间的学生名及年龄(或不在~之间)

    SELECT Sname, Sage    FROM    Student

    WHERE   Sage BETWEEN 18 AND 22 (WHERE Sage>=18 AND Sage<=22)

    4--- IN or NOT IN

    SELECT    *    FROM     Student

    WHERE    Sdept IN (‘IE’, ‘CS’, ‘MA’)(WHERE Sdept=‘IE’OR Sdept=‘CS’OR Sdept=‘MA’)

 

    5--- Like

    格式:

       [NOT] LIKE ‘匹配串[ESCAPE ‘换码字符]

       %: 表示任意长度()的任意字符

       _: 表示单个的任意字符

       ESCAPE ‘换码字符: 匹配串中换码字符(转义符)之后的字(%,__),被定义为普通字符(不作通配符用)

    列出课程名称中带有_’的课号及课名:

        Select cno cnameFrom Course  Where cname LIKE %"_%escape ‘"’

    求以DATA_BASE’开头且倒数第五个字符为S’的课程名

        SELECT Cname  FROM Course  WHERE Cname LIKE ‘DATA"_BASE%S_ _ _ _’ESCAPE’"’

     6--- NULL

    SELECT   Sno, Cno FROM SC WHERE   Grade IS NULL;

 

 

    7--- 分组与组函数

    只有出现在Group By子句中的属性,才可出现在Select子句中

    组函数的使用:

       COUNT([DISTINCT|ALL] *|列名)

       SUM([DISTINCT|ALL] 列名)

       AVG([DISTINCT|ALL] 列名)

       MAX([DISTINCT|ALL] 列名)

       MIN([DISTINCT|ALL] 列名)

    组函数可用于SELECT子句中的目标列表中或在HAVING子句的分组表达式中用作条件。

    对分出的每一组用HAVING进行筛选,筛选条件要用到组函数。

    Having Where的区别:

        Where 决定哪些元组被选择参加运算作用于关系中的元组

        Having 决定哪些分组符合要求作用于分组

   

    例:统计各系学生的人数。

       Select sdeptcount(*) as stu_count

       From Student

       Group By sdept

    求选修了课程的学生人数

       SELECT COUNT(DISTINCT Sno) FROM SC

    例:求选修各门课的人数及平均成绩

       SELECT Cno, COUNT(Sno), AVG(GR) FROM    SC GROUP BY Cno

    例:求选修课程在2门以上且都及格的学生号及总平均分

       SELECT Sno, AVG(Grade) FROM SC GROUP BY Sno HAVING COUNT(Cno)>2 AND MIN(Grade)>=60

    8--- 排序

    用ORDER BY子句对查询结果按照一个或多个列的值进行升/降排列输出,升序为ASC;降序为DESC,空值将作为最大值排序


连接查询

    多表连接查询、单表连接查询(自连接)、外连接查询、复合条件连接查询.

    示例数据表:

    学生信息表Student; 课程信息表Course; 选课情况表SC,教师信息表teacher

    1--- 单表连接(自连接)

    用表别名把一个表定义为两个不同的表进行连接。

    2--- 左连接、右连接、全外连接

    求各部门名及职工名,要求输出无职工的部门(职工以空值出现)

       SELECT  DNAMETNAME FROM    department Dteacher T

       WHERE   D.DNO = T.DNO(*)(*则,别表示该列可以为空  Left join )

    求各部门名及职工名,要求输出无职工的部门和未分配部门的职工

       SELECT  DNAMETNAME FROM    department Dteacher T

       WHERE   D.DNO (*) = T.DNO(*);(Full join )

    3--- 复合条件连接

嵌套查询

    SELECT FROM WHERE语句结构的;

    WHERE子句中可嵌入一个SELECT语句块;

    其上层查询称为外层查询或父查询;

    其下层查询称为内层查询或子查询;

    SQL语言允许使用多重嵌套查询;

    在子查询中不允许使用ORDER BY子句;

    嵌套查询的实现一般是从里到外,即先进行;

    子查询,再把其结果用于父查询作为条件。

 

    1--- 返回一组值得子查询

    求选修C6‘课程且成绩超过分的学生

       SELECT  * FROM student

       WHERE sno  IN  ( SELECT sno FROM SC WHERE Cno='C6' AND Grade);

    求比计算机系中某一学生年龄小的其他系的学生

       SELECT  * FROM student

       WHERE   sdept!=’CS’AND  sage ANY( SELECT   Sage FROM  Student  WHERE    Sdept=‘CS’)

 

带有EXISTS的相关子查询

    不相关子查询:子查询的查询条件不依赖于父查询的称为不相关子查询。

    相关子查询:子查询的查询条件依赖于外层父

    查询的某个属性值的称为相关子查询(Correlated Subquery),EXISTS的子查询就是相关子查询

    EXISTS表示存在量词,带有EXISTS的子查询不返回任何记录的数据,只返回逻辑值‘True ’‘False ’

 

    :求所有选修了C1课程的学生名。

    不相关子查询

        SELECT  Sname FROM student

       WHERE sno  IN ( SELECT sno FROM SC WHERE   Cno = 'C1' )

    相关子查询

        SELECT   Sname   FROM   student

       WHERE    EXISTS   

       (

           SELECT  *  FROM    SC

           WHERE   student.sno=SC.sno  AND  Cno='C1'

       );

    先在外层查询中取student表的第一个元组(记录),用该记录的

    相关的属性值(在内层WHERE子句中给定的)处理内层查询,若

    外层的WHERE子句返回TRUE’值,则此元组送入结果的表中。然

    后再取下一个元组;重复上述过程直到外层表的记录全部遍历一次为止。

 

    不关心子查询的具体内容,因此用SELECT * Exists + 子查询用来判断该子查询是否返回元组

    当子查询的结果集非空时,Exists'True'  当子查询的结果集为空时,Exists'False'

    NOT EXISTS :若子查询结果为空,返回TRUE’值,否则返回‘FALSE’

 

    例:列出没有选C1课程的学生的学号、姓名

       SELECT Sname  FROM   student

       WHERE NOT EXISTS

       (

           SELECT * FROM   Course

           WHERE  student.sno=SC.sno AND Cno='C1'

       );

    :查询选修了所有课程的学生的姓名

       SELECT Sname  FROM   student

       WHERE NOT EXISTS

       (

           SELECT * FROM   Course

           WHERE NOT EXISTS

           (

              SELECT * FROM   SC

              WHERE  student.sno=SC.sno AND Course.Cno=SC.Cno

           )

       );  /*该学生不存在于 所有课都选的学生的集合之中*/

 

    例:名查询至少选修了S1所选的全部课程的学生

       SELECT Sname  FROM   student

       WHERE NOT EXISTS              

       (

           SELECT * FROM   SC  SCX         

           WHERE  SCX.sno='s1' AND NOT EXISTS       

           (

              SELECT * FROM   SCSCY

              WHERE  student.sno=SCY.sno AND SCX.Cno=SCY.Cno

           )

       );  /*该学生不存在于 S1所有课都选的学生的集合之中*/

注意细节

        FROM语句中使用子查询,对查询结果定义表名及列名

       SELECTSno, AVG_G

       FROM  (

              SELECTSno,AVG(Grade) FROM  SC

              GROUP  BY  Sno

              ) AS   RA(Sno,AVG_G)

       WHERE      AVG_G>80;


0 0
原创粉丝点击