数据库查询操作

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

原文地址:https://www.cnblogs.com/needoffer/p/10850170.html

时间: 2024-11-09 09:23:21

数据库查询操作的相关文章

数据库查询操作(fetchone,fetchall)

数据库查询操作 Python查询Mysql使用 fetchone() 方法获取单条数据, 使用fetchall() 方法获取多条数据. fetchone(): 该方法获取下一个查询结果集.结果集是一个对象 fetchall():接收全部的返回结果行. rowcount: 这是一个只读属性,并返回执行execute()方法后影响的行数. fetchone() : 返回单个的元组,也就是一条记录(row),如果没有结果 则返回 None fetchall() : 返回多个元组,即返回多个记录(row

DDL数据库查询操作学习

一 数据库初识 l SQL是Structured Query Language(结构化查询语言)的缩写. l SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言. 在使用它时,只需要发出“做什么”的命令,“怎么做”是不用使用者考虑的. 二 数据库的组成 l 1.一个SQL数据库是表(Table)的集合,它由一个或多个SQL模式定义. l 2.一个SQL表由行集构成,一行是列的序列(集合),每列与行对应一个数据项. l 3.一个表或者是一个基本表或者是一个视图.基本表是实际存储在数据

简单的数据库查询操作

格式: select <目标列名序列>    ---需要哪些列from <表名>        ---来自于哪些表where <行选择条件>    ---根据什么条件group by <分组依据列>having <组选择条件>order by <排序依据列> select * from student select * from student where sno = '1' select * from student s,cours

mysql数据库查询操作

数据查询语言 SELECT 列名1,列名2...FROM 表名 [WHERE条件] 查询所有字段用* 不带where条件就把表的所有记录查出来 =    //赋值和判断都是 !=   <> //两种不等于 <  >   <=    >= OR 或者 || AND 且 && BETWEEN 5 AND 10 IN NOT IN LIKE  '%值%' 一些简单的查询,以user表为例,sex->0表示男,1表示女 查询所有 sleect * from

数据库查询操作练习

CREATE TABLE `student` ( `sno` varchar(20) NOT NULL COMMENT '学号', `sname` varchar(20) NOT NULL COMMENT '学生姓名', `ssex` varchar(20) NOT NULL COMMENT '学生性别', `sbirthday` datetime DEFAULT NULL COMMENT '学生出生年月', `class` varchar(20) DEFAULT NULL COMMENT '学

Python操作mysql数据库查询操作时提示“unread-result-found”

原因描述: 当Windows操作系统损坏时,会出现"unread-result-found"错误,比如启动程序将会变慢,响应时间将会延迟.当运行多个应用程序时,可能会遇到崩溃和死机.这个错误可能有很多原因,包括过多的启动条目.注册表错误.硬件/RAM下降.碎片文件.不必要的或冗余的程序安装等等. 解决方法: 为了解决刚才提到的问题,您可以显著地提高机器的速度.为了修复错误和提高PC速度,建议您下载' mysql .connect .error .internalerror Unread

5- MySQL数据库查询操作

复习: 数据类型: 数值型:整数(int,tinyint,smallint,bigint,mediumint) 浮点型(float ,double,decimal) 字符型:char ,varchar,text. 日期时间,date,time,datetime,timestamp. 创建表:create table表名 原文地址:https://www.cnblogs.com/Chamberlain/p/10970786.html

数据库表的查询操作实践演练(实验三),数据库演练

继前两次的实验,本次实验以熟练掌握利用select语句进行各种查询操作:单表查询.多表连接及查询.嵌套查询.集合查询等,巩固数据库查询操作.下面就跟着小编一起练习吧!在实验一创建并插入数据的表(Student, Course,SC,Teacher,TC)的基础上,完成以下操作.(1)将教师‘罗莉'的名字改为‘罗莉莉'.复制代码 代码如下:update Teacher set tname='罗莉莉' where tname='罗莉'(2)将两个同学(数据自己临时设置,用后即删除)的两门课程的成绩以

bottle框架学习(八)之Mysql数据库的操作

MySQLdb 是用于Python连接Mysql数据库的接口. 安装MySQLdb [[email protected] bottle]# yum install MySQL-python –y 如果使用编译安装请到这里下载安装包https://pypi.python.org/pypi/MySQL-python并执行以下命令 [[email protected] bottle]# gunzip  MySQL-python-1.2.3.tar.gz [[email protected] bottl