
本资料为产品岗位作为日常工作参考,语言口语化
At 2019/4/15 By David.Yang
数据操作最近本的4中情况,增、删、改、查,
即添加数据、删除数据、修改数据、查询数据。
增(INSERT语句)
往数据表当中插入数据可以单条插入,也可以批量多条插入,
语法:
INSERT INTO table_name ( field1, field2,...fieldN )
VALUES
( value1, value2,...valueN );
table_name:要插入数据的表名
field*:插入数据的字段
value*:插入数据字段对应的数据值
数据单条插入
演示:
还记得我们之前设计的学生表么?
就是准备放杨过的那个表。
我们现在准备在学生表当中把杨过这小子登记进去,
表示这小子报名入班,准备学武功了。

根据INSERT语句我们组装一下把杨过录入学生表的SQL语句改怎么写。
SQL
INSERT INTO students(name, gender, age, dynasty, address, class)
VALUES
('杨过', 2, '14', '南宋', '', 1);
Query OK, 1 row affected (0.01 sec)
看到Query OK,说明执行成功了,
1 row affected 代表一条数据受影响进去了,
如果不放心,想看看数据,执行select查看就可以了
SQL
mysql>select * from students;

select语句后面会详细讲解
SQL解释:
INSERT INTO students (name, gender, age,dynasty, address, class)
VALUES
('杨过', 2, '14', '南宋', '', 1);
准备往学生表插入数据,

疑问:
ϒ 为什么没有学号number呢?
我们在设计数据表时使number(学号)这个字段拥有了自增属性:
`number` int(11) NOT NULL AUTO_INCREMENT COMMENT '学号',
这表示数据库会自己把这个字段进行填充,
并且时12345…按照顺序自增的,
这样的好处是我们不需要自己去维护学生的学号,
而且数据库能保证每个学生的学号是不会重复,具有唯一性。
所以我们在插入数据时,就不需要指定number了,
当然也就不需要给他赋值了,因为数据库帮我们把这件事做了。
当然,你也可以自己维护一个学生号字段,
插入数据时使用自己生成的学生号,不使用数据库的。
ϒ 为什么没有deleted字段呢?
因为我们在设计数据表的时候,deleted字段指定了默认值呀。
`deleted` int(2) NOT NULL DEFAULT '0' COMMENT '是否删除 0未删除 1已删除',
所以数据库自己会默认填写0进去,
你可以传值,这样数据库就以你的数据为准了。
ϒ INSERT插入数据时,非空值有什么需要注意的么?
如果设计数据表时,限定字段是NOT NULL,
但是又没有给默认值DEFAULT XX,
这时候在插入数据时一定要有这个字段以及对应的数据。
比如
假使有学生成绩表,设计了score(分数)是NOT NULL,
这个地方肯定不能给定默认值,
因为业务上分数是学生真实的考分,
总不能有默认60分,
这时候在插入数据时,需要有score字段,且给score字段的分数值写上。
INSERT INTO examsxxx(name, score, xxx)
VALUES
('杨过', 59, 'xxx');
数据批量插入
演示:
一条一条插入太累?
我们可以对数据库进行数据的批量插入。
根据INSERT语句我们组装一下把所有学生录入学生表的SQL语句改怎么写。
SQL
INSERT INTO students (name, gender, age, dynasty, address, class)
VALUES
('小龙女', 1, '18', '南宋', '', 1),
('公孙绿萼', 1, '16', '南宋', '', 1),
('郭襄', 1, '6', '南宋', '', 1),
('郭芙', 1, '18', '南宋', '', 1),
('郭破虏', 2, '6', '南宋', '', 1),
('耶律齐', 2, '18', '南宋', '', 1),
('耶律燕', 1, '16', '南宋', '', 1),
('完颜萍', 1, '16', '南宋', '', 1),
('程英', 1, '14', '南宋', '', 1),
('陆无双', 1, '14', '南宋', '', 1),
('霍都', 2, '20', '南宋', '', 1),
('达尔巴', 2, '21', '南宋', '', 1),
('武敦儒', 2, '18', '南宋', '', 1),
('武修文', 2, '18', '南宋', '', 1),
('赵志敬', 2, '18', '南宋', '', 1),
('洪凌波', 1, '18', '南宋', '', 1);
Query OK, 16 rows affected (0.02 sec)
Records: 16 Duplicates: 0 Warnings: 0
16条数据插进去了,
如果不放心,想看看数据,执行select查看就可以了
SQL
mysql> select * from students;

再补一些数据,后面会用到
SQL
INSERT INTOstudents (name, gender, age, dynasty, address, class)
VALUES
('路人1', 1, '18', '南宋', '', 1),
('路人2', 1, '16', '南宋', '', 1),
('路人3', 1, '6', '南宋', '', 1),
('路人4', 1, '18', '南宋', '', 1),
('路人5', 2, '6', '南宋', '', 1),
('路人6', 2, '18', '南宋', '', 1),
('路人7', 1, '16', '南宋', '', 1),
('路人8', 1, '16', '南宋', '', 1),
('路人9', 1, '14', '南宋', '', 1),
('路人10', 1, '14', '南宋', '', 1);
mysql>select * from students;

到此我们已经学会了两种数据的插入方式。
删(DELETE语句)
数据删除是一个敏感的事情,
一般线上进行数据操作,都不会进行数据的真删除,
而是在每一张数据表中放一个字段,
专门用来标记数据的状态,
比如我们就使用deleted字段来表述数据的删除状态
0未删除 1已删除
伪删除
我们将杨过,这小子的登记状态有正常的数据状态,
修改为已删除。
通过伪删除来实现本质其实是修改杨过这条数据deleted的值,
将他有0改成1,
在逻辑上他就是一条已删除的数据了。
语法:
UPDATE `数据表名` SET `更新的字段` = 更新的值 [完整的更新条件]
示范
示范:
SQL
mysql> UPDATE `students` SET `deleted` = 1 WHERE `number` = 1;
Query OK, 1 row affected (0.06 sec)
Rows matched: 1 Changed: 1 Warnings: 0
SQL解释:
杨过的学号是1,
即将学号 = 1的数据,
deleted改为1
简单示范,下文会讲解UPDATE
mysql> select * from students;

真删除
真删除就是把这条数据进行物理上的删除,
就是说删完这条数据就不在了,
你就找不到这条数据了,
也就不能进行简单的数据误删除恢复。
语法:
DELETE FROM `table_name` [WHERE Clause]
table_name:要操作的数据表名
WHERE Clause:删除数据的条件(即满足这个条件,就将数据删除)
WHERE可以接多个条件,用AND拼接,
比如:
WHERE id = 1 AND name=‘金轮法王’
示范
示范:
我们通过没什么用的test表来操作
先看看有哪些数据
SQL
mysql> select * from test;

SQL
mysql>DELETE FROM `test` WHERE `int` = '0001';
Query OK, 1 row affected (0.01 sec)
mysql>select * from test;

SQL解释:
DELETE FROM `test` WHERE `int` = '0001';
DELETE:是执行删除语句,
FROM `test`:表示‘从’数据表‘test’去执行删除
WHERE `int` = '0001':WHERE是删除条件关键字,后面接删除数据满足的条件是什么。
改(UPDATE语句)
语法:
UPDATE table_name
SET
column_name1 = expr1,
column_name2 = expr2,
...
WHERE
condition;

示范
示范:
将学号>=18的,并且未删除的学生,
分配到民兵班去,
并且地址都改为未知
SQL
UPDATE `students`
SET
`address` = '未知',
`class` = 2
WHERE
`deleted` = 0 AND `number` >= 18;
SQL解释:

查(SELECT语句:基础查询)
数据的查询是我们日常工作应用最多的场景,
不管是数据的验证,
统计、分析,
查询是一切的基础。
语法:
SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[LIMIT N][ OFFSET M]
SELECT column:查询语句,SELECT 要查询的字段(1-n)
FROM table_name:从目标数据表查询
WHER:满足查询的条件
LIMIT OFFSET:查询偏移量,比如查询第10 – 20的数据
示范
示范:
SQL
SELECT
number, name, age, dynasty
FROM
students
WHERE
deleted = 0
LIMIT 4 OFFSET 2;

SQL解释:
SELECT结果只显示你需要的字段,
所以你指定你想要看到的字段他就给你;
查询需要指定你查询的表
WHERE条件如果有需要可以加上
LIMIT表示你想要返回的数据量有几条,查询时请一定加上LIMIT
OFFSET表示数据查询的偏移量
默认从0开始
比如:
| 9 |完颜萍 | 16 |南宋 |
| 10 |程英 | 14 |南宋 |
| 11 |陆无双 | 14 |南宋 |
| 12 |霍都 | 20 |南宋 |
| 13 |达尔巴 | 21 |南宋 |
| 14 |武敦儒 | 18 |南宋 |
| 15 |武修文 | 18 |南宋 |
LIMIT 4 OFFSET 10;
会返回11 12 13 14数据
+--------+-----------+-----+---------+
| number | name | age | dynasty |
+--------+-----------+-----+---------+
| 11 |陆无双 | 14 |南宋 |
| 12 |霍都 | 20 |南宋 |
| 13 |达尔巴 | 21 |南宋 |
| 14 |武敦儒 | 18 |南宋 |
+--------+-----------+-----+---------+
如果你想返回所有数据字段,可以通过*来实现
示范:
SQL
SELECT
*
FROM
students
WHERE
deleted = 0
LIMIT 4 OFFSET2;

SQL解释:
SELECT * 表示你要求查询结果中返回所有数据字段
到此为止,基本的增、删、改、查就讲完了。
后续将需要了解条件查询、通配符、排序等。
网友评论