1   引言

  上篇讲到SQL Server中DML的基本使用方法,其中SELECT语句是最常用的语句,其功能强大,结构复杂,下面通过例子,具体介绍其使用方法。

2 SELECT查询语句

  SELECT语句从数据表或视图中查找数据,SELECT语法归纳如下:

    [WITH <common_table_expression>]

    SELECT select_list [INTO new_table_name]

    [FROM table_source] [WHERE search_condition]

    [GROUP BY group_by_expression]

    [HAVING search_condition]

    [ORDER BY order_expression [ASC | DESC] ]

  假设现有如下三张表格,名称分别为Student、Course和Grade,下面使用例子具体介绍各个子句的使用方法。

    

            Student                        Course

    

          Grade

3 简单查询

  • WITH子句

  WITH子句用于指定临时命名的结果集,这些结果集称为共用表表达式(CTE),来自简单的查询。也就是说,先通过WITH子句查找出一个临时的表,再在该临时表中进行查询。语法如下(语法格式,大写为关键字,[]为可选项,[,...]为可重复前一项):

    WITH expression_name [(column_name [,…])] AS

    (CTE_query_definition)

    CTE_query_definition: 指定一个其结果集填充共用表达式的SELECT语句。

  例如,在WITH子句中查找Student的年龄分布,放入临时表AgeReport中,再查找AgeReport表,SQL语句如下:

    

  结果如下:

    

  • SELECT……FROM子句

  SELECT指明要读取的信息,FROM指定从中获取数据的一个或多个表。SELECT中为查询的列取别名方法:

  别名 = 列名

  列名 AS 别名

  列名 别名

  例如,查询Student表中student_no和name并设置别名为学号和姓名:

    

  结果如下:

    

  •  INTO子句

  创建新表并将查询结果插入新表中。

  • WHERE子句
  1. 逻辑运算符(NOT、AND、OR)

    [NOT] boolean_expression

    Boolean_expression AND boolean_expression

    Boolean_expression OR boolean_expressio

  2.  比较运算符

    = > < >= <= <>

    例如,查找性别为女,年龄小于18的student:

      

      

  3.  LIKE关键字

    Match_expression [NOT] LIKE pattern [ESCAPE escape_expression]

    通配符% _ [] [^],%可匹配任何0个或多个字符,_匹配一个字符,[]指定范围或集合,如  [a-f]或[abcdef]表示其中的一个字符,[^]同[]相反。

    例如,查找姓李的学生:

      

      

  4.  BETWEEN关键字

    BETWEEN...AND和NOT BETWEEN… AND

   5.  IS (NOT) NULL关键字

    在WHERE子句中,不能用=来判断NULL,只能用IS (NOT) NULL

    例如,超找成绩表中,成绩为空的记录:

      

      

  6.  IN关键字

    使用IN关键字来指定列表搜索的条件,确定指定的值是否与子查询或列表中的值相匹配。

    Test_expression [NOT] IN (subquery | expression [,...])

  7.  ALL、SOME、ANY关键字

    比较标量值和单列集中的值,与比较运算符和子查询一起使用。

    Scalar_expression {= | <> | > | >= | < | <= } {ALL | SOME | ANY} (subquery)

    例如,查找学生中年龄比心雨和李小小都大(> ALL)的学生:

      

      

  8.  EXISTS关键字

    用于指定一个子查询是否存在

    EXISTS subquery

  • GROUP BY子句

  表示按照一个或多个列或表达式的值将一组选定行组合成一个摘要行集,针对每一组返回一行。

    GROUP BY group_by_expression [,...]

  SELECT子句必须包括在聚类函数或GROUP BY子句中。常用的行聚合函数如下:

COUNT(*)

返回组中的项数

COUNT([ALL | DISTINCT] 列名])

返回某列的个数

AVG([ALL | DISTINCT] 列名])

返回某列的平均值

MAX([ALL | DISTINCT] 列名])

返回某列的最大值

MIN([ALL | DISTINCT] 列名])

最小值

SUM([ALL | DISTINCT] 列名])

总和

STDEV([ALL | DISTINCT] 列名])

标准偏差

STDEVP([ALL | DISTINCT] 列名])

总体标准偏差

VAR([ALL | DISTINCT] 列名])

方差

VARP([ALL | DISTINCT] 列名])

总体方差

例如,将学生按照性别分组,并统计人数:

  

    

  • HAVING子句

指定组或聚合的搜索条件,通常在GROUP BY中使用。

  HAVING  search_condition

例如,将学生按照性别分组,并统计女生的人数

    

    

  • ORDER BY子句

指定在SELECT语句返回的列表中所使用的排序方式。除非同时指定了TOP,否则ORDER BY子句在视图、内联函数、派生表和子查询中无效。

  ORDER BY {order_by_expression [COLLATE collation_name] [ASC | DESC] [,...]}

  [COLLATE collation_name] 指定为collation_name的排序规则,而不是表或视图中所定义的排序规则。

  ASC 表示升序排列,DESC表示降序排列,默认为升序。

例如,将学生按照年龄排序:

    

    

  • COMPUTE子句

生成合计作为附加的汇总列出现在结果集的最后,当与BY一起使用时,COMPUTE子句在结果集中生成控制中断和小计。

  COMPUTE

  { {AVG | COUNT | MAX | MIN | STDEV | STDEVP | VAR | VARP | SUM} (expression) }[,...]

  [BY expression [,…]]

如果是使用COMPUTE子句指定的行聚合函数,不允许他们使用DISTINCT关键字。

例如,将学生按照年龄排序,并计算平均年龄:

    

    

例如,将学生按照性别排序,并计算不同性别的平均年龄:

    

    

  • DISTINCT关键字

从SELECT语句的结果集中去掉重复的记录。

  • TOP关键字

限制查询结构显示的条数。

SELECT TOP n [PERCENT] FROM table WHERE

PERCENT 表示百分之n。

例如,查找年龄最小的三个学生:

  

  

4 UNION合并多个查询结果

  UNION合并是将两个表的行合并到一个表中。合并后新表的行数是两个表行数之和,列数不变。需满足一下规则:

  1. 两个表的列数必须相同,对应列上的数据类型必须兼容
  2. 列名和别名是由第一个SELECT语句决定的
  3. 默认的情况下是去掉重复行的,除非明确指定ALL关键字
  4. ORDER BY 子句必须放在最后SELECT后面,且所使用的排序列名,必须为第一个SELECT中的列名

  UNION和联接查询之间的区别

    

  在合并中,两个表的列的数量必须相同,类型兼容;联接中,结果表的列可能来自第一个表、第二个表或两个表都有。

  合并中,结构表的最大行数是两个表的行数和;联接中,行最大是两个表的乘积。

  例如,合并学生和课程的表格:

    

    

5 子查询和嵌套查询

  子查询是一个嵌套在SELECT、INSERT、UPDATE或DELETE语句或其他子查询中的查询,任何使用表达式的地方都可以使用子查询。

  嵌套查询是指将一个查询块嵌套在另一个查询块的WHERE或HAVING子句中,因此嵌套查询属于子查询。

  嵌套查询常和比较运算符(<、>等)和逻辑运算符(IN、ANY等)一起使用。

  例如,查找数学成绩大于90的学生信息:

    

    

6   联接查询

  关系数据库,经常通过主键、外键来建立一对一、一对多或多对多的关系表。联接查询就是将具有关系的两个或多个表联接起来查询。

  联接查询是由一个笛卡尔乘积运算再加一个选取运算构成。联接可分为内部联接、外部联接和交叉联接。

  • 内部联接

  SELECT fieldlist FROM table1 [INNER] JOIN table2 ON table1.column = table2.column

  内部联接结果中,删除被连接表中没有匹配项的所有行,所以可能丢失信息。

  例如,联接查询学生和成绩表:

    

    

  • 外部联接
  1. LEFT JOIN

    SELECT fieldlist FROM table1 LEFT JOIN table2 ON table1.column = table2.column

    结果中保留左边表的所有项,删除右边表中没有匹配项的行。

    例如,左联接查询学生和成绩表

      

      

    可见多了一行,其为成绩表中在学生表中没有匹配的项,该行中学生表数据全为NULL。

  2. RIGHT JOIN

    SELECT fieldlist FROM table1 RIGHT JOIN table2 ON table1.column = table2.column

    结果中保留右边表的所有项,删除左边表中没有匹配项的行。

    例如,右联接查询学生和成绩表:

      

      

    可见多了一行,其为学生表中在成绩表中没有匹配的项,该行中成绩表数据全为NULL。

  3. FULL JOIN

    SELECT fieldlist FROM table1 FULL JOIN table2 ON table1.column = table2.column

    结果中保留左右边表的所有项

    例如,全联接查询学生和成绩表:

    

    

  可见多了两行。 保留两个表完整的数据。

  • 交叉联接

  没有WHERE子句的交叉联接,产生两个表的笛卡尔集。结果集中的行为源表行的乘积,应该避免大型列表进行交叉联接。

  SELECT fieldlist FROM table1 CROSS JOIN table2

  例如,交叉联接课程和学生表,结果集的行数为两表行数的乘积。

    

    

  • 联接多表

  SELECT fieldlist FROM table1  , table2,  table3... WHERE table1.column = table2.column and Table2.column = table3.column...

  或

  SELECT fieldlist FROM table1  JOIN table2 JOIN table3... ON table1.column = table2.column and Table2.column = table3.column…

  ON语句必须遵循FROM后面所列表的顺序,即FROM后面先写的表相应的ON语句先写。

SQL Server DML(SELECT)常见用法(二)的更多相关文章

  1. SQL Server中SELECT会真的阻塞SELECT吗?

    在SQL Server中,我们知道一个SELECT语句执行过程中只会申请一些意向共享锁(IS) 与共享锁(S), 例如我使用SQL Profile跟踪会话86执行SELECT * FROM dbo.T ...

  2. SQL SERVER 中 GO 的用法2

    具体不废话了,请看下文详解. 1 2 3 4 5 6 7 8 9 10 use db_CSharp go  select *,  备注=case  when Grade>=90 then '成绩 ...

  3. SQL Server 2008空间数据应用系列二:空间索引(Spatial Index)基础

    原文:SQL Server 2008空间数据应用系列二:空间索引(Spatial Index)基础 在前一篇博文中我们学习到了一些关于地理信息的基础知识,也学习了空间参照系统,既地球椭球体.基准.本初 ...

  4. SQL Server 2017 SELECT…INTO 创建的新表指定到文件组

    原文:SQL Server 2017 SELECT-INTO 创建的新表指定到文件组 SELECT-INTO 在 SQL Server 中也是常见的一个功能,过去用此方法创建的新表只能存储到默认的文件 ...

  5. SQL Server DML(UPDATE、INSERT、DELETE)常见用法(一)

    1.引言 T-SQL(Transact Structured Query Language)是标准的SQL的扩展,是程序和SQL Server沟通的主要语言. T-SQL语言主要由以下几部分组成: 数 ...

  6. SQL SERVER 内存学习系列(二)-DMV查看内存信息

    内存管理在SQL Server中有一个三级结构.底部是内存节点,这是最低级的分配器,用于SQL Server的内存.第二个层次是由内存Clerk组成,这是用来访问内存节点和缓存存储,缓存存储则用于缓存 ...

  7. SQL Server 性能优化实战系列(二)

    SQL Server datetime数据类型设计.优化误区 一.场景 在SQL Server 2005中,有一个表TestDatetime,其中Dates这个字段的数据类型是datetime,如果你 ...

  8. SQL SERVER中SELECT和SET赋值相同点与不同点

    SELECT和SET在SQL SERVER中都可以用来对变量进行赋值,但其用法和效果在一些细节上有些不同. 1. 在对变量赋值方面,SET是ANSI标准的赋值方式,SELECT则不是.这也是SET方式 ...

  9. [转]SQL Server 存储过程 一些常用用法(事物、异常捕捉、循环)

      最新更新请访问: http://denghejun.github.io Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中 ...

随机推荐

  1. 关于Node.js, Jade一点小小的介绍。

    本文出自:http://blog.csdn.net/svitter node.js大家知道的可能比較多,可是jade大家可能就不知道了.. GFW封杀掉google以后.今天在百度上找了好久也没有找到 ...

  2. 并行任务task

    http://msdn.microsoft.com/zh-cn/library/dd537609(v=vs.110).aspx http://www.cnblogs.com/yangecnu/p/So ...

  3. SSH框架-Caused by: org.hibernate.MappingException: column attribute may not be used together with <column> subelement

    昨晚修改了一些表关系,在相关的hbm.xml文件中做了改动,今天早上起来启动tomcat后,发现项目启动不了,控制台报错: 2015-6-14 9:09:42 org.apache.catalina. ...

  4. 【取对数+科学计数法】【HDU1060】 N^N

    Leftmost Digit Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...

  5. linux系统如何限制其他用户登录

    用root 用户登录到系统排查问题,这个时候不希望别的账户登录到系统,你如何处理? vim /etc/nologin 将账号添加到此文件中去,你会发现其他用户都无法登录,报错信息如下:即连接即中断.

  6. sql server去除重复信息,

    SELECT st_id FROM ( SELECT *,ROW_NUMBER() OVER( PARTITION BY st_code ORDER BY st_code ) AS num FROM ...

  7. eclipse.ini内存设置

    这两天用eclipse,突然变得很卡,就上网找了些资料,对eclipse.ini启动参数配置,整理如下: 1.先了解下JVM内存管理机制,JVM内存分为堆内存和非堆内存 2.JVM内存限制 首先JVM ...

  8. C#中“@”的作用和用法

    “@”在看别人程序的时候偶尔看到,总结了一下两个用途 1. 不常用,也不推介用的用法. @关键字 可以作为标识符来使用,说白了,就是讲关键字变成非关键字. 2.逐字字符串字面量,以@开头,后面是由引导 ...

  9. Android中webView的基础使用(一)

    WebView是View的一个子类,可以让你在activity中显示网页. 可以在布局文件中写入WebView:比如下面这个写了一个填满整个屏幕的WebView: <?xml version=& ...

  10. bluestacks安装安卓引擎时出现2502 2503错误的解决办法

    2503代表工作站无法启动.2502代表下面的程序调用不支持的MS-DOS函数. 以管理员身份运行命令提示符在经典桌面使用快捷键Win+X,出现一个菜单,选择“命令提示符(管理员) ”即可以以管理员身 ...