数据库查询操作

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

 

以上是关于数据库查询操作的主要内容,如果未能解决你的问题,请参考以下文章

Django ORM数据库查询操作

Django ORM数据库查询操作

MySQL 数据库聚合查询和联合查询操作

Mysql基础专题08-数据库的查询操作

如何查询oracle数据库的操作记录

RedisRedis 数据库操作 ③ ( Redis 键操作 | 连接数据库 | 向数据库中添加值 | 查询所有键 | 查询键存在 | 查询键类型 | 删除键 | 设置键过期时间 )