SQL学习笔记——Select查询语句

使用数据库和表的主要目的是存储数据以便在需要时进行检索、统计或组织输出。 SELECT 语句,它是 T-SQL 的核心。从数据库中检索行,并允许从一个或多个表中选择一个
或多个行或列。

虽然 SELECT 语句的完整语法较复杂,但其主要语法格式如下:

[ WITH  <common_table_expression>]  
SELECT [ ALL | DISTINCT ]      
[TOP expression [PERCENT] [ WITH TIES ]
]      
< select_list >       /*指定要选择的列及其限定*/     
[ INTO new_table ]       /*INTO子句,指定结果存入新表*/     
[ FROM { <table_source> } [ ,...n ]]   /*FROM 子句,指定表或视图*/     
[ WHERE <search_condition> ]    /*WHERE 子句,指定查询条件*/     
[ GROUP BY [ ALL ] group_by_expression [ ,...n ] ] /*GROUP BY 子句,指定分组表达式*/   
[ HAVING <search_condition > ]    /*HAVING 子句,指定分组统计条件*/
[ ORDER BY order_expression [ ASC | DESC ] ]  /*ORDER 子句,指定排序*/ [;] 

参数说明:

ALL:指定在结果集中可以包含重复行。ALL 是默认值。


DISTINCT:指定在结果集中只能包含唯一行。对于 DISTINCT关键字来说,NULL 值是相等的。


TOP expression [ PERCENT ] [ WITH TIES ]5:指示只能从查询结果集返回指定的第 一组行或指定的百分比数目的行。expression 可以是指定数目或百分比数目的行。

选择列通过 SELECT 语句的<select_list>项组成结果表的列

语法格式:

<select_list> ::=  { 
	*  /*选择当前表或视图的所有列*/  
	| { table_name | view_name | table_alias}.*     /*选择指定的表或视图的所有列*/  
	| { column_name | [ ] expression |$IDENTITY } /*选择指定的列*/   
	[ [ AS ] column_alias ]      /*AS 子句,定义列别名*/  
	| column_alias = expression   /*选择指定列并更改列标题*/ } 
	[ ,... n ]  

参数说明:

  • :指定返回 FROM 子句中的所有表和视图中的所有列。这些列按 FROM子句中指定的表或视图顺序返回,并对应于它们在表或视图中的顺序。

table_ name | view_ name | table_alias.* :将*的作用域限制为指定的表或视图。


column_ name:要返回的列名。请限定column_name以避免引用不明确,例如,当 FROM 子句中的两个表包含同名的列时会出现这种情况。例如,AdventureWorks数据库SalesOrderHeader 和 SalesOrderDetail 表中均有名为ModifiedDate的列。如果将这两个表加入查询,则可以在选择列表中指定 SalesOrderDetail 项的修改日期,即SalesOrderDetail.ModifiedDate。


expression:列名、常量、函数以及由一个或多个运算符连接的列名、常量和函数的 任意组合,或者是子查询。


$IDENTITY:返回标识列。如果 FROM 子句中的多个表内都包含具有IDENTITY 属性的列,则必须使用特定的表名限定 I D E N T I T Y T 1. IDENTITY(如 T1. IDENTITY)。


column_alias:查询结果集内替换列名的可选名。例如,可以为名为quantity 的列指定别名Qty。

代码示例`

--查询学生信息表中的所有内容
use DB001
go
select * from Student

--查询表中指定列,如学生表中姓名、性别
use DB001
go
select Sname,sex
from student

--查询指定学生的信息;再查询所有学生信息
select * from student
where Sname ='周梅'
select * from student

定义列别名

当希望查询结果中的某些列在显示时使用自己选择的列标题时,可以在列名之后使用 AS 子句或者“=”来更改查询结果的列标题名。其中 column_alias 是指定的列别名。

格式

1、更改查询结果中的列标题使用 column_alias = expression 的形式
2、更改查询结果中的列标题使用 expressionas column_alias  的形式

代码示例

--查询成绩名,并将SID用‘学号’作别名,Score用‘成绩’作别名
use DB001
go
select SID as '学号','成绩'=Score
from SC

替换查询结果中的数据

要替换查询结果中的数据,则要使用查询中的 CASE 表达式,

格式为:

CASE  
    WHEN 条件 1 THEN 表达式 1   
    WHEN 条件 2 THEN 表达式 2   
    …  
    ELSE 表达式 
END

代码示例

 /*查询SC 表中各同学的学号成绩,并添加等级列 对其总学分按以下规则进行替换:若学分低于60,替换为“不及格”; 若学分在 60 与802之间,替换为“良好”; 若学分大于 80,替换为“优秀”*/
use DB001
go
select SID as '学号',Score as '成绩',等级=
 case 
	when score<60 then '不及格'
 	when score>=60 and score<80 then '良好'
        else '优秀'
 end
from sc
go

计算列值

使用 SELECT 对列进行查询时,在结果中可以输出对列值计算后的值,即 SELECT 子句可使用表达式作为结果,
格式为

 SELECT expression [ , expression ]

代码示例:

--将学生的成绩转为学分制,满分为2个学分,输出学号,成绩和学分
use DB001
go
select SID as '学号',score as '成绩',学分=score*0.02
from SC
go

消除结果集中的重复行

对表只选择其某些列时,可能会出现重复行。可以使用 DISTINCT 关键字消除结果集中的重复行,

格式是

SELECT DISTINCT | ALL column_name [ ,column_name…] 

关键字 DISTINCT 的含义是对结果集中的重复行只选择一个,保证行的唯一性

代码示例:

--查询成绩表中参加考试的学生学号(避免重复行)
use DB001
go
select distinct SID as '参加考试的学生学号'
from SC

限制结果集返回行数

如果 SELECT 语句返回的结果集的行数非常多,可以使用 TOP 选项限制其返回的行数。
TOP 选项的基本格式为

 [ TOP expression [ PERCENT ] [ WITH TIES ] ] 

指示只能从查询结果集返回指定的第一组行或指定的百分比数目的行。expression 可以是指定数目或百分比数目的行。若带 PERCENT 关键字,则表示返回结果集的前 expression% 行。TOP 子句可以用于SELECT、INSERT、UPDATE 和 DELETE 语句中。

代码示例:

--输出成绩表前5个学生的学号和成绩
use DB001
go
select top 5 SID as '学号',score as '成绩'
from SC

--输出成绩表前10%个学生的学号和成绩
use DB001
go
select top 10 percent SID as '学号',score as '成绩'
from SC

聚合函数

SELECT 子句中的表达式中还可以包含所谓的聚合函数。聚合函数常常用于对一组值进行计算,然后返回单个值。聚合函数通常与 GROUP BY 子句一起使用。如果一个 SELECT 语句中有一个 GROUP BY 子句,则这个聚合函数对所有列起作用;如果没有,则 SELECT 语句只产生一行作为结果

函数 操作
count 求组中项数,返回 int 类型整数
avg 求组中值的平均
max 求大值
min 求小值
sum 返回表达式中所有值的和
stdev 返回给定表达式中所有值的统计标准偏差
stdevp 返回给定表达式中所有值的填充统计标准偏差
var 返回给定表达式中所有值的统计方差
varp 返回给定表达式中所有值的填充的统计方差

补充:

(1)SUM 和 AVG SUM 和 AVG 分别用于求表达式中值项的总和与平均值,语法格式为: SUM | AVG ( [ALL | DISTINCT] expression) SUM 和 AVG 忽略 NULL 值。

(2)MAX 和 MIN MAX 和 MIN 分别用于求表达式中值项的大值与小值,语法格式为: MAX | MIN ( [ ALL | DISTINCT ] expression ) MAX 和 MIN 忽略 NULL 值。

(3)COUNT COUNT 用于统计组中满足条件的行数或总行数,格式为: COUNT ( { [ ALL | DISTINCT ] expression } | * )

(4) COUNT(*) 不需要任何参数,返回总行数,且不论是否包含 NULL 值。

代码实例:

--查询并输出学号为学生的总成绩,平均成绩,最高成绩和最低成绩和选课的数目
use DB001
go
select SID as '学号',sum(score) as '总成绩',avg(score) as '平均成绩',
max(score) as '最高成绩',min(score) as 最低成绩,count(CID) as '选课数目'
from SC
group by SID

where条件查询子句

在 SQL Server 中,选择行是通过在 SELECT 语句中 WHERE 子句指定选择的条件来实现的。下面详细讨论 WHERE 子句中查询条件的构成。WHERE 子句必须紧跟 FROM 子句之后,
基本格式

WHERE <search_condition> 
其中 search_condition 为查询条件。
<search_condition>::= 
  { [ NOT ] <precdicate> |
  (<search_condition> ) }  
  [ { AND | OR } [ NOT ]
  { <predicate> | (<search_condition>) } ]
 [ ,…n ] 

补充: 其中,为判定运算,结果为 TRUE、FALSE 或 UNKNOWN。NOT 表示对判定的结果取反,AND用于组合两个条件,两个条件都为 TRUE 时值才为 TRUE。OR 也用于组合两个条件,两个条件有一个条件为 TRUE 时值就为 TRUE。

<predicate>::=
{    
  xpression { = | < | <= | > |>= | <> | != | !< | !> } expression   /*比较运算*/   
  | match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]    /*字符串模式匹配*/   
  | expression [ NOT ] BETWEEN expression AND expression  /*指定范围*/   
  | expression IS [ NOT ] NULL                         /*是否空值判断*/   
  | expression [ NOT ] IN ( subquery |expression [,…n] )      /*IN 子句*/   
  | expression { = | < | <= | > |>= | <> | != | !< | !> } { ALL | SOME | ANY } ( subquery)   /*比较子查询*/   
  | EXIST ( subquery )                                 /*EXIST 子查询*/ 
}

补充:

表达式比较
比较运算符用于比较两个表达式值,共有 9 个,分别是:=(等于)、<(小于)、<=(小 于等于) 、>(大于) 、>=(大于等于) 、<>(不等于)、!=(不等于) 、!<(不小于)、!>(不大于)。
比较运算的格式为

 expression { = | < | <= | > | >= | <> | != | !<| !> } 

expression 其中 expression 是除 text、ntext 和 image 外类型的表达式。当两个表达式值均不为空值(NULL)时,比较运算返回逻辑值 TRUE(真)或 FALSE(假)。而当两个表达式值中有一个为空值或都为空值时,比较运算将返回 UNKNOWN
代码示例:

--查询学号为05的学生课程号和成绩
use DB001
go
select SID as '学号',CID as '课程号',Score as '成绩'
from SC 
where SID='05'

--查询课程03且成绩不低于85分的学生学号,课程号和成绩
use DB001
go
select SID as '学号',CID as '课程号',Score as '成绩'
from SC 
where CID='02' and score>=85

模式匹配 LIKE

用于指出一个字符串是否与指定的字符串相匹配,其运算对象可以是 char、 varchar、text、ntext、datetime 和 smalldatetime 类型的数据,返回逻辑值 TRUE 或 FALSE。
LIKE 谓词表达式的格式为
match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]
说明:
match_expression:匹配表达式,一般为字符串表达式,在查询语句中可以是列名。
pattern:在match_expression 中的搜索模式串。在搜索模式串中可以使用通配符,表列出了 LIKE 谓词可以使用的通配符及其说明。

通配符列表 通 配 符 说 明
% 代表 0 个或多个字符
_(下画线) 代表单个字符
[ ] 指定范围(如[a-f]、[0-9])或集合(如[abcdef])中的任何单个字符
[^] 指定不属于范围(如 [a-f]、[0-9])或集合(如[^abcdef])的任何单个字符

escape_character:转义字符,应为有效的SQL Server 字符,escape_character 没有默认值,且必须为单个字符。当模式串中含有与通配符相同的字符时,此时应通过该字符前的转义字符指明其为模式串中的一个匹配字符。使用关键字 ESCAPE 可指定
转义符。
NOT LIKE:使用 NOT LIKE 与 LIKE 的作用相反。 使用带%通配符的 LIKE 时,若使用 LIKE 进行字符串比较,模式字符串中的所有字符 都有意义,包括起始或尾随空格。

代码示例

--查询Student表中,Sname姓王的同学所有信息
use DB001
go
select * 
from Student
where sname like '王%'

--查询Score个位是9的同学所有信息
use DB001
go
select * 
from SC
where score like '_9'

**`范围比较`**

用于范围比较的关键字有两个:BETWEEN 和 IN。当要查询的条件是某个值的范围时, 可以使用 BETWEEN 关键字。BETWEEN 关键字指出查询范围,
格式为

 expression [ NOT ] BETWEEN expression1 AND expression2 

当不使用 NOT 时,若表达式 expression 的值在表达式 expression1 与 expression2 之间(包 括这两个值),则返回 TRUE,否则返回 FALSE;使用 NOT 时,返回值刚好相反。
注意:expression1 的值不能大于 expression2 的值。

使用 IN 关键字可以指定一个值表,值表中列出所有可能的值,当与值表中的任一个匹
配时,即返回 TRUE,否则返回 FALSE。

使用 IN 关键字指定值表的格式为

expression IN ( expression [,…n])

代码示例

--查询Score不在70-100之间同学所有信息
use DB001
go
select *
from SC
where score not between 70 and 100

--查询课程号为02或03同学所有信息
select * from SC 
where CID in ('02','03')

空值比较**
当需要判定一个表达式的值是否为空值时,使用 IS NULL 关键字,
格式为
expression IS [ NOT ] NULL
当不使用 NOT 时,若表达式 expression 的值为空值,返回 TRUE,否则返回 FALSE; 当使用 NOT 时,结果刚好相反。

子查询

在查询条件中,可以使用另一个查询的结果作为条件的一部分。例如判定列值是否与某个查询的结果集中的值相等。作为查询条件一部分的查询称为子查询。

T-SQL 允许SELECT多层嵌套使用,用来表示复杂的查询。子查询除了可以用在SELECT 语句中,还可以用在 INSERT、UPDATE 及 DELETE 语句中。子查询通常与 IN、EXIST 谓词及比较运算符结合使用。

IN 子查询
IN 子查询用于进行一个给定值是否在子查询结果集中的判断,
格式为
expression [ NOT ] IN ( subquery )
其中 subquery 是子查询。当表达式 expression 与子查询 subquery 的结果表中的某个值相 等时,IN 谓词返回 TRUE,否则返回 FALSE;若使用了 NOT,则返回的值刚好相反。

注意:IN 和 NOT IN 子查询只能返回一列数据。对于复杂的查询,可以使用嵌套子查询。

代码示例:

--查询选修数学的数学和语文学生的学号和成绩
select SID as '学号',课程=
case 
 when CID='02' then '语文'
 when CID='01' then '数学'
end,
Score as '成绩'
from SC 
where CID in (select CID from Course where Cname='语文' or Cname='数学')

比较子查询

这种子查询可以认为是 IN 子查询的扩展,它使表达式的值与子查询的结果进行比较运算,
格式为

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

其中 expression为要进行比较的表达式,subquery 是子查询。ALL、SOME 和 ANY 说明对比较运算的限制。

ALL 指定表达式要与子查询结果集中的每个值都进行比较,当表达式与每个值都满足比较的关系时,才返回 TRUE,否则返回 FALSE。

SOME 或 ANY 表示表达式只要与子查询结果集中的某个值满足比较的关系时,就返回 TRUE,否则返回 FALSE。

代码示例

--查询数学成绩大于01号同学数学成绩的学号和成绩
select SID as '学号',Score as '成绩'
from SC
where score>(select score from SC where SID='01' and CID='01')

--查询数学成绩小于于01号同学数学所有成绩的学号和成绩
select SID as '学号',Score as '成绩'
from SC
where score<all(select score from SC where SID='01' )

--查询数学成绩小于于01号同学数学最低成绩的学号和成绩
select SID as '学号',Score as '成绩'
from SC
where score!<any(select score from SC where SID='01' )

EXISTS 子查询
EXISTS 谓词用于测试子查询的结果是否为空表,若子查询的结果集不为空,则 EXISTS 返回 TRUE,否则返回 FALSE。EXISTS 还可与 NOT 结合使用,即 NOT EXISTS,其返回值与 EXISTS 刚好相反。
其格式为

NOT ] EXISTS ( subquery )

代码示例;

--查找02号同学选修03号课程的成绩
select Sname
from Student
where exists 
(select * from SC where SID='02'and CID='03')

子查询还可以用在 SELECT 语句其它子句中,如 FROM 子句;SELECT 关键字 后面也可以定义子查询,但其结果集应唯一

FROM 子句

SELECT 的查询对象由 FROM 子句指定,
其格式为

[ FROM {<table_source>} [,…n] ]

其中 table_source 指出了要查询的表或视图。

<table_source> ::=  {   
table_or_view_name [ [ AS ] table_alias]   /*查询表或视图,可指定别名*/ 
| OPENXML <openxml_clause>    /*XML 文档*/   
| derived_table [ AS ] table_alias [ (column_alias [ ,...n ] ) ]  /*子查询*/   
| <joined_table>     /*连接表*/   
| <pivoted_table>     /*将行转换为列*/   
| <unpivoted_table>     /*将列转换为行*/ } 
  1. table_or_view_name
    table_or_view_name 指定SELECT语句要查询的表或视图,表和视图可以是一个或多个
    说明:可以使用 AS 选项为表指定别名,AS 关键字也可以省略。别名主要用在相关子
    查询及连接子查询中。如果 FROM 子句中指定了表的别名,这条 SELECT 语句中的其他子句都必须使用别名来代替原始的表名。

代码示例

--查询学生的学号,姓名,年纪和选择课程号和成绩
use DB001
go
select S.SID as '学号',姓名=Sname,sage as '年龄',CID as '课程号',Score as '成绩'
from Student as S,SC
where S.SID=SC.SID 
  1. derived_table
    derived_table 子查询可以用在 FROM 子句中,表示由子查询中 SELECT 语句的执行而返回的表,但必须使用 AS 关键字为子查询产生的中间表定义一个别名。

代码示例:

--从查询学生的学号,姓名,年纪和选择课程号和成绩组成的新表中查询成绩大于60的学生,课程和成绩
select 姓名, 课程号,成绩
from (select S.SID as '学号',姓名=Sname,sage as '年龄',CID as '课程号',Score as '成绩'
from Student as S,SC
where S.SID=SC.SID) as StuInfo
where 成绩>60

--从查询学生的学号,姓名,年纪和选择课程号和成绩组成的新表中查询成绩大于60的学生,课程和成绩
select 姓名, 课程号,成绩
from (select S.SID,Sname,sage,CID ,Score 
from Student as S,SC
where S.SID=SC.SID) as StuInfo(学号,姓名,年龄,课程号,成绩)
where 成绩>60
  1. 外连接
    指定了 INNER 关键字的连接是内连接,内连接按照 ON 所指定的连接条件合并两个表, 返回满足条件的行。
    代码示例:

    –查询每个老师及其所教的课程
    select T.TID as ‘教师编号’,Tname as ‘教师姓名’,Cname as ‘课程名’
    from Teacher as T inner join Course as C
    on T.TID=C.TID

说明:INNER:指定返回所有匹配的行对。放弃两个表中不匹配的行。如果未指定任何联 接类型,此设置为默认设置。

  1. 外连接

指定了 OUTER 关键字的连接为外连接,外连接的结果表不但包含满足连接条件的行,还包括相应表中的所有行。外连接包括三种:
左外连接(LEFT OUTER JOIN):结果表中除了包括满足连接条件的行外,还包括左表的所有行;
右外连接(RIGHT OUTER JOIN):结果表中除了包括满足连接条件的行外,还包括右表的所有行;
完全外连接(FULL OUTER JOIN):结果表中除了包括满足连接条件的行外,还包括两个表的所有行。
其中的 OUTER 关键字均可省略

代码示例

--查询学生信息及相关成绩信息
select * 
from Student as S join SC 
on S.SID=SC.SID

select * 
from Student as S left join SC 
on S.SID=SC.SID

select * 
from Student as S right join SC 
on S.SID=SC.SID

select * 
from Student as S full join SC 
on S.SID=SC.SID

说明:
FULL [ OUTER ]:指定在结果集中包括左表或右表中不满足联接条件的行,并将对 应于另一个表的输出列设为 NULL。这是对通常由 INNER JOIN 返回的所有行的补 充。

LEFT [ OUTER]:指定在结果集中包括左表中所有不满足联接条件的行,并在由内 部联接返回所有的行之外,将另外一个表的输出列设为 NULL。

RIGHT [OUTER]:指定在结果集中包括右表中所有不满足联接条件的行,且在由内 部联接返回的所有行之外,将与另外一个表对应的输出列设为NULL。

  1. 交叉连接
    交叉连接实际上是将两个表进行笛卡尔积运算,结果表是由第一个表的每行与第二个表的每一行拼接后形成的表,因此结果表的行数等于两个表行数之积。

代码示例

select * 
from Student as S cross join SC 

GROUP 子句

GROUP BY 子句主要用于根据字段对行分组
语法

[ GROUP BY [ ALL ] group_by_expression [,…n] 

说明:常见的是按照某列进行分组或者相关的表达。group by和聚合函数的使用比较常见

代码示例

--统计每门课选课的人数
select Cname as '课程名',count(SID) as '选课人数',avg(score) as '课程平均分'
from Course as C join SC
on C.CID=SC.CID
group by Cname

HAVING 子句

使用 GROUP BY 子句和聚合函数对数据进行分组后,还可以使用 HAVING 子句对分组结果进行进一步的筛选。
语法格式如下

[ HAVING<search_condition> ]  

其中,search_condition 为查询条件,与 WHERE子句的查询条件类似,不过 HAVING 子句中可以使用聚合函数,而 WHERE 子句中不可以

代码示例

--统计每门课选课的人数
select Cname as '课程名',count(SID) as '选课人数',avg(score) as '课程平均分',sum(score) as '总分'
from Course as C join SC
on C.CID=SC.CID
group by Cname
having sum(score)>=400

ORDER BY 子句

在应用中经常要对查询的结果排序输出,例如学生成绩由高到低排序。在 SELECT 语句中,使用 ORDER BY 子句对查询结果进行排序。

ORDER BY 子句的格式为

 [ ORDER BY  {   order_by_expression    [ COLLATE collation_name ]    [ ASC | DESC ]  

注意空值被视为低的可能值

参数说明:
order_by_expression:指定要排序的列。可以将排序列指定为一个名称或列别名,也可以指定一个表示该名称或别名在选择列表中所处位置的非负整数。列名和别名可由表名或视图名加以限定。在 Microsoft SQL Server 中,可将限定的列名和别名 解析到 FROM 子句中列出的列。如果 order_by_expression未限定,则它必须在SELECT 语句中列出的所有列中是唯一的。 可指定多个排序列。ORDER BY子句中的排序列序列定义了排序结果集的结。ORDER BY子句可包括未显示在选择列表中的项。但是,如果未指定 SELECT DISTINCT,或者如果 SELECT 语句包含 UNION运算符,则排序列必须显示在选 择列表中。 此外,当 SELECT 语句包含 UNION 运算符时,列名或列的别名必须是在第一选择列表内指定的列名或列的别名。

COLLATE {collation_name}:指定根据 collation_name中指定的排序规则,而不是表 或视图中所定义的列的排序规则,应执行的 ORDER BY 操作。collation_name 可以 是Windows 排序规则名称或 SQL 排序规则名称。

ASC:指定按升序,从低值到高值对指定列中的值进行排序。

DESC:指定按降序,从高值到低值对指定列中的值进行排序。

代码示例

--查询成绩并按照降序排列
select * from SC
order by score desc

补充:--统计每门课选课的人数,平均成绩,总成绩并输入一张新表中
select Cname as '课程名',count(SID) as '选课人数',avg(score) as '课程平均分',sum(score) as '总分'
into New_Course
from Course as C join SC
on C.CID=SC.CID
group by Cname
having sum(score)>=400

总结:

数据库的查询是学习数据库操作的重要环节。对于数据库的查询,要熟练的理解数据的查询结构,针对实际问题要巧妙的利用条件查询和子查询,优化查询的速度。对于数据库的执行顺序,可以借助下图理解。
在这里插入图片描述

发布了62 篇原创文章 · 获赞 42 · 访问量 3335

猜你喜欢

转载自blog.csdn.net/weixin_45375866/article/details/99996301
今日推荐