0. 前言
上一篇文章介绍了在MySQL服务器中,可以保存多个不同的数据库(DATABASE),而每个数据库可以保存多个不同的表(TABLE),以及如何去创建、删除数据库和表等内容。
对于码农而言,增删改查是较为耳熟能详的,上一篇介绍过MySQL中数据库的增删改查以及表的增删了,本文将针对表格的改和查进行介绍。
再回顾一下,对于数据库(DATABASE):
# 增:
CREATE DATABASE db_name;
# 删:
DROP DATABASE db_name;
# 改:即对于表格的增删改,见下文;
# 查:
SHOW DATABASES; SHOW TABLES;
对于表(TABLE),注意需要使用USE tb_name;
指定数据库:
# 增:
CREATE TABLE tb_name( col1 type1, col2 type2, ... );
# 删:
DROP TABLE tb_name;
改:分为对表格字段的修改以及对表格记录的修改,本文介绍;
查:主要为SELECT
语句与WHERE
、ORDER
、LIMIT
子句的搭配,本文介绍;
另外,大家习惯将表格的列称作字段,从本文起将遵循这一习惯。
系列文章回顾:
MySQL学习(1)-Windows环境安装和配置
MySQL学习(2)-基本概念、数据类型和简单语句
1. 表格属性修改
表格属性的修改分为字段的修改和表名称的修改,全都使用ALTER
关键字即可。
# 修改表名:
ALTER TABLE tb_name RENAME new_tb_name;
# 增加列:
ALTER TABLE tb_name ADD colName colType [NOT NULL] [DEFAULT val];
# 删除列:
ALTER TABLE tb_name DROP colName;
# 修改列:
ALTER TABLE tb_name CHANGE colName newColName newColType;
有几点需要注意一下:
- 对于增加列中的
[NOT NULL]
,添加上即表示本列的值不允许为NULL,此时将一条记录的该字段设置为NULL
是不允许的; - 对于增加列中的
[DEFAULT val]
表示默认值,当该字段设置为NOT NULL
时此处则不可以采用DEFAULT NULL
的描述了,否则如下图报错:
- 修改列中的
CHANGE
关键字表示对于字段名称和类型等属性同时进行修改,若不修改字段名称,可以采用MODIFY
;
ALTER TABLE tb_name MODIFY colName colType [NOT NULL] [DEFAULT val]
2. 表格记录修改
似乎已经学了不少语句了,什么SHOW HELP ALTER CHANGE ADD DROP CREATE MODIFY
之类的,但很遗憾地,稍微思考一下会发现:关于记录的一条都没有,而从使用角度来讲,更重要的内容应该是数据本身才对!
不过也不宜沮丧,如果把数据库比作一个书架,到目前为止已经学会怎么 搭书架(数据库) ,以及 给书架分区(表) 了,剩下就是把书放进去了。
2.1 添加、删除和修改
添加记录可以提供所有字段,也可以选择要提供的字段,使用INSERT INTO
:
# 插入数据记录,提供所有列的值
INSERT INTO tb_name VALUES (colVal1, colVal2, ...);
# 插入数据记录,但只提供某些列的值
INSERT INTO tb_name(col1, col2, ...) VALUES (val1, val2, ...);
删除记录使用DELETE
与WHERE
子句组合实现:
# 删除全部记录
DELETE FROM tb_name;
# 条件删除使用WHERE子句
DELETE FROM tb_name WHERE col=val;
修改记录使用UPDATE
与SET、WHERE
等组合实现:
# 修改数据记录:
UPDATE tb_name SET col1=val1, col2=val2 WHERE col3=val3 AND col4=val4;
关于WHERE
子句的使用参考本文2.2.2条件过滤。
2.2 查看
查看数据的核心语句为SELECT
:
# 查看表所有数据
SELECT * FROM tb_name;
# 查看特定列
SELECT colName1, colName2,... FROM tb_name;
如果只能查看所有记录那就太笨重了,MySQL可以通过各种手段实现重复过滤、条件过滤、排序、截取等,以下一一击破。
2.2.1 重复过滤
查看去重数据:在SELECT
后添加DISTINCT
,用法如下:
# 查看所有列都不一样的记录
SELECT DISTINCT * FROM tb_name;
# 查看col1和col2均不重复的记录
SELECT DISTINCT col1, col2 FROM tb_name;
将
DISTINCT
与后面的列捆绑记忆更好:SELECT
的是DISTINCT
的列;或者说DISTINCT
总是将SELECT
的返回结果去重。
2.2.2 条件过滤
可以使用WHERE
添加查看条件,并使用AND
和OR
对条件进行组合,用法如下:
SELECT * FROM tb_name WHERE col1=xx AND col2!=xx OR col3>xx;
- 支持的运算符如下表所示:
运算符 | 描述 |
---|---|
= | 等于 |
!= | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
BETWEEN | 在两个值之间,闭区间,如col NOT BTWEEN val1 AND val2 |
LIKE | 模式查找,如 col NOT LIKE '%abc' ,匹配以’abc’为后缀的子串 |
IN | 当col值在某个集合中,如IN (val1, val2, val3) |
-
多个条件使用
AND
和OR
组合时,组合优先级与C++一致,也可以使用()
改变结合性。 -
通配符:
%
匹配任意个字符,_
只能匹配1个字符。 -
通配符
%
不能匹配NULL
; -
尽量不要使用通配符,因为这花费更多时间;
-
NULL
判断较为特殊,需要采用IS NULL
或IS NOT NULL
进行判断。
采用
=NULL
不会报错,但是结果不正确,如下图:
可以对条件取反,在条件前添加NOT
即可:
SELECT * FROM tb_name WHERE NOT col=val;
2.2.3 结果排序
使用 ORDER BY
对查询结果排序 :
SELECT * FROM tb_name ORDER BY col1 [DESC], col2 [DESC], ... ;
- 加上
DESC
表示降序排列,不加时默认为ASC
升序排列;- 未使用
ORDER BY
子句时,返回的记录顺序无意义,且不一定为插入顺序;- 多列排序:按某一列排序后仍可能有重复元素,可再按另一列排序;
- 要是所有列都排序了还有重复元素怎么办?别忘了刚才的
SELECT DISTINCT
。
2.2.4 结果截取
使用 LIMIT [offset,] rowCount
对查询结果进行截取:
# 将返回结果从第offset条记录开始,截取rowCount条;
# offset不写时默认从第1条记录开始,即offset=0
SELECT * FROM tb_name LIMIT [offset,] rowCount;
ORDER BY
与LIMIT 1
组合可轻松实现max
或min
函数;
# 提取表中价格最低的记录
SELECT * FROM tb_name ORDER BY price LIMIT 1;
对于SELECT
语句的基本用法介绍得差不多了,稍作总结如下:
SELECT
语句可以用DISTINCT
修饰,以去除重复数据;SELECT
语句可以添加上可选的WHERE子句
、ORDER BY
子句、LIMIT
子句,依次用于条件过滤、结果排序、结果截取;- 各成分的调用顺序如图:
SELECT [DISTINCT] * FROM tb_name [WHERE子句] [ORDER BY子句] [LIMIT子句];
3. 小结
本文的内容比较多一点,但好在思路还算清晰,现总结如下:
- 表格名称的修改采用
ALTER TABLE tb_name RENAME new_tb_name;
; - 表格字段的修改:
ALTER TABLE
与ADD、DROP、CHANGE、MODIFY
进行组合实现; - 表格记录的增加:
INSERT INTO
;删除:DELETE FROM
; - 表格记录查询核心关键字为
SELECT
,后可接字段名称以限定查询字段,提升效率; - 对
SELECT
进行条件过滤使用WHERE
子句,可组合各种条件,还可以用通配符,有%
和_
通配符,但通常不建议; - 对
SELECT
结果排序使用ORDER BY
子句,可以指定多个字段排序,并可使用DESC
表示降序排序; - 对
SELECT
结果截取可使用LIMIT
子句,指定偏移offset
和截取数量rowCount
,不提供偏移时默认offset=0
;
如有错误欢迎指正,共同进步~
今天你学废了吗?