数据库查询
目录
一、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、无关子查询: 执行不依赖与外部查询,先执行子查询得到结果提供给外部查询使用
- 比较子查询: 使用比较运算符判断结果是为true或false的查询
- some、any、all、in和not in子查询: some、any、all配合比较运算符使用,测试比较值是否与子查询所返回的全部或一部分值匹配,比如:<=all(小于每一个返回的值),<=any(小于返回的任何一个值),结果也是true或false,some和any是同义词。in=any,not in=<>any
- 子查询结果作为主查询的查询对象
3、相关子查询: 子查询依赖于外部查询。重复执行
(1)、比较子查询
(2)、exists(存在性测试)
六、其他查询
1、集合运算查询:
(1)、union联合查询: 将多条select查询组合成一条
条件:所有查询中的列数和列的顺序必须相同;数据类型必须兼容
语法格式:
select select_list union [ all ] select_statement [ union [ all ] select_statement […n ] ]
select_statement:参与查询的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 } ]