【学习数据库】SQL语句之查询


举例用到的三个表

Student表

在这里插入图片描述
学生表,信息有学号,姓名,性别,年龄,系部

SC表

选课表
选课表,信息有学号,课程号,成绩

Course表

课程表
课程表,信息有课程号,课程名字,先行课,学分


符号说明

【N】自定义的名字
【C】目标列名
【T】目标表名
【B】对列名使用的表达式

表达式 含义
2020-Age 2020减age的值
UPPER(name) 将name的值大写输出
LOWER(dep) 将dep的值小写输出

【F】对列名使用的条件

条件 含义
grade between 65 and 75 grade列中值在65至75之间(包括65,75)
sex!=‘女’ sex列中值不为女
age=‘20’ or age=‘21’ age列中值为20或21
Cno in (‘001’,‘002’) Cno列中值在集合{001,002}中
Sdep not in (‘5’,‘6’) Sdep列中值不在集合{5,6}中
Grade is null Grade列的值是空
Grade is not null Grade列的值不空

【M】模糊查询

表达式 含义
梁% 值的开头第一字必须是梁
梁_ 值必须是两个字,第一个字是梁
%梁% 值里有梁字
_梁_ 值必须是三个字,第二个字是梁
_梁% 值的第二个字是梁
%梁_ 值的倒数第二个字是梁

【H】库函数查询

函数名 功能
SUM(《all/distinct》【C】/【B】) 返回列C或表达式B的值的总和,distinct代表消除重复组
AVG(《all/distinct》【C】/【B】) 返回列C或表达式B的值的平均值
MIN(【C】/【B】) 返回列C或表达式B的值的最小值
MAX(【C】/【B】) 返回列C或表达式B的值的最大值
COUNT(*) 返回行数
COUNT(《all/distinct》【C】) 返回列C的记录数

单表查询

语句 作用
select【C】,【C1】…from【T】 在表T中展示列C,C1的信息
select * from【T】 在表T中展示所有列的信息
select【B】《as/空格》【N】from【T】 在表T中展示对列使用表达式B之后的信息,得到新列的名字为N
select《distinct》【C】from【T】 在表T中展示列C的信息,并消除重复行
select【C】from【T】where【F】 查询表T中满足条件F的行,并展示对应列C的信息
select【C】from【T】where【C1】《like/not like》【M】 在表T中模糊查询列C1的值《满足/不满足》M的行,并展示对应列C的信息
select【C】from【T】where【F】order by【C1】《asc/desc》 在表T中查询满足条件F的行,并将结果按列C1值的《升序/降序》排列,最后展示对应列C的信息
select【H】from【T】where【F】 在表T中查询满足条件F的行,使用函数H处理对应的列得到新列。
select【C】from【T】group by【C1】having【F】 将表T中列C1的值相同的行进行分组,从所有组中查询符合条件F的组,并展示对应列C的信息

技巧

  • 所有的名字不得冲突,即名字唯一,不能使用关键字
  • 名字与大小写无关,名字以字母开头
  • 一表中最多有254个列
  • 一表最多有249个索引
  • group by常和库函数结合做统计

举几个例子理解一下单表查询

  1. 统计男生中年龄大于18岁的人的个数?
select COUNT(Sno) as "大于18岁的男生人数" from Student where Sage>18

在这里插入图片描述
2. 将学生按年龄升序排列,得到对应的姓名学号?

select Sno,Sname from Student order by Sage asc

在这里插入图片描述
3.查询所有不姓李的同学学号和系部,要求系部小写输出?

select Sno, LOWER(Sdep) 小写系部 from Student where Sname not like '李%'

在这里插入图片描述
4.查询每个系人数大于1人的平均年龄?

select Sdep,AVG(Sage) as "平均年龄" from Student group by Sdep having COUNT(Sno)>1

在这里插入图片描述


多表查询

语句 作用
select【C1,C2】from【T1】cross join【T2】 在表T1和T2的笛卡尔积的结果中展示列C1,C2的信息
select【C1,C2】from【T1】inner join【T2】on【F】 在表T1和T2的连接的结果中查询满足条件F的行,并展示列C1,C2的信息
select【C1,C2】from【T1,T2】where【F】 在表T1和T2的连接的结果中查询满足条件F的行,并展示列C1,C2的信息
select【C1,C2】from【T1】inner join【T2】on【T1.C】=【T2.C】 在表T1和T2的等值连接的结果中展示列C1,C2的信息【技巧】
select【C1,C2】from【T1,T2】where【T1.C】=【T2.C】 在表T1和T2的等值连接的结果中展示列C1,C2的信息【技巧】
select【C1,C2】from【T1】left outer join【T2】on【T1.C】=【T2.C】 在表T1和T2的左外连接的结果中展示列C1,C2的信息
select【C1,C2】from【T1】right outer join【T2】on【T1.C】=【T2.C】 在表T1和T2的右外连接的结果中展示列C1,C2的信息
select【C1,C2】from【T1】full outer join【T2】on【T1.C】=【T2.C】 在表T1和T2的外连接的结果中展示列C1,C2的信息
select【N1.C1,N2.C2】from【T N1,T N2】where【N1.C2=N2.C1】 在表T自身和自身做连接的结果中展示列C1,C2的信息【技巧】
select【C1】from【T1】where【F1】union select【C2】from【T2】where【F2】 将两次查询结果并运算
select【C1】from【T1】where【F1】intersect select【C2】from【T2】where【F2】 将两次查询结果交运算
select【C1】from【T1】where【F1】except select【C2】from【T2】where【F2】 将两次查询结果差运算

嵌套查询

设【Q】= select【C】from【T】where【Q/F】或 【Q】= select【C】from【T】group by【C】having【Q/F】,则
select【C】from【T】where【Q】或 select【C】from【T】group by【C】having【Q】 是嵌套查询

可进行多层嵌套,个人感觉像递归。以下举例比较容易理解嵌套查询

any,all

名称 说明
>any 大于某个值(大于最小值)
<any 小于某个值(小于最大值)
>=any 大于等于某个值(大于等于最小值)
<=any 小于等于某个值(小于等于最大值)
!=any 不等于某个值
>all 大于所有值(大于最大值)
<all 小于所有值(小于最小值)
>=all 大于等于所有值(大于等于最大值)
<=all 小于等于所有值(小于等于最小值)
!=all 不等于所有值

查询分数最高的学生的姓名
语句

select Sname from Student where Sno in (select Sno from SC where Grade >=all (select Grade from SC))

运行结果
在这里插入图片描述

in,not in

A in B 表示集合A在B中;A not in B 表示集合A不在B中
查询选修了数学的学生姓名?
语句

select Sname from Student where Sno in (select Sno from SC where Cno in (select Cno from Course where Cname='数学'))

运行结果
在这里插入图片描述

exists,not exists

exists 查询结果为空返回false;查询结果不空返回true
not exists 查询结果为空返回true;查询结果不空返回false
查询没选课程号是1号的学生姓名
语句

select Sname from Student where not exists (select * from SC where Cno='1' and SC.Sno=Student.Sno)

运行结果
在这里插入图片描述

关联单词解释

英文 汉语 说明
select 选择 查询时使用
group by 分组 分组查询时使用
distinct 确定的,清楚的 希望数据不重复时使用
between A and B 介于A和B之间 可用对应的<=,>=替换
upper 上面的;靠上部的 字母大写输出时使用
lower 下方的;在底部的;把…放低 字母小写输出时使用
sum 归纳;总计;总结 求和时用
avg 平均为;计算出…的平均数 average的简写
min 最小值;最少量; minimum的简写
max 最大量;最大限度 maximum的简写
count (按顺序)数数;计算(或清点)总数 计数用
asc 上升;升高;登高 ascend简写
desc 下去;下降 descend简写
cross join 交叉连接
inner join 内连接
left outer join 左外连接
right outer join 右外连接
full outer join 完全外连接
union 同盟;联盟
intersect 相交;交叉
except 不包括;不计;把…除外
exists 存在;实际上有 使用时只返回true或false
发布了14 篇原创文章 · 获赞 13 · 访问量 1595

猜你喜欢

转载自blog.csdn.net/weixin_44611096/article/details/105052154
今日推荐