数据库查询操作
Posted needoffer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库查询操作相关的知识,希望对你有一定的参考价值。
1.distinct 消除取值相同的行。
2. in 列名 [not] in (常量1, 常量2...) 确定某个属性的值是否在一个集合范围内。
3.字符串匹配。
like : 列名 【not】 like < 匹配串>
匹配字符串可以包含字符常量,也可以包含如下四种通配符。
① _ : 匹配任意一个字符。
②%:匹配0个或多个字符。
③[ ]:匹配"[ ] " 中的任意一个字符。如[acdg]表示匹配a、c、d、g中的任何一个。对于连续字母的匹配,例如[abcd],则可以简写为[a-d]。
④[^]:不匹配 [ ]中的任意一个字符。如[^abcd]表示不匹配a、b、c、d。对于连续字母的匹配,例如[^abcd],则可以简写为[^a-d]。
4.rtrim 去除指定列中尾随的空格,返回没有尾随空格的数据。
select sname from student where rtrim(sname) like ‘王_‘
5.空值查询 null /not null
6.排序 order by 列名 [ASC|DESC] [.....]
ASC 升序, DESC降序 不指定的话则默认为升序。
select * from student order by sage asc
7.聚合函数
① count(*)统计表中元组的个数。 select count(*) from student
②count([DISTINCT]<列名>);统计本列非空 列值个数,distinct表示不包括列的重复值。 select count(distinct sno) from sc
③sum(列名)计算列值总和(必须输数值型列)select sum(grade) from sc where sno=‘123‘
④avg(列名)计算列值平均值(必须输数值型列) select avg(grade) from sc where cno=‘1‘
⑤max(列名)求列值平均值 (可以不是数值型) select max(grade) as 最高分 ,min(grade) as 最低分 from sc where cno=‘1‘
⑥min(列名)求列值最小值(可以不是数值型)
上述函数除了count(*)以外,在计算过程中都会忽略null值。
聚合函数的计算范围可以是满足where子句条件的记录。
聚合函数不能出现在where子句中。 例如 select sname from student where sage=max(sage) 是错误的
8.对查询结果进行分组统计 。group by 。
在使用group by 子句时,如果在select 语句的查询列表中包含聚合函数,则是针对每个组计算出一个汇总值,从而实现对查询结果的分组统计。
分组子句跟在where子句后面,它的一般形式为
group by 《分组依据列》【...】
【having 《组筛选条件》】
其中分组依据不能是text,ntext,image 类型。
①使用group by子句 select con as 课程号 ,count(sno) from sc group by cno.
②group by 中子句中的分组依据必须是表中存在的列名,不能使用as子句指派的结果集列别名。 例如 group by cno ,不能写成 group by 课程号
③带有group by 子句的 select 语句的查询 列表中只能出现分组依据列或 统计函数,因为分组后每个组只返回一行结果。
select sdept ,count(*) as 学生人数,avg(sage) as 平均年龄 from student group by sdept . 执行过程 1)执行where子句 ,筛选出全部女生;2)执行group by 将系相同的学生分在一组;3)对每组进行统计
④按多列分组
select sdept ,ssex,count(*) 人数 ,max(sage) 最大年龄 from student
group by sdept ,ssex
order by sdept
9.使用having子句
having子句对于分组后的子句在进行筛选,他的功能有点像where子句,但他用于组而不是单个记录。在having子句中可以使用聚合函数对分组后的数据仅筛选,但是在where子句中则不能。having通常与group by 子句一起使用。
select sno,count(*) 选课门数 from sc
group by sno
having count(*) >3
执行过程 先执行group by 子句对sc表数据按sno进行分组,然后在用统计函数count分别对每一组进行统计,最后筛选出统计结果满足大于3的组。
select sno,count(*) ,avg(grade)
from student
where ssex=‘男‘
group by sdept
having avg(grade)>=80
执行过程:①执行where 子句,挑选出全部男生②执行group by子句,将相同系学生放在一个组;③执行聚合函数,每组产生一个统计值;④执行having子句,筛选出满足条件的结果。
10 .where 与group by 与 having 的执行顺序
where 子句用来筛选from子句中指定的数据源所产生的行数据
group by 子句用来对经过where子句筛选后的数据进行分组
having 子句用来对分组后的结果数据在进行筛选
对于可以在分组操作之前应用的搜索条件,在where子句中指定 他们更有效,这样可以减少参与分组的数据行。在having子句中自定的搜索条件应该是hi那些必须在执行分组之后应用的搜索条件。因此建议将所有应该在分组前进行的搜索条件放在where子句而不是在having中。
例如
select sdept ,count(*) from student
group by sdept
having sdept in(‘计算机系‘)
/**************-
select sdept ,count(*) from student
where sdept in(‘计算机系‘)
group by sdept
后者效率比前者高
11.多表连接查询
①内连接
theta连接和ansi连接
内连接格式
from 表一 【inner】 join 表2 on 《连接条件》
连接过程:先去表一中的第一个元组,然后从头扫描表二。逐一查找满足连接条件的元组,找到后就将表一中值你这个的第一个元组和噶元祖拼接,形成结果表中的一个元组。表二全部查找完毕后,在取表一中多的第二个元组,然后在表二中从头扫描,逐一查找满足满足连接条件的元组,找到后就将表一中的第二个元组与该元组拼接起来,形成结果表中的另一个元组。重复这个过程,直到表一中的全部元组都处理完毕。
select * from student inner join sc on student.son =sc.sno
查询结果会包含相同的列。即会有两个sno
可以为表起别名
select sname ,cno from student s join sc on s.sno=sc.sno
注意:当为表起别名后,在查询语句的其他地方,所有用到表名的地方都要用别名,不能使用原名。
没连接一张表就要一个join
select sname ,cno from student s
join sc on s.sno=sc.sno
join course c on c.cno=sc.cno
②自连接
自连接是一种特殊的内连接,他狮子相互连接的表在物理上为同一张表,但是在逻辑上将其看成两张表。
要让物理上的一张表在逻辑上成为两张表,必须通过为表起别名来实现。
③外连接
外连接是只限制一张表中的数据必须满足连接条件,而一张表中的数据可以不满足。
ansi方式的外连接格式
from 表一 left 或right 【outer】 join 表二 on 《连接条件》
left 为左外连接 ,right 为右外连接。left限制表二的数据必须满足连接条件,不关表一中的数据,right限制表一中的数据满足条件,不关表二。
theta 方式的外连接格式
左外连接 from 表一 ,表二 where 【表一.】列名(+)=【表二.】列名
又外连接 from 表一 ,表二 where 【表一.】列名=【表二.】列名(+)
12. TOP 限制结果集
格式
top n 【percent】 【with ties】
with ties 表示包含并列的结果
top 谓词写在select 单词的后边(如果有distinct ,则在distinct 后面),查询列表的前面
select top 3 sname from student order by sage desc
注意:如果top 中使用with ties ,则要求必须使用order by 对查询结果进行排序,否则胡出现语法错误。但是如果没有实现with ties ,则可以不使用order by 。
13.子查询
在SQL语言中,select-from-where称为一个查询块。
如果一个select语句嵌套在一个select、insert 、update 或delete中,则称之为子查询或者是内层查询。
为了与外查询区别,子查询写在()中。
1)使用子查询进行基于集合的测试
格式
where 表达式 【not】 in(子查询)
执行步骤:先执行子查询,然后在子查询的结果基础上再执行外层查询。子查询返回的结果实际上就是一个集合,外层查询在这个集合上使用in进行比较。
2)使用子查询 进行比较测试
where 表达式 比较运算符(子查询)。
注意:使用子查询进行比较测试时,要求子查询语句必须是返回单值的查询语句。
3)使用子查询进行存在性测试
where 【not】exists (子查询)
exists 表示存在则为真,不存在则为假
select sname from student
where exists (
select * from sc
where sno =student.sno
and cno=‘001‘)
带exists的查询是先执行外查询,然后在执行内查询。由外查询的结果来决定内查询的结果,内层查询的执行次数由外查询结果决定。
注意:多表连接的查询效率比子查询的效率高,因为查询优化器可以对多表连接查询进行更多的优化。
14 插入数据
insert 【into】 《表名》【(《列表名》 )】 value(..)
15 更新数据
update 《表名》 set 《列名》=表达式
【where 更新条件】
16.删除
delete 【from 】 《表名》【where 删除条件】
17.将查询结果保存到新表
select 查询列表序列 into 《新表名》
from 数据源
......其他语句
《新表名》是要存放查询结果的表名。这个语句将查询的结果保存在一个新表中。实际上这个语句包含两个功能
第一是根据查询语句产生的列名和类型创建一个新表
第二是执行查询语句并将结果保存到新表
select sdept ,count(*) as num into sdept_table
from student
group by sdept
注意:必须为 count(*)起别名 ,否则无法创建新表,因为新表的列名要根据查询结果产生。
18.case 表达式
1)简单case表达式
格式
case 表达式
when 表达式 1 then 结果1
.......
when 表达式n then 结果n
【else 结果】
end
为指定else 子句,则返回null
select s.sno ,sname
case sdept
when ‘计算机系 ‘ then ‘CS‘
when ‘ 信息系‘ then ‘IM‘
when ‘数学系‘ then ‘MA‘
end as 所在系 , grade 成绩
from student s join sc on s.sno=sc.sno
2)搜索case
格式
case
when 布尔型 表达式 1 then 结果1
.......
when 布尔型表达式n then 结果n
【else 结果】
end
select s.sno ,sname
case
when sdept=‘计算机系 ‘ then ‘CS‘
when sdept=‘ 信息系‘ then ‘IM‘
when sdept= ‘数学系‘ then ‘MA‘
end as 所在系 , grade 成绩
from student s join sc on s.sno=sc.sno
select sno grade ,
case
when grade>=90 then A
when grade between 80 and 89 then B
when grade between 70 and 79 then C
when grade between 60 and 69 then C
when grade<60 then E
end as 等级
from sc where cno =‘c001‘
19. 查询结果的并运算 union
union操作与join操作不同。union是将一个查询结果追加到另一查询结果中。join 是水平的合并数据。union是添加行,join是添加列。
格式
select 语句1
union 【all】
select 语句 2
union 【all】
....
select 语句 n
其中 all 表示在结果集中包含所有查询语句产生的全部记录,包括重复的记录,如果没有指定all 那么系统则默认的删除合并后的结果集中的重复记录。
注意:
①各select语句中的查询列个数必须相同,而且对应的语以应该相同。
②各select 语句汇总的每个列的数据类型必须与其他查询语句中对应的数据类型是隐式兼容的,即只要他们能进行隐式转换就行。
③合并后的结果集将采用第一个select 语句的列标题
④如果要对查询的结果进行排序,则order by 子句应该写在最后一个查询语句之后,且排序列名应该死第一个查询语句中出现的列名。
select cname ,semester from course c
join sc on c.cno=sc.cno
join student s on s.sno=sc.sno
where sname=‘Lily‘
union
select cname ,semester from course c
join sc on c.cno=sc.cno
join student s on s.sno=sc.sno
where sname=‘Tom‘
20 交运算 intersect
交运算是返回同时在两个计划出现的记录,即返回两个查询结果集合中各个列的值均相同的记录,并用这些记录构成交运算的结果。
格式
select 语句1
intersect
select 语句2
intersect
.........
select 语句 n
21.差运算 except
差运算是返回在一个集合中有,但在另一个集合没有的记录。
select 语句1
except
select 语句2
except
.........
select 语句 n
以上是关于数据库查询操作的主要内容,如果未能解决你的问题,请参考以下文章
RedisRedis 数据库操作 ③ ( Redis 键操作 | 连接数据库 | 向数据库中添加值 | 查询所有键 | 查询键存在 | 查询键类型 | 删除键 | 设置键过期时间 )