数据库的学习
1.单表查询
学生表student的结构:
查询表中所有学号小于8的男学生的学号和姓名
select sid,sname # 需要查询出来的字段
from student # 从哪张表中取数
where ssex = '男’ and sid < 8 #设置查询条件,两个条件用and(和)/or(或)连接
如果你需要对选择出来的结果进行处理,需要使用函数和order by,再看一个例子:
查询学号非空,姓“张”的学生的学号和姓名,按照sid升序并取前三条
select sid,sname
from student
where sname like '张%’ #通过like和通配符%来进行模糊匹配
and sid is not null #学号非空
order by sid #根据sid排序 默认为升序;添加desc为降序
limit 3 #制取前面三条
多表查询
加入成绩表sc
通过join连接两张表:
查询赵雷每门课的成绩
select sname ,cid,score
from student
inner join src
on student.sid = sc.sid #两张表的连接条件,满足条件的两行会合并成为一行
where sc.sname = '赵雷’
复杂用例的编写
加入课程表course和教师表teacher
课程表:
教师表:
SQL语言的执行顺序和语法顺序:
如下从上到下为SQL的语法顺序(也就是你写的SQL格式)
而实际上SQL的执行顺序为:
实例
在限定学生表学号小于等于6的一批学生中,查询每门课的最高成绩(最高成绩低于70分的课程不显示),然后根据课程最高成绩降序排列取前两条记录。查询的SQL如下:
select cid #课程号
,max(score) as max_score #最高分
from sc #成绩表
where sid <=6 #条件子句
//分组查询
group by cid
having max(score)>=70
order by max(score)
limit 2;
一、条件子句(where)
1. 比较运算符(适用于区间)
比较运算符包括=(等于),>=(大于等于),<=(小于等于),!=(不等于),>(大于),<(小于)。比如查询年龄小于30的学生:
> where sage < 302.
2. 确定范围(适用于连续范围)
between … and …为取值限定了一个范围。例如:查询年龄大于等于10小于等于20的学生:where sage between 10 and 203.
3. 确定集合(适用于离散的少数值)
例如:插入年龄为10,20,30的学生:where sage in (10,20,30)
in可以和not一起使用,表示不在这个区间的值
where sage not in (10,20,30)
4 . 字符匹配
通过like 关键字和正则表达式匹配,常用的通配符有%(任意的字符)和下划线(_)(一个字符)。例如查询名字sname带“王”的学生
where sname like "王%”
5. 判断是否为空值
通过is null 关键字来判断是否为空,例如查询姓名sname
不为空
where sname is not null
6. 多个查询条件
用 and
(两个条件同事满足) 和or
(两个条件满足一个即可) 。例如查询年龄Sage
小于20并且性别ssex为男的学生:
where sage <20 and ssex = '男’
二、分组查询(group by&聚合函数&having子句)
分组查询实现了类似excel中数据透视表的功能,可以帮助我们对数据进行分层汇总,而我们对分层后的数据进行统计的时候需要用到聚合函数(也就是平均值、求和、最大值和最小值等),最后我们对分层之后的数据筛选的时候需要用到having子句。
where子句是对原始表做筛选的
having子句是对分层汇总之后的结果做筛选的
1. group by
group by不仅可以对一个字段进行分组,还能对多个字段进行分组。这和excel中的数据透视表一致。
2. 聚合函数
3. having子句
和where子句一致,只需注意是对聚合后的结果作限制。
三、字段选择(select)
select比较灵活,我们不单单能选择原始数据表的字段,还能使用函数对字段进行计算,正如我们第一篇提到的,函数并不是重点,当你需要的时候百度或者问技术小哥就知道了。我们这里只简单介绍一下可以对字段进行计算。例如:查询各学生的年龄(通过公式计算年龄)
select sid, sname, year(curdate()) - year(sage) as sage
from student;
四、结果呈现(order by)
和excel一样,可以用多个字段排序关键字desc表示降序排列.例如:查询学生id和年龄,并先按照学号sid降序,再按照年龄sage升序排列
select
sid, sage
from student
order by sid desc, sage
表的连接
sql表连接包括内连接、外连接和交叉连接,我们通过一个例子简单介绍三种连接的异同。
1.待连接的表的信息
现在有一张A表和B表,A表记录学生学号sid和对应的姓名name,B表记录学生学号sid和对应的分数score。
2. 内连接
内连接即通过对某个字段进行等值匹配从而将两个表联合起来,比方说我们需要获取两张表中同一个学号对应的姓名和成绩,使用的就是inner join,结果如下:
3.左连接和右连接
一般情况下,“A表左连接B表”的结果与“B表右连接A表”的结果相同,为了保证SQL代码的易阅读性,一般用左连接即可。左连接指的是将左表作为基准表,保留表中的所有行,将右表根据某个字段进行等值匹配,如果找不到右表中匹配的行则显示为NULL。结果如下:
4.交叉连接
没有连接条件的表连接将产生笛卡尔积,即连接结果行数等于A表行数乘上B表行数,可以理解为两个表的记录两两配对产生的结果。结果如下: