引言
本文是在笔者复习数据库原理是的学习记录,虽然曾经学过,但是有些不常用的语句或者是一些细节的地方难免会忘记,就想借这次复习的机会将一些基本的知识点都记录下来,好记性都不如烂笔头呢,何况我记性并不好。以前的学习也多仰仗于各位大佬的学习笔记,就算我的记录不能帮到别人,也给自己留份记录吧。
查询语句结构
查询语句的语句结构标准
select<目标列名>
from<表名> [ join <表名> on <连接条件>]
[where<行选择条件>]
[group by <分组依据条件>]
[having <组选择条件>]
[order by<排序依据列>]
其中:
- select 子句用于指定输出的列; (投影)
- from 子句用来指定数据源(多表查询时join on连接其他表);
- where 子句用来指定select选择行的条件;(选择)
- group by 子句用来对索检到的记录进行分组;
- having 子句用于指定对分组后结果的选择条件;
- order by 子句用于对查询结果进行排序;
select from语句是查询必须的子句,其他语句是视情况自主选择
将查询结果保存到表中
select语句产生的查询结果是保存在内存中的,如果想要将结果永久性的保存起来,譬如存入一个表中,则可以通过select语句中的子句into实现
SELECT 查询列表序列 INTO <新表名>
FROM 数据源
.......其他查询子句
具体查询详解
以下表作为示例进行单表查询:
Stduent
Sno | Sname | Ssex | Sbirthday | Sdept | Memo |
---|
Course
Cno | Cname | PreCno | Credit | Semester |
---|
SC
Sno | Cno | Grade |
---|
具体数据就不予展示了,只要根据表头就可以进行查询了。
1. 查询表中所有的同学全部信息
select Sno,Sname,Ssex,Sbirthday,Sdept,Memo
from Student;
或者
select * from Student;
2. 查询表中没有的列
select Sname year(getdate())-year(Sbirthday) 年龄
from Student;
其中列名后借表达式意为列别名
查询表中没有的列时可以通过表达式,函数,常量等构造列并给列取一个别名。
3.where子句的基本用法
where可以根据条件筛选出实际需要的行记录
常用的查询条件有:
-
比较运算符
=,>,<,>=,<=,!= -
确定范围运算符
between. A and B ,not between. A and B
用来指定列值是否在范围内,A,B分别表示上界下届,取值范围包括边界,列值的数据类型必须与边界值类型一致
-
确定集合
in,not in
语法格式:列名[not] in (常量1,常量2,常量3…)
in,当列中的值与集合中某个常量的值相等时,则结果为true,表明此值符合查询条件的记录 -
字符匹配
like,not like
语法格式:列名 [not] like <匹配串>
表示模糊查询条件,
匹配串:
_(下划线):匹配任意一个字符
%(百分号):匹配0到多个字符
[ ]:匹配[ ]中的任意一个字符
[^ ]:不匹配任意一个字符 -
空值
null,not null
空值在数据库中有特殊的含义,他表示当前不确定或未知的值,不能使用比较运算符判断,涉及空值判断的需要用is null或者is not null来判断。
- 多重条件
and,or
当需要组合多个查询条件时,使用逻辑运算符and和or来连接where的查询条件
or的运算符优先级要高于and,改变运算符顺序可以加小括号()实现。
例如:
//查询机电系和计算机系1997年出生的学生的学号,姓名,所在系和出生日期。
select Sno,Sname,Sdept,Sbirthday from Student
where (Sdept='计算机‘ or Sdept=‘机电系’)
and Sbirthday between '1997-01-01' to '1997-12-31'
4. 排序Order By和去重DISTINCT
- distinct 去掉重复的列
//找出表中所有的系
select distinct Sdept from Student
排序语法格式:
order by <列名> [ASC | DESC]
ASC表示升序排列,DESC表示降序排列,默认排序方式为ASC
5.聚合函数
聚合函数又称统计函数,是对一组值进行计算并返回一个统计结果。
- COUNT(*):统计表中元组的个数
- COUNT ([distinct]<列名>):统计本列的值的个数,distinct表示把重复的值去掉
- SUM(<列名>):计算列值的和值(必须是数值型列)
- AVG(<列名>):计算列值的和值(必须是数值型列)
- MAX(<列名>):得到列的最大值
- MIN(<列名>):得到列的最小值
//统计课程C01的最高分和最低分
select Max(Grade) 最高分,Min(Grade) 最低分
from SC where Cno='C01';
top:
语法格式:TOP n(percent)
- n为非负整数,表示排序后的前n位。n precent表示取排序后的前n%的数据
例如:
//查询C04号课程排名前三的学号和成绩
select top 3 Sno,Grade From SC where Cno='C04'
6.分组查询 Gruop By 和HAVING
Group By可对数据进行分组,将统计结果控制在组这一级,分组后可以使用聚合函数进行组之上的统计,分组时可以使用多个列值进行分组
例如:
select Sno 学号,Sname 姓名,COUNT(Cno)选课门数,AVG(Grade)平均成绩
from SC Group By Sno;
HAVING 是对分组后的统计结果再次进行筛选,一般和Group By子句一起使用,效果类似于where
//查询选课门数超过三门的学生学号和选课门数
select Sno,COUNT(*)选课门数 From SC
Group By Sno HAVING COUNT(*)>3;
但是要注意:where和group by同时出现时,where子句的选择条件会先一步执行,然后在进行分组统计
having效果类似于where,但是having是作用于组之上的,where针对单条记录,having子句可以再用聚类函数,where不行
//查询选课超过三门的学生的学号和选课门数
select Sno,COUNT(*)选课门数 From SC
Group By Sno HAVING COUNT(*)>3
两者相比,对于可以在分组之前进行筛选的条件,在where语句中指定更有效,这样可以减少参与分组的数据行。应当在HAVING子句中指定筛选条件的必须是那些执行分组条件后才能应用的筛选条件。
结语
还记得自己刚刚学SQL语句时,知道不难,但是也用的懵懵懂懂,大多数时候写查询语句都要来翻书,课后作业也是借鉴书上的例题完成的,但是随着在程序编写中的使用,大多数句子已经可以孰能生巧行云流水地书写了,复习的时候真的跟第一次学习完全不一样,察觉到了很多之前不会在意的小细节。温故而知新,古人诚不欺我。
单表查询的知识点暂告一段落,下一篇博文分享多表连接查询的知识点。
@Tang