结束了上一章内容,我们对数据库的操作有一定的了解,本章内容就是针对表中的数据进行操作的。
针对表中数据的操作绝大部分都是增删改查(CRUD),CRUD也就是四个单词的缩写:
增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete);
这也是数据库存在的主要目的。
CRUD
增加(Create)
增加即向表中插入数据,上一章中已经提到过了,基本语法如下:
insert into 表名 value(值1,值2......);【单行插入】
insert into 表名 values(值1,值2......),(值1,值2......);【多行插入】
例如:
values 方式插一行,插多行都可以,但是value每次只能插入一行记录。
查询(Retrieve)
全列查询
如上图,我们用的是 * 的方式是全列查询,上一章也提到,对于大数据的查询是非常危险的,带宽会被这一条语句占满,服务器不可能只服务一个用户端。
指定列查询
有时候呢,我们一张表有很多的数据,比如一个人,有年龄,性别,名字,是否已婚,等等....;但是我们有时候又不是需要全部信息,我们只需要取一部分,那么这就需要我们的指定列查询了。
还是拿 student 表来举例:我们拿出所有学生的名字:
否则就会报错:
查询字段为表达式
select 表达式 对比结果如下:
别名
为查询结果中的列指定别名,表示返回的结果集中,以别名作为该列的名称,语法:
SELECT column [AS] alias_name [...] FROM table_name;
就是有时候我们不想让列名那么奇怪,或者我们像简单点表示列名,那就需要用到别名。
例如,我们设置一个成绩表,并添加数据:
我想查询每个人的总分数:
我们可以怎么写:
这时候我们看这个总分的列名非常不好,于是可以用到别名:
这下舒服多了!
去重:DISTINCT
使用DISTINCT关键字对某列数据进行去重;
就拿上面的分数表来说,我再次添加一个数据:
我们现在查询数学成绩看看结果:
去重也就是取出重复数据,我们来试试看:
结果的确是将重复数据剔除了。
排序:ORDER BY
上学时期每次考完试,班主任总会对学生的总分进行排序,我们这里也不例外;
我们也可以对上面总成绩进行一个排序;
语法如下:
-- ASC 为升序(从小到大)
-- DESC 为降序(从大到小)
-- 默认为 ASC
SELECT ... FROM table_name [WHERE ...]
ORDER BY column [ASC|DESC], [...];
结果如下:
我们也可以升序排序:
asc 是升序,默认也是升序; desc 的 全拼是 descend(下降)。
条件查询:WHERE
我们在查询的时候会对一些数据进行筛选,并非全部数据都是我们需要的,而 where 条件查询也分很多:
比较运算符:
运算符 | 说明 |
>, >=, <, <= | 大于,大于等于,小于,小于等于 |
= | 等于,NULL 不安全,例如 NULL = NULL 的结果是 NULL |
<=> | 等于,NULL 安全,例如 NULL <=> NULL 的结果是 TRUE(1) |
!=, <> | 不等于 |
BETWEEN a0 AND a1 |
范围匹配,[a0, a1],如果 a0 <= value <= a1,返回 TRUE(1) |
IN (option, ...) | 如果是 option 中的任意一个,返回 TRUE(1) |
IS NULL | 是 NULL |
IS NOT NULL | 不是 NULL |
LIKE | 模糊匹配。% 表示任意多个(包括 0 个)任意字符;_ 表示任意一个字 符 |
举个例子:
比如我想查找,总分大于250 分的所有同学,我们可以这么写:
但是我觉得怎么写,sum 总分不好看,我们再换一种写法:
这里我们发现,sum是未定义的,为什么呢?
起别名是在进行排序的时候起的,而排序是在 where 筛选之后才有的,当然找不到sum列了。
我们发现这样的写法也是错误的,那么只能:
除了比较运算符,还有其他的的运算符:
逻辑运算符:
运算符 | 说明 |
AND | 多个条件必须都为 TRUE(1),结果才是 TRUE(1) |
OR | 任意一个条件为 TRUE(1), 结果为 TRUE(1) |
NOT | 条件为 TRUE(1),结果为 FALSE(0) |
相信大家对逻辑运算符是不陌生的,在Java中不知道写过多少了。
举例:
我要查询数学和语文都大于90 分的全部信息:
我们就可以用and语句来执行:
或者,我要查询,语文或数学大于 90 的人:
对条件查询做个小结:
1. WHERE条件可以使用表达式,但不能使用别名。
2. AND的优先级高于OR,在同时使用时,需要使用小括号()包裹优先执行的部分
对上面的查询,我就不一一举例了,没事的时候,可以自己动手试一试,光是看无法提升自己的能力,不会的时候可以动手查;反正现在是学习时间,有足够的时间试错!