4.1Select语句的语法
数据查询是数据库管理系统找那个一个最重要的功能。数据查询不是简单地返回数据库中存储的数据,而是根据用户的不同需求对数据进行筛选、统计,并且以用户需要的格式返回结果。
SQL Server提供了强大、灵活的Select语句,用于实现用户的各种数据查询操作。
Select语句语法结构
select <检索内容> [As<别名>] [Into<目标表名>] from <源表名> [where<检索条件>] [group by<分类字段> [having<检索条件>]] [order by <排序字段> [Asc|Desc]]
Select:指定要查询的数据列。
Into:创建新表并将查询的结果存到新表中。
From:指定查询的数据源,可以是表,也可以是视图。
Where:指定查询条件。
Group by:对查询结果分组。
Having:与Group by 字句组合使用,指定分组筛选条件。
Order by:对查询结果排序,默认为升序(ASC),降序(Desc)
每个select语句必须有一个from字句,其他字句的顺序非常重要,依次是where,group by,having,order by。可以省略可选字句,但若使用必须按适当的顺序出现。
selectbu不区分大小写,可以随意分行,没有语句结束标志。
4.2数据库的简单查询
单表查询是指要检索的信息来自数据库中的某一张数据表,是最简单的一种查询操作。
1.查询所有列
最简单的Select语句是查询表中的所有数据,只需要Select和From两关键字即可。
要把表中所有的列及列数据展示出来,可以使用符号“*”,它表示所有列。
Select * from <表名> #输出表中所有列及列数据
实例1:在SCC数据库中,查询student表中所有学生的详细信息
use scc #将数据库切换为scc数据库 select * from student
2.查询表中的指定列
如果用户只需要获取部分列的数据,只需要将select语句中的*换成字段的字段列表即可。
若将表中所有的列都放在这个列表中,将查询整张表的数据。
select <字段列表> from <表名> #输出表中指定列及列数据。
实例2:查询student表中所有学生的学号和姓名
select Sno,Sname from student
3.为结果列使用别名
查询结果中默认输出列的列标题就是表的列名。
如果用户觉得该列名不能表达清楚,可对列名设置别名。
设置别名只是设置显示查询结果时的列名,而表中的列名并未改变。
实例3:查询student表中所有学生的学号和姓名,将显示结果加中文别名。
1. select sno 学号,sname 姓名 from student 2. select sno as 学号,sname as 姓名 from student 3. select 学号=sno,姓名=sname from student
常用的查询条件:
查询条件 运算符 含义
比较运算符 =,>,<,>=,<=,!=,!>,!< 比较大小
确定范围 BETWEEN,NOT BETWEEN 是否在范围内
确定集合 IN , NOT IN 是否属于列表值之一
字符匹配 LIKE ,NOT LIKE 是否匹配
空值 IS NULL , IS NOT NULL 是否为空
多重条件 AND , OR , NOT 多重条件判断
若需要查询表中满足条件的数据而不是全部数据,需要在select语句中通过where字句实现。
select <字段列表> from <表名> where <条件表达式> #输出表中满足条件的列及列数据。
实例4:查询student表中所有男生的详细信息。
select * from student where Sex='男'
模糊查询:
实例6:查询course表中数据库类课程的信息,结果显示课程编号、课程名称、任课教师
select cno,came,teacher from course where cname like '%数据库%' #通配符%代表任意长度的字符串。
实例7:在score表中查询期末有缺考现象的学生信息。
select * from score where endscore is null
4.3数据库的分组统计查询
在数据查询时,经常需要对查询结果进行分类、汇总和计算,比如,计算学生的总分、平均分等 ,需要利用SQL提供的聚集函数来完成这类查询操作。
函数 功能
count() 求个数,返回数据的数量
Sum() 求和,返回表达式中所有值的和
Avg() 求平均值,返回表达式中所有值的平均值
Max() 求最大值,返回表达式中所有值的最大值
Min() 求最小值,返回表达式中所有值的最小值
实例 1:查询student表中学生的总人
select count(*) from student #默认无列名 select count(*) 总人数 from student
实例3:查询score表 中课程C001的期末总成绩、平均成绩、最高成绩和最低成绩。
select sum(endscore),avg(endscore),max(endscore), min(endscore)from score where cno='c001'
若要对查询结果进行分类汇总时,需要使用Group by字句
select <字段列表> From <表名> Where <查询条件> Group by <分类字段> Having <检索条件>
说明:
(1)Group by 字句将查询结果按某列(或多列)的值分组,值相等的为一组。若未对查询结果分组,聚集函数将作用于整个查询结果;分组后聚集函数将作用于每一个组。
(2)Having字句用于对分组结果进行筛选,通常在Group by字句中使用。
实例4:查询student表中男、女生人数,要求使用中文别名。
select sex 性别,count(*) 人数 from student group by sex
实例5:在score表中,查询期末平均成绩在80分以上的学生的学号和平均成绩。
select sno,avg(endscore) from score group by sno having avg(endscore) >=80
使用Select查询获取的数据通常是无序的,可使用Order by字句对查询结果集排序
Order by子句将查询结果按一个或多个列值得大小顺序输出。
格式:
select <字段列表> from <表名> [where<查询条件>]
[group by <分类字段> [having <检索条件>]]
order by <排序字段> [Asc|Desc]
实例6:在score表中,查询每门课的平均成绩,并按照平均成绩降序排序。
select cno,avg(endscore) from score group by cno order by avg(endscore) desc
4.4数据库的内连接查询
数据查询时,用户需要查询的数据有时并不都在一个数据表中,可能涉及一个以上的表,这时就要使用多表查询。
多表查询是将多个表连接在一起的查询,也称为连接查询。
根据查询的需要,连接查询主要分为内连接和外连接。
内连接查询是将表中一些记录按照一定条件与其他表的一些记录连接起来,连接条件通常是表间列的相等关系。
在内连接查询中,只有满足条件的记录才能出现在结果集中。
格式1:
select <列表字段> from <表名1>,<表名2>
where <表名1.列名=表名2.列名> [and表达式]
说明:
1.from字句指明进行连接的表名,表名之间用逗号隔开。
2.where字句指明连接的列名及连接条件,列名若在表1和表2中都包含,则必须使用"表名.列名"的形式,以示区别。
3.连接条件即为各表之间的关联,其形式为:
"表名1.主键"="表名2.外键"
4.如果是有条件的连接查询,则将条件表达式放在连接条件的后面,使用And关键字即可。
格式2:
select <列表字段> from <表名1> Inner Join <表名2>
on <表名1.列名=表名2.列名>
[where 条件表达式]
说明:
Inner Join 称为内连接,关键字on与之对应,以表明连接的条件。
select student.sno,sname,cno,uscore,endscore from student,score where student.sno=score.sno 或者: select student.sno,sname,cno,uscore,endscore from student inner join score on student.sno=score.sno
实例3:查询所有学生的学号、姓名、课程名称、课程成绩。
select student.sno,sname,cname,uscore,endscore from student,course,score where student.sno=score.sno and course.cno=score.cno 或者 select student.sno,sname,cname,uscore,endscore from select student inner join score on student.sno=score.sno inner join course on course.cno=score.cno
实例4:查询每门课程的课程号、课程名及其选课人数。
select score.cno,cname,count(*) as num from course,score where course.cno=score.cno group by score.cno,cname
4.5数据库的外连接查询
外连接通常用于相连接的表中至少有一个表需要显示所有数据行的情况。
外连接的结果集中不包含满足连接条件的记录,还包含相应表中的所有记录,即某些记录即使不满足连接条件,但仍需要输出。
外连接注意分为左外链接、右外连接和全外连接三种。
左外连接
格式:
select<列表字段> from <表名1> Left [Outer] Join <表名2> #Outer可以省略
on <表名1.列名=表名2.列名>
说明:
1.左外连接的结果集中包括了左表的所有记录,而不仅仅是满足连接条件的记录,即将位于Left join关键字左侧表的所有行都输出。
2.如果左表的某条记录在右表中没有匹配行,此时右表的数据行显示为NULL。
实例1:查询所有学生的选修课程情况,结果显示为学号、姓名、课程编号和课程成绩。
(1)使用内连接,只显示有选课记录的学生信息。
select student.sno,sname,score.cno,uscore,endscore from student inner join score on student.sno=score.sno
(2)使用左外连接,显示所有学生的信息,没有选课的学生,其成绩列显示为NULL。
select student.sno,sname,score.cno,uscore,endscore from student left join score on student.sno=score.sno
右外连接
格式:
select<列表字段> from <表名1> Right [Outer] Join <表名2> #Outer可以省略
on <表名1.列名=表名2.列名>
说明:
1.右外连接的结果集中将位于Right join 关键字右侧表的所有行都输出。
2.如果左表的某条记录在右表中没有匹配行,此时左表的数据行显示为NULL。
实例2:查询每门课程的选修情况,结果显示为课程号、课程名和课程成绩。
(1)使用内连接,只显示有学生选修的课程。
select course.cno,cname,uscore,endscore from score inner join course on score.cno=course.cno
(2)使用右外连接,显示所有课程记录,没有学生选修的课程,其成绩列显示为NULL。
select course.cno,cname,uscore,endscore from score right join course on score.cno=course.cno
全外连接
格式:
select<列表字段> from <表名1> Full [Outer] Join <表名2> #Outer可以省略
on <表名1.列名=表名2.列名>
说明:
1.全外连接的结果集中包括了左表和右表的所有记录。
2.当某条记录在另一个表中没有匹配记录时,则该表的相应列值为NULL。
实例3:
(1)使用内连接,只显示有学生选修的课程记录,为便于查看,使用了order by字句。
select course.*,score.* from course inner join score on score.cno=coursr.cno order by cname
(2)使用全外连接,显示两个表中的所有记录行,没有学生选修的课程,相应列显示为NULL。
select course.*,score.* from course full join score on score.cno=course.cno order by cname
4.6数据库的子查询
SQL子查询又称为嵌套查询,是指在一个查询语句中又包含另一个查询的情况,其一般格式如下。子查询必须是单表查询,然后通过相同的字段与其他查询进行联系。
select<目标列> from 单个目标表或视图 where <字段> in (select <目标列> from <单个目标列或视图> where <条件>)
在嵌套查询中,子查询的结果往往是一个集合。IN子查询用于判断一个给定值是否在子查询结果集中,其语法格式为:
父查询 [NOT] IN (子查询)
实例1:查询选修了3门以上课程的学生的姓名
select sname from student where sno in (select sno from score group by sno having count(*)>3) #将直接查询作为外查询,其他查询作为内查询。
实例2:查询选修了"数据库应用"课程的学生姓名
由内而外的查询顺序书写
select sname from student where sno in (select sno from score where cno in (select cno from course where cname='数据库应用') )