SQL语句之行操作
SQL语句系列
关系型数据库的存储形式
在关系型数据库中,数据都是以类似于Excel表格的形式存储(如下图),我们将“列名”称作“字段”,一条数据指一行存储的信息,对这一行的数据主要的操作有“增(insert)、删(delete)、改(update)、查(select)”。
以上就是数据库中的一张表,一共5行,两个字段(nid、name),接下来要介绍如何再添加新的一行数据,如何删除、更改以及查询已有的数据。
行操作——增
增加数据主要用到的语句是insert into…… values…… ,一共有三种插入的方式:
如果想跟着我一起操作,可先在自己的数据库中执行以下操作(复制命令执行即可,语句含义会在稍后讲解):
SET NAMES utf8; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for `test` -- ---------------------------- DROP TABLE IF EXISTS `test`; CREATE TABLE `test` ( `nid` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, PRIMARY KEY (`nid`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of `test` -- ---------------------------- BEGIN; INSERT INTO `test` VALUES ('1', '小李'), ('2', '小花'), ('3', '小陈'), ('4', '小妞'), ('5', '小红'); COMMIT; -- ---------------------------- -- Table structure for `test2` -- ---------------------------- DROP TABLE IF EXISTS `test2`; CREATE TABLE `test2` ( `nid` int(11) NOT NULL AUTO_INCREMENT, `age` int(11) NOT NULL, PRIMARY KEY (`nid`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of `test2` -- ---------------------------- BEGIN; INSERT INTO `test2` VALUES ('1', '22'), ('2', '34'), ('3', '45'), ('4', '23'); COMMIT; SET FOREIGN_KEY_CHECKS = 1;
(1)插入一行数据 (“--”后面跟注释,程序不会运行之后的内容)
insert into 表(字段名,字段名……) values (值,值……); --SQL语句规定每条命令末尾必须加分号(;) --如下图使用 : insert into test(name) values ("新插入1"); --该语句在test表中插入了一条“name”字段为“新插入1”的数据 --至于为什么明明没有插入”nid“这个字段,但其却自动填充了6,这个后面会讲。 select * from test; --查看有没有插进去
(2)插入多行数据(values后面每条数据之间用逗号“,”隔开即可)
insert into 表(字段名,字段名……) values (值,值……),(值,值……),(值,值……),(值,值……),(值,值……)……; 如下图使用 insert into test(name) values ("新插入2"), ("新插入3"), ("新插入4"), ("新插入5"), ("新插入6"), ("新插入7"), ("新插入8"); select * from test; --查看有没有插入成功
(3)从另外一个表中插入数据
insert into 表1(表1字段名,表1字段名……) select 表2字段名,表2字段名…… from 表2
select……from……语句是查询语句,这里的意思是将从表2查询出的字段插入到表1中,例如,我可以用下面的语句将test中的所有数据再重新插入进test这个表中:
insert into test(name) select name from test; select * from test; --查看是否成功
这个语句可能在你的电脑上实验的时候会遇到问题,造成问题的原因绝大多数可能是字段的数据类型不符合要求。例如,要将表2中的name列插入到表1中的age列中,由于name是varchar类型,而age是int类型,varchar类型无法转换成int类型,所以程序报错。
insert test2(age) select name from test; --将test中的name插入到test2中的age
但是如果将age列插入到name列中程序不会报错,因为int类型可以转换成varchar类型。
insert test(name) select age from test2; --将test2中的age插入到test中的name select * from test limit 26,5; --只查看最后几条是否成功
行操作——删
删除命令比较简单,delete from 表,不过如果你运行以下语句,便会发现一个意外的结果
delete from test2; select * from test2; --查看是否删除成功
发现test2中的数据被全部清空了,那如果我们需要单独删除某一行数据呢?这就需要用到条件语句,只删除满足条件的行:
delete from 表 where 字段名=XXX; --删除某字段等于XXX的行 也可以删除大于、小于、不等于(>、< 、!=)XXX的行 delete from 表 where 字段名 in (XXX, CCC, VVV) ; --删除某字段在(XXX, CCC, VVV)中的行,也可用 not in ( )删除不在里面的行 --例如,删除test表中nid为1,3,5,7的行 delete from test where nid in (1,3,5,7); delete from 表 where 字段名 between a and b; --删除某字段位于a和b之间的行,当然也有 not between and; --例如,删除test表中nid在16到32之间的行: delete from test where nid between 16 and 32; --记住,nid为16和32的行也会被删除 --另外 SQL语句用and、or、not分别表示且、或、非的关系,用以连接多个条件 --例如,我想删除test表中name为“小花”,且nid等于15的行: delete from test where name ="小花" and nid=15; --运行以上例子的命令后,test里面的数据如下:
行操作——改
改的操作使用update set 命令,和删除命令类似,也需要添加条件语句,不然会修改所有的行:
update 表 set 字段名 = “XXX” where 条件语句; --例如,将test中nid大于11的行的name全部修改: update test set name="修改的行" where nid>11; --结果如下
行操作——查
讲完以上内容再讲“查”就显得轻松很多了,查找的命令结构为 select from ,后面也可跟where、order by、limit等语句。
1、一般查找
select 字段名1,字段名2 from 表 --查找全部行 --例如:查找test表中的name和nid字段 select name,nid from test; -- 你会发现列的顺序和之前不一样了,name在前,这与你写的命令一致 select * from test; --也可用*来代替所有的列 select 字段名1,字段名2 from 表 where 条件语句 --查找满足条件的行 --例如:查找nid等于4的行 select * from test where nid=4; select 字段名1,字段名2 from 表 limit 6; --表示只返回前6条结果 --例如: select * from test where nid>4 limit 6 ; --limit 一般写在where后面 select 字段名1,字段名2 from 表 limit 2,4; --表示从第3条数据开始,返回后面的4条 --例如 select * from test limit 2,4; --暂时理解不了的可以对比不加limit的情况 select 字段名1,字段名2 from 表 order by 字段2; --按照字段2升序 --order by 字段2 asc (升序)(asc可以省略) --order by 字段2 desc (降序) --例如: select * from test order by nid desc; --按照nid降序 --也可按照多个字段排序,例如,先按照name升序,再按照nid降序 select * from test order by name asc,nid desc ;
查找命令的实验结果我就不一一贴图了。
2、模糊查找
--模糊查找 使用like语句这里只简单讲解通配符"_"和"%"的用法 select * from test where name like "小_"; --"_"表示任意一个字符,本语句表示查找name为两个字符且以“小”开头的行
select * from test where nid like "%2"; --“%”表示任意多个字符,这里表示只要以2结尾的nid,不管2前面有几个字符
关于模糊查找的更多内容我会在之后的博文中整理出来,这里只先记住“_”和“%”的用法。不过千万别认为SQL中通配符的内容较少,果真要全部掌握的话,还是需要花不少精力。
行操作——小结
总的来说,“增删改查”是SQL语句中有关行的基本操作,我最初学数据库时,以为学了这么一大堆命令就足以应对需求了,可是现实压根不允许你停下学习的脚步。在之后的博文中,我会更进一步的讲解表操作。表操作不仅仅涉及单个表,而且涉及多个表的联表操作,这部分内容会很绕,然而却正是现实应用中需要掌握的核心内容。
另外,在学习之初,为了不将各个命令混淆,建议大家学一个命令就要弄清楚它究竟是行级别还是表级别的操作,例如delete可以删除表内的所有行,truncate也可以,但是delete是“行”级别的操作,而truncate table是“表”级别的操作,所以delete无法使自增列(稍后会讲)重新回到1,但是truncate table命令却会使其重新回到1;这是因为delete是行级别操作,无法改变整个表的结构,而truncate table却可以改变。
希望同志之人都能持之以恒,不负初心。