举例用到的三个表
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常和库函数结合做统计
举几个例子理解一下单表查询
- 统计男生中年龄大于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 |