SQL语句之行操作

时间:2023-03-08 22:09:08

  SQL语句系列

1、SQL语句之行操作

2、SQL语句之表操作

3、SQL语句之数据库操作

4、SQL语句之用户管理



  关系型数据库的存储形式

  

  在关系型数据库中,数据都是以类似于Excel表格的形式存储(如下图),我们将“列名”称作“字段”,一条数据指一行存储的信息,对这一行的数据主要的操作有“增(insert)、删(delete)、改(update)、查(select)”。

SQL语句之行操作

  以上就是数据库中的一张表,一共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; --查看有没有插进去

SQL语句之行操作

(2)插入多行数据(values后面每条数据之间用逗号“,”隔开即可)

insert into 表(字段名,字段名……) values (值,值……),(值,值……),(值,值……),(值,值……),(值,值……)……;  

如下图使用
insert into test(name) values ("新插入2"), ("新插入3"), ("新插入4"), ("新插入5"), ("新插入6"), ("新插入7"), ("新插入8"); select * from test; --查看有没有插入成功

SQL语句之行操作

(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;  --查看是否成功

SQL语句之行操作

  这个语句可能在你的电脑上实验的时候会遇到问题,造成问题的原因绝大多数可能是字段的数据类型不符合要求。例如,要将表2中的name列插入到表1中的age列中,由于name是varchar类型,而age是int类型,varchar类型无法转换成int类型,所以程序报错。

insert test2(age) select name from test;   --将test中的name插入到test2中的age

SQL语句之行操作

  但是如果将age列插入到name列中程序不会报错,因为int类型可以转换成varchar类型。

insert test(name) select age from test2;  --将test2中的age插入到test中的name

select * from test limit 26,5;  --只查看最后几条是否成功

SQL语句之行操作

  行操作——删

  删除命令比较简单,delete from 表,不过如果你运行以下语句,便会发现一个意外的结果

delete from test2;

select * from test2;   --查看是否删除成功

SQL语句之行操作

  发现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里面的数据如下:

SQL语句之行操作

  行操作——改

  改的操作使用update  set 命令,和删除命令类似,也需要添加条件语句,不然会修改所有的行:

update 表 set 字段名 = “XXX”  where 条件语句;

     --例如,将test中nid大于11的行的name全部修改:
update test set name="修改的行" where nid>11; --结果如下

SQL语句之行操作

  行操作——查

  讲完以上内容再讲“查”就显得轻松很多了,查找的命令结构为 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为两个字符且以“小”开头的行

SQL语句之行操作

select * from test where nid like "%2";     --“%”表示任意多个字符,这里表示只要以2结尾的nid,不管2前面有几个字符

SQL语句之行操作

  关于模糊查找的更多内容我会在之后的博文中整理出来,这里只先记住“_”和“%”的用法。不过千万别认为SQL中通配符的内容较少,果真要全部掌握的话,还是需要花不少精力。

  行操作——小结

  总的来说,“增删改查”是SQL语句中有关行的基本操作,我最初学数据库时,以为学了这么一大堆命令就足以应对需求了,可是现实压根不允许你停下学习的脚步。在之后的博文中,我会更进一步的讲解表操作。表操作不仅仅涉及单个表,而且涉及多个表的联表操作,这部分内容会很绕,然而却正是现实应用中需要掌握的核心内容。

  另外,在学习之初,为了不将各个命令混淆,建议大家学一个命令就要弄清楚它究竟是行级别还是表级别的操作,例如delete可以删除表内的所有行,truncate也可以,但是delete是“行”级别的操作,而truncate table是“表”级别的操作,所以delete无法使自增列(稍后会讲)重新回到1,但是truncate table命令却会使其重新回到1;这是因为delete是行级别操作,无法改变整个表的结构,而truncate table却可以改变。

  

  希望同志之人都能持之以恒,不负初心。