SQL查询语句大全0.docx
《SQL查询语句大全0.docx》由会员分享,可在线阅读,更多相关《SQL查询语句大全0.docx(23页珍藏版)》请在冰豆网上搜索。
SQL查询语句大全0
第4章查询与视图
4.1SQL语言简介
4.2SELECT数据访问基本方法
4.3条件检索的SELECT语句
4.4从多张表检索的SELECT语句
4.5Union操作和子查询语句
4.6SQL常用函数及其使用方法
4.1SQL语言简介
1.SQL(StructuredQueryLanguage):
结构化查询语言,是一种介于关系代数与关系运算之间的语言,主要功能包括查询、操纵、定义和控制等方面,是一个通用的、功能极强的关系数据库语言。
2.Transact-SQL的组成
1)数据定义语言(DDLDataDefinitionLanguage):
用来建立数据库、数据库对象。
如Createtable、view等。
2)数据操纵语言(DMLDataManipulationLanguage):
用来操纵数据库中的数据的命令。
如select、insert、update、delete等。
3)数据控制语言(DCLDataControlLanguage):
用来控制数据库组建的存取权限等。
如Grant、Revoke等。
4)流程控制语言(FCLFlowControlLanguage):
用来设计应用程序的语句。
如if、while、case等。
5)其他语言要素(ALEAdditionallanguageElement):
包括变量、运算符、函数和注解等。
SELECT语句的基本格式如下:
SELECTselect_list
FROMtable_source
[WHEREsearch_condition]
[GROUPBYgroup_by_expression][HAVINGsearch_condition]
[ORDERBYorder_expression[ASC|DESC]]
[INTOnew_table]
SELECT[ALL|DISTINCT][TOPn[PERCENT]]
:
:
=
{*|{table_name|view_name|
table_alias}.*
|{column_name|expression|}[[AS]column_alias]
|column_alias=expression
}[,...n]
1.选择所有字段
SELECT*FROM表名如:
usepubs
select*fromauthors
(显示authors中的所有信息,全表查询)
2.选择部分字段
SELECT列名1[,列名2,…列名n]FROM表名如:
usestudent
select学号,姓名,性别from学生基本情况
(显示学生基本情况中学号,姓名,性别字段的信息)
3.为字段设置别名
SELECT列名1as新名1[,列名2as新名2,…
列名nas新名n]FROM表名
(将选择字段的标题按新的名称显示)注意:
新标题的名称可以有下列方式:
1)在列表达式后面给出列名selectxh学号
2)用“=”来连接列表达式select学号=xh
3)新标题的名称用单引号、双引号括起来;
4)用AS关键字来连接列表达式和指定的列名
例如:
查询authors中编号、姓名、电话、地址的信息,可以采用以下方式:
1.selectau_id编号,au_lname姓,au_fname名,phone电话,address地址fromauthors
2.select编号=au_id,姓=au_lname,名=au_fname,电话
=phone,地址=addressfromauthors
3.selectau_id'编号',au_lname'姓',au_fname'名',phone
'电话',address'地址'fromauthors
4.selectau_id"编号",au_lname"姓",au_fname"名
",phone"电话",address"地址"fromauthors
5.selectau_idas编号,au_lnameas姓,au_fnameas
名,phoneas电话,addressas地址fromauthors
4.在选择列表中使用表达式
在查询数据时,可以通过运算操作来控制从一个表中的返回值。
例如:
查询每个学生的总成绩、平均成绩。
select学号,姓名,数学成绩+语文成绩+英语成绩as总成绩,(数学成绩+语文成绩+英语成绩)/3as平均成绩
from学生基本情况
4.消除字段数据的重复值
在查询数据时,可能会有许多重复的数据。
SQL提供的Distinct关键字,可以从select语句的结果集中消除重复的数据。
例如:
1)查询学生来至哪些院系的信息。
selectdistinct院系名称from学生基本情况
2)查询有哪些专业的学生。
selectdistinct所学专业from学生基本情况
6.限制记录的行数
在限制查询记录的行数时,可以使用下列方式:
1)使用topn:
返回前n条记录;
2)使用topnpercent:
返回前n%条记录;
3)使用setrowcountn:
返回前n条记录。
n=0关闭
例如:
1)显示前5条记录
selecttop5*from学生基本情况
2)显示20%学生的信息
selecttop20percent*from学生基本情况
3)对所有select语句,均显示5条记录。
setrowcount5
select*from学生基本情况
1.条件子句
最常用的条件子句是where和having,用它们来指定一系列条件,执行操作时只返回满足条件的记录。
Having通常与Groupby一起使用,用来说明返回
分组的条件。
例如:
1)显示男生的相关信息
Select*from学生基本情况where性别=‘男’
2)显示男生人数超过10人的院系信息
select院系名称,count(*)as男生人数from学生基本情况where性别='男'
groupby院系名称havingcount(*)>10
2.算术表达式、比较运算符
算术运算符有:
+、-、*、/、%使用算术表达式的一般形式为:
expressionoperatorexpression
比较运算符:
是最为常见的一种条件限制方式,用于测试两个表达式是否相同,返回值为True或False。
WHERE子句中允许出现的比较运算符有:
=(等于)、>(大于)、>=(对于等于)、<
(小于)、<=(小于等于)、<>(不等于)、!
=
(不等于)、!
>(不大于)、!
<(不小于)
3.逻辑表达式
在Transact-SQL中可以使用的逻辑运算符有三个:
NOT:
逻辑反,对指定的布尔表达式求反。
AND:
逻辑与,只有当两个条件都是TRUE
时取值为TRUE。
OR:
逻辑或,当两个条件中任何一个条件是
TRUE时,取值为TRUE。
优先顺序:
先Not,再And,后Or
4.BETWEEN条件
BETWEEN用于搜索介于两个指定值之间的所有信息,且包括两个指定的值。
格式为:
条件字段[NOT]BETWEENbegin_expression
ANDend_expression
例如:
查询数学成绩在80到90之间的信息。
Select*from学生基本情况where数学成绩
between80and90
Between是AND的简化用法,上面的语句等价于:
Select*from学生基本情况where数学成绩
>=80and数学成绩<=90
4.2SELECT语句的查询条件
4.IN列表搜索条件
IN列表搜索条件用于返回与给定的列表中任意一个值相匹配的记录。
格式为:
条件字段[NOT]IN(列表选项)例如:
查询数学成绩为70、80、90的信息。
select*from学生基本情况where数学成绩in
(70,80,90)
In列表条件是OR的简化形式,上面语句等价于:
select*from学生基本情况where数学成绩=
70OR数学成绩=80OR数学成绩=90
4.2SELECT语句的查询条件
6.LIKE匹配模式
LIKE匹配模式是确定条件字符串是否与指定的模式匹配。
使用格式:
条件字段[NOT]LIKE匹配模式
SQL中的有效模式包括:
%:
可匹配任意类型和长度的字符串。
Like‘李%’
_(下划线):
可匹配任何单个字符。
Like‘71005_’
[]:
指定范围或集合中的任何单个字符。
Like[a-d]
[^]:
不属于指定范围或集合的任何单个字符
例如:
1)查询所有姓“张”的学生信息
select*from学生基本情况where姓名like'张
%'
4.2SELECT语句的查询条件
6.NULL搜索条件
空值比较的关键字是ISNULL或ISNOTNULL。
其中NULL表示字段的数据未知或不确定。
格式为:
表达式ISNULL
或表达式ISNOTNULL例如:
查询缺少数学成绩的学生信息。
select*from学生基本情况where数学成
绩isnull
查询示例表
1.按10%的比例显示本专业的男生信息;
2.查询“管理学院”专业分布情况;
3.查询本专业学生来自哪些省份;
4.查询英语不及格学生的信息,显示学号、姓名、专业、英语原成绩、英语+10、英语*1.1等字段信息;
5.显示管理学院学生中,不姓“刘”和“张”的学生信息;
6.查询“数学”在65-75之间,而“英语”不在70-90之间的学生信息;
7.查询“管理学院、能源学院、机械学院、人文学院”学号在
01-07之间的学生信息。
8.将学生的“学号、姓名、性别、身份证号”作为一列、“院系名称、专业”作为一列,各数据之间用“,”分隔;列名分别为“基本信息”、“隶属关系”进行显示;
9.查询总成绩<210、语文成绩在75-90间、且不属于“人文学院”的学生信息。
1.排序
使用Orderby对查询结果中的一个或多个字段进行排序。
排序可以升序(ASC),也可以是降序(DESC)。
若未指定排序方式,默认升序。
例如:
1)按姓名升序查询学生信息。
select*from学生基本情况orderby姓名
2)查询数学成绩前5名的学生信息
selecttop5*from学生基本情况orderby数学成绩
desc
思考:
1)如何按院系升序、姓名降序查询?
2)如何查询总成绩前10名的学生信息?
3)如何按性别降序、学号升序、平均成绩升序查询?
4)查询本专业女生中年龄最小的10个学生信息。
使用GroupBy进行分组,返回的结果中,每一行都产生聚合值。
常用的聚合函数包括:
⏹Sum():
返回一个数字列或计算列的总和
⏹Avg():
返回一个数字列或计算列的平均值
⏹Min():
返回一个数字列或计算列的最小值
⏹Max():
返回一个数字列或计算列的最大值
⏹Count():
返回非NULL值的记录个数
⏹count(*):
返回符合条件的记录个数
例如:
1)统计各个院系的学生人数。
select院系名称,count(*)as人数from学生基本情况groupby院系名称
2)统计各个院系的男生、女生的人数。
select院系名称,性别,count(*)as人数from学生基本情况groupby院系名称,性别
思考:
1)查询各个专业、不同省份的学生人数。
2)查询数据表中所有男生、女生的人数。
3)查询本专业数学成绩的总分、平均分、最高分、最低分。
4)按性别查询本专业英语的平均分、最高分、最低分和人数。
1.数据连接查询
根据各个表之间的逻辑关系,从两个或多个表中检索数据,并把所有检索到的数据通过一个数据集返回。
1)用WHERE进行数据连接使用WHERE子句可以实现多个表间的数据连接。
例如:
从学生基本情况表与成绩表中查询学生的学
号、姓名、专业、各门课程成绩。
SELECT学生基本情况.学号,姓名,所学专业,成绩表.高等数学,成绩表.大学英语,计算机基础,管理学
FROM学生基本情况,成绩表
where学生基本情况.学号=成绩表.学号
如果数据表名称太长,造成书写麻烦,可以给数据表另外取一个简洁的名称,即别名。
例如:
将上面语句中的基本情况表改名为jbqk,将成绩表改名为cjb,则语句变成:
SELECTjbqk.学号,姓名,所学专业,高等数学,大学英语,cjb.计算机基础,管理学
FROM学生基本情况asjbqk,成绩表ascjbwherejbqk.学号=cjb.学号
或者改成:
SELECTjbqk.学号,jbqk.姓名,jbqk.所学专业,cjb.高等数学,cjb.大学英语,cjb.计算机基础,cjb.管理学
FROM学生基本情况jbqk,成绩表cjbwherejbqk.学号=cjb.学号
2用JOINON连接
在Select语句中,通常使用Join…On连接词来实现表间的连接。
例如:
上面的Where连接可以改成:
SELECTjbqk.学号,jbqk.姓名,jbqk.所学专业,cjb.高等数学,cjb.大学英语,cjb.计算机基础,cjb.管理学
FROM学生基本情况jbqk
join成绩表cjbonjbqk.学号=cjb.学号
3用连接关键字进行连接
从多个表中查询相关数据,最好在FROM子句中指定连接条件,这样可以将指定的连接条件与WHERE子句的搜索条件分开。
连接查询的主要用法为:
Select选择字段列表
From数据表连接的类型其它表[on连接条件]
[Where搜索条件][OrderBy排序字段]
1)内连接(InnerJoin)
内连接是最常用的连接操作。
连接的结果是从两个表中挑选出符合连接条件的数据,如果数据无法满足连接条件则将其丢弃。
例如:
使用内连接,从学生基本情况表与成绩表中查询学生的学号、姓名、专业、各门课程成绩。
SELECTjbqk.学号,jbqk.姓名,jbqk.所学专业,
cjb.高等数学,cjb.大学英语,cjb.计算机基础,cjb.管理学
FROM学生基本情况jbqk
innerjoin成绩表cjbonjbqk.学号=cjb.学号
2)外连接(OuterJoin)
外连接中,参与连接的表有主从之分。
以主表的每行数据去匹配从表的数据行,符合条件的数据将直接返回到查询结果中;如果主表的行在从表中没有相匹配的行,则对应从表的列将填上NULL值。
外连接的类型有:
左连接(LeftJoin/LeftOuterJoin)右连接(RightJoin/RightOuterJoin)完全连接(FullJoin/FullOuterJoin)
(1)左连接(LeftJoin)
以连接左边的表为主表。
即左边表的所有行都显示出来,若左边表在从表中没有与连接条件相匹配的数据行,则从表不匹配的列填上NULL。
例如:
前面的查询,使用左连接查询。
SELECTjbqk.学号,jbqk.姓名,jbqk.所学专业,cjb.高等数学,cjb.大学英语,cjb.计算机基础,
cjb.管理学
FROM学生基本情况jbqk
leftjoin成绩表cjbonjbqk.学号=cjb.学号
(2)右连接(RIGHTJoin)
以连接右边的表为主表。
即右边表的所有行都显示出来,若右边表在左表中没有与连接条件相匹配的数据行,则左表不匹配的列填上NULL。
例如:
前面的查询,使用右连接查询。
SELECTjbqk.学号,jbqk.姓名,jbqk.所学专业,cjb.高等数学,cjb.大学英语,cjb.计算机基础,cjb.管理
学
FROM学生基本情况jbqk
Rightjoin成绩表cjbonjbqk.学号=cjb.学号
(3)完全连接(FullJoin)
不管另一边的表是否有匹配的行,查询结果将显示两个表的所有行。
SELECTjbqk.学号,jbqk.姓名,jbqk.所学专业,cjb.高等数学,cjb.大学英语,cjb.计算机基础,
cjb.管理学
FROM学生基本情况jbqk
fulljoin成绩表cjbonjbqk.学号=cjb.学号
3)交叉连接(CrossJoin)
交叉连接产生的查询结果的行数是第一个表的行数乘以第二个表的行数,即迪卡尔积。
如第一个表有15条记录,第二表有20条记录,则交叉连接返回的记录有300条。
对上面的例子,使用交叉连接:
SELECTjbqk.学号,jbqk.姓名,jbqk.所学专业,cjb.高等数学,cjb.大学英语,cjb.计算机基础,cjb.管理学FROM学生基本情况jbqk
crossjoin成绩表cjb
数据表名:
JBQK数据表名:
CJB
1.查询本专业陕西前5名学生各门课程的学习成绩,按省份升序、性别降序、姓名升序进行排序,显示学生的学号、姓名、性别、省份及各门课程成绩。
2.统计管理学院各专业男女生高等数学的平均分、最高分、最低分及人数,按专业降序排列。
3.按内连接、左连接、右连接、完全连接显示两个表的信息,按专业排序。
4.统计管理学院各专业大学英语的平均分、学习人数,按专业降序排列,只显示学习人数不低于3人的专业。
5.统计总成绩前10名的学生,显示学号、姓名、专业、各门课程成绩及总成绩,按总成绩、专业、学号排序。
4)联合查询(Union)
使用Union子句将两个或多个Select语句的结果组合成一个结果集,按照第一个Select的字段列表进行显示,Union会自动将重复的数据行删除。
但要求每个Select语句的结果必须具有相同的结构和列数,并且每列的数据类型也必须兼容。
Union查询的基本格式:
Select…from…[Where条件]
{Union
Select…from…[Where条件]}[,…n][OrderBy排序字段]
例如:
将学生基本情况表中以01开头的学号、各门课程的成绩与成绩表的学号、各门课程成绩联合查询。
SELECT学号,数学,语文,英语FROM学生基本情况
where学号like'01%'
Union
SELECT学号,高等数学,大学英语,计算机基础FROM
成绩表
思考:
1)如何查询男、女生各5名的学习成绩,按性别和总成绩排序?
2)如何查询管理学院、能源学院、机械学院高等数学成绩的最高分、最低分、平均分?
2子查询(Subquery)
子查询是一条包含在另外一条Select语句里面的Select语句。
外层的Select语句叫外部查询,内层的Select语句叫内部查询(或子查询)。
包括子查询的Select语句主要格式有:
1)where字段名[not]IN(子查询)
2)WHERE字段名关系运算符(子查询)
3)where[not]Exists(子查询)
1)使用IN的子查询
使用IN(或NOTIN)的子查询返回的查询结果是一列零值或多列值。
子查询返回结果之后,外部查询可以使用这些结果。
格式:
where字段名IN(子查询)例如:
查询与“张海燕”同省份的学生信息。
SELECT*FROM学生基本情况
Where省份IN(select省份FROM学生基本情况
where姓名='张海燕')
思考:
1)显示高等数学在80-90间的学生基本信息,显示学号、姓名、专业、高等数学等信息。
2)查询“5个年龄较小”的所有学生信息。
3)查询学生基本信息,并统计高等数学的平均成绩、每人与平均成绩的差值。
2)使用比较运算符的子查询子查询可以由一个比较运算符引入。
比较运算符可以
是=、>、>=、<、<=、!
=等。
格式:
WHERE字段名比较运算符(子查询)
例如:
查询数学成绩高于平均分的学生信息。
SELECT*FROM学生基本情况
Where数学成绩>(selectavg(数学成绩)FROM
学生基本情况)
思考:
1)如何查询本专业大学英语成绩>=60且低于平均分的学生信息?
2)统计管理学院各专业高等数学低于平均分的人数。
3)查询大学英语成绩最高分的学生信息。
3)使用Exists的子查询
使用Exists(或NotExists)引入子查询时,就相当于进行一次存在测试。
外部查询的Where子句测试子查询返回的行是否存在。
子查询实际上不产生任何数据,它只返回True或False。
例如:
查询成绩表中女生的学习成绩。
SELECT*FROM成绩表
Whereexists(select*FROM学生基本情况
where学号=成绩表.学号and性别='女')
思考:
1)如何查询管理学院的学生成绩?
2)查询本专业高等数学不及格的学生信息?
数据表名:
JBQK数据表名:
CJB
⏹根据JBQK表、CJB表完成下列查询:
⏹1.查询高等数学成绩高于平均成绩的学生信息,显示学号、姓名、专业、高等数学等;
⏹2.查询信息管理专业男生的高等数学成绩、电子商务专业女生的高等数学成绩、能源学院所有学生的数学成绩,显示显示学号、姓名、性别、院系、专业、高等数学等,按院系、专业排序;
⏹3.查询与“刘文东”同专业的学生信息,显示显示学号、姓名、专业、各门课程成绩。
1基于查询生成新的数据表
如果需要将查询结果保存下来,使用INTO子句可以生成一个新表并将结果保存在这个新的数据表中。
命令基本格式:
Select选择字段表Into新的表名FROM已有的表[where条件]例如:
1)将“学生基本情况”表复制成jbqkSelect*Intojbqkfrom学生基本情况
2)统计各个院系英语成绩的平均分、最高分、最低分、考试
人数,结果放在Eng_tj表。
SELECT学生基本情况.院系名称,AVG(成绩表.大学英语)AS英语平均,MAX(成绩表.大学英语)AS英语最高,MIN(成绩表.大学英语)AS英语最低,COUNT(*)AS考试人数
I