对于查询这一块,又简单的查询,也会有复杂的查询,作为笔记,涉及不到所有的查寻,因此可能会有的点疏漏了,望提醒!
此外,下列主要是介绍SQL语句,所写代码并没有对实际数据库操作,但语句本身是没有错的,在后面的笔记中会补充一个对实际数据库的查询等
下面是会用到的表
Student表
| stu_no | stu_na | stu_age | stu_sex |
|---|
Course表
| 课程号c_no | 课程名c_na | 学分c_score |
|---|
SC表
| stu_no | c_no | 成绩score |
|---|
SQL语句单表查询
简单查询
- 查询某个表中某个属性的所有数据
如:查询所有学生的姓名,语句如下
- 查询单个
Select stu_na --Select 属性列名
From Student --需要查询的数据来自哪个表
//Select的作用就是之前的投影运算
- 查询多个
Select stu_na As name,stu_age Age
From Student
//查询所有学生的姓名和年龄
//其中As name表示name是stu_na的一个别名
//As可以省略,如后面的,Age作为stu_age的别名
- 查询结果不重复
Select Distinct stu_sex
From Student
//查询只有男和女-两个-结果
//而
Select stu_sex
From Student
//这条语句会查询到-很多-男、女结果
条件查询
- 比较查询
//查询所有大于20岁的学生的姓名和年龄
Select stu_na,stu_age --再查询出年龄是为了确保查询结果没出错
From Student
Where stu_age > 20
//Where,后面跟上查询条件
//注意:!= 和 <> 都表示不等于
- 多重查询
//查询所有大于20岁的男生的姓名、年龄以及性别
Select stu_na,stu_age,stu_sex
From Student
Where stu_age > 20 And stu_sex = '男'
//And表示前后两个条件都要满足,此外还有Or、Not
//stu_age > 20 Or stu_sex = '男',大于20或是男生都行,也就是所有男生加上大于20的女生
//Not在这还用不上,在后面会出现
- 范围内查询
- 使用Between ····· And ·····
//查询年龄在18 ~ 22的学生姓名和年龄
Select stu_na,stu_age
From Student
Where stu_age Between 18 And 22
//若查询不在这个范围的学生,只需再Between前面加上Not即可
- 使用 In()
//查询18、21、23岁的学生的姓名和年龄
Select stu_na,stu_age
From Student
Where stu_age In(18,21,23)
//In前面加上Not就代表不在该范围内
//当然这个语句也可用Or来写,但这就会显得麻烦
- 匹配查询
- 匹配字符串
//查询所有姓杨的学生的姓名
Select stu_na
From Student
Where stu_na Like '杨%'
//%表示任意字符串,包括长度
- 匹配单个字符
//查询所有姓杨,且姓名只有两个字的学生姓名
Select stu_na
From Student
Where stu_na Like '杨_'
//一个下划线表示匹配一个字符,多个下划线就表示匹配多个字符
- 单个字符范围匹配
//查询姓为赵、钱、孙、李的学生姓名
Select stu_na
From Student
Where stu_na Like '[赵,钱,孙,李]%'
//中括号[]内表示--单个--字符串的匹配范围
//[^杨],表示不姓杨
还有一个查询的空值NULL的查询
若需要查询学生中姓名为空的学生的学号(前提姓名可以为空),语句如下
Select stu_no
From Student
Where stu_na is NULL
只能用is,不能使用等号,is后可以加Not
查询结果统计
常用的有AVG、SUM、MAX、MIN、COUNT
他们的含义分别是求平均、求和、找最大、最小、计数,操作对象都是一列
//查询学生人数、平均年龄和最大年龄
Select Count(stu_no) As stu_num,Avg(stu_age) As avg_age,Max(stu_age)
From Student
//需要注意的是,这条语句的结果是一行,因此,
//在单表查询中,如果即查询平均、最大等,又查询某一个属性列所有信息是会出错的
//但是如果在多表查询中,是有可能实现的
//查询男学生人数、平均年龄和最大年龄
Select Count(stu_no) As stu_num,Avg(stu_age) As avg_age,Max(stu_age)
From Student
Where stu_sex = '男'
//这里是为了说明,统计查询也可以添加一些条件
分组查询
所谓分组,就是以某个属性为标准,那么这个属性相同的元组就会分为一组,举个例子,如果这个属性是stu_sex,那么就会被分为男女两组,这样就可以同时统计男生和女生的人数,此外分组查询还有其他作用
//查询男生和女生的人数
Select stu_sex,Count(stu_no) As stu_sum
From Student
Group By stu_sex
//分别查询出男生和女生中,20岁以上的学生人数
Select stu_sex,Count(stu_no) As stu_sum
From Student
Group By stu_sex
Having stu_age > 20
//在Group By中,条件查询要使用--Having--加条件
上述查询结果形式如下
| stu_sex | stu_sum |
|---|---|
| 男 | 900 |
| 女 | 100 |
分组查询,通常用于统计
查询结果排序
语法是Order By加上排序方式,如下
//查询学生姓名和年龄,并按照年龄对学生进行由大到小的排序
Select stu_na,stu_age
From Student
Order By stu_age DESC
//DESC表示由大到小,ASC表示有小到大
//Order By stu_no,score DESC表示在学生选课表中,先按学号排序,学号相同的在按照成绩大小排
多表查询
连接查询
类似之前的链接运算,将多个表连接起来构成一个表进行查询
- 等值连接
这是很常用的多表查询
//查询名字叫小杨的学生的选课课程名和成绩
Select c_na,Student.stu_no
From Student,Course,SC
Where Student.stu_no = SC.stu_no And Course.c_no = SC.c_no And stu_na = '小杨'
//这是最常用的连接多个表的方法
//除此之外还有外连接、内连接
注意,不是所有表都可以连接
使用多表查询是因为,需要查询的对象来自多个不同的表,因此需要将它们连接成一个新的表(当然这个表不存在),然后查询结果,而多个表连接的条件是他们需要有关系,比如Student与Course表,有关系,但它们不能直接连接,需要借助SC来间接连接
自身连接
所谓自身连接,就是需要同时使用多次相同的表,比如,在不知道小杨年龄的情况下,查询所有比小杨年龄大的学生的姓名,如下
//查询所有年龄比小杨大的学生姓名和年龄
Select X.stu_na,X.stu_age
From Student As X,Student As Y
Where X.stu_age > Y.stu_age And X.stu_na != '小杨' And Y.stu_na = '小杨'
//能发现,当要在一个查询语句中使用多次同一个表,可以命别名,这就是自身连接
总结
单表查询相对于多表查询而言就很简单
多表查询需要清楚连接时哪个表与哪个表连接,另外就是在书写属性名的时候要注意,这个属性是否在相连接的表里面也有,这时就需要加上表的前缀
这篇博客详细介绍了SQL语句在单表和多表查询中的应用,包括简单查询、条件查询、分组查询、排序及连接查询等。通过实例展示了如何进行比较查询、范围查询、匹配查询和空值查询。还讨论了多表查询中的等值连接和自身连接,强调了连接条件的重要性。最后,总结了单表查询和多表查询的关键点。
628

被折叠的 条评论
为什么被折叠?



