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却可以改变。
希望同志之人都能持之以恒,不负初心。
SQL语句之行操作的更多相关文章
- MySQL之唯一索引、外键的变种、SQL语句数据行操作补充
0.唯一索引 unique对num进行唯一限制,表示num是独一无二的,uql是唯一索引名称 上面为联合索引:num和xx不能完全一样 1.外键的变种 a. 用户表和部门表 用户: 1 alex 1 ...
- SQL语句之数据库操作
SQL语句系列 1.SQL语句之行操作 2.SQL语句之表操作 3.SQL语句之数据库操作 4.SQL语句之用户管理 占坑,带写……
- SQL语句之表操作
SQL语句系列 1.SQL语句之行操作 2.SQL语句之表操作 3.SQL语句之数据库操作 4.SQL语句之用户管理 写在前面 在上一篇博文里面我整理了“行”级别的操作,分别是“增(insert).删 ...
- 【HANA系列】SAP HANA SQL合并多行操作
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA SQL合并多行 ...
- sql语句实现行转列的3种方法实例
sql语句实现行转列的3种方法实例 一般在做数据统计的时候会用到行转列,假如要统计学生的成绩,数据库里查询出来的会是这样的,但这并不能达到想要的效果,所以要在查询的时候做一下处理,下面话不多说了,来一 ...
- mysql 使用Navicat Lite如何打开‘查询编辑器’,使用sql语句对表进行操作!
今天第一次使用mysql,尽然连查询编辑器都找不到,研究了半天,询问了下大牛,才搞出来,准备写下来,后面方面忘记了有查找的地方,哈哈哈~~ 如何打开"查询编辑器",使用sql语句进 ...
- mysql sql语句:行转列问题
存在表score,记录学生的考试成绩,如下图所示: 现要求以 学生姓名,语文,数学,英语 这种格式显示学生成绩,如下图所示 具体步骤如下: 1.首先,使用case when函数输出单个课程的成绩 ca ...
- Sql 语句收集——行转列
SQL行转列汇总 PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in ...
- C# 直接使用sql语句对数据库操作 (cmd.ExecuteNonQuery)
只介绍读和删 不管使用什么方法来对数据库进行操作都绕不开和数据库的连接问题,所以咱们先在App.config中添加连接字段 <connectionStrings> <add name ...
随机推荐
- Linux3基本命令 ls,pwd,cat,echo,mv,cp,mkdir,rm,ln
ls 列出文件名称. -l 列出长文件名称. -rwxr-xr-- 1 root root 10739 Dec 23 13:31 bbscon (7) (4) (5) (6) ...
- integer encoding vs 1-hot (py)
https://github.com/szilard/benchm-ml/issues/1 glouppe commented on 7 May 2015 Thanks for the benchma ...
- jq遍历table表demo
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 利用AdaBoost方法构建多个弱分类器进行分类
1.AdaBoost 思想 补充:这里的若分类器之间有比较强的依赖关系;对于若依赖关系的分类器一般使用Bagging的方法 弱分类器是指分类效果要比随机猜测效果略好的分类器,我们可以通过构建多个弱分类 ...
- hdu 2211 杀人游戏
设f(N,K)返回最后取出的编号 那么f(n,k)进行第一次选后,剩下n-n/k个人,这剩下的人里最后被取出的编号为f(n-n/k,k)记为x 那么它在前一次队列里的编号则是(x-1)/(k-1)+x ...
- html页面源代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Linq学习<一>
lambda查询语法: var result =arrarylist.where(n=>n.contains("l")) 简化的委托方法实例 linq查询结构: var ...
- java -version javac -version 版本不一致
系统先装了jdk1.8 ,环境变量里配置的是jdk1.8,java -version 与javac -version 版本一致. 然后安装了jdk1.7 ,环境变量java_home 改成了1.7,但 ...
- android MVP模式简单介绍
原文 http://zhengxiaopeng.com/2015/02/06/Android%E4%B8%AD%E7%9A%84MVP/ 前言 MVP作为一种MVC的演化版本在Android开发中受到 ...
- 浅谈短视频APP的发展趋势
2014年6月20日,在AppAnnie最新发布5月应用指数中,美拍荣登“非游戏类iOS榜单”全球下载量第一位置,成为全球iOS应用商店最热门APP.能在<AppAnnie应用指数>这份A ...