SQL server 2012之数据查询(1)— 单表查询

数据查询是数据库的核心操作,在数据库应用中,select语句提供了丰富的查询能力,可以查询一个表或多个表;对查询列进行筛选、计算;对查询进行分组、排序;甚至可以在一个select语句中嵌套另一个select语句,语法格式如下:

SELECT [ALL|DISTINCT] <目标列表达式>[,<目标列表达式>]FROM <表名或视图名>[,<表名或视图名> ]|(SELECT 语句)      
[AS]<别名>
[ WHERE <条件表达式> ]
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
[ ORDER BY <列名2> [ ASC|DESC ] ];
  • select 子句:指定要显示的属性列
  • from 子句:指定查询对象(基本表或视图)
  • where 子句:指定查询条件
  • group by 子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中作用聚集函数
  • having 子句:只有满足指定条件的组才予以输出
  • order by 子句:对查询结果表按指定列值的升序或降序排序

1、单表查询

1.1、选择表中的若干列

  1. 查询指定列:
	select column_name [,column_name...] 
	from table_name   

例1、 在student表中查询全体学生的姓名、学号、所在院系:

select sname,sno,sdept
from student

注意:在指定列查询中,列的显示顺序有select子句指定,与数据在表中的存储顺序无关;同时,在查询多列时,用“,”将各个字段隔开。

  1. 查询全部列:
select * from <表名>

注:使用“ * ”通配符时要慎重,在不需要查询所有列时,尽量采用前面介绍的指定列查询,以免占用过多的资源。

  1. 修改查询结果中的列标题
  • 方法一:
select column_name as new_name[,...n]
from table_name
  • 方法二:
select column_name new_name[,...n]
from table_name
  • 方法三:
select  new_name = column_name[,...n]
from table_name

例2、 查询数据表student中所有学生的学号sno及年龄sage,结果中各列的标题分别指定为学号、年龄:

select sno as 学号,sage as 年龄
from student
或者
select sno 学号,sage 年龄
from student
或者
student 学号 = sno,年龄 = sage
from student

注意:当自定义的标题中含有空格时,必须用单引号将标题括起来。

  1. 替换查询结果中的数据:
case
	when 条件1 then 表达式1
	when 条件2 then 表达式2
	...
	else 表达式
end

例3、 查询数据表SC的学生的学号、课程号及成绩,对于成绩按以下规定显示:成绩在60分以下显示为不及格;60-79之间显示为良好;80以上显示为优秀。

select sno,cno,grade=
		       case
				when grade<60  then  ‘不及格’
				when grade>=60 and grade<=79  then ‘良好’
				when grade>=80  then ‘优秀’
		       end
     from sc
  1. 查询经过计算的值
    使用select对列进行查询时,不仅可以直接以列的原始值作为结果,也可以对列值进行计算后所得的值作为查询结果;
    计算列值可使用的算术运算符有+ - * /和% ;
    要查询经过计算的列,在select之后的目标列的格式为:SELECT <目标列表达式>

例4、 在student表中查询全体学生的姓名、出生年份和所在的院系,要求用小写字母表示系名。

select sname,year(getdata())-sage,lower(sdept)
from student

1.2、选择表中的若干元组

  1. 消除结果集中的重复行:
    两个本来并不完全相同的元组在投影到指定的某个列上后,可能会变成相同的行。可以用distinct消除多余的。
select distinct column_name [,column_name...]
from <表名>

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

  1. 限制结果集的返回行数:
select top n [percent] column_name[,column_name]
from <表名>

注:n 是一个正整数,表示返回查询结果集的前n行。若带percent关键字,则表示返回结果集的前n%行。

例5、 显示student表中的学生前5条记录,并显示其学号、姓名

select top 5 sno,sname
from student
  1. 查询满足条件的元组
    查询满足条件的行可以通过WHERE子句实现。WHERE字句指定一系列搜索条件,只有满足条件的行才用来构造结果集。
select column_name from <表名>
where 条件

常见的查询条件

查询条件 谓词
比较 =, >, <, >=, <=, !=, <>, !>, !<, not+上述比较运算符
确定范围 between and, not between and
确定集合 in, not in
字符匹配 like, not like
空值 is null, not is null
多重条件(逻辑运算) and, or, not
  • 比较大小

例6、 查询sc表考试成绩有不及格的学生的学号

select distinct sno
from sc
where grade < 60
  • 确定范围
    用于范围比较的关键字有两个:between and 和not between and;使用between and 表达式进行查询的效果类似于使用(<=和>=)来代替。

例7、 查询年龄不在20~30岁之间的学生姓名、系别和年龄

select sname, sdept, sage
from student
where sage not between 20 and 30;
  • 确定集合
    用到关键字IN和NOT IN;IN是确定给的值是否与子查询或列表中的值相匹配;使用IN关键字可以指定一个值表集合,值表中列出所有可能的值,当表达式与值表中任意一个匹配时,即返回ture ,否则返回false。

例8、 在student查询既不是计算机学科系、数学系,也不是信息系的学生的姓名和性别。

select sname,ssex
from student
where sdept not in ('IS', 'MA','CS')

例9、 在student表中查询院系为CS或者为IS的男学生的记录

select * from student 
where sdept in ('CS','IS') and ssex = '男'
或者
select * from student 
where sdept = 'CS' or sdept = 'IS' or ssex = '男'
  • 字符匹配
    like用于进行字符串的匹配,like含义是查找指定列值与匹配串相匹配的行。like使用通配符的查询也称为模糊查询
通配符 含义
_下划线 任何单个字符:(如a_c表示以a开头c结尾,长度为3的字符串)
%百分号 包含0个或多个字符的任意字符串:(如a%c表示以a开头c结尾,长度为任意长度的字符串)
[ ] 指定范围:(如[ a-f ]或者[ abcdef ]表示a-f内的任意单个字符)
[ ^ ] 不在指定范围:(如[ ^abcdef] 表示不在abcdef内的任意单个字符)

上表事例:

like ‘王%’ 搜索以“王”开头的所有字符串。如“王三”,“王大千”等
like ‘%三’ 搜索以“三”结尾的所有字符串。如“王三”,“王二三”等
like ‘%三%’ 搜索任何位置包含“三”的所有字符串。如“王三”,“王三千”等
like ‘_abc’ 搜索以“abc”结尾的4个字母的信息
like ‘[a-f]st’ 搜索以“st”结尾、以a~f的任意一个字母开头的信息
like 'm [ ^ab]% 搜索以“m”开头,并且第二个字母不是a,b的信息

例10、 在student表中查询学号为201215121学生的详细情况

select * from student 
where sno like '201215121'
等价于:
select * from student 
where sno = '201215121'

注:如果like后面的匹配串中不含通配符,则可以用=(等于)运算符取代like谓词,用!=或者<>(不等于)运算符取代not like谓词。

例11、 在student表中查询姓“欧阳”且全名为三个汉字的学生的姓名。

select sname from student
where sname like '欧阳_'

escape定义转义符:
在使用LIKE进行模糊查询时,当“%”、“_”和“[]”符号单独出现时,都会被作为通配符进行处理。但有时可能需要搜索的字符串包含一个或多个特殊通配符。若要搜索作为字符而不是通配符的百分号,必须提供ESCAPE关键字和转义符。

如:like ‘%b%’ escape ‘b’,‘b’就作为了转义字符,用来将第二个%转为普通。
例12、 查询以“DB_”开头,且倒数第3个字符为i的课程的详细情况。

select * from course 
where cname like 'DB\_%i__' escape '\'
  • 涉及空值的查询
    当需要判定一个表达式的值是否为空值时,使用 IS NULL 关键字。

例13、 在sc表中某些学生选修课程后面没有参加考试,所以有选课记录,但没有考试成绩。查询缺少成绩的学生的学号和相应的课程号。

select sno,cno from sc
where grade is null
  • 多重条件查询
    逻辑运算符:and 和 or 来连接多个查询条件:and 的优先级高于or,可以用括号改变优先级。

例14、 在student表中查询计算机系统在20岁以下的学生姓名

select sname from student
where sdept = 'CS' and sage < 20

练习:

  1. 查找学号以2002开头的所有学生记录;
  2. 查找学号中第5个字符为5的所有学生记录;
  3. 查找学号中第5个字符不是5的所有学生记录。
  4. 显示学号最后一位为1或者2或者3的学生的学号、姓名、性别年龄及院系;
1.
select * from student
where sno  like2002%2.
select * from student
where sno like ‘____5%3.
select * from student
where sno like ‘____[^5]%4.
select sno,sname,ssex,sdept from student
where sno like '%[1,2,3]'

猜你喜欢

转载自blog.csdn.net/ITrumenshaonian/article/details/89425145