SQL常用查询语法整理

1、基本结构

select <目标列名序列>
[into <存放结果新表或视图>]
From <数据源>
[where <检索条件表达式>]
[group by <分组依据列>]
[having <对分组结果提取条件>]
[Order by <排序依据列> [asc|desc]]

参数说明如下:
Select子句:指定由查询结果返回的列。
Into子句:将查询结果存储到新表或视图中。
From子句:用于指定数据源,即使用的列所在的表或视图。如果对象不止一个,那么它们之间必用逗号分开。
Where子句:指定用于限制返回的行的搜索条件。如果select语句没有where子句,dbms假设目标表中的所有行都满足搜索条件。
Group by子句:指定用来放置输出行的组,并且如果select子句select_list中包含聚合函数,则计算每组的汇总值。
Having子句:指定组或聚合函数的搜索条件。Having通常与group by子句一起使用。
Order by子句:指定结果集的排序方式。ASC关键字表示升序排列结果,DESC关键字表示降序排列结果。如果没有指定任何一个关键字,那么ASC就是默认的关键字。如果没有orderby子句,DBMS将根据输入表中的数据的存放位置来显示数据。

 

2、简单查询:

2.1 查询列:

(1)查询指定列

例7-1、查询所有同学学号、姓名和成绩信息。

Select stu_id,name,mark from stu_info

(2)查询所有列

例7-2、查询所有同学的所有信息。

select * from stu_info

(3)使用运算列:

YEAR为系统函数,获取指定日期的年份;GEDDATE()为系统函数,获取当前日期和时间。

例7-3、查询所有同学的年龄信息。

Select stu_id,name,YEAR(getdate())-YEAR(birthday) from stu_info

查询结果如下:

(4)改变列标题显示:

通常在查询结果显示的列标题就是创建表时所使用的列名,但是,这在实际使用中往往会带来一些不便,因此,可以利用 ’列标题’=列名 或 as ‘列标题’ 来根据需要修改列标题的显示。

例7-4、查询所有同学的年龄信息。

Select name as'姓名',YEAR(getdate())-YEAR(birthday)as'年龄' from stu_info

查询结果如下:

(5)除去结果的重复信息:

使用 distinct 关键字能够从返回的结果数据集合中删除重复的行,使返回的结果更简洁。

例7-5、查询所有的院系信息。

Select distinct sdept from stu_info

查询结果如下:

(6)返回查询的部分数据:

Top n 表示返回最前面的n 行,n 表示返回的行数;top n percent 表示返回前面的n%行。

例7-6、查询前5位同学的学号、姓名和成绩信息。

Select top 5 stu_id,name,mark from stu_info

查询结果如下:

select top 数字/数字 percent  from 表名 
elect top 数字 percent  from 表名

 

2.2 选择行:

Where 子句用于指定查询条件,使得select 语句的结果表中只包含那些满足查询条件的记录。

在使用时,where 子句必须紧跟在 from 子句后面。Where 子句中的条件表达式包括算术表达式和逻辑表达式两种,SQL Server对Where 子句中的查询条件的数目没有限制。

(1)使用比较表达式:

例7-8、查询所有的男同学学号、姓名、生日和性别信息。

Select stu_id,name,birthday,sex from stu_info where sex='男'

查询结果如下:

(2)使用逻辑比较表达式:

例7-10、查询所有总分大于550的男同学信息。

Select stu_id,name,birthday,sex from stu_info where mark>550 and sex='男'

查询结果如下:

为了增强程序可读性,一般采用括号()来实现需要的执行顺序,而不考虑其默认的优先级顺序。

例7-12、查询所有信息学院和会计学院并且总分大于550分的同学信息。

select * from stu_info where (sdept='信息学院'or sdept='会计学院')and mark>550

查询结果如下:

(3)空值(null)的判断:

如果在创建数据表时没有指定 not null 约束,那么数据表中某些列的值就可以为null。所谓null就是空,在数据库中,其长度为0。

例7-13、查询所有籍贯为空的同学信息。

select * from stu_info where address is null

查询结果如下:

(4)限定数据范围:

使用between限制查询数据范围时同时包括了边界值,效果完全可以用含有“>=”和“<=”的逻辑表达式来代替;而使用not between进行查询时没有包括边界值,效果完全可以用含有“>”和“<”的逻辑表达式来代替。

例7-14、查询总分在530—560之间的同学信息。

select * from stu_info where mark between 530 and 560

查询结果如下:

(5)限制检索数据的范围:

对于列值不在一个连续的取值区间,而是一些离散的值,利用between关键字就无能为力了,可以利用SQL Server提供的另一个关键字 IN。

在大多数情况下,OR 运算符与IN 运算符可以实现相同的功能。

例7-15、查询所有在信息学院或会计学院就读的同学信息。

select * from stu_info where sdept in('信息学院','会计学院')

查询结果如下:

(6)模糊查询:

SQL Server提供了like子句来进行这类模糊搜索。Like子句在大多数情况下会与通配符配合使用。

所有通配符只有在like子句中才有意义,否则通配符会被当作普遍字符处理。各通配符也可以组合使用,实现复杂的模糊查询。

(通配符 “%” 表示任意字符的匹配;通配符“_ ”只能匹配任何单个字符;通配符“[]”用于指定范围(如[a-z])或集合(如[abcdef])中的任何单个字符;通配符“[^]”用于匹配没有在方括号中列出的字符。)

例7-16、查询所有姓“张”的同学信息。

select* from stu_info where name like '张%'

查询结果如下:

例7-17、查询所有姓“张”,而且姓名是两个字的同学信息。

select* from stu_info where name like '张_'

查询结果如下:

例7-19、查询所有不姓“张”也不姓“王”的同学信息。

select* from stu_info where name like '[^张王]%'

查询结果如下:

2.3 排序查询结果:

在SQL语句中,order by 子句用于排序。Order by子句总是在where子句(如果有的话)后面说明的,可以包含一个或多个列,每个列之间以逗号分隔。可以选择使用asc|desc关键字指定按照升序|降序排序。如果没有特别说明,值是以升序列进行排序的,即默认情况下使用的是asc关键字。

例7-20、查询所有同学课程编号701的课程成绩,并按由大到小的顺序输出。

select*from stu_grade where course_id='701' orderby grade desc

查询结果如下:

 

例7-21、查询所有同学课程编号701的课程成绩,并按由大到小的顺序输出,如果成绩相同,则按学号由小到大排序。

select* from stu_grade where course_id='701' orderby grade desc,stu_id

查询结果如下:

 

 Order by子句除了可以根据列名进行排序外,还支持根据列的相对位置(即序号)进行排序。

例7-22、查询所有同学课程编号701的课程成绩,并按由大到小的顺序输出,如果成绩相同,则按学号由小到大排列。

Select stu_id,course_id,grade From stu_grade Where course_id='701' order by 3 desc,1

查询结果如下:

2.4 分组与汇总:

(1)聚合函数:

聚合函数是T—SQL所提供的系统函数,可以返回一列,几列或全部列的汇总数据,用于计数或统计。这类函数(除count外)仅用于数值型列,并且在列上使用聚合函数时,不考虑null值。

例7-23、统计学生信息表中学生人数。

Select COUNT(*) as '学生人数' From stu_info

查询结果如下:

例7-24、统计学生成绩表中学号为2007070102同学的最高分、最低分、平均分和总分。

Select MAX(grade),MIN(grade),AVG(grade),SUM(grade) From stu_grade Where stu_id='2007070102'

查询结果如下:

(2)分组汇总:

使用聚合函数只返回单个汇总,而在实际应用中,更多的是需要进行分组汇总数据。使用group by子句可以进行分组汇总,为结果集中的每一行产生一个汇总值。Group by子句与聚合函数有密切关系,在某种意义上说,如果没有聚合函数,group by子句也没有多大用处了。

Group by关键字后面跟着的列名称为分组列,分组列中的每个得复值将被汇总为一行。

如果包含where子句,则只对满足where条件的行进行分组汇总。

例7-25、统计学生成绩表中每个同学的最高分、最低分、平均分和总分。

Select stu_id,MAX(grade),MIN(grade),AVG(grade),SUM(grade) From stu_grade Group by stu_id

查询结果如下:

例7-26、统计学生成绩表中每个同学的最高分、最低分、平均分和总分,80分以下的成绩不参与统计。

Select stu_id,MAX(grade),MIN(grade),AVG(grade),SUM(grade) From stu_grade Where grade>=80 Group by stu_id

查询结果如下:

(3)分组筛选:

如果使用group by子句分组,则还可用having子句对分组后的结果进行过滤筛选。Having子句通常与group by子句一起使用,用于指定组或合计的搜索条件,其作用与where子句相似,二者的区别如下:

作用对象不同:where 子句作用于表和视图中的行,而having子句作用于形成的组。Where子句限制查找的行,having子句限制查找的组。

执行顺序不同。若查询句中同时有where子句和having子句,执行时,先去掉不满足where条件的行,然后分组,分组后再去掉不满足having条件的组。

Where子句中不能直接使用聚合函数,但having子句的条件中可以包含聚合函数。

例7-27、统计学生成绩表中每个同学的最高分、最低分、平均分和总分,并输出平均分大于87分的信息。

Select stu_id,MAX(grade),MIN(grade),AVG(grade),SUM(grade) From stu_grade Group by stu_id Having AVG(grade)>87

查询结果如下:

(4)明细汇总:

使用group by子句对查询数据进行分组汇总,为每一组产生一个汇总结果,每个组只返回一行,无法看到详细信息。使用compute和compute by子句既能够看到统计经营部的结果又能够浏览详细数据。

例7-28、使用compute子句对所有学生的人数进行明细汇总。

select*from stu_info compute count(stu_id)

查询结果如下:

 

在使用compute 和compute by时,需要注意以下几点:

Compute[by]子句不能与select into子句一起使用。

Compute 子句中的列必须在select子句的字段列表中出现。

Compute by表示按指定的列进行明细汇总,使用by关键字时必须同时使用order by子句,并且compute by中出现的列必须具有与order by后出现的列相同的顺序,且不能跳过其中的列。

例7-29、使用compute by子句按照院系对所有学生的人数进行明细汇总。

select* from stu_info order by sdept compute count(stu_id) by sdept

查询结果如下:

3、连接查询

多表连接实际上就是实现如何使用一个表中的数据来选择另一个表中的行。而连接条件则主要通过以下方法定义两个表在查询中的关联方式:指定每个表中要用于连接的列。典型的连接条件在一个表中的指定外键,在另一个表中指定与其关联的键。

指定比较各列的值时要使用的比较运算符(=、< >等)。

表的连接的实现可以通过两种方法:利用select语句的where子句;在from子句中使用join(inner join,cross join ,outer join,left outer join,full outer join等)关键字。

例7-30、查询所有选修课程编号701的同学学号、姓名和成绩。

Select stu_info.stu_id,name,mark From stu_info,stu_grade Where stu_info.stu_id=stu_grade.stu_id and course_id='701'

查询结果如下:

例7-31、查询所有选修课程的同学选修课程的成绩。

Select stu_info.stu_id,name,course_name,grade From stu_info,stu_grade,course_info
Where stu_info.stu_id=stu_grade.stu_id and course_info.course_id=stu_grade.course_id

查询结果如下:

4、嵌套查询

所谓嵌套查询指的是在一个select 查询语句中包含另一个(或多个)select查询语句。其中,外层的select查询语句叫外部查询,内层的select 查询语句叫子查询。

嵌套查询的执行过程:首先执行子查询语句,得到的子查询结果集传递给外层主查询语句,作为外层主查询的查询项或查询条件使用。子查询也可以再嵌套子查询。

4、1 单列单值嵌套查询:

例7-37、查询选修“计算机基础”的学生成绩信息。

select* from stu_grade where course_id= (select course_id From course_info Where course_name='计算机基础')

查询结果如下:

例7-38、查询比“2007070101”同学年龄大的同学信息。

select*from stu_info where birthday<(select birthday From stu_info Where stu_id='2007070101')

查询结果如下

4、2 单列多值嵌套查询:

例7-39、查询所有会计学院的同学成绩信息。

select * from stu_grade where stu_id in (select stu_id From stu_info Where sdept='会计学院')

查询结果如下

例7-40、查询其他系中比会计学院某一学生分数少的学生学号和姓名。

Select stu_id,name From stu_info Where mark<any (select mark From stu_info Where sdept='会计学院') And sdept<>'会计学院'

查询结果如下

 

5、集合查询

如果有多个不同的查询结果数据集,但又希望将它们按照一定的关系连接在一起,组成一组数据,这就可以使用集合运算来实现。在SQL Server 2008中,T-SQL提供的集合运算符有union,except和intersect。

例7-43、查询stu_info表中信息学院或入学分数大于550分的学生信息。

Select stu_id,name,mark,sdept From stu_info Where sdept='信息学院'
union 
select stu_id,name,mark,sdept from stu_info where mark>550

查询结果如下

例7-44、查询stu_info表中信息学院而且入学分数大于550分的学生信息

Select stu_id,name,mark,sdept From stu_info Where sdept='信息学院'

except

select stu_id,name,mark,sdept from stu_info where mark<=550

查询结果如下

例7-45、查询stu_info表中信息学院而且入学分数大于550分的学生信息。

Select stu_id,name,mark,sdept From stu_info Where sdept='信息学院'

intersect

select stu_id,name,mark,sdept from stu_info where mark>550

查询结果如下

  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SQL基础教程是一本系统介绍SQL语言的教材,下面是我整理的一些笔记。 首先,SQL是Structured Query Language(结构化查询语言)的缩写,是一种用于管理和操作关系型数据库的计算机语言SQL语言包括了对数据库进行增、删、改、查的操作。其中,增操作使用INSERT语句,可以将新的数据插入到数据库中。删操作使用DELETE语句,可以删除数据库中的数据。改操作使用UPDATE语句,可以修改数据库中已有的数据。查操作使用SELECT语句,可以从数据库查询所需数据。 在SQL中,还存在着一些操作符,如等于(=)、不等于(<>)、大于(>)、小于(<)、AND(并且)、OR(或者)等,用于帮助我们实现更复杂的查询条件。 SQL还提供了一些函数,如SUM、COUNT、AVG、MAX和MIN等,用于对数据进行统计和计算。 此外,SQL还提供了一些关键字,如DISTINCT、ORDER BY、GROUP BY等,用于进一步操作查询结果,实现去重、排序和分组等需求。 除了查询语句SQL还支持多表联结查询,通过JOIN语句可以将多个表连接起来,在查询结果中展示多个表的数据。 在使用SQL语言操作数据库时,需要注意一些安全性问题。比如,应该使用参数化查询,防止SQL注入攻击。同时,对于敏感的数据,应该限制访问权限,保证数据的安全性。 总而言之,SQL基础教程是一个可以帮助我们深入学习和理解SQL语言的教材。通过学习这个教程,我们可以掌握SQL基本语法常用操作符、函数和关键字,进而能够熟练地使用SQL进行数据库管理和操作。 ### 回答2: SQL(Structured Query Language)是结构化查询语言的缩写,是一种用于管理和操作关系型数据库的标准语言。下面是我对《SQL基础教程》的笔记总结: 这本教程首先介绍了SQL的基本概念和发展历史,以及SQL数据库管理系统中的重要性。然后,详细说明了SQL语法规则和常用命令,包括SELECT、INSERT、UPDATE、DELETE等。通过学习这些基本命令,我们可以对数据库中的数据进行查询、添加、更新和删除操作,实现对数据的管理和维护。 接下来,教程介绍了SQL的数据类型和约束条件。数据类型包括数值型、字符型、日期型等,而约束条件可确保数据的完整性和一致性,包括主键、外键、唯一性约束等。理解和应用这些数据类型和约束条件,能够使我们创建和维护高质量的数据库。 在教程的后半部分,作者还介绍了SQL的高级应用技巧,包括多表查询、子查询、联合查询等。多表查询可方便地从多个表中检索数据,子查询可用于嵌套查询,联合查询可将多个查询结果合并。掌握这些高级应用技巧,可以更加高效地利用SQL查询复杂的数据。 此外,教程还介绍了SQL的数据操作语言(DML)和数据定义语言(DDL),以及对权限的管理和控制。数据操作语言包括SELECT、INSERT、UPDATE、DELETE等命令,用于操作和管理数据库中的数据;数据定义语言包括CREATE、ALTER、DROP等命令,用于管理数据库的结构和定义。 通过学习这本教程,我掌握了SQL的基本概念和语法,了解了SQL数据库管理中的重要性和应用场景。我能够使用SQL语言数据库中的数据进行各种操作,并且能够通过SQL优化查询语句,提高查询效率。这本教程为我进一步学习和应用SQL打下了坚实的基础。 ### 回答3: SQL(Structured Query Language)是一种用于管理和操作关系数据库的标准化语言。在SQL基础教程中,我学到了许多关于SQL的重要概念和技术。 首先,我学习了SQL的起源和发展历史。SQL最初是由IBM的Edgar F. Codd在20世纪70年代提出的,旨在为关系数据库提供一个通用的查询语言。随着时间的推移,SQL逐渐成为了关系数据库管理系统(RDBMS)的行业标准。 其次,我学习了SQL基本语法查询操作SQL通过使用不同的关键字和语句来查询操作数据库。我学会了使用SELECT语句来检索数据,使用FROM和WHERE子句来指定数据来源和筛选条件。我还学会了使用INSERT、UPDATE和DELETE语句来插入、更新和删除数据。 在SQL基础教程中,我还学习了如何创建和管理数据库表。我学会了使用CREATE TABLE语句来创建表,并定义表的列和数据类型。我还学会了使用ALTER TABLE语句来修改表的结构,并使用DROP TABLE语句来删除表。 此外,我还学习了如何使用SQL来处理表之间的关系。我学会了使用JOIN语句来合并多个表,并通过指定关联条件来检索符合要求的数据。我还学会了使用GROUP BY和HAVING子句来对数据进行分组和过滤。 在SQL基础教程中,我还学习了如何使用SQL来创建和管理索引。索引可以提高查询的性能,我学会了使用CREATE INDEX语句来创建索引,并使用DROP INDEX语句来删除索引。 总之,SQL基础教程帮助我建立了对SQL语言的基本理解和技能。我认为SQL是一个非常重要的技能,在处理和管理数据库时非常实用。通过学习SQL,我可以更有效地查询操作数据库,提高数据管理和分析的效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值