数据库(笔记)——SQL语句单表与多表查询

这篇博客详细介绍了SQL语句在单表和多表查询中的应用,包括简单查询、条件查询、分组查询、排序及连接查询等。通过实例展示了如何进行比较查询、范围查询、匹配查询和空值查询。还讨论了多表查询中的等值连接和自身连接,强调了连接条件的重要性。最后,总结了单表查询和多表查询的关键点。

对于查询这一块,又简单的查询,也会有复杂的查询,作为笔记,涉及不到所有的查寻,因此可能会有的点疏漏了,望提醒!
此外,下列主要是介绍SQL语句,所写代码并没有对实际数据库操作,但语句本身是没有错的,在后面的笔记中会补充一个对实际数据库的查询等
下面是会用到的表

Student表

stu_nostu_nastu_agestu_sex

Course表

课程号c_no课程名c_na学分c_score

SC表

stu_noc_no成绩score

SQL语句单表查询

简单查询

  1. 查询某个表中某个属性的所有数据
    如:查询所有学生的姓名,语句如下
  • 查询单个
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在这还用不上,在后面会出现
  • 范围内查询
  1. 使用Between ····· And ·····
//查询年龄在18 ~ 22的学生姓名和年龄
Select stu_na,stu_age
From Student
Where stu_age Between 18 And 22
//若查询不在这个范围的学生,只需再Between前面加上Not即可
  1. 使用 In()
//查询18、21、23岁的学生的姓名和年龄
Select stu_na,stu_age
From Student
Where stu_age In(18,21,23)
//In前面加上Not就代表不在该范围内
//当然这个语句也可用Or来写,但这就会显得麻烦
  • 匹配查询
  1. 匹配字符串
//查询所有姓杨的学生的姓名
Select stu_na
From Student
Where stu_na Like '杨%'
//%表示任意字符串,包括长度
  1. 匹配单个字符
//查询所有姓杨,且姓名只有两个字的学生姓名
Select stu_na
From Student
Where stu_na Like '杨_'
//一个下划线表示匹配一个字符,多个下划线就表示匹配多个字符
  1. 单个字符范围匹配
//查询姓为赵、钱、孙、李的学生姓名
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_sexstu_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 = '小杨'
//能发现,当要在一个查询语句中使用多次同一个表,可以命别名,这就是自身连接

总结

单表查询相对于多表查询而言就很简单
多表查询需要清楚连接时哪个表与哪个表连接,另外就是在书写属性名的时候要注意,这个属性是否在相连接的表里面也有,这时就需要加上表的前缀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值