数据库(笔记)——SQL语句单表与多表查询
SQL语句数据查询
对于查询这⼀块,⼜简单的查询,也会有复杂的查询,作为笔记,涉及不到所有的查寻,因此可能会有的点疏漏了,望提醒!
此外,下列主要是介绍SQL语句,所写代码并没有对实际数据库操作,但语句本⾝是没有错的,在后⾯的笔记中会补充⼀个对实际数据库的查询等
下⾯是会⽤到的表
Student表
stu_no stu_na stu_age stu_sex
Course表
课程号c_no课程名c_na学分c_score
SC表
stu_no c_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 >20And 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 Between18And22
//若查询不在这个范围的学⽣,只需再Between前⾯加上Not即可
2. 使⽤ 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'杨%'
//%表⽰任意字符串,包括长度
2. 匹配单个字符
//查询所有姓杨,且姓名只有两个字的学⽣姓名
Select stu_nadistinct查询
From Student
Where stu_na Like'杨_'
//⼀个下划线表⽰匹配⼀个字符,多个下划线就表⽰匹配多个字符
3. 单个字符范围匹配
/
/查询姓为赵、钱、孙、李的学⽣姓名
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 ='⼩杨'
//能发现,当要在⼀个查询语句中使⽤多次同⼀个表,可以命别名,这就是⾃⾝连接
总结
单表查询相对于多表查询⽽⾔就很简单
多表查询需要清楚连接时哪个表与哪个表连接,另外就是在书写属性名的时候要注意,这个属性是否在相连接的表⾥⾯也有,这时就需要加上表的前缀