前言时刻,简单的增删改查操作,下一篇才是难点。
写作环境:
MacOS、MySQL8.0
写SQL工具:Navicat15.0和电脑自带终端
写作软件:Typora
作者:西园公子:www.zwjjiaozhu.top
首先先创建一个t7
表,以下所有命令均是对该表进行操作。
CREATE TABLE t7 (`name` VARCHAR(10), age TINYINT DEFAULT 20) CHARACTER SET utf8 COLLATE utf8_bin; # 增加一个job字段,因为我是忘记添加了,你也可以放到上面 ALTER TABLE t7 ADD job VARCHAR(20) NOT NULL; # 输出当前数据库下所有表的名称 SHOW TABLES;
1、插入表数据
1)指定所有字段对应的数据:
此时可以省略字段,
# 1.1 全部插入 INSERT INTO t7 VALUE('张', 18, '干饭人');
2)只指定几个字段的值:
不指定某字段的值时:
- 若该字段设置了默认值,则默认插入该值,若没有则插入空白
NULL
。 - 若该字段设置了不允许为空
not null
,有默认值就插入,若没有则会报错。
# 1.2 插入部分数据 INSERT INTO t7 (`name`, job) VALUES('章', '敲键盘'); # ✅ INSERT INTO t7 (`name`) VALUES('章'); # ❌
3)一次性插入多条数据:
- 语法:
INSERT INTO 表名 (列名, 列名2, 列名3) (列值1,列值2), (列值1.2,列值2.2)……;
INSERT INTO t7 (`name`, job) VALUES('章', '敲键盘'), ('飞', '干饭人'); # ✅
2、修改表数据
如果添加 where 子句的话,则默认修改表中全部数据。
UPDATE `table_name` SET column_name='value' [WHERE 条件];
小例子:
# 2、修改表数据 # 2.1 不加选择显示where的话,则默认修改表中全部数据 UPDATE t7 SET job='键盘'; # 2.2 添加where限制条件,只有where为true才修改。 UPDATE t7 SET age=19 WHERE `name`='张';
3、删除表数据
如果不加 where 子句,则默认选择全表,结果就是删除表中的全部内容。
DELETE FROM t9 [WHERE 条件];
小例子:
mysql> DELETE FROM t9 WHERE name='张飞'; Query OK, 1 row affected (0.00 sec)
4、查询数据
新建表t9
,并插入一些测试数据。
# 1、创建一个表 CREATE TABLE t9 (`name` VARCHAR(20), math TINYINT DEFAULT 0, chinese TINYINT DEFAULT 0, english TINYINT DEFAULT 0) CHARACTER SET utf8 COLLATE utf8_bin; # 2、插入数据 INSERT INTO t9 VALUES('张飞', 68, 76, 52); INSERT INTO t9 (`name`, chinese) VALUES('关羽', 58); INSERT INTO t9 VALUES('宋江', 98, 96, 82); INSERT INTO t9 VALUES('宋无缺', 98, 96, 92); INSERT INTO t9 VALUES('我是及时雨', 78, 86, 92);
4.1 简单查询
1)查询表中全部数据:
select * from table_name
,其中*
代表所有列
mysql> select * from t9; +--------+------+---------+---------+ | name | math | chinese | english | +--------+------+---------+---------+ | 张飞 | 68 | 76 | 52 | | 关羽 | 0 | 58 | 0 | | 宋江 | 98 | 96 | 82 | +--------+------+---------+---------+ 3 rows in set (0.00 sec)
2)只查询部分列内容:
select column_name1, ..., column_name6 from table_name
,其中column_name
代表列名。
mysql> select name, math, english from t9; +--------+------+---------+ | name | math | english | +--------+------+---------+ | 张飞 | 68 | 52 | | 关羽 | 0 | 0 | | 宋江 | 98 | 82 | +--------+------+---------+ 3 rows in set (0.00 sec)
3)只显示某个表中的所有字段:
*
表示查询结果中所有的字段,而table_1.*
则表示显示该表 table_1 中的所有字段。
# 显示所有字段 mysql> SELECT * FROM t1, t7 WHERE t7.name='张'; +--------------+------+-----------+------+------+--------+-------+ | name | age | hobby | name | age | job | m_age | +--------------+------+-----------+------+------+--------+-------+ | zhang | 18 | 看电影 | 张 | 19 | 键盘 | NULL | | zhangzhan张 | 19 | 看电影 | 张 | 19 | 键盘 | NULL | | zhangzhan张 | 19 | 看电影 | 张 | 19 | 键盘 | NULL | +--------------+------+-----------+------+------+--------+-------+ # 只显示某个表的所有字段 mysql> SELECT t1.* FROM t1, t7 WHERE t7.name='张'; +--------------+------+-----------+ | name | age | hobby | +--------------+------+-----------+ | zhang | 18 | 看电影 | | zhangzhan张 | 19 | 看电影 | | zhangzhan张 | 19 | 看电影 | +--------------+------+-----------+ # 注释:上面只显示了t1表的所有字段
4.1 where 筛选作用
写 where 语句,就不得不介绍一下 where 子句中的运算符。
-
比较运算符:
>
(大于)、<
(大于)、>=
(大于)、<=
(大于)、<>
(不等于)、!=
(不等于)。between A and B
(在 A 和 B 之间吗?包括 A 和 B)in(set)
(在集合 set 中吗?)is NULL
(判断为空吗?)like 'a%'
(模糊匹配,判断是否像这个字符串,%表示可以匹配任何长度的字符串),或者not like 'a%'
-
逻辑运算符:从左到右运算,括号最优先
and
:逻辑与,or
:逻辑或,not
:逻辑非。
一笼小问题:
1)筛选名字是宋开头的同学:
# like mysql> SELECT * FROM t9 WHERE `name` LIKE '宋%'; +------ -----+------+---------+---------+ | name | math | chinese | english | +-----------+------+---------+---------+ | 宋江 | 98 | 96 | 82 | | 宋无缺 | 98 | 96 | 92 | +-----------+------+---------+---------+
2)筛选出数学成绩是78或者68的同学:
# in mysql> SELECT * FROM t9 WHERE math IN (78, 68); # in +-----------------+------+---------+---------+ | name | math | chinese | english | +-----------------+------+---------+---------+ | 张飞 | 68 | 76 | 52 | | 我是及时雨 | 78 | 86 | 92 | +-----------------+------+---------+---------+
3)筛选数学大于70分且英语不等于82,或者是语文在90和100之间的同学:
mysql> SELECT * FROM t9 WHERE math > 70 and english != 82 OR chinese BETWEEN 90 AND 100; +-----------------+------+---------+---------+ | name | math | chinese | english | +-----------------+------+---------+---------+ | 宋江 | 98 | 96 | 82 | | 我是及时雨 | 78 | 86 | 92 | | 宋无缺 | 98 | 96 | 92 | +-----------------+------+---------+---------+
4.3 as 起别名
1)起别名可利于展示:
mysql> SELECT `name` AS '姓名', math AS '数学' FROM t9; +-----------------+--------+ | 姓名 | 数学 | +-----------------+--------+ | 张飞 | 68 | | 关羽 | 0 | | 宋江 | 98 | | 我是及时雨 | 78 | | 宋无缺 | 98 | +-----------------+--------+
2)美观:
前面定义的别名,后面可以使用,简化了代码。
mysql> SELECT `name`, (math+chinese+english) AS total_score FROM t9 ORDER BY total_score ASC; +-----------------+-------------+ | name | total_score | +-----------------+-------------+ | 关羽 | 58 | | 张飞 | 196 | | 我是及时雨 | 256 | | 宋江 | 276 | | 宋无缺 | 286 | +-----------------+-------------+
3)也可以省略 as:
mysql> SELECT `name` '姓名' FROM t7; +--------+ | 姓名 | +--------+ | 张 | | 章 | | 章 | | NULL | +--------+
4.5 排序
1)升序:order by column_name ASC
,若不设置 ASC 则默认就是升序
mysql> SELECT name, math FROM t9 ORDER BY math ASC; +-----------------+------+ | name | math | +-----------------+------+ | 关羽 | 0 | | 张飞 | 68 | | 我是及时雨 | 78 | | 宋江 | 98 | | 宋无缺 | 98 | +-----------------+------+
2)降序:order by column_name DESC
mysql> SELECT name, math FROM t9 ORDER BY math DESC; +-----------------+------+ | name | math | +-----------------+------+ | 宋江 | 98 | | 宋无缺 | 98 | | 我是及时雨 | 78 | | 张飞 | 68 | | 关羽 | 0 | +-----------------+------+
总结:
Just do it!