SQL语言从入门到精通
上QQ阅读APP看书,第一时间看更新

2.1 简单查询

本节将介绍SELECT语句的基本结构,并使用SELECT语句完成比较简单的查询命令,使读者对SELECT语句有一个简单的了解。

2.1.1 SELECT语句基本结构

SELECT语句是在SQL中常用到的语句,也是比较重要的语句。使用SELECT语句可以从数据表中或视图中进行查询,并将查询结果以表格的形式返回,以表格返回的结果也可以称为结果集。SELECT语句的主要结构如下:

     SELECT select_list
     [ INTO new_table ]
     FROM table_source
     [ WHERE search_condition ]
     [ GROUP BY group_by_expression ]
     [ HAVING search_condition ]
     [ ORDER BY order_expression [ASC| DESC ]]

参数说明如下。

 select_list:指定需要查询返回的列。多个列之间使用逗号分隔。在选择列时也可以使用“*”符号来表示返回表中的所有列。

 INTO new_table:创建新表并将查询行插入新表中。new_table指定新表的名称。

 FROM table_source:指定需要查询的表。这些来源表可能包括基表、视图和连接表。FROM子句还可以包含连接说明,该说明定义了SQL Server在表之间进行导航的特定路径。

 WHERE search_condition:指定用于限制返回的行的搜索条件。

 GROUP BY group_by_expression:根据group_by_expression列中的值将结果集分成组。例如,student表在“性别”中有两个值,GROUP BY ShipVia子句将结果集分成两组,每组对应于ShipVia的一个值。

 HAVING search_condition:指定组或聚合的搜索条件。逻辑上讲,HAVING子句从中间结果集对行进行筛选,这些中间结果集是用SELECT语句中的FROM、WHERE或GROUP BY子句创建的。HAVING子句通常与GROUP BY子句一起使用,尽管HAVING子句前面不必有GROUP BY子句。

 ORDER BY order_expression[ ASC | DESC ]:定义结果集中的行排列的顺序。order_ expression指定组成排序列表的结果集的列。ASC和DESC关键字用于指定行是按升序还是按降序排序。ORDER BY之所以重要,是因为关系理论规定除非已经指定ORDER BY,否则不能假设结果集中的行带有任何序列。如果结果集行的顺序对于SELECT语句来说很重要,那么在该语句中就必须使用ORDER BY子句。

2.1.2 单列查询

SELECT语句可以对表或视图中某一列的数据进行查询。其语法格式如下:

     SELECT select_list FROM table_source

 select_list:需要查询的列名。

 table_source:需要查询的表名。

【例2.1】 查询单列数据。(实例位置:资源包\TM\sl\2\1)

在tb_commodity02数据表中,使用SELECT语句对“商品名称”列进行查询。SQL语句如下:

     SELECT 商品名称 FROM tb_commodity02

运行结果如图2.1所示。

图2.1 查询单列数据

注意

在SQL中,SQL关键字的大小写是不敏感的,因此使用Select、SELECT或select都会得到一样的查询效果,而不会报错。

2.1.3 多列查询

使用SELECT语句进行多列查询时,只需要列出多个列名,列名之间使用逗号分隔。在查询结果中列的顺序,将以在SELECT语句中指定列名的先后顺序显示。查询多个列的语法格式如下:

     SELECT select_list,…,select_list FROM table_source

 select_list:需要查询的多列列名。

 table_source:需要查询的表名。

【例2.2】 查询多列数据。(实例位置:资源包\TM\sl\2\2)

在tb_commodity02数据表中,使用SELECT语句对“编号”列、“商品名称”列和“商品价格”列进行查询。SQL语句如下:

     SELECT 编号,商品名称,商品价格 FROM tb_commodity02

运行结果如图2.2所示。

图2.2 查询多列数据

2.1.4 查询所有的列

查询数据表时,有时需要对表中所有的列进行查询。如果表中的列过多,在SELECT语句中指定所有的列会十分麻烦,这时可以使用“*”符号来代替所有的列。查询所有列的语法格式如下:

     SELECT * FROM table_source

 “*”:表示所有的列。

 table_source:需要查询的表名。

【例2.3】 查询所有列数据。(实例位置:资源包\TM\sl\2\3)

在tb_commodity02数据表中,使用SELECT语句对所有的列进行查询。SQL语句如下:

     SELECT * FROM tb_commodity02

运行结果如图2.3所示。

图2.3 查询所有列数据

2.1.5 别名的应用

创建数据表时,一般会使用英文单词或英文单词缩写来设置字段名。但在查询时,列名如果以英文的形式显示,会给用户查看数据带来不便,这种情况可以使用别名来代替英文列名,增强阅读性。创建别名可以通过使用以下4种方法来实现。

 使用双引号创建别名。例如:

     SELECT name "姓名" FROM tb_student

 使用单引号创建别名。例如:

     SELECT name '姓名' FROM tb_student

 不使用引号创建别名。例如:

     SELECT name 姓名 FROM tb_student

 使用AS关键字创建别名。例如:

     SELECT name AS "姓名" FROM tb_student

通过以上4种方法,已经了解了如何创建别名。下面介绍给列使用别名的4种常用情况。

1.当字段为英文时

使用别名来代替英文列名,可以增强表的阅读性。

【例2.4】 在tb_studentScore数据表中,使用SELECT语句对“ID”列和“Name”列设置别名,以方便查看。(实例位置:资源包\TM\sl\2\4)

SQL语句如下:

     SELECT ID AS"编号",Name AS "姓名",ChineseScore,
     MathScore,EnglishScore
     FROM tb_studentScore

运行结果如图2.4所示。

2.对多个表查询时出现相同的列名

当对多个表进行查询时,有可能会出现相同的列名,这时就可以使用别名来区分列名是属于哪个表的。

【例2.5】 对tb_studentScore数据表和tb_studentInfo03数据表中的信息进行查询,使用SELECT语句对两个表中列名相同的“ID”列设置别名,以方便查看。(实例位置:资源包\TM\sl\2\5)

SQL语句如下:

     SELECT tb_studentScore.ID AS "成绩表中的编号",
     tb_studentInfo03.ID AS "信息表中的编号",tb_studentScore.Name
     FROM tb_studentScore,tb_studentInfo03
     WHERE tb_studentInfo03.ID=tb_studentScore.ID

运行结果如图2.5所示。

图2.4 设置列别名

图2.5 多表查询中设置列别名

3.统计结果出现的列

在表中可以对多个列进行计算,计算后会产生一个新的列。这时可以使用别名给该列设置列名,如不设置该列列名,则默认列名为“(无列名)”。

【例2.6】 在tb_studentScore数据表中,使用SELECT语句对统计结果中出现的列设置别名。(实例位置:资源包\TM\sl\2\6)

SQL语句如下:

     SELECT ID,Name,ChineseScore,MathScore,EnglishScore,
     (ChineseScore+MathScore+EnglishScore) AS "三科成绩总分数"
     FROM tb_studentScore

运行结果如图2.6所示。

图2.6 在统计结果出现的列中设置列别名

4.使用聚合函数添加的列

有时会使用聚合函数对数据进行查询,查询后会产生一个新的列。此时可以使用别名来设置该列的列名,如不设置该列列名,则默认列名为“(无列名)”。

【例2.7】 在tb_studentScore数据表中,使用SELECT语句对使用聚合函数出现的列设置别名。(实例位置:资源包\TM\sl\2\7)

SQL语句如下:

     SELECT sum(ChineseScore) AS "全班语文成绩总分" ,
     AVG(ChineseScore) AS "全班语文成绩平均分"
     FROM tb_studentScore

运行结果如图2.7所示。

图2.7 设置列别名

2.1.6 使用TOP查询前若干行

在SELECT子句中使用通配符“*”,可以查询数据表中所有列和所有行的数据。但是,“*”符号在有些时候会造成较大的浪费。例如,在一张数据表中存在多达10万行的数据,用户只想查询前1万行的数据,使用“*”符号会浪费掉查询9万行数据的时间。这个问题可以使用TOP关键字来解决。

TOP关键字可以返回表中的前n行数据或前百分之n的数据。TOP关键字的语法如下:

     SELECT TOP n [PERCENT]
     FROM table
     WHERE …
     ORDER BY…

参数说明如下。

 TOP n:指定从查询结果集中输出前n行。n是0~4 294 967 295的整数。

 [PERCENT]:如果指定了PERCENT,则只从结果集中输出前百分之n的数据。指定PERCENT时,n必须是0~100的整数

 ORDER BY:如果SELECT语句中没有ORDER BY子句,TOP n返回所有数据或满足WHERE子句数据的前n条记录。如果包含ORDER BY子句,将输出由ORDER BY子句排序后的前n行(或前百分之n)数据。关键字DESC表示查询结果按降序排列,关键字ASC表示查询结果按升序排列。默认情况下,系统将查询结果按升序排列,因此关键字ASC可省略。

1.查询前n行数据

【例2.8】 在tb_studentScore数据表中,使用SELECT语句和TOP关键字查询出前2行学生的记录。(实例位置:资源包\TM\sl\2\8)

SQL语句如下:

     SELECT * FROM tb_studentScore
     SELECT TOP 2  * FROM tb_studentScore

运行结果如图2.8所示。

图2.8 查询前2行数据

2.查询前百分之n的数据

使用TOP关键字对表中数据查询时,有可能出现一种情况。例如,想要查询表中一半的数据而又忘记表中一共有多少数据,这时就可以在TOP关键字后指定PERCENT关键字,以百分数指定显示数据的个数。

【例2.9】 在tb_studentScore数据表中,使用SELECT语句和TOP关键字查询前60%的数据。(实例位置:资源包\TM\sl\2\9)

SQL语句如下:

     SELECT * FROM tb_studentScore
     SELECT TOP 60 percent * FROM tb_studentScore

运行结果如图2.9所示。

图2.9 查询前60%的数据

3.查询后n行数据

查询后n行数据,实际上是将数据表中编号列的数据以降序的方式重新排列,排列后再使用TOP关键字将表中的前n行数据查询出来。需要注意的是,在使用降序排列前,表中必须有作为编号显示的列。

【例2.10】 在tb_studentScore数据表中,使用SELECT语句和TOP关键字来查询后3行学生的记录。(实例位置:资源包\TM\sl\2\10)

SQL语句如下:

     SELECT * FROM tb_studentScore
     SELECT TOP 3 * FROM tb_studentScore ORDER BY ID DESC

运行结果如图2.10所示。

图2.10 查询后3行数据

2.1.7 删除重复列

在有些情况下,数据表中会出现重复的数据。例如,在表中有两个列,第1列用于存储省份的名称,第2列用于存储省份下的市名称,由于省份下有很多市,就会输入很多重复的省份。如果使用SELECT查询出各省份的名称,其中大部分省份的名称都会是重复的。解决这个问题就可以使用DISTINCT关键字。

DISTINCT关键字可从SELECT语句的结果中除去重复的行。如果没有指定DISTINCT关键字,那么将返回所有行,包括重复的行。在使用DISTINCT关键字去除重复记录时,需将DISTINCT关键字放在第1个字段名的前边。

DISTINCT的语法格式如下:

     SELECT [DISTINCT︱ALL]select_list FROM table_source

使用DISTINCT关键字的说明如下。

 在SELECT列表中只能使用一次DISTINCT关键字。DISTINCT关键字必须放在第一位,不要在其后添加逗号。例如,执行如图2.11所示的语句将提示出错信息。

图2.11 DISTINCT关键字必须放在第一位

 如果省略DISTINCT关键字,查询结果中不会去除重复的记录。也可以指定ALL关键字来明确指示要保留重复记录,但这是不必要的,因为保留重复记录是默认的行为。

 DISTINCT关键字并不是指某一行,而是指不重复SELECT输出的所有行。这一点十分重要,其作用是防止相同的行出现在一个查询结果的输出中。

 DISTINCT是SUM、AVG和COUNT函数的可选关键字。如果使用DISTINCT关键字,那么在计算总和、平均值或计数之前,会先去除重复的值。

在个人信息表中列出了个人的详细信息。如果想要查询出该表中职业的种类,需要使用DISTINCT关键字,使用此关键字可以去除重复的职业,就可以查询出职业的种类。

【例2.11】 在tb_individualInfo数据表中,使用SELECT语句和DISTINCT关键字查询职业的种类。(实例位置:资源包\TM\sl\2\11)

SQL语句如下:

     SELECT * FROM tb_individualInfo
     SELECT DISTINCT 职业  FROM tb_individualInfo

运行结果如图2.12所示。

图2.12 查询职业种类