一篇文章学会数据库操作语句(面试够用了)

来源:互联网 发布:php上传txt文件 编辑:程序博客网 时间:2024/05/16 17:57

极其简单

*注意,本文不太严谨,关键字等许多点都没有用字母的大写
初识数据库,我们肯定要知道数据库的创建以及删除。

那就是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子句)。