第五章 数据表的数据操作(DML)(第一部分)
此篇是select的基本操作
5.1 查询数据
查询就是对已经存在于数据库中的数据按特定的组合,条件或次序进行检索
查询功能是数据最基本也是最重要的功能
5.1.1 查询单列数据(select)
查询学生信息表中的学号
use stu -- 查询学生信息表学生姓名 select 姓名 from 学生信息表
5.1.2 查询多列数据
查询学生学号,姓名,籍贯
select 学号,姓名,籍贯 from 学生信息
5.1.3 查询所有列
查询学生信息表学生的全部信息
select * from 学生信息表
5.1.4 使用去重查询(distinct 关键词查询)
如果用户希望在查询返回结果中删除重复的行就可以在select句中使用distinct关键字
-- 用法 select distinct 列名 from 表名称 select distinct 籍贯 from 学生信息表
5.1.5 使用top关键字查询
top语句用于规定要返回的记录的数目
例子:查询前8列的学生籍贯的信息,且要求去重
-- 语法 select top num * | column from table select distinct top 8 籍贯 from 学生信息
例子:查询前三条记录在学生表中
select top 3 * from 学生信息表
5.1.6使用别名查询(本质:将查询结果返回表的列名重命名)
使用select语句查询数据的时候,可用别名的方法根据需要对数据显示的标题进行修改,主要由三种方法
1. 在列的表达式中给出别名
-- 语法: select 列名 '别名' from 表名 select 学号 'NO' from 学生信息
2.使用'='表达式
-- 语法:select '别名' = 列名 from 表名 select 'NO' = 学号 from 学生信息表
3.使用as关键字(比较常用的形式)
-- 语法: select 列名 as '别名' from 表名 select 学号 as 'NO' from 学生信息表
5.1.7 在查询的结果进行再次的计算
例: 将学生信息表中查询学号和成绩,成绩-10的三列数据
select 学号, 成绩 as '调整前成绩' , 成绩-10 as '调整后成绩' from 学生信息表
5.2 选择查询
一般查询都是针对全表所有行进行查询,
但如果我们只是从整个表中选出满足指定条件的行,这就要用到where子句
/* 选择的基本语法 select 列名 from 表名 where 选择条件 */
5.2.1选择条件中需要用到的比较运算符
=(等于) >(大于) <(小于) >=(大于且等于) <=(小于且等于) <>(不等于) !>(不大于) !<(不小于) !=(不等于)
利用比较运算符在选择条件的运用例子
例:查询籍贯是北京的学生信息
select * from 学生信息 where 籍贯 = 'beijing'
例:查询成绩及格学生信息情况
select * from 成绩表 where 成绩>=60
5.2.2选择条件中需要用到的逻辑运算符
and 两边条件同时满足
or 两边条件满足其中一个即可
利用逻辑运算符在选择条件的运用例子
例:查询籍贯是北京且性别为男的学生信息
select * from 学生信息表 where 性别 = '男' and 籍贯 = 'beijing'
例:找出籍贯为安徽或北京的学生
select * from 学生信息表 where 籍贯 = 'anhui' or 籍贯 = 'beijing'
5.2.3 范围搜索条件
范围搜索返回介于两个指定值之间所有值,可分为包括范围和排他范围两种类型
between 值1 and 值2, not between 值1 and 值2
between 的选择条件范围的左右边界值都包含在内
例:查询成绩在70到90(包含70和90)之间的学生信息
select * from 成绩表 where 成绩 between 70 and 90
5.2.4 列表搜索条件
使用关键字in构成列表中来匹配对应关系表中匹配的行
例:找出籍贯为安徽或北京的学生
select * from 学生信息表 where 籍贯 in ( 'anhui' , 'beijing')
tip:
在很多时候用in比用=好因为它允许多个值和一个值,而=只能允许一个值,如果套用字句由多个结果,使用=就会出现语法错误
属性 in (值1,值2) 相当于 属性 = 值1 or 属性 = 值2
属性 between 值1 and 值2 相当于 属性 >= 值1 and 属性 <= 值2
5.2.5 选择条件中的字符匹配
Like关键字搜索于指定模式匹配的字符串,日期或时间值.
模式包含要搜索的字符串,字符串中可包含4种通配符的任意组合
| 通配符 | 含义 |
| % | 替代零个或多个字符 |
| - | 仅替代一个字符 |
| [] | 代替指定范围内的单个字符,[]中可以是单个字符(如[acef]),也可以是字符范围(如[a-f]) |
| [^] | 代表不在指定范围内的单个字符,[^]中可以是单个字符(如[^acef]),也可以是字符范围(如[^a-f]) |
例:查询出名字当中包含大或小的学生
--第一种写法 select * from 学生信息表 where sname like '%大%' or sname like '%小%' --第二种写法 select * from 学生信息表 where sname like '%[大小]%'
例:查询出姓张或姓王且名字为一个字
select * from 学生信息表 where sname like '[王张]_'
5.2.6 涉及空值查询
空值(null)在数据库中表示不确定的值
如学生选修课程后还没有考试是,考试成绩就是null,因为成绩还不能确定
判断某值是否为null值,不能使用普通的比较运算符
判断取值为空的语句格式为
列名 is null
判断取值不为空的语句格式为
列名 is not null
5.3 聚合函数
聚合函数对一组值执行计算,并返回单个值.T-SQL提供下列的聚合函数
| 聚合函数的语法 | 作用 |
| sum([distinct]<列名>) | 计算列值总和 |
| avg([distinct]<列名>) | 计算列值平均值 |
| max([distinct]<列名>) | 求列的最大值 |
| min([distinct]<列名>) | 求列的最小值 |
| count(*) | 统计表中的记录个数 |
| count([distinct]<列名>) | 统计属性的列值个数 |
上述函数中处理count(*)外,其他函数在计算过程中均忽略null值
5.3.1 在select中使用聚合函数
语法 select 聚合函数 from 表名
例:求成绩表中的总成绩
select sum(成绩) as '总成绩' from 学生成绩表
例:求成绩表中的平均值
select avg(成绩) as '平均成绩' from 学生成绩表
例:求学生成绩表中的最大值
select max(成绩) as '最高分' from 学生成绩表
例:求学生成绩表中的最小值
select min(成绩) as '最低分' from 学生成绩表
例:求学生信息表中学生总人数
select count(*) as '学生总人数' from 学生信息表
例:求学生成绩表中学生总人数(表中每个学号对应多个成绩)
select count(distinct 学号) as '学生总人数' from 学生信息表
5.4 数据分组
针对的列值不能是唯一的
group by 语句用于结合聚合函数中的函数,比如向学生成绩表中1个学号对应多个学科成绩,那么我们学号来给每个学生分组,然后结合特定的聚合函数来求想要的数据
例:查询每个年级的总人数和班级数量
/* 语法格式: seelct 列名, 聚合函数中的合计函数 from 表名 group by 列名 --注意这里的列名于select开头的列名一致 */ select 年级,sum(人数) as 年纪总人数 ,count (班级编号) as 班级数量 from 班级信息 group by 年级
例:查询每门课的最高分和最低分
select 课程编号 , max(成绩) as '最高分' , min(成绩) as '最低分' from 成绩表 group by 课程编号
5.4.1 分组语句中的条件查询
having通常与group by 子句一起使用,相当于一个用于分组的where自居,指定组的搜索条件.
having子句可以包含聚合函数,但是where不可以
select 学号,sum(成绩) from 成绩表 group by 学号 having sum(成绩)<600
5.5 对查询结果进行排序
使用关键字 order by 语句用于对指定的结果进行排序
order by 语句默认升序
降序排序可以使用 desc关键字 升序关键字为asc
例:对成绩表中的数学科目进行降序排序
select * from 成绩表 where 科目 = '数学' order by 成绩表[desc]
5.6 select语法总结
select select_list
from table_list
[where search_conditions]
[group by group_by_list]
[having search_conditions]
[order by order_list [ASC | DESC]]
其中顺序不能弄反
浙公网安备 33010602011771号