极其简单
*注意,本文不太严谨,关键字等许多点都没有用字母的大写
初识数据库,我们肯定要知道数据库的创建以及删除。
那就是create和drop。
向表里添加约束
alter table 表名 add check(约束条件)
向表里添加列
alter table 表明 add 列名 数据类型
入门级
查询等等一系列的东西。
最普通的select语句(查询指定的列)
select Sno from Student
进一步,查询全部的列可以用*表示,如下:
select * from Student
进一步 查询出经过计算的列 (查询出学生表中的出生年份,几年是2017年)如下:
select 2017-Sage from Student
当我们的表里面有很多相同的数据时,我们想要去掉结果中的重复行,我们可以在select语句中通过DISTINCT关键字来去掉结果中的重复行。如下:
select DISTINCT Sno from SC
注意:DISTINCT 放到查询属性前面。
再往前挤一挤
查询满足条件的元组(where关键字的出现)
我们首先要知道where后面跟什么查询条件
查询条件 | 谓词(就是条件的关键字) |
---|---|
比较 | 有=、< 、> 、!=等等不写了都懂得 |
确定一个范围 | 只要不傻应该知道between···and或者not between···and |
确定集合 | in 或者 not in |
字符匹配(找哪一个字) | like,那么对立就有not like |
空值 | is null,那么对立就有is not null |
很多个条件(多重条件) | and 或者 or |
查询年龄在20岁以下的学生姓名以及年龄。
select Sname,Sage from Student where Sdept<20
与上一节的distinct关键字相结合,例如:
查询考试成绩有不合格课程的学生的学号。
当一个学生有多门课程不及格是,我们只需要列出一次即可。
select distinct Sno from SC where Grade<60
确定一个范围
例如查询年龄在20~22之间的学生的姓名
select Sname from Student where Sage between 20 and 22
上句查询语句也等价于:
select Sname from Student where Sage>=20 and Sage<=22
确定一个集合
查询信息管理系,计算机系学生的姓名
select Sname from Student where Sdept in (‘信息管理系’,’计算机系’)
上句查询语句也等价于:
select Sname from Student where Sdept = ‘信息管理系’ or Sdept = ‘计算机系’
字符串匹配
这一类查询语句在面试里很常见
显而易见 我们要用LIKE关键字,但是呢LIKE后面跟着一个匹配串,这个匹配串中包含了4种通配符
通配符 | 意义 |
---|---|
_(下划线) | 匹配任意一个字符(可以代表一个字符) |
%(百分号) | 匹配0到多个字符(相当于N个下划线) |
[ ] | 匹配[ ]里面的任意一个字符 |
[^] | 不匹配[ ]里面的任意一个元素,和上面正好相反 |
首先先练习一个简单的例子。
查询名字里带有“张”的学生姓名
select Sname from Student where Sname like ‘%张%’
查询姓“张”的学生姓名
select Sname from Student where Sname like ‘张%’
查询“张” “李” “姜”等姓的学生的详细信息(用[ ]通配符)
select * from Student where Sname like ‘[张李姜]%’
查询名字第二个字为“小”或者“大”的学生的姓名(用到_关键字把第一个字代替)
select Sname from Student where Sname like ‘_[小大]%’
查询所有不姓“刘”的学生姓名(用到not like)
select Sname from Student where Sname not like ‘[刘]%’
查询学号的最后一位不是2、3、4、5的学生的详细信息(用到[^])
select * from Student where Sno like ‘%[^2345]’
当我们要查询的数据里面有下划线或者百分号怎么办?新加入一个语法escape 转移字符。
直接来个例子吧。
查询某一个表里面包含字符串为30%的记录(了解即可)
select * from Student where ‘%30!%%’ escape ‘!’
空值
查询没有考试的学生的学号和相应的课程号
select Sno, Cno from SC where Grade is null
多重条件查询
这个查询语句在上述确定范围中已经提到
查询年龄在20~22之间的学生的姓名:
select Sname from Student where Sage>=20 and Sage<=22
挤的差不多了,上重点
下面我们要学习的便是对数据查询结果的排序
这个知识点还是比较简单的,我们只需要记住下面这个语法格式即可
order by <列名> [asc/desc](其中默认升序为asc,desc为降序)
下面是面试中遇到最多的题目,不好好学习别怨我!
使用聚合函数来汇总数据。
牢记重点之中的重点!!!!
WHERE后面不能跟聚合函数,HAVING后面可以
你要问聚合函数是什么?我也不知道,记住常用的几种聚合函数就可以了。
聚合函数 | 用途 |
---|---|
count(*) | 统计表中元组的个数(如果不懂,下面一看列子就明白了) |
count ([distinct]<列名>) | 上面已经介绍了distinct关键字,意思就是去掉重复值 |
sum(<列名>) | 计算列值的和(和的话得要求这一列为数值类型) |
avg(<列名>) | 计算列值的平均值(面试及其容易遇到) |
max(<列名>) | 得到最大值 |
min(<列名>) | 得到最小值 |
上例子吧,迫不及待了吧。
统计学生总人数
select count(*) from Student
统计选了课程的学生人数(一个学生当然可以选择好几门课程,这就用到了distinct)
select count(distinct Sno) from SC
统计学号为1408050217学生的平均成绩。
select avg(Grade) from SC where Sno = ‘1408050217’
另外一个知识点(分组)group by
直接上例子吧。
统计每门课程的选课人数,列出课程号和选课人数。
select Cno as 课程号, count(Sno) as 选课人数 from SC group by Cno
这个我们就不深究了,因为当我们在面试题中遇到分组的题目是,知道关键字是group by就足够了。
新的知识点having
having:意思是当我们group by分组之后,再次进行筛选。它的功能和where有点儿像吧,但是where是用于单个记录,having是用于组。
用having来个例子吧。
查询选课门数超过3门的学生的学号和选课门数。
首先,我们要先用group by进行分组,把学号和选课门数列出来,如下:
select Sno ,count(*) 选课门数 from SC group by Sno
然后选课门数超过3门,这就用到了having关键字,代码在上述代码后面加上:
having count(*) > 3
渐入佳境
之前谈到了都是对于一个表来查询数据的,面试过程中也肯定会遇到多表联合查询的,不如我们先做个题吧。
查询每个学生及其选课的基本信息。
思路:Student表里有学生信息,SC表里有学生的选课信息,我们需要把两个表连接起来,然后查得信息。
select * from Student inner join SC on Student.Sno=SC.Sno
这应该不难看懂吧,语法就是这样:
from 表1 [inner] join 表2 on 表1.列名 = 表2.列名
上述的查询方式为内连接,内连接是什么?
内连接是一种最常用连接类型,使用内连接时,只要两个表中有字段是一样,就满足了内连接的连接条件。上面Student表里面有字段Sno,而SC表里面也有Sno,这样两个表才能连接起来。当然三个表也是可以连接起来的,这里就不叙述了(每连接一张表,就需要使用一个join子句)。