您的位置:首页 > 数据库

数据库查询(数据库原理8)

2019-06-18 23:58 1401 查看

数据库查询

目录

一、select查询语法
二、简单查询
三、分组和汇总
四、连接查询
五、子查询
六、其他查询
七、在数据操作中使用select子句

一、select查询语法

1、查询语法格式:

select { select_list [ into new_table_name ] }
from { table_list | view_list }
[ where { search_conditions } ]
[ group by { group_by_list } ]
[ having { search_conditions } ]
[ order by { order_list [ asc | desc ] } ]

2、语法格式中参数的含义

  • select-list:查询的列的名称,多个列用逗号“,”隔开
  • into new_table_name:用查询到的结果创建一个新表,new_table_name为新表的表名
  • from { table_list | view_list}:查询的列在哪个表或者视图中
  • where { search_conditions }:筛选条件
  • group by { group_by_list }:用后面的条件进行分组
  • having { search_conditions }:使用group by后使用,对组进行筛选
  • order by:对查询的结果集进行升序或者降序排序

二、简单查询

1、投影查询: 查询的是列
(1)、投影查询的格式

select [ all | distinct ] [ top n [ percent ] ]
{ * | { { column_name | expression | identitycol | powguidcol }
[ [ as ] column_alias ] | column+alias = expression } [ ,…n ] }

(2)、参数定义:

  • all:查询所有记录,包括重复行,默认就是all
  • distinct:显示所有记录,不包括重复行
  • top n [percent] :返回前n行或者前百分之n行
  • *:表示 所有的列
  • column_name:要查询的列的名称
  • expression:列名、常量、函数、表达式或者子查询
  • column_alias:列别名(随便取一个名字)

(3)、使用Teaching数据库的一些查询

use teaching
--从student表中查询姓名、性别、专业
select sname,ssex,specilalty from student

--从course表中查询所有记录
select * from course

--从student表中查询专业名称,滤掉重复行
select distinct specialty from student

--从course表中查询前50%行的信息
select top 50 percent * from course

(4)、改变查询结果中的显示标题

  • 使用“=”来连接列表达式
  • 使用as 关键字来连接列表达式和列别名
use teaching
select sno as 学号 , sname as 姓名 from student
select 学号=sno,姓名=sname from student
select 学号=sno,sname as 姓名 from student

(5)、计算列值: 计算的列并不在表中,仅仅展示一下,不进行存储

select sno,cno,score150=sccore*1.50 from sc

2、选择查询: 查询的是行,用where筛选满足条件的行
(1)、选择查询语法格式

select select_list from table_list where searcch_conditions

(2)常用的查询条件

查询条件 谓词
比较运算符 =、>、<、>=、<=、!=、<>、!>、!<
确定范围 between and、and、not between and
确定集合 in、not in
字符匹配 like、not like
空值 is null、is not null
多重条件 and、or、not

<>等价于!=都是不等于
(3)、使用关系表达式: 使用比较运算符的表达式
(4)、使用逻辑表达式: 使用多重条件与(and)、或(or)、非(not)的表达式
(5)、使用between关键字

selec * from sc where score not between 80 and 90 --查询成绩不在80到90之间的所有信息

(6)、使用in关键字
语法格式:

表达式 [ not ] in (表达式1,表达式2 [ ,…,表达式n ] )

示例:

--从student表中查询专业为计算机和网络的姓名、学号、和专业
select sname,sno,specialty from student where specialty in ('计算机','网络')

(7)、使用like关键字(模糊查询): 配合通配符使用

通配符 含义
% 包含零个或者多个字符的任意字符串
_ 任意单个字符
[ ] 代表指定范围的单个字符,[ ]内可以是单个字符[abc],也可以是字符范围[a-f]
[ ^ ] 代表不在指定范围内的单个字符,[ ^] 可以是单个字符[ ^ a b c ],也可以是字符范围[ ^ a - f]

使用示例:

  • like ‘ab%’——以ab开头的任意字符串
  • like ‘%a’——以a结尾的任意字符串
  • like ‘%ab%’——包含ab的任意字符串
  • like ‘_a’ ——以a结尾的2个字符的字符串
  • like ‘[ ab]%’——以a或b开头的任意字符串
  • like ‘[a-c]ing’——以ing结尾并且第一个字母在a到c中选一个的字符串
  • like ‘m[ ^ c ]%’——以m开头并且第二个字母不是c的任意长度的字符串

(8)、is [ not ] null (是[否]为空)查询: 在where子句中不能使用比较运算符对空值进行判断,要使用空值表达式

语法格式:

表达式 is [ not ] null

示例:

select * from sc where score is null --查询成绩为空的学员信息

(9)、复合条件查询: 结合与或非使用

--查询专业为计算机或者通信的所有女生的信息
select * from student where sex='女' and (specialty='计算机' or specialty='通信')

3、聚合函数查询: 常用的聚合函数表

函数名 功能
sum(列名) 列的总和
avg(列名) 对列求平均值
min(列名) 列的最小值
max(列名) 列的最大值
count(列名) 列的数据项数
count(*) 找到的行数

三、分组和汇总

1、分组查询: 是聚合函数和group by子句相结合实现的查询
(1)、分组查询语法格式

[ group by { [ all ] group_by_expression [ , …n ] } [ with { cube | rollup } ] ]

(2)、参数说明:

  • all:包含所有组的结果,甚至包含哪些不满足where子句指定的搜索条件的组和结果
  • group_by_expression:执行分组的表达式
  • cube:返回由group by指定的列外,还返回按组统计的行,返回的结果先按分组的第一个条件列排序显示,再按第二个条件列排序显示
  • rollup:只返回最高层的分组列(即第一个分组列)的统计数据

(3)、简单分组: group by子句中没有使用cube和rollup关键字

--查询男生和女生数
select sex,count(sex) as 人数 from student group by sex
--查询修理2门及以上课程的学生和学号的学号和选课数
select sno,count(cno) as 选修课程 from sc group by sno having count(cno)>=2

(4)、having和where的区别:

  • having:对group by子句使用,且条件使用聚合函数
  • where:对行进行筛选,条件不能使用聚合函数

(5)、cube的使用

  • cube指定在结果集内不仅包含有group by提供的行,还包含汇总行
  • group by 汇总行针对每个可能的组合子组组合在结果集内返回
  • group by汇总行在结果集中显示为null,但用来表示所有值
  • 使用grouping函数可确定结果集内的空值是否为group by汇总值
select cno,avg(score) as '平均成绩' ,count(sno) as '选修人数' from sc group by with cube

(6)、rollup的使用

  • rollup指定在结果集内不仅包含有group by提供的行还包含会总行,按层次结构顺序,从组内的最低级别到最高级别汇总组
  • 组的层次结构取决于列分组时指定使用的顺序
  • 更改列分组的顺序会影响在结果集内生成的行数
select specialty,se,count(*) as '人数' from student group by specialty,sex with rollup

2、数据汇总
(1)、在select语句中使用聚合函数,结果集全是聚合值,没有明细值
(2)、为了解决(1)的问题,使用compute子句
(3)、使用compute时,查询结果由两部分组成,前一部分是没有使用compute子句产生的结果集;后一部分只有一行,是由compute子句产生附加的汇总数据,出现在整个结果集的末尾
(4)、语法格式:

[ compute { 聚合函数名 ( expression ) } [ ,…n ] [ by expression [ ,…n ]] ]

注意:avg、count、max、min、sum这些函数均会忽略null值,且distinct选项不能在此使用

select sno,sname,sex from student where specialty = '计算机' compute count(sno)

四、连接查询

1、内连接: 默认就是内连接

  • 把两个表连接到一起形成第三个表,使用inner join关键字
  • 语法格式:

select select_list from 表1 inner join 表2 on 连接条件

2、自连接: 自己连自己

  • 在同一张表内可以进行自连接
  • 将同一个表的不同行连接起来
  • 自连接可以看作是一张表的两个副本之间的连接
  • 在自连接中,必须为表指定两个别名,使之在逻辑上成为两张表
select * from student a inner join student b on a.sname=b.sname and a.sno<>b.sno

3、外连接
(1)、外连接分类:

  • 左外连接:以左表为基准,左表不加限制

select select_list from 表1 left [ outer ] join 表2 on 表1.列=表2.列

  • 右外连接:以右表为准,右表不加限制

select select_list from 表1 right [ outer ] join 表2 on 表1.列=表2.列

  • 全外连接:所有行都包含在结果集中,都不加限制

select select_list from 表1 full [ outer ] join 表2 on 表1.列=表2.列

4、交叉连接:

  • 笛卡尔积,返回两个表的乘积,结果中事两张表的组合
  • A表中有4条数据,B中有6条数据,结果中就有24条数据
  • 使用cross join关键字

select 列 from 表1 cross join 表2

五、子查询

1、子查询: 就是将增删改查嵌套在其他语句中,使用条件:当一个结果依赖于另一个查询的结果时,只执行一次
2、无关子查询: 执行不依赖与外部查询,先执行子查询得到结果提供给外部查询使用

  1. 比较子查询: 使用比较运算符判断结果是为true或false的查询
  2. some、any、all、in和not in子查询: some、any、all配合比较运算符使用,测试比较值是否与子查询所返回的全部或一部分值匹配,比如:<=all(小于每一个返回的值),<=any(小于返回的任何一个值),结果也是true或false,some和any是同义词。in=any,not in=<>any
  3. 子查询结果作为主查询的查询对象

3、相关子查询: 子查询依赖于外部查询。重复执行
(1)、比较子查询
(2)、exists(存在性测试)

六、其他查询

1、集合运算查询:
(1)、union联合查询: 将多条select查询组合成一条
条件:所有查询中的列数和列的顺序必须相同;数据类型必须兼容
语法格式:

select select_list union [ all ] select_statement [ union [ all ] select_statement […n ] ]

select_statement 20000 :参与查询的select语句
(2)、except和intersect查询
语法格式:

select_statement { except | intersect } select_statement

2、对查询结果排序
语法格式:

[ order by { order_by_expression [ asc | desc ] } [ ,…n] ]

3、存储查询结果
语法格式:

select select_list into new_table from table_source [ where search_condition ]

七、在数据操作中使用select子句

1、在insert语句中使用select子句

insert [ into ] table_name [ (column_list) ] select select_list from table_name [ where search_condition ]

2、在update语句中使用select子句

update table_name set { column_name = { expression } } [,…n ] [ where { condition_expression } ]

3、delete语句中使用select子句

delete [ from ] table_name [ where { condition_expression } ]

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: