在学习了数据库和表的DDL操作后,下面来学习下简单的查询、新增、删除以及更新表数据,其实也就是我们前文中提到的DML和DQL类型的语句。
一、前言
我们已经知道,表中的一行叫做一条记录,一列叫做一个字段。
我们还是以学生信息表为例,用Excel表格来展示:
我们用数据库来表示这张表的话,我们上篇文章中对应地创建了一张表结构,表名就叫做student_info,有五个字段:
CREATE TABLE student_info (
id INT comment "学号",
name VARCHAR(20) comment "姓名",
age INT comment "年龄",
sex TINYINT comment "性别:0:男;1:女",
address VARCHAR(30) comment "家庭住址"
) COMMENT '学生基本信息表';
可以看到,我们创建的表结构跟Excel的结构一样,在Excel中做数据的操作是十分便捷的,而SQL如何能像Excel一样操作表的数据呢?本文来学习简单的查询、插入、更新和删除表中数据的操作。
二、查询数据
如果我们想查看某个表里已经存储了哪些数据,可以用下边这个语句:
SELECT * FROM 表名;
我们在切换好数据库后,查询student_info表的数据:
mysql> select * from student_info;
Empty set (0.00 sec)
暂时还未有任何一条数据,下面我们来插入一些数据。
三、新增数据
MySQL插入数据的时候是以行为单位的,语法格式如下:
INSERT INTO 表名(列1, 列2, …) VALUES(列1的值,列2的值, …);
也就是说我们可以在表名后边的括号中指定要插入数据的列,然后在VALUES后边的括号中按指定的列顺序填入对应的值,针对学生信息表,如果我们插入一条完整数据,就需要逐个填入值,形如:
INSERT INTO 表名(学号, 姓名, 年龄, 性别, 家庭住址 ) VALUES(1, fossi, 18, 男, 江苏省南京市);
我们实际的sql可以写为:
mysql> insert into student_info (id,name,age,sex,address)
values(1,'fossi',18,0,'江苏省南京市');
Query OK, 1 row affected (0.00 sec)
mysql> select * from student_info;
+------+-------+------+------+--------------------+
| id | name | age | sex | address |
+------+-------+------+------+--------------------+
| 1 | fossi | 18 | 0 | 江苏省南京市 |
+------+-------+------+------+--------------------+
1 row in set (0.00 sec)
注意,数据库存储男女的时候,可以使用0或1来标识,男女是给人看的,而对机器来说,存储0或1更友好。并且由于我们约定了0标识男、1标识女后,前端的页面展示的时候只需要按照一样的规则转换显示为男或女就可以了,毕竟存储0和存储男的代价对于计算机来说是完全不一样的,如果计算机可以说话,他一定会选择0,哈哈哈。当然了,你也可以以字符串的形式直接存储一个男或女在数据库中,只是我们并不推荐这么做。
这种所有字段都插入的操作,实际上是说插入完整数据,可以简化为:
INSERT INTO 表名 VALUES(列1的值,列2的值, …, 列n的值);
在使用这种插入一条完整记录的语法时必须注意,VALUES语句中必须给出表中所有列的值,缺一个都不行,如果我们不知道向某个列填什么值,可以使用填入NULL(前提是该列没有声明NOT NULL属性),就像这样:
mysql> insert into student_info (id,name,age,sex,address)
values(2,'fossy',18,1,NULL);
Query OK, 1 row affected (0.01 sec)
mysql> select * from student_info; +------+-------+------+------+--------------------+
| id | name | age | sex | address |
+------+-------+------+------+--------------------+
| 1 | fossi | 18 | 0 | 江苏省南京市 |
| 2 | fossy | 18 | 1 | NULL |
+------+-------+------+------+--------------------+
2 rows in set (0.00 sec)
NULL其实并不是一个值,它代表不确定,我们平常说某个列的值为NULL,意味着这一列的值尚未被填入,这在编程语言中也十分常见,相信读者朋友理解也比较轻松,这一块知识后续还会提及。
可以看到,我们顺利地完成第二条数据的插入,并且第二条fossy女士的家庭地址作为隐私不方便提供,因此用NULL来代替了。
当然了,我们也可以指定部分字段完成插入,我们整张表其实都不一定要填写,我选择只填学号和姓名,其他都不填,这个时候可以这样简化:
INSERT INTO 表名(学号, 姓名,) VALUES(3, 我去个地方);
mysql> insert into student_info(id,name) values(3,'我去个地方');
Query OK, 1 row affected (0.00 sec)
mysql> select * from student_info;
+------+-----------------+------+------+--------------------+
| id | name | age | sex | address |
+------+-----------------+------+------+--------------------+
| 1 | fossi | 18 | 0 | 江苏省南京市 |
| 2 | fossy | 18 | 1 | NULL |
| 3 | 我去个地方 | NULL | NULL | NULL |
+------+-----------------+------+------+--------------------+
3 rows in set (0.00 sec)
如果有的字段天生不允许置空,那么就必须要对这个字段赋值,否则就会插入报错,整行数据都不让插入了。
这里一样需要注意前面的列名和后面的值要一一对应起来,否则驴唇不对马嘴就可能会报错,或者插入了垃圾数据,比如我这里误将学号字段和姓名字段填反:
mysql> insert into student_info(name,id) values(3,'我去个地方');
ERROR 1366 (HY000): Incorrect integer value: '我去个地方' for column 'id' at row 1
这里报错信息说的是姓名是个字符串,不能插入到学号这个整数类型中去。
最后说一下批量插入,批量插入的意义是:每插入一条记录就提交一个请求给服务器远没有一次把所有待插入的记录全部提交给服务器效率高。
语法十分简单,我们掌握了单条数据插入后,批量插入就是直接在VALUES后多加几组值,每组值用小括号()扩起来,各个组之间用逗号分隔就好了,就像这样:
INSERT INTO 表名(列1, 列2, …) VALUES(列1的值,列2的值, …),(列1的值,列2的值, …),(列1的值,列2的值, …)…;
mysql> insert into student_info(id,name) values(4,'用户4'),(5,'用户5'),(6,'用户6');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from student_info;
+------+-----------------+------+------+--------------------+
| id | name | age | sex | address |
+------+-----------------+------+------+--------------------+
| 1 | fossi | 18 | 0 | 江苏省南京市 |
| 2 | fossy | 18 | 1 | NULL |
| 3 | 我去个地方 | NULL | NULL | NULL |
| 4 | 用户4 | NULL | NULL | NULL |
| 5 | 用户5 | NULL | NULL | NULL |
| 6 | 用户6 | NULL | NULL | NULL |
+------+-----------------+------+------+--------------------+
6 rows in set (0.00 sec)
可以看到,这里用一条语句批量插入了三位学生信息,十分地方便。
四、更新数据
我们有时候对于某些记录的某些列的值不满意,需要去修改它们,修改记录的语法就是这样:
UPDATE 表名 SET 列1=值1, 列2=值2, …, 列n=值n [WHERE 布尔表达式];
我们在UPDATE单词后边指定要更新的表,然后把你想更新的列的名称和该列更新后的值写到SET单词后边,如果想更新多个列的话,它们之间用逗号,分隔开。如果我们不指定WHERE子句,那么表中所有的记录都会被更新,否则的话只有符合WHERE子句中的条件的记录才可以被更新。
where语句十分常用,我们将会在后续的复杂查询中着重学习该语句,这里只要知道他是用来做数据筛选的即可。
比如需要更新id为3的学生的性别为男,可以这样写:
mysql> update student_info set sex=0 where id=3;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from student_info;
+------+-----------------+------+------+--------------------+
| id | name | age | sex | address |
+------+-----------------+------+------+--------------------+
| 2 | fossy | 18 | 1 | NULL |
| 3 | 我去个地方 | NULL | 0 | NULL |
| 4 | 用户4 | NULL | NULL | NULL |
| 5 | 用户5 | NULL | NULL | NULL |
| 6 | 用户6 | NULL | NULL | NULL |
| 1 | fossi | 18 | 0 | 江苏省南京市 |
+------+-----------------+------+------+--------------------+
6 rows in set (0.00 sec)
可以看到id为3的学生性别已经由未知的NULL变成了0。Rows matched: 1 Changed: 1 Warnings: 0
就表明成功更新了1行数据。
这里再次强调一下:虽然更新语句的WHERE子句是可选的,但是如果不加WHERE子句的话将更新表中所有的记录,下面的删除语句也是同理。
五、删除数据
如果某些记录我们不想要了,那可以使用下边的语句把它们给删除掉:
DELETE FROM 表名 [WHERE 表达式];
WHERE其实就是筛选条件,如果我们单独使用不带WHERE的DELTE语句,则表示删除表中所有数据!
mysql> DELETE FROM student_info;
Query OK, 6 rows affected (0.01 sec)
mysql> select * from student_info;
Empty set (0.00 sec)
6 rows affected
意味着6行记录全部被删除了,如果只想删除学号为1的学生,那么其实我们可以这么写:
mysql> select * from student_info;
+------+-----------------+------+------+--------------------+
| id | name | age | sex | address |
+------+-----------------+------+------+--------------------+
| 1 | fossi | 18 | 0 | 江苏省南京市 |
| 2 | fossy | 18 | 1 | NULL |
| 3 | 我去个地方 | NULL | NULL | NULL |
| 4 | 用户4 | NULL | NULL | NULL |
| 5 | 用户5 | NULL | NULL | NULL |
| 6 | 用户6 | NULL | NULL | NULL |
+------+-----------------+------+------+--------------------+
6 rows in set (0.00 sec)
mysql> delete from student_info where id=1;
Query OK, 1 row affected (0.01 sec)
mysql> select * from student_info;
+------+-----------------+------+------+---------+
| id | name | age | sex | address |
+------+-----------------+------+------+---------+
| 2 | fossy | 18 | 1 | NULL |
| 3 | 我去个地方 | NULL | NULL | NULL |
| 4 | 用户4 | NULL | NULL | NULL |
| 5 | 用户5 | NULL | NULL | NULL |
| 6 | 用户6 | NULL | NULL | NULL |
+------+-----------------+------+------+---------+
5 rows in set (0.01 sec)
可以看到学号为1的fossi被删除了,一般情况下,我们的delete语句是一定会带上条件的,不可能随意地删除某张表的所有数据,如果我们的逻辑中使用了delete语句,一定要务必小心。
六、总结
本篇文章学习了如何进行简单的查询、新增、删除以及更新表数据,这也是我们后续学习更加复杂SQL的基础。
MySQL的学习,跟编程语言的学习是一样的,并无捷径,需要动手多敲,在多次犯错后,逐渐地就可以熟练掌握SQL语法,这对于工作来说极其有益。
本篇文章内容较少,结构简单,核心知识点如下:
-
如何查询数据?本文仅仅介绍了单表的查询,后续将学习稍微复杂的查询语法;
-
如何新增数据?包括完整数据插入、部分字段数据插入以及批量插入;
-
如何修改数据?结合where筛选条件如何修改指定数据?
-
如何删除数据?结合where筛选条件如何删除指定数据?
原文始发于微信公众号(幕后哈土奇):04|第四话:基础篇-MySQL简单的增删改查操作
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/112923.html